mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.3 KiB
92 lines
2.3 KiB
/* |
|
* Retu power button driver. |
|
* |
|
* Copyright (C) 2004-2010 Nokia Corporation |
|
* |
|
* Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi. |
|
* Rewritten by Aaro Koskinen. |
|
* |
|
* This file is subject to the terms and conditions of the GNU General |
|
* Public License. See the file "COPYING" in the main directory of this |
|
* archive for more details. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
*/ |
|
|
|
#include <linux/irq.h> |
|
#include <linux/slab.h> |
|
#include <linux/errno.h> |
|
#include <linux/input.h> |
|
#include <linux/kernel.h> |
|
#include <linux/module.h> |
|
#include <linux/mfd/retu.h> |
|
#include <linux/interrupt.h> |
|
#include <linux/platform_device.h> |
|
|
|
#define RETU_STATUS_PWRONX (1 << 5) |
|
|
|
static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr) |
|
{ |
|
struct input_dev *idev = _pwr; |
|
struct retu_dev *rdev = input_get_drvdata(idev); |
|
bool state; |
|
|
|
state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX); |
|
input_report_key(idev, KEY_POWER, state); |
|
input_sync(idev); |
|
|
|
return IRQ_HANDLED; |
|
} |
|
|
|
static int retu_pwrbutton_probe(struct platform_device *pdev) |
|
{ |
|
struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); |
|
struct input_dev *idev; |
|
int irq; |
|
int error; |
|
|
|
irq = platform_get_irq(pdev, 0); |
|
if (irq < 0) |
|
return irq; |
|
|
|
idev = devm_input_allocate_device(&pdev->dev); |
|
if (!idev) |
|
return -ENOMEM; |
|
|
|
idev->name = "retu-pwrbutton"; |
|
idev->dev.parent = &pdev->dev; |
|
|
|
input_set_capability(idev, EV_KEY, KEY_POWER); |
|
input_set_drvdata(idev, rdev); |
|
|
|
error = devm_request_threaded_irq(&pdev->dev, irq, |
|
NULL, retu_pwrbutton_irq, |
|
IRQF_ONESHOT, |
|
"retu-pwrbutton", idev); |
|
if (error) |
|
return error; |
|
|
|
error = input_register_device(idev); |
|
if (error) |
|
return error; |
|
|
|
return 0; |
|
} |
|
|
|
static struct platform_driver retu_pwrbutton_driver = { |
|
.probe = retu_pwrbutton_probe, |
|
.driver = { |
|
.name = "retu-pwrbutton", |
|
}, |
|
}; |
|
module_platform_driver(retu_pwrbutton_driver); |
|
|
|
MODULE_ALIAS("platform:retu-pwrbutton"); |
|
MODULE_DESCRIPTION("Retu Power Button"); |
|
MODULE_AUTHOR("Ari Saastamoinen"); |
|
MODULE_AUTHOR("Felipe Balbi"); |
|
MODULE_AUTHOR("Aaro Koskinen <[email protected]>"); |
|
MODULE_LICENSE("GPL");
|
|
|