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