Skip to content

Commit

Permalink
mmc: atmel-mci: use sg_copy_{from,to}_buffer
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christoph Hellwig authored and storulf committed May 21, 2018
1 parent 53d7e09 commit 5b42778
Showing 1 changed file with 9 additions and 12 deletions.
21 changes: 9 additions & 12 deletions drivers/mmc/host/atmel-mci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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));
Expand All @@ -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;
}

Expand Down Expand Up @@ -2035,7 +2034,6 @@ static void atmci_read_data_pio(struct atmel_mci *host)
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;
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
}
Expand Down

0 comments on commit 5b42778

Please sign in to comment.