[PATCH v9 07/15] gpiolib: regmap: add GPIO_REGMAP_QUIRK_SET_AFTER_DIR

Andy Shevchenko andriy.shevchenko at linux.intel.com
Fri Oct 2 00:41:25 PDT 2026


On Thu, Oct 01, 2026 at 08:40:56PM +0800, Long Zhao via B4 Relay wrote:

> Some controllers ignore output writes while a line is still an input.
> Add a behaviour flag so the output value is written after the direction
> change. This is a legacy quirk. New hardware must not use it.

A nit-pick below.
In general looks good to me.
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

...

> struct gpio_regmap {

>  	unsigned int reg_clr_base;
>  	unsigned int reg_dir_in_base;
>  	unsigned int reg_dir_out_base;
> +	unsigned long quirks;

I think I have told at some point that this location is not the best, I woul put it...

>  	unsigned long *fixed_direction_mask;
>  	unsigned long *fixed_direction_output;

...here, after the group of the direction related offsets and masks.

> -	gpio_regmap_set(chip, offset, value);
> +	if (!(gpio->quirks & GPIO_REGMAP_QUIRK_SET_AFTER_DIR))
> +		gpio_regmap_set(chip, offset, value);
>  
> -	return gpio_regmap_set_direction(chip, offset, true);
> +	ret = gpio_regmap_set_direction(chip, offset, true);
> +	if (ret)
> +		return ret;
> +
> +	if (gpio->quirks & GPIO_REGMAP_QUIRK_SET_AFTER_DIR)
> +		gpio_regmap_set(chip, offset, value);
> +
> +	return 0;
>  }

...

>  /**
>   * struct gpio_regmap_config - Description of a generic regmap gpio_chip.
>   * @parent:		The parent device

>   * @ngpio:		(Optional) Number of GPIOs
>   * @names:		(Optional) Array of names for gpios
> + * @quirks:		(Optional) Behaviour flags, OR of GPIO_REGMAP_QUIRK_*.
>   * @reg_dat_base:	(Optional) (in) register base address
>   * @reg_set_base:	(Optional) set register base address
>   * @reg_clr_base:	(Optional) clear register base address

>  	int ngpio;
>  	const char *const *names;
>  
> +	/* Regmap GPIO behaviour flags */
> +	unsigned long quirks;
> +
>  	unsigned int reg_dat_base;
>  	unsigned int reg_set_base;
>  	unsigned int reg_clr_base;

I would follow the same location as it's in the above struct, id est after

	unsigned long *fixed_direction_output;

member.


-- 
With Best Regards,
Andy Shevchenko





More information about the linux-arm-kernel mailing list