tps65217pmic.c revision 1.2 1 1.2 rkujawa /* $NetBSD: tps65217pmic.c,v 1.2 2013/04/26 15:31:03 rkujawa Exp $ */
2 1.1 rkujawa
3 1.1 rkujawa /*-
4 1.1 rkujawa * Copyright (c) 2013 The NetBSD Foundation, Inc.
5 1.1 rkujawa * All rights reserved.
6 1.1 rkujawa *
7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation
8 1.1 rkujawa * by Radoslaw Kujawa.
9 1.1 rkujawa *
10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without
11 1.1 rkujawa * modification, are permitted provided that the following conditions
12 1.1 rkujawa * are met:
13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright
14 1.1 rkujawa * notice, this list of conditions and the following disclaimer.
15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the
17 1.1 rkujawa * documentation and/or other materials provided with the distribution.
18 1.1 rkujawa *
19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 rkujawa * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 rkujawa * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 rkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 rkujawa * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 rkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 rkujawa * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 rkujawa * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 rkujawa * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 rkujawa * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 rkujawa * POSSIBILITY OF SUCH DAMAGE.
30 1.1 rkujawa */
31 1.1 rkujawa
32 1.2 rkujawa /*
33 1.2 rkujawa * Texas Instruments TPS65217 Power Management IC driver.
34 1.2 rkujawa * TODO: battery, sequencer
35 1.2 rkujawa */
36 1.2 rkujawa
37 1.1 rkujawa #include <sys/cdefs.h>
38 1.2 rkujawa __KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.2 2013/04/26 15:31:03 rkujawa Exp $");
39 1.1 rkujawa
40 1.1 rkujawa #include <sys/param.h>
41 1.1 rkujawa #include <sys/systm.h>
42 1.1 rkujawa #include <sys/device.h>
43 1.1 rkujawa #include <sys/kernel.h>
44 1.1 rkujawa
45 1.1 rkujawa #include <sys/bus.h>
46 1.1 rkujawa #include <dev/i2c/i2cvar.h>
47 1.1 rkujawa
48 1.1 rkujawa #include <dev/i2c/tps65217pmicreg.h>
49 1.1 rkujawa
50 1.1 rkujawa struct tps65217pmic_softc {
51 1.1 rkujawa device_t sc_dev;
52 1.1 rkujawa
53 1.1 rkujawa i2c_tag_t sc_tag;
54 1.1 rkujawa i2c_addr_t sc_addr;
55 1.1 rkujawa
56 1.1 rkujawa uint8_t sc_version;
57 1.1 rkujawa uint8_t sc_revision;
58 1.1 rkujawa };
59 1.1 rkujawa
60 1.2 rkujawa
61 1.2 rkujawa #define NTPS_REG 7
62 1.2 rkujawa /* Voltage regulators */
63 1.2 rkujawa enum tps_reg_num {
64 1.2 rkujawa TPS65217PMIC_LDO1,
65 1.2 rkujawa TPS65217PMIC_LDO2,
66 1.2 rkujawa TPS65217PMIC_LDO3LS,
67 1.2 rkujawa TPS65217PMIC_LDO4LS,
68 1.2 rkujawa TPS65217PMIC_DCDC1,
69 1.2 rkujawa TPS65217PMIC_DCDC2,
70 1.2 rkujawa TPS65217PMIC_DCDC3
71 1.2 rkujawa };
72 1.2 rkujawa
73 1.2 rkujawa struct tps_reg_param {
74 1.2 rkujawa /* parameters configured statically */
75 1.2 rkujawa
76 1.2 rkujawa const char* name;
77 1.2 rkujawa uint16_t voltage_min; /* in mV */
78 1.2 rkujawa uint16_t voltage_max; /* in mV */
79 1.2 rkujawa const uint16_t *voltages; /* all possible voltage settings */
80 1.2 rkujawa uint8_t nvoltages; /* number of voltage settings */
81 1.2 rkujawa
82 1.2 rkujawa bool can_track; /* regulator can track U of other r. */
83 1.2 rkujawa struct tps_reg_param *tracked_reg; /* ptr to tracked regulator */
84 1.2 rkujawa bool can_xadj; /* voltage can be adjusted externally */
85 1.2 rkujawa bool can_ls; /* can be a load switch instead of r. */
86 1.2 rkujawa
87 1.2 rkujawa uint8_t defreg_num; /* DEF register */
88 1.2 rkujawa uint8_t enable_bit; /* position in ENABLE register */
89 1.2 rkujawa
90 1.2 rkujawa /*
91 1.2 rkujawa * Run-time parameters configured during attachment and later, these
92 1.2 rkujawa * probably should be split into separate struct that would be a part
93 1.2 rkujawa * of softc. But since we can have only one TPS chip, that should be
94 1.2 rkujawa * okay for now.
95 1.2 rkujawa */
96 1.2 rkujawa
97 1.2 rkujawa bool is_enabled; /* regulator is enabled */
98 1.2 rkujawa bool is_pg; /* regulator is "power good" */
99 1.2 rkujawa bool is_tracking; /* voltage is tracking other reg. */
100 1.2 rkujawa bool is_ls; /* is a load switch */
101 1.2 rkujawa bool is_xadj; /* voltage is adjusted externally */
102 1.2 rkujawa
103 1.2 rkujawa uint16_t current_voltage; /* in mV */
104 1.2 rkujawa
105 1.2 rkujawa };
106 1.2 rkujawa
107 1.1 rkujawa static int tps65217pmic_match(device_t, cfdata_t, void *);
108 1.1 rkujawa static void tps65217pmic_attach(device_t, device_t, void *);
109 1.1 rkujawa
110 1.1 rkujawa static uint8_t tps65217pmic_reg_read(struct tps65217pmic_softc *sc,
111 1.2 rkujawa uint8_t regno);
112 1.2 rkujawa
113 1.2 rkujawa static void tps65217pmic_refresh(struct tps65217pmic_softc *sc);
114 1.1 rkujawa
115 1.1 rkujawa static uint16_t tps65217pmic_ppath_max_usb_current(uint8_t ppath);
116 1.1 rkujawa static uint16_t tps65217pmic_ppath_max_ac_current(uint8_t ppath);
117 1.1 rkujawa
118 1.2 rkujawa static void tps65217pmic_regulator_read_config(struct tps65217pmic_softc
119 1.2 rkujawa *sc, struct tps_reg_param *regulator);
120 1.2 rkujawa
121 1.2 rkujawa static void tps65217pmic_print_ppath(struct tps65217pmic_softc *sc);
122 1.2 rkujawa static void tps65217pmic_print_ldos(struct tps65217pmic_softc *sc);
123 1.2 rkujawa
124 1.1 rkujawa static void tps65217pmic_version(struct tps65217pmic_softc *sc);
125 1.1 rkujawa
126 1.1 rkujawa CFATTACH_DECL_NEW(tps65217pmic, sizeof (struct tps65217pmic_softc),
127 1.1 rkujawa tps65217pmic_match, tps65217pmic_attach, NULL, NULL);
128 1.1 rkujawa
129 1.1 rkujawa /* Possible settings of LDO1 in mV. */
130 1.1 rkujawa static const uint16_t ldo1voltages[] = { 1000, 1100, 1200, 1250, 1300, 1350,
131 1.1 rkujawa 1400, 1500, 1600, 1800, 2500, 2750, 2800, 3000, 3100, 3300 };
132 1.1 rkujawa /* Possible settings of LDO2, DCDC1, DCDC2, DCDC3 in mV. */
133 1.1 rkujawa static const uint16_t ldo2voltages[] = { 900, 925, 950, 975, 1000, 1025, 1050,
134 1.1 rkujawa 1075, 1100, 1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300, 1325, 1350,
135 1.1 rkujawa 1375, 1400, 1425, 1450, 1475, 1500, 1550, 1600, 1650, 1700, 1750, 1800,
136 1.1 rkujawa 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, 2400,
137 1.1 rkujawa 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 3000, 3100,
138 1.1 rkujawa 3200, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300 };
139 1.1 rkujawa /* Possible settings of LDO3, LDO4 in mV. */
140 1.1 rkujawa static const uint16_t ldo3voltages[] = { 1500, 1550, 1600, 1650, 1700, 1750,
141 1.2 rkujawa 1800, 1850, 1900, 2000, 2100, 2200, 2300, 2400, 2450, 2500, 2550, 2600,
142 1.1 rkujawa 2650, 2700, 2750, 2800, 2850, 2900,2950, 3000, 3050, 3100, 3150, 3200,
143 1.1 rkujawa 3250, 3300 };
144 1.1 rkujawa
145 1.2 rkujawa static struct tps_reg_param tps_regulators[] = {
146 1.2 rkujawa {
147 1.2 rkujawa .name = "LDO1",
148 1.2 rkujawa .voltage_min = 1000,
149 1.2 rkujawa .voltage_max = 3300,
150 1.2 rkujawa .voltages = ldo1voltages,
151 1.2 rkujawa .nvoltages = 16,
152 1.2 rkujawa .can_track = false,
153 1.2 rkujawa .tracked_reg = NULL,
154 1.2 rkujawa .can_xadj = false,
155 1.2 rkujawa .can_ls = false,
156 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO1,
157 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO1
158 1.2 rkujawa },
159 1.2 rkujawa {
160 1.2 rkujawa .name = "LDO2",
161 1.2 rkujawa .voltage_min = 900,
162 1.2 rkujawa .voltage_max = 3300,
163 1.2 rkujawa .voltages = ldo2voltages,
164 1.2 rkujawa .nvoltages = 64,
165 1.2 rkujawa .can_track = true,
166 1.2 rkujawa .tracked_reg = &(tps_regulators[TPS65217PMIC_DCDC3]),
167 1.2 rkujawa .can_xadj = false,
168 1.2 rkujawa .can_ls = false,
169 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO2,
170 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO2
171 1.2 rkujawa },
172 1.2 rkujawa {
173 1.2 rkujawa .name = "LDO3",
174 1.2 rkujawa .voltage_min = 1500,
175 1.2 rkujawa .voltage_max = 3300,
176 1.2 rkujawa .voltages = ldo3voltages,
177 1.2 rkujawa .nvoltages = 32,
178 1.2 rkujawa .can_track = false,
179 1.2 rkujawa .tracked_reg = NULL,
180 1.2 rkujawa .can_xadj = false,
181 1.2 rkujawa .can_ls = true,
182 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO3,
183 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO3
184 1.2 rkujawa },
185 1.2 rkujawa {
186 1.2 rkujawa .name = "LDO4",
187 1.2 rkujawa .voltage_min = 1500,
188 1.2 rkujawa .voltage_max = 3300,
189 1.2 rkujawa .voltages = ldo3voltages,
190 1.2 rkujawa .nvoltages = 32,
191 1.2 rkujawa .can_track = false,
192 1.2 rkujawa .tracked_reg = NULL,
193 1.2 rkujawa .can_xadj = false,
194 1.2 rkujawa .can_ls = true,
195 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO4,
196 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO4
197 1.2 rkujawa },
198 1.2 rkujawa {
199 1.2 rkujawa .name = "DCDC1",
200 1.2 rkujawa .voltage_min = 900,
201 1.2 rkujawa .voltage_max = 3300,
202 1.2 rkujawa .voltages = ldo2voltages,
203 1.2 rkujawa .nvoltages = 64,
204 1.2 rkujawa .can_track = false,
205 1.2 rkujawa .tracked_reg = NULL,
206 1.2 rkujawa .can_xadj = true,
207 1.2 rkujawa .can_ls = false,
208 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC1,
209 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_DCDC1
210 1.2 rkujawa },
211 1.2 rkujawa {
212 1.2 rkujawa .name = "DCDC2",
213 1.2 rkujawa .voltage_min = 900,
214 1.2 rkujawa .voltage_max = 3300,
215 1.2 rkujawa .voltages = ldo2voltages,
216 1.2 rkujawa .nvoltages = 64,
217 1.2 rkujawa .can_track = false,
218 1.2 rkujawa .tracked_reg = NULL,
219 1.2 rkujawa .can_xadj = true,
220 1.2 rkujawa .can_ls = false,
221 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC2,
222 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_DCDC2
223 1.2 rkujawa },
224 1.2 rkujawa {
225 1.2 rkujawa .name = "DCDC3",
226 1.2 rkujawa .voltage_min = 900,
227 1.2 rkujawa .voltage_max = 3300,
228 1.2 rkujawa .voltages = ldo2voltages,
229 1.2 rkujawa .nvoltages = 64,
230 1.2 rkujawa .can_track = false,
231 1.2 rkujawa .tracked_reg = NULL,
232 1.2 rkujawa .can_xadj = true,
233 1.2 rkujawa .can_ls = false,
234 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC3,
235 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_DCDC3
236 1.2 rkujawa }
237 1.2 rkujawa };
238 1.2 rkujawa
239 1.2 rkujawa static bool matched = false;
240 1.2 rkujawa
241 1.1 rkujawa static int
242 1.1 rkujawa tps65217pmic_match(device_t parent, cfdata_t cf, void *aux)
243 1.1 rkujawa {
244 1.1 rkujawa struct i2c_attach_args *ia = aux;
245 1.1 rkujawa
246 1.2 rkujawa if (ia->ia_addr == TPS65217PMIC_ADDR) {
247 1.2 rkujawa /* we can only have one */
248 1.2 rkujawa if (matched)
249 1.2 rkujawa return 0;
250 1.2 rkujawa else
251 1.2 rkujawa matched = true;
252 1.2 rkujawa
253 1.1 rkujawa return 1;
254 1.2 rkujawa }
255 1.1 rkujawa return 0;
256 1.1 rkujawa }
257 1.1 rkujawa
258 1.1 rkujawa static void
259 1.1 rkujawa tps65217pmic_attach(device_t parent, device_t self, void *aux)
260 1.1 rkujawa {
261 1.1 rkujawa struct tps65217pmic_softc *sc = device_private(self);
262 1.1 rkujawa struct i2c_attach_args *ia = aux;
263 1.1 rkujawa
264 1.1 rkujawa sc->sc_dev = self;
265 1.1 rkujawa sc->sc_addr = ia->ia_addr;
266 1.1 rkujawa sc->sc_tag = ia->ia_tag;
267 1.1 rkujawa
268 1.1 rkujawa tps65217pmic_version(sc);
269 1.1 rkujawa
270 1.1 rkujawa aprint_normal(": TPS65217");
271 1.1 rkujawa switch (sc->sc_version) {
272 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_A:
273 1.1 rkujawa aprint_normal("A");
274 1.1 rkujawa break;
275 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_B:
276 1.1 rkujawa aprint_normal("B");
277 1.1 rkujawa break;
278 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_C:
279 1.1 rkujawa aprint_normal("C");
280 1.1 rkujawa break;
281 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_D:
282 1.1 rkujawa aprint_normal("D");
283 1.1 rkujawa break;
284 1.1 rkujawa default:
285 1.1 rkujawa /* unknown version */
286 1.1 rkujawa break;
287 1.1 rkujawa }
288 1.1 rkujawa
289 1.1 rkujawa aprint_normal(" Power Management Multi-Channel IC (rev 1.%d)\n",
290 1.1 rkujawa sc->sc_revision);
291 1.1 rkujawa
292 1.2 rkujawa tps65217pmic_refresh(sc);
293 1.2 rkujawa
294 1.2 rkujawa tps65217pmic_print_ppath(sc);
295 1.2 rkujawa tps65217pmic_print_ldos(sc);
296 1.2 rkujawa }
297 1.2 rkujawa
298 1.2 rkujawa static void
299 1.2 rkujawa tps65217pmic_refresh(struct tps65217pmic_softc *sc)
300 1.2 rkujawa {
301 1.2 rkujawa int i;
302 1.2 rkujawa struct tps_reg_param *c_reg;
303 1.2 rkujawa
304 1.2 rkujawa for (i = 0; i < NTPS_REG; i++) {
305 1.2 rkujawa c_reg = &tps_regulators[i];
306 1.2 rkujawa tps65217pmic_regulator_read_config(sc, c_reg);
307 1.2 rkujawa }
308 1.1 rkujawa }
309 1.1 rkujawa
310 1.1 rkujawa /* Get version and revision of the chip. */
311 1.1 rkujawa static void
312 1.1 rkujawa tps65217pmic_version(struct tps65217pmic_softc *sc)
313 1.1 rkujawa {
314 1.1 rkujawa uint8_t chipid;
315 1.1 rkujawa
316 1.1 rkujawa chipid = tps65217pmic_reg_read(sc, TPS65217PMIC_CHIPID);
317 1.1 rkujawa
318 1.1 rkujawa sc->sc_version = chipid & TPS65217PMIC_CHIPID_VER_MASK;
319 1.1 rkujawa sc->sc_revision = chipid & TPS65217PMIC_CHIPID_REV_MASK;
320 1.1 rkujawa }
321 1.1 rkujawa
322 1.1 rkujawa static uint16_t
323 1.1 rkujawa tps65217pmic_ppath_max_ac_current(uint8_t ppath)
324 1.1 rkujawa {
325 1.1 rkujawa switch ((ppath & TPS65217PMIC_PPATH_IAC) >>
326 1.1 rkujawa TPS65217PMIC_PPATH_IAC_RSHFIT) {
327 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_100MA:
328 1.1 rkujawa return 100;
329 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_500MA:
330 1.1 rkujawa return 300;
331 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_1300MA:
332 1.1 rkujawa return 1300;
333 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_2500MA:
334 1.1 rkujawa return 2500;
335 1.1 rkujawa }
336 1.1 rkujawa return 0;
337 1.1 rkujawa }
338 1.1 rkujawa
339 1.1 rkujawa static uint16_t
340 1.1 rkujawa tps65217pmic_ppath_max_usb_current(uint8_t ppath)
341 1.1 rkujawa {
342 1.1 rkujawa switch (ppath & TPS65217PMIC_PPATH_IUSB) {
343 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_100MA:
344 1.1 rkujawa return 100;
345 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_500MA:
346 1.1 rkujawa return 300;
347 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1300MA:
348 1.1 rkujawa return 1300;
349 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1800MA:
350 1.1 rkujawa return 1800;
351 1.1 rkujawa }
352 1.1 rkujawa return 0;
353 1.1 rkujawa }
354 1.1 rkujawa
355 1.2 rkujawa /* Read regulator state and save it to tps_reg_param. */
356 1.2 rkujawa static void
357 1.2 rkujawa tps65217pmic_regulator_read_config(struct tps65217pmic_softc *sc, struct
358 1.2 rkujawa tps_reg_param *regulator)
359 1.1 rkujawa {
360 1.2 rkujawa uint8_t defreg, regenable;
361 1.2 rkujawa uint16_t voltage;
362 1.1 rkujawa
363 1.2 rkujawa regenable = tps65217pmic_reg_read(sc, TPS65217PMIC_ENABLE);
364 1.2 rkujawa
365 1.2 rkujawa if (regenable & (regulator->enable_bit))
366 1.2 rkujawa regulator->is_enabled = true;
367 1.2 rkujawa else {
368 1.2 rkujawa regulator->is_enabled = false;
369 1.2 rkujawa return;
370 1.2 rkujawa }
371 1.2 rkujawa
372 1.2 rkujawa defreg = tps65217pmic_reg_read(sc,
373 1.2 rkujawa regulator->defreg_num);
374 1.2 rkujawa
375 1.2 rkujawa switch (regulator->nvoltages) {
376 1.2 rkujawa case 16:
377 1.2 rkujawa voltage = regulator->voltages[defreg &
378 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_16];
379 1.2 rkujawa break;
380 1.2 rkujawa case 32:
381 1.2 rkujawa voltage = regulator->voltages[defreg &
382 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_32];
383 1.2 rkujawa break;
384 1.2 rkujawa case 64:
385 1.2 rkujawa voltage = regulator->voltages[defreg &
386 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_64];
387 1.2 rkujawa break;
388 1.1 rkujawa default:
389 1.2 rkujawa /* unsupported number of voltage settings? */
390 1.2 rkujawa voltage = 0;
391 1.1 rkujawa break;
392 1.1 rkujawa }
393 1.1 rkujawa
394 1.2 rkujawa /* Handle regulator tracking other regulator voltage. */
395 1.2 rkujawa if (regulator->can_track)
396 1.2 rkujawa if (defreg & TPS65217PMIC_DEFX_TRACKING) {
397 1.2 rkujawa regulator->is_tracking = true;
398 1.2 rkujawa voltage = 0; /* see regulator->tracked_reg */
399 1.2 rkujawa }
400 1.2 rkujawa
401 1.2 rkujawa /* Handle regulator configured into load switch mode. */
402 1.2 rkujawa if (regulator->can_ls)
403 1.2 rkujawa if (!(defreg & TPS65217PMIC_DEFX_LS)) {
404 1.2 rkujawa regulator->is_ls = true;
405 1.2 rkujawa voltage = 0;
406 1.2 rkujawa }
407 1.2 rkujawa
408 1.2 rkujawa if (regulator->can_xadj)
409 1.2 rkujawa if (defreg & TPS65217PMIC_DEFX_XADJ) {
410 1.2 rkujawa regulator->is_xadj = true;
411 1.2 rkujawa voltage = 0;
412 1.2 rkujawa
413 1.2 rkujawa }
414 1.2 rkujawa
415 1.2 rkujawa /* TODO: add PGOOD checking */
416 1.2 rkujawa
417 1.2 rkujawa regulator->current_voltage = voltage;
418 1.2 rkujawa }
419 1.2 rkujawa
420 1.2 rkujawa static void
421 1.2 rkujawa tps65217pmic_print_ldos(struct tps65217pmic_softc *sc)
422 1.2 rkujawa {
423 1.2 rkujawa int i;
424 1.2 rkujawa struct tps_reg_param *c_reg;
425 1.2 rkujawa
426 1.2 rkujawa aprint_normal_dev(sc->sc_dev, "");
427 1.2 rkujawa
428 1.2 rkujawa for (i = 0; i < NTPS_REG; i++) {
429 1.2 rkujawa c_reg = &tps_regulators[i];
430 1.2 rkujawa
431 1.2 rkujawa if(c_reg->is_enabled) {
432 1.2 rkujawa
433 1.2 rkujawa if (c_reg->is_ls) {
434 1.2 rkujawa aprint_normal("[%s: LS] ", c_reg->name);
435 1.2 rkujawa } else if (c_reg->is_xadj) {
436 1.2 rkujawa aprint_normal("[%s: XADJ] ", c_reg->name);
437 1.2 rkujawa } else
438 1.2 rkujawa aprint_normal("[%s: %d mV] ", c_reg->name,
439 1.2 rkujawa c_reg->current_voltage);
440 1.2 rkujawa }
441 1.2 rkujawa }
442 1.2 rkujawa aprint_normal("\n");
443 1.1 rkujawa }
444 1.1 rkujawa
445 1.1 rkujawa static void
446 1.2 rkujawa tps65217pmic_print_ppath(struct tps65217pmic_softc *sc)
447 1.1 rkujawa {
448 1.1 rkujawa uint8_t status, ppath, regenable;
449 1.1 rkujawa
450 1.1 rkujawa ppath = tps65217pmic_reg_read(sc, TPS65217PMIC_PPATH);
451 1.1 rkujawa status = tps65217pmic_reg_read(sc, TPS65217PMIC_STATUS);
452 1.1 rkujawa regenable = tps65217pmic_reg_read(sc, TPS65217PMIC_ENABLE);
453 1.1 rkujawa
454 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "power sources ");
455 1.1 rkujawa
456 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_USB_EN) {
457 1.1 rkujawa if (status & TPS65217PMIC_STATUS_USBPWR)
458 1.1 rkujawa aprint_normal("[USB] ");
459 1.1 rkujawa else
460 1.1 rkujawa aprint_normal("USB ");
461 1.1 rkujawa aprint_normal("max %d mA, ",
462 1.1 rkujawa tps65217pmic_ppath_max_usb_current(ppath));
463 1.1 rkujawa }
464 1.1 rkujawa
465 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_AC_EN) {
466 1.1 rkujawa if (status & TPS65217PMIC_STATUS_ACPWR)
467 1.1 rkujawa aprint_normal("[AC] ");
468 1.1 rkujawa else
469 1.1 rkujawa aprint_normal("AC ");
470 1.1 rkujawa aprint_normal("max %d mA",
471 1.1 rkujawa tps65217pmic_ppath_max_ac_current(ppath));
472 1.1 rkujawa }
473 1.1 rkujawa
474 1.1 rkujawa aprint_normal("\n");
475 1.1 rkujawa
476 1.1 rkujawa }
477 1.1 rkujawa
478 1.1 rkujawa static uint8_t
479 1.1 rkujawa tps65217pmic_reg_read(struct tps65217pmic_softc *sc, uint8_t reg)
480 1.1 rkujawa {
481 1.1 rkujawa uint8_t wbuf[2];
482 1.1 rkujawa uint8_t rv;
483 1.1 rkujawa
484 1.1 rkujawa if (iic_acquire_bus(sc->sc_tag, I2C_F_POLL) != 0) {
485 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot acquire bus for read\n");
486 1.1 rkujawa return 0;
487 1.1 rkujawa }
488 1.1 rkujawa
489 1.1 rkujawa wbuf[0] = reg;
490 1.1 rkujawa
491 1.1 rkujawa if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, wbuf,
492 1.1 rkujawa 1, &rv, 1, I2C_F_POLL)) {
493 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot execute operation\n");
494 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
495 1.1 rkujawa return 0;
496 1.1 rkujawa }
497 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
498 1.1 rkujawa
499 1.1 rkujawa return rv;
500 1.1 rkujawa }
501 1.1 rkujawa
502