On 12 November 2018 at 15:12, Linus Walleij <linus.walleij@xxxxxxxxxx> wrote: > Simplify things by making the i.MX SDHCI driver just use > slot GPIO with descriptors instead of passing around the global > GPIO numbers that we want to get rid of. > > As it turns out, just one single board is using the platform > data to pass in GPIOs numbers for CD and WP, so we augment this > to use a machine descriptor table instead. > > Cc: Shawn Guo <shawnguo@xxxxxxxxxx> > Cc: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > Cc: Pengutronix Kernel Team <kernel@xxxxxxxxxxxxxx> > Cc: Fabio Estevam <fabio.estevam@xxxxxxx> > Cc: NXP Linux Team <linux-imx@xxxxxxx> > Cc: Bartosz Golaszewski <brgl@xxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Applied for next, thanks! Kind regards Uffe > --- > This very much needs to be tested on the PCM043. > > If it works fine, it also opens the way for switching more i.MX > boardfiles to using machine GPIO descriptor tables. > --- > arch/arm/mach-imx/mach-pcm043.c | 17 +++++++++++++---- > drivers/mmc/host/sdhci-esdhc-imx.c | 14 ++++++++------ > include/linux/platform_data/mmc-esdhc-imx.h | 4 ---- > 3 files changed, 21 insertions(+), 14 deletions(-) > > diff --git a/arch/arm/mach-imx/mach-pcm043.c b/arch/arm/mach-imx/mach-pcm043.c > index e595e5368676..46ba3348e8f0 100644 > --- a/arch/arm/mach-imx/mach-pcm043.c > +++ b/arch/arm/mach-imx/mach-pcm043.c > @@ -20,6 +20,7 @@ > #include <linux/mtd/plat-ram.h> > #include <linux/memory.h> > #include <linux/gpio.h> > +#include <linux/gpio/machine.h> > #include <linux/smc911x.h> > #include <linux/interrupt.h> > #include <linux/delay.h> > @@ -214,8 +215,6 @@ static const iomux_v3_cfg_t pcm043_pads[] __initconst = { > #define AC97_GPIO_TXFS IMX_GPIO_NR(2, 31) > #define AC97_GPIO_TXD IMX_GPIO_NR(2, 28) > #define AC97_GPIO_RESET IMX_GPIO_NR(2, 0) > -#define SD1_GPIO_WP IMX_GPIO_NR(2, 23) > -#define SD1_GPIO_CD IMX_GPIO_NR(2, 24) > > static void pcm043_ac97_warm_reset(struct snd_ac97 *ac97) > { > @@ -341,12 +340,21 @@ static int __init pcm043_otg_mode(char *options) > __setup("otg_mode=", pcm043_otg_mode); > > static struct esdhc_platform_data sd1_pdata = { > - .wp_gpio = SD1_GPIO_WP, > - .cd_gpio = SD1_GPIO_CD, > .wp_type = ESDHC_WP_GPIO, > .cd_type = ESDHC_CD_GPIO, > }; > > +static struct gpiod_lookup_table sd1_gpio_table = { > + .dev_id = "sdhci-esdhc-imx35.0", > + .table = { > + /* Card detect: bank 2 offset 24 */ > + GPIO_LOOKUP("imx35-gpio.2", 24, "cd", GPIO_ACTIVE_LOW), > + /* Write protect: bank 2 offset 23 */ > + GPIO_LOOKUP("imx35-gpio.2", 23, "wp", GPIO_ACTIVE_LOW), > + { }, > + }, > +}; > + > /* > * Board specific initialization. > */ > @@ -391,6 +399,7 @@ static void __init pcm043_late_init(void) > { > imx35_add_imx_ssi(0, &pcm043_ssi_pdata); > > + gpiod_add_lookup_table(&sd1_gpio_table); > imx35_add_sdhci_esdhc_imx(0, &sd1_pdata); > } > > diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c > index f44e49014a44..982d2a9866dc 100644 > --- a/drivers/mmc/host/sdhci-esdhc-imx.c > +++ b/drivers/mmc/host/sdhci-esdhc-imx.c > @@ -12,7 +12,6 @@ > #include <linux/delay.h> > #include <linux/err.h> > #include <linux/clk.h> > -#include <linux/gpio.h> > #include <linux/module.h> > #include <linux/slab.h> > #include <linux/mmc/host.h> > @@ -21,7 +20,6 @@ > #include <linux/mmc/slot-gpio.h> > #include <linux/of.h> > #include <linux/of_device.h> > -#include <linux/of_gpio.h> > #include <linux/pinctrl/consumer.h> > #include <linux/platform_data/mmc-esdhc-imx.h> > #include <linux/pm_runtime.h> > @@ -1139,8 +1137,12 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, > if (of_get_property(np, "fsl,wp-controller", NULL)) > boarddata->wp_type = ESDHC_WP_CONTROLLER; > > - boarddata->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0); > - if (gpio_is_valid(boarddata->wp_gpio)) > + /* > + * If we have this property, then activate WP check. > + * Retrieveing and requesting the actual WP GPIO will happen > + * in the call to mmc_of_parse(). > + */ > + if (of_property_read_bool(np, "wp-gpios")) > boarddata->wp_type = ESDHC_WP_GPIO; > > of_property_read_u32(np, "fsl,tuning-step", &boarddata->tuning_step); > @@ -1198,7 +1200,7 @@ static int sdhci_esdhc_imx_probe_nondt(struct platform_device *pdev, > host->mmc->parent->platform_data); > /* write_protect */ > if (boarddata->wp_type == ESDHC_WP_GPIO) { > - err = mmc_gpio_request_ro(host->mmc, boarddata->wp_gpio); > + err = mmc_gpiod_request_ro(host->mmc, "wp", 0, false, 0, NULL); > if (err) { > dev_err(mmc_dev(host->mmc), > "failed to request write-protect gpio!\n"); > @@ -1210,7 +1212,7 @@ static int sdhci_esdhc_imx_probe_nondt(struct platform_device *pdev, > /* card_detect */ > switch (boarddata->cd_type) { > case ESDHC_CD_GPIO: > - err = mmc_gpio_request_cd(host->mmc, boarddata->cd_gpio, 0); > + err = mmc_gpiod_request_cd(host->mmc, "cd", 0, false, 0, NULL); > if (err) { > dev_err(mmc_dev(host->mmc), > "failed to request card-detect gpio!\n"); > diff --git a/include/linux/platform_data/mmc-esdhc-imx.h b/include/linux/platform_data/mmc-esdhc-imx.h > index 640dec8b5b0c..b606ca4197df 100644 > --- a/include/linux/platform_data/mmc-esdhc-imx.h > +++ b/include/linux/platform_data/mmc-esdhc-imx.h > @@ -30,15 +30,11 @@ enum cd_types { > * > * ESDHC_WP(CD)_CONTROLLER type is not available on i.MX25/35. > * > - * @wp_gpio: gpio for write_protect > - * @cd_gpio: gpio for card_detect interrupt > * @wp_type: type of write_protect method (see wp_types enum above) > * @cd_type: type of card_detect method (see cd_types enum above) > */ > > struct esdhc_platform_data { > - unsigned int wp_gpio; > - unsigned int cd_gpio; > enum wp_types wp_type; > enum cd_types cd_type; > int max_bus_width; > -- > 2.17.2 >