Re: [PATCH v3 1/3] drivers: fwnode: fix fwnode_irq_get_byname()

Jonathan Cameron
2023-05-13T18:24:09Z

On Fri, 12 May 2023 10:53:00 +0300
Matti Vaittinen <mazziesaccount@gmail.com> wrote:

> The fwnode_irq_get_byname() does return 0 upon device-tree IRQ mapping
> failure. This is contradicting the function documentation and can
> potentially be a source of errors like:
>
> int probe(...) {
> ...
>
> irq = fwnode_irq_get_byname();
> if (irq <= 0)
> return irq;
>
> ...
> }
>
> Here we do correctly check the return value from fwnode_irq_get_byname()
> but the driver probe will now return success. (There was already one
> such user in-tree).
>
> Change the fwnode_irq_get_byname() to work as documented and according to
> the common convention and abd always return a negative errno upon failure.
>
> Fixes: ca0acb511c21 ("device property: Add fwnode_irq_get_byname")
> Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>

Whilst the docs don't contradict behaviour for fwnode_irq_get()
unlike the byname() variant, it does seem odd to fix it only in this
version rather than modifying them both not to return 0.

Is there clear logic why they should be different?

> ---
> drivers/base/property.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/base/property.c b/drivers/base/property.c
> index f6117ec9805c..a3b95d2d781f 100644
> --- a/drivers/base/property.c
> +++ b/drivers/base/property.c
> @@ -1011,7 +1011,7 @@ EXPORT_SYMBOL(fwnode_irq_get);
> */
> int fwnode_irq_get_byname(const struct fwnode_handle *fwnode, const char *name)
> {
> - int index;
> + int index, ret;
>
> if (!name)
> return -EINVAL;
> @@ -1020,7 +1020,12 @@ int fwnode_irq_get_byname(const struct fwnode_handle *fwnode, const char *name)
> if (index < 0)
> return index;
>
> - return fwnode_irq_get(fwnode, index);
> + ret = fwnode_irq_get(fwnode, index);
> + /* We treat mapping errors as invalid case */
> + if (ret == 0)
> + return -EINVAL;
> +
> + return ret;
> }
> EXPORT_SYMBOL(fwnode_irq_get_byname);
>