Re: [PATCH 02/11 v3] mmc: host: tmio: Use GPIO descriptors

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

 



Hi Linus,

Thank you for the patch.

On Monday, 26 November 2018 00:52:08 EET Linus Walleij wrote:
> The TMIO MMC driver was passing global GPIO numbers around for
> card detect. It turns out only one single board in the kernel
> was actually making use of this feature so it is pretty easy
> to convert the driver to use only GPIO descriptors.
> 
> The lines are flagged as GPIO_ACTIVE_LOW as that is what they
> are, but this will be ignored by the MMC slot GPIO code that
> uses the *raw accessors and rely on the caps2 flag for any
> inversion semantics.
> 
> Cc: Kuninori Morimoto <kuninori.morimoto.gx@xxxxxxxxxxx>
> Cc: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
> ---
> ChangeLog v1->v3:
> - Kuninori/Laurent: any tests/ACKs appreciated.
> ---
>  arch/sh/boards/mach-ecovec24/setup.c | 26 ++++++++++++++++++++++----
>  drivers/mmc/host/tmio_mmc_core.c     | 12 +++++++-----
>  include/linux/mfd/tmio.h             |  9 ++-------
>  3 files changed, 31 insertions(+), 16 deletions(-)
> 
> diff --git a/arch/sh/boards/mach-ecovec24/setup.c
> b/arch/sh/boards/mach-ecovec24/setup.c index 3097307b7cb7..af2c28946319
> 100644
> --- a/arch/sh/boards/mach-ecovec24/setup.c
> +++ b/arch/sh/boards/mach-ecovec24/setup.c
> @@ -696,13 +696,20 @@ static struct gpiod_lookup_table
> sdhi0_power_gpiod_table = { },
>  };
> 
> +static struct gpiod_lookup_table sdhi0_gpio_table = {
> +	.dev_id = "sh_mobile_sdhi.0",
> +	.table = {
> +		/* Card detect */
> +		GPIO_LOOKUP("sh7724_pfc", GPIO_PTY7, "cd", GPIO_ACTIVE_LOW),
> +		{ },
> +	},
> +};
> +
>  static struct tmio_mmc_data sdhi0_info = {
>  	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI0_TX,
>  	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI0_RX,
>  	.capabilities	= MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
>  			  MMC_CAP_NEEDS_POLL,
> -	.flags		= TMIO_MMC_USE_GPIO_CD,
> -	.cd_gpio	= GPIO_PTY7,
>  };
> 
>  static struct resource sdhi0_resources[] = {
> @@ -735,8 +742,15 @@ static struct tmio_mmc_data sdhi1_info = {
>  	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI1_RX,
>  	.capabilities	= MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
>  			  MMC_CAP_NEEDS_POLL,
> -	.flags		= TMIO_MMC_USE_GPIO_CD,
> -	.cd_gpio	= GPIO_PTW7,
> +};
> +
> +static struct gpiod_lookup_table sdhi1_gpio_table = {
> +	.dev_id = "sh_mobile_sdhi.1",
> +	.table = {
> +		/* Card detect */
> +		GPIO_LOOKUP("sh7724_pfc", GPIO_PTW7, "cd", GPIO_ACTIVE_LOW),
> +		{ },
> +	},
>  };
> 
>  static struct resource sdhi1_resources[] = {
> @@ -1445,6 +1459,10 @@ static int __init arch_setup(void)
>  	gpiod_add_lookup_table(&cn12_power_gpiod_table);
>  #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
>  	gpiod_add_lookup_table(&sdhi0_power_gpiod_table);
> +	gpiod_add_lookup_table(&sdhi0_gpio_table);
> +#endif
> +#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
> +	gpiod_add_lookup_table(&sdhi1_gpio_table);
>  #endif
> 
>  	return platform_add_devices(ecovec_devices,
> diff --git a/drivers/mmc/host/tmio_mmc_core.c
> b/drivers/mmc/host/tmio_mmc_core.c index 8d64f6196f33..487b88dceff4 100644
> --- a/drivers/mmc/host/tmio_mmc_core.c
> +++ b/drivers/mmc/host/tmio_mmc_core.c
> @@ -1167,11 +1167,13 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host)
> if (ret < 0)
>  		return ret;
> 
> -	if (pdata->flags & TMIO_MMC_USE_GPIO_CD) {
> -		ret = mmc_gpio_request_cd(mmc, pdata->cd_gpio, 0);
> -		if (ret)
> -			return ret;
> -	}
> +	/*
> +	 * Look for a card detect GPIO, if it fails with anything
> +	 * else than a probe deferral, just live without it.
> +	 */
> +	ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL);
> +	if (ret == -EPROBE_DEFER)
> +		return ret;

Shouldn't you set the override_active_level argument to true in order for the 
raw GPIO accessors to be used, as explained in the commit message ?

Apart from this the patch looks good to me,

Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>

>  	mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities;
>  	mmc->caps2 |= pdata->capabilities2;
> diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h
> index 1e70060c92ce..e2687a30e5a1 100644
> --- a/include/linux/mfd/tmio.h
> +++ b/include/linux/mfd/tmio.h
> @@ -54,12 +54,8 @@
>   * idle before writing to some registers.
>   */
>  #define TMIO_MMC_HAS_IDLE_WAIT		BIT(4)
> -/*
> - * A GPIO is used for card hotplug detection. We need an extra flag for
> this, - * because 0 is a valid GPIO number too, and requiring users to
> specify - * cd_gpio < 0 to disable GPIO hotplug would break backwards
> compatibility. - */
> -#define TMIO_MMC_USE_GPIO_CD		BIT(5)
> +
> +/* BIT(5) is unused */
> 
>  /*
>   * Some controllers have CMD12 automatically
> @@ -104,7 +100,6 @@ struct tmio_mmc_data {
>  	unsigned long			capabilities2;
>  	unsigned long			flags;
>  	u32				ocr_mask;	/* available voltages */
> -	unsigned int			cd_gpio;
>  	int				alignment_shift;
>  	dma_addr_t			dma_rx_offset;
>  	unsigned int			max_blk_count;

-- 
Regards,

Laurent Pinchart






[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