Commit 326119c9 authored by Andreas Fenkart's avatar Andreas Fenkart Committed by Ulf Hansson

mmc: omap_hsmmc: remove unnecessary omap_hsmmc_slot_data indirection

omap_hsmmc supports only one slot per controller, see OMAP_MMC_MAX_SLOTS.
This unnecessary indirection leads to confusion in the omap_hsmmc driver.
For example the card_detect callback is not installed by platform code
but from the driver probe function. So it should be a field of
omap_hsmmc_host. But since it is declared under the platform slot while
the drivers struct omap_hsmmc_host has no slot abstraction, this looks
like a bug, especially when not familiar that this driver only supports
1 slot anyway.
Either we should add a slot abstraction to omap_hsmmc_host or remove
it from the platform data struct. Removed since slot multiplexing is
an un-implemented feature
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Signed-off-by: default avatarAndreas Fenkart <afenkart@gmail.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent df206c31
...@@ -39,8 +39,8 @@ static void omap_hsmmc1_before_set_reg(struct device *dev, int slot, ...@@ -39,8 +39,8 @@ static void omap_hsmmc1_before_set_reg(struct device *dev, int slot,
u32 reg, prog_io; u32 reg, prog_io;
struct omap_hsmmc_platform_data *mmc = dev->platform_data; struct omap_hsmmc_platform_data *mmc = dev->platform_data;
if (mmc->slots[0].remux) if (mmc->remux)
mmc->slots[0].remux(dev, slot, power_on); mmc->remux(dev, slot, power_on);
/* /*
* Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
...@@ -62,7 +62,7 @@ static void omap_hsmmc1_before_set_reg(struct device *dev, int slot, ...@@ -62,7 +62,7 @@ static void omap_hsmmc1_before_set_reg(struct device *dev, int slot,
omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1); omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
} }
if (mmc->slots[0].internal_clock) { if (mmc->internal_clock) {
reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
reg |= OMAP2_MMCSDIO1ADPCLKISEL; reg |= OMAP2_MMCSDIO1ADPCLKISEL;
omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0); omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
...@@ -115,7 +115,7 @@ static void hsmmc2_select_input_clk_src(struct omap_hsmmc_platform_data *mmc) ...@@ -115,7 +115,7 @@ static void hsmmc2_select_input_clk_src(struct omap_hsmmc_platform_data *mmc)
u32 reg; u32 reg;
reg = omap_ctrl_readl(control_devconf1_offset); reg = omap_ctrl_readl(control_devconf1_offset);
if (mmc->slots[0].internal_clock) if (mmc->internal_clock)
reg |= OMAP2_MMCSDIO2ADPCLKISEL; reg |= OMAP2_MMCSDIO2ADPCLKISEL;
else else
reg &= ~OMAP2_MMCSDIO2ADPCLKISEL; reg &= ~OMAP2_MMCSDIO2ADPCLKISEL;
...@@ -127,8 +127,8 @@ static void hsmmc2_before_set_reg(struct device *dev, int slot, ...@@ -127,8 +127,8 @@ static void hsmmc2_before_set_reg(struct device *dev, int slot,
{ {
struct omap_hsmmc_platform_data *mmc = dev->platform_data; struct omap_hsmmc_platform_data *mmc = dev->platform_data;
if (mmc->slots[0].remux) if (mmc->remux)
mmc->slots[0].remux(dev, slot, power_on); mmc->remux(dev, slot, power_on);
if (power_on) if (power_on)
hsmmc2_select_input_clk_src(mmc); hsmmc2_select_input_clk_src(mmc);
...@@ -154,14 +154,14 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on, ...@@ -154,14 +154,14 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data
*mmc_controller, int controller_nr) *mmc_controller, int controller_nr)
{ {
if (gpio_is_valid(mmc_controller->slots[0].switch_pin) && if (gpio_is_valid(mmc_controller->switch_pin) &&
(mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES)) (mmc_controller->switch_pin < OMAP_MAX_GPIO_LINES))
omap_mux_init_gpio(mmc_controller->slots[0].switch_pin, omap_mux_init_gpio(mmc_controller->switch_pin,
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
if (gpio_is_valid(mmc_controller->slots[0].gpio_wp) && if (gpio_is_valid(mmc_controller->gpio_wp) &&
(mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES)) (mmc_controller->gpio_wp < OMAP_MAX_GPIO_LINES))
omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp, omap_mux_init_gpio(mmc_controller->gpio_wp,
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
if (cpu_is_omap34xx()) { if (cpu_is_omap34xx()) {
if (controller_nr == 0) { if (controller_nr == 0) {
omap_mux_init_signal("sdmmc1_clk", omap_mux_init_signal("sdmmc1_clk",
...@@ -170,7 +170,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data ...@@ -170,7 +170,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
omap_mux_init_signal("sdmmc1_dat0", omap_mux_init_signal("sdmmc1_dat0",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
if (mmc_controller->slots[0].caps & if (mmc_controller->caps &
(MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) { (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
omap_mux_init_signal("sdmmc1_dat1", omap_mux_init_signal("sdmmc1_dat1",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
...@@ -179,7 +179,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data ...@@ -179,7 +179,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data
omap_mux_init_signal("sdmmc1_dat3", omap_mux_init_signal("sdmmc1_dat3",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
} }
if (mmc_controller->slots[0].caps & if (mmc_controller->caps &
MMC_CAP_8_BIT_DATA) { MMC_CAP_8_BIT_DATA) {
omap_mux_init_signal("sdmmc1_dat4", omap_mux_init_signal("sdmmc1_dat4",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
...@@ -204,7 +204,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data ...@@ -204,7 +204,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data
* For 8 wire configurations, Lines DAT4, 5, 6 and 7 * For 8 wire configurations, Lines DAT4, 5, 6 and 7
* need to be muxed in the board-*.c files * need to be muxed in the board-*.c files
*/ */
if (mmc_controller->slots[0].caps & if (mmc_controller->caps &
(MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) { (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
omap_mux_init_signal("sdmmc2_dat1", omap_mux_init_signal("sdmmc2_dat1",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
...@@ -213,7 +213,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data ...@@ -213,7 +213,7 @@ static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data
omap_mux_init_signal("sdmmc2_dat3", omap_mux_init_signal("sdmmc2_dat3",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
} }
if (mmc_controller->slots[0].caps & if (mmc_controller->caps &
MMC_CAP_8_BIT_DATA) { MMC_CAP_8_BIT_DATA) {
omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4", omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4",
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
...@@ -249,23 +249,23 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -249,23 +249,23 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
else else
snprintf(hc_name, (HSMMC_NAME_LEN + 1), "mmc%islot%i", snprintf(hc_name, (HSMMC_NAME_LEN + 1), "mmc%islot%i",
c->mmc, 1); c->mmc, 1);
mmc->slots[0].name = hc_name; mmc->name = hc_name;
mmc->nr_slots = 1; mmc->nr_slots = 1;
mmc->slots[0].caps = c->caps; mmc->caps = c->caps;
mmc->slots[0].internal_clock = !c->ext_clock; mmc->internal_clock = !c->ext_clock;
mmc->reg_offset = 0; mmc->reg_offset = 0;
mmc->slots[0].switch_pin = c->gpio_cd; mmc->switch_pin = c->gpio_cd;
mmc->slots[0].gpio_wp = c->gpio_wp; mmc->gpio_wp = c->gpio_wp;
mmc->slots[0].remux = c->remux; mmc->remux = c->remux;
mmc->slots[0].init_card = c->init_card; mmc->init_card = c->init_card;
if (c->cover_only) if (c->cover_only)
mmc->slots[0].cover = 1; mmc->cover = 1;
if (c->nonremovable) if (c->nonremovable)
mmc->slots[0].nonremovable = 1; mmc->nonremovable = 1;
/* /*
* NOTE: MMC slots should have a Vcc regulator set up. * NOTE: MMC slots should have a Vcc regulator set up.
...@@ -275,42 +275,42 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -275,42 +275,42 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
* temporary HACK: ocr_mask instead of fixed supply * temporary HACK: ocr_mask instead of fixed supply
*/ */
if (soc_is_am35xx()) if (soc_is_am35xx())
mmc->slots[0].ocr_mask = MMC_VDD_165_195 | mmc->ocr_mask = MMC_VDD_165_195 |
MMC_VDD_26_27 | MMC_VDD_26_27 |
MMC_VDD_27_28 | MMC_VDD_27_28 |
MMC_VDD_29_30 | MMC_VDD_29_30 |
MMC_VDD_30_31 | MMC_VDD_30_31 |
MMC_VDD_31_32; MMC_VDD_31_32;
else else
mmc->slots[0].ocr_mask = c->ocr_mask; mmc->ocr_mask = c->ocr_mask;
if (!soc_is_am35xx()) if (!soc_is_am35xx())
mmc->slots[0].features |= HSMMC_HAS_PBIAS; mmc->features |= HSMMC_HAS_PBIAS;
switch (c->mmc) { switch (c->mmc) {
case 1: case 1:
if (mmc->slots[0].features & HSMMC_HAS_PBIAS) { if (mmc->features & HSMMC_HAS_PBIAS) {
/* on-chip level shifting via PBIAS0/PBIAS1 */ /* on-chip level shifting via PBIAS0/PBIAS1 */
mmc->slots[0].before_set_reg = mmc->before_set_reg =
omap_hsmmc1_before_set_reg; omap_hsmmc1_before_set_reg;
mmc->slots[0].after_set_reg = mmc->after_set_reg =
omap_hsmmc1_after_set_reg; omap_hsmmc1_after_set_reg;
} }
if (soc_is_am35xx()) if (soc_is_am35xx())
mmc->slots[0].set_power = nop_mmc_set_power; mmc->set_power = nop_mmc_set_power;
/* OMAP3630 HSMMC1 supports only 4-bit */ /* OMAP3630 HSMMC1 supports only 4-bit */
if (cpu_is_omap3630() && if (cpu_is_omap3630() &&
(c->caps & MMC_CAP_8_BIT_DATA)) { (c->caps & MMC_CAP_8_BIT_DATA)) {
c->caps &= ~MMC_CAP_8_BIT_DATA; c->caps &= ~MMC_CAP_8_BIT_DATA;
c->caps |= MMC_CAP_4_BIT_DATA; c->caps |= MMC_CAP_4_BIT_DATA;
mmc->slots[0].caps = c->caps; mmc->caps = c->caps;
} }
break; break;
case 2: case 2:
if (soc_is_am35xx()) if (soc_is_am35xx())
mmc->slots[0].set_power = am35x_hsmmc2_set_power; mmc->set_power = am35x_hsmmc2_set_power;
if (c->ext_clock) if (c->ext_clock)
c->transceiver = 1; c->transceiver = 1;
...@@ -318,17 +318,17 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, ...@@ -318,17 +318,17 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
c->caps &= ~MMC_CAP_8_BIT_DATA; c->caps &= ~MMC_CAP_8_BIT_DATA;
c->caps |= MMC_CAP_4_BIT_DATA; c->caps |= MMC_CAP_4_BIT_DATA;
} }
if (mmc->slots[0].features & HSMMC_HAS_PBIAS) { if (mmc->features & HSMMC_HAS_PBIAS) {
/* off-chip level shifting, or none */ /* off-chip level shifting, or none */
mmc->slots[0].before_set_reg = hsmmc2_before_set_reg; mmc->before_set_reg = hsmmc2_before_set_reg;
mmc->slots[0].after_set_reg = NULL; mmc->after_set_reg = NULL;
} }
break; break;
case 3: case 3:
case 4: case 4:
case 5: case 5:
mmc->slots[0].before_set_reg = NULL; mmc->before_set_reg = NULL;
mmc->slots[0].after_set_reg = NULL; mmc->after_set_reg = NULL;
break; break;
default: default:
pr_err("MMC%d configuration not supported!\n", c->mmc); pr_err("MMC%d configuration not supported!\n", c->mmc);
...@@ -363,8 +363,8 @@ void omap_hsmmc_late_init(struct omap2_hsmmc_info *c) ...@@ -363,8 +363,8 @@ void omap_hsmmc_late_init(struct omap2_hsmmc_info *c)
if (!mmc_pdata) if (!mmc_pdata)
continue; continue;
mmc_pdata->slots[0].switch_pin = c->gpio_cd; mmc_pdata->switch_pin = c->gpio_cd;
mmc_pdata->slots[0].gpio_wp = c->gpio_wp; mmc_pdata->gpio_wp = c->gpio_wp;
res = omap_device_register(pdev); res = omap_device_register(pdev);
if (res) if (res)
...@@ -464,7 +464,7 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo, ...@@ -464,7 +464,7 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo,
platform_device_put(pdev); platform_device_put(pdev);
free_name: free_name:
kfree(mmc_data->slots[0].name); kfree(mmc_data->name);
free_mmc: free_mmc:
kfree(mmc_data); kfree(mmc_data);
......
...@@ -155,7 +155,7 @@ ...@@ -155,7 +155,7 @@
* omap.c controller driver. Luckily this is not currently done on any known * omap.c controller driver. Luckily this is not currently done on any known
* omap_hsmmc.c device. * omap_hsmmc.c device.
*/ */
#define mmc_slot(host) (host->pdata->slots[host->slot_id]) #define mmc_pdata(host) host->pdata
/* /*
* MMC Host controller read/write API's * MMC Host controller read/write API's
...@@ -236,7 +236,7 @@ static int omap_hsmmc_card_detect(struct device *dev, int slot) ...@@ -236,7 +236,7 @@ static int omap_hsmmc_card_detect(struct device *dev, int slot)
struct omap_hsmmc_platform_data *mmc = host->pdata; struct omap_hsmmc_platform_data *mmc = host->pdata;
/* NOTE: assumes card detect signal is active-low */ /* NOTE: assumes card detect signal is active-low */
return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); return !gpio_get_value_cansleep(mmc->switch_pin);
} }
static int omap_hsmmc_get_wp(struct device *dev, int slot) static int omap_hsmmc_get_wp(struct device *dev, int slot)
...@@ -245,7 +245,7 @@ static int omap_hsmmc_get_wp(struct device *dev, int slot) ...@@ -245,7 +245,7 @@ static int omap_hsmmc_get_wp(struct device *dev, int slot)
struct omap_hsmmc_platform_data *mmc = host->pdata; struct omap_hsmmc_platform_data *mmc = host->pdata;
/* NOTE: assumes write protect signal is active-high */ /* NOTE: assumes write protect signal is active-high */
return gpio_get_value_cansleep(mmc->slots[0].gpio_wp); return gpio_get_value_cansleep(mmc->gpio_wp);
} }
static int omap_hsmmc_get_cover_state(struct device *dev, int slot) static int omap_hsmmc_get_cover_state(struct device *dev, int slot)
...@@ -254,7 +254,7 @@ static int omap_hsmmc_get_cover_state(struct device *dev, int slot) ...@@ -254,7 +254,7 @@ static int omap_hsmmc_get_cover_state(struct device *dev, int slot)
struct omap_hsmmc_platform_data *mmc = host->pdata; struct omap_hsmmc_platform_data *mmc = host->pdata;
/* NOTE: assumes card detect signal is active-low */ /* NOTE: assumes card detect signal is active-low */
return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); return !gpio_get_value_cansleep(mmc->switch_pin);
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -264,7 +264,7 @@ static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot) ...@@ -264,7 +264,7 @@ static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot)
struct omap_hsmmc_host *host = dev_get_drvdata(dev); struct omap_hsmmc_host *host = dev_get_drvdata(dev);
struct omap_hsmmc_platform_data *mmc = host->pdata; struct omap_hsmmc_platform_data *mmc = host->pdata;
disable_irq(mmc->slots[0].card_detect_irq); disable_irq(mmc->card_detect_irq);
return 0; return 0;
} }
...@@ -273,7 +273,7 @@ static int omap_hsmmc_resume_cdirq(struct device *dev, int slot) ...@@ -273,7 +273,7 @@ static int omap_hsmmc_resume_cdirq(struct device *dev, int slot)
struct omap_hsmmc_host *host = dev_get_drvdata(dev); struct omap_hsmmc_host *host = dev_get_drvdata(dev);
struct omap_hsmmc_platform_data *mmc = host->pdata; struct omap_hsmmc_platform_data *mmc = host->pdata;
enable_irq(mmc->slots[0].card_detect_irq); enable_irq(mmc->card_detect_irq);
return 0; return 0;
} }
...@@ -300,8 +300,8 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on, ...@@ -300,8 +300,8 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on,
if (!host->vcc) if (!host->vcc)
return 0; return 0;
if (mmc_slot(host).before_set_reg) if (mmc_pdata(host)->before_set_reg)
mmc_slot(host).before_set_reg(dev, slot, power_on, vdd); mmc_pdata(host)->before_set_reg(dev, slot, power_on, vdd);
if (host->pbias) { if (host->pbias) {
if (host->pbias_enabled == 1) { if (host->pbias_enabled == 1) {
...@@ -363,8 +363,8 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on, ...@@ -363,8 +363,8 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on,
} }
} }
if (mmc_slot(host).after_set_reg) if (mmc_pdata(host)->after_set_reg)
mmc_slot(host).after_set_reg(dev, slot, power_on, vdd); mmc_pdata(host)->after_set_reg(dev, slot, power_on, vdd);
error_set_power: error_set_power:
return ret; return ret;
...@@ -383,18 +383,18 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) ...@@ -383,18 +383,18 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
} else { } else {
host->vcc = reg; host->vcc = reg;
ocr_value = mmc_regulator_get_ocrmask(reg); ocr_value = mmc_regulator_get_ocrmask(reg);
if (!mmc_slot(host).ocr_mask) { if (!mmc_pdata(host)->ocr_mask) {
mmc_slot(host).ocr_mask = ocr_value; mmc_pdata(host)->ocr_mask = ocr_value;
} else { } else {
if (!(mmc_slot(host).ocr_mask & ocr_value)) { if (!(mmc_pdata(host)->ocr_mask & ocr_value)) {
dev_err(host->dev, "ocrmask %x is not supported\n", dev_err(host->dev, "ocrmask %x is not supported\n",
mmc_slot(host).ocr_mask); mmc_pdata(host)->ocr_mask);
mmc_slot(host).ocr_mask = 0; mmc_pdata(host)->ocr_mask = 0;
return -EINVAL; return -EINVAL;
} }
} }
} }
mmc_slot(host).set_power = omap_hsmmc_set_power; mmc_pdata(host)->set_power = omap_hsmmc_set_power;
/* Allow an aux regulator */ /* Allow an aux regulator */
reg = devm_regulator_get_optional(host->dev, "vmmc_aux"); reg = devm_regulator_get_optional(host->dev, "vmmc_aux");
...@@ -404,7 +404,7 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) ...@@ -404,7 +404,7 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
host->pbias = IS_ERR(reg) ? NULL : reg; host->pbias = IS_ERR(reg) ? NULL : reg;
/* For eMMC do not power off when not in sleep state */ /* For eMMC do not power off when not in sleep state */
if (mmc_slot(host).no_regulator_off_init) if (mmc_pdata(host)->no_regulator_off_init)
return 0; return 0;
/* /*
* To disable boot_on regulator, enable regulator * To disable boot_on regulator, enable regulator
...@@ -412,10 +412,10 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) ...@@ -412,10 +412,10 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
*/ */
if ((host->vcc && regulator_is_enabled(host->vcc) > 0) || if ((host->vcc && regulator_is_enabled(host->vcc) > 0) ||
(host->vcc_aux && regulator_is_enabled(host->vcc_aux))) { (host->vcc_aux && regulator_is_enabled(host->vcc_aux))) {
int vdd = ffs(mmc_slot(host).ocr_mask) - 1; int vdd = ffs(mmc_pdata(host)->ocr_mask) - 1;
mmc_slot(host).set_power(host->dev, host->slot_id, 1, vdd); mmc_pdata(host)->set_power(host->dev, host->slot_id, 1, vdd);
mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0); mmc_pdata(host)->set_power(host->dev, host->slot_id, 0, 0);
} }
return 0; return 0;
...@@ -423,7 +423,7 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) ...@@ -423,7 +423,7 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host) static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host)
{ {
mmc_slot(host).set_power = NULL; mmc_pdata(host)->set_power = NULL;
} }
static inline int omap_hsmmc_have_reg(void) static inline int omap_hsmmc_have_reg(void)
...@@ -453,51 +453,53 @@ static int omap_hsmmc_gpio_init(struct omap_hsmmc_platform_data *pdata) ...@@ -453,51 +453,53 @@ static int omap_hsmmc_gpio_init(struct omap_hsmmc_platform_data *pdata)
{ {
int ret; int ret;
if (gpio_is_valid(pdata->slots[0].switch_pin)) { if (gpio_is_valid(pdata->switch_pin)) {
if (pdata->slots[0].cover) if (pdata->cover)
pdata->slots[0].get_cover_state = pdata->get_cover_state =
omap_hsmmc_get_cover_state; omap_hsmmc_get_cover_state;
else else
pdata->slots[0].card_detect = omap_hsmmc_card_detect; pdata->card_detect = omap_hsmmc_card_detect;
pdata->slots[0].card_detect_irq = pdata->card_detect_irq =
gpio_to_irq(pdata->slots[0].switch_pin); gpio_to_irq(pdata->switch_pin);
ret = gpio_request(pdata->slots[0].switch_pin, "mmc_cd"); ret = gpio_request(pdata->switch_pin, "mmc_cd");
if (ret) if (ret)
return ret; return ret;
ret = gpio_direction_input(pdata->slots[0].switch_pin); ret = gpio_direction_input(pdata->switch_pin);
if (ret) if (ret)
goto err_free_sp; goto err_free_sp;
} else } else {
pdata->slots[0].switch_pin = -EINVAL; pdata->switch_pin = -EINVAL;
}
if (gpio_is_valid(pdata->slots[0].gpio_wp)) { if (gpio_is_valid(pdata->gpio_wp)) {
pdata->slots[0].get_ro = omap_hsmmc_get_wp; pdata->get_ro = omap_hsmmc_get_wp;
ret = gpio_request(pdata->slots[0].gpio_wp, "mmc_wp"); ret = gpio_request(pdata->gpio_wp, "mmc_wp");
if (ret) if (ret)
goto err_free_cd; goto err_free_cd;
ret = gpio_direction_input(pdata->slots[0].gpio_wp); ret = gpio_direction_input(pdata->gpio_wp);
if (ret) if (ret)
goto err_free_wp; goto err_free_wp;
} else } else {
pdata->slots[0].gpio_wp = -EINVAL; pdata->gpio_wp = -EINVAL;
}
return 0; return 0;
err_free_wp: err_free_wp:
gpio_free(pdata->slots[0].gpio_wp); gpio_free(pdata->gpio_wp);
err_free_cd: err_free_cd:
if (gpio_is_valid(pdata->slots[0].switch_pin)) if (gpio_is_valid(pdata->switch_pin))
err_free_sp: err_free_sp:
gpio_free(pdata->slots[0].switch_pin); gpio_free(pdata->switch_pin);
return ret; return ret;
} }
static void omap_hsmmc_gpio_free(struct omap_hsmmc_platform_data *pdata) static void omap_hsmmc_gpio_free(struct omap_hsmmc_platform_data *pdata)
{ {
if (gpio_is_valid(pdata->slots[0].gpio_wp)) if (gpio_is_valid(pdata->gpio_wp))
gpio_free(pdata->slots[0].gpio_wp); gpio_free(pdata->gpio_wp);
if (gpio_is_valid(pdata->slots[0].switch_pin)) if (gpio_is_valid(pdata->switch_pin))
gpio_free(pdata->slots[0].switch_pin); gpio_free(pdata->switch_pin);
} }
/* /*
...@@ -607,7 +609,7 @@ static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host) ...@@ -607,7 +609,7 @@ static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host)
* in capabilities register * in capabilities register
* - MMC/SD clock coming out of controller > 25MHz * - MMC/SD clock coming out of controller > 25MHz
*/ */
if ((mmc_slot(host).features & HSMMC_HAS_HSPE_SUPPORT) && if ((mmc_pdata(host)->features & HSMMC_HAS_HSPE_SUPPORT) &&
(ios->timing != MMC_TIMING_MMC_DDR52) && (ios->timing != MMC_TIMING_MMC_DDR52) &&
((OMAP_HSMMC_READ(host->base, CAPA) & HSS) == HSS)) { ((OMAP_HSMMC_READ(host->base, CAPA) & HSS) == HSS)) {
regval = OMAP_HSMMC_READ(host->base, HCTL); regval = OMAP_HSMMC_READ(host->base, HCTL);
...@@ -791,8 +793,8 @@ int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host) ...@@ -791,8 +793,8 @@ int omap_hsmmc_cover_is_closed(struct omap_hsmmc_host *host)
{ {
int r = 1; int r = 1;
if (mmc_slot(host).get_cover_state) if (mmc_pdata(host)->get_cover_state)
r = mmc_slot(host).get_cover_state(host->dev, host->slot_id); r = mmc_pdata(host)->get_cover_state(host->dev, host->slot_id);
return r; return r;
} }
...@@ -816,7 +818,7 @@ omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr, ...@@ -816,7 +818,7 @@ omap_hsmmc_show_slot_name(struct device *dev, struct device_attribute *attr,
struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev); struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
struct omap_hsmmc_host *host = mmc_priv(mmc); struct omap_hsmmc_host *host = mmc_priv(mmc);
return sprintf(buf, "%s\n", mmc_slot(host).name); return sprintf(buf, "%s\n", mmc_pdata(host)->name);
} }
static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL); static DEVICE_ATTR(slot_name, S_IRUGO, omap_hsmmc_show_slot_name, NULL);
...@@ -1061,7 +1063,7 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, ...@@ -1061,7 +1063,7 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host,
* OMAP4 ES2 and greater has an updated reset logic. * OMAP4 ES2 and greater has an updated reset logic.
* Monitor a 0->1 transition first * Monitor a 0->1 transition first
*/ */
if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) { if (mmc_pdata(host)->features & HSMMC_HAS_UPDATED_RESET) {
while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit))
&& (i++ < limit)) && (i++ < limit))
udelay(1); udelay(1);
...@@ -1210,12 +1212,12 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd) ...@@ -1210,12 +1212,12 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
clk_disable_unprepare(host->dbclk); clk_disable_unprepare(host->dbclk);
/* Turn the power off */ /* Turn the power off */
ret = mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0); ret = mmc_pdata(host)->set_power(host->dev, host->slot_id, 0, 0);
/* Turn the power ON with given VDD 1.8 or 3.0v */ /* Turn the power ON with given VDD 1.8 or 3.0v */
if (!ret) if (!ret)
ret = mmc_slot(host).set_power(host->dev, host->slot_id, 1, ret = mmc_pdata(host)->set_power(host->dev, host->slot_id, 1,
vdd); vdd);
pm_runtime_get_sync(host->dev); pm_runtime_get_sync(host->dev);
if (host->dbclk) if (host->dbclk)
clk_prepare_enable(host->dbclk); clk_prepare_enable(host->dbclk);
...@@ -1259,11 +1261,11 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd) ...@@ -1259,11 +1261,11 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd)
/* Protect the card while the cover is open */ /* Protect the card while the cover is open */
static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host) static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
{ {
if (!mmc_slot(host).get_cover_state) if (!mmc_pdata(host)->get_cover_state)
return; return;
host->reqs_blocked = 0; host->reqs_blocked = 0;
if (mmc_slot(host).get_cover_state(host->dev, host->slot_id)) { if (mmc_pdata(host)->get_cover_state(host->dev, host->slot_id)) {
if (host->protect_card) { if (host->protect_card) {
dev_info(host->dev, "%s: cover is closed, " dev_info(host->dev, "%s: cover is closed, "
"card is now accessible\n", "card is now accessible\n",
...@@ -1286,13 +1288,13 @@ static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host) ...@@ -1286,13 +1288,13 @@ static void omap_hsmmc_protect_card(struct omap_hsmmc_host *host)
static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id) static irqreturn_t omap_hsmmc_detect(int irq, void *dev_id)
{ {
struct omap_hsmmc_host *host = dev_id; struct omap_hsmmc_host *host = dev_id;
struct omap_hsmmc_slot_data *slot = &mmc_slot(host); struct omap_hsmmc_platform_data *pdata = host->pdata;
int carddetect; int carddetect;
sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch"); sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
if (slot->card_detect) if (pdata->card_detect)
carddetect = slot->card_detect(host->dev, host->slot_id); carddetect = pdata->card_detect(host->dev, host->slot_id);
else { else {
omap_hsmmc_protect_card(host); omap_hsmmc_protect_card(host);
carddetect = -ENOSYS; carddetect = -ENOSYS;
...@@ -1618,12 +1620,12 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) ...@@ -1618,12 +1620,12 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
if (ios->power_mode != host->power_mode) { if (ios->power_mode != host->power_mode) {
switch (ios->power_mode) { switch (ios->power_mode) {
case MMC_POWER_OFF: case MMC_POWER_OFF:
mmc_slot(host).set_power(host->dev, host->slot_id, mmc_pdata(host)->set_power(host->dev, host->slot_id,
0, 0); 0, 0);
break; break;
case MMC_POWER_UP: case MMC_POWER_UP:
mmc_slot(host).set_power(host->dev, host->slot_id, mmc_pdata(host)->set_power(host->dev, host->slot_id,
1, ios->vdd); 1, ios->vdd);
break; break;
case MMC_POWER_ON: case MMC_POWER_ON:
do_send_init_stream = 1; do_send_init_stream = 1;
...@@ -1668,26 +1670,26 @@ static int omap_hsmmc_get_cd(struct mmc_host *mmc) ...@@ -1668,26 +1670,26 @@ static int omap_hsmmc_get_cd(struct mmc_host *mmc)
{ {
struct omap_hsmmc_host *host = mmc_priv(mmc); struct omap_hsmmc_host *host = mmc_priv(mmc);
if (!mmc_slot(host).card_detect) if (!mmc_pdata(host)->card_detect)
return -ENOSYS; return -ENOSYS;
return mmc_slot(host).card_detect(host->dev, host->slot_id); return mmc_pdata(host)->card_detect(host->dev, host->slot_id);
} }
static int omap_hsmmc_get_ro(struct mmc_host *mmc) static int omap_hsmmc_get_ro(struct mmc_host *mmc)
{ {
struct omap_hsmmc_host *host = mmc_priv(mmc); struct omap_hsmmc_host *host = mmc_priv(mmc);
if (!mmc_slot(host).get_ro) if (!mmc_pdata(host)->get_ro)
return -ENOSYS; return -ENOSYS;
return mmc_slot(host).get_ro(host->dev, 0); return mmc_pdata(host)->get_ro(host->dev, 0);
} }
static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card) static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card)
{ {
struct omap_hsmmc_host *host = mmc_priv(mmc); struct omap_hsmmc_host *host = mmc_priv(mmc);
if (mmc_slot(host).init_card) if (mmc_pdata(host)->init_card)
mmc_slot(host).init_card(card); mmc_pdata(host)->init_card(card);
} }
static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable) static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
...@@ -1978,33 +1980,33 @@ static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev) ...@@ -1978,33 +1980,33 @@ static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev)
/* This driver only supports 1 slot */ /* This driver only supports 1 slot */
pdata->nr_slots = 1; pdata->nr_slots = 1;
pdata->slots[0].switch_pin = cd_gpio; pdata->switch_pin = cd_gpio;
pdata->slots[0].gpio_wp = wp_gpio; pdata->gpio_wp = wp_gpio;
if (of_find_property(np, "ti,non-removable", NULL)) { if (of_find_property(np, "ti,non-removable", NULL)) {
pdata->slots[0].nonremovable = true; pdata->nonremovable = true;
pdata->slots[0].no_regulator_off_init = true; pdata->no_regulator_off_init = true;
} }
of_property_read_u32(np, "bus-width", &bus_width); of_property_read_u32(np, "bus-width", &bus_width);
if (bus_width == 4) if (bus_width == 4)
pdata->slots[0].caps |= MMC_CAP_4_BIT_DATA; pdata->caps |= MMC_CAP_4_BIT_DATA;
else if (bus_width == 8) else if (bus_width == 8)
pdata->slots[0].caps |= MMC_CAP_8_BIT_DATA; pdata->caps |= MMC_CAP_8_BIT_DATA;
if (of_find_property(np, "ti,needs-special-reset", NULL)) if (of_find_property(np, "ti,needs-special-reset", NULL))
pdata->slots[0].features |= HSMMC_HAS_UPDATED_RESET; pdata->features |= HSMMC_HAS_UPDATED_RESET;
if (!of_property_read_u32(np, "max-frequency", &max_freq)) if (!of_property_read_u32(np, "max-frequency", &max_freq))
pdata->max_freq = max_freq; pdata->max_freq = max_freq;
if (of_find_property(np, "ti,needs-special-hs-handling", NULL)) if (of_find_property(np, "ti,needs-special-hs-handling", NULL))
pdata->slots[0].features |= HSMMC_HAS_HSPE_SUPPORT; pdata->features |= HSMMC_HAS_HSPE_SUPPORT;
if (of_find_property(np, "keep-power-in-suspend", NULL)) if (of_find_property(np, "keep-power-in-suspend", NULL))
pdata->slots[0].pm_caps |= MMC_PM_KEEP_POWER; pdata->pm_caps |= MMC_PM_KEEP_POWER;
if (of_find_property(np, "enable-sdio-wakeup", NULL)) if (of_find_property(np, "enable-sdio-wakeup", NULL))
pdata->slots[0].pm_caps |= MMC_PM_WAKE_SDIO_IRQ; pdata->pm_caps |= MMC_PM_WAKE_SDIO_IRQ;
return pdata; return pdata;
} }
...@@ -2144,14 +2146,14 @@ static int omap_hsmmc_probe(struct platform_device *pdev) ...@@ -2144,14 +2146,14 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE; MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE;
mmc->caps |= mmc_slot(host).caps; mmc->caps |= mmc_pdata(host)->caps;
if (mmc->caps & MMC_CAP_8_BIT_DATA) if (mmc->caps & MMC_CAP_8_BIT_DATA)
mmc->caps |= MMC_CAP_4_BIT_DATA; mmc->caps |= MMC_CAP_4_BIT_DATA;
if (mmc_slot(host).nonremovable) if (mmc_pdata(host)->nonremovable)
mmc->caps |= MMC_CAP_NONREMOVABLE; mmc->caps |= MMC_CAP_NONREMOVABLE;
mmc->pm_caps = mmc_slot(host).pm_caps; mmc->pm_caps = mmc_pdata(host)->pm_caps;
omap_hsmmc_conf_bus_power(host); omap_hsmmc_conf_bus_power(host);
...@@ -2204,19 +2206,19 @@ static int omap_hsmmc_probe(struct platform_device *pdev) ...@@ -2204,19 +2206,19 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
goto err_irq; goto err_irq;
} }
if (omap_hsmmc_have_reg() && !mmc_slot(host).set_power) { if (omap_hsmmc_have_reg() && !mmc_pdata(host)->set_power) {
ret = omap_hsmmc_reg_get(host); ret = omap_hsmmc_reg_get(host);
if (ret) if (ret)
goto err_irq; goto err_irq;
host->use_reg = 1; host->use_reg = 1;
} }
mmc->ocr_avail = mmc_slot(host).ocr_mask; mmc->ocr_avail = mmc_pdata(host)->ocr_mask;
/* Request IRQ for card detect */ /* Request IRQ for card detect */
if ((mmc_slot(host).card_detect_irq)) { if ((mmc_pdata(host)->card_detect_irq)) {
ret = devm_request_threaded_irq(&pdev->dev, ret = devm_request_threaded_irq(&pdev->dev,
mmc_slot(host).card_detect_irq, mmc_pdata(host)->card_detect_irq,
NULL, omap_hsmmc_detect, NULL, omap_hsmmc_detect,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
mmc_hostname(mmc), host); mmc_hostname(mmc), host);
...@@ -2247,12 +2249,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev) ...@@ -2247,12 +2249,13 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
mmc_add_host(mmc); mmc_add_host(mmc);
if (mmc_slot(host).name != NULL) { if (mmc_pdata(host)->name != NULL) {
ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name); ret = device_create_file(&mmc->class_dev, &dev_attr_slot_name);
if (ret < 0) if (ret < 0)
goto err_slot_name; goto err_slot_name;
} }
if (mmc_slot(host).card_detect_irq && mmc_slot(host).get_cover_state) { if (mmc_pdata(host)->card_detect_irq &&
mmc_pdata(host)->get_cover_state) {
ret = device_create_file(&mmc->class_dev, ret = device_create_file(&mmc->class_dev,
&dev_attr_cover_switch); &dev_attr_cover_switch);
if (ret < 0) if (ret < 0)
......
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#define OMAP_HSMMC_MAX_SLOTS 1
/* /*
* struct omap_hsmmc_dev_attr.flags possibilities * struct omap_hsmmc_dev_attr.flags possibilities
* *
...@@ -57,62 +55,60 @@ struct omap_hsmmc_platform_data { ...@@ -57,62 +55,60 @@ struct omap_hsmmc_platform_data {
/* Register offset deviation */ /* Register offset deviation */
u16 reg_offset; u16 reg_offset;
struct omap_hsmmc_slot_data { /*
/* * 4/8 wires and any additional host capabilities
* 4/8 wires and any additional host capabilities * need to OR'd all capabilities (ref. linux/mmc/host.h)
* need to OR'd all capabilities (ref. linux/mmc/host.h) */
*/ u32 caps; /* Used for the MMC driver on 2430 and later */
u32 caps; /* Used for the MMC driver on 2430 and later */ u32 pm_caps; /* PM capabilities of the mmc */
u32 pm_caps; /* PM capabilities of the mmc */
/* switch pin can be for card detect (default) or card cover */ /* switch pin can be for card detect (default) or card cover */
unsigned cover:1; unsigned cover:1;
/* use the internal clock */ /* use the internal clock */
unsigned internal_clock:1; unsigned internal_clock:1;
/* nonremovable e.g. eMMC */ /* nonremovable e.g. eMMC */
unsigned nonremovable:1; unsigned nonremovable:1;
/* eMMC does not handle power off when not in sleep state */ /* eMMC does not handle power off when not in sleep state */
unsigned no_regulator_off_init:1; unsigned no_regulator_off_init:1;
/* we can put the features above into this variable */ /* we can put the features above into this variable */
#define HSMMC_HAS_PBIAS (1 << 0) #define HSMMC_HAS_PBIAS (1 << 0)
#define HSMMC_HAS_UPDATED_RESET (1 << 1) #define HSMMC_HAS_UPDATED_RESET (1 << 1)
#define HSMMC_HAS_HSPE_SUPPORT (1 << 2) #define HSMMC_HAS_HSPE_SUPPORT (1 << 2)
unsigned features; unsigned features;
int switch_pin; /* gpio (card detect) */ int switch_pin; /* gpio (card detect) */
int gpio_wp; /* gpio (write protect) */ int gpio_wp; /* gpio (write protect) */
int (*set_power)(struct device *dev, int slot, int (*set_power)(struct device *dev, int slot,
int power_on, int vdd); int power_on, int vdd);
int (*get_ro)(struct device *dev, int slot); int (*get_ro)(struct device *dev, int slot);
void (*remux)(struct device *dev, int slot, int power_on); void (*remux)(struct device *dev, int slot, int power_on);
/* Call back before enabling / disabling regulators */ /* Call back before enabling / disabling regulators */
void (*before_set_reg)(struct device *dev, int slot, void (*before_set_reg)(struct device *dev, int slot,
int power_on, int vdd); int power_on, int vdd);
/* Call back after enabling / disabling regulators */ /* Call back after enabling / disabling regulators */
void (*after_set_reg)(struct device *dev, int slot, void (*after_set_reg)(struct device *dev, int slot,
int power_on, int vdd); int power_on, int vdd);
/* if we have special card, init it using this callback */ /* if we have special card, init it using this callback */
void (*init_card)(struct mmc_card *card); void (*init_card)(struct mmc_card *card);
/* return MMC cover switch state, can be NULL if not supported. /* return MMC cover switch state, can be NULL if not supported.
* *
* possible return values: * possible return values:
* 0 - closed * 0 - closed
* 1 - open * 1 - open
*/ */
int (*get_cover_state)(struct device *dev, int slot); int (*get_cover_state)(struct device *dev, int slot);
const char *name; const char *name;
u32 ocr_mask; u32 ocr_mask;
/* Card detection IRQs */ /* Card detection IRQs */
int card_detect_irq; int card_detect_irq;
int (*card_detect)(struct device *dev, int slot); int (*card_detect)(struct device *dev, int slot);
} slots[OMAP_HSMMC_MAX_SLOTS];
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment