xref: /linux-6.15/include/linux/mfd/max8907.h (revision d2912cb1)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2a91d2f8dSGyungoh Yoo /*
3a91d2f8dSGyungoh Yoo  * Functions to access MAX8907 power management chip.
4a91d2f8dSGyungoh Yoo  *
5a91d2f8dSGyungoh Yoo  * Copyright (C) 2010 Gyungoh Yoo <[email protected]>
6a91d2f8dSGyungoh Yoo  * Copyright (C) 2012, NVIDIA CORPORATION. All rights reserved.
7a91d2f8dSGyungoh Yoo  */
8a91d2f8dSGyungoh Yoo 
9a91d2f8dSGyungoh Yoo #ifndef __LINUX_MFD_MAX8907_H
10a91d2f8dSGyungoh Yoo #define __LINUX_MFD_MAX8907_H
11a91d2f8dSGyungoh Yoo 
12a91d2f8dSGyungoh Yoo #include <linux/mutex.h>
13a91d2f8dSGyungoh Yoo #include <linux/pm.h>
14a91d2f8dSGyungoh Yoo 
15a91d2f8dSGyungoh Yoo #define MAX8907_GEN_I2C_ADDR		(0x78 >> 1)
16a91d2f8dSGyungoh Yoo #define MAX8907_ADC_I2C_ADDR		(0x8e >> 1)
17a91d2f8dSGyungoh Yoo #define MAX8907_RTC_I2C_ADDR		(0xd0 >> 1)
18a91d2f8dSGyungoh Yoo 
19a91d2f8dSGyungoh Yoo /* MAX8907 register map */
20a91d2f8dSGyungoh Yoo #define MAX8907_REG_SYSENSEL		0x00
21a91d2f8dSGyungoh Yoo #define MAX8907_REG_ON_OFF_IRQ1		0x01
22a91d2f8dSGyungoh Yoo #define MAX8907_REG_ON_OFF_IRQ1_MASK	0x02
23a91d2f8dSGyungoh Yoo #define MAX8907_REG_ON_OFF_STAT		0x03
24a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDCTL1		0x04
25a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDSEQCNT1		0x05
26a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDV1		0x06
27a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDCTL2		0x07
28a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDSEQCNT2		0x08
29a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDV2		0x09
30a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDCTL3		0x0A
31a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDSEQCNT3		0x0B
32a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDV3		0x0C
33a91d2f8dSGyungoh Yoo #define MAX8907_REG_ON_OFF_IRQ2		0x0D
34a91d2f8dSGyungoh Yoo #define MAX8907_REG_ON_OFF_IRQ2_MASK	0x0E
35a91d2f8dSGyungoh Yoo #define MAX8907_REG_RESET_CNFG		0x0F
36a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL16		0x10
37a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT16		0x11
38a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO16VOUT		0x12
39a91d2f8dSGyungoh Yoo #define MAX8907_REG_SDBYSEQCNT		0x13
40a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL17		0x14
41a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT17		0x15
42a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO17VOUT		0x16
43a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL1		0x18
44a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT1		0x19
45a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO1VOUT		0x1A
46a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL2		0x1C
47a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT2		0x1D
48a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO2VOUT		0x1E
49a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL3		0x20
50a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT3		0x21
51a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO3VOUT		0x22
52a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL4		0x24
53a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT4		0x25
54a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO4VOUT		0x26
55a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL5		0x28
56a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT5		0x29
57a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO5VOUT		0x2A
58a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL6		0x2C
59a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT6		0x2D
60a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO6VOUT		0x2E
61a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL7		0x30
62a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT7		0x31
63a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO7VOUT		0x32
64a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL8		0x34
65a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT8		0x35
66a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO8VOUT		0x36
67a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL9		0x38
68a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT9		0x39
69a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO9VOUT		0x3A
70a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL10		0x3C
71a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT10		0x3D
72a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO10VOUT		0x3E
73a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL11		0x40
74a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT11		0x41
75a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO11VOUT		0x42
76a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL12		0x44
77a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT12		0x45
78a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO12VOUT		0x46
79a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL13		0x48
80a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT13		0x49
81a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO13VOUT		0x4A
82a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL14		0x4C
83a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT14		0x4D
84a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO14VOUT		0x4E
85a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL15		0x50
86a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT15		0x51
87a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO15VOUT		0x52
88a91d2f8dSGyungoh Yoo #define MAX8907_REG_OUT5VEN		0x54
89a91d2f8dSGyungoh Yoo #define MAX8907_REG_OUT5VSEQ		0x55
90a91d2f8dSGyungoh Yoo #define MAX8907_REG_OUT33VEN		0x58
91a91d2f8dSGyungoh Yoo #define MAX8907_REG_OUT33VSEQ		0x59
92a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL19		0x5C
93a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT19		0x5D
94a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO19VOUT		0x5E
95a91d2f8dSGyungoh Yoo #define MAX8907_REG_LBCNFG		0x60
96a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ1CNFG		0x64
97a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ2CNFG		0x65
98a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ3CNFG		0x66
99a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ4CNFG		0x67
100a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ5CNFG		0x68
101a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ6CNFG		0x69
102a91d2f8dSGyungoh Yoo #define MAX8907_REG_SEQ7CNFG		0x6A
103a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL18		0x72
104a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT18		0x73
105a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO18VOUT		0x74
106a91d2f8dSGyungoh Yoo #define MAX8907_REG_BBAT_CNFG		0x78
107a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_CNTL1		0x7C
108a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_CNTL2		0x7D
109a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_IRQ1		0x7E
110a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_IRQ2		0x7F
111a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_IRQ1_MASK	0x80
112a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_IRQ2_MASK	0x81
113a91d2f8dSGyungoh Yoo #define MAX8907_REG_CHG_STAT		0x82
114a91d2f8dSGyungoh Yoo #define MAX8907_REG_WLED_MODE_CNTL	0x84
115a91d2f8dSGyungoh Yoo #define MAX8907_REG_ILED_CNTL		0x84
116a91d2f8dSGyungoh Yoo #define MAX8907_REG_II1RR		0x8E
117a91d2f8dSGyungoh Yoo #define MAX8907_REG_II2RR		0x8F
118a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOCTL20		0x9C
119a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDOSEQCNT20		0x9D
120a91d2f8dSGyungoh Yoo #define MAX8907_REG_LDO20VOUT		0x9E
121a91d2f8dSGyungoh Yoo 
122a91d2f8dSGyungoh Yoo /* RTC register map */
123a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_SEC		0x00
124a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_MIN		0x01
125a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_HOURS		0x02
126a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_WEEKDAY		0x03
127a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_DATE		0x04
128a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_MONTH		0x05
129a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_YEAR1		0x06
130a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_YEAR2		0x07
131a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_SEC		0x08
132a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_MIN		0x09
133a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_HOURS	0x0A
134a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_WEEKDAY	0x0B
135a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_DATE		0x0C
136a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_MONTH	0x0D
137a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_YEAR1	0x0E
138a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_YEAR2	0x0F
139a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_SEC		0x10
140a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_MIN		0x11
141a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_HOURS	0x12
142a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_WEEKDAY	0x13
143a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_DATE		0x14
144a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_MONTH	0x15
145a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_YEAR1	0x16
146a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_YEAR2	0x17
147a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM0_CNTL		0x18
148a91d2f8dSGyungoh Yoo #define MAX8907_REG_ALARM1_CNTL		0x19
149a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_STATUS		0x1A
150a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_CNTL		0x1B
151a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_IRQ		0x1C
152a91d2f8dSGyungoh Yoo #define MAX8907_REG_RTC_IRQ_MASK	0x1D
153a91d2f8dSGyungoh Yoo #define MAX8907_REG_MPL_CNTL		0x1E
154a91d2f8dSGyungoh Yoo 
155a91d2f8dSGyungoh Yoo /* ADC and Touch Screen Controller register map */
156a91d2f8dSGyungoh Yoo #define MAX8907_CTL			0
157a91d2f8dSGyungoh Yoo #define MAX8907_SEQCNT			1
158a91d2f8dSGyungoh Yoo #define MAX8907_VOUT			2
159a91d2f8dSGyungoh Yoo 
160a91d2f8dSGyungoh Yoo /* mask bit fields */
161a91d2f8dSGyungoh Yoo #define MAX8907_MASK_LDO_SEQ		0x1C
162a91d2f8dSGyungoh Yoo #define MAX8907_MASK_LDO_EN		0x01
163a91d2f8dSGyungoh Yoo #define MAX8907_MASK_VBBATTCV		0x03
164a91d2f8dSGyungoh Yoo #define MAX8907_MASK_OUT5V_VINEN	0x10
165a91d2f8dSGyungoh Yoo #define MAX8907_MASK_OUT5V_ENSRC	0x0E
166a91d2f8dSGyungoh Yoo #define MAX8907_MASK_OUT5V_EN		0x01
1679582fdcbSStephen Warren #define MAX8907_MASK_POWER_OFF		0x40
168a91d2f8dSGyungoh Yoo 
169a91d2f8dSGyungoh Yoo /* Regulator IDs */
170a91d2f8dSGyungoh Yoo #define MAX8907_MBATT	0
171a91d2f8dSGyungoh Yoo #define MAX8907_SD1	1
172a91d2f8dSGyungoh Yoo #define MAX8907_SD2	2
173a91d2f8dSGyungoh Yoo #define MAX8907_SD3	3
174a91d2f8dSGyungoh Yoo #define MAX8907_LDO1	4
175a91d2f8dSGyungoh Yoo #define MAX8907_LDO2	5
176a91d2f8dSGyungoh Yoo #define MAX8907_LDO3	6
177a91d2f8dSGyungoh Yoo #define MAX8907_LDO4	7
178a91d2f8dSGyungoh Yoo #define MAX8907_LDO5	8
179a91d2f8dSGyungoh Yoo #define MAX8907_LDO6	9
180a91d2f8dSGyungoh Yoo #define MAX8907_LDO7	10
181a91d2f8dSGyungoh Yoo #define MAX8907_LDO8	11
182a91d2f8dSGyungoh Yoo #define MAX8907_LDO9	12
183a91d2f8dSGyungoh Yoo #define MAX8907_LDO10	13
184a91d2f8dSGyungoh Yoo #define MAX8907_LDO11	14
185a91d2f8dSGyungoh Yoo #define MAX8907_LDO12	15
186a91d2f8dSGyungoh Yoo #define MAX8907_LDO13	16
187a91d2f8dSGyungoh Yoo #define MAX8907_LDO14	17
188a91d2f8dSGyungoh Yoo #define MAX8907_LDO15	18
189a91d2f8dSGyungoh Yoo #define MAX8907_LDO16	19
190a91d2f8dSGyungoh Yoo #define MAX8907_LDO17	20
191a91d2f8dSGyungoh Yoo #define MAX8907_LDO18	21
192a91d2f8dSGyungoh Yoo #define MAX8907_LDO19	22
193a91d2f8dSGyungoh Yoo #define MAX8907_LDO20	23
194a91d2f8dSGyungoh Yoo #define MAX8907_OUT5V	24
195a91d2f8dSGyungoh Yoo #define MAX8907_OUT33V	25
196a91d2f8dSGyungoh Yoo #define MAX8907_BBAT	26
197a91d2f8dSGyungoh Yoo #define MAX8907_SDBY	27
198a91d2f8dSGyungoh Yoo #define MAX8907_VRTC	28
199a91d2f8dSGyungoh Yoo #define MAX8907_NUM_REGULATORS (MAX8907_VRTC + 1)
200a91d2f8dSGyungoh Yoo 
201a91d2f8dSGyungoh Yoo /* IRQ definitions */
202a91d2f8dSGyungoh Yoo enum {
203a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_DC_OVP = 0,
204a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_DC_F,
205a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_DC_R,
206a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_THM_OK_R,
207a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_THM_OK_F,
208a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_MBATTLOW_F,
209a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_MBATTLOW_R,
210a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_RST,
211a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_DONE,
212a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_TOPOFF,
213a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_VCHG_TMR_FAULT,
214a91d2f8dSGyungoh Yoo 
215a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_RSTIN = 0,
216a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_MPL,
217a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SW_3SEC,
218a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_EXTON_F,
219a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_EXTON_R,
220a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SW_1SEC,
221a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SW_F,
222a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SW_R,
223a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SYSCKEN_F,
224a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_GPM_SYSCKEN_R,
225a91d2f8dSGyungoh Yoo 
226a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_RTC_ALARM1 = 0,
227a91d2f8dSGyungoh Yoo 	MAX8907_IRQ_RTC_ALARM0,
228a91d2f8dSGyungoh Yoo };
229a91d2f8dSGyungoh Yoo 
230a91d2f8dSGyungoh Yoo struct max8907_platform_data {
231a91d2f8dSGyungoh Yoo 	struct regulator_init_data *init_data[MAX8907_NUM_REGULATORS];
2329582fdcbSStephen Warren 	bool pm_off;
233a91d2f8dSGyungoh Yoo };
234a91d2f8dSGyungoh Yoo 
235a91d2f8dSGyungoh Yoo struct regmap_irq_chips_data;
236a91d2f8dSGyungoh Yoo 
237a91d2f8dSGyungoh Yoo struct max8907 {
238a91d2f8dSGyungoh Yoo 	struct device			*dev;
239a91d2f8dSGyungoh Yoo 	struct mutex			irq_lock;
240a91d2f8dSGyungoh Yoo 	struct i2c_client		*i2c_gen;
241a91d2f8dSGyungoh Yoo 	struct i2c_client		*i2c_rtc;
242a91d2f8dSGyungoh Yoo 	struct regmap			*regmap_gen;
243a91d2f8dSGyungoh Yoo 	struct regmap			*regmap_rtc;
244a91d2f8dSGyungoh Yoo 	struct regmap_irq_chip_data	*irqc_chg;
245a91d2f8dSGyungoh Yoo 	struct regmap_irq_chip_data	*irqc_on_off;
246a91d2f8dSGyungoh Yoo 	struct regmap_irq_chip_data	*irqc_rtc;
247a91d2f8dSGyungoh Yoo };
248a91d2f8dSGyungoh Yoo 
249a91d2f8dSGyungoh Yoo #endif
250