xref: /rk3399_rockchip-uboot/drivers/power/pmic/pmic_rk801.c (revision c95f09d3e8643ebcae3e4e2b9beccfa10acd1c0c)
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_SLEEP_ACT_H, RK801_SLEEP_POL_MSK },
42 	{ RK801_SYS_CFG2_REG, RK801_RST_RESTART_REG, RK801_RST_MSK },
43 	{ RK801_INT_CONFIG_REG, RK801_INT_ACT_L, RK801_INT_POL_MSK },
44 	{ RK801_POWER_FPWM_EN_REG, RK801_PLDO_HRDEC_EN, RK801_PLDO_HRDEC_EN },
45 	{ RK801_BUCK_DEBUG5_REG, 0x54, 0xff },
46 	{ RK801_CON_BACK1_REG, 0x18, 0xff },
47 };
48 
49 static const struct pmic_child_info pmic_children_info[] = {
50 	{ .prefix = "DCDC", .driver = "rk801_buck"},
51 	{ .prefix = "LDO", .driver = "rk801_ldo"},
52 	{ .prefix = "SWITCH", .driver = "rk801_switch"},
53 	{ },
54 };
55 
56 static const struct pmic_child_info power_key_info[] = {
57 	{ .prefix = "pwrkey", .driver = "rk8xx_pwrkey"},
58 	{ },
59 };
60 
61 static int rk801_reg_count(struct udevice *dev)
62 {
63 	return RK801_SYS_CFG3_OTP_REG + 1;
64 }
65 
66 static int rk801_write(struct udevice *dev, uint reg, const uint8_t *buff, int len)
67 {
68 	int ret;
69 
70 	ret = dm_i2c_write(dev, reg, buff, len);
71 	if (ret) {
72 		printf("rk801: write reg 0x%02x failed, ret=%d\n", reg, ret);
73 		return ret;
74 	}
75 
76 	return 0;
77 }
78 
79 static int rk801_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
80 {
81 	int ret;
82 
83 	ret = dm_i2c_read(dev, reg, buff, len);
84 	if (ret) {
85 		printf("rk801: read reg 0x%02x failed, ret=%d\n", reg, ret);
86 		return ret;
87 	}
88 
89 	return 0;
90 }
91 
92 static int rk801_shutdown(struct udevice *dev)
93 {
94 	int ret;
95 	u8 val;
96 
97 	ret = rk801_read(dev, RK801_SYS_CFG2_REG, &val, 1);
98 	if (ret)
99 		return ret;
100 
101 	val |= DEV_OFF;
102 
103 	return rk801_write(dev, RK801_SYS_CFG2_REG, &val, 1);
104 }
105 
106 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
107 static int rk801_bind(struct udevice *dev)
108 {
109 	ofnode regulators_node;
110 	int children;
111 
112 	regulators_node = dev_read_subnode(dev, "regulators");
113 	if (!ofnode_valid(regulators_node))
114 		return -ENXIO;
115 
116 	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
117 	if (!children)
118 		debug("%s: %s - no child found\n", __func__, dev->name);
119 
120 	children = pmic_bind_children(dev, dev->node, power_key_info);
121 	if (!children)
122 		debug("%s: %s - no child found\n", __func__, dev->name);
123 
124 	return 0;
125 }
126 #endif
127 
128 static int rk801_ofdata_to_platdata(struct udevice *dev)
129 {
130 #if CONFIG_IS_ENABLED(IRQ)
131 	struct rk801_priv *priv = dev_get_priv(dev);
132 	u32 interrupt, phandle;
133 	int ret;
134 
135 	phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA);
136 	if (phandle == -ENODATA) {
137 		printf("Read 'interrupt-parent' failed, ret=%d\n", phandle);
138 		return phandle;
139 	}
140 
141 	ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1);
142 	if (ret) {
143 		printf("Read 'interrupts' failed, ret=%d\n", ret);
144 		return ret;
145 	}
146 
147 	priv->irq = phandle_gpio_to_irq(phandle, interrupt);
148 	if (priv->irq < 0) {
149 		printf("priv to request rk801 irq, ret=%d\n", priv->irq);
150 		return priv->irq;
151 	}
152 #endif
153 
154 	return 0;
155 }
156 
157 static int rk801_probe(struct udevice *dev)
158 {
159 	struct rk801_priv *priv = dev_get_priv(dev);
160 	uint8_t msb, lsb, on, off;
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 	priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
172 	priv->req_pwrctrl_dvs = (lsb & 0x0f) < 4;
173 
174 	rk801_read(dev, RK801_ON_SOURCE_REG, &on, 1);
175 	rk801_read(dev, RK801_OFF_SOURCE_REG, &off, 1);
176 
177 	printf("PMIC:  RK%x (on=0x%02x, off=0x%02x, req_dvs=%d)\n",
178 	       priv->variant, on, off, priv->req_pwrctrl_dvs);
179 
180 	if (priv->req_pwrctrl_dvs) {
181 		ret = gpio_request_by_name(dev, "pwrctrl-gpios", 0,
182 					   &priv->pwrctrl_gpio, GPIOD_IS_OUT);
183 		if (ret) {
184 			printf("failed to get pwrctrl gpio! ret=%d\n", ret);
185 			return ret;
186 		}
187 	}
188 
189 	for (i = 0; i < ARRAY_SIZE(rk801_init_reg); i++) {
190 		ret = pmic_clrsetbits(dev,
191 				      rk801_init_reg[i].reg,
192 				      rk801_init_reg[i].mask,
193 				      rk801_init_reg[i].val);
194 		if (ret < 0) {
195 			printf("rk801: set reg 0x%x failed, ret=%d\n",
196 			       rk801_init_reg[i].reg, ret);
197 		}
198 	}
199 
200 #if CONFIG_IS_ENABLED(IRQ)
201 	priv->irq_chip = &rk801_irq_chip;
202 	ret = virq_add_chip(dev, priv->irq_chip, priv->irq);
203 	if (ret) {
204 		printf("rk801: failed to add irqchip(irq=%d), ret=%d\n",
205 		       priv->irq, ret);
206 		return ret;
207 	}
208 #endif
209 	return 0;
210 }
211 
212 static struct dm_pmic_ops rk801_ops = {
213 	.reg_count = rk801_reg_count,
214 	.read = rk801_read,
215 	.write = rk801_write,
216 	.shutdown = rk801_shutdown,
217 };
218 
219 static const struct udevice_id rk801_ids[] = {
220 	{ .compatible = "rockchip,rk801" },
221 	{ }
222 };
223 
224 U_BOOT_DRIVER(pmic_rk801) = {
225 	.name = "rk801 pmic",
226 	.id = UCLASS_PMIC,
227 	.of_match = rk801_ids,
228 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
229 	.bind = rk801_bind,
230 #endif
231 	.ofdata_to_platdata = rk801_ofdata_to_platdata,
232 	.priv_auto_alloc_size = sizeof(struct rk801_priv),
233 	.probe = rk801_probe,
234 	.ops = &rk801_ops,
235 };
236 
237