Re: [PATCH 03/11 v3] mmc: s3cmci: Use the slot GPIO descriptor

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 25 Nov 2018 at 23:54, Linus Walleij <linus.walleij@xxxxxxxxxx> wrote:
>
> Simplify things by making the S3CMCI driver just use
> slot GPIO with descriptors instead of passing around the global
> GPIO numbers that we want to get rid of.
>
> Getting the names of the GPIO chips into the machine
> descriptor tables was a bit of a challenge but I think
> I have them right.
>
> The platform data supports passing in inversion flags, but
> no platform is using them, and it is highly unlikely
> that we will add more, so drop them. The long term plan
> is to let the inversion flags on the GPIO machine
> descriptor do the job.
>
> Even if the slot GPIO core discards the inversion
> semantics on the GPIO lines we take special care to
> specify them right.
>
> Cc: Jaehoon Chung <jh80.chung@xxxxxxxxxxx>
> Cc: Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx>
> Cc: Krzysztof Kozlowski <krzk@xxxxxxxxxx>
> Cc: Sergio Prado <sergio.prado@xxxxxxxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
> ---
> ChangeLog v2->v3:
> - Fix the missed write protect inversion on mini2440
>   so restored the ability to pass this flag to the core.
>   Also adding the ACTIVE_HIGH flag to the GPIO in the
>   lookup table so the polarity will be correct in the
>   descriptor even if we are not using it yet.
> - Keep the snippet dropping the card detect inversion flag
>   as no host was using that.
> ChangeLog v1->v2:
> - Fix erroneous gpiochip labels "GPIOG" to just "GPG" etc.
>
> Some testing of this would be greatly appreciated.

Looks okay, feel free to take it through mmc tree:

Reviewed-by: Krzysztof Kozlowski <krzk@xxxxxxxxxx>

Best regards,
Krzysztof

> ---
>  arch/arm/mach-s3c24xx/mach-at2440evb.c   | 14 ++++++++++--
>  arch/arm/mach-s3c24xx/mach-h1940.c       | 15 ++++++++++--
>  arch/arm/mach-s3c24xx/mach-mini2440.c    | 15 ++++++++++--
>  arch/arm/mach-s3c24xx/mach-n30.c         | 15 ++++++++++--
>  arch/arm/mach-s3c24xx/mach-rx1950.c      | 15 ++++++++++--
>  drivers/mmc/host/s3cmci.c                | 29 +++++++++---------------
>  include/linux/platform_data/mmc-s3cmci.h |  4 ----
>  7 files changed, 75 insertions(+), 32 deletions(-)
>
> diff --git a/arch/arm/mach-s3c24xx/mach-at2440evb.c b/arch/arm/mach-s3c24xx/mach-at2440evb.c
> index 68a4fa94257a..58c5ef3cf1d7 100644
> --- a/arch/arm/mach-s3c24xx/mach-at2440evb.c
> +++ b/arch/arm/mach-s3c24xx/mach-at2440evb.c
> @@ -9,7 +9,7 @@
>
>  #include <linux/kernel.h>
>  #include <linux/types.h>
> -#include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/interrupt.h>
>  #include <linux/list.h>
>  #include <linux/timer.h>
> @@ -136,7 +136,16 @@ static struct platform_device at2440evb_device_eth = {
>  };
>
>  static struct s3c24xx_mci_pdata at2440evb_mci_pdata __initdata = {
> -       .gpio_detect    = S3C2410_GPG(10),
> +       /* Intentionally left blank */
> +};
> +
> +static struct gpiod_lookup_table at2440evb_mci_gpio_table = {
> +       .dev_id = "s3c2410-sdi",
> +       .table = {
> +               /* Card detect S3C2410_GPG(10) */
> +               GPIO_LOOKUP("GPG", 10, "cd", GPIO_ACTIVE_LOW),
> +               { },
> +       },
>  };
>
>  /* 7" LCD panel */
> @@ -200,6 +209,7 @@ static void __init at2440evb_init_time(void)
>  static void __init at2440evb_init(void)
>  {
>         s3c24xx_fb_set_platdata(&at2440evb_fb_info);
> +       gpiod_add_lookup_table(&at2440evb_mci_gpio_table);
>         s3c24xx_mci_set_platdata(&at2440evb_mci_pdata);
>         s3c_nand_set_platdata(&at2440evb_nand_info);
>         s3c_i2c0_set_platdata(NULL);
> diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
> index e064c73a57d3..74d6b68e91c7 100644
> --- a/arch/arm/mach-s3c24xx/mach-h1940.c
> +++ b/arch/arm/mach-s3c24xx/mach-h1940.c
> @@ -18,6 +18,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/io.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/input.h>
>  #include <linux/gpio_keys.h>
>  #include <linux/pwm.h>
> @@ -459,12 +460,21 @@ static void h1940_set_mmc_power(unsigned char power_mode, unsigned short vdd)
>  }
>
>  static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = {
> -       .gpio_detect   = S3C2410_GPF(5),
> -       .gpio_wprotect = S3C2410_GPH(8),
>         .set_power     = h1940_set_mmc_power,
>         .ocr_avail     = MMC_VDD_32_33,
>  };
>
> +static struct gpiod_lookup_table h1940_mmc_gpio_table = {
> +       .dev_id = "s3c2410-sdi",
> +       .table = {
> +               /* Card detect S3C2410_GPF(5) */
> +               GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW),
> +               /* Write protect S3C2410_GPH(8) */
> +               GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW),
> +               { },
> +       },
> +};
> +
>  static struct pwm_lookup h1940_pwm_lookup[] = {
>         PWM_LOOKUP("samsung-pwm", 0, "pwm-backlight", NULL, 36296,
>                    PWM_POLARITY_NORMAL),
> @@ -680,6 +690,7 @@ static void __init h1940_init(void)
>         u32 tmp;
>
>         s3c24xx_fb_set_platdata(&h1940_fb_info);
> +       gpiod_add_lookup_table(&h1940_mmc_gpio_table);
>         s3c24xx_mci_set_platdata(&h1940_mmc_cfg);
>         s3c24xx_udc_set_platdata(&h1940_udc_cfg);
>         s3c24xx_ts_set_platdata(&h1940_ts_cfg);
> diff --git a/arch/arm/mach-s3c24xx/mach-mini2440.c b/arch/arm/mach-s3c24xx/mach-mini2440.c
> index 50d67d760efd..9035f868fb34 100644
> --- a/arch/arm/mach-s3c24xx/mach-mini2440.c
> +++ b/arch/arm/mach-s3c24xx/mach-mini2440.c
> @@ -15,6 +15,7 @@
>  #include <linux/timer.h>
>  #include <linux/init.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/input.h>
>  #include <linux/io.h>
>  #include <linux/serial_core.h>
> @@ -234,13 +235,22 @@ static struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
>  /* MMC/SD  */
>
>  static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = {
> -       .gpio_detect            = S3C2410_GPG(8),
> -       .gpio_wprotect          = S3C2410_GPH(8),
>         .wprotect_invert        = 1,
>         .set_power              = NULL,
>         .ocr_avail              = MMC_VDD_32_33|MMC_VDD_33_34,
>  };
>
> +static struct gpiod_lookup_table mini2440_mmc_gpio_table = {
> +       .dev_id = "s3c2410-sdi",
> +       .table = {
> +               /* Card detect S3C2410_GPG(8) */
> +               GPIO_LOOKUP("GPG", 8, "cd", GPIO_ACTIVE_LOW),
> +               /* Write protect S3C2410_GPH(8) */
> +               GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_HIGH),
> +               { },
> +       },
> +};
> +
>  /* NAND Flash on MINI2440 board */
>
>  static struct mtd_partition mini2440_default_nand_part[] __initdata = {
> @@ -696,6 +706,7 @@ static void __init mini2440_init(void)
>         }
>
>         s3c24xx_udc_set_platdata(&mini2440_udc_cfg);
> +       gpiod_add_lookup_table(&mini2440_mmc_gpio_table);
>         s3c24xx_mci_set_platdata(&mini2440_mmc_cfg);
>         s3c_nand_set_platdata(&mini2440_nand_info);
>         s3c_i2c0_set_platdata(NULL);
> diff --git a/arch/arm/mach-s3c24xx/mach-n30.c b/arch/arm/mach-s3c24xx/mach-n30.c
> index eec51fadb14a..d856f23939af 100644
> --- a/arch/arm/mach-s3c24xx/mach-n30.c
> +++ b/arch/arm/mach-s3c24xx/mach-n30.c
> @@ -17,6 +17,7 @@
>  #include <linux/gpio_keys.h>
>  #include <linux/init.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/input.h>
>  #include <linux/interrupt.h>
>  #include <linux/platform_device.h>
> @@ -350,12 +351,21 @@ static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd)
>  }
>
>  static struct s3c24xx_mci_pdata n30_mci_cfg __initdata = {
> -       .gpio_detect    = S3C2410_GPF(1),
> -       .gpio_wprotect  = S3C2410_GPG(10),
>         .ocr_avail      = MMC_VDD_32_33,
>         .set_power      = n30_sdi_set_power,
>  };
>
> +static struct gpiod_lookup_table n30_mci_gpio_table = {
> +       .dev_id = "s3c2410-sdi",
> +       .table = {
> +               /* Card detect S3C2410_GPF(1) */
> +               GPIO_LOOKUP("GPF", 1, "cd", GPIO_ACTIVE_LOW),
> +               /* Write protect S3C2410_GPG(10) */
> +               GPIO_LOOKUP("GPG", 10, "wp", GPIO_ACTIVE_LOW),
> +               { },
> +       },
> +};
> +
>  static struct platform_device *n30_devices[] __initdata = {
>         &s3c_device_lcd,
>         &s3c_device_wdt,
> @@ -549,6 +559,7 @@ static void __init n30_init(void)
>
>         s3c24xx_fb_set_platdata(&n30_fb_info);
>         s3c24xx_udc_set_platdata(&n30_udc_cfg);
> +       gpiod_add_lookup_table(&n30_mci_gpio_table);
>         s3c24xx_mci_set_platdata(&n30_mci_cfg);
>         s3c_i2c0_set_platdata(&n30_i2ccfg);
>
> diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
> index 7f5a18fa305b..29f9b345a531 100644
> --- a/arch/arm/mach-s3c24xx/mach-rx1950.c
> +++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
> @@ -14,6 +14,7 @@
>  #include <linux/timer.h>
>  #include <linux/init.h>
>  #include <linux/gpio.h>
> +#include <linux/gpio/machine.h>
>  #include <linux/platform_device.h>
>  #include <linux/serial_core.h>
>  #include <linux/serial_s3c.h>
> @@ -558,12 +559,21 @@ static void rx1950_set_mmc_power(unsigned char power_mode, unsigned short vdd)
>  }
>
>  static struct s3c24xx_mci_pdata rx1950_mmc_cfg __initdata = {
> -       .gpio_detect = S3C2410_GPF(5),
> -       .gpio_wprotect = S3C2410_GPH(8),
>         .set_power = rx1950_set_mmc_power,
>         .ocr_avail = MMC_VDD_32_33,
>  };
>
> +static struct gpiod_lookup_table rx1950_mmc_gpio_table = {
> +       .dev_id = "s3c2410-sdi",
> +       .table = {
> +               /* Card detect S3C2410_GPF(5) */
> +               GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW),
> +               /* Write protect S3C2410_GPH(8) */
> +               GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW),
> +               { },
> +       },
> +};
> +
>  static struct mtd_partition rx1950_nand_part[] = {
>         [0] = {
>                         .name = "Boot0",
> @@ -762,6 +772,7 @@ static void __init rx1950_init_machine(void)
>         s3c24xx_fb_set_platdata(&rx1950_lcd_cfg);
>         s3c24xx_udc_set_platdata(&rx1950_udc_cfg);
>         s3c24xx_ts_set_platdata(&rx1950_ts_cfg);
> +       gpiod_add_lookup_table(&rx1950_mmc_gpio_table);
>         s3c24xx_mci_set_platdata(&rx1950_mmc_cfg);
>         s3c_i2c0_set_platdata(NULL);
>         s3c_nand_set_platdata(&rx1950_nand_info);
> diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
> index f77493604312..e1811ffd7b70 100644
> --- a/drivers/mmc/host/s3cmci.c
> +++ b/drivers/mmc/host/s3cmci.c
> @@ -26,7 +26,6 @@
>  #include <linux/io.h>
>  #include <linux/of.h>
>  #include <linux/of_device.h>
> -#include <linux/of_gpio.h>
>  #include <linux/mmc/slot-gpio.h>
>
>  #include <plat/gpio-cfg.h>
> @@ -1545,25 +1544,19 @@ static int s3cmci_probe_pdata(struct s3cmci_host *host)
>         if (pdata->wprotect_invert)
>                 mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
>
> -       if (pdata->detect_invert)
> -                mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
> -
> -       if (gpio_is_valid(pdata->gpio_detect)) {
> -               ret = mmc_gpio_request_cd(mmc, pdata->gpio_detect, 0);
> -               if (ret) {
> -                       dev_err(&pdev->dev, "error requesting GPIO for CD %d\n",
> -                               ret);
> -                       return ret;
> -               }
> +       /* If we get -ENOENT we have no card detect GPIO line */
> +       ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL);
> +       if (ret != -ENOENT) {
> +               dev_err(&pdev->dev, "error requesting GPIO for CD %d\n",
> +                       ret);
> +               return ret;
>         }
>
> -       if (gpio_is_valid(pdata->gpio_wprotect)) {
> -               ret = mmc_gpio_request_ro(mmc, pdata->gpio_wprotect);
> -               if (ret) {
> -                       dev_err(&pdev->dev, "error requesting GPIO for WP %d\n",
> -                               ret);
> -                       return ret;
> -               }
> +       ret = mmc_gpiod_request_ro(host->mmc, "wp", 0, false, 0, NULL);
> +       if (ret != -ENOENT) {
> +               dev_err(&pdev->dev, "error requesting GPIO for WP %d\n",
> +                       ret);
> +               return ret;
>         }
>
>         return 0;
> diff --git a/include/linux/platform_data/mmc-s3cmci.h b/include/linux/platform_data/mmc-s3cmci.h
> index b68d9f0bdd9e..33310b11cbdd 100644
> --- a/include/linux/platform_data/mmc-s3cmci.h
> +++ b/include/linux/platform_data/mmc-s3cmci.h
> @@ -7,7 +7,6 @@
>   * @no_wprotect: Set this to indicate there is no write-protect switch.
>   * @no_detect: Set this if there is no detect switch.
>   * @wprotect_invert: Invert the default sense of the write protect switch.
> - * @detect_invert: Invert the default sense of the write protect switch.
>   * @use_dma: Set to allow the use of DMA.
>   * @gpio_detect: GPIO number for the card detect line.
>   * @gpio_wprotect: GPIO number for the write protect line.
> @@ -31,11 +30,8 @@ struct s3c24xx_mci_pdata {
>         unsigned int    no_wprotect:1;
>         unsigned int    no_detect:1;
>         unsigned int    wprotect_invert:1;
> -       unsigned int    detect_invert:1;        /* set => detect active high */
>         unsigned int    use_dma:1;
>
> -       unsigned int    gpio_detect;
> -       unsigned int    gpio_wprotect;
>         unsigned long   ocr_avail;
>         void            (*set_power)(unsigned char power_mode,
>                                      unsigned short vdd);
> --
> 2.19.1
>



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux