mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
driver core: platform: Make platform_get_irq_optional() optional
Currently the platform_get_irq_optional() returns an error code even if IRQ resource sumply has not been found. It prevents caller to be error code agnostic in their error handling. Now: ret = platform_get_irq_optional(...); if (ret != -ENXIO) return ret; // respect deferred probe if (ret > 0) ...we get an IRQ... After proposed change: ret = platform_get_irq_optional(...); if (ret < 0) return ret; if (ret > 0) ...we get an IRQ... Reported-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20210331144526.19439-1-andriy.shevchenko@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
318c3e00f1
commit
ed7027fdf4
1 changed files with 34 additions and 21 deletions
|
@ -168,25 +168,7 @@ devm_platform_ioremap_resource_byname(struct platform_device *pdev,
|
||||||
EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource_byname);
|
EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource_byname);
|
||||||
#endif /* CONFIG_HAS_IOMEM */
|
#endif /* CONFIG_HAS_IOMEM */
|
||||||
|
|
||||||
/**
|
static int platform_do_get_irq(struct platform_device *dev, unsigned int num)
|
||||||
* platform_get_irq_optional - get an optional IRQ for a device
|
|
||||||
* @dev: platform device
|
|
||||||
* @num: IRQ number index
|
|
||||||
*
|
|
||||||
* Gets an IRQ for a platform device. Device drivers should check the return
|
|
||||||
* value for errors so as to not pass a negative integer value to the
|
|
||||||
* request_irq() APIs. This is the same as platform_get_irq(), except that it
|
|
||||||
* does not print an error message if an IRQ can not be obtained.
|
|
||||||
*
|
|
||||||
* For example::
|
|
||||||
*
|
|
||||||
* int irq = platform_get_irq_optional(pdev, 0);
|
|
||||||
* if (irq < 0)
|
|
||||||
* return irq;
|
|
||||||
*
|
|
||||||
* Return: non-zero IRQ number on success, negative error number on failure.
|
|
||||||
*/
|
|
||||||
int platform_get_irq_optional(struct platform_device *dev, unsigned int num)
|
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
#ifdef CONFIG_SPARC
|
#ifdef CONFIG_SPARC
|
||||||
|
@ -254,6 +236,37 @@ out:
|
||||||
WARN(ret == 0, "0 is an invalid IRQ number\n");
|
WARN(ret == 0, "0 is an invalid IRQ number\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* platform_get_irq_optional - get an optional IRQ for a device
|
||||||
|
* @dev: platform device
|
||||||
|
* @num: IRQ number index
|
||||||
|
*
|
||||||
|
* Gets an IRQ for a platform device. Device drivers should check the return
|
||||||
|
* value for errors so as to not pass a negative integer value to the
|
||||||
|
* request_irq() APIs. This is the same as platform_get_irq(), except that it
|
||||||
|
* does not print an error message if an IRQ can not be obtained and returns
|
||||||
|
* 0 when IRQ resource has not been found.
|
||||||
|
*
|
||||||
|
* For example::
|
||||||
|
*
|
||||||
|
* int irq = platform_get_irq_optional(pdev, 0);
|
||||||
|
* if (irq < 0)
|
||||||
|
* return irq;
|
||||||
|
* if (irq > 0)
|
||||||
|
* ...we have IRQ line defined...
|
||||||
|
*
|
||||||
|
* Return: non-zero IRQ number on success, negative error number on failure.
|
||||||
|
*/
|
||||||
|
int platform_get_irq_optional(struct platform_device *dev, unsigned int num)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = platform_do_get_irq(dev, num);
|
||||||
|
if (ret == -ENXIO)
|
||||||
|
return 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(platform_get_irq_optional);
|
EXPORT_SYMBOL_GPL(platform_get_irq_optional);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -277,7 +290,7 @@ int platform_get_irq(struct platform_device *dev, unsigned int num)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = platform_get_irq_optional(dev, num);
|
ret = platform_do_get_irq(dev, num);
|
||||||
if (ret < 0 && ret != -EPROBE_DEFER)
|
if (ret < 0 && ret != -EPROBE_DEFER)
|
||||||
dev_err(&dev->dev, "IRQ index %u not found\n", num);
|
dev_err(&dev->dev, "IRQ index %u not found\n", num);
|
||||||
|
|
||||||
|
@ -295,7 +308,7 @@ int platform_irq_count(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
int ret, nr = 0;
|
int ret, nr = 0;
|
||||||
|
|
||||||
while ((ret = platform_get_irq_optional(dev, nr)) >= 0)
|
while ((ret = platform_do_get_irq(dev, nr)) >= 0)
|
||||||
nr++;
|
nr++;
|
||||||
|
|
||||||
if (ret == -EPROBE_DEFER)
|
if (ret == -EPROBE_DEFER)
|
||||||
|
|
Loading…
Add table
Reference in a new issue