summaryrefslogtreecommitdiff
path: root/include/linux/power/max77705_charger.h
blob: b3950ce0625e1abe96457cb65fd477da4a27cafd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Maxim MAX77705 definitions.
 *
 * Copyright (C) 2015 Samsung Electronics, Inc.
 * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com>
 */

#ifndef __MAX77705_CHARGER_H
#define __MAX77705_CHARGER_H __FILE__

#include <linux/regmap.h>

/* MAX77705_CHG_REG_CHG_INT */
#define MAX77705_BYP_I		(0)
#define MAX77705_INP_LIMIT_I	(1)
#define MAX77705_BATP_I		(2)
#define MAX77705_BAT_I		(3)
#define MAX77705_CHG_I		(4)
#define MAX77705_WCIN_I		(5)
#define MAX77705_CHGIN_I	(6)
#define MAX77705_AICL_I		(7)

/* MAX77705_CHG_REG_CHG_INT_OK */
#define MAX77705_BYP_OK		BIT(MAX77705_BYP_I)
#define MAX77705_DISQBAT_OK	BIT(MAX77705_INP_LIMIT_I)
#define MAX77705_BATP_OK	BIT(MAX77705_BATP_I)
#define MAX77705_BAT_OK		BIT(MAX77705_BAT_I)
#define MAX77705_CHG_OK		BIT(MAX77705_CHG_I)
#define MAX77705_WCIN_OK	BIT(MAX77705_WCIN_I)
#define MAX77705_CHGIN_OK	BIT(MAX77705_CHGIN_I)
#define MAX77705_AICL_OK	BIT(MAX77705_AICL_I)

/* MAX77705_CHG_REG_DETAILS_00 */
#define MAX77705_BATP_DTLS		BIT(0)
#define MAX77705_WCIN_DTLS		GENMASK(4, 3)
#define MAX77705_WCIN_DTLS_SHIFT	3
#define MAX77705_CHGIN_DTLS		GENMASK(6, 5)
#define MAX77705_CHGIN_DTLS_SHIFT	5

/* MAX77705_CHG_REG_DETAILS_01 */
#define MAX77705_CHG_DTLS	GENMASK(3, 0)
#define MAX77705_CHG_DTLS_SHIFT	0
#define MAX77705_BAT_DTLS	GENMASK(6, 4)
#define MAX77705_BAT_DTLS_SHIFT	4

/* MAX77705_CHG_REG_DETAILS_02 */
#define MAX77705_BYP_DTLS	GENMASK(3, 0)
#define MAX77705_BYP_DTLS_SHIFT	0

/* MAX77705_CHG_REG_CNFG_00 */
#define MAX77705_CHG_SHIFT	0
#define MAX77705_UNO_SHIFT	1
#define MAX77705_OTG_SHIFT	1
#define MAX77705_BUCK_SHIFT	2
#define MAX77705_BOOST_SHIFT	3
#define MAX77705_WDTEN_SHIFT	4
#define MAX77705_CHG_MASK	BIT(MAX77705_CHG_SHIFT)
#define MAX77705_UNO_MASK	BIT(MAX77705_UNO_SHIFT)
#define MAX77705_OTG_MASK	BIT(MAX77705_OTG_SHIFT)
#define MAX77705_BUCK_MASK	BIT(MAX77705_BUCK_SHIFT)
#define MAX77705_BOOST_MASK	BIT(MAX77705_BOOST_SHIFT)
#define MAX77705_WDTEN_MASK	BIT(MAX77705_WDTEN_SHIFT)
#define MAX77705_UNO_CTRL	(MAX77705_UNO_MASK | MAX77705_BOOST_MASK)
#define MAX77705_OTG_CTRL	(MAX77705_OTG_MASK | MAX77705_BOOST_MASK)

/* MAX77705_CHG_REG_CNFG_01 */
#define MAX77705_FCHGTIME_DISABLE	0
#define MAX77705_CHG_RSTRT_DISABLE	0x3

#define MAX77705_CHG_PQEN_DISABLE	0
#define MAX77705_CHG_PQEN_ENABLE	1

/* MAX77705_CHG_REG_CNFG_02 */
#define MAX77705_OTG_ILIM_500		0
#define MAX77705_OTG_ILIM_900		1
#define MAX77705_OTG_ILIM_1200		2
#define MAX77705_OTG_ILIM_1500		3

/* MAX77705_CHG_REG_CNFG_03 */
#define MAX77705_TO_ITH_150MA		0
#define MAX77705_TO_TIME_30M		3
#define MAX77705_SYS_TRACK_ENABLE	0
#define MAX77705_SYS_TRACK_DISABLE	1

/* MAX77705_CHG_REG_CNFG_04 */
#define MAX77705_CHG_MINVSYS_SHIFT	6
#define MAX77705_CHG_MINVSYS_MASK	GENMASK(7, 6)

/* MAX77705_CHG_REG_CNFG_05 */
#define MAX77705_B2SOVRC_DISABLE	0
#define MAX77705_B2SOVRC_4_5A		6
#define MAX77705_B2SOVRC_4_8A		8
#define MAX77705_B2SOVRC_5_0A		9

/* MAX77705_CHG_CNFG_06 */
#define MAX77705_WDTCLR_SHIFT		0
#define MAX77705_WDTCLR_MASK		GENMASK(1, 0)
#define MAX77705_WDTCLR			1
#define MAX77705_CHGPROT_UNLOCKED	3
#define MAX77705_SLOWEST_LX_SLOPE	3

/* MAX77705_CHG_REG_CNFG_07 */
#define MAX77705_CHG_FMBST		4
#define MAX77705_REG_FMBST_SHIFT	2
#define MAX77705_REG_FMBST_MASK		BIT(MAX77705_REG_FMBST_SHIFT)
#define MAX77705_REG_FGSRC_SHIFT	1
#define MAX77705_REG_FGSRC_MASK		BIT(MAX77705_REG_FGSRC_SHIFT)

/* MAX77705_CHG_REG_CNFG_08 */
#define MAX77705_CHG_FSW_3MHz		0
#define MAX77705_CHG_FSW_2MHz		1
#define MAX77705_CHG_FSW_1_5MHz		2

/* MAX77705_CHG_REG_CNFG_09 */
#define MAX77705_CHG_DISABLE			0

/* MAX77705_CHG_REG_CNFG_12 */
/* REG=4.5V, UVLO=4.7V */
#define MAX77705_VCHGIN_4_5		0
/* REG=4.5V, UVLO=4.7V */
#define MAX77705_WCIN_4_5		0
#define MAX77705_DISABLE_SKIP		1
#define MAX77705_AUTO_SKIP		0

#define AICL_WORK_DELAY_MS		100

/* uA */
#define MAX77705_CURRENT_CHGIN_STEP	25000
#define MAX77705_CURRENT_CHG_STEP	50000
#define MAX77705_CURRENT_CHGIN_MIN	100000
#define MAX77705_CURRENT_CHGIN_MAX	3200000

enum max77705_field_idx {
	MAX77705_CHGPROT,
	MAX77705_CHG_EN,
	MAX77705_CHG_CC_LIM,
	MAX77705_CHG_CHGIN_LIM,
	MAX77705_CHG_CV_PRM,
	MAX77705_CHG_PQEN,
	MAX77705_CHG_RSTRT,
	MAX77705_CHG_WCIN,
	MAX77705_FCHGTIME,
	MAX77705_LX_SLOPE,
	MAX77705_MODE,
	MAX77705_OTG_ILIM,
	MAX77705_REG_B2SOVRC,
	MAX77705_REG_DISKIP,
	MAX77705_REG_FSW,
	MAX77705_SYS_TRACK,
	MAX77705_TO,
	MAX77705_TO_TIME,
	MAX77705_VBYPSET,
	MAX77705_VCHGIN,
	MAX77705_WCIN,
	MAX77705_N_REGMAP_FIELDS,
};

static const struct reg_field max77705_reg_field[MAX77705_N_REGMAP_FIELDS] = {
	[MAX77705_MODE]			= REG_FIELD(MAX77705_CHG_REG_CNFG_00,   0, 3),
	[MAX77705_FCHGTIME]		= REG_FIELD(MAX77705_CHG_REG_CNFG_01,   0, 2),
	[MAX77705_CHG_RSTRT]		= REG_FIELD(MAX77705_CHG_REG_CNFG_01,   4, 5),
	[MAX77705_CHG_PQEN]		= REG_FIELD(MAX77705_CHG_REG_CNFG_01,   7, 7),
	[MAX77705_CHG_CC_LIM]		= REG_FIELD(MAX77705_CHG_REG_CNFG_02,   0, 5),
	[MAX77705_OTG_ILIM]		= REG_FIELD(MAX77705_CHG_REG_CNFG_02,   6, 7),
	[MAX77705_TO]			= REG_FIELD(MAX77705_CHG_REG_CNFG_03,   0, 2),
	[MAX77705_TO_TIME]		= REG_FIELD(MAX77705_CHG_REG_CNFG_03,   3, 5),
	[MAX77705_SYS_TRACK]		= REG_FIELD(MAX77705_CHG_REG_CNFG_03,   7, 7),
	[MAX77705_CHG_CV_PRM]		= REG_FIELD(MAX77705_CHG_REG_CNFG_04,   0, 5),
	[MAX77705_REG_B2SOVRC]		= REG_FIELD(MAX77705_CHG_REG_CNFG_05,   0, 3),
	[MAX77705_CHGPROT]		= REG_FIELD(MAX77705_CHG_REG_CNFG_06,   2, 3),
	[MAX77705_LX_SLOPE]		= REG_FIELD(MAX77705_CHG_REG_CNFG_06,   5, 6),
	[MAX77705_REG_FSW]		= REG_FIELD(MAX77705_CHG_REG_CNFG_08,   0, 1),
	[MAX77705_CHG_CHGIN_LIM]	= REG_FIELD(MAX77705_CHG_REG_CNFG_09,   0, 6),
	[MAX77705_CHG_EN]		= REG_FIELD(MAX77705_CHG_REG_CNFG_09,   7, 7),
	[MAX77705_CHG_WCIN]		= REG_FIELD(MAX77705_CHG_REG_CNFG_10,   0, 5),
	[MAX77705_VBYPSET]		= REG_FIELD(MAX77705_CHG_REG_CNFG_11,   0, 6),
	[MAX77705_REG_DISKIP]		= REG_FIELD(MAX77705_CHG_REG_CNFG_12,   0, 0),
	[MAX77705_WCIN]			= REG_FIELD(MAX77705_CHG_REG_CNFG_12,   1, 2),
	[MAX77705_VCHGIN]		= REG_FIELD(MAX77705_CHG_REG_CNFG_12,   3, 4),
};

struct max77705_charger_data {
	struct device			*dev;
	struct regmap		*regmap;
	struct regmap_field	*rfield[MAX77705_N_REGMAP_FIELDS];
	struct power_supply_battery_info *bat_info;
	struct workqueue_struct *wqueue;
	struct work_struct	chgin_work;
	struct power_supply	*psy_chg;
};

#endif /* __MAX77705_CHARGER_H */