| From 13a00b9f8df01c113fafaddfd50eef312fe3797e Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Sat, 5 Oct 2019 23:04:47 +0200 |
| Subject: [PATCH] driver core: platform: Add platform_get_irq_byname_optional() |
| |
| commit f1da567f1dc1b55d178b8f2d0cfe8353858aac19 upstream. |
| |
| 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@redhat.com> |
| Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Link: https://lore.kernel.org/r/20191005210449.3926-2-hdegoede@redhat.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/base/platform.c b/drivers/base/platform.c |
| index 157b18c9ab9c..1deb7d50c7fa 100644 |
| --- a/drivers/base/platform.c |
| +++ b/drivers/base/platform.c |
| @@ -261,12 +261,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; |
| |
| @@ -282,12 +278,48 @@ 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 |
| * @num: number of platform devices in array |
| diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h |
| index 0f3db1b2e723..6837544d6899 100644 |
| --- a/include/linux/platform_device.h |
| +++ b/include/linux/platform_device.h |
| @@ -61,6 +61,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.7.4 |
| |