mmc: atmel-mci: use sg_copy_{from,to}_buffer
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>
This commit is contained in:
parent
53d7e098ba
commit
5b4277814e
|
@ -1967,7 +1967,6 @@ static void atmci_tasklet_func(unsigned long priv)
|
||||||
static void atmci_read_data_pio(struct atmel_mci *host)
|
static void atmci_read_data_pio(struct atmel_mci *host)
|
||||||
{
|
{
|
||||||
struct scatterlist *sg = host->sg;
|
struct scatterlist *sg = host->sg;
|
||||||
void *buf = sg_virt(sg);
|
|
||||||
unsigned int offset = host->pio_offset;
|
unsigned int offset = host->pio_offset;
|
||||||
struct mmc_data *data = host->data;
|
struct mmc_data *data = host->data;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
@ -1977,7 +1976,7 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
||||||
do {
|
do {
|
||||||
value = atmci_readl(host, ATMCI_RDR);
|
value = atmci_readl(host, ATMCI_RDR);
|
||||||
if (likely(offset + 4 <= sg->length)) {
|
if (likely(offset + 4 <= sg->length)) {
|
||||||
put_unaligned(value, (u32 *)(buf + offset));
|
sg_pcopy_to_buffer(sg, 1, &value, sizeof(u32), offset);
|
||||||
|
|
||||||
offset += 4;
|
offset += 4;
|
||||||
nbytes += 4;
|
nbytes += 4;
|
||||||
|
@ -1990,11 +1989,11 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
offset = 0;
|
offset = 0;
|
||||||
buf = sg_virt(sg);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int remaining = sg->length - offset;
|
unsigned int remaining = sg->length - offset;
|
||||||
memcpy(buf + offset, &value, remaining);
|
|
||||||
|
sg_pcopy_to_buffer(sg, 1, &value, remaining, offset);
|
||||||
nbytes += remaining;
|
nbytes += remaining;
|
||||||
|
|
||||||
flush_dcache_page(sg_page(sg));
|
flush_dcache_page(sg_page(sg));
|
||||||
|
@ -2004,8 +2003,8 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
offset = 4 - remaining;
|
offset = 4 - remaining;
|
||||||
buf = sg_virt(sg);
|
sg_pcopy_to_buffer(sg, 1, (u8 *)&value + remaining,
|
||||||
memcpy(buf, (u8 *)&value + remaining, offset);
|
offset, 0);
|
||||||
nbytes += offset;
|
nbytes += offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2035,7 +2034,6 @@ static void atmci_read_data_pio(struct atmel_mci *host)
|
||||||
static void atmci_write_data_pio(struct atmel_mci *host)
|
static void atmci_write_data_pio(struct atmel_mci *host)
|
||||||
{
|
{
|
||||||
struct scatterlist *sg = host->sg;
|
struct scatterlist *sg = host->sg;
|
||||||
void *buf = sg_virt(sg);
|
|
||||||
unsigned int offset = host->pio_offset;
|
unsigned int offset = host->pio_offset;
|
||||||
struct mmc_data *data = host->data;
|
struct mmc_data *data = host->data;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
@ -2044,7 +2042,7 @@ static void atmci_write_data_pio(struct atmel_mci *host)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (likely(offset + 4 <= sg->length)) {
|
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);
|
atmci_writel(host, ATMCI_TDR, value);
|
||||||
|
|
||||||
offset += 4;
|
offset += 4;
|
||||||
|
@ -2056,13 +2054,12 @@ static void atmci_write_data_pio(struct atmel_mci *host)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
offset = 0;
|
offset = 0;
|
||||||
buf = sg_virt(sg);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int remaining = sg->length - offset;
|
unsigned int remaining = sg->length - offset;
|
||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
memcpy(&value, buf + offset, remaining);
|
sg_pcopy_from_buffer(sg, 1, &value, remaining, offset);
|
||||||
nbytes += remaining;
|
nbytes += remaining;
|
||||||
|
|
||||||
host->sg = sg = sg_next(sg);
|
host->sg = sg = sg_next(sg);
|
||||||
|
@ -2073,8 +2070,8 @@ static void atmci_write_data_pio(struct atmel_mci *host)
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = 4 - remaining;
|
offset = 4 - remaining;
|
||||||
buf = sg_virt(sg);
|
sg_pcopy_from_buffer(sg, 1, (u8 *)&value + remaining,
|
||||||
memcpy((u8 *)&value + remaining, buf, offset);
|
offset, 0);
|
||||||
atmci_writel(host, ATMCI_TDR, value);
|
atmci_writel(host, ATMCI_TDR, value);
|
||||||
nbytes += offset;
|
nbytes += offset;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user