aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSukumar Ghorai <s-ghorai@ti.com>2010-09-15 10:49:23 -0400
committerTony Lindgren <tony@atomide.com>2010-09-27 13:15:26 -0400
commit3a63833ec3002816a759a49ebda4e229c089114e (patch)
tree0ba266febb87cd181ed414b2f3ee103c37470e88
parent7193559af4243279790fd8dbfef82f8536d9c514 (diff)
omap: mmc: extended to pass host capabilities from board file
wires variable is renamed, extended and this single variable to be used to pass the platform capabilities, e.g DDR mode. Also removed the hardcoded value was using as bus-width. Signed-off-by: Sukumar Ghorai <s-ghorai@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--arch/arm/mach-omap2/board-2430sdp.c3
-rw-r--r--arch/arm/mach-omap2/board-3430sdp.c5
-rw-r--r--arch/arm/mach-omap2/board-4430sdp.c4
-rw-r--r--arch/arm/mach-omap2/board-cm-t35.c5
-rw-r--r--arch/arm/mach-omap2/board-devkit8000.c3
-rw-r--r--arch/arm/mach-omap2/board-igep0020.c5
-rw-r--r--arch/arm/mach-omap2/board-ldp.c3
-rw-r--r--arch/arm/mach-omap2/board-n8x0.c2
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c3
-rw-r--r--arch/arm/mach-omap2/board-omap3evm.c3
-rw-r--r--arch/arm/mach-omap2/board-omap3pandora.c7
-rw-r--r--arch/arm/mach-omap2/board-omap3stalker.c3
-rw-r--r--arch/arm/mach-omap2/board-omap3touchbook.c3
-rw-r--r--arch/arm/mach-omap2/board-omap4panda.c2
-rw-r--r--arch/arm/mach-omap2/board-overo.c5
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c5
-rw-r--r--arch/arm/mach-omap2/board-zoom-peripherals.c5
-rw-r--r--arch/arm/mach-omap2/devices.c16
-rw-r--r--arch/arm/mach-omap2/hsmmc.c16
-rw-r--r--arch/arm/mach-omap2/hsmmc.h3
-rw-r--r--arch/arm/plat-omap/include/plat/mmc.h7
-rw-r--r--drivers/mmc/host/omap.c2
-rw-r--r--drivers/mmc/host/omap_hsmmc.c18
23 files changed, 67 insertions, 61 deletions
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 8538e4131d2..fc178a022dd 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -19,6 +19,7 @@
19#include <linux/mtd/mtd.h> 19#include <linux/mtd/mtd.h>
20#include <linux/mtd/partitions.h> 20#include <linux/mtd/partitions.h>
21#include <linux/mtd/physmap.h> 21#include <linux/mtd/physmap.h>
22#include <linux/mmc/host.h>
22#include <linux/delay.h> 23#include <linux/delay.h>
23#include <linux/i2c/twl.h> 24#include <linux/i2c/twl.h>
24#include <linux/err.h> 25#include <linux/err.h>
@@ -190,7 +191,7 @@ static int __init omap2430_i2c_init(void)
190static struct omap2_hsmmc_info mmc[] __initdata = { 191static struct omap2_hsmmc_info mmc[] __initdata = {
191 { 192 {
192 .mmc = 1, 193 .mmc = 1,
193 .wires = 4, 194 .caps = MMC_CAP_4_BIT_DATA,
194 .gpio_cd = -EINVAL, 195 .gpio_cd = -EINVAL,
195 .gpio_wp = -EINVAL, 196 .gpio_wp = -EINVAL,
196 .ext_clock = 1, 197 .ext_clock = 1,
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index 67b95b5f1a2..3eb9839e33e 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -24,6 +24,7 @@
24#include <linux/regulator/machine.h> 24#include <linux/regulator/machine.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/gpio.h> 26#include <linux/gpio.h>
27#include <linux/mmc/host.h>
27 28
28#include <mach/hardware.h> 29#include <mach/hardware.h>
29#include <asm/mach-types.h> 30#include <asm/mach-types.h>
@@ -353,12 +354,12 @@ static struct omap2_hsmmc_info mmc[] = {
353 /* 8 bits (default) requires S6.3 == ON, 354 /* 8 bits (default) requires S6.3 == ON,
354 * so the SIM card isn't used; else 4 bits. 355 * so the SIM card isn't used; else 4 bits.
355 */ 356 */
356 .wires = 8, 357 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
357 .gpio_wp = 4, 358 .gpio_wp = 4,
358 }, 359 },
359 { 360 {
360 .mmc = 2, 361 .mmc = 2,
361 .wires = 8, 362 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
362 .gpio_wp = 7, 363 .gpio_wp = 7,
363 }, 364 },
364 {} /* Terminator */ 365 {} /* Terminator */
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 9447644774c..e379bef1ef4 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -193,12 +193,12 @@ static struct omap_musb_board_data musb_board_data = {
193static struct omap2_hsmmc_info mmc[] = { 193static struct omap2_hsmmc_info mmc[] = {
194 { 194 {
195 .mmc = 1, 195 .mmc = 1,
196 .wires = 8, 196 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
197 .gpio_wp = -EINVAL, 197 .gpio_wp = -EINVAL,
198 }, 198 },
199 { 199 {
200 .mmc = 2, 200 .mmc = 2,
201 .wires = 8, 201 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
202 .gpio_cd = -EINVAL, 202 .gpio_cd = -EINVAL,
203 .gpio_wp = -EINVAL, 203 .gpio_wp = -EINVAL,
204 .nonremovable = true, 204 .nonremovable = true,
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
index e10bc109415..b72009a50f0 100644
--- a/arch/arm/mach-omap2/board-cm-t35.c
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -31,6 +31,7 @@
31#include <linux/i2c/at24.h> 31#include <linux/i2c/at24.h>
32#include <linux/i2c/twl.h> 32#include <linux/i2c/twl.h>
33#include <linux/regulator/machine.h> 33#include <linux/regulator/machine.h>
34#include <linux/mmc/host.h>
34 35
35#include <linux/spi/spi.h> 36#include <linux/spi/spi.h>
36#include <linux/spi/tdo24m.h> 37#include <linux/spi/tdo24m.h>
@@ -579,14 +580,14 @@ static struct twl4030_keypad_data cm_t35_kp_data = {
579static struct omap2_hsmmc_info mmc[] = { 580static struct omap2_hsmmc_info mmc[] = {
580 { 581 {
581 .mmc = 1, 582 .mmc = 1,
582 .wires = 4, 583 .caps = MMC_CAP_4_BIT_DATA,
583 .gpio_cd = -EINVAL, 584 .gpio_cd = -EINVAL,
584 .gpio_wp = -EINVAL, 585 .gpio_wp = -EINVAL,
585 586
586 }, 587 },
587 { 588 {
588 .mmc = 2, 589 .mmc = 2,
589 .wires = 4, 590 .caps = MMC_CAP_4_BIT_DATA,
590 .transceiver = 1, 591 .transceiver = 1,
591 .gpio_cd = -EINVAL, 592 .gpio_cd = -EINVAL,
592 .gpio_wp = -EINVAL, 593 .gpio_wp = -EINVAL,
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c
index a07086d6a0b..de5e2c2f4e8 100644
--- a/arch/arm/mach-omap2/board-devkit8000.c
+++ b/arch/arm/mach-omap2/board-devkit8000.c
@@ -28,6 +28,7 @@
28#include <linux/mtd/mtd.h> 28#include <linux/mtd/mtd.h>
29#include <linux/mtd/partitions.h> 29#include <linux/mtd/partitions.h>
30#include <linux/mtd/nand.h> 30#include <linux/mtd/nand.h>
31#include <linux/mmc/host.h>
31 32
32#include <linux/regulator/machine.h> 33#include <linux/regulator/machine.h>
33#include <linux/i2c/twl.h> 34#include <linux/i2c/twl.h>
@@ -105,7 +106,7 @@ static struct omap_nand_platform_data devkit8000_nand_data = {
105static struct omap2_hsmmc_info mmc[] = { 106static struct omap2_hsmmc_info mmc[] = {
106 { 107 {
107 .mmc = 1, 108 .mmc = 1,
108 .wires = 8, 109 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
109 .gpio_wp = 29, 110 .gpio_wp = 29,
110 }, 111 },
111 {} /* Terminator */ 112 {} /* Terminator */
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 175f0433976..f3f02805691 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -20,6 +20,7 @@
20 20
21#include <linux/regulator/machine.h> 21#include <linux/regulator/machine.h>
22#include <linux/i2c/twl.h> 22#include <linux/i2c/twl.h>
23#include <linux/mmc/host.h>
23 24
24#include <asm/mach-types.h> 25#include <asm/mach-types.h>
25#include <asm/mach/arch.h> 26#include <asm/mach/arch.h>
@@ -248,13 +249,13 @@ static struct regulator_init_data igep2_vmmc2 = {
248static struct omap2_hsmmc_info mmc[] = { 249static struct omap2_hsmmc_info mmc[] = {
249 { 250 {
250 .mmc = 1, 251 .mmc = 1,
251 .wires = 4, 252 .caps = MMC_CAP_4_BIT_DATA,
252 .gpio_cd = -EINVAL, 253 .gpio_cd = -EINVAL,
253 .gpio_wp = -EINVAL, 254 .gpio_wp = -EINVAL,
254 }, 255 },
255 { 256 {
256 .mmc = 2, 257 .mmc = 2,
257 .wires = 4, 258 .caps = MMC_CAP_4_BIT_DATA,
258 .gpio_cd = -EINVAL, 259 .gpio_cd = -EINVAL,
259 .gpio_wp = -EINVAL, 260 .gpio_wp = -EINVAL,
260 }, 261 },
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 00d9b13b01c..58698e359cc 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -27,6 +27,7 @@
27#include <linux/i2c/twl.h> 27#include <linux/i2c/twl.h>
28#include <linux/io.h> 28#include <linux/io.h>
29#include <linux/smsc911x.h> 29#include <linux/smsc911x.h>
30#include <linux/mmc/host.h>
30 31
31#include <mach/hardware.h> 32#include <mach/hardware.h>
32#include <asm/mach-types.h> 33#include <asm/mach-types.h>
@@ -362,7 +363,7 @@ static int __init omap_i2c_init(void)
362static struct omap2_hsmmc_info mmc[] __initdata = { 363static struct omap2_hsmmc_info mmc[] __initdata = {
363 { 364 {
364 .mmc = 1, 365 .mmc = 1,
365 .wires = 4, 366 .caps = MMC_CAP_4_BIT_DATA,
366 .gpio_cd = -EINVAL, 367 .gpio_cd = -EINVAL,
367 .gpio_wp = -EINVAL, 368 .gpio_wp = -EINVAL,
368 }, 369 },
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index 8fd226989b2..7a93bd5b24c 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -488,7 +488,7 @@ static struct omap_mmc_platform_data mmc1_data = {
488 .max_freq = 24000000, 488 .max_freq = 24000000,
489 .dma_mask = 0xffffffff, 489 .dma_mask = 0xffffffff,
490 .slots[0] = { 490 .slots[0] = {
491 .wires = 4, 491 .caps = MMC_CAP_4_BIT_DATA,
492 .set_power = n8x0_mmc_set_power, 492 .set_power = n8x0_mmc_set_power,
493 .set_bus_mode = n8x0_mmc_set_bus_mode, 493 .set_bus_mode = n8x0_mmc_set_bus_mode,
494 .get_cover_state = n8x0_mmc_get_cover_state, 494 .get_cover_state = n8x0_mmc_get_cover_state,
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 87969c7df65..51493f59325 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -27,6 +27,7 @@
27#include <linux/mtd/mtd.h> 27#include <linux/mtd/mtd.h>
28#include <linux/mtd/partitions.h> 28#include <linux/mtd/partitions.h>
29#include <linux/mtd/nand.h> 29#include <linux/mtd/nand.h>
30#include <linux/mmc/host.h>
30 31
31#include <linux/regulator/machine.h> 32#include <linux/regulator/machine.h>
32#include <linux/i2c/twl.h> 33#include <linux/i2c/twl.h>
@@ -166,7 +167,7 @@ static void __init beagle_display_init(void)
166static struct omap2_hsmmc_info mmc[] = { 167static struct omap2_hsmmc_info mmc[] = {
167 { 168 {
168 .mmc = 1, 169 .mmc = 1,
169 .wires = 8, 170 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
170 .gpio_wp = 29, 171 .gpio_wp = 29,
171 }, 172 },
172 {} /* Terminator */ 173 {} /* Terminator */
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index f76d9c0a47a..523ba551ee7 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -31,6 +31,7 @@
31#include <linux/smsc911x.h> 31#include <linux/smsc911x.h>
32 32
33#include <linux/regulator/machine.h> 33#include <linux/regulator/machine.h>
34#include <linux/mmc/host.h>
34 35
35#include <mach/hardware.h> 36#include <mach/hardware.h>
36#include <asm/mach-types.h> 37#include <asm/mach-types.h>
@@ -370,7 +371,7 @@ static struct regulator_init_data omap3evm_vsim = {
370static struct omap2_hsmmc_info mmc[] = { 371static struct omap2_hsmmc_info mmc[] = {
371 { 372 {
372 .mmc = 1, 373 .mmc = 1,
373 .wires = 4, 374 .caps = MMC_CAP_4_BIT_DATA,
374 .gpio_cd = -EINVAL, 375 .gpio_cd = -EINVAL,
375 .gpio_wp = 63, 376 .gpio_wp = 63,
376 }, 377 },
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index dd3af2be13b..2d2e6fc127a 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -32,6 +32,7 @@
32#include <linux/input.h> 32#include <linux/input.h>
33#include <linux/input/matrix_keypad.h> 33#include <linux/input/matrix_keypad.h>
34#include <linux/gpio_keys.h> 34#include <linux/gpio_keys.h>
35#include <linux/mmc/host.h>
35#include <linux/mmc/card.h> 36#include <linux/mmc/card.h>
36 37
37#include <asm/mach-types.h> 38#include <asm/mach-types.h>
@@ -276,14 +277,14 @@ static void pandora_wl1251_init_card(struct mmc_card *card)
276static struct omap2_hsmmc_info omap3pandora_mmc[] = { 277static struct omap2_hsmmc_info omap3pandora_mmc[] = {
277 { 278 {
278 .mmc = 1, 279 .mmc = 1,
279 .wires = 4, 280 .caps = MMC_CAP_4_BIT_DATA,
280 .gpio_cd = -EINVAL, 281 .gpio_cd = -EINVAL,
281 .gpio_wp = 126, 282 .gpio_wp = 126,
282 .ext_clock = 0, 283 .ext_clock = 0,
283 }, 284 },
284 { 285 {
285 .mmc = 2, 286 .mmc = 2,
286 .wires = 4, 287 .caps = MMC_CAP_4_BIT_DATA,
287 .gpio_cd = -EINVAL, 288 .gpio_cd = -EINVAL,
288 .gpio_wp = 127, 289 .gpio_wp = 127,
289 .ext_clock = 1, 290 .ext_clock = 1,
@@ -291,7 +292,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
291 }, 292 },
292 { 293 {
293 .mmc = 3, 294 .mmc = 3,
294 .wires = 4, 295 .caps = MMC_CAP_4_BIT_DATA,
295 .gpio_cd = -EINVAL, 296 .gpio_cd = -EINVAL,
296 .gpio_wp = -EINVAL, 297 .gpio_wp = -EINVAL,
297 .init_card = pandora_wl1251_init_card, 298 .init_card = pandora_wl1251_init_card,
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c
index bcd01d278c6..c1b881d3d8a 100644
--- a/arch/arm/mach-omap2/board-omap3stalker.c
+++ b/arch/arm/mach-omap2/board-omap3stalker.c
@@ -26,6 +26,7 @@
26 26
27#include <linux/regulator/machine.h> 27#include <linux/regulator/machine.h>
28#include <linux/i2c/twl.h> 28#include <linux/i2c/twl.h>
29#include <linux/mmc/host.h>
29 30
30#include <mach/hardware.h> 31#include <mach/hardware.h>
31#include <asm/mach-types.h> 32#include <asm/mach-types.h>
@@ -275,7 +276,7 @@ static struct regulator_init_data omap3stalker_vsim = {
275static struct omap2_hsmmc_info mmc[] = { 276static struct omap2_hsmmc_info mmc[] = {
276 { 277 {
277 .mmc = 1, 278 .mmc = 1,
278 .wires = 4, 279 .caps = MMC_CAP_4_BIT_DATA,
279 .gpio_cd = -EINVAL, 280 .gpio_cd = -EINVAL,
280 .gpio_wp = 23, 281 .gpio_wp = 23,
281 }, 282 },
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
index 663c62d271e..9ab18fdd974 100644
--- a/arch/arm/mach-omap2/board-omap3touchbook.c
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -27,6 +27,7 @@
27#include <linux/mtd/mtd.h> 27#include <linux/mtd/mtd.h>
28#include <linux/mtd/partitions.h> 28#include <linux/mtd/partitions.h>
29#include <linux/mtd/nand.h> 29#include <linux/mtd/nand.h>
30#include <linux/mmc/host.h>
30 31
31#include <plat/mcspi.h> 32#include <plat/mcspi.h>
32#include <linux/spi/spi.h> 33#include <linux/spi/spi.h>
@@ -108,7 +109,7 @@ static struct omap_nand_platform_data omap3touchbook_nand_data = {
108static struct omap2_hsmmc_info mmc[] = { 109static struct omap2_hsmmc_info mmc[] = {
109 { 110 {
110 .mmc = 1, 111 .mmc = 1,
111 .wires = 8, 112 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
112 .gpio_wp = 29, 113 .gpio_wp = 29,
113 }, 114 },
114 {} /* Terminator */ 115 {} /* Terminator */
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index 96f5bbb73b6..0bb2353b64a 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -56,7 +56,7 @@ static struct omap_musb_board_data musb_board_data = {
56static struct omap2_hsmmc_info mmc[] = { 56static struct omap2_hsmmc_info mmc[] = {
57 { 57 {
58 .mmc = 1, 58 .mmc = 1,
59 .wires = 8, 59 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
60 .gpio_wp = -EINVAL, 60 .gpio_wp = -EINVAL,
61 }, 61 },
62 {} /* Terminator */ 62 {} /* Terminator */
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index 4c484361835..93441e5b36e 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -32,6 +32,7 @@
32#include <linux/mtd/mtd.h> 32#include <linux/mtd/mtd.h>
33#include <linux/mtd/nand.h> 33#include <linux/mtd/nand.h>
34#include <linux/mtd/partitions.h> 34#include <linux/mtd/partitions.h>
35#include <linux/mmc/host.h>
35 36
36#include <asm/mach-types.h> 37#include <asm/mach-types.h>
37#include <asm/mach/arch.h> 38#include <asm/mach/arch.h>
@@ -303,13 +304,13 @@ static void __init overo_flash_init(void)
303static struct omap2_hsmmc_info mmc[] = { 304static struct omap2_hsmmc_info mmc[] = {
304 { 305 {
305 .mmc = 1, 306 .mmc = 1,
306 .wires = 4, 307 .caps = MMC_CAP_4_BIT_DATA,
307 .gpio_cd = -EINVAL, 308 .gpio_cd = -EINVAL,
308 .gpio_wp = -EINVAL, 309 .gpio_wp = -EINVAL,
309 }, 310 },
310 { 311 {
311 .mmc = 2, 312 .mmc = 2,
312 .wires = 4, 313 .caps = MMC_CAP_4_BIT_DATA,
313 .gpio_cd = -EINVAL, 314 .gpio_cd = -EINVAL,
314 .gpio_wp = -EINVAL, 315 .gpio_wp = -EINVAL,
315 .transceiver = true, 316 .transceiver = true,
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 9a5eb87425f..a3dbaa7b863 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -302,7 +302,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
302 { 302 {
303 .name = "external", 303 .name = "external",
304 .mmc = 1, 304 .mmc = 1,
305 .wires = 4, 305 .caps = MMC_CAP_4_BIT_DATA,
306 .cover_only = true, 306 .cover_only = true,
307 .gpio_cd = 160, 307 .gpio_cd = 160,
308 .gpio_wp = -EINVAL, 308 .gpio_wp = -EINVAL,
@@ -311,7 +311,8 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
311 { 311 {
312 .name = "internal", 312 .name = "internal",
313 .mmc = 2, 313 .mmc = 2,
314 .wires = 8, /* See also rx51_mmc2_remux */ 314 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
315 /* See also rx51_mmc2_remux */
315 .gpio_cd = -EINVAL, 316 .gpio_cd = -EINVAL,
316 .gpio_wp = -EINVAL, 317 .gpio_wp = -EINVAL,
317 .nonremovable = true, 318 .nonremovable = true,
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
index 6b3984964cc..e5eac46bbac 100644
--- a/arch/arm/mach-omap2/board-zoom-peripherals.c
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -16,6 +16,7 @@
16#include <linux/gpio.h> 16#include <linux/gpio.h>
17#include <linux/i2c/twl.h> 17#include <linux/i2c/twl.h>
18#include <linux/regulator/machine.h> 18#include <linux/regulator/machine.h>
19#include <linux/mmc/host.h>
19 20
20#include <asm/mach-types.h> 21#include <asm/mach-types.h>
21#include <asm/mach/arch.h> 22#include <asm/mach/arch.h>
@@ -155,14 +156,14 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
155 { 156 {
156 .name = "external", 157 .name = "external",
157 .mmc = 1, 158 .mmc = 1,
158 .wires = 4, 159 .caps = MMC_CAP_4_BIT_DATA,
159 .gpio_wp = -EINVAL, 160 .gpio_wp = -EINVAL,
160 .power_saving = true, 161 .power_saving = true,
161 }, 162 },
162 { 163 {
163 .name = "internal", 164 .name = "internal",
164 .mmc = 2, 165 .mmc = 2,
165 .wires = 8, 166 .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
166 .gpio_cd = -EINVAL, 167 .gpio_cd = -EINVAL,
167 .gpio_wp = -EINVAL, 168 .gpio_wp = -EINVAL,
168 .nonremovable = true, 169 .nonremovable = true,
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index dc49c07dc16..9e5d51bee94 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -694,7 +694,7 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
694 omap_mux_init_signal("sdmmc_dat0", 0); 694 omap_mux_init_signal("sdmmc_dat0", 0);
695 omap_mux_init_signal("sdmmc_dat_dir0", 0); 695 omap_mux_init_signal("sdmmc_dat_dir0", 0);
696 omap_mux_init_signal("sdmmc_cmd_dir", 0); 696 omap_mux_init_signal("sdmmc_cmd_dir", 0);
697 if (mmc_controller->slots[0].wires == 4) { 697 if (mmc_controller->slots[0].caps & MMC_CAP_4_BIT_DATA) {
698 omap_mux_init_signal("sdmmc_dat1", 0); 698 omap_mux_init_signal("sdmmc_dat1", 0);
699 omap_mux_init_signal("sdmmc_dat2", 0); 699 omap_mux_init_signal("sdmmc_dat2", 0);
700 omap_mux_init_signal("sdmmc_dat3", 0); 700 omap_mux_init_signal("sdmmc_dat3", 0);
@@ -722,8 +722,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
722 OMAP_PIN_INPUT_PULLUP); 722 OMAP_PIN_INPUT_PULLUP);
723 omap_mux_init_signal("sdmmc1_dat0", 723 omap_mux_init_signal("sdmmc1_dat0",
724 OMAP_PIN_INPUT_PULLUP); 724 OMAP_PIN_INPUT_PULLUP);
725 if (mmc_controller->slots[0].wires == 4 || 725 if (mmc_controller->slots[0].caps &
726 mmc_controller->slots[0].wires == 8) { 726 (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
727 omap_mux_init_signal("sdmmc1_dat1", 727 omap_mux_init_signal("sdmmc1_dat1",
728 OMAP_PIN_INPUT_PULLUP); 728 OMAP_PIN_INPUT_PULLUP);
729 omap_mux_init_signal("sdmmc1_dat2", 729 omap_mux_init_signal("sdmmc1_dat2",
@@ -731,7 +731,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
731 omap_mux_init_signal("sdmmc1_dat3", 731 omap_mux_init_signal("sdmmc1_dat3",
732 OMAP_PIN_INPUT_PULLUP); 732 OMAP_PIN_INPUT_PULLUP);
733 } 733 }
734 if (mmc_controller->slots[0].wires == 8) { 734 if (mmc_controller->slots[0].caps &
735 MMC_CAP_8_BIT_DATA) {
735 omap_mux_init_signal("sdmmc1_dat4", 736 omap_mux_init_signal("sdmmc1_dat4",
736 OMAP_PIN_INPUT_PULLUP); 737 OMAP_PIN_INPUT_PULLUP);
737 omap_mux_init_signal("sdmmc1_dat5", 738 omap_mux_init_signal("sdmmc1_dat5",
@@ -755,8 +756,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
755 * For 8 wire configurations, Lines DAT4, 5, 6 and 7 need to be muxed 756 * For 8 wire configurations, Lines DAT4, 5, 6 and 7 need to be muxed
756 * in the board-*.c files 757 * in the board-*.c files
757 */ 758 */
758 if (mmc_controller->slots[0].wires == 4 || 759 if (mmc_controller->slots[0].caps &
759 mmc_controller->slots[0].wires == 8) { 760 (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
760 omap_mux_init_signal("sdmmc2_dat1", 761 omap_mux_init_signal("sdmmc2_dat1",
761 OMAP_PIN_INPUT_PULLUP); 762 OMAP_PIN_INPUT_PULLUP);
762 omap_mux_init_signal("sdmmc2_dat2", 763 omap_mux_init_signal("sdmmc2_dat2",
@@ -764,7 +765,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
764 omap_mux_init_signal("sdmmc2_dat3", 765 omap_mux_init_signal("sdmmc2_dat3",
765 OMAP_PIN_INPUT_PULLUP); 766 OMAP_PIN_INPUT_PULLUP);
766 } 767 }
767 if (mmc_controller->slots[0].wires == 8) { 768 if (mmc_controller->slots[0].caps &
769 MMC_CAP_8_BIT_DATA) {
768 omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4", 770 omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4",
769 OMAP_PIN_INPUT_PULLUP); 771 OMAP_PIN_INPUT_PULLUP);
770 omap_mux_init_signal("sdmmc2_dat5.sdmmc2_dat5", 772 omap_mux_init_signal("sdmmc2_dat5.sdmmc2_dat5",
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index c8f647b6205..87ce6ffccef 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -258,7 +258,7 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
258 "mmc%islot%i", c->mmc, 1); 258 "mmc%islot%i", c->mmc, 1);
259 mmc->slots[0].name = hc->name; 259 mmc->slots[0].name = hc->name;
260 mmc->nr_slots = 1; 260 mmc->nr_slots = 1;
261 mmc->slots[0].wires = c->wires; 261 mmc->slots[0].caps = c->caps;
262 mmc->slots[0].internal_clock = !c->ext_clock; 262 mmc->slots[0].internal_clock = !c->ext_clock;
263 mmc->dma_mask = 0xffffffff; 263 mmc->dma_mask = 0xffffffff;
264 264
@@ -316,16 +316,20 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
316 } 316 }
317 317
318 /* Omap3630 HSMMC1 supports only 4-bit */ 318 /* Omap3630 HSMMC1 supports only 4-bit */
319 if (cpu_is_omap3630() && c->wires > 4) { 319 if (cpu_is_omap3630() &&
320 c->wires = 4; 320 (c->caps & MMC_CAP_8_BIT_DATA)) {
321 mmc->slots[0].wires = c->wires; 321 c->caps &= ~MMC_CAP_8_BIT_DATA;
322 c->caps |= MMC_CAP_4_BIT_DATA;
323 mmc->slots[0].caps = c->caps;
322 } 324 }
323 break; 325 break;
324 case 2: 326 case 2:
325 if (c->ext_clock) 327 if (c->ext_clock)
326 c->transceiver = 1; 328 c->transceiver = 1;
327 if (c->transceiver && c->wires > 4) 329 if (c->transceiver && (c->caps & MMC_CAP_8_BIT_DATA)) {
328 c->wires = 4; 330 c->caps &= ~MMC_CAP_8_BIT_DATA;
331 c->caps |= MMC_CAP_4_BIT_DATA;
332 }
329 /* FALLTHROUGH */ 333 /* FALLTHROUGH */
330 case 3: 334 case 3:
331 if (mmc->slots[0].features & HSMMC_HAS_PBIAS) { 335 if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index 1fe6f018717..281e97287ad 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -10,7 +10,8 @@ struct mmc_card;
10 10
11struct omap2_hsmmc_info { 11struct omap2_hsmmc_info {
12 u8 mmc; /* controller 1/2/3 */ 12 u8 mmc; /* controller 1/2/3 */
13 u8 wires; /* 1/4/8 wires */ 13 u32 caps; /* 4/8 wires and any additional host
14 * capabilities OR'd (ref. linux/mmc/host.h) */
14 bool transceiver; /* MMC-2 option */ 15 bool transceiver; /* MMC-2 option */
15 bool ext_clock; /* use external pin for input clock */ 16 bool ext_clock; /* use external pin for input clock */
16 bool cover_only; /* No card detect - just cover switch */ 17 bool cover_only; /* No card detect - just cover switch */
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index 9b89ec601ee..4f819fc261b 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -73,10 +73,9 @@ struct omap_mmc_platform_data {
73 73
74 struct omap_mmc_slot_data { 74 struct omap_mmc_slot_data {
75 75
76 /* 4 wire signaling is optional, and is used for SD/SDIO/HSMMC; 76 /* 4/8 wires and any additional host capabilities
77 * 8 wire signaling is also optional, and is used with HSMMC 77 * need to OR'd all capabilities (ref. linux/mmc/host.h) */
78 */ 78 u32 caps;
79 u8 wires;
80 79
81 /* 80 /*
82 * nomux means "standard" muxing is wrong on this board, and 81 * nomux means "standard" muxing is wrong on this board, and
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index d98ddcfac5e..a9d62cfa87a 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -1317,7 +1317,7 @@ static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id)
1317 host->slots[id] = slot; 1317 host->slots[id] = slot;
1318 1318
1319 mmc->caps = 0; 1319 mmc->caps = 0;
1320 if (host->pdata->slots[id].wires >= 4) 1320 if (host->pdata->slots[id].caps & MMC_CAP_8_BIT_DATA)
1321 mmc->caps |= MMC_CAP_4_BIT_DATA; 1321 mmc->caps |= MMC_CAP_4_BIT_DATA;
1322 1322
1323 mmc->ops = &mmc_omap_ops; 1323 mmc->ops = &mmc_omap_ops;
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 4526d2791f2..53f8fa599cf 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2116,23 +2116,9 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
2116 mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | 2116 mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
2117 MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE; 2117 MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
2118 2118
2119 switch (mmc_slot(host).wires) { 2119 mmc->caps |= mmc_slot(host).caps;
2120 case 8: 2120 if (mmc->caps & MMC_CAP_8_BIT_DATA)
2121 mmc->caps |= MMC_CAP_8_BIT_DATA;
2122 /* Fall through */
2123 case 4:
2124 mmc->caps |= MMC_CAP_4_BIT_DATA; 2121 mmc->caps |= MMC_CAP_4_BIT_DATA;
2125 break;
2126 case 1:
2127 /* Nothing to crib here */
2128 case 0:
2129 /* Assuming nothing was given by board, Core use's 1-Bit */
2130 break;
2131 default:
2132 /* Completely unexpected.. Core goes with 1-Bit Width */
2133 dev_crit(mmc_dev(host->mmc), "Invalid width %d\n used!"
2134 "using 1 instead\n", mmc_slot(host).wires);
2135 }
2136 2122
2137 if (mmc_slot(host).nonremovable) 2123 if (mmc_slot(host).nonremovable)
2138 mmc->caps |= MMC_CAP_NONREMOVABLE; 2124 mmc->caps |= MMC_CAP_NONREMOVABLE;