On Sat, Oct 5, 2019 at 11:04 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > Some drivers (e.g dwc3) first try to get an IRQ byname and then fall > back to the one at index 0. In this case we do not want the error(s) > printed by platform_get_irq_byname(). This commit adds a new > platform_get_irq_byname_optional(), which does not print errors, for this. > > While at it also improve the kdoc text for platform_get_irq_byname() a bit. > > BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=205037 > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> No issues found: Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > --- > drivers/base/platform.c | 46 ++++++++++++++++++++++++++++----- > include/linux/platform_device.h | 2 ++ > 2 files changed, 41 insertions(+), 7 deletions(-) > > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > index b6c6c7d97d5b..b230beb6ccb4 100644 > --- a/drivers/base/platform.c > +++ b/drivers/base/platform.c > @@ -241,12 +241,8 @@ struct resource *platform_get_resource_byname(struct platform_device *dev, > } > EXPORT_SYMBOL_GPL(platform_get_resource_byname); > > -/** > - * platform_get_irq_byname - get an IRQ for a device by name > - * @dev: platform device > - * @name: IRQ name > - */ > -int platform_get_irq_byname(struct platform_device *dev, const char *name) > +static int __platform_get_irq_byname(struct platform_device *dev, > + const char *name) > { > struct resource *r; > > @@ -262,11 +258,47 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name) > if (r) > return r->start; > > - dev_err(&dev->dev, "IRQ %s not found\n", name); > return -ENXIO; > } > + > +/** > + * platform_get_irq_byname - get an IRQ for a device by name > + * @dev: platform device > + * @name: IRQ name > + * > + * Get an IRQ like platform_get_irq(), but then by name rather then by index. > + * > + * Return: IRQ number on success, negative error number on failure. > + */ > +int platform_get_irq_byname(struct platform_device *dev, const char *name) > +{ > + int ret; > + > + ret = __platform_get_irq_byname(dev, name); > + if (ret < 0 && ret != -EPROBE_DEFER) > + dev_err(&dev->dev, "IRQ %s not found\n", name); > + > + return ret; > +} > EXPORT_SYMBOL_GPL(platform_get_irq_byname); > > +/** > + * platform_get_irq_byname_optional - get an optional IRQ for a device by name > + * @dev: platform device > + * @name: IRQ name > + * > + * Get an optional IRQ by name like platform_get_irq_byname(). Except that it > + * does not print an error message if an IRQ can not be obtained. > + * > + * Return: IRQ number on success, negative error number on failure. > + */ > +int platform_get_irq_byname_optional(struct platform_device *dev, > + const char *name) > +{ > + return __platform_get_irq_byname(dev, name); > +} > +EXPORT_SYMBOL_GPL(platform_get_irq_byname_optional); > + > /** > * platform_add_devices - add a numbers of platform devices > * @devs: array of platform devices to add > diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h > index 1b5cec067533..f2688404d1cd 100644 > --- a/include/linux/platform_device.h > +++ b/include/linux/platform_device.h > @@ -64,6 +64,8 @@ extern struct resource *platform_get_resource_byname(struct platform_device *, > unsigned int, > const char *); > extern int platform_get_irq_byname(struct platform_device *, const char *); > +extern int platform_get_irq_byname_optional(struct platform_device *dev, > + const char *name); > extern int platform_add_devices(struct platform_device **, int); > > struct platform_device_info { > -- > 2.23.0 >