2020-04-23 19:24:52 +08:00
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright ( c ) 2020 MediaTek Inc .
*
* Author : Gene Chen < gene_chen @ richtek . com >
*/
2021-05-18 01:33:05 +08:00
# include <linux/crc8.h>
2020-04-23 19:24:52 +08:00
# include <linux/i2c.h>
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/kernel.h>
# include <linux/mfd/core.h>
# include <linux/module.h>
2021-05-18 01:33:05 +08:00
# include <linux/regmap.h>
# include <linux/slab.h>
2020-04-23 19:24:52 +08:00
# include <linux/mfd/mt6360.h>
/* reg 0 -> 0 ~ 7 */
2021-05-18 01:33:06 +08:00
# define MT6360_CHG_TREG_EVT 4
# define MT6360_CHG_AICR_EVT 5
# define MT6360_CHG_MIVR_EVT 6
# define MT6360_PWR_RDY_EVT 7
2020-04-23 19:24:52 +08:00
/* REG 1 -> 8 ~ 15 */
2021-05-18 01:33:06 +08:00
# define MT6360_CHG_BATSYSUV_EVT 9
# define MT6360_FLED_CHG_VINOVP_EVT 11
# define MT6360_CHG_VSYSUV_EVT 12
# define MT6360_CHG_VSYSOV_EVT 13
# define MT6360_CHG_VBATOV_EVT 14
# define MT6360_CHG_VBUSOV_EVT 15
2020-04-23 19:24:52 +08:00
/* REG 2 -> 16 ~ 23 */
/* REG 3 -> 24 ~ 31 */
2021-05-18 01:33:06 +08:00
# define MT6360_WD_PMU_DET 25
# define MT6360_WD_PMU_DONE 26
# define MT6360_CHG_TMRI 27
# define MT6360_CHG_ADPBADI 29
# define MT6360_CHG_RVPI 30
# define MT6360_OTPI 31
2020-04-23 19:24:52 +08:00
/* REG 4 -> 32 ~ 39 */
2021-05-18 01:33:06 +08:00
# define MT6360_CHG_AICCMEASL 32
# define MT6360_CHGDET_DONEI 34
# define MT6360_WDTMRI 35
# define MT6360_SSFINISHI 36
# define MT6360_CHG_RECHGI 37
# define MT6360_CHG_TERMI 38
# define MT6360_CHG_IEOCI 39
2020-04-23 19:24:52 +08:00
/* REG 5 -> 40 ~ 47 */
2021-05-18 01:33:06 +08:00
# define MT6360_PUMPX_DONEI 40
# define MT6360_BAT_OVP_ADC_EVT 41
# define MT6360_TYPEC_OTP_EVT 42
# define MT6360_ADC_WAKEUP_EVT 43
# define MT6360_ADC_DONEI 44
# define MT6360_BST_BATUVI 45
# define MT6360_BST_VBUSOVI 46
# define MT6360_BST_OLPI 47
2020-04-23 19:24:52 +08:00
/* REG 6 -> 48 ~ 55 */
2021-05-18 01:33:06 +08:00
# define MT6360_ATTACH_I 48
# define MT6360_DETACH_I 49
# define MT6360_QC30_STPDONE 51
# define MT6360_QC_VBUSDET_DONE 52
# define MT6360_HVDCP_DET 53
# define MT6360_CHGDETI 54
# define MT6360_DCDTI 55
2020-04-23 19:24:52 +08:00
/* REG 7 -> 56 ~ 63 */
2021-05-18 01:33:06 +08:00
# define MT6360_FOD_DONE_EVT 56
# define MT6360_FOD_OV_EVT 57
# define MT6360_CHRDET_UVP_EVT 58
# define MT6360_CHRDET_OVP_EVT 59
# define MT6360_CHRDET_EXT_EVT 60
# define MT6360_FOD_LR_EVT 61
# define MT6360_FOD_HR_EVT 62
# define MT6360_FOD_DISCHG_FAIL_EVT 63
2020-04-23 19:24:52 +08:00
/* REG 8 -> 64 ~ 71 */
2021-05-18 01:33:06 +08:00
# define MT6360_USBID_EVT 64
# define MT6360_APWDTRST_EVT 65
# define MT6360_EN_EVT 66
# define MT6360_QONB_RST_EVT 67
# define MT6360_MRSTB_EVT 68
# define MT6360_OTP_EVT 69
# define MT6360_VDDAOV_EVT 70
# define MT6360_SYSUV_EVT 71
2020-04-23 19:24:52 +08:00
/* REG 9 -> 72 ~ 79 */
2021-05-18 01:33:06 +08:00
# define MT6360_FLED_STRBPIN_EVT 72
# define MT6360_FLED_TORPIN_EVT 73
# define MT6360_FLED_TX_EVT 74
# define MT6360_FLED_LVF_EVT 75
# define MT6360_FLED2_SHORT_EVT 78
# define MT6360_FLED1_SHORT_EVT 79
2020-04-23 19:24:52 +08:00
/* REG 10 -> 80 ~ 87 */
2021-05-18 01:33:06 +08:00
# define MT6360_FLED2_STRB_EVT 80
# define MT6360_FLED1_STRB_EVT 81
# define MT6360_FLED2_STRB_TO_EVT 82
# define MT6360_FLED1_STRB_TO_EVT 83
# define MT6360_FLED2_TOR_EVT 84
# define MT6360_FLED1_TOR_EVT 85
2020-04-23 19:24:52 +08:00
/* REG 11 -> 88 ~ 95 */
/* REG 12 -> 96 ~ 103 */
2021-05-18 01:33:06 +08:00
# define MT6360_BUCK1_PGB_EVT 96
# define MT6360_BUCK1_OC_EVT 100
# define MT6360_BUCK1_OV_EVT 101
# define MT6360_BUCK1_UV_EVT 102
2020-04-23 19:24:52 +08:00
/* REG 13 -> 104 ~ 111 */
2021-05-18 01:33:06 +08:00
# define MT6360_BUCK2_PGB_EVT 104
# define MT6360_BUCK2_OC_EVT 108
# define MT6360_BUCK2_OV_EVT 109
# define MT6360_BUCK2_UV_EVT 110
2020-04-23 19:24:52 +08:00
/* REG 14 -> 112 ~ 119 */
2021-05-18 01:33:06 +08:00
# define MT6360_LDO1_OC_EVT 113
# define MT6360_LDO2_OC_EVT 114
# define MT6360_LDO3_OC_EVT 115
# define MT6360_LDO5_OC_EVT 117
# define MT6360_LDO6_OC_EVT 118
# define MT6360_LDO7_OC_EVT 119
2020-04-23 19:24:52 +08:00
/* REG 15 -> 120 ~ 127 */
2021-05-18 01:33:06 +08:00
# define MT6360_LDO1_PGB_EVT 121
# define MT6360_LDO2_PGB_EVT 122
# define MT6360_LDO3_PGB_EVT 123
# define MT6360_LDO5_PGB_EVT 125
# define MT6360_LDO6_PGB_EVT 126
# define MT6360_LDO7_PGB_EVT 127
2020-04-23 19:24:52 +08:00
2021-05-18 01:33:10 +08:00
static const struct regmap_irq mt6360_irqs [ ] = {
2020-04-23 19:24:52 +08:00
REGMAP_IRQ_REG_LINE ( MT6360_CHG_TREG_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_AICR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_MIVR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_PWR_RDY_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_BATSYSUV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED_CHG_VINOVP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_VSYSUV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_VSYSOV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_VBATOV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_VBUSOV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_WD_PMU_DET , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_WD_PMU_DONE , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_TMRI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_ADPBADI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_RVPI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_OTPI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_AICCMEASL , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHGDET_DONEI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_WDTMRI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_SSFINISHI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_RECHGI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_TERMI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHG_IEOCI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_PUMPX_DONEI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BAT_OVP_ADC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_TYPEC_OTP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_ADC_WAKEUP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_ADC_DONEI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BST_BATUVI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BST_VBUSOVI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BST_OLPI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_ATTACH_I , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_DETACH_I , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_QC30_STPDONE , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_QC_VBUSDET_DONE , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_HVDCP_DET , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHGDETI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_DCDTI , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FOD_DONE_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FOD_OV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHRDET_UVP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHRDET_OVP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_CHRDET_EXT_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FOD_LR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FOD_HR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FOD_DISCHG_FAIL_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_USBID_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_APWDTRST_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_EN_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_QONB_RST_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_MRSTB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_OTP_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_VDDAOV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_SYSUV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED_STRBPIN_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED_TORPIN_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED_TX_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED_LVF_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED2_SHORT_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED1_SHORT_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED2_STRB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED1_STRB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED2_STRB_TO_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED1_STRB_TO_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED2_TOR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_FLED1_TOR_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK1_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK1_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK1_OV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK1_UV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK2_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK2_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK2_OV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_BUCK2_UV_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO1_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO2_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO3_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO5_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO6_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO7_OC_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO1_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO2_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO3_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO5_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO6_PGB_EVT , 8 ) ,
REGMAP_IRQ_REG_LINE ( MT6360_LDO7_PGB_EVT , 8 ) ,
} ;
2021-05-18 01:33:11 +08:00
static const struct regmap_irq_chip mt6360_irq_chip = {
. name = " mt6360_irqs " ,
2021-05-18 01:33:10 +08:00
. irqs = mt6360_irqs ,
. num_irqs = ARRAY_SIZE ( mt6360_irqs ) ,
2020-04-23 19:24:52 +08:00
. num_regs = MT6360_PMU_IRQ_REGNUM ,
. mask_base = MT6360_PMU_CHG_MASK1 ,
. status_base = MT6360_PMU_CHG_IRQ1 ,
. ack_base = MT6360_PMU_CHG_IRQ1 ,
. init_ack_masked = true ,
. use_ack = true ,
} ;
static const struct regmap_config mt6360_pmu_regmap_config = {
. reg_bits = 8 ,
. val_bits = 8 ,
. max_register = MT6360_PMU_MAXREG ,
} ;
static const struct resource mt6360_adc_resources [ ] = {
DEFINE_RES_IRQ_NAMED ( MT6360_ADC_DONEI , " adc_donei " ) ,
} ;
static const struct resource mt6360_chg_resources [ ] = {
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_TREG_EVT , " chg_treg_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_PWR_RDY_EVT , " pwr_rdy_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_BATSYSUV_EVT , " chg_batsysuv_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_VSYSUV_EVT , " chg_vsysuv_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_VSYSOV_EVT , " chg_vsysov_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_VBATOV_EVT , " chg_vbatov_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_VBUSOV_EVT , " chg_vbusov_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_AICCMEASL , " chg_aiccmeasl " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_WDTMRI , " wdtmri " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_RECHGI , " chg_rechgi " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_TERMI , " chg_termi " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHG_IEOCI , " chg_ieoci " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_PUMPX_DONEI , " pumpx_donei " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_ATTACH_I , " attach_i " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_CHRDET_EXT_EVT , " chrdet_ext_evt " ) ,
} ;
static const struct resource mt6360_led_resources [ ] = {
DEFINE_RES_IRQ_NAMED ( MT6360_FLED_CHG_VINOVP_EVT , " fled_chg_vinovp_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_FLED_LVF_EVT , " fled_lvf_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_FLED2_SHORT_EVT , " fled2_short_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_FLED1_SHORT_EVT , " fled1_short_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_FLED2_STRB_TO_EVT , " fled2_strb_to_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_FLED1_STRB_TO_EVT , " fled1_strb_to_evt " ) ,
} ;
2021-05-18 01:33:08 +08:00
static const struct resource mt6360_regulator_resources [ ] = {
2020-04-23 19:24:52 +08:00
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK1_PGB_EVT , " buck1_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK1_OC_EVT , " buck1_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK1_OV_EVT , " buck1_ov_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK1_UV_EVT , " buck1_uv_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK2_PGB_EVT , " buck2_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK2_OC_EVT , " buck2_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK2_OV_EVT , " buck2_ov_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_BUCK2_UV_EVT , " buck2_uv_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO6_OC_EVT , " ldo6_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO7_OC_EVT , " ldo7_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO6_PGB_EVT , " ldo6_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO7_PGB_EVT , " ldo7_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO1_OC_EVT , " ldo1_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO2_OC_EVT , " ldo2_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO3_OC_EVT , " ldo3_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO5_OC_EVT , " ldo5_oc_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO1_PGB_EVT , " ldo1_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO2_PGB_EVT , " ldo2_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO3_PGB_EVT , " ldo3_pgb_evt " ) ,
DEFINE_RES_IRQ_NAMED ( MT6360_LDO5_PGB_EVT , " ldo5_pgb_evt " ) ,
} ;
static const struct mfd_cell mt6360_devs [ ] = {
2021-05-18 01:33:07 +08:00
MFD_CELL_OF ( " mt6360-adc " , mt6360_adc_resources ,
NULL , 0 , 0 , " mediatek,mt6360-adc " ) ,
MFD_CELL_OF ( " mt6360-chg " , mt6360_chg_resources ,
NULL , 0 , 0 , " mediatek,mt6360-chg " ) ,
MFD_CELL_OF ( " mt6360-led " , mt6360_led_resources ,
NULL , 0 , 0 , " mediatek,mt6360-led " ) ,
2021-05-18 01:33:08 +08:00
MFD_CELL_RES ( " mt6360-regulator " , mt6360_regulator_resources ) ,
2021-05-18 01:33:07 +08:00
MFD_CELL_OF ( " mt6360-tcpc " , NULL ,
NULL , 0 , 0 , " mediatek,mt6360-tcpc " ) ,
2020-04-23 19:24:52 +08:00
} ;
2021-05-18 01:33:12 +08:00
static int mt6360_check_vendor_info ( struct mt6360_ddata * ddata )
{
u32 info ;
int ret ;
ret = regmap_read ( ddata - > regmap , MT6360_PMU_DEV_INFO , & info ) ;
if ( ret < 0 )
return ret ;
if ( ( info & CHIP_VEN_MASK ) ! = CHIP_VEN_MT6360 ) {
dev_err ( ddata - > dev , " Device not supported \n " ) ;
return - ENODEV ;
}
ddata - > chip_rev = info & CHIP_REV_MASK ;
return 0 ;
}
2020-04-23 19:24:52 +08:00
static const unsigned short mt6360_slave_addr [ MT6360_SLAVE_MAX ] = {
MT6360_PMU_SLAVEID ,
MT6360_PMIC_SLAVEID ,
MT6360_LDO_SLAVEID ,
MT6360_TCPC_SLAVEID ,
} ;
2021-05-18 01:33:10 +08:00
static int mt6360_probe ( struct i2c_client * client )
2020-04-23 19:24:52 +08:00
{
2021-05-18 01:33:09 +08:00
struct mt6360_ddata * ddata ;
2020-04-23 19:24:52 +08:00
int i , ret ;
2021-05-18 01:33:09 +08:00
ddata = devm_kzalloc ( & client - > dev , sizeof ( * ddata ) , GFP_KERNEL ) ;
if ( ! ddata )
2020-04-23 19:24:52 +08:00
return - ENOMEM ;
2021-05-18 01:33:09 +08:00
ddata - > dev = & client - > dev ;
i2c_set_clientdata ( client , ddata ) ;
2020-04-23 19:24:52 +08:00
2021-05-18 01:33:09 +08:00
ddata - > regmap = devm_regmap_init_i2c ( client , & mt6360_pmu_regmap_config ) ;
if ( IS_ERR ( ddata - > regmap ) ) {
2020-04-23 19:24:52 +08:00
dev_err ( & client - > dev , " Failed to register regmap \n " ) ;
2021-05-18 01:33:09 +08:00
return PTR_ERR ( ddata - > regmap ) ;
2020-04-23 19:24:52 +08:00
}
2021-05-18 01:33:12 +08:00
ret = mt6360_check_vendor_info ( ddata ) ;
if ( ret )
2020-04-23 19:24:52 +08:00
return ret ;
2021-05-18 01:33:09 +08:00
ret = devm_regmap_add_irq_chip ( & client - > dev , ddata - > regmap , client - > irq ,
2021-05-18 01:33:11 +08:00
0 , 0 , & mt6360_irq_chip ,
& ddata - > irq_data ) ;
2020-04-23 19:24:52 +08:00
if ( ret ) {
dev_err ( & client - > dev , " Failed to add Regmap IRQ Chip \n " ) ;
return ret ;
}
2021-05-18 01:33:09 +08:00
ddata - > i2c [ 0 ] = client ;
2020-04-23 19:24:52 +08:00
for ( i = 1 ; i < MT6360_SLAVE_MAX ; i + + ) {
2021-05-18 01:33:09 +08:00
ddata - > i2c [ i ] = devm_i2c_new_dummy_device ( & client - > dev ,
2020-04-23 19:24:52 +08:00
client - > adapter ,
mt6360_slave_addr [ i ] ) ;
2021-05-18 01:33:09 +08:00
if ( IS_ERR ( ddata - > i2c [ i ] ) ) {
2020-04-23 19:24:52 +08:00
dev_err ( & client - > dev ,
" Failed to get new dummy I2C device for address 0x%x " ,
mt6360_slave_addr [ i ] ) ;
2021-05-18 01:33:09 +08:00
return PTR_ERR ( ddata - > i2c [ i ] ) ;
2020-04-23 19:24:52 +08:00
}
2021-05-18 01:33:09 +08:00
i2c_set_clientdata ( ddata - > i2c [ i ] , ddata ) ;
2020-04-23 19:24:52 +08:00
}
ret = devm_mfd_add_devices ( & client - > dev , PLATFORM_DEVID_AUTO ,
mt6360_devs , ARRAY_SIZE ( mt6360_devs ) , NULL ,
2021-05-18 01:33:09 +08:00
0 , regmap_irq_get_domain ( ddata - > irq_data ) ) ;
2020-04-23 19:24:52 +08:00
if ( ret ) {
dev_err ( & client - > dev ,
" Failed to register subordinate devices \n " ) ;
return ret ;
}
return 0 ;
}
2021-05-18 01:33:10 +08:00
static int __maybe_unused mt6360_suspend ( struct device * dev )
2020-04-23 19:24:52 +08:00
{
struct i2c_client * i2c = to_i2c_client ( dev ) ;
if ( device_may_wakeup ( dev ) )
enable_irq_wake ( i2c - > irq ) ;
return 0 ;
}
2021-05-18 01:33:10 +08:00
static int __maybe_unused mt6360_resume ( struct device * dev )
2020-04-23 19:24:52 +08:00
{
struct i2c_client * i2c = to_i2c_client ( dev ) ;
if ( device_may_wakeup ( dev ) )
disable_irq_wake ( i2c - > irq ) ;
return 0 ;
}
2021-05-18 01:33:10 +08:00
static SIMPLE_DEV_PM_OPS ( mt6360_pm_ops , mt6360_suspend , mt6360_resume ) ;
2020-04-23 19:24:52 +08:00
2021-05-18 01:33:10 +08:00
static const struct of_device_id __maybe_unused mt6360_of_id [ ] = {
{ . compatible = " mediatek,mt6360 " , } ,
2020-04-23 19:24:52 +08:00
{ } ,
} ;
2021-05-18 01:33:10 +08:00
MODULE_DEVICE_TABLE ( of , mt6360_of_id ) ;
2020-04-23 19:24:52 +08:00
2021-05-18 01:33:10 +08:00
static struct i2c_driver mt6360_driver = {
2020-04-23 19:24:52 +08:00
. driver = {
2021-05-18 01:33:10 +08:00
. name = " mt6360 " ,
. pm = & mt6360_pm_ops ,
. of_match_table = of_match_ptr ( mt6360_of_id ) ,
2020-04-23 19:24:52 +08:00
} ,
2021-05-18 01:33:10 +08:00
. probe_new = mt6360_probe ,
2020-04-23 19:24:52 +08:00
} ;
2021-05-18 01:33:10 +08:00
module_i2c_driver ( mt6360_driver ) ;
2020-04-23 19:24:52 +08:00
MODULE_AUTHOR ( " Gene Chen <gene_chen@richtek.com> " ) ;
2021-05-18 01:33:10 +08:00
MODULE_DESCRIPTION ( " MT6360 I2C Driver " ) ;
2020-04-23 19:24:52 +08:00
MODULE_LICENSE ( " GPL v2 " ) ;