Home | History | Annotate | Line # | Download | only in i2c
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