2011-12-23 12:28:09 +04:00
/*
2012-07-11 16:06:55 +04:00
* sec - irq . c
2011-12-23 12:28:09 +04:00
*
* Copyright ( c ) 2011 Samsung Electronics Co . , Ltd
* http : //www.samsung.com
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*
*/
# include <linux/device.h>
# include <linux/interrupt.h>
# include <linux/irq.h>
2012-07-11 16:08:11 +04:00
# include <linux/regmap.h>
2012-07-11 16:07:16 +04:00
# include <linux/mfd/samsung/core.h>
# include <linux/mfd/samsung/irq.h>
2012-07-11 16:08:11 +04:00
# include <linux/mfd/samsung/s2mps11.h>
2012-07-11 16:07:16 +04:00
# include <linux/mfd/samsung/s5m8763.h>
# include <linux/mfd/samsung/s5m8767.h>
2011-12-23 12:28:09 +04:00
2012-07-11 16:08:11 +04:00
static struct regmap_irq s2mps11_irqs [ ] = {
[ S2MPS11_IRQ_PWRONF ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_PWRONF_MASK ,
} ,
[ S2MPS11_IRQ_PWRONR ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_PWRONR_MASK ,
} ,
[ S2MPS11_IRQ_JIGONBF ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_JIGONBF_MASK ,
} ,
[ S2MPS11_IRQ_JIGONBR ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_JIGONBR_MASK ,
} ,
[ S2MPS11_IRQ_ACOKBF ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_ACOKBF_MASK ,
} ,
[ S2MPS11_IRQ_ACOKBR ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_ACOKBR_MASK ,
} ,
[ S2MPS11_IRQ_PWRON1S ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_PWRON1S_MASK ,
} ,
[ S2MPS11_IRQ_MRB ] = {
. reg_offset = 1 ,
. mask = S2MPS11_IRQ_MRB_MASK ,
} ,
[ S2MPS11_IRQ_RTC60S ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_RTC60S_MASK ,
} ,
[ S2MPS11_IRQ_RTCA1 ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_RTCA1_MASK ,
} ,
[ S2MPS11_IRQ_RTCA2 ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_RTCA2_MASK ,
} ,
[ S2MPS11_IRQ_SMPL ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_SMPL_MASK ,
} ,
[ S2MPS11_IRQ_RTC1S ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_RTC1S_MASK ,
} ,
[ S2MPS11_IRQ_WTSR ] = {
. reg_offset = 2 ,
. mask = S2MPS11_IRQ_WTSR_MASK ,
} ,
[ S2MPS11_IRQ_INT120C ] = {
. reg_offset = 3 ,
. mask = S2MPS11_IRQ_INT120C_MASK ,
} ,
[ S2MPS11_IRQ_INT140C ] = {
. reg_offset = 3 ,
. mask = S2MPS11_IRQ_INT140C_MASK ,
} ,
2011-12-23 12:28:09 +04:00
} ;
2012-07-11 16:08:11 +04:00
static struct regmap_irq s5m8767_irqs [ ] = {
2011-12-23 12:28:09 +04:00
[ S5M8767_IRQ_PWRR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_PWRR_MASK ,
} ,
[ S5M8767_IRQ_PWRF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_PWRF_MASK ,
} ,
[ S5M8767_IRQ_PWR1S ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_PWR1S_MASK ,
} ,
[ S5M8767_IRQ_JIGR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_JIGR_MASK ,
} ,
[ S5M8767_IRQ_JIGF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_JIGF_MASK ,
} ,
[ S5M8767_IRQ_LOWBAT2 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_LOWBAT2_MASK ,
} ,
[ S5M8767_IRQ_LOWBAT1 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_LOWBAT1_MASK ,
} ,
[ S5M8767_IRQ_MRB ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_MRB_MASK ,
} ,
[ S5M8767_IRQ_DVSOK2 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_DVSOK2_MASK ,
} ,
[ S5M8767_IRQ_DVSOK3 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_DVSOK3_MASK ,
} ,
[ S5M8767_IRQ_DVSOK4 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_DVSOK4_MASK ,
} ,
[ S5M8767_IRQ_RTC60S ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_RTC60S_MASK ,
} ,
[ S5M8767_IRQ_RTCA1 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_RTCA1_MASK ,
} ,
[ S5M8767_IRQ_RTCA2 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_RTCA2_MASK ,
} ,
[ S5M8767_IRQ_SMPL ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_SMPL_MASK ,
} ,
[ S5M8767_IRQ_RTC1S ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_RTC1S_MASK ,
} ,
[ S5M8767_IRQ_WTSR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8767_IRQ_WTSR_MASK ,
} ,
} ;
2012-07-11 16:08:11 +04:00
static struct regmap_irq s5m8763_irqs [ ] = {
2011-12-23 12:28:09 +04:00
[ S5M8763_IRQ_DCINF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_DCINF_MASK ,
} ,
[ S5M8763_IRQ_DCINR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_DCINR_MASK ,
} ,
[ S5M8763_IRQ_JIGF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_JIGF_MASK ,
} ,
[ S5M8763_IRQ_JIGR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_JIGR_MASK ,
} ,
[ S5M8763_IRQ_PWRONF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_PWRONF_MASK ,
} ,
[ S5M8763_IRQ_PWRONR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 1 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_PWRONR_MASK ,
} ,
[ S5M8763_IRQ_WTSREVNT ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_WTSREVNT_MASK ,
} ,
[ S5M8763_IRQ_SMPLEVNT ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_SMPLEVNT_MASK ,
} ,
[ S5M8763_IRQ_ALARM1 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_ALARM1_MASK ,
} ,
[ S5M8763_IRQ_ALARM0 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 2 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_ALARM0_MASK ,
} ,
[ S5M8763_IRQ_ONKEY1S ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_ONKEY1S_MASK ,
} ,
[ S5M8763_IRQ_TOPOFFR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_TOPOFFR_MASK ,
} ,
[ S5M8763_IRQ_DCINOVPR ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_DCINOVPR_MASK ,
} ,
[ S5M8763_IRQ_CHGRSTF ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_CHGRSTF_MASK ,
} ,
[ S5M8763_IRQ_DONER ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_DONER_MASK ,
} ,
[ S5M8763_IRQ_CHGFAULT ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 3 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_CHGFAULT_MASK ,
} ,
[ S5M8763_IRQ_LOBAT1 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 4 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_LOBAT1_MASK ,
} ,
[ S5M8763_IRQ_LOBAT2 ] = {
2012-07-11 16:08:11 +04:00
. reg_offset = 4 ,
2011-12-23 12:28:09 +04:00
. mask = S5M8763_IRQ_LOBAT2_MASK ,
} ,
} ;
2012-07-11 16:08:11 +04:00
static struct regmap_irq_chip s2mps11_irq_chip = {
. name = " s2mps11 " ,
. irqs = s2mps11_irqs ,
. num_irqs = ARRAY_SIZE ( s2mps11_irqs ) ,
. num_regs = 3 ,
. status_base = S2MPS11_REG_INT1 ,
. mask_base = S2MPS11_REG_INT1M ,
. ack_base = S2MPS11_REG_INT1 ,
} ;
2011-12-23 12:28:09 +04:00
2012-07-11 16:08:11 +04:00
static struct regmap_irq_chip s5m8767_irq_chip = {
2011-12-23 12:28:09 +04:00
. name = " s5m8767 " ,
2012-07-11 16:08:11 +04:00
. irqs = s5m8767_irqs ,
. num_irqs = ARRAY_SIZE ( s5m8767_irqs ) ,
. num_regs = 3 ,
. status_base = S5M8767_REG_INT1 ,
. mask_base = S5M8767_REG_INT1M ,
. ack_base = S5M8767_REG_INT1 ,
2011-12-23 12:28:09 +04:00
} ;
2012-07-11 16:08:11 +04:00
static struct regmap_irq_chip s5m8763_irq_chip = {
2011-12-23 12:28:09 +04:00
. name = " s5m8763 " ,
2012-07-11 16:08:11 +04:00
. irqs = s5m8763_irqs ,
. num_irqs = ARRAY_SIZE ( s5m8763_irqs ) ,
. num_regs = 4 ,
. status_base = S5M8763_REG_IRQ1 ,
. mask_base = S5M8763_REG_IRQM1 ,
. ack_base = S5M8763_REG_IRQ1 ,
2011-12-23 12:28:09 +04:00
} ;
2012-07-11 16:06:55 +04:00
int sec_irq_init ( struct sec_pmic_dev * sec_pmic )
2011-12-23 12:28:09 +04:00
{
int ret = 0 ;
2012-07-11 16:06:55 +04:00
int type = sec_pmic - > device_type ;
2011-12-23 12:28:09 +04:00
2012-07-11 16:06:55 +04:00
if ( ! sec_pmic - > irq ) {
dev_warn ( sec_pmic - > dev ,
2011-12-23 12:28:09 +04:00
" No interrupt specified, no interrupts \n " ) ;
2012-07-11 16:06:55 +04:00
sec_pmic - > irq_base = 0 ;
2011-12-23 12:28:09 +04:00
return 0 ;
}
switch ( type ) {
case S5M8763X :
2012-07-11 16:08:11 +04:00
ret = regmap_add_irq_chip ( sec_pmic - > regmap , sec_pmic - > irq ,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
sec_pmic - > irq_base , & s5m8763_irq_chip ,
& sec_pmic - > irq_data ) ;
2011-12-23 12:28:09 +04:00
break ;
case S5M8767X :
2012-07-11 16:08:11 +04:00
ret = regmap_add_irq_chip ( sec_pmic - > regmap , sec_pmic - > irq ,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
sec_pmic - > irq_base , & s5m8767_irq_chip ,
& sec_pmic - > irq_data ) ;
2011-12-23 12:28:09 +04:00
break ;
2012-07-11 16:08:11 +04:00
case S2MPS11X :
ret = regmap_add_irq_chip ( sec_pmic - > regmap , sec_pmic - > irq ,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
sec_pmic - > irq_base , & s2mps11_irq_chip ,
& sec_pmic - > irq_data ) ;
2011-12-23 12:28:09 +04:00
break ;
default :
2012-07-11 16:08:11 +04:00
dev_err ( sec_pmic - > dev , " Unknown device type %d \n " ,
sec_pmic - > device_type ) ;
return - EINVAL ;
2011-12-23 12:28:09 +04:00
}
2012-07-11 16:08:11 +04:00
if ( ret ! = 0 ) {
dev_err ( sec_pmic - > dev , " Failed to register IRQ chip: %d \n " , ret ) ;
2012-02-20 19:22:56 +04:00
return ret ;
}
2011-12-23 12:28:09 +04:00
return 0 ;
}
2012-07-11 16:06:55 +04:00
void sec_irq_exit ( struct sec_pmic_dev * sec_pmic )
2011-12-23 12:28:09 +04:00
{
2012-07-11 16:08:11 +04:00
regmap_del_irq_chip ( sec_pmic - > irq , sec_pmic - > irq_data ) ;
2011-12-23 12:28:09 +04:00
}