xref: /rk3399_rockchip-uboot/drivers/power/pmic/pmic_rk801.c (revision 3f3f40cd59320e8b274fce3e3becf4dd08c2c8a4)
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_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 	int i, ret;
161 
162 	ret = rk801_read(dev, RK801_ID_MSB, &msb, 1);
163 	if (ret)
164 		return ret;
165 
166 	ret = rk801_read(dev, RK801_ID_LSB, &lsb, 1);
167 	if (ret)
168 		return ret;
169 
170 	priv->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
171 	priv->req_pwrctrl_dvs = (lsb & 0x0f) < 4;
172 
173 	rk801_read(dev, RK801_ON_SOURCE_REG, &on, 1);
174 	rk801_read(dev, RK801_OFF_SOURCE_REG, &off, 1);
175 
176 	printf("PMIC:  RK%x (on=0x%02x, off=0x%02x, req_dvs=%d)\n",
177 	       priv->variant, on, off, priv->req_pwrctrl_dvs);
178 
179 	if (priv->req_pwrctrl_dvs) {
180 		ret = gpio_request_by_name(dev, "pwrctrl-gpios", 0,
181 					   &priv->pwrctrl_gpio, GPIOD_IS_OUT);
182 		if (ret) {
183 			printf("failed to get pwrctrl gpio! ret=%d\n", ret);
184 			return ret;
185 		}
186 	}
187 
188 	for (i = 0; i < ARRAY_SIZE(rk801_init_reg); i++) {
189 		ret = pmic_clrsetbits(dev,
190 				      rk801_init_reg[i].reg,
191 				      rk801_init_reg[i].mask,
192 				      rk801_init_reg[i].val);
193 		if (ret < 0) {
194 			printf("rk801: set reg 0x%x failed, ret=%d\n",
195 			       rk801_init_reg[i].reg, ret);
196 		}
197 	}
198 
199 #if CONFIG_IS_ENABLED(IRQ)
200 	priv->irq_chip = &rk801_irq_chip;
201 	ret = virq_add_chip(dev, priv->irq_chip, priv->irq);
202 	if (ret) {
203 		printf("rk801: failed to add irqchip(irq=%d), ret=%d\n",
204 		       priv->irq, ret);
205 		return ret;
206 	}
207 #endif
208 	return 0;
209 }
210 
211 static struct dm_pmic_ops rk801_ops = {
212 	.reg_count = rk801_reg_count,
213 	.read = rk801_read,
214 	.write = rk801_write,
215 	.shutdown = rk801_shutdown,
216 };
217 
218 static const struct udevice_id rk801_ids[] = {
219 	{ .compatible = "rockchip,rk801" },
220 };
221 
222 U_BOOT_DRIVER(pmic_rk801) = {
223 	.name = "rk801 pmic",
224 	.id = UCLASS_PMIC,
225 	.of_match = rk801_ids,
226 #if CONFIG_IS_ENABLED(PMIC_CHILDREN)
227 	.bind = rk801_bind,
228 #endif
229 	.ofdata_to_platdata = rk801_ofdata_to_platdata,
230 	.priv_auto_alloc_size = sizeof(struct rk801_priv),
231 	.probe = rk801_probe,
232 	.ops = &rk801_ops,
233 };
234 
235