aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
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 /arch/arm
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>
Diffstat (limited to 'arch/arm')
-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
21 files changed, 64 insertions, 44 deletions
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 8538e4131d27..fc178a022dd2 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 67b95b5f1a2f..3eb9839e33ed 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 9447644774c2..e379bef1ef40 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 e10bc109415c..b72009a50f01 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 a07086d6a0b2..de5e2c2f4e80 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 175f04339761..f3f028056916 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 00d9b13b01c5..58698e359ccf 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 8fd226989b25..7a93bd5b24c5 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 87969c7df652..51493f59325d 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 f76d9c0a47a1..523ba551ee7b 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 dd3af2be13be..2d2e6fc127ac 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 bcd01d278c65..c1b881d3d8ae 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 663c62d271e8..9ab18fdd974c 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 96f5bbb73b6f..0bb2353b64a4 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 4c4843618350..93441e5b36ef 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 9a5eb87425fc..a3dbaa7b8632 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 6b3984964cc5..e5eac46bbac9 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 dc49c07dc161..9e5d51bee94a 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 c8f647b6205e..87ce6ffccefc 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 1fe6f0187177..281e97287adf 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 9b89ec601ee2..4f819fc261b7 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