ARM: 5698/1: MMCI pass capabilities in platform data
authorLinus Walleij <linus.walleij@stericsson.com>
Mon, 14 Sep 2009 11:57:11 +0000 (12:57 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 15 Sep 2009 21:11:06 +0000 (22:11 +0100)
This makes it possible to pass down the host controller
capabilities for the MMCI driver using the platform data. It
also provides the capabilties for the U300 implementation as an
example, and makes sure the 4bit wide mode is set if this is
requested by the ios() now that we can actually set that
capability for a platform.

Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/mach/mmc.h
arch/arm/mach-u300/mmc.c
drivers/mmc/host/mmci.c

index b490ecc79defdfa2cb721dbbff30c8c17ff8f6f4..27bec555ee16c98ace5cc4c5e19b7a50352f5255 100644 (file)
@@ -12,6 +12,7 @@ struct mmc_platform_data {
        unsigned int (*status)(struct device *);
        int     gpio_wp;
        int     gpio_cd;
+       unsigned long capabilities;
 };
 
 #endif
index 585cc013639dee5f4cbbf521f7dde822d6944e88..089b9957b6a4127392a8658af0bcc43af2b92914 100644 (file)
@@ -158,6 +158,8 @@ int __devinit mmc_init(struct amba_device *adev)
        mmci_card->mmc0_plat_data.status = mmc_status;
        mmci_card->mmc0_plat_data.gpio_wp = -1;
        mmci_card->mmc0_plat_data.gpio_cd = -1;
+       mmci_card->mmc0_plat_data.capabilities = MMC_CAP_MMC_HIGHSPEED |
+               MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA;
 
        mmcsd_device->platform_data = (void *) &mmci_card->mmc0_plat_data;
 
index 031141a7c87efb13a53905e2ffeb8a0dad748db9..bf7c05b29e2c15c893a4637a5ca496a805e4bc35 100644 (file)
@@ -62,6 +62,9 @@ static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired)
                /* clk |= MCI_CLK_PWRSAVE; */
        }
 
+       if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_4)
+               clk |= MCI_WIDE_BUS;
+
        writel(clk, host->base + MMCICLOCK);
 }
 
@@ -601,6 +604,7 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
        mmc->f_min = (host->mclk + 511) / 512;
        mmc->f_max = min(host->mclk, fmax);
        mmc->ocr_avail = plat->ocr_mask;
+       mmc->caps = plat->capabilities;
 
        /*
         * We can do SGIO