This patch refactors the probe routine, so that an of-version of a similiar
driver can pick it up later.

Signed-off-by: Wolfram Sang <[email protected]>
Cc: Magnus Damm <[email protected]>
Cc: Hans J. Koch <[email protected]>
Cc: Greg KH <[email protected]>
---
 drivers/uio/uio_pdrv_genirq.c   |   60 ++++++++++++++++++++------------------
 include/linux/uio_pdrv_genirq.h |   13 ++++++++
 2 files changed, 45 insertions(+), 28 deletions(-)
 create mode 100644 include/linux/uio_pdrv_genirq.h

diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c
index 3f06818..8f8a0f9 100644
--- a/drivers/uio/uio_pdrv_genirq.c
+++ b/drivers/uio/uio_pdrv_genirq.c
@@ -20,15 +20,10 @@
 #include <linux/bitops.h>
 #include <linux/interrupt.h>
 #include <linux/stringify.h>
+#include <linux/uio_pdrv_genirq.h>
 
 #define DRIVER_NAME "uio_pdrv_genirq"
 
-struct uio_pdrv_genirq_platdata {
-       struct uio_info *uioinfo;
-       spinlock_t lock;
-       unsigned long flags;
-};
-
 static irqreturn_t uio_pdrv_genirq_handler(int irq, struct uio_info *dev_info)
 {
        struct uio_pdrv_genirq_platdata *priv = dev_info->priv;
@@ -68,29 +63,18 @@ static int uio_pdrv_genirq_irqcontrol(struct uio_info 
*dev_info, s32 irq_on)
        return 0;
 }
 
-static int uio_pdrv_genirq_probe(struct platform_device *pdev)
+int __uio_pdrv_genirq_probe(struct device *dev, struct uio_info *uioinfo,
+               struct resource *resources, unsigned int num_resources)
 {
-       struct uio_info *uioinfo = pdev->dev.platform_data;
        struct uio_pdrv_genirq_platdata *priv;
        struct uio_mem *uiomem;
-       int ret = -EINVAL;
-       int i;
-
-       if (!uioinfo || !uioinfo->name || !uioinfo->version) {
-               dev_err(&pdev->dev, "missing platform_data\n");
-               goto bad0;
-       }
-
-       if (uioinfo->handler || uioinfo->irqcontrol ||
-           uioinfo->irq_flags & IRQF_SHARED) {
-               dev_err(&pdev->dev, "interrupt configuration error\n");
-               goto bad0;
-       }
+       unsigned int i;
+       int ret;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv) {
                ret = -ENOMEM;
-               dev_err(&pdev->dev, "unable to kmalloc\n");
+               dev_err(dev, "unable to kmalloc\n");
                goto bad0;
        }
 
@@ -100,14 +84,14 @@ static int uio_pdrv_genirq_probe(struct platform_device 
*pdev)
 
        uiomem = &uioinfo->mem[0];
 
-       for (i = 0; i < pdev->num_resources; ++i) {
-               struct resource *r = &pdev->resource[i];
+       for (i = 0; i < num_resources; ++i) {
+               struct resource *r = resources + i;
 
                if (r->flags != IORESOURCE_MEM)
                        continue;
 
                if (uiomem >= &uioinfo->mem[MAX_UIO_MAPS]) {
-                       dev_warn(&pdev->dev, "device has more than "
+                       dev_warn(dev, "device has more than "
                                        __stringify(MAX_UIO_MAPS)
                                        " I/O memory resources.\n");
                        break;
@@ -138,19 +122,39 @@ static int uio_pdrv_genirq_probe(struct platform_device 
*pdev)
        uioinfo->irqcontrol = uio_pdrv_genirq_irqcontrol;
        uioinfo->priv = priv;
 
-       ret = uio_register_device(&pdev->dev, priv->uioinfo);
+       ret = uio_register_device(dev, priv->uioinfo);
        if (ret) {
-               dev_err(&pdev->dev, "unable to register uio device\n");
+               dev_err(dev, "unable to register uio device\n");
                goto bad1;
        }
 
-       platform_set_drvdata(pdev, priv);
+       dev_set_drvdata(dev, priv);
        return 0;
  bad1:
        kfree(priv);
  bad0:
        return ret;
 }
+EXPORT_SYMBOL_GPL(__uio_pdrv_genirq_probe);
+
+static int uio_pdrv_genirq_probe(struct platform_device *pdev)
+{
+       struct uio_info *uioinfo = pdev->dev.platform_data;
+
+       if (!uioinfo || !uioinfo->name || !uioinfo->version) {
+               dev_err(&pdev->dev, "missing platform_data\n");
+               return -EINVAL;
+       }
+
+       if (uioinfo->handler || uioinfo->irqcontrol ||
+           uioinfo->irq_flags & IRQF_SHARED) {
+               dev_err(&pdev->dev, "interrupt configuration error\n");
+               return -EINVAL;
+       }
+
+       return __uio_pdrv_genirq_probe(&pdev->dev, uioinfo, pdev->resource,
+                       pdev->num_resources);
+}
 
 static int uio_pdrv_genirq_remove(struct platform_device *pdev)
 {
diff --git a/include/linux/uio_pdrv_genirq.h b/include/linux/uio_pdrv_genirq.h
new file mode 100644
index 0000000..a410390
--- /dev/null
+++ b/include/linux/uio_pdrv_genirq.h
@@ -0,0 +1,13 @@
+#ifndef _LINUX_UIO_PDRV_GENIRQ_H
+#define _LINUX_UIO_PDRV_GENIRQ_H
+
+struct uio_pdrv_genirq_platdata {
+       struct uio_info *uioinfo;
+       spinlock_t lock;
+       unsigned long flags;
+};
+
+extern int __uio_pdrv_genirq_probe(struct device *dev, struct uio_info 
*uioinfo,
+       struct resource *resources, unsigned int num_resources);
+
+#endif
-- 
1.6.3.1

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to