xref: /rk3399_rockchip-uboot/drivers/power/pmic/pmic_rk801.c (revision b6bda7d5f40f8df92d3195bfab2b7ecbabd3e740)
1 /*
2  * (C) Copyright 2024 Rockchip Electronics Co., Ltd.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <dm.h>
9 #include <errno.h>
10 #include <irq-generic.h>
11 #include <power/rk801_pmic.h>
12 #include <power/pmic.h>
13 
14 DECLARE_GLOBAL_DATA_PTR;
15 
16 #if CONFIG_IS_ENABLED(IRQ)
17 static const struct virq_reg rk801_irqs[] = {
18 	[RK801_IRQ_PWRON_FALL] = {
19 		.mask = RK801_IRQ_PWRON_FALL_MSK,
20 		.reg_offset = 0,
21 	},
22 	[RK801_IRQ_PWRON_RISE] = {
23 		.mask = RK801_IRQ_PWRON_RISE_MSK,
24 		.reg_offset = 0,
25 	},
26 };
27 
28 static struct virq_chip rk801_irq_chip = {
29 	.status_base    = RK801_INT_STS0_REG,
30 	.mask_base	= RK801_INT_STS0_REG,
31 	.num_regs	= 1,
32 	.read		= pmic_reg_read,
33 	.write		= pmic_reg_write,
34 	.irqs		= rk801_irqs,
35 	.num_irqs	= ARRAY_SIZE(rk801_irqs),
36 };
37 #endif
38 
39 static struct reg_data rk801_init_reg[] = {
40 	{ RK801_SLEEP_CFG_REG, RK801_NONE_FUN, RK801_SLEEP_FUN_MSK },
41 	{ RK801_SYS_CFG2_REG, RK801_RST_RESTART_REG, RK801_RST_MSK },
42 	{ RK801_INT_CONFIG_REG, RK801_INT_ACT_L, RK801_INT_POL_MSK },
43 	{ RK801_POWER_FPWM_EN_REG, RK801_PLDO_HRDEC_EN, RK801_PLDO_HRDEC_EN },
44 	{ RK801_BUCK_DEBUG5_REG, 0x54, 0xff },
45 	{ RK801_CON_BACK1_REG, 0x18, 0xff },
46 };
47 
48 static const struct pmic_child_info pmic_children_info[] = {
49 	{ .prefix = "DCDC", .driver = "rk801_buck"},
50 	{ .prefix = "LDO", .driver = "rk801_ldo"},
51 	{ .prefix = "SWITCH", .driver = "rk801_switch"},
52 	{ },
53 };
54 
55 static const struct pmic_child_info power_key_info[] = {
56 	{ .prefix = "pwrkey", .driver = "rk8xx_pwrkey"},
57 	{ },
58 };
59 
60 static int rk801_reg_count(struct udevice *dev)
61 {
62 	return RK801_SYS_CFG3_OTP_REG + 1;
63 }
64 
65 static int rk801_write(struct udevice *dev, uint reg, const uint8_t *buff, int len)
66 {
67 	int ret;
68 
69 	ret = dm_i2c_write(dev, reg, buff, len);
70 	if (ret) {
71 		printf("rk801: write reg 0x%02x failed, ret=%d\n", reg, ret);
72 		return ret;
73 	}
74 
75 	return 0;
76 }
77 
78 static int rk801_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
79 {
80 	int ret;
81 
82 	ret = dm_i2c_read(dev, reg, buff, len);
83 	if (ret) {
84 		printf("rk801: read reg 0x%02x failed, ret=%d\n", reg, ret);
85 		return ret;
86 	}
87 
88 	return 0;
89 }
90 
91 static int rk801_shutdown(struct udevice *dev)
92 {
93 	int ret;
94 	u8 val;
95 
96 	ret = rk801_read(dev, RK801_SYS_CFG2_REG, &val, 1);
97 	if (ret)
98 		return ret;
99 
100 	val |= DEV_OFF;
101 
102 	return rk801_write(dev, RK801_SYS_CFG2_REG, &val, 1);
103 }
104 
105 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
106 static int rk801_bind(struct udevice *dev)
107 {
108 	ofnode regulators_node;
109 	int children;
110 
111 	regulators_node = dev_read_subnode(dev, "regulators");
112 	if (!ofnode_valid(regulators_node))
113 		return -ENXIO;
114 
115 	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
116 	if (!children)
117 		debug("%s: %s - no child found\n", __func__, dev->name);
118 
119 	children = pmic_bind_children(dev, dev->node, power_key_info);
120 	if (!children)
121 		debug("%s: %s - no child found\n", __func__, dev->name);
122 
123 	return 0;
124 }
125 #endif
126 
127 static int rk801_ofdata_to_platdata(struct udevice *dev)
128 {
129 #if CONFIG_IS_ENABLED(IRQ)
130 	struct rk801_priv *priv = dev_get_priv(dev);
131 	u32 interrupt, phandle;
132 	int ret;
133 
134 	phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA);
135 	if (phandle == -ENODATA) {
136 		printf("Read 'interrupt-parent' failed, ret=%d\n", phandle);
137 		return phandle;
138 	}
139 
140 	ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1);
141 	if (ret) {
142 		printf("Read 'interrupts' failed, ret=%d\n", ret);
143 		return ret;
144 	}
145 
146 	priv->irq = phandle_gpio_to_irq(phandle, interrupt);
147 	if (priv->irq < 0) {
148 		printf("priv to request rk801 irq, ret=%d\n", priv->irq);
149 		return priv->irq;
150 	}
151 #endif
152 
153 	return 0;
154 }
155 
156 static int rk801_probe(struct udevice *dev)
157 {
158 	struct rk801_priv *priv = dev_get_priv(dev);
159 	uint8_t msb, lsb, on, off;
160 	u32 pmic_id;
161 	int i, ret;
162 
163 	ret = rk801_read(dev, RK801_ID_MSB, &msb, 1);
164 	if (ret)
165 		return ret;
166 
167 	ret = rk801_read(dev, RK801_ID_LSB, &lsb, 1);
168 	if (ret)
169 		return ret;
170 
171 	pmic_id = (msb << 8) | lsb;
172 	priv->variant = pmic_id & RK8XX_ID_MSK;
173 	priv->req_pwrctrl_dvs = (lsb & 0x0f) < 3;
174 	if (priv->req_pwrctrl_dvs) {
175 		/* GPIOD_IS_OUT: output inactive */
176 		ret = gpio_request_by_name(dev, "pwrctrl-gpios", 0,
177 					   &priv->pwrctrl_gpio, GPIOD_IS_OUT);
178 		if (ret) {
179 			printf("rk801: failed to get pwrctrl-gpio, ret=%d\n", ret);
180 			return ret;
181 		}
182 	}
183 
184 	rk801_read(dev, RK801_ON_SOURCE_REG, &on, 1);
185 	rk801_read(dev, RK801_OFF_SOURCE_REG, &off, 1);
186 
187 	printf("PMIC:  RK%x (on=0x%02x, off=0x%02x, req_dvs: %d, act: %s)\n",
188 	       pmic_id, on, off, priv->req_pwrctrl_dvs,
189 	       priv->pwrctrl_gpio.flags & GPIOD_ACTIVE_LOW ? "low" : "high");
190 
191 	for (i = 0; i < ARRAY_SIZE(rk801_init_reg); i++) {
192 		ret = pmic_clrsetbits(dev,
193 				      rk801_init_reg[i].reg,
194 				      rk801_init_reg[i].mask,
195 				      rk801_init_reg[i].val);
196 		if (ret < 0) {
197 			printf("rk801: set reg 0x%x failed, ret=%d\n",
198 			       rk801_init_reg[i].reg, ret);
199 		}
200 	}
201 
202 #if CONFIG_IS_ENABLED(IRQ)
203 	priv->irq_chip = &rk801_irq_chip;
204 	ret = virq_add_chip(dev, priv->irq_chip, priv->irq);
205 	if (ret) {
206 		printf("rk801: failed to add irqchip(irq=%d), ret=%d\n",
207 		       priv->irq, ret);
208 		return ret;
209 	}
210 #endif
211 	return 0;
212 }
213 
214 static struct dm_pmic_ops rk801_ops = {
215 	.reg_count = rk801_reg_count,
216 	.read = rk801_read,
217 	.write = rk801_write,
218 	.shutdown = rk801_shutdown,
219 };
220 
221 static const struct udevice_id rk801_ids[] = {
222 	{ .compatible = "rockchip,rk801" },
223 	{ }
224 };
225 
226 U_BOOT_DRIVER(pmic_rk801) = {
227 	.name = "rk801 pmic",
228 	.id = UCLASS_PMIC,
229 	.of_match = rk801_ids,
230 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
231 	.bind = rk801_bind,
232 #endif
233 	.ofdata_to_platdata = rk801_ofdata_to_platdata,
234 	.priv_auto_alloc_size = sizeof(struct rk801_priv),
235 	.probe = rk801_probe,
236 	.ops = &rk801_ops,
237 };
238 
239