mmc: Allow 2 byte requests in 4-bit mode for tmio_mmc
authorYusuke Goda <yusuke.goda.sx@renesas.com>
Mon, 30 Aug 2010 10:50:19 +0000 (11:50 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Thu, 28 Oct 2010 22:29:16 +0000 (00:29 +0200)
Adjust the tmio_mmc block size check to accept 2-byte requests in 4-bit
mode if the hardware supports it.

Tested with the SDHI hardware block included in sh7724.

Signed-off-by: Yusuke Goda <yusuke.goda.sx@renesas.com>
Signed-off-by: Matt Fleming <matt@console-pimps.org>
Acked-by: Magnus Damm <damm@opensource.se>
Tested-by: Arnd Hannemann <arnd@arndnet.de>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/sh_mobile_sdhi.c
drivers/mmc/host/tmio_mmc.c
include/linux/mfd/tmio.h

index 01d83a41d570a1a5ccf2decdc167eed774fa7bfa..f1714f93af9db2c91e82ee5eeb076d6f497dd5af 100644 (file)
@@ -125,6 +125,12 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev)
                mmc_data->capabilities |= p->tmio_caps;
        }
 
+       /*
+        * All SDHI blocks support 2-byte and larger block sizes in 4-bit
+        * bus width mode.
+        */
+       mmc_data->flags |= TMIO_MMC_BLKSZ_2BYTES;
+
        if (p && p->dma_slave_tx >= 0 && p->dma_slave_rx >= 0) {
                priv->param_tx.slave_id = p->dma_slave_tx;
                priv->param_rx.slave_id = p->dma_slave_rx;
index 1a47221d01a4ff6af673e2057c3a62aa758d516b..e7765a89593e31e3377c5a09b7a5440190ff46ed 100644 (file)
@@ -658,14 +658,21 @@ static void tmio_mmc_release_dma(struct tmio_mmc_host *host)
 static int tmio_mmc_start_data(struct tmio_mmc_host *host,
        struct mmc_data *data)
 {
+       struct mfd_cell *cell = host->pdev->dev.platform_data;
+       struct tmio_mmc_data *pdata = cell->driver_data;
+
        pr_debug("setup data transfer: blocksize %08x  nr_blocks %d\n",
                 data->blksz, data->blocks);
 
-       /* Hardware cannot perform 1 and 2 byte requests in 4 bit mode */
-       if (data->blksz < 4 && host->mmc->ios.bus_width == MMC_BUS_WIDTH_4) {
-               pr_err("%s: %d byte block unsupported in 4 bit mode\n",
-                      mmc_hostname(host->mmc), data->blksz);
-               return -EINVAL;
+       /* Some hardware cannot perform 2 byte requests in 4 bit mode */
+       if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_4) {
+               int blksz_2bytes = pdata->flags & TMIO_MMC_BLKSZ_2BYTES;
+
+               if (data->blksz < 2 || (data->blksz < 4 && !blksz_2bytes)) {
+                       pr_err("%s: %d byte block unsupported in 4 bit mode\n",
+                              mmc_hostname(host->mmc), data->blksz);
+                       return -EINVAL;
+               }
        }
 
        tmio_mmc_init_sg(host, data);
index 24c43bbad541e250a6ce76a9de4860ed22f91afd..085f041197dce74a49a691fe89a550826f7b4c05 100644 (file)
 
 /* tmio MMC platform flags */
 #define TMIO_MMC_WRPROTECT_DISABLE     (1 << 0)
+/*
+ * Some controllers can support a 2-byte block size when the bus width
+ * is configured in 4-bit mode.
+ */
+#define TMIO_MMC_BLKSZ_2BYTES          (1 << 1)
 
 int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);
 int tmio_core_mmc_resume(void __iomem *cnf, int shift, unsigned long base);