Re: [PATCH v2 2/2] gpio: axiado: add SGPIO controller support

Petar Stepanovic <[email protected]> Wed, 5 Aug 2026 12:29:03 +0200
Newsgroups org.kernel.vger.linux-gpio,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 7/29/2026 10:28 PM, Linus Walleij wrote:
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
>
> Hi Petar,
>
> thanks for your patch!
>
> On Wed, Jul 29, 2026 at 9:02 AM Petar Stepanovic <[email protected]> wrote:
>
>> Add support for the Axiado SGPIO controller.
>>
>> Each SGPIO position provides one input GPIO and one output GPIO with
>> fixed directions. The driver registers the controller as a gpio_chip,
>> supports interrupts on input GPIOs, and uses regmap for register access.
>>
>> Signed-off-by: Petar Stepanovic <[email protected]>
> (...)
>
>> +static int ax3000_sgpio_set(struct gpio_chip *chip, unsigned int offset,
>> +                            int value)
>> +static int ax3000_sgpio_get_direction(struct gpio_chip *chip,
>> +                                     unsigned int offset)
>> +{
>> +       if (!(offset % 2))
>> +               return GPIO_LINE_DIRECTION_IN;
>> +
>> +       return GPIO_LINE_DIRECTION_OUT;
>> +}
> So every second GPIO is input only and every second GPIO is output
> only?
>
> How does this look *phycially* on the outside of the chip?
>
> I'm a bit worried that the input and output would be to the same pin or
> something, in which case they are the same GPIO line.
>
> The cover letter says " Each SGPIO position provides one fixed-direction
> input GPIO and one fixed-direction output GPIO." and I'm suspicious
> about this.
>
> What is an "SGPIO position"?
>
> If a position is something like a physical line controlled by both an
> input and an output driver block, it is the same GPIO line in Linux
> terms, it will be used as output if a LED is connected there and
> it will be used as input if a key is connected there, and we have
> 64 or 128 GPIOs, not 128 or 256.

Yes, every pair consists of one input-only GPIO and one output-only GPIO,
but they do not represent two directions of the same physical pin.

“SGPIO position” refers to one bit slot in the serialized SGPIO frame, not
to a physical SoC pin. For each position, the controller samples one bit
from the dedicated SGPIO data-input signal and transmits an independent bit
through the dedicated SGPIO data-output signal. These are separate physical
signals and are normally connected to separate input and output shift
registers.

Therefore, the input and output associated with a position are independent
GPIO lines in Linux and their directions cannot be changed. For position
|n|, offset |2 * n| represents the input and offset |2 * n + 1| represents
the output. With |N| SGPIO positions, the GPIO controller exposes |2 * N|
GPIO lines.

I agree that the term “SGPIO position” is unclear. I will update the cover
letter and binding description to define it as a serial bit slot and
clarify that each slot carries one independent input bit and one
independent output bit over separate serial data signals.

>
>> +static int ax3000_sgpio_get(struct gpio_chip *chip, unsigned int offset)
>> +{
>> +static int ax3000_sgpio_dir_in(struct gpio_chip *chip, unsigned int offset)
>> +static int ax3000_sgpio_dir_out(struct gpio_chip *chip, unsigned int offset,
> The GPIO line handling looks like:
>
> 1. some translation
> 2. Standard things
>
> which is usually what we use regmap-gpio for, and we have added a few
> features to it recently. Some are even in linux-next, can you check it out
> and see if you could use the library?

Thanks for the suggestion. I checked the recent |gpio-regmap| additions,
and the library appears suitable for the standard GPIO operations in this
driver.

The fixed-direction support can describe the even offsets as input-only
and the odd offsets as output-only, while a custom register/mask
translation callback can map each GPIO pair to the corresponding bit in
the separate input and output register banks.

I will prototype the conversion for the next version. I still need to
verify that the output registers support the read-modify-write access
expected by |gpio-regmap|, since the current driver maintains a software
shadow of the output state. The controller-specific interrupt handling
will remain in the driver and will need to be integrated with the
|gpio-regmap| GPIO chip.

Best regards,
Petar