> -----Original Message----- > From: Linus Walleij [mailto:linus.walleij@xxxxxxxxxx] > Sent: Monday, November 12, 2018 10:13 PM > To: linux-mmc@xxxxxxxxxxxxxxx; Ulf Hansson <ulf.hansson@xxxxxxxxxx> > Cc: Linus Walleij <linus.walleij@xxxxxxxxxx>; Shawn Guo > <shawnguo@xxxxxxxxxx>; Sascha Hauer <s.hauer@xxxxxxxxxxxxxx>; > Pengutronix Kernel Team <kernel@xxxxxxxxxxxxxx>; Fabio Estevam > <fabio.estevam@xxxxxxx>; dl-linux-imx <linux-imx@xxxxxxx>; Bartosz > Golaszewski <brgl@xxxxxxxx> > Subject: [PATCH 06/10] mmc: sdhci: imx: Use the slot GPIO descriptor > > 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> Reviewed-by: Dong Aisheng <aisheng.dong@xxxxxxx> > --- > 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. It's almost a 10 years old board and not sure if it's still maintained by Pengutronix. Sascha, Any comments? Regards Dong Aisheng > --- > 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