diff options
Diffstat (limited to 'drivers/mmc/mmci.c')
-rw-r--r-- | drivers/mmc/mmci.c | 22 |
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; |