2012-11-10 12:50:25 +04:00
/*
* 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 ;
}
2012-11-24 09:38:25 +04:00
static int retu_pwrbutton_probe ( struct platform_device * pdev )
2012-11-10 12:50:25 +04:00
{
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 ,
2015-05-16 01:55:34 +03:00
NULL , retu_pwrbutton_irq ,
IRQF_ONESHOT ,
2012-11-10 12:50:25 +04:00
" 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 " ) ;