xref: /OK3568_Linux_fs/u-boot/include/power/rk8xx_pmic.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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