uio driver cannot be registered to uio subsystem

Frank Prepelica Frank.Prepelica at ubidyne.com
Thu Aug 6 17:56:06 EST 2009

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

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
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

static int uio_irq3_irqcontrol(struct uio_info *dev_info, s32 irq_on)
    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;    
	return ret;    

static int uio_irq3_remove(struct platform_device *pdev)
    struct uio_pdrv_irq3 *priv = platform_get_drvdata(pdev);
	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)


MODULE_DESCRIPTION("IRQ3 Interrupt Handler - CPLD Interrupts");

<------- snap

More information about the Linuxppc-dev mailing list