diff options
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/msm_sdcc.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c index 81ed16fb42b5..9badc51bc4db 100644 --- a/drivers/mmc/host/msm_sdcc.c +++ b/drivers/mmc/host/msm_sdcc.c | |||
@@ -613,6 +613,9 @@ msmsdcc_pio_read(struct msmsdcc_host *host, char *buffer, unsigned int remain) | |||
613 | uint32_t *ptr = (uint32_t *) buffer; | 613 | uint32_t *ptr = (uint32_t *) buffer; |
614 | int count = 0; | 614 | int count = 0; |
615 | 615 | ||
616 | if (remain % 4) | ||
617 | remain = ((remain >> 2) + 1) << 2; | ||
618 | |||
616 | while (msmsdcc_readl(host, MMCISTATUS) & MCI_RXDATAAVLBL) { | 619 | while (msmsdcc_readl(host, MMCISTATUS) & MCI_RXDATAAVLBL) { |
617 | *ptr = msmsdcc_readl(host, MMCIFIFO + (count % MCI_FIFOSIZE)); | 620 | *ptr = msmsdcc_readl(host, MMCIFIFO + (count % MCI_FIFOSIZE)); |
618 | ptr++; | 621 | ptr++; |
@@ -633,13 +636,14 @@ msmsdcc_pio_write(struct msmsdcc_host *host, char *buffer, | |||
633 | char *ptr = buffer; | 636 | char *ptr = buffer; |
634 | 637 | ||
635 | do { | 638 | do { |
636 | unsigned int count, maxcnt; | 639 | unsigned int count, maxcnt, sz; |
637 | 640 | ||
638 | maxcnt = status & MCI_TXFIFOEMPTY ? MCI_FIFOSIZE : | 641 | maxcnt = status & MCI_TXFIFOEMPTY ? MCI_FIFOSIZE : |
639 | MCI_FIFOHALFSIZE; | 642 | MCI_FIFOHALFSIZE; |
640 | count = min(remain, maxcnt); | 643 | count = min(remain, maxcnt); |
641 | 644 | ||
642 | writesl(base + MMCIFIFO, ptr, count >> 2); | 645 | sz = count % 4 ? (count >> 2) + 1 : (count >> 2); |
646 | writesl(base + MMCIFIFO, ptr, sz); | ||
643 | ptr += count; | 647 | ptr += count; |
644 | remain -= count; | 648 | remain -= count; |
645 | 649 | ||