Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d884b97 authored by Thomas Viehweger's avatar Thomas Viehweger Committed by Greg Kroah-Hartman
Browse files

staging: lirc: fix for "lirc_dev: lirc_register_driver: driver pointer must be not NULL!"



Unable to load the module lirc_parallel without the attached patch.

Signed-off-by: default avatarThomas Viehweger <patchesThomas.Vie@web.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8590a031
Loading
Loading
Loading
Loading
+68 −4
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@

#include <linux/poll.h>
#include <linux/parport.h>
#include <linux/platform_device.h>

#include <media/lirc.h>
#include <media/lirc_dev.h>
@@ -580,6 +581,40 @@ static struct lirc_driver driver = {
       .owner		= THIS_MODULE,
};

static struct platform_device *lirc_parallel_dev;

static int __devinit lirc_parallel_probe(struct platform_device *dev)
{
	return 0;
}

static int __devexit lirc_parallel_remove(struct platform_device *dev)
{
	return 0;
}

static int lirc_parallel_suspend(struct platform_device *dev,
                                 pm_message_t state)
{
	return 0;
}

static int lirc_parallel_resume(struct platform_device *dev)
{
	return 0;
}

static struct platform_driver lirc_parallel_driver = {
	.probe	= lirc_parallel_probe,
	.remove	= __devexit_p(lirc_parallel_remove),
	.suspend	= lirc_parallel_suspend,
	.resume	= lirc_parallel_resume,
	.driver	= {
		.name	= LIRC_DRIVER_NAME,
		.owner	= THIS_MODULE,
	},
};

static int pf(void *handle);
static void kf(void *handle);

@@ -608,11 +643,30 @@ static void kf(void *handle)

static int __init lirc_parallel_init(void)
{
	int result;

	result = platform_driver_register(&lirc_parallel_driver);
	if (result) {
		printk("platform_driver_register returned %d\n", result);
		return result;
	}

	lirc_parallel_dev = platform_device_alloc(LIRC_DRIVER_NAME, 0);
	if (!lirc_parallel_dev) {
		result = -ENOMEM;
		goto exit_driver_unregister;
	}

	result = platform_device_add(lirc_parallel_dev);
	if (result)
		goto exit_device_put;

	pport = parport_find_base(io);
	if (pport == NULL) {
		printk(KERN_NOTICE "%s: no port at %x found\n",
		       LIRC_DRIVER_NAME, io);
		return -ENXIO;
		result = -ENXIO;
		goto exit_device_put;
	}
	ppdevice = parport_register_device(pport, LIRC_DRIVER_NAME,
					   pf, kf, irq_handler, 0, NULL);
@@ -620,7 +674,8 @@ static int __init lirc_parallel_init(void)
	if (ppdevice == NULL) {
		printk(KERN_NOTICE "%s: parport_register_device() failed\n",
		       LIRC_DRIVER_NAME);
		return -ENXIO;
		result = -ENXIO;
		goto exit_device_put;
	}
	if (parport_claim(ppdevice) != 0)
		goto skip_init;
@@ -638,7 +693,8 @@ static int __init lirc_parallel_init(void)
		is_claimed = 0;
		parport_release(pport);
		parport_unregister_device(ppdevice);
		return -EIO;
		result = -EIO;
		goto exit_device_put;
	}

#endif
@@ -649,16 +705,24 @@ static int __init lirc_parallel_init(void)
	is_claimed = 0;
	parport_release(ppdevice);
 skip_init:
	driver.dev = &lirc_parallel_dev->dev;
	driver.minor = lirc_register_driver(&driver);
	if (driver.minor < 0) {
		printk(KERN_NOTICE "%s: register_chrdev() failed\n",
		       LIRC_DRIVER_NAME);
		parport_unregister_device(ppdevice);
		return -EIO;
		result = -EIO;
		goto exit_device_put;
	}
	printk(KERN_INFO "%s: installed using port 0x%04x irq %d\n",
	       LIRC_DRIVER_NAME, io, irq);
	return 0;

exit_device_put:
	platform_device_put(lirc_parallel_dev);
exit_driver_unregister:
	platform_driver_unregister(&lirc_parallel_driver);
	return result;
}

static void __exit lirc_parallel_exit(void)