| From ac3139e60f4614ca41fd4a6277b28540f933dd5a Mon Sep 17 00:00:00 2001 |
| From: Stephen Boyd <swboyd@chromium.org> |
| Date: Mon, 29 Jul 2019 22:38:43 -0700 |
| Subject: [PATCH] driver core: platform: Add an error message to |
| platform_get_irq*() |
| |
| commit 7723f4c5ecdb8d832f049f8483beb0d1081cedf6 upstream. |
| |
| A grep of the kernel shows that many drivers print an error message if |
| they fail to get the irq they're looking for. Furthermore, those drivers |
| all decide to print the device name, or not, and the irq they were |
| requesting, or not, etc. Let's consolidate all these error messages into |
| the API itself, allowing us to get rid of the error messages in each |
| driver. |
| |
| Cc: Rob Herring <robh@kernel.org> |
| Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Cc: Javier Martinez Canillas <javierm@redhat.com> |
| Cc: Andrzej Hajda <a.hajda@samsung.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Cc: Russell King - ARM Linux <linux@armlinux.org.uk> |
| Cc: Marek Szyprowski <m.szyprowski@samsung.com> |
| Cc: Markus Elfring <Markus.Elfring@web.de> |
| Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> |
| Signed-off-by: Stephen Boyd <swboyd@chromium.org> |
| Link: https://lore.kernel.org/r/20190730053845.126834-2-swboyd@chromium.org |
| 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 16f49b75321a..157b18c9ab9c 100644 |
| --- a/drivers/base/platform.c |
| +++ b/drivers/base/platform.c |
| @@ -100,12 +100,7 @@ void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev, |
| EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource); |
| #endif /* CONFIG_HAS_IOMEM */ |
| |
| -/** |
| - * platform_get_irq - get an IRQ for a device |
| - * @dev: platform device |
| - * @num: IRQ number index |
| - */ |
| -int platform_get_irq(struct platform_device *dev, unsigned int num) |
| +static int __platform_get_irq(struct platform_device *dev, unsigned int num) |
| { |
| #ifdef CONFIG_SPARC |
| /* sparc does not have irqs represented as IORESOURCE_IRQ resources */ |
| @@ -169,6 +164,33 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) |
| return -ENXIO; |
| #endif |
| } |
| + |
| +/** |
| + * platform_get_irq - get an IRQ for a device |
| + * @dev: platform device |
| + * @num: IRQ number index |
| + * |
| + * Gets an IRQ for a platform device and prints an error message if finding the |
| + * IRQ fails. Device drivers should check the return value for errors so as to |
| + * not pass a negative integer value to the request_irq() APIs. |
| + * |
| + * Example: |
| + * int irq = platform_get_irq(pdev, 0); |
| + * if (irq < 0) |
| + * return irq; |
| + * |
| + * Return: IRQ number on success, negative error number on failure. |
| + */ |
| +int platform_get_irq(struct platform_device *dev, unsigned int num) |
| +{ |
| + int ret; |
| + |
| + ret = __platform_get_irq(dev, num); |
| + if (ret < 0 && ret != -EPROBE_DEFER) |
| + dev_err(&dev->dev, "IRQ index %u not found\n", num); |
| + |
| + return ret; |
| +} |
| EXPORT_SYMBOL_GPL(platform_get_irq); |
| |
| /** |
| @@ -204,7 +226,7 @@ int platform_irq_count(struct platform_device *dev) |
| { |
| int ret, nr = 0; |
| |
| - while ((ret = platform_get_irq(dev, nr)) >= 0) |
| + while ((ret = __platform_get_irq(dev, nr)) >= 0) |
| nr++; |
| |
| if (ret == -EPROBE_DEFER) |
| @@ -257,7 +279,11 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name) |
| } |
| |
| r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name); |
| - return r ? r->start : -ENXIO; |
| + if (r) |
| + return r->start; |
| + |
| + dev_err(&dev->dev, "IRQ %s not found\n", name); |
| + return -ENXIO; |
| } |
| EXPORT_SYMBOL_GPL(platform_get_irq_byname); |
| |
| -- |
| 2.7.4 |
| |