From: Amelie DELAUNAY <amelie.delaunay@st•com>
To: Linus Walleij <linus.walleij@linaro•org>
Cc: Alexandre TORGUE <alexandre.torgue@st•com>,
"linux-kernel@vger•kernel.org" <linux-kernel@vger•kernel.org>,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger•kernel.org>,
Maxime Coquelin <mcoquelin.stm32@gmail•com>,
"linux-stm32@st-md-mailman•stormreply.com"
<linux-stm32@st-md-mailman•stormreply.com>,
Linux ARM <linux-arm-kernel@lists•infradead.org>
Subject: Re: [PATCH 1/1] pinctrl: stmfx: add irq_request/release_resources callbacks
Date: Mon, 7 Oct 2019 16:53:09 +0200 [thread overview]
Message-ID: <8eb2090a-e50e-2e4f-982b-073ad24e553c@st.com> (raw)
In-Reply-To: <CACRpkda6CyYCt-s-VkaK856Jt3TxQg+HVDz-5Ww9T9KNHHAjaQ@mail.gmail.com>
Hi Linus,
On 10/5/19 6:49 PM, Linus Walleij wrote:
> On Fri, Oct 4, 2019 at 2:29 PM Amelie Delaunay <amelie.delaunay@st•com>
> wrote:
>
>> When an STMFX IO is used as interrupt through the interrupt-controller
>> binding, the STMFX driver should configure this IO as input. Default
>> value of STMFX IO direction is input, but if the IO is used as output
>> before the interrupt use, it will not work without these callbacks.
>>
>> Signed-off-by: Amelie Delaunay <amelie.delaunay@st•com>
>
> OK I see what you want to achieve.
>
>> +static int stmfx_gpio_irq_request_resources(struct irq_data *data)
>> +{
>> + struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
>> + struct stmfx_pinctrl *pctl = gpiochip_get_data(gpio_chip);
>> + int ret;
>> +
>> + ret = stmfx_gpio_direction_input(&pctl->gpio_chip, data->hwirq);
>> + if (ret)
>> + return ret;
>> +
>> + ret = gpiochip_lock_as_irq(&pctl->gpio_chip, data->hwirq);
>> + if (ret) {
>> + dev_err(pctl->dev, "Unable to lock gpio %lu as IRQ: %d\n",
>> + data->hwirq, ret);
>> + return ret;
>> + }
>> +
>> + return 0;
>> +}
>
> Just call gpiochip_reqres_irq() instead of calling the lock etc
> explicitly.
>
>> +static void stmfx_gpio_irq_release_resources(struct irq_data *data)
>> +{
>> + struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
>> + struct stmfx_pinctrl *pctl = gpiochip_get_data(gpio_chip);
>> +
>> + gpiochip_unlock_as_irq(&pctl->gpio_chip, data->hwirq);
>> +}
>
> Just call gpiochip_relres_irq()
>
> But all this duplicated a lot of code from the core which is not so nice.
>
>> @@ -678,6 +706,8 @@ static int stmfx_pinctrl_probe(struct platform_device *pdev)
>> pctl->irq_chip.irq_set_type = stmfx_pinctrl_irq_set_type;
>> pctl->irq_chip.irq_bus_lock = stmfx_pinctrl_irq_bus_lock;
>> pctl->irq_chip.irq_bus_sync_unlock = stmfx_pinctrl_irq_bus_sync_unlock;
>> + pctl->irq_chip.irq_request_resources = stmfx_gpio_irq_request_resources;
>> + pctl->irq_chip.irq_release_resources = stmfx_gpio_irq_release_resources;
>
> What about just adding
>
> pctl->irq_chip.irq_enable and do stmfx_gpio_direction_input()
> in that callback instead? gpiolib will helpfully wrap it.
Thanks for pointing that out to me.
I can't use .irq_enable because of I2C transfer to set gpio direction
(scheduling while atomic BUG occurs in this case). Indeed, .irq_enable
is called under raw_spin_lock_irqsave in __setup_irq() while
irq_request_resources is called before.
I could apply gpio direction in stmfx_pinctrl_irq_bus_sync_unlock
depending on pctl->irq_gpi_src[] (checking which one is set, to set
input direction), but this will be applied each time a consumer requests
a stmfx gpio irq.
IMHO, keeping .irq_request/release_resources callbacks and using
gpiochip_reqres_irq()/gpiochip_relres_irq() seems to be the best compromise.
Regards,
Amelie
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists•infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-10-07 14:53 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-04 12:29 [PATCH 1/1] pinctrl: stmfx: add irq_request/release_resources callbacks Amelie Delaunay
2019-10-05 16:49 ` Linus Walleij
2019-10-07 14:53 ` Amelie DELAUNAY [this message]
2019-10-16 11:12 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8eb2090a-e50e-2e4f-982b-073ad24e553c@st.com \
--to=amelie.delaunay@st$(echo .)com \
--cc=alexandre.torgue@st$(echo .)com \
--cc=linus.walleij@linaro$(echo .)org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-gpio@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-stm32@st-md-mailman$(echo .)stormreply.com \
--cc=mcoquelin.stm32@gmail$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox