diff options
Diffstat (limited to 'arch/x86/platform/iris/iris.c')
| -rw-r--r-- | arch/x86/platform/iris/iris.c | 67 | 
1 files changed, 57 insertions, 10 deletions
diff --git a/arch/x86/platform/iris/iris.c b/arch/x86/platform/iris/iris.c index 5917eb56b31..e6cb80f620a 100644 --- a/arch/x86/platform/iris/iris.c +++ b/arch/x86/platform/iris/iris.c @@ -23,6 +23,7 @@  #include <linux/moduleparam.h>  #include <linux/module.h> +#include <linux/platform_device.h>  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/delay.h> @@ -62,29 +63,75 @@ static void iris_power_off(void)   * by reading its input port and seeing whether the read value is   * meaningful.   */ -static int iris_init(void) +static int iris_probe(struct platform_device *pdev)  { -	unsigned char status; -	if (force != 1) { -		printk(KERN_ERR "The force parameter has not been set to 1 so the Iris poweroff handler will not be installed.\n"); -		return -ENODEV; -	} -	status = inb(IRIS_GIO_INPUT); +	unsigned char status = inb(IRIS_GIO_INPUT);  	if (status == IRIS_GIO_NODEV) { -		printk(KERN_ERR "This machine does not seem to be an Iris. Power_off handler not installed.\n"); +		printk(KERN_ERR "This machine does not seem to be an Iris. " +			"Power off handler not installed.\n");  		return -ENODEV;  	}  	old_pm_power_off = pm_power_off;  	pm_power_off = &iris_power_off;  	printk(KERN_INFO "Iris power_off handler installed.\n"); -  	return 0;  } -static void iris_exit(void) +static int iris_remove(struct platform_device *pdev)  {  	pm_power_off = old_pm_power_off;  	printk(KERN_INFO "Iris power_off handler uninstalled.\n"); +	return 0; +} + +static struct platform_driver iris_driver = { +	.driver		= { +		.name   = "iris", +		.owner  = THIS_MODULE, +	}, +	.probe          = iris_probe, +	.remove         = iris_remove, +}; + +static struct resource iris_resources[] = { +	{ +		.start  = IRIS_GIO_BASE, +		.end    = IRIS_GIO_OUTPUT, +		.flags  = IORESOURCE_IO, +		.name   = "address" +	} +}; + +static struct platform_device *iris_device; + +static int iris_init(void) +{ +	int ret; +	if (force != 1) { +		printk(KERN_ERR "The force parameter has not been set to 1." +			" The Iris poweroff handler will not be installed.\n"); +		return -ENODEV; +	} +	ret = platform_driver_register(&iris_driver); +	if (ret < 0) { +		printk(KERN_ERR "Failed to register iris platform driver: %d\n", +			ret); +		return ret; +	} +	iris_device = platform_device_register_simple("iris", (-1), +				iris_resources, ARRAY_SIZE(iris_resources)); +	if (IS_ERR(iris_device)) { +		printk(KERN_ERR "Failed to register iris platform device\n"); +		platform_driver_unregister(&iris_driver); +		return PTR_ERR(iris_device); +	} +	return 0; +} + +static void iris_exit(void) +{ +	platform_device_unregister(iris_device); +	platform_driver_unregister(&iris_driver);  }  module_init(iris_init);  |