[PATCH 2/4] sunxi: gpio: Add per-bank drive and pull setters

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Fri Nov 5 15:12:16 CET 2021


On 10/21/21 06:52, Samuel Holland wrote:
> The GPIO and pinctrl drivers need these setters for pin configuration.
> Since they are DM drivers, they should not be using hardcoded base
> addresses. Factor out variants of the setter functions which take a
> pointer to the GPIO bank's MMIO registers.
> 
> Signed-off-by: Samuel Holland <samuel at sholland.org>
> ---
> 
>   arch/arm/include/asm/arch-sunxi/gpio.h |  2 ++
>   arch/arm/mach-sunxi/pinmux.c           | 20 ++++++++++++++++----
>   2 files changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/include/asm/arch-sunxi/gpio.h b/arch/arm/include/asm/arch-sunxi/gpio.h
> index 2b72b2263b..106605adf5 100644
> --- a/arch/arm/include/asm/arch-sunxi/gpio.h
> +++ b/arch/arm/include/asm/arch-sunxi/gpio.h
> @@ -227,7 +227,9 @@ void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
>   int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
>   int sunxi_gpio_get_cfgpin(u32 pin);
>   void sunxi_gpio_set_drv(u32 pin, u32 val);

Please, add Sphinx style documentation for the new functions, preferably 
in the header file. Cf.
https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html#function-documentation

> +void sunxi_gpio_set_drv_bank(struct sunxi_gpio *pio, u32 bank_offset, u32 val);
>   void sunxi_gpio_set_pull(u32 pin, u32 val);
> +void sunxi_gpio_set_pull_bank(struct sunxi_gpio *pio, int bank_offset, u32 val);
>   int sunxi_name_to_gpio(const char *name);
>   
>   #if !defined CONFIG_SPL_BUILD && defined CONFIG_AXP_GPIO
> diff --git a/arch/arm/mach-sunxi/pinmux.c b/arch/arm/mach-sunxi/pinmux.c
> index cf9d9daf7c..b2093b623a 100644
> --- a/arch/arm/mach-sunxi/pinmux.c
> +++ b/arch/arm/mach-sunxi/pinmux.c
> @@ -48,19 +48,31 @@ int sunxi_gpio_get_cfgpin(u32 pin)
>   void sunxi_gpio_set_drv(u32 pin, u32 val)
>   {
>   	u32 bank = GPIO_BANK(pin);
> -	u32 index = GPIO_DRV_INDEX(pin);
> -	u32 offset = GPIO_DRV_OFFSET(pin);
>   	struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
>   
> +	sunxi_gpio_set_drv_bank(pio, pin, val);
> +}
> +
> +void sunxi_gpio_set_drv_bank(struct sunxi_gpio *pio, u32 bank_offset, u32 val)
> +{
> +	u32 index = GPIO_DRV_INDEX(bank_offset);
> +	u32 offset = GPIO_DRV_OFFSET(bank_offset);
> +
>   	clrsetbits_le32(&pio->drv[0] + index, 0x3 << offset, val << offset);
>   }
>   
>   void sunxi_gpio_set_pull(u32 pin, u32 val)
>   {
>   	u32 bank = GPIO_BANK(pin);
> -	u32 index = GPIO_PULL_INDEX(pin);
> -	u32 offset = GPIO_PULL_OFFSET(pin);
>   	struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
>   
> +	sunxi_gpio_set_pull_bank(pio, pin, val);
> +}
> +
> +void sunxi_gpio_set_pull_bank(struct sunxi_gpio *pio, int bank_offset, u32 val)
> +{
> +	u32 index = GPIO_PULL_INDEX(bank_offset);
> +	u32 offset = GPIO_PULL_OFFSET(bank_offset);
> +
>   	clrsetbits_le32(&pio->pull[0] + index, 0x3 << offset, val << offset);

Please, simplify this:
%s/&pio->pull[0] + index/&pio->pull[index]/

Otherwise the change looks correct to me.

Best regards

Heinrich

>   }
> 



More information about the U-Boot mailing list