xref: /linux/drivers/regulator/rt5133-regulator.c (revision 6d068f1ae2a2f713d7f21a9a602e65b3d6b6fc6d)
1714165e1SJeff Chang // SPDX-License-Identifier: GPL-2.0
2714165e1SJeff Chang // Copyright (C) 2025 Richtek Technology Corp.
3714165e1SJeff Chang // Author: ChiYuan Huang <cy_huang@richtek.com>
4714165e1SJeff Chang // Author: ShihChia Chang <jeff_chang@richtek.com>
5714165e1SJeff Chang 
6714165e1SJeff Chang #include <linux/crc8.h>
7714165e1SJeff Chang #include <linux/delay.h>
8714165e1SJeff Chang #include <linux/gpio/consumer.h>
9714165e1SJeff Chang #include <linux/gpio/driver.h>
10714165e1SJeff Chang #include <linux/i2c.h>
11714165e1SJeff Chang #include <linux/interrupt.h>
12714165e1SJeff Chang #include <linux/kernel.h>
13714165e1SJeff Chang #include <linux/module.h>
14714165e1SJeff Chang #include <linux/of.h>
15714165e1SJeff Chang #include <linux/regmap.h>
16714165e1SJeff Chang #include <linux/regulator/driver.h>
17714165e1SJeff Chang 
18714165e1SJeff Chang #define RT5133_REG_CHIP_INFO		0x00
19714165e1SJeff Chang #define RT5133_REG_RST_CTRL		0x06
20714165e1SJeff Chang #define RT5133_REG_BASE_CTRL		0x09
21714165e1SJeff Chang #define RT5133_REG_GPIO_CTRL		0x0B
22714165e1SJeff Chang #define RT5133_REG_BASE_EVT		0x10
23714165e1SJeff Chang #define RT5133_REG_LDO_PGB_STAT		0x15
24714165e1SJeff Chang #define RT5133_REG_BASE_MASK		0x16
25714165e1SJeff Chang #define RT5133_REG_LDO_SHDN		0x19
26714165e1SJeff Chang #define RT5133_REG_LDO_ON		0x1A
27714165e1SJeff Chang #define RT5133_REG_LDO_OFF		0x1B
28714165e1SJeff Chang #define RT5133_REG_LDO1_CTRL1		0x20
29714165e1SJeff Chang #define RT5133_REG_LDO1_CTRL2		0x21
30714165e1SJeff Chang #define RT5133_REG_LDO1_CTRL3		0x22
31714165e1SJeff Chang #define RT5133_REG_LDO2_CTRL1		0x24
32714165e1SJeff Chang #define RT5133_REG_LDO2_CTRL2		0x25
33714165e1SJeff Chang #define RT5133_REG_LDO2_CTRL3		0x26
34714165e1SJeff Chang #define RT5133_REG_LDO3_CTRL1		0x28
35714165e1SJeff Chang #define RT5133_REG_LDO3_CTRL2		0x29
36714165e1SJeff Chang #define RT5133_REG_LDO3_CTRL3		0x2A
37714165e1SJeff Chang #define RT5133_REG_LDO4_CTRL1		0x2C
38714165e1SJeff Chang #define RT5133_REG_LDO4_CTRL2		0x2D
39714165e1SJeff Chang #define RT5133_REG_LDO4_CTRL3		0x2E
40714165e1SJeff Chang #define RT5133_REG_LDO5_CTRL1		0x30
41714165e1SJeff Chang #define RT5133_REG_LDO5_CTRL2		0x31
42714165e1SJeff Chang #define RT5133_REG_LDO5_CTRL3		0x32
43714165e1SJeff Chang #define RT5133_REG_LDO6_CTRL1		0x34
44714165e1SJeff Chang #define RT5133_REG_LDO6_CTRL2		0x35
45714165e1SJeff Chang #define RT5133_REG_LDO6_CTRL3		0x36
46714165e1SJeff Chang #define RT5133_REG_LDO7_CTRL1		0x38
47714165e1SJeff Chang #define RT5133_REG_LDO7_CTRL2		0x39
48714165e1SJeff Chang #define RT5133_REG_LDO7_CTRL3		0x3A
49714165e1SJeff Chang #define RT5133_REG_LDO8_CTRL1		0x3C
50714165e1SJeff Chang #define RT5133_REG_LDO8_CTRL2		0x3D
51714165e1SJeff Chang #define RT5133_REG_LDO8_CTRL3		0x3E
52714165e1SJeff Chang #define RT5133_REG_LDO8_CTRL4		0x3F
53714165e1SJeff Chang 
54714165e1SJeff Chang #define RT5133_LDO_REG_BASE(_id)	(0x20 + ((_id) - 1) * 4)
55714165e1SJeff Chang 
56714165e1SJeff Chang #define RT5133_VENDOR_ID_MASK		GENMASK(7, 4)
57714165e1SJeff Chang #define RT5133_RESET_CODE		0xB1
58714165e1SJeff Chang 
59714165e1SJeff Chang #define RT5133_FOFF_BASE_MASK		BIT(1)
60714165e1SJeff Chang #define RT5133_OCSHDN_ALL_MASK		BIT(7)
61714165e1SJeff Chang #define RT5133_OCSHDN_ALL_SHIFT		(7)
62714165e1SJeff Chang #define RT5133_PGBSHDN_ALL_MASK		BIT(6)
63714165e1SJeff Chang #define RT5133_PGBSHDN_ALL_SHIFT	(6)
64714165e1SJeff Chang 
65714165e1SJeff Chang #define RT5133_OCPTSEL_MASK		BIT(5)
66714165e1SJeff Chang #define RT5133_PGBPTSEL_MASK		BIT(4)
67714165e1SJeff Chang #define RT5133_STBTDSEL_MASK		GENMASK(1, 0)
68714165e1SJeff Chang 
69714165e1SJeff Chang #define RT5133_LDO_ENABLE_MASK		BIT(7)
70714165e1SJeff Chang #define RT5133_LDO_VSEL_MASK		GENMASK(7, 5)
71714165e1SJeff Chang #define RT5133_LDO_AD_MASK		BIT(2)
72714165e1SJeff Chang #define RT5133_LDO_SOFT_START_MASK	GENMASK(1, 0)
73714165e1SJeff Chang 
74714165e1SJeff Chang #define RT5133_GPIO_NR			3
75714165e1SJeff Chang 
76714165e1SJeff Chang #define RT5133_LDO_PGB_EVT_MASK		GENMASK(23, 16)
77714165e1SJeff Chang #define RT5133_LDO_PGB_EVT_SHIFT	16
78714165e1SJeff Chang #define RT5133_LDO_OC_EVT_MASK		GENMASK(15, 8)
79714165e1SJeff Chang #define RT5133_LDO_OC_EVT_SHIFT		8
80714165e1SJeff Chang #define RT5133_VREF_EVT_MASK		BIT(6)
81714165e1SJeff Chang #define RT5133_BASE_EVT_MASK		GENMASK(7, 0)
82714165e1SJeff Chang #define RT5133_INTR_CLR_MASK		GENMASK(23, 0)
83714165e1SJeff Chang #define RT5133_INTR_BYTE_NR		3
84714165e1SJeff Chang 
85714165e1SJeff Chang #define RT5133_MAX_I2C_BLOCK_SIZE	1
86714165e1SJeff Chang 
87714165e1SJeff Chang #define RT5133_CRC8_POLYNOMIAL		0x7
88714165e1SJeff Chang 
89714165e1SJeff Chang #define RT5133_I2C_ADDR_LEN		1
90714165e1SJeff Chang #define RT5133_PREDATA_LEN		2
91714165e1SJeff Chang #define RT5133_I2C_CRC_LEN		1
92714165e1SJeff Chang #define RT5133_REG_ADDR_LEN		1
93714165e1SJeff Chang #define RT5133_I2C_DUMMY_LEN		1
94714165e1SJeff Chang 
95714165e1SJeff Chang #define I2C_ADDR_XLATE_8BIT(_addr, _rw)	((((_addr) & 0x7F) << 1) | (_rw))
96714165e1SJeff Chang 
97714165e1SJeff Chang enum {
98714165e1SJeff Chang 	RT5133_REGULATOR_BASE = 0,
99714165e1SJeff Chang 	RT5133_REGULATOR_LDO1,
100714165e1SJeff Chang 	RT5133_REGULATOR_LDO2,
101714165e1SJeff Chang 	RT5133_REGULATOR_LDO3,
102714165e1SJeff Chang 	RT5133_REGULATOR_LDO4,
103714165e1SJeff Chang 	RT5133_REGULATOR_LDO5,
104714165e1SJeff Chang 	RT5133_REGULATOR_LDO6,
105714165e1SJeff Chang 	RT5133_REGULATOR_LDO7,
106714165e1SJeff Chang 	RT5133_REGULATOR_LDO8,
107714165e1SJeff Chang 	RT5133_REGULATOR_MAX
108714165e1SJeff Chang };
109714165e1SJeff Chang 
110714165e1SJeff Chang struct chip_data {
111714165e1SJeff Chang 	const struct regulator_desc *regulators;
112714165e1SJeff Chang 	const u8 vendor_id;
113714165e1SJeff Chang };
114714165e1SJeff Chang 
115714165e1SJeff Chang struct rt5133_priv {
116714165e1SJeff Chang 	struct device *dev;
117714165e1SJeff Chang 	struct regmap *regmap;
118714165e1SJeff Chang 	struct gpio_desc *enable_gpio;
119714165e1SJeff Chang 	struct regulator_dev *rdev[RT5133_REGULATOR_MAX];
120714165e1SJeff Chang 	struct gpio_chip gc;
121714165e1SJeff Chang 	const struct chip_data *cdata;
122714165e1SJeff Chang 	unsigned int gpio_output_flag;
123714165e1SJeff Chang 	u8 crc8_tbls[CRC8_TABLE_SIZE];
124714165e1SJeff Chang };
125714165e1SJeff Chang 
126714165e1SJeff Chang static const unsigned int vout_type1_tables[] = {
127714165e1SJeff Chang 	1800000, 2500000, 2700000, 2800000, 2900000, 3000000, 3100000, 3200000
128714165e1SJeff Chang };
129714165e1SJeff Chang 
130714165e1SJeff Chang static const unsigned int vout_type2_tables[] = {
131714165e1SJeff Chang 	1700000, 1800000, 1900000, 2500000, 2700000, 2800000, 2900000, 3000000
132714165e1SJeff Chang };
133714165e1SJeff Chang 
134714165e1SJeff Chang static const unsigned int vout_type3_tables[] = {
135714165e1SJeff Chang 	900000, 950000, 1000000, 1050000, 1100000, 1150000, 1200000, 1800000
136714165e1SJeff Chang };
137714165e1SJeff Chang 
138714165e1SJeff Chang static const unsigned int vout_type4_tables[] = {
139714165e1SJeff Chang 	855000, 900000, 950000, 1000000, 1040000, 1090000, 1140000, 1710000
140714165e1SJeff Chang };
141714165e1SJeff Chang 
142714165e1SJeff Chang static const struct regulator_ops rt5133_regulator_ops = {
143714165e1SJeff Chang 	.list_voltage = regulator_list_voltage_table,
144714165e1SJeff Chang 	.set_voltage_sel = regulator_set_voltage_sel_regmap,
145714165e1SJeff Chang 	.get_voltage_sel = regulator_get_voltage_sel_regmap,
146714165e1SJeff Chang 	.enable = regulator_enable_regmap,
147714165e1SJeff Chang 	.disable = regulator_disable_regmap,
148714165e1SJeff Chang 	.is_enabled = regulator_is_enabled_regmap,
149714165e1SJeff Chang 	.set_active_discharge = regulator_set_active_discharge_regmap,
150714165e1SJeff Chang };
151714165e1SJeff Chang 
152714165e1SJeff Chang static const struct regulator_ops rt5133_base_regulator_ops = {
153714165e1SJeff Chang 	.enable = regulator_enable_regmap,
154714165e1SJeff Chang 	.disable = regulator_disable_regmap,
155714165e1SJeff Chang 	.is_enabled = regulator_is_enabled_regmap,
156714165e1SJeff Chang };
157714165e1SJeff Chang 
158714165e1SJeff Chang #define RT5133_REGULATOR_DESC(_name, _node_name, vtables, _supply) \
159714165e1SJeff Chang {\
160714165e1SJeff Chang 	.name = #_name,\
161714165e1SJeff Chang 	.id = RT5133_REGULATOR_##_name,\
162714165e1SJeff Chang 	.of_match = of_match_ptr(#_node_name),\
163714165e1SJeff Chang 	.regulators_node = of_match_ptr("regulators"),\
164714165e1SJeff Chang 	.supply_name = _supply,\
165714165e1SJeff Chang 	.type = REGULATOR_VOLTAGE,\
166714165e1SJeff Chang 	.owner = THIS_MODULE,\
167714165e1SJeff Chang 	.ops = &rt5133_regulator_ops,\
168714165e1SJeff Chang 	.n_voltages = ARRAY_SIZE(vtables),\
169714165e1SJeff Chang 	.volt_table = vtables,\
170714165e1SJeff Chang 	.enable_reg = RT5133_REG_##_name##_CTRL1,\
171714165e1SJeff Chang 	.enable_mask = RT5133_LDO_ENABLE_MASK,\
172714165e1SJeff Chang 	.vsel_reg = RT5133_REG_##_name##_CTRL2,\
173714165e1SJeff Chang 	.vsel_mask = RT5133_LDO_VSEL_MASK,\
174714165e1SJeff Chang 	.active_discharge_reg = RT5133_REG_##_name##_CTRL3,\
175714165e1SJeff Chang 	.active_discharge_mask = RT5133_LDO_AD_MASK,\
176714165e1SJeff Chang }
177714165e1SJeff Chang 
178714165e1SJeff Chang static const struct regulator_desc rt5133_regulators[] = {
179714165e1SJeff Chang 	/* For digital part, base current control */
180714165e1SJeff Chang 	{
181714165e1SJeff Chang 		.name = "base",
182714165e1SJeff Chang 		.id = RT5133_REGULATOR_BASE,
183714165e1SJeff Chang 		.of_match = of_match_ptr("base"),
184714165e1SJeff Chang 		.regulators_node = of_match_ptr("regulators"),
185714165e1SJeff Chang 		.type = REGULATOR_VOLTAGE,
186714165e1SJeff Chang 		.owner = THIS_MODULE,
187714165e1SJeff Chang 		.ops = &rt5133_base_regulator_ops,
188714165e1SJeff Chang 		.enable_reg = RT5133_REG_BASE_CTRL,
189714165e1SJeff Chang 		.enable_mask = RT5133_FOFF_BASE_MASK,
190714165e1SJeff Chang 		.enable_is_inverted = true,
191714165e1SJeff Chang 	},
192714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO1, ldo1, vout_type1_tables, "base"),
193714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO2, ldo2, vout_type1_tables, "base"),
194714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO3, ldo3, vout_type2_tables, "base"),
195714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO4, ldo4, vout_type2_tables, "base"),
196714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO5, ldo5, vout_type2_tables, "base"),
197714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO6, ldo6, vout_type2_tables, "base"),
198714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO7, ldo7, vout_type3_tables, "vin"),
199714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO8, ldo8, vout_type3_tables, "vin"),
200714165e1SJeff Chang };
201714165e1SJeff Chang 
202714165e1SJeff Chang static const struct regulator_desc rt5133a_regulators[] = {
203714165e1SJeff Chang 	/* For digital part, base current control */
204714165e1SJeff Chang 	{
205714165e1SJeff Chang 		.name = "base",
206714165e1SJeff Chang 		.id = RT5133_REGULATOR_BASE,
207714165e1SJeff Chang 		.of_match = of_match_ptr("base"),
208714165e1SJeff Chang 		.regulators_node = of_match_ptr("regulators"),
209714165e1SJeff Chang 		.type = REGULATOR_VOLTAGE,
210714165e1SJeff Chang 		.owner = THIS_MODULE,
211714165e1SJeff Chang 		.ops = &rt5133_base_regulator_ops,
212714165e1SJeff Chang 		.enable_reg = RT5133_REG_BASE_CTRL,
213714165e1SJeff Chang 		.enable_mask = RT5133_FOFF_BASE_MASK,
214714165e1SJeff Chang 		.enable_is_inverted = true,
215714165e1SJeff Chang 	},
216714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO1, ldo1, vout_type1_tables, "base"),
217714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO2, ldo2, vout_type1_tables, "base"),
218714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO3, ldo3, vout_type2_tables, "base"),
219714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO4, ldo4, vout_type2_tables, "base"),
220714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO5, ldo5, vout_type2_tables, "base"),
221714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO6, ldo6, vout_type2_tables, "base"),
222714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO7, ldo7, vout_type3_tables, "vin"),
223714165e1SJeff Chang 	RT5133_REGULATOR_DESC(LDO8, ldo8, vout_type4_tables, "vin"),
224714165e1SJeff Chang };
225714165e1SJeff Chang 
226714165e1SJeff Chang static const struct chip_data regulator_data[] = {
227714165e1SJeff Chang 	{ rt5133_regulators, 0x70},
228714165e1SJeff Chang 	{ rt5133a_regulators, 0x80},
229714165e1SJeff Chang };
230714165e1SJeff Chang 
231714165e1SJeff Chang static int rt5133_gpio_direction_output(struct gpio_chip *gpio,
232714165e1SJeff Chang 					unsigned int offset, int value)
233714165e1SJeff Chang {
234714165e1SJeff Chang 	struct rt5133_priv *priv = gpiochip_get_data(gpio);
235714165e1SJeff Chang 
236714165e1SJeff Chang 	if (offset >= RT5133_GPIO_NR)
237714165e1SJeff Chang 		return -EINVAL;
238714165e1SJeff Chang 
239714165e1SJeff Chang 	return regmap_update_bits(priv->regmap, RT5133_REG_GPIO_CTRL,
240714165e1SJeff Chang 				  BIT(7 - offset) | BIT(3 - offset),
241714165e1SJeff Chang 				  value ? BIT(7 - offset) | BIT(3 - offset) : 0);
242714165e1SJeff Chang }
243714165e1SJeff Chang 
244714165e1SJeff Chang static int rt5133_gpio_get(struct gpio_chip *chip, unsigned int offset)
245714165e1SJeff Chang {
246714165e1SJeff Chang 	struct rt5133_priv *priv = gpiochip_get_data(chip);
247714165e1SJeff Chang 
248714165e1SJeff Chang 	return !!(priv->gpio_output_flag & BIT(offset));
249714165e1SJeff Chang }
250714165e1SJeff Chang 
251714165e1SJeff Chang static int rt5133_get_gpioen_mask(unsigned int offset, unsigned int *mask)
252714165e1SJeff Chang {
253714165e1SJeff Chang 	if (offset >= RT5133_GPIO_NR)
254714165e1SJeff Chang 		return -EINVAL;
255714165e1SJeff Chang 
256714165e1SJeff Chang 	*mask = (BIT(7 - offset) | BIT(3 - offset));
257714165e1SJeff Chang 
258714165e1SJeff Chang 	return 0;
259714165e1SJeff Chang }
260714165e1SJeff Chang 
261714165e1SJeff Chang static int rt5133_gpio_set(struct gpio_chip *chip, unsigned int offset, int set_val)
262714165e1SJeff Chang {
263714165e1SJeff Chang 	struct rt5133_priv *priv = gpiochip_get_data(chip);
264714165e1SJeff Chang 	unsigned int mask = 0, val = 0, next_flag = priv->gpio_output_flag;
265714165e1SJeff Chang 	int ret = 0;
266714165e1SJeff Chang 
267714165e1SJeff Chang 	ret = rt5133_get_gpioen_mask(offset, &mask);
268714165e1SJeff Chang 	if (ret) {
269714165e1SJeff Chang 		dev_err(priv->dev, "%s get gpion en mask failed, offset(%d)\n", __func__, offset);
270714165e1SJeff Chang 		return ret;
271714165e1SJeff Chang 	}
272714165e1SJeff Chang 
273714165e1SJeff Chang 	val = set_val ? mask : 0;
274714165e1SJeff Chang 
275714165e1SJeff Chang 	if (set_val)
276714165e1SJeff Chang 		next_flag |= BIT(offset);
277714165e1SJeff Chang 	else
278714165e1SJeff Chang 		next_flag &= ~BIT(offset);
279714165e1SJeff Chang 
280714165e1SJeff Chang 	ret = regmap_update_bits(priv->regmap, RT5133_REG_GPIO_CTRL, mask, val);
281714165e1SJeff Chang 	if (ret) {
282714165e1SJeff Chang 		dev_err(priv->dev, "Failed to set gpio [%d] val %d\n", offset,
283714165e1SJeff Chang 			set_val);
284714165e1SJeff Chang 		return ret;
285714165e1SJeff Chang 	}
286714165e1SJeff Chang 
287714165e1SJeff Chang 	priv->gpio_output_flag = next_flag;
288714165e1SJeff Chang 	return 0;
289714165e1SJeff Chang }
290714165e1SJeff Chang 
291714165e1SJeff Chang static irqreturn_t rt5133_intr_handler(int irq_number, void *data)
292714165e1SJeff Chang {
293714165e1SJeff Chang 	struct rt5133_priv *priv = data;
294714165e1SJeff Chang 	u32 intr_evts = 0, handle_evts;
295714165e1SJeff Chang 	int i, ret;
296714165e1SJeff Chang 
297714165e1SJeff Chang 	ret = regmap_bulk_read(priv->regmap, RT5133_REG_BASE_EVT, &intr_evts,
298714165e1SJeff Chang 			       RT5133_INTR_BYTE_NR);
299714165e1SJeff Chang 	if (ret) {
300714165e1SJeff Chang 		dev_err(priv->dev, "%s, read event failed\n", __func__);
301714165e1SJeff Chang 		return IRQ_NONE;
302714165e1SJeff Chang 	}
303714165e1SJeff Chang 
304714165e1SJeff Chang 	handle_evts = intr_evts & RT5133_BASE_EVT_MASK;
305714165e1SJeff Chang 	/*
306714165e1SJeff Chang 	 * VREF_EVT is a special case, if base off
307714165e1SJeff Chang 	 * this event will also be trigger. Skip it
308714165e1SJeff Chang 	 */
309714165e1SJeff Chang 	if (handle_evts & ~RT5133_VREF_EVT_MASK)
310714165e1SJeff Chang 		dev_dbg(priv->dev, "base event occurred [0x%02x]\n",
311714165e1SJeff Chang 			handle_evts);
312714165e1SJeff Chang 
313714165e1SJeff Chang 	handle_evts = (intr_evts & RT5133_LDO_OC_EVT_MASK) >>
314714165e1SJeff Chang 		RT5133_LDO_OC_EVT_SHIFT;
315714165e1SJeff Chang 
316714165e1SJeff Chang 	for (i = RT5133_REGULATOR_LDO1; i < RT5133_REGULATOR_MAX && handle_evts; i++) {
317714165e1SJeff Chang 		if (!(handle_evts & BIT(i - 1)))
318714165e1SJeff Chang 			continue;
319714165e1SJeff Chang 		regulator_notifier_call_chain(priv->rdev[i],
320714165e1SJeff Chang 					      REGULATOR_EVENT_OVER_CURRENT,
321714165e1SJeff Chang 					      &i);
322714165e1SJeff Chang 	}
323714165e1SJeff Chang 
324714165e1SJeff Chang 	handle_evts = (intr_evts & RT5133_LDO_PGB_EVT_MASK) >>
325714165e1SJeff Chang 		RT5133_LDO_PGB_EVT_SHIFT;
326714165e1SJeff Chang 	for (i = RT5133_REGULATOR_LDO1; i < RT5133_REGULATOR_MAX && handle_evts; i++) {
327714165e1SJeff Chang 		if (!(handle_evts & BIT(i - 1)))
328714165e1SJeff Chang 			continue;
329714165e1SJeff Chang 		regulator_notifier_call_chain(priv->rdev[i],
330714165e1SJeff Chang 					      REGULATOR_EVENT_FAIL, &i);
331714165e1SJeff Chang 	}
332714165e1SJeff Chang 
333714165e1SJeff Chang 	ret = regmap_bulk_write(priv->regmap, RT5133_REG_BASE_EVT, &intr_evts,
334714165e1SJeff Chang 				RT5133_INTR_BYTE_NR);
335714165e1SJeff Chang 	if (ret)
336714165e1SJeff Chang 		dev_err(priv->dev, "%s, clear event failed\n", __func__);
337714165e1SJeff Chang 
338714165e1SJeff Chang 	return IRQ_HANDLED;
339714165e1SJeff Chang }
340714165e1SJeff Chang 
341714165e1SJeff Chang static int rt5133_enable_interrupts(int irq_no, struct rt5133_priv *priv)
342714165e1SJeff Chang {
343714165e1SJeff Chang 	u32 mask = RT5133_INTR_CLR_MASK;
344714165e1SJeff Chang 	int ret;
345714165e1SJeff Chang 
346714165e1SJeff Chang 	/* Force to write clear all events */
347714165e1SJeff Chang 	ret = regmap_bulk_write(priv->regmap, RT5133_REG_BASE_EVT, &mask,
348714165e1SJeff Chang 				RT5133_INTR_BYTE_NR);
349714165e1SJeff Chang 	if (ret) {
350714165e1SJeff Chang 		dev_err(priv->dev, "Failed to clear all interrupts\n");
351714165e1SJeff Chang 		return ret;
352714165e1SJeff Chang 	}
353714165e1SJeff Chang 
354714165e1SJeff Chang 	/* Unmask all interrupts */
355714165e1SJeff Chang 	mask = 0;
356714165e1SJeff Chang 	ret = regmap_bulk_write(priv->regmap, RT5133_REG_BASE_MASK, &mask,
357714165e1SJeff Chang 				RT5133_INTR_BYTE_NR);
358714165e1SJeff Chang 	if (ret) {
359714165e1SJeff Chang 		dev_err(priv->dev, "Failed to unmask all interrupts\n");
360714165e1SJeff Chang 		return ret;
361714165e1SJeff Chang 	}
362714165e1SJeff Chang 
363714165e1SJeff Chang 	return devm_request_threaded_irq(priv->dev, irq_no, NULL,
364714165e1SJeff Chang 					 rt5133_intr_handler, IRQF_ONESHOT,
365714165e1SJeff Chang 					 dev_name(priv->dev), priv);
366714165e1SJeff Chang }
367714165e1SJeff Chang 
368714165e1SJeff Chang static int rt5133_regmap_hw_read(void *context, const void *reg_buf,
369714165e1SJeff Chang 				 size_t reg_size, void *val_buf,
370714165e1SJeff Chang 				 size_t val_size)
371714165e1SJeff Chang {
372714165e1SJeff Chang 	struct rt5133_priv *priv = context;
373714165e1SJeff Chang 	struct i2c_client *client = to_i2c_client(priv->dev);
374714165e1SJeff Chang 	u8 reg = *(u8 *)reg_buf, crc;
375714165e1SJeff Chang 	u8 *buf;
376714165e1SJeff Chang 	int buf_len = RT5133_PREDATA_LEN + val_size + RT5133_I2C_CRC_LEN;
377714165e1SJeff Chang 	int read_len, ret;
378714165e1SJeff Chang 
379714165e1SJeff Chang 	buf = kzalloc(buf_len, GFP_KERNEL);
380714165e1SJeff Chang 	if (!buf)
381714165e1SJeff Chang 		return -ENOMEM;
382714165e1SJeff Chang 
383714165e1SJeff Chang 	buf[0] = I2C_ADDR_XLATE_8BIT(client->addr, I2C_SMBUS_READ);
384714165e1SJeff Chang 	buf[1] = reg;
385714165e1SJeff Chang 
386714165e1SJeff Chang 	read_len = val_size + RT5133_I2C_CRC_LEN;
387714165e1SJeff Chang 	ret = i2c_smbus_read_i2c_block_data(client, reg, read_len,
388714165e1SJeff Chang 					    buf + RT5133_PREDATA_LEN);
389714165e1SJeff Chang 
390714165e1SJeff Chang 	if (ret < 0)
391714165e1SJeff Chang 		goto out_read_err;
392714165e1SJeff Chang 
393714165e1SJeff Chang 	if (ret != read_len) {
394714165e1SJeff Chang 		ret = -EIO;
395714165e1SJeff Chang 		goto out_read_err;
396714165e1SJeff Chang 	}
397714165e1SJeff Chang 
398714165e1SJeff Chang 	crc = crc8(priv->crc8_tbls, buf, RT5133_PREDATA_LEN + val_size, 0);
399714165e1SJeff Chang 	if (crc != buf[RT5133_PREDATA_LEN + val_size]) {
400714165e1SJeff Chang 		ret = -EIO;
401714165e1SJeff Chang 		goto out_read_err;
402714165e1SJeff Chang 	}
403714165e1SJeff Chang 
404714165e1SJeff Chang 	memcpy(val_buf, buf + RT5133_PREDATA_LEN, val_size);
405714165e1SJeff Chang 	dev_dbg(priv->dev, "%s, reg = 0x%02x, data = 0x%02x\n", __func__, reg, *(u8 *)val_buf);
406714165e1SJeff Chang 
407714165e1SJeff Chang out_read_err:
408714165e1SJeff Chang 	kfree(buf);
409714165e1SJeff Chang 	return (ret < 0) ? ret : 0;
410714165e1SJeff Chang }
411714165e1SJeff Chang 
412714165e1SJeff Chang static int rt5133_regmap_hw_write(void *context, const void *data, size_t count)
413714165e1SJeff Chang {
414714165e1SJeff Chang 	struct rt5133_priv *priv = context;
415714165e1SJeff Chang 	struct i2c_client *client = to_i2c_client(priv->dev);
416714165e1SJeff Chang 	u8 reg = *(u8 *)data, crc;
417714165e1SJeff Chang 	u8 *buf;
418714165e1SJeff Chang 	int buf_len = RT5133_I2C_ADDR_LEN + count + RT5133_I2C_CRC_LEN +
419714165e1SJeff Chang 		RT5133_I2C_DUMMY_LEN;
420714165e1SJeff Chang 	int write_len, ret;
421714165e1SJeff Chang 
422714165e1SJeff Chang 	buf = kzalloc(buf_len, GFP_KERNEL);
423714165e1SJeff Chang 	if (!buf)
424714165e1SJeff Chang 		return -ENOMEM;
425714165e1SJeff Chang 
426714165e1SJeff Chang 	buf[0] = I2C_ADDR_XLATE_8BIT(client->addr, I2C_SMBUS_WRITE);
427714165e1SJeff Chang 	buf[1] = reg;
428714165e1SJeff Chang 	memcpy(buf + RT5133_PREDATA_LEN, data + RT5133_REG_ADDR_LEN,
429714165e1SJeff Chang 	       count - RT5133_REG_ADDR_LEN);
430714165e1SJeff Chang 
431714165e1SJeff Chang 	crc = crc8(priv->crc8_tbls, buf, RT5133_I2C_ADDR_LEN + count, 0);
432714165e1SJeff Chang 	buf[RT5133_I2C_ADDR_LEN + count] = crc;
433714165e1SJeff Chang 
434714165e1SJeff Chang 	write_len = count - RT5133_REG_ADDR_LEN + RT5133_I2C_CRC_LEN +
435714165e1SJeff Chang 		RT5133_I2C_DUMMY_LEN;
436714165e1SJeff Chang 	ret = i2c_smbus_write_i2c_block_data(client, reg, write_len,
437714165e1SJeff Chang 					     buf + RT5133_PREDATA_LEN);
438714165e1SJeff Chang 
439714165e1SJeff Chang 	dev_dbg(priv->dev, "%s, reg = 0x%02x, data = 0x%02x\n", __func__, reg,
440714165e1SJeff Chang 		*(u8 *)(buf + RT5133_PREDATA_LEN));
441714165e1SJeff Chang 	kfree(buf);
442714165e1SJeff Chang 	return ret;
443714165e1SJeff Chang }
444714165e1SJeff Chang 
445714165e1SJeff Chang static const struct regmap_bus rt5133_regmap_bus = {
446714165e1SJeff Chang 	.read = rt5133_regmap_hw_read,
447714165e1SJeff Chang 	.write = rt5133_regmap_hw_write,
448714165e1SJeff Chang 	/* Due to crc, the block read/write length has the limit */
449714165e1SJeff Chang 	.max_raw_read = RT5133_MAX_I2C_BLOCK_SIZE,
450714165e1SJeff Chang 	.max_raw_write = RT5133_MAX_I2C_BLOCK_SIZE,
451714165e1SJeff Chang };
452714165e1SJeff Chang 
453714165e1SJeff Chang static bool rt5133_is_volatile_reg(struct device *dev, unsigned int reg)
454714165e1SJeff Chang {
455714165e1SJeff Chang 	switch (reg) {
456714165e1SJeff Chang 	case RT5133_REG_CHIP_INFO:
457714165e1SJeff Chang 	case RT5133_REG_BASE_EVT...RT5133_REG_LDO_PGB_STAT:
458714165e1SJeff Chang 	case RT5133_REG_LDO_ON...RT5133_REG_LDO_OFF:
459714165e1SJeff Chang 	case RT5133_REG_LDO1_CTRL1:
460714165e1SJeff Chang 	case RT5133_REG_LDO2_CTRL1:
461714165e1SJeff Chang 	case RT5133_REG_LDO3_CTRL1:
462714165e1SJeff Chang 	case RT5133_REG_LDO4_CTRL1:
463714165e1SJeff Chang 	case RT5133_REG_LDO5_CTRL1:
464714165e1SJeff Chang 	case RT5133_REG_LDO6_CTRL1:
465714165e1SJeff Chang 	case RT5133_REG_LDO7_CTRL1:
466714165e1SJeff Chang 	case RT5133_REG_LDO8_CTRL1:
467714165e1SJeff Chang 		return true;
468714165e1SJeff Chang 	default:
469714165e1SJeff Chang 		return false;
470714165e1SJeff Chang 	};
471714165e1SJeff Chang }
472714165e1SJeff Chang 
473714165e1SJeff Chang static const struct regmap_config rt5133_regmap_config = {
474714165e1SJeff Chang 	.reg_bits = 8,
475714165e1SJeff Chang 	.val_bits = 8,
476714165e1SJeff Chang 	.max_register = RT5133_REG_LDO8_CTRL4,
477714165e1SJeff Chang 	.cache_type = REGCACHE_FLAT,
478714165e1SJeff Chang 	.num_reg_defaults_raw = RT5133_REG_LDO8_CTRL4 + 1,
479714165e1SJeff Chang 	.volatile_reg = rt5133_is_volatile_reg,
480714165e1SJeff Chang };
481714165e1SJeff Chang 
482714165e1SJeff Chang static int rt5133_chip_reset(struct rt5133_priv *priv)
483714165e1SJeff Chang {
484714165e1SJeff Chang 	int ret;
485714165e1SJeff Chang 
486714165e1SJeff Chang 	ret = regmap_write(priv->regmap, RT5133_REG_RST_CTRL,
487714165e1SJeff Chang 			   RT5133_RESET_CODE);
488714165e1SJeff Chang 	if (ret)
489714165e1SJeff Chang 		return ret;
490714165e1SJeff Chang 
491714165e1SJeff Chang 	/* Wait for register reset to take effect */
492714165e1SJeff Chang 	udelay(2);
493714165e1SJeff Chang 
494714165e1SJeff Chang 	return 0;
495714165e1SJeff Chang }
496714165e1SJeff Chang 
497714165e1SJeff Chang static int rt5133_validate_vendor_info(struct rt5133_priv *priv)
498714165e1SJeff Chang {
499714165e1SJeff Chang 	unsigned int val = 0;
500714165e1SJeff Chang 	int i, ret;
501714165e1SJeff Chang 
502714165e1SJeff Chang 	ret = regmap_read(priv->regmap, RT5133_REG_CHIP_INFO, &val);
503714165e1SJeff Chang 	if (ret)
504714165e1SJeff Chang 		return ret;
505714165e1SJeff Chang 
506714165e1SJeff Chang 	for (i = 0; i < ARRAY_SIZE(regulator_data); i++) {
507714165e1SJeff Chang 		if ((val & RT5133_VENDOR_ID_MASK) ==
508714165e1SJeff Chang 						regulator_data[i].vendor_id){
509714165e1SJeff Chang 			priv->cdata = &regulator_data[i];
510714165e1SJeff Chang 			break;
511714165e1SJeff Chang 		}
512714165e1SJeff Chang 	}
513714165e1SJeff Chang 	if (IS_ERR(priv->cdata)) {
514*6d068f1aSColin Ian King 		dev_err(priv->dev, "Failed to find regulator match version\n");
515714165e1SJeff Chang 		return -ENODEV;
516714165e1SJeff Chang 	}
517714165e1SJeff Chang 
518714165e1SJeff Chang 	return 0;
519714165e1SJeff Chang }
520714165e1SJeff Chang 
521714165e1SJeff Chang static int rt5133_parse_dt(struct rt5133_priv *priv)
522714165e1SJeff Chang {
523714165e1SJeff Chang 	unsigned int val = 0;
524714165e1SJeff Chang 	int ret = 0;
525714165e1SJeff Chang 
526714165e1SJeff Chang 	if (!device_property_read_bool(priv->dev, "richtek,oc-shutdown-all"))
527714165e1SJeff Chang 		val = 0;
528714165e1SJeff Chang 	else
529714165e1SJeff Chang 		val = 1 << RT5133_OCSHDN_ALL_SHIFT;
530714165e1SJeff Chang 	ret = regmap_update_bits(priv->regmap, RT5133_REG_LDO_SHDN,
531714165e1SJeff Chang 				 RT5133_OCSHDN_ALL_MASK, val);
532714165e1SJeff Chang 	if (ret)
533714165e1SJeff Chang 		return ret;
534714165e1SJeff Chang 
535714165e1SJeff Chang 	if (!device_property_read_bool(priv->dev, "richtek,pgb-shutdown-all"))
536714165e1SJeff Chang 		val = 0;
537714165e1SJeff Chang 	else
538714165e1SJeff Chang 		val = 1 << RT5133_PGBSHDN_ALL_SHIFT;
539714165e1SJeff Chang 	return regmap_update_bits(priv->regmap, RT5133_REG_LDO_SHDN,
540714165e1SJeff Chang 				  RT5133_PGBSHDN_ALL_MASK, val);
541714165e1SJeff Chang }
542714165e1SJeff Chang 
543714165e1SJeff Chang static int rt5133_probe(struct i2c_client *i2c)
544714165e1SJeff Chang {
545714165e1SJeff Chang 	struct rt5133_priv *priv;
546714165e1SJeff Chang 	struct regulator_config config = {0};
547714165e1SJeff Chang 	int i, ret;
548714165e1SJeff Chang 
549714165e1SJeff Chang 	priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL);
550714165e1SJeff Chang 	if (!priv)
551714165e1SJeff Chang 		return -ENOMEM;
552714165e1SJeff Chang 
553714165e1SJeff Chang 	priv->dev = &i2c->dev;
554714165e1SJeff Chang 	crc8_populate_msb(priv->crc8_tbls, RT5133_CRC8_POLYNOMIAL);
555714165e1SJeff Chang 
556714165e1SJeff Chang 	priv->enable_gpio = devm_gpiod_get_optional(&i2c->dev, "enable",
557714165e1SJeff Chang 						    GPIOD_OUT_HIGH);
558714165e1SJeff Chang 	if (IS_ERR(priv->enable_gpio))
559714165e1SJeff Chang 		dev_err(&i2c->dev, "Failed to request HWEN gpio, check if default en=high\n");
560714165e1SJeff Chang 
561714165e1SJeff Chang 	priv->regmap = devm_regmap_init(&i2c->dev, &rt5133_regmap_bus, priv,
562714165e1SJeff Chang 					&rt5133_regmap_config);
563714165e1SJeff Chang 	if (IS_ERR(priv->regmap)) {
564714165e1SJeff Chang 		dev_err(&i2c->dev, "Failed to register regmap\n");
565714165e1SJeff Chang 		return PTR_ERR(priv->regmap);
566714165e1SJeff Chang 	}
567714165e1SJeff Chang 
568714165e1SJeff Chang 	ret = rt5133_validate_vendor_info(priv);
569714165e1SJeff Chang 	if (ret) {
570714165e1SJeff Chang 		dev_err(&i2c->dev, "Failed to check vendor info [%d]\n", ret);
571714165e1SJeff Chang 		return ret;
572714165e1SJeff Chang 	}
573714165e1SJeff Chang 
574714165e1SJeff Chang 	ret = rt5133_chip_reset(priv);
575714165e1SJeff Chang 	if (ret) {
576714165e1SJeff Chang 		dev_err(&i2c->dev, "Failed to execute sw reset\n");
577714165e1SJeff Chang 		return ret;
578714165e1SJeff Chang 	}
579714165e1SJeff Chang 
580714165e1SJeff Chang 	config.dev = &i2c->dev;
581714165e1SJeff Chang 	config.driver_data = priv;
582714165e1SJeff Chang 	config.regmap = priv->regmap;
583714165e1SJeff Chang 
584714165e1SJeff Chang 	for (i = 0; i < RT5133_REGULATOR_MAX; i++) {
585714165e1SJeff Chang 		priv->rdev[i] = devm_regulator_register(&i2c->dev,
586714165e1SJeff Chang 							priv->cdata->regulators + i,
587714165e1SJeff Chang 							&config);
588714165e1SJeff Chang 		if (IS_ERR(priv->rdev[i])) {
589714165e1SJeff Chang 			dev_err(&i2c->dev,
590714165e1SJeff Chang 				"Failed to register [%d] regulator\n", i);
591714165e1SJeff Chang 			return PTR_ERR(priv->rdev[i]);
592714165e1SJeff Chang 		}
593714165e1SJeff Chang 	}
594714165e1SJeff Chang 
595714165e1SJeff Chang 	ret = rt5133_parse_dt(priv);
596714165e1SJeff Chang 	if (ret) {
597714165e1SJeff Chang 		dev_err(&i2c->dev, "%s, Failed to parse dt\n", __func__);
598714165e1SJeff Chang 		return ret;
599714165e1SJeff Chang 	}
600714165e1SJeff Chang 
601714165e1SJeff Chang 	priv->gc.label = dev_name(&i2c->dev);
602714165e1SJeff Chang 	priv->gc.parent = &i2c->dev;
603714165e1SJeff Chang 	priv->gc.base = -1;
604714165e1SJeff Chang 	priv->gc.ngpio = RT5133_GPIO_NR;
605714165e1SJeff Chang 	priv->gc.set = rt5133_gpio_set;
606714165e1SJeff Chang 	priv->gc.get = rt5133_gpio_get;
607714165e1SJeff Chang 	priv->gc.direction_output = rt5133_gpio_direction_output;
608714165e1SJeff Chang 	priv->gc.can_sleep = true;
609714165e1SJeff Chang 
610714165e1SJeff Chang 	ret = devm_gpiochip_add_data(&i2c->dev, &priv->gc, priv);
611714165e1SJeff Chang 	if (ret)
612714165e1SJeff Chang 		return ret;
613714165e1SJeff Chang 
614714165e1SJeff Chang 	ret = rt5133_enable_interrupts(i2c->irq, priv);
615714165e1SJeff Chang 	if (ret) {
616714165e1SJeff Chang 		dev_err(&i2c->dev, "enable interrupt failed\n");
617714165e1SJeff Chang 		return ret;
618714165e1SJeff Chang 	}
619714165e1SJeff Chang 
620714165e1SJeff Chang 	i2c_set_clientdata(i2c, priv);
621714165e1SJeff Chang 
622714165e1SJeff Chang 	return ret;
623714165e1SJeff Chang }
624714165e1SJeff Chang 
625714165e1SJeff Chang static const struct of_device_id __maybe_unused rt5133_of_match_table[] = {
626714165e1SJeff Chang 	{ .compatible = "richtek,rt5133", },
627714165e1SJeff Chang 	{ }
628714165e1SJeff Chang };
629714165e1SJeff Chang MODULE_DEVICE_TABLE(of, rt5133_of_match_table);
630714165e1SJeff Chang 
631714165e1SJeff Chang static struct i2c_driver rt5133_driver = {
632714165e1SJeff Chang 	.driver = {
633714165e1SJeff Chang 		.name = "rt5133",
634714165e1SJeff Chang 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
635714165e1SJeff Chang 		.of_match_table = rt5133_of_match_table,
636714165e1SJeff Chang 	},
637714165e1SJeff Chang 	.probe = rt5133_probe,
638714165e1SJeff Chang };
639714165e1SJeff Chang module_i2c_driver(rt5133_driver);
640714165e1SJeff Chang 
641714165e1SJeff Chang MODULE_DESCRIPTION("RT5133 Regulator Driver");
642714165e1SJeff Chang MODULE_LICENSE("GPL v2");
643