1544a46c9SAaro Koskinen /*
2544a46c9SAaro Koskinen  * Retu power button driver.
3544a46c9SAaro Koskinen  *
4544a46c9SAaro Koskinen  * Copyright (C) 2004-2010 Nokia Corporation
5544a46c9SAaro Koskinen  *
6544a46c9SAaro Koskinen  * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi.
7544a46c9SAaro Koskinen  * Rewritten by Aaro Koskinen.
8544a46c9SAaro Koskinen  *
9544a46c9SAaro Koskinen  * This file is subject to the terms and conditions of the GNU General
10544a46c9SAaro Koskinen  * Public License. See the file "COPYING" in the main directory of this
11544a46c9SAaro Koskinen  * archive for more details.
12544a46c9SAaro Koskinen  *
13544a46c9SAaro Koskinen  * This program is distributed in the hope that it will be useful,
14544a46c9SAaro Koskinen  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15544a46c9SAaro Koskinen  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16544a46c9SAaro Koskinen  * GNU General Public License for more details.
17544a46c9SAaro Koskinen  */
18544a46c9SAaro Koskinen 
19544a46c9SAaro Koskinen #include <linux/irq.h>
20544a46c9SAaro Koskinen #include <linux/slab.h>
21544a46c9SAaro Koskinen #include <linux/errno.h>
22544a46c9SAaro Koskinen #include <linux/input.h>
23544a46c9SAaro Koskinen #include <linux/kernel.h>
24544a46c9SAaro Koskinen #include <linux/module.h>
25544a46c9SAaro Koskinen #include <linux/mfd/retu.h>
26544a46c9SAaro Koskinen #include <linux/interrupt.h>
27544a46c9SAaro Koskinen #include <linux/platform_device.h>
28544a46c9SAaro Koskinen 
29544a46c9SAaro Koskinen #define RETU_STATUS_PWRONX (1 << 5)
30544a46c9SAaro Koskinen 
retu_pwrbutton_irq(int irq,void * _pwr)31544a46c9SAaro Koskinen static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr)
32544a46c9SAaro Koskinen {
33544a46c9SAaro Koskinen 	struct input_dev *idev = _pwr;
34544a46c9SAaro Koskinen 	struct retu_dev *rdev = input_get_drvdata(idev);
35544a46c9SAaro Koskinen 	bool state;
36544a46c9SAaro Koskinen 
37544a46c9SAaro Koskinen 	state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX);
38544a46c9SAaro Koskinen 	input_report_key(idev, KEY_POWER, state);
39544a46c9SAaro Koskinen 	input_sync(idev);
40544a46c9SAaro Koskinen 
41544a46c9SAaro Koskinen 	return IRQ_HANDLED;
42544a46c9SAaro Koskinen }
43544a46c9SAaro Koskinen 
retu_pwrbutton_probe(struct platform_device * pdev)445298cc4cSBill Pemberton static int retu_pwrbutton_probe(struct platform_device *pdev)
45544a46c9SAaro Koskinen {
46544a46c9SAaro Koskinen 	struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent);
47544a46c9SAaro Koskinen 	struct input_dev *idev;
48544a46c9SAaro Koskinen 	int irq;
49544a46c9SAaro Koskinen 	int error;
50544a46c9SAaro Koskinen 
51544a46c9SAaro Koskinen 	irq = platform_get_irq(pdev, 0);
52544a46c9SAaro Koskinen 	if (irq < 0)
53544a46c9SAaro Koskinen 		return irq;
54544a46c9SAaro Koskinen 
55544a46c9SAaro Koskinen 	idev = devm_input_allocate_device(&pdev->dev);
56544a46c9SAaro Koskinen 	if (!idev)
57544a46c9SAaro Koskinen 		return -ENOMEM;
58544a46c9SAaro Koskinen 
59544a46c9SAaro Koskinen 	idev->name = "retu-pwrbutton";
60544a46c9SAaro Koskinen 	idev->dev.parent = &pdev->dev;
61544a46c9SAaro Koskinen 
62544a46c9SAaro Koskinen 	input_set_capability(idev, EV_KEY, KEY_POWER);
63544a46c9SAaro Koskinen 	input_set_drvdata(idev, rdev);
64544a46c9SAaro Koskinen 
65544a46c9SAaro Koskinen 	error = devm_request_threaded_irq(&pdev->dev, irq,
666b36d8f6SFabio Estevam 					  NULL, retu_pwrbutton_irq,
676b36d8f6SFabio Estevam 					  IRQF_ONESHOT,
68544a46c9SAaro Koskinen 					  "retu-pwrbutton", idev);
69544a46c9SAaro Koskinen 	if (error)
70544a46c9SAaro Koskinen 		return error;
71544a46c9SAaro Koskinen 
72544a46c9SAaro Koskinen 	error = input_register_device(idev);
73544a46c9SAaro Koskinen 	if (error)
74544a46c9SAaro Koskinen 		return error;
75544a46c9SAaro Koskinen 
76544a46c9SAaro Koskinen 	return 0;
77544a46c9SAaro Koskinen }
78544a46c9SAaro Koskinen 
79544a46c9SAaro Koskinen static struct platform_driver retu_pwrbutton_driver = {
80544a46c9SAaro Koskinen 	.probe		= retu_pwrbutton_probe,
81544a46c9SAaro Koskinen 	.driver		= {
82544a46c9SAaro Koskinen 		.name	= "retu-pwrbutton",
83544a46c9SAaro Koskinen 	},
84544a46c9SAaro Koskinen };
85544a46c9SAaro Koskinen module_platform_driver(retu_pwrbutton_driver);
86544a46c9SAaro Koskinen 
87544a46c9SAaro Koskinen MODULE_ALIAS("platform:retu-pwrbutton");
88544a46c9SAaro Koskinen MODULE_DESCRIPTION("Retu Power Button");
89544a46c9SAaro Koskinen MODULE_AUTHOR("Ari Saastamoinen");
90544a46c9SAaro Koskinen MODULE_AUTHOR("Felipe Balbi");
91544a46c9SAaro Koskinen MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>");
92544a46c9SAaro Koskinen MODULE_LICENSE("GPL");
93