|
@@ -103,24 +103,16 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
int i;
|
|
|
|
|
|
if (pdev->dev.of_node) {
|
|
|
- int irq;
|
|
|
-
|
|
|
/* alloc uioinfo for one device */
|
|
|
uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
|
|
|
if (!uioinfo) {
|
|
|
ret = -ENOMEM;
|
|
|
dev_err(&pdev->dev, "unable to kmalloc\n");
|
|
|
- goto bad2;
|
|
|
+ return ret;
|
|
|
}
|
|
|
uioinfo->name = pdev->dev.of_node->name;
|
|
|
uioinfo->version = "devicetree";
|
|
|
-
|
|
|
/* Multiple IRQs are not supported */
|
|
|
- irq = platform_get_irq(pdev, 0);
|
|
|
- if (irq == -ENXIO)
|
|
|
- uioinfo->irq = UIO_IRQ_NONE;
|
|
|
- else
|
|
|
- uioinfo->irq = irq;
|
|
|
}
|
|
|
|
|
|
if (!uioinfo || !uioinfo->name || !uioinfo->version) {
|
|
@@ -148,12 +140,15 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
|
|
|
if (!uioinfo->irq) {
|
|
|
ret = platform_get_irq(pdev, 0);
|
|
|
- if (ret < 0) {
|
|
|
+ uioinfo->irq = ret;
|
|
|
+ if (ret == -ENXIO && pdev->dev.of_node)
|
|
|
+ uioinfo->irq = UIO_IRQ_NONE;
|
|
|
+ else if (ret < 0) {
|
|
|
dev_err(&pdev->dev, "failed to get IRQ\n");
|
|
|
- goto bad0;
|
|
|
+ goto bad1;
|
|
|
}
|
|
|
- uioinfo->irq = ret;
|
|
|
}
|
|
|
+
|
|
|
uiomem = &uioinfo->mem[0];
|
|
|
|
|
|
for (i = 0; i < pdev->num_resources; ++i) {
|
|
@@ -206,19 +201,19 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
ret = uio_register_device(&pdev->dev, priv->uioinfo);
|
|
|
if (ret) {
|
|
|
dev_err(&pdev->dev, "unable to register uio device\n");
|
|
|
- goto bad1;
|
|
|
+ goto bad2;
|
|
|
}
|
|
|
|
|
|
platform_set_drvdata(pdev, priv);
|
|
|
return 0;
|
|
|
+ bad2:
|
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
|
bad1:
|
|
|
kfree(priv);
|
|
|
- pm_runtime_disable(&pdev->dev);
|
|
|
bad0:
|
|
|
/* kfree uioinfo for OF */
|
|
|
if (pdev->dev.of_node)
|
|
|
kfree(uioinfo);
|
|
|
- bad2:
|
|
|
return ret;
|
|
|
}
|
|
|
|