aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/mmci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/mmci.c')
-rw-r--r--drivers/mmc/mmci.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c
index da8e4d7339c..2b5a0cc9ea5 100644
--- a/drivers/mmc/mmci.c
+++ b/drivers/mmc/mmci.c
@@ -7,7 +7,6 @@
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 */ 9 */
10#include <linux/config.h>
11#include <linux/module.h> 10#include <linux/module.h>
12#include <linux/moduleparam.h> 11#include <linux/moduleparam.h>
13#include <linux/init.h> 12#include <linux/init.h>
@@ -70,12 +69,13 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
70 unsigned int datactrl, timeout, irqmask; 69 unsigned int datactrl, timeout, irqmask;
71 unsigned long long clks; 70 unsigned long long clks;
72 void __iomem *base; 71 void __iomem *base;
72 int blksz_bits;
73 73
74 DBG(host, "blksz %04x blks %04x flags %08x\n", 74 DBG(host, "blksz %04x blks %04x flags %08x\n",
75 1 << data->blksz_bits, data->blocks, data->flags); 75 data->blksz, data->blocks, data->flags);
76 76
77 host->data = data; 77 host->data = data;
78 host->size = data->blocks << data->blksz_bits; 78 host->size = data->blksz;
79 host->data_xfered = 0; 79 host->data_xfered = 0;
80 80
81 mmci_init_sg(host, data); 81 mmci_init_sg(host, data);
@@ -89,7 +89,10 @@ static void mmci_start_data(struct mmci_host *host, struct mmc_data *data)
89 writel(timeout, base + MMCIDATATIMER); 89 writel(timeout, base + MMCIDATATIMER);
90 writel(host->size, base + MMCIDATALENGTH); 90 writel(host->size, base + MMCIDATALENGTH);
91 91
92 datactrl = MCI_DPSM_ENABLE | data->blksz_bits << 4; 92 blksz_bits = ffs(data->blksz) - 1;
93 BUG_ON(1 << blksz_bits != data->blksz);
94
95 datactrl = MCI_DPSM_ENABLE | blksz_bits << 4;
93 if (data->flags & MMC_DATA_READ) { 96 if (data->flags & MMC_DATA_READ) {
94 datactrl |= MCI_DPSM_DIRECTION; 97 datactrl |= MCI_DPSM_DIRECTION;
95 irqmask = MCI_RXFIFOHALFFULLMASK; 98 irqmask = MCI_RXFIFOHALFFULLMASK;
@@ -146,7 +149,7 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,
146 unsigned int status) 149 unsigned int status)
147{ 150{
148 if (status & MCI_DATABLOCKEND) { 151 if (status & MCI_DATABLOCKEND) {
149 host->data_xfered += 1 << data->blksz_bits; 152 host->data_xfered += data->blksz;
150 } 153 }
151 if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) { 154 if (status & (MCI_DATACRCFAIL|MCI_DATATIMEOUT|MCI_TXUNDERRUN|MCI_RXOVERRUN)) {
152 if (status & MCI_DATACRCFAIL) 155 if (status & MCI_DATACRCFAIL)
@@ -506,6 +509,7 @@ static int mmci_probe(struct amba_device *dev, void *id)
506 mmc->f_min = (host->mclk + 511) / 512; 509 mmc->f_min = (host->mclk + 511) / 512;
507 mmc->f_max = min(host->mclk, fmax); 510 mmc->f_max = min(host->mclk, fmax);
508 mmc->ocr_avail = plat->ocr_mask; 511 mmc->ocr_avail = plat->ocr_mask;
512 mmc->caps = MMC_CAP_MULTIWRITE;
509 513
510 /* 514 /*
511 * We can do SGIO 515 * We can do SGIO
@@ -532,11 +536,11 @@ static int mmci_probe(struct amba_device *dev, void *id)
532 writel(0, host->base + MMCIMASK1); 536 writel(0, host->base + MMCIMASK1);
533 writel(0xfff, host->base + MMCICLEAR); 537 writel(0xfff, host->base + MMCICLEAR);
534 538
535 ret = request_irq(dev->irq[0], mmci_irq, SA_SHIRQ, DRIVER_NAME " (cmd)", host); 539 ret = request_irq(dev->irq[0], mmci_irq, IRQF_SHARED, DRIVER_NAME " (cmd)", host);
536 if (ret) 540 if (ret)
537 goto unmap; 541 goto unmap;
538 542
539 ret = request_irq(dev->irq[1], mmci_pio_irq, SA_SHIRQ, DRIVER_NAME " (pio)", host); 543 ret = request_irq(dev->irq[1], mmci_pio_irq, IRQF_SHARED, DRIVER_NAME " (pio)", host);
540 if (ret) 544 if (ret)
541 goto irq0_free; 545 goto irq0_free;
542 546
@@ -546,9 +550,9 @@ static int mmci_probe(struct amba_device *dev, void *id)
546 550
547 mmc_add_host(mmc); 551 mmc_add_host(mmc);
548 552
549 printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%08lx irq %d,%d\n", 553 printk(KERN_INFO "%s: MMCI rev %x cfg %02x at 0x%016llx irq %d,%d\n",
550 mmc_hostname(mmc), amba_rev(dev), amba_config(dev), 554 mmc_hostname(mmc), amba_rev(dev), amba_config(dev),
551 dev->res.start, dev->irq[0], dev->irq[1]); 555 (unsigned long long)dev->res.start, dev->irq[0], dev->irq[1]);
552 556
553 init_timer(&host->timer); 557 init_timer(&host->timer);
554 host->timer.data = (unsigned long)host; 558 host->timer.data = (unsigned long)host;