diff options
Diffstat (limited to 'drivers/input/keyboard/ep93xx_keypad.c')
| -rw-r--r-- | drivers/input/keyboard/ep93xx_keypad.c | 78 | 
1 files changed, 28 insertions, 50 deletions
diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c index c8242dd190d..e59876212b8 100644 --- a/drivers/input/keyboard/ep93xx_keypad.c +++ b/drivers/input/keyboard/ep93xx_keypad.c @@ -20,6 +20,7 @@   * flag.   */ +#include <linux/module.h>  #include <linux/platform_device.h>  #include <linux/interrupt.h>  #include <linux/clk.h> @@ -28,7 +29,7 @@  #include <linux/slab.h>  #include <mach/hardware.h> -#include <mach/ep93xx_keypad.h> +#include <linux/platform_data/keypad-ep93xx.h>  /*   * Keypad Interface Register offsets @@ -181,16 +182,10 @@ static void ep93xx_keypad_close(struct input_dev *pdev)  } -#ifdef CONFIG_PM -/* - * NOTE: I don't know if this is correct, or will work on the ep93xx. - * - * None of the existing ep93xx drivers have power management support. - * But, this is basically what the pxa27x_keypad driver does. - */ -static int ep93xx_keypad_suspend(struct platform_device *pdev, -				 pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int ep93xx_keypad_suspend(struct device *dev)  { +	struct platform_device *pdev = to_platform_device(dev);  	struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);  	struct input_dev *input_dev = keypad->input_dev; @@ -209,8 +204,9 @@ static int ep93xx_keypad_suspend(struct platform_device *pdev,  	return 0;  } -static int ep93xx_keypad_resume(struct platform_device *pdev) +static int ep93xx_keypad_resume(struct device *dev)  { +	struct platform_device *pdev = to_platform_device(dev);  	struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);  	struct input_dev *input_dev = keypad->input_dev; @@ -231,12 +227,12 @@ static int ep93xx_keypad_resume(struct platform_device *pdev)  	return 0;  } -#else	/* !CONFIG_PM */ -#define ep93xx_keypad_suspend	NULL -#define ep93xx_keypad_resume	NULL -#endif	/* !CONFIG_PM */ +#endif -static int __devinit ep93xx_keypad_probe(struct platform_device *pdev) +static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, +			 ep93xx_keypad_suspend, ep93xx_keypad_resume); + +static int ep93xx_keypad_probe(struct platform_device *pdev)  {  	struct ep93xx_keypad *keypad;  	const struct matrix_keymap_data *keymap_data; @@ -248,7 +244,7 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev)  	if (!keypad)  		return -ENOMEM; -	keypad->pdata = pdev->dev.platform_data; +	keypad->pdata = dev_get_platdata(&pdev->dev);  	if (!keypad->pdata) {  		err = -EINVAL;  		goto failed_free; @@ -307,22 +303,19 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev)  	input_dev->open = ep93xx_keypad_open;  	input_dev->close = ep93xx_keypad_close;  	input_dev->dev.parent = &pdev->dev; -	input_dev->keycode = keypad->keycodes; -	input_dev->keycodesize = sizeof(keypad->keycodes[0]); -	input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); -	input_set_drvdata(input_dev, keypad); +	err = matrix_keypad_build_keymap(keymap_data, NULL, +					 EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, +					 keypad->keycodes, input_dev); +	if (err) +		goto failed_free_dev; -	input_dev->evbit[0] = BIT_MASK(EV_KEY);  	if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) -		input_dev->evbit[0] |= BIT_MASK(EV_REP); - -	matrix_keypad_build_keymap(keymap_data, 3, -				   input_dev->keycode, input_dev->keybit); -	platform_set_drvdata(pdev, keypad); +		__set_bit(EV_REP, input_dev->evbit); +	input_set_drvdata(input_dev, keypad);  	err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, -			  IRQF_DISABLED, pdev->name, keypad); +			  0, pdev->name, keypad);  	if (err)  		goto failed_free_dev; @@ -330,13 +323,13 @@ static int __devinit ep93xx_keypad_probe(struct platform_device *pdev)  	if (err)  		goto failed_free_irq; +	platform_set_drvdata(pdev, keypad);  	device_init_wakeup(&pdev->dev, 1);  	return 0;  failed_free_irq: -	free_irq(keypad->irq, pdev); -	platform_set_drvdata(pdev, NULL); +	free_irq(keypad->irq, keypad);  failed_free_dev:  	input_free_device(input_dev);  failed_put_clk: @@ -352,14 +345,12 @@ failed_free:  	return err;  } -static int __devexit ep93xx_keypad_remove(struct platform_device *pdev) +static int ep93xx_keypad_remove(struct platform_device *pdev)  {  	struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);  	struct resource *res; -	free_irq(keypad->irq, pdev); - -	platform_set_drvdata(pdev, NULL); +	free_irq(keypad->irq, keypad);  	if (keypad->enabled)  		clk_disable(keypad->clk); @@ -383,25 +374,12 @@ static struct platform_driver ep93xx_keypad_driver = {  	.driver		= {  		.name	= "ep93xx-keypad",  		.owner	= THIS_MODULE, +		.pm	= &ep93xx_keypad_pm_ops,  	},  	.probe		= ep93xx_keypad_probe, -	.remove		= __devexit_p(ep93xx_keypad_remove), -	.suspend	= ep93xx_keypad_suspend, -	.resume		= ep93xx_keypad_resume, +	.remove		= ep93xx_keypad_remove,  }; - -static int __init ep93xx_keypad_init(void) -{ -	return platform_driver_register(&ep93xx_keypad_driver); -} - -static void __exit ep93xx_keypad_exit(void) -{ -	platform_driver_unregister(&ep93xx_keypad_driver); -} - -module_init(ep93xx_keypad_init); -module_exit(ep93xx_keypad_exit); +module_platform_driver(ep93xx_keypad_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("H Hartley Sweeten <hsweeten@visionengravers.com>");  | 
