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

struct uio_info kpart_info = {
	.name = "kpart",
	.version = "0.1",
	.irq = UIO_IRQ_NONE,
};

static int drv_kpart_probe(struct device *dev);
static int drv_kpart_remove(struct device *dev);
static struct device_driver uio_dummy_driver = {
	.name		= "kpart",
	.bus		= &platform_bus_type,
	.probe		= drv_kpart_probe,
	.remove		= drv_kpart_remove,
};

static int drv_kpart_probe(struct device *dev)
{
	printk("drv_kpart_probe( %p )\n", dev );
	kpart_info.mem[0].addr = (unsigned long)kmalloc(512, GFP_KERNEL);
	if( kpart_info.mem[0].addr==0 )
		return -ENOMEM;
	kpart_info.mem[0].memtype = UIO_MEM_LOGICAL;
	kpart_info.mem[0].size = 512;
	if( uio_register_device(dev,&kpart_info) )
		return -ENODEV;
	return 0;
}

static int drv_kpart_remove(struct device *dev)
{
	uio_unregister_device(&kpart_info);
	return 0;
}

static struct platform_device *uio_dummy_device;
static int __init uio_kpart_init(void)
{
	uio_dummy_device = platform_device_register_simple("kpart", -1,
							   NULL, 0);
	return driver_register(&uio_dummy_driver);
}

static void __exit uio_kpart_exit(void)
{
	platform_device_unregister(uio_dummy_device);
	driver_unregister(&uio_dummy_driver);
}

module_init( uio_kpart_init );
module_exit( uio_kpart_exit );

MODULE_LICENSE("GPL");
/* vim: set ts=4 aw ic sw=4: */
