[PATCH 1/3] pinctrl: airoha: limit GPIO interrupts to interrupt-capable pins

Ahmed Naseef naseefkm at gmail.com
Mon Aug 17 22:17:24 PDT 2026


> > +{
> > +	struct airoha_pinctrl *pinctrl = gpiochip_get_data(gc);
> > +	unsigned int num_irq_pins = pinctrl->num_irq_pins;
> > +
> > +	if (num_irq_pins < ngpios)
> > +		bitmap_clear(valid_mask, num_irq_pins, ngpios - num_irq_pins);
> > +}
> 
> I'm not sure if there is something that gives a sane error log if this
> trigger. Maybe make it explicit?
> 
> Either way:
> Reviewed-by: Benjamin Larsson <benjamin.larsson at genexis.eu>

Nothing logs the limit itself, the -ENXIO only surfaces at the consumer.

However Most of the  gpio_irq_chip::init_valid_mask implementations in the
tree log nothing at all. Only pinctrl-baytrail does, and not for the valid
range.

Happy to make it explicit if you prefer, at probe:

        if (pinctrl->num_irq_pins < AIROHA_NUM_PINS)
                dev_dbg(dev, "GPIO%u and above cannot be used as interrupts\n",
                        pinctrl->num_irq_pins);

Thanks for the review!

Linus, since  the merge window is open. Is this still worth taking for v7.3, or
would you rather it soaked in for v7.4? 2/3 has no DT ack yet either.

Ahmed
> 
> > +
> >   static int airoha_pinctrl_add_gpiochip(struct airoha_pinctrl *pinctrl,
> >   					struct platform_device *pdev)
> >   {
> > @@ -362,6 +383,7 @@ static int airoha_pinctrl_add_gpiochip(struct airoha_pinctrl *pinctrl,
> >   	girq->default_type = IRQ_TYPE_NONE;
> >   	girq->handler = handle_bad_irq;
> > +	girq->init_valid_mask = airoha_gpio_init_valid_mask;
> >   	gpio_irq_chip_set_chip(girq, &airoha_gpio_irq_chip);
> >   	irq = platform_get_irq(pdev, 0);
> > @@ -848,6 +870,7 @@ int airoha_pinctrl_probe(struct platform_device *pdev)
> >   	pinctrl->grps = data->grps;
> >   	pinctrl->funcs = data->funcs;
> >   	pinctrl->confs_info = data->confs_info;
> > +	pinctrl->num_irq_pins = data->num_irq_pins;
> >   	err = pinctrl_enable(pinctrl->ctrl);
> >   	if (err)
> > diff --git a/drivers/pinctrl/airoha/pinctrl-an7563.c b/drivers/pinctrl/airoha/pinctrl-an7563.c
> > index 40cbbe90cc46..f011c6c9ccce 100644
> > --- a/drivers/pinctrl/airoha/pinctrl-an7563.c
> > +++ b/drivers/pinctrl/airoha/pinctrl-an7563.c
> > @@ -1069,6 +1069,7 @@ static const struct airoha_pinctrl_match_data pinctrl_match_data = {
> >   	.num_grps = ARRAY_SIZE(pinctrl_groups),
> >   	.funcs = pinctrl_funcs,
> >   	.num_funcs = ARRAY_SIZE(pinctrl_funcs),
> > +	.num_irq_pins = AIROHA_NUM_PINS,
> >   	.confs_info = {
> >   		[AIROHA_PINCTRL_CONFS_PULLUP] = {
> >   			.confs = pinctrl_pullup_conf,
> > diff --git a/drivers/pinctrl/airoha/pinctrl-an7581.c b/drivers/pinctrl/airoha/pinctrl-an7581.c
> > index 2fcf88106e11..bfb777594811 100644
> > --- a/drivers/pinctrl/airoha/pinctrl-an7581.c
> > +++ b/drivers/pinctrl/airoha/pinctrl-an7581.c
> > @@ -1441,6 +1441,7 @@ static const struct airoha_pinctrl_match_data pinctrl_match_data = {
> >   	.num_grps = ARRAY_SIZE(pinctrl_groups),
> >   	.funcs = pinctrl_funcs,
> >   	.num_funcs = ARRAY_SIZE(pinctrl_funcs),
> > +	.num_irq_pins = AIROHA_NUM_PINS,
> >   	.confs_info = {
> >   		[AIROHA_PINCTRL_CONFS_PULLUP] = {
> >   			.confs = pinctrl_pullup_conf,
> > diff --git a/drivers/pinctrl/airoha/pinctrl-an7583.c b/drivers/pinctrl/airoha/pinctrl-an7583.c
> > index 2c3a75c35915..1cd0f442ddc1 100644
> > --- a/drivers/pinctrl/airoha/pinctrl-an7583.c
> > +++ b/drivers/pinctrl/airoha/pinctrl-an7583.c
> > @@ -1471,6 +1471,7 @@ static const struct airoha_pinctrl_match_data pinctrl_match_data = {
> >   	.num_grps = ARRAY_SIZE(pinctrl_groups),
> >   	.funcs = pinctrl_funcs,
> >   	.num_funcs = ARRAY_SIZE(pinctrl_funcs),
> > +	.num_irq_pins = AIROHA_NUM_PINS,
> >   	.confs_info = {
> >   		[AIROHA_PINCTRL_CONFS_PULLUP] = {
> >   			.confs = pinctrl_pullup_conf,
> > diff --git a/drivers/pinctrl/airoha/pinctrl-en7523.c b/drivers/pinctrl/airoha/pinctrl-en7523.c
> > index 5aa39bacf460..b0c5e60f0aeb 100644
> > --- a/drivers/pinctrl/airoha/pinctrl-en7523.c
> > +++ b/drivers/pinctrl/airoha/pinctrl-en7523.c
> > @@ -1113,6 +1113,7 @@ static const struct airoha_pinctrl_match_data pinctrl_match_data = {
> >   	.num_grps = ARRAY_SIZE(pinctrl_groups),
> >   	.funcs = pinctrl_funcs,
> >   	.num_funcs = ARRAY_SIZE(pinctrl_funcs),
> > +	.num_irq_pins = AIROHA_NUM_PINS,
> >   	.confs_info = {
> >   		[AIROHA_PINCTRL_CONFS_PULLUP] = {
> >   			.confs = pinctrl_pullup_conf,



More information about the Linux-mediatek mailing list