On 20 March 2015 at 15:53, Andreas Fenkart <afenkart@xxxxxxxxx> wrote: > board-rx51 has no card detect pin in the mmc slot, but can detect that > the (cell-phone) cover has been removed and the card is accessible. > The semantics between cover/card detect differ, the gpio on the slot > informs you after the card has been removed, cover removal does not > necessarily mean that the card has been removed. > This means different code paths are necessary. To complete this we > also want different fields in the platform data for cover and card > detect. This separation is not pushed all the way down into struct > omap2_hsmmc_info which is used to initialize the platform data. > If we did that we had to go over all board files and set the new > gpio_cod pin to -EINVAL. If we forget one board or some out-of-tree > archicture forgets that the default '0' is used which is a valid pin > number. > > Signed-off-by: Andreas Fenkart <afenkart@xxxxxxxxx> Tony, are you fine with this change? I believe I should take it through my mmc tree due to that I have other omap_hsmmc patches already queued. Kind regards Uffe > --- > arch/arm/mach-omap2/hsmmc.c | 33 ++++++++++++++++++++++++-------- > drivers/mmc/host/omap_hsmmc.c | 11 ++++++----- > include/linux/platform_data/hsmmc-omap.h | 6 ++---- > 3 files changed, 33 insertions(+), 17 deletions(-) > > diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c > index dc6e79c..9a8611a 100644 > --- a/arch/arm/mach-omap2/hsmmc.c > +++ b/arch/arm/mach-omap2/hsmmc.c > @@ -150,9 +150,13 @@ static int nop_mmc_set_power(struct device *dev, int power_on, int vdd) > static inline void omap_hsmmc_mux(struct omap_hsmmc_platform_data > *mmc_controller, int controller_nr) > { > - if (gpio_is_valid(mmc_controller->switch_pin) && > - (mmc_controller->switch_pin < OMAP_MAX_GPIO_LINES)) > - omap_mux_init_gpio(mmc_controller->switch_pin, > + if (gpio_is_valid(mmc_controller->gpio_cd) && > + (mmc_controller->gpio_cd < OMAP_MAX_GPIO_LINES)) > + omap_mux_init_gpio(mmc_controller->gpio_cd, > + OMAP_PIN_INPUT_PULLUP); > + if (gpio_is_valid(mmc_controller->gpio_cod) && > + (mmc_controller->gpio_cod < OMAP_MAX_GPIO_LINES)) > + omap_mux_init_gpio(mmc_controller->gpio_cod, > OMAP_PIN_INPUT_PULLUP); > if (gpio_is_valid(mmc_controller->gpio_wp) && > (mmc_controller->gpio_wp < OMAP_MAX_GPIO_LINES)) > @@ -250,15 +254,20 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, > mmc->internal_clock = !c->ext_clock; > mmc->reg_offset = 0; > > - mmc->switch_pin = c->gpio_cd; > + if (c->cover_only) { > + /* detect if mobile phone cover removed */ > + mmc->gpio_cd = -EINVAL; > + mmc->gpio_cod = c->gpio_cd; > + } else { > + /* card detect pin on the mmc socket itself */ > + mmc->gpio_cd = c->gpio_cd; > + mmc->gpio_cod = -EINVAL; > + } > mmc->gpio_wp = c->gpio_wp; > > mmc->remux = c->remux; > mmc->init_card = c->init_card; > > - if (c->cover_only) > - mmc->cover = 1; > - > if (c->nonremovable) > mmc->nonremovable = 1; > > @@ -358,7 +367,15 @@ void omap_hsmmc_late_init(struct omap2_hsmmc_info *c) > if (!mmc_pdata) > continue; > > - mmc_pdata->switch_pin = c->gpio_cd; > + if (c->cover_only) { > + /* detect if mobile phone cover removed */ > + mmc_pdata->gpio_cd = -EINVAL; > + mmc_pdata->gpio_cod = c->gpio_cd; > + } else { > + /* card detect pin on the mmc socket itself */ > + mmc_pdata->gpio_cd = c->gpio_cd; > + mmc_pdata->gpio_cod = -EINVAL; > + } > mmc_pdata->gpio_wp = c->gpio_wp; > > res = omap_device_register(pdev); > diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > index 053cd38..265391f 100644 > --- a/drivers/mmc/host/omap_hsmmc.c > +++ b/drivers/mmc/host/omap_hsmmc.c > @@ -427,15 +427,15 @@ static int omap_hsmmc_gpio_init(struct mmc_host *mmc, > { > int ret; > > - if (pdata->cover && gpio_is_valid(pdata->switch_pin)) { > - ret = mmc_gpio_request_cd(mmc, pdata->switch_pin, 0); > + if (gpio_is_valid(pdata->gpio_cod)) { > + ret = mmc_gpio_request_cd(mmc, pdata->gpio_cod, 0); > if (ret) > return ret; > > host->get_cover_state = omap_hsmmc_get_cover_state; > mmc_gpio_set_cd_isr(mmc, omap_hsmmc_cover_irq); > - } else if (!pdata->cover && gpio_is_valid(pdata->switch_pin)) { > - ret = mmc_gpio_request_cd(mmc, pdata->switch_pin, 0); > + } else if (gpio_is_valid(pdata->gpio_cd)) { > + ret = mmc_gpio_request_cd(mmc, pdata->gpio_cd, 0); > if (ret) > return ret; > > @@ -1932,7 +1932,8 @@ static struct omap_hsmmc_platform_data *of_get_hsmmc_pdata(struct device *dev) > if (of_find_property(np, "ti,dual-volt", NULL)) > pdata->controller_flags |= OMAP_HSMMC_SUPPORTS_DUAL_VOLT; > > - pdata->switch_pin = -EINVAL; > + pdata->gpio_cd = -EINVAL; > + pdata->gpio_cod = -EINVAL; > pdata->gpio_wp = -EINVAL; > > if (of_find_property(np, "ti,non-removable", NULL)) { > diff --git a/include/linux/platform_data/hsmmc-omap.h b/include/linux/platform_data/hsmmc-omap.h > index 67bbcf0..8e981be 100644 > --- a/include/linux/platform_data/hsmmc-omap.h > +++ b/include/linux/platform_data/hsmmc-omap.h > @@ -55,9 +55,6 @@ struct omap_hsmmc_platform_data { > u32 caps; /* Used for the MMC driver on 2430 and later */ > u32 pm_caps; /* PM capabilities of the mmc */ > > - /* switch pin can be for card detect (default) or card cover */ > - unsigned cover:1; > - > /* use the internal clock */ > unsigned internal_clock:1; > > @@ -73,7 +70,8 @@ struct omap_hsmmc_platform_data { > #define HSMMC_HAS_HSPE_SUPPORT (1 << 2) > unsigned features; > > - int switch_pin; /* gpio (card detect) */ > + int gpio_cd; /* gpio (card detect) */ > + int gpio_cod; /* gpio (cover detect) */ > int gpio_wp; /* gpio (write protect) */ > > int (*set_power)(struct device *dev, int power_on, int vdd); > -- > 2.1.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html