lkml.org 
[lkml]   [2009]   [Jun]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 1/2] uio/pdrv_genirq: Refactor probe routine to expose a generic part
    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 <w.sang@pengutronix.de>
    Cc: Magnus Damm <magnus.damm@gmail.com>
    Cc: Hans J. Koch <hjk@linutronix.de>
    Cc: Greg KH <gregkh@suse.de>
    ---
    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


    \
     
     \ /
      Last update: 2009-06-12 02:07    [W:0.027 / U:0.320 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site