Kernel fault with simple UIO interrupt driver in 2.6.30.4

Frank Prepelica Frank.Prepelica at ubidyne.com
Mon Aug 3 23:07:54 EST 2009


Hi all,

due to a new revision of our custimized board, i need to port our current kernel (2.6.24)
to the latest kernel version 2.6.30.4.

Among other things the UIO interrupt driver makes some trouble. The driver runs
smoothly on 2.6.24 but I'll get kernel faults when running in 2.6.30.4.

It's a very simple interrupt driver which will be register for a certain external 
cpu interrupt and informs our application via /dev/uioX when an interrupt occurs.

Is there anything that changed in the uio framework that could cause the
kernel fault with our uio driver?


Our driver looks like follow
<---------------------------------------------------------------------------------
#include <linux/uio_driver.h>
#include <linux/platform_device.h>
#include <linux/module.h>


static irqreturn_t interrupt_handler_irq4(int irq, struct uio_info *dev_info)
{
	return IRQ_HANDLED;
}

static struct uio_info uio_irq4_info = {
	.name = "IRQ4 Kernel Driver",
	.version = "1.0.1",
	.irq = 20,
	.irq_flags =IRQF_DISABLED | IRQF_SHARED | IRQF_TRIGGER_FALLING,
	.handler= interrupt_handler_irq4,
};

static int uio_irq4_probe(struct device *dev)
{
	if (uio_register_device(dev, &uio_irq4_info)) {
		kfree((void *)uio_irq4_info.mem[0].addr);
		return -ENODEV;
	}
	else
	{
		return 0;
	}
}


static int uio_irq4_remove(struct device *dev)
{
	uio_unregister_device(&uio_irq4_info);
	return 0;
}


static void uio_irq4_shutdown(struct device *dev)
{

}


static struct platform_device *uio_irq4_device;

static struct device_driver uio_irq4_driver = {
	.name		= "IRQ4",
	.bus		= &platform_bus_type,
	.probe		= uio_irq4_probe,
	.remove		= uio_irq4_remove,
	.shutdown	= uio_irq4_shutdown,
};

/*
* Main initialization/remove routines
*/
static int __init uio_irq4_init(void)
{
	uio_irq4_device = platform_device_register_simple("IRQ4", -1,
							   NULL, 0);
	if (IS_ERR(uio_irq4_device))
		return PTR_ERR(uio_irq4_device);

	return driver_register(&uio_irq4_driver);
}

static void __exit uio_irq4_exit(void)
{
	platform_device_unregister(uio_irq4_device);
	driver_unregister(&uio_irq4_driver);
}


module_init(uio_irq4_init);
module_exit(uio_irq4_exit);


MODULE_LICENSE("tbd");
MODULE_AUTHOR("Frank Prepelica, Ubidyne GmbH");
MODULE_DESCRIPTION("IRQ4 Interrupt Handler - CPLD Interrupts");
<---------------------------------------------------------------------------------



Any help is highly appreciated!

Kind Regards

Frank Prepelica
Software Design Engineer

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

Phone:             +49 731 88 00 71 58
Fax:                 +49 731 88 00 71 99
Email:              frank.prepelica at ubidyne.com
Homepage:       www.ubidyne.com
 
Registered office: Ulm
District court of Ulm: HRB 5295
Managing Directors:
Dipl. Ing. Ken Hawk
Dipl. Ing. Beat Müller
Dipl. Ing. Mike Levis



More information about the Linuxppc-dev mailing list