[PATCH 7/9] gpio: rockchip: Use pinctrl pin offset to get_gpio_mux()

Kever Yang kever.yang at rock-chips.com
Tue Jul 16 12:20:07 CEST 2024


On 2024/5/12 20:16, Jonas Karlman wrote:
> Use the pinctrl pin offset to get_gpio_mux() to remove the bank num
> dependency and instead only use the bank num to assign a bank name.
>
> Most Rockchip SoCs use all 32 pins of each gpio controller, meaning the
> pinctrl pin offset typically is aligned to 32.
>
> However, for gpio0 on RK3288 only 24 pins are used meaning the pinctrl
> pin offset start at pin 24 for gpio1. Use DIV_ROUND_UP to get the 32 pin
> aligned bank num.
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
>   drivers/gpio/rk_gpio.c | 17 ++++++++++-------
>   1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpio/rk_gpio.c b/drivers/gpio/rk_gpio.c
> index 8f8f21acc2f5..a3691ad25b78 100644
> --- a/drivers/gpio/rk_gpio.c
> +++ b/drivers/gpio/rk_gpio.c
> @@ -35,7 +35,7 @@ enum {
>   struct rockchip_gpio_priv {
>   	void __iomem *regs;
>   	struct udevice *pinctrl;
> -	int bank;
> +	int pfc_offset;
>   	char name[2];
>   	u32 version;
>   };
> @@ -109,7 +109,8 @@ static int rockchip_gpio_get_function(struct udevice *dev, unsigned offset)
>   	int ret;
>   
>   	if (CONFIG_IS_ENABLED(PINCTRL)) {
> -		ret = pinctrl_get_gpio_mux(priv->pinctrl, priv->bank, offset);
> +		ret = pinctrl_get_gpio_mux(priv->pinctrl, -1,
> +					   priv->pfc_offset + offset);
>   		if (ret < 0)
>   			return ret;
>   		else if (ret != RK_FUNC_GPIO)
> @@ -187,7 +188,7 @@ static int rockchip_gpio_probe(struct udevice *dev)
>   	struct rockchip_gpio_priv *priv = dev_get_priv(dev);
>   	struct ofnode_phandle_args args;
>   	char *end;
> -	int ret;
> +	int bank, ret;
>   
>   	priv->regs = dev_read_addr_ptr(dev);
>   
> @@ -200,7 +201,8 @@ static int rockchip_gpio_probe(struct udevice *dev)
>   					     0, &args);
>   	if (!ret) {
>   		uc_priv->gpio_count = args.args[2];
> -		priv->bank = args.args[1] / ROCKCHIP_GPIOS_PER_BANK;
> +		bank = DIV_ROUND_UP(args.args[1], ROCKCHIP_GPIOS_PER_BANK);
> +		priv->pfc_offset = args.args[1];
>   
>   		if (CONFIG_IS_ENABLED(PINCTRL)) {
>   			ret = uclass_get_device_by_ofnode(UCLASS_PINCTRL,
> @@ -211,11 +213,12 @@ static int rockchip_gpio_probe(struct udevice *dev)
>   		}
>   	} else if (ret == -ENOENT || !CONFIG_IS_ENABLED(PINCTRL)) {
>   		uc_priv->gpio_count = ROCKCHIP_GPIOS_PER_BANK;
> -		ret = dev_read_alias_seq(dev, &priv->bank);
> +		ret = dev_read_alias_seq(dev, &bank);
>   		if (ret) {
>   			end = strrchr(dev->name, '@');
> -			priv->bank = trailing_strtoln(dev->name, end);
> +			bank = trailing_strtoln(dev->name, end);
>   		}
> +		priv->pfc_offset = bank * ROCKCHIP_GPIOS_PER_BANK;
>   
>   		if (CONFIG_IS_ENABLED(PINCTRL)) {
>   			ret = uclass_first_device_err(UCLASS_PINCTRL,
> @@ -227,7 +230,7 @@ static int rockchip_gpio_probe(struct udevice *dev)
>   		return ret;
>   	}
>   
> -	priv->name[0] = 'A' + priv->bank;
> +	priv->name[0] = 'A' + bank;
>   	uc_priv->bank_name = priv->name;
>   
>   	priv->version = readl(priv->regs + VER_ID_V2);


More information about the U-Boot mailing list