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
rk801_reg_count(struct udevice * dev)60 static int rk801_reg_count(struct udevice *dev)
61 {
62 return RK801_SYS_CFG3_OTP_REG + 1;
63 }
64
rk801_write(struct udevice * dev,uint reg,const uint8_t * buff,int len)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
rk801_read(struct udevice * dev,uint reg,uint8_t * buff,int len)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
rk801_shutdown(struct udevice * dev)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)
rk801_bind(struct udevice * dev)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
rk801_ofdata_to_platdata(struct udevice * dev)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
rk801_probe(struct udevice * dev)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