OSDN Git Service

mmc: atmel-mci: use sg_copy_{from,to}_buffer
authorChristoph Hellwig <hch@lst.de>
Fri, 18 May 2018 17:18:42 +0000 (19:18 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 21 May 2018 13:49:19 +0000 (15:49 +0200)
This handles highmem pages, and also cleans up the code.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/atmel-mci.c

index e55f393..5aa2c94 100644 (file)
@@ -1967,7 +1967,6 @@ static void atmci_tasklet_func(unsigned long priv)
 static void atmci_read_data_pio(struct atmel_mci *host)
 {
        struct scatterlist      *sg = host->sg;
-       void                    *buf = sg_virt(sg);
        unsigned int            offset = host->pio_offset;
        struct mmc_data         *data = host->data;
        u32                     value;
@@ -1977,7 +1976,7 @@ static void atmci_read_data_pio(struct atmel_mci *host)
        do {
                value = atmci_readl(host, ATMCI_RDR);
                if (likely(offset + 4 <= sg->length)) {
-                       put_unaligned(value, (u32 *)(buf + offset));
+                       sg_pcopy_to_buffer(sg, 1, &value, sizeof(u32), offset);
 
                        offset += 4;
                        nbytes += 4;
@@ -1990,11 +1989,11 @@ static void atmci_read_data_pio(struct atmel_mci *host)
                                        goto done;
 
                                offset = 0;
-                               buf = sg_virt(sg);
                        }
                } else {
                        unsigned int remaining = sg->length - offset;
-                       memcpy(buf + offset, &value, remaining);
+
+                       sg_pcopy_to_buffer(sg, 1, &value, remaining, offset);
                        nbytes += remaining;
 
                        flush_dcache_page(sg_page(sg));
@@ -2004,8 +2003,8 @@ static void atmci_read_data_pio(struct atmel_mci *host)
                                goto done;
 
                        offset = 4 - remaining;
-                       buf = sg_virt(sg);
-                       memcpy(buf, (u8 *)&value + remaining, offset);
+                       sg_pcopy_to_buffer(sg, 1, (u8 *)&value + remaining,
+                                       offset, 0);
                        nbytes += offset;
                }
 
@@ -2035,7 +2034,6 @@ done:
 static void atmci_write_data_pio(struct atmel_mci *host)
 {
        struct scatterlist      *sg = host->sg;
-       void                    *buf = sg_virt(sg);
        unsigned int            offset = host->pio_offset;
        struct mmc_data         *data = host->data;
        u32                     value;
@@ -2044,7 +2042,7 @@ static void atmci_write_data_pio(struct atmel_mci *host)
 
        do {
                if (likely(offset + 4 <= sg->length)) {
-                       value = get_unaligned((u32 *)(buf + offset));
+                       sg_pcopy_from_buffer(sg, 1, &value, sizeof(u32), offset);
                        atmci_writel(host, ATMCI_TDR, value);
 
                        offset += 4;
@@ -2056,13 +2054,12 @@ static void atmci_write_data_pio(struct atmel_mci *host)
                                        goto done;
 
                                offset = 0;
-                               buf = sg_virt(sg);
                        }
                } else {
                        unsigned int remaining = sg->length - offset;
 
                        value = 0;
-                       memcpy(&value, buf + offset, remaining);
+                       sg_pcopy_from_buffer(sg, 1, &value, remaining, offset);
                        nbytes += remaining;
 
                        host->sg = sg = sg_next(sg);
@@ -2073,8 +2070,8 @@ static void atmci_write_data_pio(struct atmel_mci *host)
                        }
 
                        offset = 4 - remaining;
-                       buf = sg_virt(sg);
-                       memcpy((u8 *)&value + remaining, buf, offset);
+                       sg_pcopy_from_buffer(sg, 1, (u8 *)&value + remaining,
+                                       offset, 0);
                        atmci_writel(host, ATMCI_TDR, value);
                        nbytes += offset;
                }