diff options
author | Tony Lindgren <tony@atomide.com> | 2012-02-20 12:43:29 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2012-02-20 13:00:39 -0500 |
commit | 3b972bf06c22f5abfa6586a8baf50321cd825965 (patch) | |
tree | 666fd47675069dae78337f648670a550c4f9f85b /arch/arm/mach-omap2/board-3430sdp.c | |
parent | 993e4fbd7822cdf874fcf9f1b054a323d67ccf97 (diff) |
ARM: OMAP2+: Split omap2_hsmmc_init() to properly support I2C GPIO pins
Otherwise omap_device_build() and omap_mux related functions
can't be marked as __init when twl is build as a module.
If a board is using GPIO pins or regulators configured by an
external chip, such as TWL PMIC on I2C bus, the board must
mark those MMC controllers as deferred. Additionally both
omap_hsmmc_init() and omap_hsmmc_late_init() must be called
by the board.
For MMC controllers using internal GPIO pins for card
detect and regulators the slots don't need to be marked
deferred. In this case calling omap_hsmmc_init() is sufficient.
Only mark the MMC slots using gpio_cd or gpio_wd as deferred
as noted by Igor Grinberg <grinberg@compulab.co.il>.
Note that this patch does not change the behaviour for
board-4430sdp.c board-omap4panda.c. These boards wrongly
rely on the omap_hsmmc.c init function callback to configure
the PMIC GPIO interrupt lines on external chip. If the PMIC
interrupt lines are not configured during init, they will
fail.
Reported-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/board-3430sdp.c')
-rw-r--r-- | arch/arm/mach-omap2/board-3430sdp.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 383717ba63b9..da75f239873e 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -232,11 +232,13 @@ static struct omap2_hsmmc_info mmc[] = { | |||
232 | */ | 232 | */ |
233 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 233 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, |
234 | .gpio_wp = 4, | 234 | .gpio_wp = 4, |
235 | .deferred = true, | ||
235 | }, | 236 | }, |
236 | { | 237 | { |
237 | .mmc = 2, | 238 | .mmc = 2, |
238 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 239 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, |
239 | .gpio_wp = 7, | 240 | .gpio_wp = 7, |
241 | .deferred = true, | ||
240 | }, | 242 | }, |
241 | {} /* Terminator */ | 243 | {} /* Terminator */ |
242 | }; | 244 | }; |
@@ -249,7 +251,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev, | |||
249 | */ | 251 | */ |
250 | mmc[0].gpio_cd = gpio + 0; | 252 | mmc[0].gpio_cd = gpio + 0; |
251 | mmc[1].gpio_cd = gpio + 1; | 253 | mmc[1].gpio_cd = gpio + 1; |
252 | omap2_hsmmc_init(mmc); | 254 | omap_hsmmc_late_init(mmc); |
253 | 255 | ||
254 | /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ | 256 | /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ |
255 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl"); | 257 | gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl"); |
@@ -606,6 +608,7 @@ static void __init omap_3430sdp_init(void) | |||
606 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 608 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
607 | omap_board_config = sdp3430_config; | 609 | omap_board_config = sdp3430_config; |
608 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); | 610 | omap_board_config_size = ARRAY_SIZE(sdp3430_config); |
611 | omap_hsmmc_init(mmc); | ||
609 | omap3430_i2c_init(); | 612 | omap3430_i2c_init(); |
610 | omap_display_init(&sdp3430_dss_data); | 613 | omap_display_init(&sdp3430_dss_data); |
611 | if (omap_rev() > OMAP3430_REV_ES1_0) | 614 | if (omap_rev() > OMAP3430_REV_ES1_0) |