mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
3b972bf06c
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>
52 lines
1.6 KiB
C
52 lines
1.6 KiB
C
/*
|
|
* MMC definitions for OMAP2
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
struct mmc_card;
|
|
|
|
struct omap2_hsmmc_info {
|
|
u8 mmc; /* controller 1/2/3 */
|
|
u32 caps; /* 4/8 wires and any additional host
|
|
* capabilities OR'd (ref. linux/mmc/host.h) */
|
|
u32 pm_caps; /* PM capabilities */
|
|
bool transceiver; /* MMC-2 option */
|
|
bool ext_clock; /* use external pin for input clock */
|
|
bool cover_only; /* No card detect - just cover switch */
|
|
bool nonremovable; /* Nonremovable e.g. eMMC */
|
|
bool power_saving; /* Try to sleep or power off when possible */
|
|
bool no_off; /* power_saving and power is not to go off */
|
|
bool no_off_init; /* no power off when not in MMC sleep state */
|
|
bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
|
|
bool deferred; /* mmc needs a deferred probe */
|
|
int gpio_cd; /* or -EINVAL */
|
|
int gpio_wp; /* or -EINVAL */
|
|
char *name; /* or NULL for default */
|
|
struct platform_device *pdev; /* mmc controller instance */
|
|
int ocr_mask; /* temporary HACK */
|
|
/* Remux (pad configuration) when powering on/off */
|
|
void (*remux)(struct device *dev, int slot, int power_on);
|
|
/* init some special card */
|
|
void (*init_card)(struct mmc_card *card);
|
|
};
|
|
|
|
#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
|
|
|
|
void omap_hsmmc_init(struct omap2_hsmmc_info *);
|
|
void omap_hsmmc_late_init(struct omap2_hsmmc_info *);
|
|
|
|
#else
|
|
|
|
static inline void omap_hsmmc_init(struct omap2_hsmmc_info *info)
|
|
{
|
|
}
|
|
|
|
static inline void omap_hsmmc_late_init(struct omap2_hsmmc_info *info)
|
|
{
|
|
}
|
|
|
|
#endif
|