From patchwork Mon Sep 3 20:23:25 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Aaro Koskinen X-Patchwork-Id: 1400871 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id BC6D1DF2AB for ; Mon, 3 Sep 2012 20:24:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756654Ab2ICUYZ (ORCPT ); Mon, 3 Sep 2012 16:24:25 -0400 Received: from filtteri5.pp.htv.fi ([213.243.153.188]:50551 "EHLO filtteri5.pp.htv.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756624Ab2ICUXb (ORCPT ); Mon, 3 Sep 2012 16:23:31 -0400 Received: from localhost (localhost [127.0.0.1]) by filtteri5.pp.htv.fi (Postfix) with ESMTP id 6BBBA5A67FF; Mon, 3 Sep 2012 23:23:27 +0300 (EEST) X-Virus-Scanned: Debian amavisd-new at pp.htv.fi Received: from smtp4.welho.com ([213.243.153.38]) by localhost (filtteri5.pp.htv.fi [213.243.153.188]) (amavisd-new, port 10024) with ESMTP id XuqocBkZI7dS; Mon, 3 Sep 2012 23:23:27 +0300 (EEST) Received: from blackmetal.bb.dnainternet.fi (212-149-209-232.bb.dnainternet.fi [212.149.209.232]) by smtp4.welho.com (Postfix) with ESMTP id E73AD5BC016; Mon, 3 Sep 2012 23:23:26 +0300 (EEST) From: Aaro Koskinen To: linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org Cc: linux-input@vger.kernel.org Subject: =?UTF-8?q?=5BPATCH=204/4=5D=20input=3A=20misc=3A=20introduce=20retu-pwrbutton?= Date: Mon, 3 Sep 2012 23:23:25 +0300 Message-Id: <1346703805-31598-5-git-send-email-aaro.koskinen@iki.fi> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1346703805-31598-1-git-send-email-aaro.koskinen@iki.fi> References: <1346703805-31598-1-git-send-email-aaro.koskinen@iki.fi> MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org Add Retu power button driver. Cc: linux-input@vger.kernel.org Signed-off-by: Aaro Koskinen --- drivers/input/misc/Kconfig | 10 +++ drivers/input/misc/Makefile | 1 + drivers/input/misc/retu-pwrbutton.c | 127 +++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 0 deletions(-) create mode 100644 drivers/input/misc/retu-pwrbutton.c diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 7c0f1ec..e5be189 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -367,6 +367,16 @@ config INPUT_CM109 To compile this driver as a module, choose M here: the module will be called cm109. +config INPUT_RETU_PWRBUTTON + tristate "Retu Power button Driver" + depends on MFD_RETU + help + Say Y here if you want to enable power key reporting via the + Retu chips found in Nokia Internet Tablets (770, N800, N810). + + To compile this driver as a module, choose M here. The module will + be called retu-pwrbutton. + config INPUT_TWL4030_PWRBUTTON tristate "TWL4030 Power button Driver" depends on TWL4030_CORE diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index 83fe6f5..4fbee0d 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -45,6 +45,7 @@ obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o obj-$(CONFIG_INPUT_POWERMATE) += powermate.o obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o +obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o diff --git a/drivers/input/misc/retu-pwrbutton.c b/drivers/input/misc/retu-pwrbutton.c new file mode 100644 index 0000000..f802d4d --- /dev/null +++ b/drivers/input/misc/retu-pwrbutton.c @@ -0,0 +1,127 @@ +/* + * Retu power button driver. + * + * Copyright (C) 2004-2010 Nokia Corporation + * + * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi. + * Converted to use to use Retu MFD driver 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define RETU_STATUS_PWRONX (1 << 5) + +struct retu_pwrbutton { + struct input_dev *idev; + struct retu_dev *rdev; + struct device *dev; + bool pressed; + int irq; +}; + +static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr) +{ + struct retu_pwrbutton *pwr = _pwr; + bool state; + + state = !(retu_read(pwr->rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX); + + if (pwr->pressed != state) { + input_report_key(pwr->idev, KEY_POWER, state); + input_sync(pwr->idev); + pwr->pressed = state; + } + + return IRQ_HANDLED; +} + +static int __devinit retu_pwrbutton_probe(struct platform_device *pdev) +{ + struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); + struct retu_pwrbutton *pwr; + int ret; + + pwr = kzalloc(sizeof(*pwr), GFP_KERNEL); + if (!pwr) + return -ENOMEM; + + pwr->rdev = rdev; + pwr->dev = &pdev->dev; + pwr->irq = platform_get_irq(pdev, 0); + platform_set_drvdata(pdev, pwr); + + ret = request_threaded_irq(pwr->irq, NULL, retu_pwrbutton_irq, 0, + "retu-pwrbutton", pwr); + if (ret < 0) + goto error_irq; + + pwr->idev = input_allocate_device(); + if (!pwr->idev) { + ret = -ENOMEM; + goto error_input; + } + + pwr->idev->evbit[0] = BIT_MASK(EV_KEY); + pwr->idev->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER); + pwr->idev->name = "retu-pwrbutton"; + + ret = input_register_device(pwr->idev); + if (ret < 0) + goto error_reg; + + return 0; + +error_reg: + input_free_device(pwr->idev); +error_input: + free_irq(pwr->irq, pwr); +error_irq: + kfree(pwr); + return ret; +} + +static int __devexit retu_pwrbutton_remove(struct platform_device *pdev) +{ + struct retu_pwrbutton *pwr = platform_get_drvdata(pdev); + + free_irq(pwr->irq, pwr); + input_unregister_device(pwr->idev); + input_free_device(pwr->idev); + kfree(pwr); + + return 0; +} + +static struct platform_driver retu_pwrbutton_driver = { + .probe = retu_pwrbutton_probe, + .remove = __devexit_p(retu_pwrbutton_remove), + .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 "); +MODULE_LICENSE("GPL");