1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2015 Google, Inc 3*4882a593Smuzhiyun * Written by Simon Glass <sjg@chromium.org> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _PMIC_RK8XX_H_ 9*4882a593Smuzhiyun #define _PMIC_RK8XX_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun enum { 12*4882a593Smuzhiyun REG_SECONDS = 0x00, 13*4882a593Smuzhiyun REG_MINUTES, 14*4882a593Smuzhiyun REG_HOURS, 15*4882a593Smuzhiyun REG_DAYS, 16*4882a593Smuzhiyun REG_MONTHS, 17*4882a593Smuzhiyun REG_YEARS, 18*4882a593Smuzhiyun REG_WEEKS, 19*4882a593Smuzhiyun REG_ALARM_SECONDS, 20*4882a593Smuzhiyun REG_ALARM_MINUTES, 21*4882a593Smuzhiyun REG_ALARM_HOURS, 22*4882a593Smuzhiyun REG_ALARM_DAYS, 23*4882a593Smuzhiyun REG_ALARM_MONTHS, 24*4882a593Smuzhiyun REG_ALARM_YEARS, 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun REG_RTC_CTRL = 0x10, 27*4882a593Smuzhiyun REG_RTC_STATUS, 28*4882a593Smuzhiyun REG_RTC_INT, 29*4882a593Smuzhiyun REG_RTC_COMP_LSB, 30*4882a593Smuzhiyun REG_RTC_COMP_MSB, 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun ID_MSB = 0x17, 33*4882a593Smuzhiyun ID_LSB, 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun REG_CLK32OUT = 0x20, 36*4882a593Smuzhiyun REG_VB_MON, 37*4882a593Smuzhiyun REG_THERMAL, 38*4882a593Smuzhiyun REG_DCDC_EN, 39*4882a593Smuzhiyun REG_LDO_EN, 40*4882a593Smuzhiyun REG_SLEEP_SET_OFF1, 41*4882a593Smuzhiyun REG_SLEEP_SET_OFF2, 42*4882a593Smuzhiyun REG_DCDC_UV_STS, 43*4882a593Smuzhiyun REG_DCDC_UV_ACT, 44*4882a593Smuzhiyun REG_LDO_UV_STS, 45*4882a593Smuzhiyun REG_LDO_UV_ACT, 46*4882a593Smuzhiyun REG_DCDC_PG, 47*4882a593Smuzhiyun REG_LDO_PG, 48*4882a593Smuzhiyun REG_VOUT_MON_TDB, 49*4882a593Smuzhiyun REG_BUCK1_CONFIG, 50*4882a593Smuzhiyun REG_BUCK1_ON_VSEL, 51*4882a593Smuzhiyun REG_BUCK1_SLP_VSEL, 52*4882a593Smuzhiyun REG_BUCK1_DVS_VSEL, 53*4882a593Smuzhiyun REG_BUCK2_CONFIG, 54*4882a593Smuzhiyun REG_BUCK2_ON_VSEL, 55*4882a593Smuzhiyun REG_BUCK2_SLP_VSEL, 56*4882a593Smuzhiyun REG_BUCK2_DVS_VSEL, 57*4882a593Smuzhiyun REG_BUCK3_CONFIG, 58*4882a593Smuzhiyun REG_BUCK4_CONFIG, 59*4882a593Smuzhiyun REG_BUCK4_ON_VSEL, 60*4882a593Smuzhiyun REG_BUCK4_SLP_VSEL, 61*4882a593Smuzhiyun REG_BOOST_CONFIG_REG, 62*4882a593Smuzhiyun REG_LDO1_ON_VSEL, 63*4882a593Smuzhiyun REG_LDO1_SLP_VSEL, 64*4882a593Smuzhiyun REG_LDO2_ON_VSEL, 65*4882a593Smuzhiyun REG_LDO2_SLP_VSEL, 66*4882a593Smuzhiyun REG_LDO3_ON_VSEL, 67*4882a593Smuzhiyun REG_LDO3_SLP_VSEL, 68*4882a593Smuzhiyun REG_LDO4_ON_VSEL, 69*4882a593Smuzhiyun REG_LDO4_SLP_VSEL, 70*4882a593Smuzhiyun REG_LDO5_ON_VSEL, 71*4882a593Smuzhiyun REG_LDO5_SLP_VSEL, 72*4882a593Smuzhiyun REG_LDO6_ON_VSEL, 73*4882a593Smuzhiyun REG_LDO6_SLP_VSEL, 74*4882a593Smuzhiyun REG_LDO7_ON_VSEL, 75*4882a593Smuzhiyun REG_LDO7_SLP_VSEL, 76*4882a593Smuzhiyun REG_LDO8_ON_VSEL, 77*4882a593Smuzhiyun REG_LDO8_SLP_VSEL, 78*4882a593Smuzhiyun REG_DEVCTRL, 79*4882a593Smuzhiyun REG_INT_STS1, 80*4882a593Smuzhiyun REG_INT_STS_MSK1, 81*4882a593Smuzhiyun REG_INT_STS2, 82*4882a593Smuzhiyun REG_INT_STS_MSK2, 83*4882a593Smuzhiyun REG_IO_POL, 84*4882a593Smuzhiyun REG_OTP_VDD_EN, 85*4882a593Smuzhiyun REG_H5V_EN, 86*4882a593Smuzhiyun REG_SLEEP_SET_OFF, 87*4882a593Smuzhiyun REG_BOOST_LDO9_ON_VSEL, 88*4882a593Smuzhiyun REG_BOOST_LDO9_SLP_VSEL, 89*4882a593Smuzhiyun REG_BOOST_CTRL, 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Not sure what this does */ 92*4882a593Smuzhiyun REG_DCDC_ILMAX = 0x90, 93*4882a593Smuzhiyun REG_CHRG_COMP = 0x9a, 94*4882a593Smuzhiyun REG_SUP_STS = 0xa0, 95*4882a593Smuzhiyun REG_USB_CTRL, 96*4882a593Smuzhiyun REG1_CHRG_CTRL, 97*4882a593Smuzhiyun REG2_CHRG_CTRL, 98*4882a593Smuzhiyun REG3_CHRG_CTRL, 99*4882a593Smuzhiyun REG_BAT_CTRL, 100*4882a593Smuzhiyun REG_BAT_HTS_TS1, 101*4882a593Smuzhiyun REG_BAT_LTS_TS1, 102*4882a593Smuzhiyun REG_BAT_HTS_TS2, 103*4882a593Smuzhiyun REG_BAT_LTS_TS2, 104*4882a593Smuzhiyun REG_TS_CTRL, 105*4882a593Smuzhiyun REG_ADC_CTRL, 106*4882a593Smuzhiyun REG_ON_SOURCE, 107*4882a593Smuzhiyun REG_OFF_SOURCE, 108*4882a593Smuzhiyun REG_GGCON, 109*4882a593Smuzhiyun REG_GGSTS, 110*4882a593Smuzhiyun REG_FRAME_SMP_INTERV, 111*4882a593Smuzhiyun REG_AUTO_SLP_CUR_THR, 112*4882a593Smuzhiyun REG3_GASCNT_CAL, 113*4882a593Smuzhiyun REG2_GASCNT_CAL, 114*4882a593Smuzhiyun REG1_GASCNT_CAL, 115*4882a593Smuzhiyun REG0_GASCNT_CAL, 116*4882a593Smuzhiyun REG3_GASCNT, 117*4882a593Smuzhiyun REG2_GASCNT, 118*4882a593Smuzhiyun REG1_GASCNT, 119*4882a593Smuzhiyun REG0_GASCNT, 120*4882a593Smuzhiyun REGH_BAT_CUR_AVG, 121*4882a593Smuzhiyun REGL_BAT_CUR_AVG, 122*4882a593Smuzhiyun REGH_TS1_ADC, 123*4882a593Smuzhiyun REGL_TS1_ADC, 124*4882a593Smuzhiyun REGH_TS2_ADC, 125*4882a593Smuzhiyun REGL_TS2_ADC, 126*4882a593Smuzhiyun REGH_BAT_OCV, 127*4882a593Smuzhiyun REGL_BAT_OCV, 128*4882a593Smuzhiyun REGH_BAT_VOL, 129*4882a593Smuzhiyun REGL_BAT_VOL, 130*4882a593Smuzhiyun REGH_RELAX_ENTRY_THRES, 131*4882a593Smuzhiyun REGL_RELAX_ENTRY_THRES, 132*4882a593Smuzhiyun REGH_RELAX_EXIT_THRES, 133*4882a593Smuzhiyun REGL_RELAX_EXIT_THRES, 134*4882a593Smuzhiyun REGH_RELAX_VOL1, 135*4882a593Smuzhiyun REGL_RELAX_VOL1, 136*4882a593Smuzhiyun REGH_RELAX_VOL2, 137*4882a593Smuzhiyun REGL_RELAX_VOL2, 138*4882a593Smuzhiyun REGH_BAT_CUR_R_CALC, 139*4882a593Smuzhiyun REGL_BAT_CUR_R_CALC, 140*4882a593Smuzhiyun REGH_BAT_VOL_R_CALC, 141*4882a593Smuzhiyun REGL_BAT_VOL_R_CALC, 142*4882a593Smuzhiyun REGH_CAL_OFFSET, 143*4882a593Smuzhiyun REGL_CAL_OFFSET, 144*4882a593Smuzhiyun REG_NON_ACT_TIMER_CNT, 145*4882a593Smuzhiyun REGH_VCALIB0, 146*4882a593Smuzhiyun REGL_VCALIB0, 147*4882a593Smuzhiyun REGH_VCALIB1, 148*4882a593Smuzhiyun REGL_VCALIB1, 149*4882a593Smuzhiyun REGH_IOFFSET, 150*4882a593Smuzhiyun REGL_IOFFSET, 151*4882a593Smuzhiyun REG_SOC, 152*4882a593Smuzhiyun REG3_REMAIN_CAP, 153*4882a593Smuzhiyun REG2_REMAIN_CAP, 154*4882a593Smuzhiyun REG1_REMAIN_CAP, 155*4882a593Smuzhiyun REG0_REMAIN_CAP, 156*4882a593Smuzhiyun REG_UPDAT_LEVE, 157*4882a593Smuzhiyun REG3_NEW_FCC, 158*4882a593Smuzhiyun REG2_NEW_FCC, 159*4882a593Smuzhiyun REG1_NEW_FCC, 160*4882a593Smuzhiyun REG0_NEW_FCC, 161*4882a593Smuzhiyun REG_NON_ACT_TIMER_CNT_SAVE, 162*4882a593Smuzhiyun REG_OCV_VOL_VALID, 163*4882a593Smuzhiyun REG_REBOOT_CNT, 164*4882a593Smuzhiyun REG_POFFSET, 165*4882a593Smuzhiyun REG_MISC_MARK, 166*4882a593Smuzhiyun REG_HALT_CNT, 167*4882a593Smuzhiyun REGH_CALC_REST, 168*4882a593Smuzhiyun REGL_CALC_REST, 169*4882a593Smuzhiyun SAVE_DATA19, 170*4882a593Smuzhiyun RK808_NUM_OF_REGS, 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun enum { 174*4882a593Smuzhiyun RK817_REG_SYS_CFG3 = 0xf4, 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun enum { 178*4882a593Smuzhiyun RK816_REG_DCDC_EN1 = 0x23, 179*4882a593Smuzhiyun RK816_REG_DCDC_EN2, 180*4882a593Smuzhiyun RK816_REG_DCDC_SLP_EN, 181*4882a593Smuzhiyun RK816_REG_LDO_SLP_EN, 182*4882a593Smuzhiyun RK816_REG_LDO_EN1 = 0x27, 183*4882a593Smuzhiyun RK816_REG_LDO_EN2, 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun enum { 187*4882a593Smuzhiyun RK805_ID = 0x8050, 188*4882a593Smuzhiyun RK806_ID = 0x8060, 189*4882a593Smuzhiyun RK808_ID = 0x0000, 190*4882a593Smuzhiyun RK809_ID = 0x8090, 191*4882a593Smuzhiyun RK816_ID = 0x8160, 192*4882a593Smuzhiyun RK817_ID = 0x8170, 193*4882a593Smuzhiyun RK818_ID = 0x8180, 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun enum { 197*4882a593Smuzhiyun RK817_POWER_EN0 = 0xb1, 198*4882a593Smuzhiyun RK817_POWER_EN1, 199*4882a593Smuzhiyun RK817_POWER_EN2, 200*4882a593Smuzhiyun RK817_POWER_EN3, 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun #define RK817_POWER_EN_SAVE0 0x99 203*4882a593Smuzhiyun #define RK817_POWER_EN_SAVE1 0xa4 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define RK817_ID_MSB 0xed 206*4882a593Smuzhiyun #define RK817_ID_LSB 0xee 207*4882a593Smuzhiyun #define RK8XX_ID_MSK 0xfff0 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #define RK817_PMIC_CHRG_TERM 0xe6 210*4882a593Smuzhiyun #define RK817_PMIC_SYS_CFG1 0xf1 211*4882a593Smuzhiyun #define RK817_PMIC_SYS_CFG3 0xf4 212*4882a593Smuzhiyun #define RK817_GPIO_INT_CFG 0xfe 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define RK8XX_ON_SOURCE 0xae 215*4882a593Smuzhiyun #define RK8XX_OFF_SOURCE 0xaf 216*4882a593Smuzhiyun #define RK817_BUCK4_CMIN 0xc6 217*4882a593Smuzhiyun #define RK817_ON_SOURCE 0xf5 218*4882a593Smuzhiyun #define RK817_OFF_SOURCE 0xf6 219*4882a593Smuzhiyun #define RK817_NUM_OF_REGS 0xff 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun #define RK8XX_DEVCTRL_REG 0x4b 222*4882a593Smuzhiyun #define RK817_PWRON_KEY 0xf7 223*4882a593Smuzhiyun #define RK8XX_LP_ACTION_MSK BIT(6) 224*4882a593Smuzhiyun #define RK8XX_LP_OFF (0 << 6) 225*4882a593Smuzhiyun #define RK8XX_LP_RESTART (1 << 6) 226*4882a593Smuzhiyun #define RK8XX_LP_OFF_MSK BIT(4) | BIT(5) 227*4882a593Smuzhiyun #define RK8XX_LP_TIME_6S (0 << 4) 228*4882a593Smuzhiyun #define RK8XX_LP_TIME_8S (1 << 4) 229*4882a593Smuzhiyun #define RK8XX_LP_TIME_10S (2 << 4) 230*4882a593Smuzhiyun #define RK8XX_LP_TIME_12S (3 << 4) 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* IRQ definitions */ 233*4882a593Smuzhiyun #define RK8XX_IRQ_PWRON_FALL 0 234*4882a593Smuzhiyun #define RK8XX_IRQ_PWRON_RISE 1 235*4882a593Smuzhiyun #define RK8XX_IRQ_PLUG_OUT 2 236*4882a593Smuzhiyun #define RK8XX_IRQ_PLUG_IN 3 237*4882a593Smuzhiyun #define RK8XX_IRQ_CHG_OK 4 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define RK808_INT_STS_REG1 0x4c 240*4882a593Smuzhiyun #define RK808_INT_MSK_REG1 0x4d 241*4882a593Smuzhiyun #define RK808_IRQ_PLUG_OUT_MSK BIT(1) 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun #define RK805_INT_STS_REG 0x4c 244*4882a593Smuzhiyun #define RK805_INT_MSK_REG 0x4d 245*4882a593Smuzhiyun #define RK805_IRQ_PWRON_FALL_MSK BIT(7) 246*4882a593Smuzhiyun #define RK805_IRQ_PWRON_RISE_MSK BIT(0) 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun #define RK816_INT_STS_REG1 0x49 249*4882a593Smuzhiyun #define RK816_INT_MSK_REG1 0x4a 250*4882a593Smuzhiyun #define RK816_INT_STS_REG3 0x4e 251*4882a593Smuzhiyun #define RK816_INT_STS_MSK_REG3 0x4f 252*4882a593Smuzhiyun #define RK816_IRQ_PWRON_RISE_MSK BIT(6) 253*4882a593Smuzhiyun #define RK816_IRQ_PWRON_FALL_MSK BIT(5) 254*4882a593Smuzhiyun #define RK816_IRQ_PLUG_OUT_MSK BIT(1) 255*4882a593Smuzhiyun #define RK816_IRQ_CHR_OK_MSK BIT(2) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun #define RK818_INT_STS_REG1 0x4c 258*4882a593Smuzhiyun #define RK818_INT_MSK_REG1 0x4d 259*4882a593Smuzhiyun #define RK818_IRQ_PLUG_OUT_MSK BIT(1) 260*4882a593Smuzhiyun #define RK818_IRQ_CHR_OK_MSK BIT(2) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #define RK817_INT_STS_REG0 0xf8 263*4882a593Smuzhiyun #define RK817_INT_MSK_REG0 0xf9 264*4882a593Smuzhiyun #define RK817_IRQ_PWRON_FALL_MSK BIT(0) 265*4882a593Smuzhiyun #define RK817_IRQ_PWRON_RISE_MSK BIT(1) 266*4882a593Smuzhiyun #define RK817_IRQ_PLUG_OUT_MSK BIT(1) 267*4882a593Smuzhiyun #define RK817_IRQ_PLUG_IN_MSK BIT(0) 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct reg_data { 270*4882a593Smuzhiyun u8 reg; 271*4882a593Smuzhiyun u8 val; 272*4882a593Smuzhiyun u8 mask; 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun struct rk8xx_reg_table { 276*4882a593Smuzhiyun char *name; 277*4882a593Smuzhiyun u8 reg_ctl; 278*4882a593Smuzhiyun u8 reg_vol; 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct rk8xx_priv { 282*4882a593Smuzhiyun struct virq_chip *irq_chip; 283*4882a593Smuzhiyun struct spi_slave *slave; 284*4882a593Smuzhiyun int variant; 285*4882a593Smuzhiyun int irq; 286*4882a593Smuzhiyun int lp_off_time; 287*4882a593Smuzhiyun int lp_action; 288*4882a593Smuzhiyun uint8_t sleep_pin; 289*4882a593Smuzhiyun uint8_t rst_fun; 290*4882a593Smuzhiyun int not_save_power_en; 291*4882a593Smuzhiyun int sys_can_sd; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt); 295*4882a593Smuzhiyun int rk818_spl_configure_usb_input_current(struct udevice *pmic, int current_ma); 296*4882a593Smuzhiyun int rk818_spl_configure_usb_chrg_shutdown(struct udevice *pmic, int uvolt); 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #endif 299