tps65217pmic.c revision 1.8 1 1.8 jakllsch /* $NetBSD: tps65217pmic.c,v 1.8 2014/01/08 16:45:14 jakllsch 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.4 jakllsch /*
33 1.4 jakllsch * Texas Instruments TPS65217 Power Management IC driver.
34 1.3 rkujawa * TODO: battery, sequencer, pgood
35 1.2 rkujawa */
36 1.2 rkujawa
37 1.1 rkujawa #include <sys/cdefs.h>
38 1.8 jakllsch __KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.8 2014/01/08 16:45:14 jakllsch 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.3 rkujawa #include <sys/mutex.h>
45 1.1 rkujawa
46 1.1 rkujawa #include <sys/bus.h>
47 1.1 rkujawa #include <dev/i2c/i2cvar.h>
48 1.1 rkujawa
49 1.3 rkujawa #include <dev/sysmon/sysmonvar.h>
50 1.3 rkujawa
51 1.1 rkujawa #include <dev/i2c/tps65217pmicreg.h>
52 1.1 rkujawa
53 1.3 rkujawa #define NTPS_REG 7
54 1.6 rkujawa #define SNUM_REGS NTPS_REG-1
55 1.6 rkujawa #define SNUM_USBSTATUS NTPS_REG
56 1.6 rkujawa #define SNUM_ACSTATUS NTPS_REG+1
57 1.3 rkujawa
58 1.1 rkujawa struct tps65217pmic_softc {
59 1.3 rkujawa device_t sc_dev;
60 1.3 rkujawa
61 1.3 rkujawa i2c_tag_t sc_tag;
62 1.3 rkujawa i2c_addr_t sc_addr;
63 1.1 rkujawa
64 1.3 rkujawa uint8_t sc_version;
65 1.3 rkujawa uint8_t sc_revision;
66 1.1 rkujawa
67 1.6 rkujawa kmutex_t sc_lock;
68 1.6 rkujawa
69 1.6 rkujawa bool sc_acstatus;
70 1.6 rkujawa bool sc_usbstatus;
71 1.6 rkujawa bool sc_acenabled;
72 1.6 rkujawa bool sc_usbenabled;
73 1.6 rkujawa
74 1.6 rkujawa callout_t sc_powerpollco;
75 1.6 rkujawa
76 1.6 rkujawa /* sysmon(4) stuff */
77 1.3 rkujawa struct sysmon_envsys *sc_sme;
78 1.6 rkujawa envsys_data_t sc_regsensor[NTPS_REG];
79 1.6 rkujawa envsys_data_t sc_acsensor;
80 1.6 rkujawa envsys_data_t sc_usbsensor;
81 1.6 rkujawa
82 1.6 rkujawa struct sysmon_pswitch sc_smpsw;
83 1.1 rkujawa };
84 1.1 rkujawa
85 1.2 rkujawa /* Voltage regulators */
86 1.2 rkujawa enum tps_reg_num {
87 1.2 rkujawa TPS65217PMIC_LDO1,
88 1.2 rkujawa TPS65217PMIC_LDO2,
89 1.2 rkujawa TPS65217PMIC_LDO3LS,
90 1.2 rkujawa TPS65217PMIC_LDO4LS,
91 1.2 rkujawa TPS65217PMIC_DCDC1,
92 1.2 rkujawa TPS65217PMIC_DCDC2,
93 1.2 rkujawa TPS65217PMIC_DCDC3
94 1.4 jakllsch };
95 1.2 rkujawa
96 1.2 rkujawa struct tps_reg_param {
97 1.2 rkujawa /* parameters configured statically */
98 1.2 rkujawa
99 1.2 rkujawa const char* name;
100 1.2 rkujawa uint16_t voltage_min; /* in mV */
101 1.2 rkujawa uint16_t voltage_max; /* in mV */
102 1.2 rkujawa const uint16_t *voltages; /* all possible voltage settings */
103 1.2 rkujawa uint8_t nvoltages; /* number of voltage settings */
104 1.2 rkujawa
105 1.2 rkujawa bool can_track; /* regulator can track U of other r. */
106 1.2 rkujawa struct tps_reg_param *tracked_reg; /* ptr to tracked regulator */
107 1.2 rkujawa bool can_xadj; /* voltage can be adjusted externally */
108 1.2 rkujawa bool can_ls; /* can be a load switch instead of r. */
109 1.2 rkujawa
110 1.2 rkujawa uint8_t defreg_num; /* DEF register */
111 1.2 rkujawa uint8_t enable_bit; /* position in ENABLE register */
112 1.4 jakllsch
113 1.2 rkujawa /*
114 1.2 rkujawa * Run-time parameters configured during attachment and later, these
115 1.2 rkujawa * probably should be split into separate struct that would be a part
116 1.2 rkujawa * of softc. But since we can have only one TPS chip, that should be
117 1.2 rkujawa * okay for now.
118 1.2 rkujawa */
119 1.2 rkujawa
120 1.2 rkujawa bool is_enabled; /* regulator is enabled */
121 1.2 rkujawa bool is_pg; /* regulator is "power good" */
122 1.2 rkujawa bool is_tracking; /* voltage is tracking other reg. */
123 1.2 rkujawa bool is_ls; /* is a load switch */
124 1.2 rkujawa bool is_xadj; /* voltage is adjusted externally */
125 1.2 rkujawa
126 1.2 rkujawa uint16_t current_voltage; /* in mV */
127 1.2 rkujawa
128 1.2 rkujawa };
129 1.2 rkujawa
130 1.1 rkujawa static int tps65217pmic_match(device_t, cfdata_t, void *);
131 1.1 rkujawa static void tps65217pmic_attach(device_t, device_t, void *);
132 1.1 rkujawa
133 1.3 rkujawa static uint8_t tps65217pmic_reg_read(struct tps65217pmic_softc *, uint8_t);
134 1.8 jakllsch static void tps65217pmic_reg_write(struct tps65217pmic_softc *, uint8_t,
135 1.8 jakllsch uint8_t);
136 1.3 rkujawa
137 1.6 rkujawa static void tps65217pmic_reg_refresh(struct tps65217pmic_softc *);
138 1.2 rkujawa
139 1.3 rkujawa static uint16_t tps65217pmic_ppath_max_usb_current(uint8_t);
140 1.3 rkujawa static uint16_t tps65217pmic_ppath_max_ac_current(uint8_t);
141 1.1 rkujawa
142 1.3 rkujawa static void tps65217pmic_regulator_read_config(struct tps65217pmic_softc *,
143 1.3 rkujawa struct tps_reg_param *);
144 1.1 rkujawa
145 1.3 rkujawa static void tps65217pmic_print_ppath(struct tps65217pmic_softc *);
146 1.3 rkujawa static void tps65217pmic_print_ldos(struct tps65217pmic_softc *);
147 1.2 rkujawa
148 1.3 rkujawa static void tps65217pmic_version(struct tps65217pmic_softc *);
149 1.2 rkujawa
150 1.3 rkujawa static void tps65217pmic_envsys_register(struct tps65217pmic_softc *);
151 1.3 rkujawa static void tps65217pmic_envsys_refresh(struct sysmon_envsys *, envsys_data_t *);
152 1.1 rkujawa
153 1.6 rkujawa static void tps65217pmic_power_monitor_init(struct tps65217pmic_softc *);
154 1.6 rkujawa static void tps65217pmic_power_monitor(void *);
155 1.6 rkujawa
156 1.1 rkujawa CFATTACH_DECL_NEW(tps65217pmic, sizeof (struct tps65217pmic_softc),
157 1.1 rkujawa tps65217pmic_match, tps65217pmic_attach, NULL, NULL);
158 1.1 rkujawa
159 1.1 rkujawa /* Possible settings of LDO1 in mV. */
160 1.4 jakllsch static const uint16_t ldo1voltages[] = { 1000, 1100, 1200, 1250, 1300, 1350,
161 1.1 rkujawa 1400, 1500, 1600, 1800, 2500, 2750, 2800, 3000, 3100, 3300 };
162 1.1 rkujawa /* Possible settings of LDO2, DCDC1, DCDC2, DCDC3 in mV. */
163 1.4 jakllsch static const uint16_t ldo2voltages[] = { 900, 925, 950, 975, 1000, 1025, 1050,
164 1.4 jakllsch 1075, 1100, 1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300, 1325, 1350,
165 1.4 jakllsch 1375, 1400, 1425, 1450, 1475, 1500, 1550, 1600, 1650, 1700, 1750, 1800,
166 1.4 jakllsch 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, 2400,
167 1.4 jakllsch 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 3000, 3100,
168 1.1 rkujawa 3200, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300 };
169 1.1 rkujawa /* Possible settings of LDO3, LDO4 in mV. */
170 1.4 jakllsch static const uint16_t ldo3voltages[] = { 1500, 1550, 1600, 1650, 1700, 1750,
171 1.4 jakllsch 1800, 1850, 1900, 2000, 2100, 2200, 2300, 2400, 2450, 2500, 2550, 2600,
172 1.4 jakllsch 2650, 2700, 2750, 2800, 2850, 2900,2950, 3000, 3050, 3100, 3150, 3200,
173 1.1 rkujawa 3250, 3300 };
174 1.1 rkujawa
175 1.2 rkujawa static struct tps_reg_param tps_regulators[] = {
176 1.4 jakllsch {
177 1.4 jakllsch .name = "LDO1",
178 1.4 jakllsch .voltage_min = 1000,
179 1.4 jakllsch .voltage_max = 3300,
180 1.2 rkujawa .voltages = ldo1voltages,
181 1.2 rkujawa .nvoltages = 16,
182 1.2 rkujawa .can_track = false,
183 1.2 rkujawa .tracked_reg = NULL,
184 1.2 rkujawa .can_xadj = false,
185 1.2 rkujawa .can_ls = false,
186 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO1,
187 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO1
188 1.2 rkujawa },
189 1.4 jakllsch {
190 1.2 rkujawa .name = "LDO2",
191 1.4 jakllsch .voltage_min = 900,
192 1.2 rkujawa .voltage_max = 3300,
193 1.2 rkujawa .voltages = ldo2voltages,
194 1.2 rkujawa .nvoltages = 64,
195 1.2 rkujawa .can_track = true,
196 1.4 jakllsch .tracked_reg = &(tps_regulators[TPS65217PMIC_DCDC3]),
197 1.2 rkujawa .can_xadj = false,
198 1.2 rkujawa .can_ls = false,
199 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO2,
200 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO2
201 1.2 rkujawa },
202 1.4 jakllsch {
203 1.2 rkujawa .name = "LDO3",
204 1.4 jakllsch .voltage_min = 1500,
205 1.2 rkujawa .voltage_max = 3300,
206 1.2 rkujawa .voltages = ldo3voltages,
207 1.2 rkujawa .nvoltages = 32,
208 1.2 rkujawa .can_track = false,
209 1.4 jakllsch .tracked_reg = NULL,
210 1.2 rkujawa .can_xadj = false,
211 1.2 rkujawa .can_ls = true,
212 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO3,
213 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO3
214 1.2 rkujawa },
215 1.4 jakllsch {
216 1.2 rkujawa .name = "LDO4",
217 1.4 jakllsch .voltage_min = 1500,
218 1.2 rkujawa .voltage_max = 3300,
219 1.2 rkujawa .voltages = ldo3voltages,
220 1.2 rkujawa .nvoltages = 32,
221 1.2 rkujawa .can_track = false,
222 1.4 jakllsch .tracked_reg = NULL,
223 1.2 rkujawa .can_xadj = false,
224 1.2 rkujawa .can_ls = true,
225 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFLDO4,
226 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_LDO4
227 1.2 rkujawa },
228 1.4 jakllsch {
229 1.2 rkujawa .name = "DCDC1",
230 1.4 jakllsch .voltage_min = 900,
231 1.2 rkujawa .voltage_max = 3300,
232 1.2 rkujawa .voltages = ldo2voltages,
233 1.2 rkujawa .nvoltages = 64,
234 1.2 rkujawa .can_track = false,
235 1.4 jakllsch .tracked_reg = NULL,
236 1.2 rkujawa .can_xadj = true,
237 1.2 rkujawa .can_ls = false,
238 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC1,
239 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_DCDC1
240 1.2 rkujawa },
241 1.4 jakllsch {
242 1.2 rkujawa .name = "DCDC2",
243 1.4 jakllsch .voltage_min = 900,
244 1.2 rkujawa .voltage_max = 3300,
245 1.2 rkujawa .voltages = ldo2voltages,
246 1.2 rkujawa .nvoltages = 64,
247 1.2 rkujawa .can_track = false,
248 1.4 jakllsch .tracked_reg = NULL,
249 1.2 rkujawa .can_xadj = true,
250 1.2 rkujawa .can_ls = false,
251 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC2,
252 1.4 jakllsch .enable_bit = TPS65217PMIC_ENABLE_DCDC2
253 1.2 rkujawa },
254 1.4 jakllsch {
255 1.2 rkujawa .name = "DCDC3",
256 1.4 jakllsch .voltage_min = 900,
257 1.2 rkujawa .voltage_max = 3300,
258 1.2 rkujawa .voltages = ldo2voltages,
259 1.2 rkujawa .nvoltages = 64,
260 1.2 rkujawa .can_track = false,
261 1.4 jakllsch .tracked_reg = NULL,
262 1.2 rkujawa .can_xadj = true,
263 1.2 rkujawa .can_ls = false,
264 1.2 rkujawa .defreg_num = TPS65217PMIC_DEFDCDC3,
265 1.2 rkujawa .enable_bit = TPS65217PMIC_ENABLE_DCDC3
266 1.2 rkujawa }
267 1.2 rkujawa };
268 1.2 rkujawa
269 1.2 rkujawa static bool matched = false;
270 1.2 rkujawa
271 1.1 rkujawa static int
272 1.1 rkujawa tps65217pmic_match(device_t parent, cfdata_t cf, void *aux)
273 1.1 rkujawa {
274 1.1 rkujawa struct i2c_attach_args *ia = aux;
275 1.1 rkujawa
276 1.2 rkujawa if (ia->ia_addr == TPS65217PMIC_ADDR) {
277 1.2 rkujawa /* we can only have one */
278 1.2 rkujawa if (matched)
279 1.2 rkujawa return 0;
280 1.2 rkujawa else
281 1.2 rkujawa matched = true;
282 1.2 rkujawa
283 1.1 rkujawa return 1;
284 1.2 rkujawa }
285 1.1 rkujawa return 0;
286 1.1 rkujawa }
287 1.1 rkujawa
288 1.1 rkujawa static void
289 1.1 rkujawa tps65217pmic_attach(device_t parent, device_t self, void *aux)
290 1.1 rkujawa {
291 1.1 rkujawa struct tps65217pmic_softc *sc = device_private(self);
292 1.1 rkujawa struct i2c_attach_args *ia = aux;
293 1.1 rkujawa
294 1.1 rkujawa sc->sc_dev = self;
295 1.1 rkujawa sc->sc_addr = ia->ia_addr;
296 1.1 rkujawa sc->sc_tag = ia->ia_tag;
297 1.1 rkujawa
298 1.1 rkujawa tps65217pmic_version(sc);
299 1.1 rkujawa
300 1.1 rkujawa aprint_normal(": TPS65217");
301 1.1 rkujawa switch (sc->sc_version) {
302 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_A:
303 1.1 rkujawa aprint_normal("A");
304 1.1 rkujawa break;
305 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_B:
306 1.1 rkujawa aprint_normal("B");
307 1.1 rkujawa break;
308 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_C:
309 1.1 rkujawa aprint_normal("C");
310 1.1 rkujawa break;
311 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_D:
312 1.1 rkujawa aprint_normal("D");
313 1.1 rkujawa break;
314 1.1 rkujawa default:
315 1.1 rkujawa /* unknown version */
316 1.1 rkujawa break;
317 1.1 rkujawa }
318 1.1 rkujawa
319 1.4 jakllsch aprint_normal(" Power Management Multi-Channel IC (rev 1.%d)\n",
320 1.1 rkujawa sc->sc_revision);
321 1.1 rkujawa
322 1.3 rkujawa mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
323 1.3 rkujawa
324 1.6 rkujawa sc->sc_smpsw.smpsw_name = device_xname(self);
325 1.6 rkujawa sc->sc_smpsw.smpsw_type = PSWITCH_TYPE_ACADAPTER;
326 1.6 rkujawa sysmon_pswitch_register(&sc->sc_smpsw);
327 1.6 rkujawa
328 1.6 rkujawa tps65217pmic_reg_refresh(sc);
329 1.2 rkujawa
330 1.2 rkujawa tps65217pmic_print_ppath(sc);
331 1.2 rkujawa tps65217pmic_print_ldos(sc);
332 1.3 rkujawa
333 1.6 rkujawa tps65217pmic_power_monitor_init(sc);
334 1.6 rkujawa
335 1.3 rkujawa tps65217pmic_envsys_register(sc);
336 1.2 rkujawa }
337 1.2 rkujawa
338 1.2 rkujawa static void
339 1.6 rkujawa tps65217pmic_power_monitor_init(struct tps65217pmic_softc *sc)
340 1.6 rkujawa {
341 1.6 rkujawa uint8_t intr, intrmask, status, ppath;
342 1.6 rkujawa
343 1.6 rkujawa intrmask = TPS65217PMIC_INT_USBM | TPS65217PMIC_INT_ACM |
344 1.6 rkujawa TPS65217PMIC_INT_PBM;
345 1.6 rkujawa
346 1.6 rkujawa status = tps65217pmic_reg_read(sc, TPS65217PMIC_STATUS);
347 1.6 rkujawa ppath = tps65217pmic_reg_read(sc, TPS65217PMIC_PPATH);
348 1.6 rkujawa /* acknowledge and disregard whatever interrupt was generated earlier */
349 1.6 rkujawa intr = tps65217pmic_reg_read(sc, TPS65217PMIC_INT);
350 1.6 rkujawa
351 1.6 rkujawa sc->sc_usbstatus = status & TPS65217PMIC_STATUS_USBPWR;
352 1.6 rkujawa sc->sc_acstatus = status & TPS65217PMIC_STATUS_ACPWR;
353 1.6 rkujawa sc->sc_usbenabled = ppath & TPS65217PMIC_PPATH_USB_EN;
354 1.6 rkujawa sc->sc_acenabled = ppath & TPS65217PMIC_PPATH_AC_EN;
355 1.6 rkujawa
356 1.6 rkujawa if (intr & intrmask)
357 1.6 rkujawa aprint_normal_dev(sc->sc_dev,
358 1.6 rkujawa "WARNING: hardware interrupt enabled but not supported");
359 1.6 rkujawa
360 1.6 rkujawa /* set up callout to poll for power source changes */
361 1.6 rkujawa callout_init(&sc->sc_powerpollco, 0);
362 1.6 rkujawa callout_setfunc(&sc->sc_powerpollco, tps65217pmic_power_monitor, sc);
363 1.6 rkujawa
364 1.6 rkujawa callout_schedule(&sc->sc_powerpollco, hz);
365 1.6 rkujawa }
366 1.6 rkujawa
367 1.6 rkujawa static void
368 1.6 rkujawa tps65217pmic_power_monitor(void *aux)
369 1.6 rkujawa {
370 1.6 rkujawa struct tps65217pmic_softc *sc;
371 1.6 rkujawa uint8_t status;
372 1.6 rkujawa bool usbstatus, acstatus;
373 1.6 rkujawa
374 1.6 rkujawa sc = aux;
375 1.6 rkujawa
376 1.6 rkujawa mutex_enter(&sc->sc_lock);
377 1.6 rkujawa
378 1.6 rkujawa status = tps65217pmic_reg_read(sc, TPS65217PMIC_STATUS);
379 1.6 rkujawa usbstatus = status & TPS65217PMIC_STATUS_USBPWR;
380 1.6 rkujawa acstatus = status & TPS65217PMIC_STATUS_ACPWR;
381 1.6 rkujawa
382 1.6 rkujawa if (usbstatus != sc->sc_usbstatus) {
383 1.6 rkujawa sc->sc_usbstatus = usbstatus;
384 1.6 rkujawa pmf_event_inject(NULL, PMFE_POWER_CHANGED);
385 1.6 rkujawa if (usbstatus)
386 1.6 rkujawa aprint_normal_dev(sc->sc_dev,
387 1.6 rkujawa "USB power source connected\n");
388 1.6 rkujawa else
389 1.6 rkujawa aprint_normal_dev(sc->sc_dev,
390 1.6 rkujawa "USB power source disconnected\n");
391 1.6 rkujawa }
392 1.6 rkujawa
393 1.6 rkujawa if (acstatus != sc->sc_acstatus) {
394 1.6 rkujawa sc->sc_acstatus = acstatus;
395 1.6 rkujawa pmf_event_inject(NULL, PMFE_POWER_CHANGED);
396 1.6 rkujawa if (acstatus) {
397 1.6 rkujawa sysmon_pswitch_event(&sc->sc_smpsw,
398 1.6 rkujawa PSWITCH_EVENT_PRESSED);
399 1.6 rkujawa } else {
400 1.6 rkujawa sysmon_pswitch_event(&sc->sc_smpsw,
401 1.6 rkujawa PSWITCH_EVENT_RELEASED);
402 1.6 rkujawa }
403 1.6 rkujawa }
404 1.6 rkujawa
405 1.6 rkujawa mutex_exit(&sc->sc_lock);
406 1.6 rkujawa
407 1.6 rkujawa callout_schedule(&sc->sc_powerpollco, hz);
408 1.6 rkujawa }
409 1.6 rkujawa
410 1.6 rkujawa static void
411 1.6 rkujawa tps65217pmic_reg_refresh(struct tps65217pmic_softc *sc)
412 1.2 rkujawa {
413 1.2 rkujawa int i;
414 1.2 rkujawa struct tps_reg_param *c_reg;
415 1.2 rkujawa
416 1.2 rkujawa for (i = 0; i < NTPS_REG; i++) {
417 1.2 rkujawa c_reg = &tps_regulators[i];
418 1.4 jakllsch tps65217pmic_regulator_read_config(sc, c_reg);
419 1.2 rkujawa }
420 1.1 rkujawa }
421 1.1 rkujawa
422 1.1 rkujawa /* Get version and revision of the chip. */
423 1.4 jakllsch static void
424 1.1 rkujawa tps65217pmic_version(struct tps65217pmic_softc *sc)
425 1.1 rkujawa {
426 1.1 rkujawa uint8_t chipid;
427 1.1 rkujawa
428 1.1 rkujawa chipid = tps65217pmic_reg_read(sc, TPS65217PMIC_CHIPID);
429 1.1 rkujawa
430 1.1 rkujawa sc->sc_version = chipid & TPS65217PMIC_CHIPID_VER_MASK;
431 1.1 rkujawa sc->sc_revision = chipid & TPS65217PMIC_CHIPID_REV_MASK;
432 1.1 rkujawa }
433 1.1 rkujawa
434 1.4 jakllsch static uint16_t
435 1.4 jakllsch tps65217pmic_ppath_max_ac_current(uint8_t ppath)
436 1.1 rkujawa {
437 1.4 jakllsch switch ((ppath & TPS65217PMIC_PPATH_IAC) >>
438 1.1 rkujawa TPS65217PMIC_PPATH_IAC_RSHFIT) {
439 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_100MA:
440 1.1 rkujawa return 100;
441 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_500MA:
442 1.5 rkujawa return 500;
443 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_1300MA:
444 1.1 rkujawa return 1300;
445 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_2500MA:
446 1.1 rkujawa return 2500;
447 1.1 rkujawa }
448 1.1 rkujawa return 0;
449 1.1 rkujawa }
450 1.1 rkujawa
451 1.4 jakllsch static uint16_t
452 1.1 rkujawa tps65217pmic_ppath_max_usb_current(uint8_t ppath)
453 1.1 rkujawa {
454 1.1 rkujawa switch (ppath & TPS65217PMIC_PPATH_IUSB) {
455 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_100MA:
456 1.1 rkujawa return 100;
457 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_500MA:
458 1.5 rkujawa return 500;
459 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1300MA:
460 1.1 rkujawa return 1300;
461 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1800MA:
462 1.1 rkujawa return 1800;
463 1.1 rkujawa }
464 1.1 rkujawa return 0;
465 1.1 rkujawa }
466 1.1 rkujawa
467 1.2 rkujawa /* Read regulator state and save it to tps_reg_param. */
468 1.4 jakllsch static void
469 1.4 jakllsch tps65217pmic_regulator_read_config(struct tps65217pmic_softc *sc, struct
470 1.2 rkujawa tps_reg_param *regulator)
471 1.1 rkujawa {
472 1.2 rkujawa uint8_t defreg, regenable;
473 1.2 rkujawa uint16_t voltage;
474 1.1 rkujawa
475 1.2 rkujawa regenable = tps65217pmic_reg_read(sc, TPS65217PMIC_ENABLE);
476 1.2 rkujawa
477 1.2 rkujawa if (regenable & (regulator->enable_bit))
478 1.2 rkujawa regulator->is_enabled = true;
479 1.2 rkujawa else {
480 1.2 rkujawa regulator->is_enabled = false;
481 1.2 rkujawa return;
482 1.2 rkujawa }
483 1.2 rkujawa
484 1.4 jakllsch defreg = tps65217pmic_reg_read(sc,
485 1.2 rkujawa regulator->defreg_num);
486 1.2 rkujawa
487 1.2 rkujawa switch (regulator->nvoltages) {
488 1.2 rkujawa case 16:
489 1.4 jakllsch voltage = regulator->voltages[defreg &
490 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_16];
491 1.2 rkujawa break;
492 1.2 rkujawa case 32:
493 1.4 jakllsch voltage = regulator->voltages[defreg &
494 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_32];
495 1.2 rkujawa break;
496 1.2 rkujawa case 64:
497 1.4 jakllsch voltage = regulator->voltages[defreg &
498 1.2 rkujawa TPS65217PMIC_DEFX_VOLTAGE_64];
499 1.2 rkujawa break;
500 1.1 rkujawa default:
501 1.2 rkujawa /* unsupported number of voltage settings? */
502 1.2 rkujawa voltage = 0;
503 1.1 rkujawa break;
504 1.1 rkujawa }
505 1.1 rkujawa
506 1.2 rkujawa /* Handle regulator tracking other regulator voltage. */
507 1.2 rkujawa if (regulator->can_track)
508 1.2 rkujawa if (defreg & TPS65217PMIC_DEFX_TRACKING) {
509 1.2 rkujawa regulator->is_tracking = true;
510 1.2 rkujawa voltage = 0; /* see regulator->tracked_reg */
511 1.2 rkujawa }
512 1.2 rkujawa
513 1.2 rkujawa /* Handle regulator configured into load switch mode. */
514 1.2 rkujawa if (regulator->can_ls)
515 1.2 rkujawa if (!(defreg & TPS65217PMIC_DEFX_LS)) {
516 1.2 rkujawa regulator->is_ls = true;
517 1.4 jakllsch voltage = 0;
518 1.2 rkujawa }
519 1.2 rkujawa
520 1.2 rkujawa if (regulator->can_xadj)
521 1.2 rkujawa if (defreg & TPS65217PMIC_DEFX_XADJ) {
522 1.2 rkujawa regulator->is_xadj = true;
523 1.2 rkujawa voltage = 0;
524 1.2 rkujawa
525 1.2 rkujawa }
526 1.2 rkujawa
527 1.2 rkujawa /* TODO: add PGOOD checking */
528 1.2 rkujawa
529 1.2 rkujawa regulator->current_voltage = voltage;
530 1.2 rkujawa }
531 1.2 rkujawa
532 1.2 rkujawa static void
533 1.2 rkujawa tps65217pmic_print_ldos(struct tps65217pmic_softc *sc)
534 1.2 rkujawa {
535 1.2 rkujawa int i;
536 1.2 rkujawa struct tps_reg_param *c_reg;
537 1.2 rkujawa
538 1.2 rkujawa aprint_normal_dev(sc->sc_dev, "");
539 1.2 rkujawa
540 1.2 rkujawa for (i = 0; i < NTPS_REG; i++) {
541 1.2 rkujawa c_reg = &tps_regulators[i];
542 1.2 rkujawa
543 1.3 rkujawa if (c_reg->is_enabled) {
544 1.3 rkujawa if (c_reg->is_ls)
545 1.2 rkujawa aprint_normal("[%s: LS] ", c_reg->name);
546 1.3 rkujawa else if (c_reg->is_xadj)
547 1.2 rkujawa aprint_normal("[%s: XADJ] ", c_reg->name);
548 1.3 rkujawa else
549 1.2 rkujawa aprint_normal("[%s: %d mV] ", c_reg->name,
550 1.2 rkujawa c_reg->current_voltage);
551 1.2 rkujawa }
552 1.2 rkujawa }
553 1.2 rkujawa aprint_normal("\n");
554 1.1 rkujawa }
555 1.1 rkujawa
556 1.4 jakllsch static void
557 1.2 rkujawa tps65217pmic_print_ppath(struct tps65217pmic_softc *sc)
558 1.1 rkujawa {
559 1.7 skrll uint8_t status, ppath;
560 1.1 rkujawa
561 1.1 rkujawa ppath = tps65217pmic_reg_read(sc, TPS65217PMIC_PPATH);
562 1.1 rkujawa status = tps65217pmic_reg_read(sc, TPS65217PMIC_STATUS);
563 1.1 rkujawa
564 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "power sources ");
565 1.1 rkujawa
566 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_USB_EN) {
567 1.1 rkujawa if (status & TPS65217PMIC_STATUS_USBPWR)
568 1.1 rkujawa aprint_normal("[USB] ");
569 1.1 rkujawa else
570 1.1 rkujawa aprint_normal("USB ");
571 1.4 jakllsch aprint_normal("max %d mA, ",
572 1.1 rkujawa tps65217pmic_ppath_max_usb_current(ppath));
573 1.1 rkujawa }
574 1.1 rkujawa
575 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_AC_EN) {
576 1.1 rkujawa if (status & TPS65217PMIC_STATUS_ACPWR)
577 1.1 rkujawa aprint_normal("[AC] ");
578 1.1 rkujawa else
579 1.1 rkujawa aprint_normal("AC ");
580 1.4 jakllsch aprint_normal("max %d mA",
581 1.1 rkujawa tps65217pmic_ppath_max_ac_current(ppath));
582 1.1 rkujawa }
583 1.1 rkujawa
584 1.1 rkujawa aprint_normal("\n");
585 1.1 rkujawa }
586 1.1 rkujawa
587 1.1 rkujawa static uint8_t
588 1.1 rkujawa tps65217pmic_reg_read(struct tps65217pmic_softc *sc, uint8_t reg)
589 1.1 rkujawa {
590 1.1 rkujawa uint8_t wbuf[2];
591 1.1 rkujawa uint8_t rv;
592 1.1 rkujawa
593 1.1 rkujawa if (iic_acquire_bus(sc->sc_tag, I2C_F_POLL) != 0) {
594 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot acquire bus for read\n");
595 1.1 rkujawa return 0;
596 1.1 rkujawa }
597 1.1 rkujawa
598 1.1 rkujawa wbuf[0] = reg;
599 1.1 rkujawa
600 1.4 jakllsch if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, wbuf,
601 1.1 rkujawa 1, &rv, 1, I2C_F_POLL)) {
602 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot execute operation\n");
603 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
604 1.1 rkujawa return 0;
605 1.1 rkujawa }
606 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
607 1.1 rkujawa
608 1.1 rkujawa return rv;
609 1.1 rkujawa }
610 1.1 rkujawa
611 1.8 jakllsch static void __unused
612 1.8 jakllsch tps65217pmic_reg_write(struct tps65217pmic_softc *sc, uint8_t reg, uint8_t data)
613 1.8 jakllsch {
614 1.8 jakllsch uint8_t wbuf[2];
615 1.8 jakllsch
616 1.8 jakllsch if (iic_acquire_bus(sc->sc_tag, I2C_F_POLL) != 0) {
617 1.8 jakllsch aprint_error_dev(sc->sc_dev, "cannot acquire bus for write\n");
618 1.8 jakllsch return;
619 1.8 jakllsch }
620 1.8 jakllsch
621 1.8 jakllsch wbuf[0] = reg;
622 1.8 jakllsch wbuf[1] = data;
623 1.8 jakllsch
624 1.8 jakllsch if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP, sc->sc_addr, wbuf,
625 1.8 jakllsch 2, NULL, 0, I2C_F_POLL)) {
626 1.8 jakllsch aprint_error_dev(sc->sc_dev, "cannot execute I2C write\n");
627 1.8 jakllsch iic_release_bus(sc->sc_tag, I2C_F_POLL);
628 1.8 jakllsch return;
629 1.8 jakllsch }
630 1.8 jakllsch
631 1.8 jakllsch iic_release_bus(sc->sc_tag, I2C_F_POLL);
632 1.8 jakllsch }
633 1.8 jakllsch
634 1.3 rkujawa static void
635 1.3 rkujawa tps65217pmic_envsys_register(struct tps65217pmic_softc *sc)
636 1.3 rkujawa {
637 1.3 rkujawa int i;
638 1.3 rkujawa
639 1.3 rkujawa sc->sc_sme = sysmon_envsys_create();
640 1.3 rkujawa
641 1.6 rkujawa /* iterate over all regulators and attach them as sensors */
642 1.6 rkujawa for(i = 0; i <= SNUM_REGS; i++) {
643 1.3 rkujawa /* set name */
644 1.6 rkujawa strlcpy(sc->sc_regsensor[i].desc, tps_regulators[i].name,
645 1.6 rkujawa sizeof(sc->sc_regsensor[i].desc));
646 1.6 rkujawa sc->sc_regsensor[i].units = ENVSYS_SVOLTS_DC;
647 1.6 rkujawa sc->sc_regsensor[i].state = ENVSYS_SINVALID;
648 1.3 rkujawa
649 1.6 rkujawa if (sysmon_envsys_sensor_attach(sc->sc_sme,
650 1.6 rkujawa &sc->sc_regsensor[i]))
651 1.4 jakllsch aprint_error_dev(sc->sc_dev,
652 1.6 rkujawa "error attaching regulator sensor %d\n", i);
653 1.3 rkujawa }
654 1.3 rkujawa
655 1.6 rkujawa /* attach power source indicators */
656 1.6 rkujawa strcpy(sc->sc_usbsensor.desc, "USB power source"); /* SNUM_USBSTATUS */
657 1.6 rkujawa sc->sc_usbsensor.units = ENVSYS_INDICATOR;
658 1.6 rkujawa sc->sc_usbsensor.state = ENVSYS_SINVALID;
659 1.6 rkujawa if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_usbsensor))
660 1.6 rkujawa aprint_error_dev(sc->sc_dev,
661 1.6 rkujawa "error attaching USB power source sensor\n");
662 1.6 rkujawa strcpy(sc->sc_acsensor.desc, "AC power source"); /* SNUM_ACSTATUS */
663 1.6 rkujawa sc->sc_acsensor.units = ENVSYS_INDICATOR;
664 1.6 rkujawa sc->sc_acsensor.state = ENVSYS_SINVALID;
665 1.6 rkujawa if (sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_acsensor))
666 1.6 rkujawa aprint_error_dev(sc->sc_dev,
667 1.6 rkujawa "error attaching AC power source sensor\n");
668 1.6 rkujawa
669 1.6 rkujawa /* register everything in sysmon */
670 1.3 rkujawa sc->sc_sme->sme_name = device_xname(sc->sc_dev);
671 1.3 rkujawa sc->sc_sme->sme_cookie = sc;
672 1.3 rkujawa sc->sc_sme->sme_refresh = tps65217pmic_envsys_refresh;
673 1.3 rkujawa
674 1.3 rkujawa if (sysmon_envsys_register(sc->sc_sme)) {
675 1.3 rkujawa aprint_error_dev(sc->sc_dev, "unable to register in sysmon\n");
676 1.3 rkujawa sysmon_envsys_destroy(sc->sc_sme);
677 1.3 rkujawa }
678 1.3 rkujawa }
679 1.3 rkujawa
680 1.3 rkujawa static void
681 1.3 rkujawa tps65217pmic_envsys_refresh(struct sysmon_envsys *sme, envsys_data_t *edata)
682 1.3 rkujawa {
683 1.4 jakllsch struct tps65217pmic_softc *sc = sme->sme_cookie;
684 1.3 rkujawa
685 1.3 rkujawa mutex_enter(&sc->sc_lock);
686 1.3 rkujawa
687 1.6 rkujawa tps65217pmic_reg_refresh(sc);
688 1.3 rkujawa
689 1.6 rkujawa if (edata->sensor <= SNUM_REGS) {
690 1.6 rkujawa /* TODO: handle special cases like LS, XADJ... */
691 1.6 rkujawa edata->value_cur = tps_regulators[edata->sensor].current_voltage * 1000;
692 1.6 rkujawa edata->state = ENVSYS_SVALID;
693 1.6 rkujawa } else if (edata->sensor == SNUM_USBSTATUS) {
694 1.6 rkujawa edata->value_cur = sc->sc_usbstatus && sc->sc_usbenabled;
695 1.6 rkujawa edata->state = ENVSYS_SVALID;
696 1.6 rkujawa } else if (edata->sensor == SNUM_ACSTATUS) {
697 1.6 rkujawa edata->value_cur = sc->sc_acstatus && sc->sc_acenabled;
698 1.6 rkujawa edata->state = ENVSYS_SVALID;
699 1.6 rkujawa } else
700 1.6 rkujawa aprint_error_dev(sc->sc_dev, "unknown sensor number\n");
701 1.4 jakllsch
702 1.3 rkujawa mutex_exit(&sc->sc_lock);
703 1.3 rkujawa }
704 1.3 rkujawa
705