/* 
 | 
 * 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 <aaro.koskinen@iki.fi>"); 
 | 
MODULE_LICENSE("GPL"); 
 |