2009-04-20 10:07:50 +04:00
/**
* twl4030 - pwrbutton . c - TWL4030 Power Button Input Driver
*
* Copyright ( C ) 2008 - 2009 Nokia Corporation
*
* Written by Peter De Schrijver < peter . de - schrijver @ nokia . com >
* Several fixes by Felipe Balbi < felipe . balbi @ nokia . com >
*
* 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 .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <linux/module.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/input.h>
# include <linux/interrupt.h>
# include <linux/platform_device.h>
2009-12-13 22:05:51 +03:00
# include <linux/i2c/twl.h>
2009-04-20 10:07:50 +04:00
# define PWR_PWRON_IRQ (1 << 0)
# define STS_HW_CONDITIONS 0xf
static irqreturn_t powerbutton_irq ( int irq , void * _pwr )
{
struct input_dev * pwr = _pwr ;
int err ;
u8 value ;
2012-11-14 22:10:49 +04:00
err = twl_i2c_read_u8 ( TWL_MODULE_PM_MASTER , & value , STS_HW_CONDITIONS ) ;
2009-04-20 10:07:50 +04:00
if ( ! err ) {
2012-07-30 09:25:51 +04:00
pm_wakeup_event ( pwr - > dev . parent , 0 ) ;
2009-04-20 10:07:50 +04:00
input_report_key ( pwr , KEY_POWER , value & PWR_PWRON_IRQ ) ;
input_sync ( pwr ) ;
} else {
dev_err ( pwr - > dev . parent , " twl4030: i2c error %d while reading "
" TWL4030 PM_MASTER STS_HW_CONDITIONS register \n " , err ) ;
}
return IRQ_HANDLED ;
}
2013-11-20 01:55:12 +04:00
static int twl4030_pwrbutton_probe ( struct platform_device * pdev )
2009-04-20 10:07:50 +04:00
{
struct input_dev * pwr ;
int irq = platform_get_irq ( pdev , 0 ) ;
int err ;
2013-11-20 01:56:18 +04:00
pwr = devm_input_allocate_device ( & pdev - > dev ) ;
2009-04-20 10:07:50 +04:00
if ( ! pwr ) {
2013-11-20 01:53:31 +04:00
dev_err ( & pdev - > dev , " Can't allocate power button \n " ) ;
2009-04-20 10:07:50 +04:00
return - ENOMEM ;
}
pwr - > evbit [ 0 ] = BIT_MASK ( EV_KEY ) ;
pwr - > keybit [ BIT_WORD ( KEY_POWER ) ] = BIT_MASK ( KEY_POWER ) ;
pwr - > name = " twl4030_pwrbutton " ;
pwr - > phys = " twl4030_pwrbutton/input0 " ;
pwr - > dev . parent = & pdev - > dev ;
2013-11-20 01:56:18 +04:00
err = devm_request_threaded_irq ( & pwr - > dev , irq , NULL , powerbutton_irq ,
2009-04-20 10:07:50 +04:00
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING ,
" twl4030_pwrbutton " , pwr ) ;
if ( err < 0 ) {
2013-11-20 01:53:31 +04:00
dev_err ( & pdev - > dev , " Can't get IRQ for pwrbutton: %d \n " , err ) ;
2013-11-20 01:56:18 +04:00
return err ;
2009-04-20 10:07:50 +04:00
}
err = input_register_device ( pwr ) ;
if ( err ) {
2013-11-20 01:53:31 +04:00
dev_err ( & pdev - > dev , " Can't register power button: %d \n " , err ) ;
2013-11-20 01:56:18 +04:00
return err ;
2009-04-20 10:07:50 +04:00
}
platform_set_drvdata ( pdev , pwr ) ;
2014-11-08 02:46:56 +03:00
device_init_wakeup ( & pdev - > dev , true ) ;
2009-04-20 10:07:50 +04:00
return 0 ;
}
2013-11-20 01:55:12 +04:00
# ifdef CONFIG_OF
static const struct of_device_id twl4030_pwrbutton_dt_match_table [ ] = {
{ . compatible = " ti,twl4030-pwrbutton " } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , twl4030_pwrbutton_dt_match_table ) ;
# endif
2010-07-07 20:45:18 +04:00
static struct platform_driver twl4030_pwrbutton_driver = {
2013-11-20 01:55:12 +04:00
. probe = twl4030_pwrbutton_probe ,
2009-04-20 10:07:50 +04:00
. driver = {
. name = " twl4030_pwrbutton " ,
2013-11-20 01:55:12 +04:00
. of_match_table = of_match_ptr ( twl4030_pwrbutton_dt_match_table ) ,
2009-04-20 10:07:50 +04:00
} ,
} ;
2013-11-20 01:55:12 +04:00
module_platform_driver ( twl4030_pwrbutton_driver ) ;
2009-04-20 10:07:50 +04:00
MODULE_ALIAS ( " platform:twl4030_pwrbutton " ) ;
MODULE_DESCRIPTION ( " Triton2 Power Button " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Peter De Schrijver <peter.de-schrijver@nokia.com> " ) ;
MODULE_AUTHOR ( " Felipe Balbi <felipe.balbi@nokia.com> " ) ;