[PATCH 6/6] arm64: a37xx: pinctrl: Implement get_pins_count, get_pin_name and get_pin_muxing functions

Stefan Roese sr at denx.de
Thu Jul 28 08:32:25 CEST 2022


On 25.07.22 14:09, Pali Rohár wrote:
> These functions are required for 'pinmux status -a' command to print
> current configuration of each MPP pin.
> 
> Signed-off-by: Pali Rohár <pali at kernel.org>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 78 +++++++++++++++++++++
>   1 file changed, 78 insertions(+)
> 
> diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
> index 74d915950a6e..bb7a76baed1f 100644
> --- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
> +++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c
> @@ -353,6 +353,81 @@ static int armada_37xx_pmx_gpio_disable_free(struct udevice *dev, unsigned int s
>   	return 0;
>   }
>   
> +static int armada_37xx_pmx_get_pins_count(struct udevice *dev)
> +{
> +	struct armada_37xx_pinctrl *info = dev_get_priv(dev);
> +
> +	return info->data->nr_pins;
> +}
> +
> +static const char *armada_37xx_pmx_get_pin_name(struct udevice *dev, unsigned int selector)
> +{
> +	struct armada_37xx_pinctrl *info = dev_get_priv(dev);
> +	static char buf[sizeof("MPPx_XX")];
> +
> +	sprintf(buf, "MPP%c_%u", info->data->name[4], selector);
> +	return buf;
> +}
> +
> +static int armada_37xx_pmx_get_pin_muxing(struct udevice *dev, unsigned int selector,
> +					  char *buf, int size)
> +{
> +	struct armada_37xx_pinctrl *info = dev_get_priv(dev);
> +	int n;
> +
> +	/*
> +	 * First check if selected pin is in some extra pin group.
> +	 * Function in extra pin group is active only when it is not gpio.
> +	 */
> +	for (n = 0; n < info->data->ngroups; n++) {
> +		struct armada_37xx_pin_group *grp = &info->data->groups[n];
> +
> +		if (selector >= grp->extra_pin && selector < grp->extra_pin + grp->extra_npins) {
> +			unsigned int reg = SELECTION;
> +			unsigned int mask = grp->reg_mask;
> +			int f, val;
> +
> +			val = (readl(info->base + reg) & mask);
> +
> +			for (f = 0; f < NB_FUNCS && grp->funcs[f]; f++) {
> +				if (grp->val[f] == val) {
> +					if (strcmp(grp->funcs[f], "gpio") != 0) {
> +						strlcpy(buf, grp->funcs[f], size);
> +						return 0;
> +					}
> +					break;
> +				}
> +			}
> +		}
> +	}
> +
> +	/* If pin is not active in some extra pin group then check regular groups. */
> +	for (n = 0; n < info->data->ngroups; n++) {
> +		struct armada_37xx_pin_group *grp = &info->data->groups[n];
> +
> +		if (selector >= grp->start_pin && selector < grp->start_pin + grp->npins) {
> +			unsigned int reg = SELECTION;
> +			unsigned int mask = grp->reg_mask;
> +			int f, val;
> +
> +			val = (readl(info->base + reg) & mask);
> +
> +			for (f = 0; f < NB_FUNCS && grp->funcs[f]; f++) {
> +				if (grp->val[f] == val) {
> +					strlcpy(buf, grp->funcs[f], size);
> +					return 0;
> +				}
> +			}
> +
> +			strlcpy(buf, "unknown", size);
> +			return 0;
> +		}
> +	}
> +
> +	strlcpy(buf, "unknown", size);
> +	return 0;
> +}
> +
>   /**
>    * armada_37xx_add_function() - Add a new function to the list
>    * @funcs: array of function to add the new one
> @@ -615,6 +690,9 @@ static int armada_37xx_gpiochip_register(struct udevice *parent,
>   }
>   
>   static const struct pinctrl_ops armada_37xx_pinctrl_ops  = {
> +	.get_pins_count = armada_37xx_pmx_get_pins_count,
> +	.get_pin_name = armada_37xx_pmx_get_pin_name,
> +	.get_pin_muxing = armada_37xx_pmx_get_pin_muxing,
>   	.get_groups_count = armada_37xx_pmx_get_groups_count,
>   	.get_group_name = armada_37xx_pmx_get_group_name,
>   	.get_functions_count = armada_37xx_pmx_get_funcs_count,

Viele Grüße,
Stefan Roese

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de


More information about the U-Boot mailing list