Hi everbody,

I've got an custom uio interrupt driver. The driver will be registered
as platfrom driver.

static int __init uio_irq3_init(void)
{
   return platform_driver_register(&uio_irq3_driver);
}

After starting the kernel the driver is registered under
/sys/bus/platform/drivers. (I guess this is supposed to happen)
BUT as I can see the uio_irq3_probe() function isn't called and
therefore the driver will not be registered to the
UIO subsystem! (there are no devices in /sys/class/)

What went wrong? Which process is responsible for calling the probe
function? 

I also tried to compile the uio drivers which are provided by the kernel
itself. But after starting the kernel not one of these drivers appears
in /sys/class/ too! 

Can anybody please tell what I am doing wrong? Pls see below, too!

Thanks in advance!
Kind regrads

Frank Prepelica
Software Design Engineer

Ubidyne GmbH
Lise-Meitner-Str.-14
89081 Ulm - Germany


Here is the code for the driver if needed!
<------- snip

#include <linux/uio_driver.h>
#include <linux/platform_device.h>
#include <linux/module.h>


struct uio_pdrv_irq3 {
        struct uio_info *uioinfo;
        spinlock_t lock;
        unsigned long flags;
};


static irqreturn_t interrupt_handler_irq3(int irq, struct uio_info
*dev_info)
{
        eturn IRQ_HANDLED;
}


static int uio_irq3_irqcontrol(struct uio_info *dev_info, s32 irq_on)
{
    printk("IRQCONTROL");
    return 0;
}


static int uio_irq3_probe(struct platform_device *pdev)
{
        struct uio_info *uioinfo = pdev->dev.platform_data;
        struct uio_pdrv_irq3 *priv;
        int ret = -EINVAL;    
    
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv) {
                ret = -ENOMEM;
                dev_err(&pdev->dev, "unable to kmalloc\n");
                goto bad0;
        }    
    
    priv->uioinfo = uioinfo;
    priv->flags = 0;
    uioinfo->irq_flags |= IRQF_DISABLED | IRQF_TRIGGER_FALLING;
    uioinfo->irq = 19;
    uioinfo->handler = interrupt_handler_irq3;
    uioinfo->irqcontrol = uio_irq3_irqcontrol;
    uioinfo->priv = priv;

    uio_register_device(&pdev->dev, priv->uioinfo);
        return -ENODEV;
    
        platform_set_drvdata(pdev, priv);
        return 0;    
    
 bad0:
        return ret;    
}

static int uio_irq3_remove(struct platform_device *pdev)
{
    struct uio_pdrv_irq3 *priv = platform_get_drvdata(pdev);
        uio_unregister_device(priv->uioinfo);
        return 0;
}


static struct platform_driver uio_irq3_driver = {
        .probe          = uio_irq3_probe,
        .remove         = uio_irq3_remove,
        .driver = {
        .name = "IRQ3",
        .owner = THIS_MODULE,
    },
};

static int __init uio_irq3_init(void)
{
        return platform_driver_register(&uio_irq3_driver);
}

static void __exit uio_irq3_exit(void)
{
        platform_device_unregister(&uio_irq3_driver);
}


module_init(uio_irq3_init);
module_exit(uio_irq3_exit);


MODULE_LICENSE("tbd");
MODULE_AUTHOR("tbd");
MODULE_DESCRIPTION("IRQ3 Interrupt Handler - CPLD Interrupts");

<------- snap
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to