|
@@ -112,11 +112,11 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
|
|
|
if (pdev->dev.of_node) {
|
|
|
/* alloc uioinfo for one device */
|
|
|
- uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
|
|
|
+ uioinfo = devm_kzalloc(&pdev->dev, sizeof(*uioinfo),
|
|
|
+ GFP_KERNEL);
|
|
|
if (!uioinfo) {
|
|
|
- ret = -ENOMEM;
|
|
|
dev_err(&pdev->dev, "unable to kmalloc\n");
|
|
|
- return ret;
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
uioinfo->name = pdev->dev.of_node->name;
|
|
|
uioinfo->version = "devicetree";
|
|
@@ -125,20 +125,19 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
|
|
|
if (!uioinfo || !uioinfo->name || !uioinfo->version) {
|
|
|
dev_err(&pdev->dev, "missing platform_data\n");
|
|
|
- goto bad0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
if (uioinfo->handler || uioinfo->irqcontrol ||
|
|
|
uioinfo->irq_flags & IRQF_SHARED) {
|
|
|
dev_err(&pdev->dev, "interrupt configuration error\n");
|
|
|
- goto bad0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
|
|
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
|
|
if (!priv) {
|
|
|
- ret = -ENOMEM;
|
|
|
dev_err(&pdev->dev, "unable to kmalloc\n");
|
|
|
- goto bad0;
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
priv->uioinfo = uioinfo;
|
|
@@ -153,7 +152,7 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
|
|
uioinfo->irq = UIO_IRQ_NONE;
|
|
|
else if (ret < 0) {
|
|
|
dev_err(&pdev->dev, "failed to get IRQ\n");
|
|
|
- goto bad1;
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -209,20 +208,12 @@ 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 bad2;
|
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
platform_set_drvdata(pdev, priv);
|
|
|
return 0;
|
|
|
- bad2:
|
|
|
- pm_runtime_disable(&pdev->dev);
|
|
|
- bad1:
|
|
|
- kfree(priv);
|
|
|
- bad0:
|
|
|
- /* kfree uioinfo for OF */
|
|
|
- if (pdev->dev.of_node)
|
|
|
- kfree(uioinfo);
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
static int uio_pdrv_genirq_remove(struct platform_device *pdev)
|
|
@@ -235,11 +226,6 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev)
|
|
|
priv->uioinfo->handler = NULL;
|
|
|
priv->uioinfo->irqcontrol = NULL;
|
|
|
|
|
|
- /* kfree uioinfo for OF */
|
|
|
- if (pdev->dev.of_node)
|
|
|
- kfree(priv->uioinfo);
|
|
|
-
|
|
|
- kfree(priv);
|
|
|
return 0;
|
|
|
}
|
|
|
|