2020-10-31 03:19:38

by Yue Haibing

[permalink] [raw]
Subject: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

gpiod_to_irq() return negative value in case of error,
the existing code handle negative error codes wrongly.

Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
Signed-off-by: YueHaibing <[email protected]>
---
drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
index 514cbf0eac75..a18d5197c16c 100644
--- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
+++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
@@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)

/* Register the IRQ if the HPD GPIO is IRQ-capable. */
tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
- if (tpd->hpd_irq) {
+ if (tpd->hpd_irq > 0) {
ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
tpd12s015_hpd_isr,
IRQF_TRIGGER_RISING |
--
2.17.1


2020-10-31 07:28:42

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

Hi YueHaibing

Thanks for the fix. Appreciated but please update as per comments below.

On Sat, Oct 31, 2020 at 11:16:48AM +0800, YueHaibing wrote:
> gpiod_to_irq() return negative value in case of error,
> the existing code handle negative error codes wrongly.
>
> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
> Signed-off-by: YueHaibing <[email protected]>
> ---
> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> index 514cbf0eac75..a18d5197c16c 100644
> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>
> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
> - if (tpd->hpd_irq) {
> + if (tpd->hpd_irq > 0) {
> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
> tpd12s015_hpd_isr,
> IRQF_TRIGGER_RISING |

The current implmentation will skip devm_request_threaded_irq() in case
or error - but continue with the rest of the function. So the
driver fails to return an error code.

In case of error (negative value) then return early with that error
value. If gpiod_to_irq() returns 0 assume this is a valid irq and let
the code continue.

Please fix and re-submit - or tell me if I am mistaken.

Sam

2020-10-31 12:34:45

by Yue Haibing

[permalink] [raw]
Subject: Re: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

On 2020/10/31 15:19, Sam Ravnborg wrote:
> Hi YueHaibing
>
> Thanks for the fix. Appreciated but please update as per comments below.
>
> On Sat, Oct 31, 2020 at 11:16:48AM +0800, YueHaibing wrote:
>> gpiod_to_irq() return negative value in case of error,
>> the existing code handle negative error codes wrongly.
>>
>> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
>> Signed-off-by: YueHaibing <[email protected]>
>> ---
>> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> index 514cbf0eac75..a18d5197c16c 100644
>> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>>
>> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
>> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
>> - if (tpd->hpd_irq) {
>> + if (tpd->hpd_irq > 0) {
>> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
>> tpd12s015_hpd_isr,
>> IRQF_TRIGGER_RISING |
>
> The current implmentation will skip devm_request_threaded_irq() in case
> or error - but continue with the rest of the function. So the
> driver fails to return an error code.
>
> In case of error (negative value) then return early with that error

Agree, will resubmit.

> value. If gpiod_to_irq() returns 0 assume this is a valid irq and let
> the code continue.

gpiod_to_irq() never returns 0, so no need check this.

>
> Please fix and re-submit - or tell me if I am mistaken.
>
> Sam
> .
>

2020-11-02 07:00:37

by Tomi Valkeinen

[permalink] [raw]
Subject: Re: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

On 31/10/2020 09:19, Sam Ravnborg wrote:
> Hi YueHaibing
>
> Thanks for the fix. Appreciated but please update as per comments below.
>
> On Sat, Oct 31, 2020 at 11:16:48AM +0800, YueHaibing wrote:
>> gpiod_to_irq() return negative value in case of error,
>> the existing code handle negative error codes wrongly.
>>
>> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
>> Signed-off-by: YueHaibing <[email protected]>
>> ---
>> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> index 514cbf0eac75..a18d5197c16c 100644
>> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>>
>> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
>> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
>> - if (tpd->hpd_irq) {
>> + if (tpd->hpd_irq > 0) {
>> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
>> tpd12s015_hpd_isr,
>> IRQF_TRIGGER_RISING |
>
> The current implmentation will skip devm_request_threaded_irq() in case
> or error - but continue with the rest of the function. So the
> driver fails to return an error code.

That is intended. If the HPD gpio supports IRQs (gpiod_to_irq returns a valid number), we use the
IRQ. If it doesn't (gpiod_to_irq returns an error), it gets polled via detect(). Both are ok.

I don't know if the gpiod_to_irq never returning 0 is something we should rely on. The docs say
gpiod_to_irq returns the irq number or an error, so I think checking for >= 0 matches the docs better.

Tomi

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

2020-11-02 09:38:52

by Yue Haibing

[permalink] [raw]
Subject: Re: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

On 2020/11/2 14:57, Tomi Valkeinen wrote:
> On 31/10/2020 09:19, Sam Ravnborg wrote:
>> Hi YueHaibing
>>
>> Thanks for the fix. Appreciated but please update as per comments below.
>>
>> On Sat, Oct 31, 2020 at 11:16:48AM +0800, YueHaibing wrote:
>>> gpiod_to_irq() return negative value in case of error,
>>> the existing code handle negative error codes wrongly.
>>>
>>> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
>>> Signed-off-by: YueHaibing <[email protected]>
>>> ---
>>> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>> index 514cbf0eac75..a18d5197c16c 100644
>>> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>>>
>>> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
>>> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
>>> - if (tpd->hpd_irq) {
>>> + if (tpd->hpd_irq > 0) {
>>> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
>>> tpd12s015_hpd_isr,
>>> IRQF_TRIGGER_RISING |
>>
>> The current implmentation will skip devm_request_threaded_irq() in case
>> or error - but continue with the rest of the function. So the
>> driver fails to return an error code.
>
> That is intended. If the HPD gpio supports IRQs (gpiod_to_irq returns a valid number), we use the
> IRQ. If it doesn't (gpiod_to_irq returns an error), it gets polled via detect(). Both are ok.
>
> I don't know if the gpiod_to_irq never returning 0 is something we should rely on. The docs say
> gpiod_to_irq returns the irq number or an error, so I think checking for >= 0 matches the docs better.
>

gpiod_to_irq() now never returns 0, see:
https://elixir.bootlin.com/linux/v5.10-rc2/source/drivers/gpio/gpiolib.c#L3183

Also commit 4c37ce8608a8 ("gpio: make gpiod_to_irq() return negative for NO_IRQ") says:

commit 4c37ce8608a8c6521726d4cd1d4f54424e8d095f
Author: Linus Walleij <[email protected]>
Date: Mon May 2 13:13:10 2016 +0200

gpio: make gpiod_to_irq() return negative for NO_IRQ

If a translation returns zero, that means NO_IRQ, so we
should return an error since the function is documented to
return a negative code on error.

So checking for >0 is enough, my patch is correct.

> Tomi
>

2020-11-02 09:44:46

by Tomi Valkeinen

[permalink] [raw]
Subject: Re: [PATCH] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

On 02/11/2020 11:36, Yuehaibing wrote:
> On 2020/11/2 14:57, Tomi Valkeinen wrote:
>> On 31/10/2020 09:19, Sam Ravnborg wrote:
>>> Hi YueHaibing
>>>
>>> Thanks for the fix. Appreciated but please update as per comments below.
>>>
>>> On Sat, Oct 31, 2020 at 11:16:48AM +0800, YueHaibing wrote:
>>>> gpiod_to_irq() return negative value in case of error,
>>>> the existing code handle negative error codes wrongly.
>>>>
>>>> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
>>>> Signed-off-by: YueHaibing <[email protected]>
>>>> ---
>>>> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>>> index 514cbf0eac75..a18d5197c16c 100644
>>>> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>>> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
>>>> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>>>>
>>>> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
>>>> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
>>>> - if (tpd->hpd_irq) {
>>>> + if (tpd->hpd_irq > 0) {
>>>> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
>>>> tpd12s015_hpd_isr,
>>>> IRQF_TRIGGER_RISING |
>>>
>>> The current implmentation will skip devm_request_threaded_irq() in case
>>> or error - but continue with the rest of the function. So the
>>> driver fails to return an error code.
>>
>> That is intended. If the HPD gpio supports IRQs (gpiod_to_irq returns a valid number), we use the
>> IRQ. If it doesn't (gpiod_to_irq returns an error), it gets polled via detect(). Both are ok.
>>
>> I don't know if the gpiod_to_irq never returning 0 is something we should rely on. The docs say
>> gpiod_to_irq returns the irq number or an error, so I think checking for >= 0 matches the docs better.
>>
>
> gpiod_to_irq() now never returns 0, see:
> https://elixir.bootlin.com/linux/v5.10-rc2/source/drivers/gpio/gpiolib.c#L3183
>
> Also commit 4c37ce8608a8 ("gpio: make gpiod_to_irq() return negative for NO_IRQ") says:
>
> commit 4c37ce8608a8c6521726d4cd1d4f54424e8d095f
> Author: Linus Walleij <[email protected]>
> Date: Mon May 2 13:13:10 2016 +0200
>
> gpio: make gpiod_to_irq() return negative for NO_IRQ
>
> If a translation returns zero, that means NO_IRQ, so we
> should return an error since the function is documented to
> return a negative code on error.
>
> So checking for >0 is enough, my patch is correct.

Yes, but that is a gpiod_to_irq internal implementation detail. The documentation says it returns an
error code (negative) or a valid irq number. The documentation does not say gpiod_to_irq never
returns 0.

Tomi

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

2020-11-02 14:32:44

by Yue Haibing

[permalink] [raw]
Subject: [PATCH v2] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

gpiod_to_irq() return negative value in case of error,
the existing code doesn't handle negative error codes.
If the HPD gpio supports IRQs (gpiod_to_irq returns a
valid number), we use the IRQ. If it doesn't (gpiod_to_irq
returns an error), it gets polled via detect().

Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
Signed-off-by: YueHaibing <[email protected]>
---
v2: Add checking for >= 0 and update commit message
---
drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
index 514cbf0eac75..e0e015243a60 100644
--- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
+++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
@@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)

/* Register the IRQ if the HPD GPIO is IRQ-capable. */
tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
- if (tpd->hpd_irq) {
+ if (tpd->hpd_irq >= 0) {
ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
tpd12s015_hpd_isr,
IRQF_TRIGGER_RISING |
--
2.17.1

2020-11-02 22:22:17

by Laurent Pinchart

[permalink] [raw]
Subject: Re: [PATCH v2] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

Hi Yue,

Thank you for the patch.

On Mon, Nov 02, 2020 at 10:30:24PM +0800, YueHaibing wrote:
> gpiod_to_irq() return negative value in case of error,
> the existing code doesn't handle negative error codes.
> If the HPD gpio supports IRQs (gpiod_to_irq returns a
> valid number), we use the IRQ. If it doesn't (gpiod_to_irq
> returns an error), it gets polled via detect().
>
> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
> Signed-off-by: YueHaibing <[email protected]>

Reviewed-by: Laurent Pinchart <[email protected]>

> ---
> v2: Add checking for >= 0 and update commit message
> ---
> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> index 514cbf0eac75..e0e015243a60 100644
> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>
> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
> - if (tpd->hpd_irq) {
> + if (tpd->hpd_irq >= 0) {
> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
> tpd12s015_hpd_isr,
> IRQF_TRIGGER_RISING |

--
Regards,

Laurent Pinchart

2020-11-03 06:56:13

by Tomi Valkeinen

[permalink] [raw]
Subject: Re: [PATCH v2] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

On 02/11/2020 16:30, YueHaibing wrote:
> gpiod_to_irq() return negative value in case of error,
> the existing code doesn't handle negative error codes.
> If the HPD gpio supports IRQs (gpiod_to_irq returns a
> valid number), we use the IRQ. If it doesn't (gpiod_to_irq
> returns an error), it gets polled via detect().
>
> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
> Signed-off-by: YueHaibing <[email protected]>
> ---
> v2: Add checking for >= 0 and update commit message
> ---
> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> index 514cbf0eac75..e0e015243a60 100644
> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>
> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
> - if (tpd->hpd_irq) {
> + if (tpd->hpd_irq >= 0) {
> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
> tpd12s015_hpd_isr,
> IRQF_TRIGGER_RISING |
>

Reviewed-by: Tomi Valkeinen <[email protected]>

Tomi

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

2020-11-05 21:13:05

by Sam Ravnborg

[permalink] [raw]
Subject: Re: [PATCH v2] drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe

Hi YueHaibing

On Mon, Nov 02, 2020 at 10:30:24PM +0800, YueHaibing wrote:
> gpiod_to_irq() return negative value in case of error,
> the existing code doesn't handle negative error codes.
> If the HPD gpio supports IRQs (gpiod_to_irq returns a
> valid number), we use the IRQ. If it doesn't (gpiod_to_irq
> returns an error), it gets polled via detect().
>
> Fixes: cff5e6f7e83f ("drm/bridge: Add driver for the TI TPD12S015 HDMI level shifter")
> Signed-off-by: YueHaibing <[email protected]>
> ---
> v2: Add checking for >= 0 and update commit message

Thanks, applied to drm-misc-next.

Sam

> ---
> drivers/gpu/drm/bridge/ti-tpd12s015.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> index 514cbf0eac75..e0e015243a60 100644
> --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c
> +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c
> @@ -160,7 +160,7 @@ static int tpd12s015_probe(struct platform_device *pdev)
>
> /* Register the IRQ if the HPD GPIO is IRQ-capable. */
> tpd->hpd_irq = gpiod_to_irq(tpd->hpd_gpio);
> - if (tpd->hpd_irq) {
> + if (tpd->hpd_irq >= 0) {
> ret = devm_request_threaded_irq(&pdev->dev, tpd->hpd_irq, NULL,
> tpd12s015_hpd_isr,
> IRQF_TRIGGER_RISING |
> --
> 2.17.1
>
> _______________________________________________
> dri-devel mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/dri-devel