tps65217pmic.c revision 1.1 1 1.1 rkujawa /* $NetBSD: tps65217pmic.c,v 1.1 2013/04/25 20:55:34 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.1 rkujawa #include <sys/cdefs.h>
33 1.1 rkujawa __KERNEL_RCSID(0, "$NetBSD: tps65217pmic.c,v 1.1 2013/04/25 20:55:34 rkujawa Exp $");
34 1.1 rkujawa
35 1.1 rkujawa #include <sys/param.h>
36 1.1 rkujawa #include <sys/systm.h>
37 1.1 rkujawa #include <sys/device.h>
38 1.1 rkujawa #include <sys/kernel.h>
39 1.1 rkujawa
40 1.1 rkujawa #include <sys/bus.h>
41 1.1 rkujawa #include <dev/i2c/i2cvar.h>
42 1.1 rkujawa
43 1.1 rkujawa #include <dev/i2c/tps65217pmicreg.h>
44 1.1 rkujawa
45 1.1 rkujawa struct tps65217pmic_softc {
46 1.1 rkujawa device_t sc_dev;
47 1.1 rkujawa
48 1.1 rkujawa i2c_tag_t sc_tag;
49 1.1 rkujawa i2c_addr_t sc_addr;
50 1.1 rkujawa
51 1.1 rkujawa uint8_t sc_version;
52 1.1 rkujawa uint8_t sc_revision;
53 1.1 rkujawa };
54 1.1 rkujawa
55 1.1 rkujawa static int tps65217pmic_match(device_t, cfdata_t, void *);
56 1.1 rkujawa static void tps65217pmic_attach(device_t, device_t, void *);
57 1.1 rkujawa
58 1.1 rkujawa static uint8_t tps65217pmic_reg_read(struct tps65217pmic_softc *sc,
59 1.1 rkujawa uint8_t reg);
60 1.1 rkujawa
61 1.1 rkujawa static uint16_t tps65217pmic_ppath_max_usb_current(uint8_t ppath);
62 1.1 rkujawa static uint16_t tps65217pmic_ppath_max_ac_current(uint8_t ppath);
63 1.1 rkujawa
64 1.1 rkujawa static void tps65217pmic_print_status(struct tps65217pmic_softc *sc);
65 1.1 rkujawa static void tps65217pmic_version(struct tps65217pmic_softc *sc);
66 1.1 rkujawa
67 1.1 rkujawa CFATTACH_DECL_NEW(tps65217pmic, sizeof (struct tps65217pmic_softc),
68 1.1 rkujawa tps65217pmic_match, tps65217pmic_attach, NULL, NULL);
69 1.1 rkujawa
70 1.1 rkujawa /* Voltage regulators */
71 1.1 rkujawa enum tpsreg {
72 1.1 rkujawa TPS65217PMIC_LDO1,
73 1.1 rkujawa TPS65217PMIC_LDO2,
74 1.1 rkujawa TPS65217PMIC_LDO3LS,
75 1.1 rkujawa TPS65217PMIC_LDO4LS,
76 1.1 rkujawa TPS65217PMIC_DCDC1,
77 1.1 rkujawa TPS65217PMIC_DCDC2,
78 1.1 rkujawa TPS65217PMIC_DCDC3
79 1.1 rkujawa };
80 1.1 rkujawa
81 1.1 rkujawa /* Possible settings of LDO1 in mV. */
82 1.1 rkujawa static const uint16_t ldo1voltages[] = { 1000, 1100, 1200, 1250, 1300, 1350,
83 1.1 rkujawa 1400, 1500, 1600, 1800, 2500, 2750, 2800, 3000, 3100, 3300 };
84 1.1 rkujawa /* Possible settings of LDO2, DCDC1, DCDC2, DCDC3 in mV. */
85 1.1 rkujawa static const uint16_t ldo2voltages[] = { 900, 925, 950, 975, 1000, 1025, 1050,
86 1.1 rkujawa 1075, 1100, 1125, 1150, 1175, 1200, 1225, 1250, 1275, 1300, 1325, 1350,
87 1.1 rkujawa 1375, 1400, 1425, 1450, 1475, 1500, 1550, 1600, 1650, 1700, 1750, 1800,
88 1.1 rkujawa 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, 2400,
89 1.1 rkujawa 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 3000, 3100,
90 1.1 rkujawa 3200, 3300, 3300, 3300, 3300, 3300, 3300, 3300, 3300 };
91 1.1 rkujawa /* Possible settings of LDO3, LDO4 in mV. */
92 1.1 rkujawa static const uint16_t ldo3voltages[] = { 1500, 1550, 1600, 1650, 1700, 1750,
93 1.1 rkujawa 1800, 1850,1900, 2000, 2100, 2200, 2300, 2400, 2450, 2500,2550, 2600,
94 1.1 rkujawa 2650, 2700, 2750, 2800, 2850, 2900,2950, 3000, 3050, 3100, 3150, 3200,
95 1.1 rkujawa 3250, 3300 };
96 1.1 rkujawa
97 1.1 rkujawa static int
98 1.1 rkujawa tps65217pmic_match(device_t parent, cfdata_t cf, void *aux)
99 1.1 rkujawa {
100 1.1 rkujawa struct i2c_attach_args *ia = aux;
101 1.1 rkujawa
102 1.1 rkujawa if (ia->ia_addr == TPS65217PMIC_ADDR)
103 1.1 rkujawa return 1;
104 1.1 rkujawa return 0;
105 1.1 rkujawa }
106 1.1 rkujawa
107 1.1 rkujawa static void
108 1.1 rkujawa tps65217pmic_attach(device_t parent, device_t self, void *aux)
109 1.1 rkujawa {
110 1.1 rkujawa struct tps65217pmic_softc *sc = device_private(self);
111 1.1 rkujawa struct i2c_attach_args *ia = aux;
112 1.1 rkujawa
113 1.1 rkujawa sc->sc_dev = self;
114 1.1 rkujawa sc->sc_addr = ia->ia_addr;
115 1.1 rkujawa sc->sc_tag = ia->ia_tag;
116 1.1 rkujawa
117 1.1 rkujawa tps65217pmic_version(sc);
118 1.1 rkujawa
119 1.1 rkujawa aprint_normal(": TPS65217");
120 1.1 rkujawa switch (sc->sc_version) {
121 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_A:
122 1.1 rkujawa aprint_normal("A");
123 1.1 rkujawa break;
124 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_B:
125 1.1 rkujawa aprint_normal("B");
126 1.1 rkujawa break;
127 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_C:
128 1.1 rkujawa aprint_normal("C");
129 1.1 rkujawa break;
130 1.1 rkujawa case TPS65217PMIC_CHIPID_VER_D:
131 1.1 rkujawa aprint_normal("D");
132 1.1 rkujawa break;
133 1.1 rkujawa default:
134 1.1 rkujawa /* unknown version */
135 1.1 rkujawa break;
136 1.1 rkujawa }
137 1.1 rkujawa
138 1.1 rkujawa aprint_normal(" Power Management Multi-Channel IC (rev 1.%d)\n",
139 1.1 rkujawa sc->sc_revision);
140 1.1 rkujawa
141 1.1 rkujawa tps65217pmic_print_status(sc);
142 1.1 rkujawa }
143 1.1 rkujawa
144 1.1 rkujawa /* Get version and revision of the chip. */
145 1.1 rkujawa static void
146 1.1 rkujawa tps65217pmic_version(struct tps65217pmic_softc *sc)
147 1.1 rkujawa {
148 1.1 rkujawa uint8_t chipid;
149 1.1 rkujawa
150 1.1 rkujawa chipid = tps65217pmic_reg_read(sc, TPS65217PMIC_CHIPID);
151 1.1 rkujawa
152 1.1 rkujawa sc->sc_version = chipid & TPS65217PMIC_CHIPID_VER_MASK;
153 1.1 rkujawa sc->sc_revision = chipid & TPS65217PMIC_CHIPID_REV_MASK;
154 1.1 rkujawa }
155 1.1 rkujawa
156 1.1 rkujawa static uint16_t
157 1.1 rkujawa tps65217pmic_ppath_max_ac_current(uint8_t ppath)
158 1.1 rkujawa {
159 1.1 rkujawa switch ((ppath & TPS65217PMIC_PPATH_IAC) >>
160 1.1 rkujawa TPS65217PMIC_PPATH_IAC_RSHFIT) {
161 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_100MA:
162 1.1 rkujawa return 100;
163 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_500MA:
164 1.1 rkujawa return 300;
165 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_1300MA:
166 1.1 rkujawa return 1300;
167 1.1 rkujawa case TPS65217PMIC_PPATH_IAC_2500MA:
168 1.1 rkujawa return 2500;
169 1.1 rkujawa }
170 1.1 rkujawa return 0;
171 1.1 rkujawa }
172 1.1 rkujawa
173 1.1 rkujawa static uint16_t
174 1.1 rkujawa tps65217pmic_ppath_max_usb_current(uint8_t ppath)
175 1.1 rkujawa {
176 1.1 rkujawa switch (ppath & TPS65217PMIC_PPATH_IUSB) {
177 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_100MA:
178 1.1 rkujawa return 100;
179 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_500MA:
180 1.1 rkujawa return 300;
181 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1300MA:
182 1.1 rkujawa return 1300;
183 1.1 rkujawa case TPS65217PMIC_PPATH_IUSB_1800MA:
184 1.1 rkujawa return 1800;
185 1.1 rkujawa }
186 1.1 rkujawa return 0;
187 1.1 rkujawa }
188 1.1 rkujawa
189 1.1 rkujawa static uint16_t
190 1.1 rkujawa tps65217pmic_regulator_voltage(struct tps65217pmic_softc *sc, uint8_t regulator)
191 1.1 rkujawa {
192 1.1 rkujawa uint8_t defreg;
193 1.1 rkujawa
194 1.1 rkujawa switch (regulator) {
195 1.1 rkujawa case TPS65217PMIC_LDO1:
196 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO1);
197 1.1 rkujawa return ldo1voltages[defreg];
198 1.1 rkujawa case TPS65217PMIC_LDO2:
199 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO2);
200 1.1 rkujawa if (defreg & TPS65217PMIC_DEFLDO2_TRACKING)
201 1.1 rkujawa return tps65217pmic_regulator_voltage(sc,
202 1.1 rkujawa TPS65217PMIC_DCDC3);
203 1.1 rkujawa return ldo2voltages[defreg & TPS65217PMIC_DEFLDO2_VOLTAGE];
204 1.1 rkujawa case TPS65217PMIC_LDO3LS:
205 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO3);
206 1.1 rkujawa if (!(defreg & TPS65217PMIC_DEFLDOX_LS))
207 1.1 rkujawa return 0;
208 1.1 rkujawa return ldo3voltages[defreg & TPS65217PMIC_DEFLDO3_VOLTAGE];
209 1.1 rkujawa case TPS65217PMIC_LDO4LS:
210 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO4);
211 1.1 rkujawa if (!(defreg & TPS65217PMIC_DEFLDOX_LS))
212 1.1 rkujawa return 0;
213 1.1 rkujawa return ldo3voltages[defreg & TPS65217PMIC_DEFLDO4_VOLTAGE];
214 1.1 rkujawa case TPS65217PMIC_DCDC1:
215 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFDCDC1);
216 1.1 rkujawa /* if (defreg & TPS65217PMIC_DEFDCDCX_XADJ) XXX */
217 1.1 rkujawa return ldo2voltages[defreg & TPS65217PMIC_DEFDCDCX_VOLTAGE];
218 1.1 rkujawa case TPS65217PMIC_DCDC2:
219 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFDCDC2);
220 1.1 rkujawa /* if (defreg & TPS65217PMIC_DEFDCDCX_XADJ) XXX */
221 1.1 rkujawa return ldo2voltages[defreg & TPS65217PMIC_DEFDCDCX_VOLTAGE];
222 1.1 rkujawa case TPS65217PMIC_DCDC3:
223 1.1 rkujawa defreg = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFDCDC3);
224 1.1 rkujawa /* if (defreg & TPS65217PMIC_DEFDCDCX_XADJ) XXX */
225 1.1 rkujawa return ldo2voltages[defreg & TPS65217PMIC_DEFDCDCX_VOLTAGE];
226 1.1 rkujawa default:
227 1.1 rkujawa aprint_error_dev(sc->sc_dev, "unknown regulator %x", regulator);
228 1.1 rkujawa break;
229 1.1 rkujawa }
230 1.1 rkujawa
231 1.1 rkujawa return 0;
232 1.1 rkujawa }
233 1.1 rkujawa
234 1.1 rkujawa static void
235 1.1 rkujawa tps65217pmic_print_status(struct tps65217pmic_softc *sc)
236 1.1 rkujawa {
237 1.1 rkujawa uint8_t status, ppath, regenable;
238 1.1 rkujawa bool ldols;
239 1.1 rkujawa
240 1.1 rkujawa ppath = tps65217pmic_reg_read(sc, TPS65217PMIC_PPATH);
241 1.1 rkujawa status = tps65217pmic_reg_read(sc, TPS65217PMIC_STATUS);
242 1.1 rkujawa regenable = tps65217pmic_reg_read(sc, TPS65217PMIC_ENABLE);
243 1.1 rkujawa
244 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "power sources ");
245 1.1 rkujawa
246 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_USB_EN) {
247 1.1 rkujawa if (status & TPS65217PMIC_STATUS_USBPWR)
248 1.1 rkujawa aprint_normal("[USB] ");
249 1.1 rkujawa else
250 1.1 rkujawa aprint_normal("USB ");
251 1.1 rkujawa aprint_normal("max %d mA, ",
252 1.1 rkujawa tps65217pmic_ppath_max_usb_current(ppath));
253 1.1 rkujawa }
254 1.1 rkujawa
255 1.1 rkujawa if (ppath & TPS65217PMIC_PPATH_AC_EN) {
256 1.1 rkujawa if (status & TPS65217PMIC_STATUS_ACPWR)
257 1.1 rkujawa aprint_normal("[AC] ");
258 1.1 rkujawa else
259 1.1 rkujawa aprint_normal("AC ");
260 1.1 rkujawa aprint_normal("max %d mA",
261 1.1 rkujawa tps65217pmic_ppath_max_ac_current(ppath));
262 1.1 rkujawa }
263 1.1 rkujawa
264 1.1 rkujawa aprint_normal("\n");
265 1.1 rkujawa
266 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "");
267 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_LDO1)
268 1.1 rkujawa aprint_normal("[LDO1: %d mV] ",
269 1.1 rkujawa tps65217pmic_regulator_voltage(sc, TPS65217PMIC_LDO1));
270 1.1 rkujawa
271 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_LDO2)
272 1.1 rkujawa aprint_normal("[LDO2: %d mV] ",
273 1.1 rkujawa tps65217pmic_regulator_voltage(sc, TPS65217PMIC_LDO2));
274 1.1 rkujawa
275 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_LDO3) {
276 1.1 rkujawa ldols = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO3) &
277 1.1 rkujawa TPS65217PMIC_DEFLDOX_LS;
278 1.1 rkujawa if (!ldols)
279 1.1 rkujawa aprint_normal("[LDO3: LS] ");
280 1.1 rkujawa else
281 1.1 rkujawa aprint_normal("[LDO3: %d mV] ",
282 1.1 rkujawa tps65217pmic_regulator_voltage(sc,
283 1.1 rkujawa TPS65217PMIC_LDO3LS));
284 1.1 rkujawa }
285 1.1 rkujawa
286 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_LDO4) {
287 1.1 rkujawa ldols = tps65217pmic_reg_read(sc, TPS65217PMIC_DEFLDO4) &
288 1.1 rkujawa TPS65217PMIC_DEFLDOX_LS;
289 1.1 rkujawa if (!ldols)
290 1.1 rkujawa aprint_normal("[LDO4: LS]");
291 1.1 rkujawa else
292 1.1 rkujawa aprint_normal("[LDO4: %d mV] ",
293 1.1 rkujawa tps65217pmic_regulator_voltage(sc,
294 1.1 rkujawa TPS65217PMIC_LDO4LS));
295 1.1 rkujawa }
296 1.1 rkujawa
297 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_DCDC1)
298 1.1 rkujawa aprint_normal("[DCDC1: %d mV] ",
299 1.1 rkujawa tps65217pmic_regulator_voltage(sc, TPS65217PMIC_DCDC1));
300 1.1 rkujawa
301 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_DCDC2)
302 1.1 rkujawa aprint_normal("[DCDC2: %d mV] ",
303 1.1 rkujawa tps65217pmic_regulator_voltage(sc, TPS65217PMIC_DCDC2));
304 1.1 rkujawa
305 1.1 rkujawa if(regenable & TPS65217PMIC_ENABLE_DCDC3)
306 1.1 rkujawa aprint_normal("[DCDC3: %d mV] ",
307 1.1 rkujawa tps65217pmic_regulator_voltage(sc, TPS65217PMIC_DCDC3));
308 1.1 rkujawa
309 1.1 rkujawa aprint_normal("\n");
310 1.1 rkujawa }
311 1.1 rkujawa
312 1.1 rkujawa static uint8_t
313 1.1 rkujawa tps65217pmic_reg_read(struct tps65217pmic_softc *sc, uint8_t reg)
314 1.1 rkujawa {
315 1.1 rkujawa uint8_t wbuf[2];
316 1.1 rkujawa uint8_t rv;
317 1.1 rkujawa
318 1.1 rkujawa if (iic_acquire_bus(sc->sc_tag, I2C_F_POLL) != 0) {
319 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot acquire bus for read\n");
320 1.1 rkujawa return 0;
321 1.1 rkujawa }
322 1.1 rkujawa
323 1.1 rkujawa wbuf[0] = reg;
324 1.1 rkujawa
325 1.1 rkujawa if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, wbuf,
326 1.1 rkujawa 1, &rv, 1, I2C_F_POLL)) {
327 1.1 rkujawa aprint_error_dev(sc->sc_dev, "cannot execute operation\n");
328 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
329 1.1 rkujawa return 0;
330 1.1 rkujawa }
331 1.1 rkujawa iic_release_bus(sc->sc_tag, I2C_F_POLL);
332 1.1 rkujawa
333 1.1 rkujawa return rv;
334 1.1 rkujawa }
335 1.1 rkujawa
336