Re: [PATCH v2] pinctrl: sh-pfc: Split R-Car H3 support in two independent drivers

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

 



Hi Geert,

Thanks for your patch.

On 2019-12-30 09:31:56 +0100, Geert Uytterhoeven wrote:
> Despite using the same compatible values ("r8a7795"-based) because of
> historical reasons, R-Car H3 ES1.x (R8A77950) and R-Car H3 ES2.0+
> (R8A77951) are really different SoCs, with different part numbers, and
> with different Pin Function Controller blocks.
> 
> Reflect this in the pinctrl configuration, by replacing the existing
> CONFIG_PINCTRL_PFC_R8A7795 symbol by two new config symbols:
> CONFIG_PINCTRL_PFC_R8A77950 and CONFIG_PINCTRL_PFC_R8A77951.  The latter
> are selected automatically, depending on the soon-to-be-introduced
> corresponding SoC-specific config options, and on the current common
> config option, to relax dependencies.
> 
> Rename the individual pin control driver source files from
> pfc-r8a7795-es1.c to pfc-r8a77950.c, and from pfc-r8a7795.c to
> pfc-r8a77951.c, and make them truly independent.
> As both SoCs share the same compatible value, special care must be taken
> to match them to the correct pin control driver, if support for it is
> included in the running kernel.
> 
> This will allow making support for early R-Car H3 revisions optional,
> the largest share of which is taken by the pin control driver.
> 
> Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx>
> Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx>

Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>

> ---
> To be queued in sh-pfc-for-v5.6.
> 
> This complements, but has no dependencies on "[PATCH 0/5] arm64:
> renesas: Split/rename R-Car H3 support"
> https://lore.kernel.org/linux-renesas-soc/20191217183841.432-1-geert+renesas@xxxxxxxxx
> 
> v2:
>   - Add Reviewed-by, Tested-by,
>   - Reduce #ifdef clutter by marking r8a7795[01]_pinmux_info __weak, at
>     the expense of adding an extra runtime check, increasing kernel size
>     by 8 bytes.
> ---
>  drivers/pinctrl/sh-pfc/Kconfig                | 10 +++-
>  drivers/pinctrl/sh-pfc/Makefile               |  4 +-
>  drivers/pinctrl/sh-pfc/core.c                 | 57 ++++++++++++++-----
>  .../{pfc-r8a7795-es1.c => pfc-r8a77950.c}     | 26 ++++-----
>  .../sh-pfc/{pfc-r8a7795.c => pfc-r8a77951.c}  | 39 +++++--------
>  drivers/pinctrl/sh-pfc/sh_pfc.h               |  4 +-
>  6 files changed, 81 insertions(+), 59 deletions(-)
>  rename drivers/pinctrl/sh-pfc/{pfc-r8a7795-es1.c => pfc-r8a77950.c} (99%)
>  rename drivers/pinctrl/sh-pfc/{pfc-r8a7795.c => pfc-r8a77951.c} (99%)
> 
> diff --git a/drivers/pinctrl/sh-pfc/Kconfig b/drivers/pinctrl/sh-pfc/Kconfig
> index ecf3b045bf755008..cf0e0dc42b84c06f 100644
> --- a/drivers/pinctrl/sh-pfc/Kconfig
> +++ b/drivers/pinctrl/sh-pfc/Kconfig
> @@ -26,7 +26,8 @@ config PINCTRL_SH_PFC
>  	select PINCTRL_PFC_R8A7792 if ARCH_R8A7792
>  	select PINCTRL_PFC_R8A7793 if ARCH_R8A7793
>  	select PINCTRL_PFC_R8A7794 if ARCH_R8A7794
> -	select PINCTRL_PFC_R8A7795 if ARCH_R8A7795
> +	select PINCTRL_PFC_R8A77950 if ARCH_R8A77950 || ARCH_R8A7795
> +	select PINCTRL_PFC_R8A77951 if ARCH_R8A77951 || ARCH_R8A7795
>  	select PINCTRL_PFC_R8A77960 if ARCH_R8A77960
>  	select PINCTRL_PFC_R8A77961 if ARCH_R8A77961
>  	select PINCTRL_PFC_R8A77965 if ARCH_R8A77965
> @@ -115,8 +116,11 @@ config PINCTRL_PFC_R8A7793
>  config PINCTRL_PFC_R8A7794
>  	bool "R-Car E2 pin control support" if COMPILE_TEST
>  
> -config PINCTRL_PFC_R8A7795
> -	bool "R-Car H3 pin control support" if COMPILE_TEST
> +config PINCTRL_PFC_R8A77950
> +	bool "R-Car H3 ES1.x pin control support" if COMPILE_TEST
> +
> +config PINCTRL_PFC_R8A77951
> +	bool "R-Car H3 ES2.0+ pin control support" if COMPILE_TEST
>  
>  config PINCTRL_PFC_R8A77960
>  	bool "R-Car M3-W pin control support" if COMPILE_TEST
> diff --git a/drivers/pinctrl/sh-pfc/Makefile b/drivers/pinctrl/sh-pfc/Makefile
> index 3bc05666e1a6652e..9ebe321d24c488b0 100644
> --- a/drivers/pinctrl/sh-pfc/Makefile
> +++ b/drivers/pinctrl/sh-pfc/Makefile
> @@ -18,8 +18,8 @@ obj-$(CONFIG_PINCTRL_PFC_R8A7791)	+= pfc-r8a7791.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A7792)	+= pfc-r8a7792.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A7793)	+= pfc-r8a7791.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A7794)	+= pfc-r8a7794.o
> -obj-$(CONFIG_PINCTRL_PFC_R8A7795)	+= pfc-r8a7795.o
> -obj-$(CONFIG_PINCTRL_PFC_R8A7795)	+= pfc-r8a7795-es1.o
> +obj-$(CONFIG_PINCTRL_PFC_R8A77950)	+= pfc-r8a77950.o
> +obj-$(CONFIG_PINCTRL_PFC_R8A77951)	+= pfc-r8a77951.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A77960)	+= pfc-r8a7796.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A77961)	+= pfc-r8a7796.o
>  obj-$(CONFIG_PINCTRL_PFC_R8A77965)	+= pfc-r8a77965.o
> diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c
> index 65e52688f0916cbf..82209116955b153a 100644
> --- a/drivers/pinctrl/sh-pfc/core.c
> +++ b/drivers/pinctrl/sh-pfc/core.c
> @@ -23,6 +23,7 @@
>  #include <linux/platform_device.h>
>  #include <linux/psci.h>
>  #include <linux/slab.h>
> +#include <linux/sys_soc.h>
>  
>  #include "core.h"
>  
> @@ -568,18 +569,18 @@ static const struct of_device_id sh_pfc_of_table[] = {
>  		.data = &r8a7794_pinmux_info,
>  	},
>  #endif
> -#ifdef CONFIG_PINCTRL_PFC_R8A7795
> +/* Both r8a7795 entries must be present to make sanity checks work */
> +#ifdef CONFIG_PINCTRL_PFC_R8A77950
>  	{
>  		.compatible = "renesas,pfc-r8a7795",
> -		.data = &r8a7795_pinmux_info,
> +		.data = &r8a77950_pinmux_info,
>  	},
> -#ifdef DEBUG
> +#endif
> +#ifdef CONFIG_PINCTRL_PFC_R8A77951
>  	{
> -		/* For sanity checks only (nothing matches against this) */
> -		.compatible = "renesas,pfc-r8a77950",	/* R-Car H3 ES1.0 */
> -		.data = &r8a7795es1_pinmux_info,
> +		.compatible = "renesas,pfc-r8a7795",
> +		.data = &r8a77951_pinmux_info,
>  	},
> -#endif /* DEBUG */
>  #endif
>  #ifdef CONFIG_PINCTRL_PFC_R8A77960
>  	{
> @@ -886,19 +887,49 @@ static void __init sh_pfc_check_driver(const struct platform_driver *pdrv)
>  static inline void sh_pfc_check_driver(struct platform_driver *pdrv) {}
>  #endif /* !DEBUG */
>  
> +#ifdef CONFIG_OF
> +static const void *sh_pfc_quirk_match(void)
> +{
> +#if defined(CONFIG_PINCTRL_PFC_R8A77950) || \
> +    defined(CONFIG_PINCTRL_PFC_R8A77951)
> +	const struct soc_device_attribute *match;
> +	static const struct soc_device_attribute quirks[] = {
> +		{
> +			.soc_id = "r8a7795", .revision = "ES1.*",
> +			.data = &r8a77950_pinmux_info,
> +		},
> +		{
> +			.soc_id = "r8a7795",
> +			.data = &r8a77951_pinmux_info,
> +		},
> +
> +		{ /* sentinel */ }
> +	};
> +
> +	match = soc_device_match(quirks);
> +	if (match)
> +		return match->data ?: ERR_PTR(-ENODEV);
> +#endif /* CONFIG_PINCTRL_PFC_R8A77950 || CONFIG_PINCTRL_PFC_R8A77951 */
> +
> +	return NULL;
> +}
> +#endif /* CONFIG_OF */
> +
>  static int sh_pfc_probe(struct platform_device *pdev)
>  {
> -#ifdef CONFIG_OF
> -	struct device_node *np = pdev->dev.of_node;
> -#endif
>  	const struct sh_pfc_soc_info *info;
>  	struct sh_pfc *pfc;
>  	int ret;
>  
>  #ifdef CONFIG_OF
> -	if (np)
> -		info = of_device_get_match_data(&pdev->dev);
> -	else
> +	if (pdev->dev.of_node) {
> +		info = sh_pfc_quirk_match();
> +		if (IS_ERR(info))
> +			return PTR_ERR(info);
> +
> +		if (!info)
> +			info = of_device_get_match_data(&pdev->dev);
> +	} else
>  #endif
>  		info = (const void *)platform_get_device_id(pdev)->driver_data;
>  
> diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795-es1.c b/drivers/pinctrl/sh-pfc/pfc-r8a77950.c
> similarity index 99%
> rename from drivers/pinctrl/sh-pfc/pfc-r8a7795-es1.c
> rename to drivers/pinctrl/sh-pfc/pfc-r8a77950.c
> index ad05da8f65161c3d..04812e62f3a476a8 100644
> --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795-es1.c
> +++ b/drivers/pinctrl/sh-pfc/pfc-r8a77950.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * R8A7795 ES1.x processor support - PFC hardware block.
> + * R8A77950 processor support - PFC hardware block.
>   *
>   * Copyright (C) 2015-2017  Renesas Electronics Corporation
>   */
> @@ -5562,8 +5562,8 @@ static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
>  	{ /* sentinel */ },
>  };
>  
> -static int r8a7795es1_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin,
> -				     u32 *pocctrl)
> +static int r8a77950_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin,
> +				   u32 *pocctrl)
>  {
>  	int bit = -EINVAL;
>  
> @@ -5820,8 +5820,8 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
>  	{ /* sentinel */ },
>  };
>  
> -static unsigned int r8a7795es1_pinmux_get_bias(struct sh_pfc *pfc,
> -					       unsigned int pin)
> +static unsigned int r8a77950_pinmux_get_bias(struct sh_pfc *pfc,
> +					     unsigned int pin)
>  {
>  	const struct pinmux_bias_reg *reg;
>  	unsigned int bit;
> @@ -5838,8 +5838,8 @@ static unsigned int r8a7795es1_pinmux_get_bias(struct sh_pfc *pfc,
>  		return PIN_CONFIG_BIAS_PULL_DOWN;
>  }
>  
> -static void r8a7795es1_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
> -				       unsigned int bias)
> +static void r8a77950_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
> +				     unsigned int bias)
>  {
>  	const struct pinmux_bias_reg *reg;
>  	u32 enable, updown;
> @@ -5861,15 +5861,15 @@ static void r8a7795es1_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
>  	sh_pfc_write(pfc, reg->puen, enable);
>  }
>  
> -static const struct sh_pfc_soc_operations r8a7795es1_pinmux_ops = {
> -	.pin_to_pocctrl = r8a7795es1_pin_to_pocctrl,
> -	.get_bias = r8a7795es1_pinmux_get_bias,
> -	.set_bias = r8a7795es1_pinmux_set_bias,
> +static const struct sh_pfc_soc_operations r8a77950_pinmux_ops = {
> +	.pin_to_pocctrl = r8a77950_pin_to_pocctrl,
> +	.get_bias = r8a77950_pinmux_get_bias,
> +	.set_bias = r8a77950_pinmux_set_bias,
>  };
>  
> -const struct sh_pfc_soc_info r8a7795es1_pinmux_info = {
> +const struct sh_pfc_soc_info r8a77950_pinmux_info = {
>  	.name = "r8a77950_pfc",
> -	.ops = &r8a7795es1_pinmux_ops,
> +	.ops = &r8a77950_pinmux_ops,
>  	.unlock_reg = 0xe6060000, /* PMMR */
>  
>  	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
> diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c b/drivers/pinctrl/sh-pfc/pfc-r8a77951.c
> similarity index 99%
> rename from drivers/pinctrl/sh-pfc/pfc-r8a7795.c
> rename to drivers/pinctrl/sh-pfc/pfc-r8a77951.c
> index d3145aa135d0fdcd..256fab4b03d35621 100644
> --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c
> +++ b/drivers/pinctrl/sh-pfc/pfc-r8a77951.c
> @@ -1,6 +1,6 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * R8A7795 ES2.0+ processor support - PFC hardware block.
> + * R8A77951 processor support - PFC hardware block.
>   *
>   * Copyright (C) 2015-2019 Renesas Electronics Corporation
>   */
> @@ -5915,7 +5915,8 @@ static const struct pinmux_ioctrl_reg pinmux_ioctrl_regs[] = {
>  	{ /* sentinel */ },
>  };
>  
> -static int r8a7795_pin_to_pocctrl(struct sh_pfc *pfc, unsigned int pin, u32 *pocctrl)
> +static int r8a77951_pin_to_pocctrl(struct sh_pfc *pfc,
> +				   unsigned int pin, u32 *pocctrl)
>  {
>  	int bit = -EINVAL;
>  
> @@ -6172,8 +6173,8 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
>  	{ /* sentinel */ },
>  };
>  
> -static unsigned int r8a7795_pinmux_get_bias(struct sh_pfc *pfc,
> -					    unsigned int pin)
> +static unsigned int r8a77951_pinmux_get_bias(struct sh_pfc *pfc,
> +					     unsigned int pin)
>  {
>  	const struct pinmux_bias_reg *reg;
>  	unsigned int bit;
> @@ -6190,8 +6191,8 @@ static unsigned int r8a7795_pinmux_get_bias(struct sh_pfc *pfc,
>  		return PIN_CONFIG_BIAS_PULL_DOWN;
>  }
>  
> -static void r8a7795_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
> -				   unsigned int bias)
> +static void r8a77951_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
> +				     unsigned int bias)
>  {
>  	const struct pinmux_bias_reg *reg;
>  	u32 enable, updown;
> @@ -6213,29 +6214,15 @@ static void r8a7795_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
>  	sh_pfc_write(pfc, reg->puen, enable);
>  }
>  
> -static const struct soc_device_attribute r8a7795es1[] = {
> -	{ .soc_id = "r8a7795", .revision = "ES1.*" },
> -	{ /* sentinel */ }
> +static const struct sh_pfc_soc_operations r8a77951_pinmux_ops = {
> +	.pin_to_pocctrl = r8a77951_pin_to_pocctrl,
> +	.get_bias = r8a77951_pinmux_get_bias,
> +	.set_bias = r8a77951_pinmux_set_bias,
>  };
>  
> -static int r8a7795_pinmux_init(struct sh_pfc *pfc)
> -{
> -	if (soc_device_match(r8a7795es1))
> -		pfc->info = &r8a7795es1_pinmux_info;
> -
> -	return 0;
> -}
> -
> -static const struct sh_pfc_soc_operations r8a7795_pinmux_ops = {
> -	.init = r8a7795_pinmux_init,
> -	.pin_to_pocctrl = r8a7795_pin_to_pocctrl,
> -	.get_bias = r8a7795_pinmux_get_bias,
> -	.set_bias = r8a7795_pinmux_set_bias,
> -};
> -
> -const struct sh_pfc_soc_info r8a7795_pinmux_info = {
> +const struct sh_pfc_soc_info r8a77951_pinmux_info = {
>  	.name = "r8a77951_pfc",
> -	.ops = &r8a7795_pinmux_ops,
> +	.ops = &r8a77951_pinmux_ops,
>  	.unlock_reg = 0xe6060000, /* PMMR */
>  
>  	.function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
> diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h
> index 640d2a4cb838804f..d57e633e99c0ce66 100644
> --- a/drivers/pinctrl/sh-pfc/sh_pfc.h
> +++ b/drivers/pinctrl/sh-pfc/sh_pfc.h
> @@ -318,8 +318,8 @@ extern const struct sh_pfc_soc_info r8a7791_pinmux_info;
>  extern const struct sh_pfc_soc_info r8a7792_pinmux_info;
>  extern const struct sh_pfc_soc_info r8a7793_pinmux_info;
>  extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
> -extern const struct sh_pfc_soc_info r8a7795_pinmux_info;
> -extern const struct sh_pfc_soc_info r8a7795es1_pinmux_info;
> +extern const struct sh_pfc_soc_info r8a77950_pinmux_info __weak;
> +extern const struct sh_pfc_soc_info r8a77951_pinmux_info __weak;
>  extern const struct sh_pfc_soc_info r8a77960_pinmux_info;
>  extern const struct sh_pfc_soc_info r8a77961_pinmux_info;
>  extern const struct sh_pfc_soc_info r8a77965_pinmux_info;
> -- 
> 2.17.1
> 

-- 
Regards,
Niklas Söderlund



[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux