ARC: [plat-hsdk]: unify memory apertures configuration
[linux-2.6-microblaze.git] / drivers / power / supply / bq24190_charger.c
1 /*
2  * Driver for the TI bq24190 battery charger.
3  *
4  * Author: Mark A. Greer <mgreer@animalcreek.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10
11 #include <linux/module.h>
12 #include <linux/interrupt.h>
13 #include <linux/delay.h>
14 #include <linux/of_irq.h>
15 #include <linux/of_device.h>
16 #include <linux/pm_runtime.h>
17 #include <linux/power_supply.h>
18 #include <linux/power/bq24190_charger.h>
19 #include <linux/regulator/driver.h>
20 #include <linux/regulator/machine.h>
21 #include <linux/workqueue.h>
22 #include <linux/gpio.h>
23 #include <linux/i2c.h>
24 #include <linux/extcon-provider.h>
25
26 #define BQ24190_MANUFACTURER    "Texas Instruments"
27
28 #define BQ24190_REG_ISC         0x00 /* Input Source Control */
29 #define BQ24190_REG_ISC_EN_HIZ_MASK             BIT(7)
30 #define BQ24190_REG_ISC_EN_HIZ_SHIFT            7
31 #define BQ24190_REG_ISC_VINDPM_MASK             (BIT(6) | BIT(5) | BIT(4) | \
32                                                  BIT(3))
33 #define BQ24190_REG_ISC_VINDPM_SHIFT            3
34 #define BQ24190_REG_ISC_IINLIM_MASK             (BIT(2) | BIT(1) | BIT(0))
35 #define BQ24190_REG_ISC_IINLIM_SHIFT            0
36
37 #define BQ24190_REG_POC         0x01 /* Power-On Configuration */
38 #define BQ24190_REG_POC_RESET_MASK              BIT(7)
39 #define BQ24190_REG_POC_RESET_SHIFT             7
40 #define BQ24190_REG_POC_WDT_RESET_MASK          BIT(6)
41 #define BQ24190_REG_POC_WDT_RESET_SHIFT         6
42 #define BQ24190_REG_POC_CHG_CONFIG_MASK         (BIT(5) | BIT(4))
43 #define BQ24190_REG_POC_CHG_CONFIG_SHIFT        4
44 #define BQ24190_REG_POC_CHG_CONFIG_DISABLE              0x0
45 #define BQ24190_REG_POC_CHG_CONFIG_CHARGE               0x1
46 #define BQ24190_REG_POC_CHG_CONFIG_OTG                  0x2
47 #define BQ24190_REG_POC_SYS_MIN_MASK            (BIT(3) | BIT(2) | BIT(1))
48 #define BQ24190_REG_POC_SYS_MIN_SHIFT           1
49 #define BQ24190_REG_POC_SYS_MIN_MIN                     3000
50 #define BQ24190_REG_POC_SYS_MIN_MAX                     3700
51 #define BQ24190_REG_POC_BOOST_LIM_MASK          BIT(0)
52 #define BQ24190_REG_POC_BOOST_LIM_SHIFT         0
53
54 #define BQ24190_REG_CCC         0x02 /* Charge Current Control */
55 #define BQ24190_REG_CCC_ICHG_MASK               (BIT(7) | BIT(6) | BIT(5) | \
56                                                  BIT(4) | BIT(3) | BIT(2))
57 #define BQ24190_REG_CCC_ICHG_SHIFT              2
58 #define BQ24190_REG_CCC_FORCE_20PCT_MASK        BIT(0)
59 #define BQ24190_REG_CCC_FORCE_20PCT_SHIFT       0
60
61 #define BQ24190_REG_PCTCC       0x03 /* Pre-charge/Termination Current Cntl */
62 #define BQ24190_REG_PCTCC_IPRECHG_MASK          (BIT(7) | BIT(6) | BIT(5) | \
63                                                  BIT(4))
64 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT         4
65 #define BQ24190_REG_PCTCC_IPRECHG_MIN                   128
66 #define BQ24190_REG_PCTCC_IPRECHG_MAX                   2048
67 #define BQ24190_REG_PCTCC_ITERM_MASK            (BIT(3) | BIT(2) | BIT(1) | \
68                                                  BIT(0))
69 #define BQ24190_REG_PCTCC_ITERM_SHIFT           0
70 #define BQ24190_REG_PCTCC_ITERM_MIN                     128
71 #define BQ24190_REG_PCTCC_ITERM_MAX                     2048
72
73 #define BQ24190_REG_CVC         0x04 /* Charge Voltage Control */
74 #define BQ24190_REG_CVC_VREG_MASK               (BIT(7) | BIT(6) | BIT(5) | \
75                                                  BIT(4) | BIT(3) | BIT(2))
76 #define BQ24190_REG_CVC_VREG_SHIFT              2
77 #define BQ24190_REG_CVC_BATLOWV_MASK            BIT(1)
78 #define BQ24190_REG_CVC_BATLOWV_SHIFT           1
79 #define BQ24190_REG_CVC_VRECHG_MASK             BIT(0)
80 #define BQ24190_REG_CVC_VRECHG_SHIFT            0
81
82 #define BQ24190_REG_CTTC        0x05 /* Charge Term/Timer Control */
83 #define BQ24190_REG_CTTC_EN_TERM_MASK           BIT(7)
84 #define BQ24190_REG_CTTC_EN_TERM_SHIFT          7
85 #define BQ24190_REG_CTTC_TERM_STAT_MASK         BIT(6)
86 #define BQ24190_REG_CTTC_TERM_STAT_SHIFT        6
87 #define BQ24190_REG_CTTC_WATCHDOG_MASK          (BIT(5) | BIT(4))
88 #define BQ24190_REG_CTTC_WATCHDOG_SHIFT         4
89 #define BQ24190_REG_CTTC_EN_TIMER_MASK          BIT(3)
90 #define BQ24190_REG_CTTC_EN_TIMER_SHIFT         3
91 #define BQ24190_REG_CTTC_CHG_TIMER_MASK         (BIT(2) | BIT(1))
92 #define BQ24190_REG_CTTC_CHG_TIMER_SHIFT        1
93 #define BQ24190_REG_CTTC_JEITA_ISET_MASK        BIT(0)
94 #define BQ24190_REG_CTTC_JEITA_ISET_SHIFT       0
95
96 #define BQ24190_REG_ICTRC       0x06 /* IR Comp/Thermal Regulation Control */
97 #define BQ24190_REG_ICTRC_BAT_COMP_MASK         (BIT(7) | BIT(6) | BIT(5))
98 #define BQ24190_REG_ICTRC_BAT_COMP_SHIFT        5
99 #define BQ24190_REG_ICTRC_VCLAMP_MASK           (BIT(4) | BIT(3) | BIT(2))
100 #define BQ24190_REG_ICTRC_VCLAMP_SHIFT          2
101 #define BQ24190_REG_ICTRC_TREG_MASK             (BIT(1) | BIT(0))
102 #define BQ24190_REG_ICTRC_TREG_SHIFT            0
103
104 #define BQ24190_REG_MOC         0x07 /* Misc. Operation Control */
105 #define BQ24190_REG_MOC_DPDM_EN_MASK            BIT(7)
106 #define BQ24190_REG_MOC_DPDM_EN_SHIFT           7
107 #define BQ24190_REG_MOC_TMR2X_EN_MASK           BIT(6)
108 #define BQ24190_REG_MOC_TMR2X_EN_SHIFT          6
109 #define BQ24190_REG_MOC_BATFET_DISABLE_MASK     BIT(5)
110 #define BQ24190_REG_MOC_BATFET_DISABLE_SHIFT    5
111 #define BQ24190_REG_MOC_JEITA_VSET_MASK         BIT(4)
112 #define BQ24190_REG_MOC_JEITA_VSET_SHIFT        4
113 #define BQ24190_REG_MOC_INT_MASK_MASK           (BIT(1) | BIT(0))
114 #define BQ24190_REG_MOC_INT_MASK_SHIFT          0
115
116 #define BQ24190_REG_SS          0x08 /* System Status */
117 #define BQ24190_REG_SS_VBUS_STAT_MASK           (BIT(7) | BIT(6))
118 #define BQ24190_REG_SS_VBUS_STAT_SHIFT          6
119 #define BQ24190_REG_SS_CHRG_STAT_MASK           (BIT(5) | BIT(4))
120 #define BQ24190_REG_SS_CHRG_STAT_SHIFT          4
121 #define BQ24190_REG_SS_DPM_STAT_MASK            BIT(3)
122 #define BQ24190_REG_SS_DPM_STAT_SHIFT           3
123 #define BQ24190_REG_SS_PG_STAT_MASK             BIT(2)
124 #define BQ24190_REG_SS_PG_STAT_SHIFT            2
125 #define BQ24190_REG_SS_THERM_STAT_MASK          BIT(1)
126 #define BQ24190_REG_SS_THERM_STAT_SHIFT         1
127 #define BQ24190_REG_SS_VSYS_STAT_MASK           BIT(0)
128 #define BQ24190_REG_SS_VSYS_STAT_SHIFT          0
129
130 #define BQ24190_REG_F           0x09 /* Fault */
131 #define BQ24190_REG_F_WATCHDOG_FAULT_MASK       BIT(7)
132 #define BQ24190_REG_F_WATCHDOG_FAULT_SHIFT      7
133 #define BQ24190_REG_F_BOOST_FAULT_MASK          BIT(6)
134 #define BQ24190_REG_F_BOOST_FAULT_SHIFT         6
135 #define BQ24190_REG_F_CHRG_FAULT_MASK           (BIT(5) | BIT(4))
136 #define BQ24190_REG_F_CHRG_FAULT_SHIFT          4
137 #define BQ24190_REG_F_BAT_FAULT_MASK            BIT(3)
138 #define BQ24190_REG_F_BAT_FAULT_SHIFT           3
139 #define BQ24190_REG_F_NTC_FAULT_MASK            (BIT(2) | BIT(1) | BIT(0))
140 #define BQ24190_REG_F_NTC_FAULT_SHIFT           0
141
142 #define BQ24190_REG_VPRS        0x0A /* Vendor/Part/Revision Status */
143 #define BQ24190_REG_VPRS_PN_MASK                (BIT(5) | BIT(4) | BIT(3))
144 #define BQ24190_REG_VPRS_PN_SHIFT               3
145 #define BQ24190_REG_VPRS_PN_24190                       0x4
146 #define BQ24190_REG_VPRS_PN_24192                       0x5 /* Also 24193, 24196 */
147 #define BQ24190_REG_VPRS_PN_24192I                      0x3
148 #define BQ24190_REG_VPRS_TS_PROFILE_MASK        BIT(2)
149 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT       2
150 #define BQ24190_REG_VPRS_DEV_REG_MASK           (BIT(1) | BIT(0))
151 #define BQ24190_REG_VPRS_DEV_REG_SHIFT          0
152
153 /*
154  * The FAULT register is latched by the bq24190 (except for NTC_FAULT)
155  * so the first read after a fault returns the latched value and subsequent
156  * reads return the current value.  In order to return the fault status
157  * to the user, have the interrupt handler save the reg's value and retrieve
158  * it in the appropriate health/status routine.
159  */
160 struct bq24190_dev_info {
161         struct i2c_client               *client;
162         struct device                   *dev;
163         struct extcon_dev               *edev;
164         struct power_supply             *charger;
165         struct power_supply             *battery;
166         struct delayed_work             input_current_limit_work;
167         char                            model_name[I2C_NAME_SIZE];
168         bool                            initialized;
169         bool                            irq_event;
170         u16                             sys_min;
171         u16                             iprechg;
172         u16                             iterm;
173         struct mutex                    f_reg_lock;
174         u8                              f_reg;
175         u8                              ss_reg;
176         u8                              watchdog;
177 };
178
179 static const unsigned int bq24190_usb_extcon_cable[] = {
180         EXTCON_USB,
181         EXTCON_NONE,
182 };
183
184 /*
185  * The tables below provide a 2-way mapping for the value that goes in
186  * the register field and the real-world value that it represents.
187  * The index of the array is the value that goes in the register; the
188  * number at that index in the array is the real-world value that it
189  * represents.
190  */
191
192 /* REG00[2:0] (IINLIM) in uAh */
193 static const int bq24190_isc_iinlim_values[] = {
194          100000,  150000,  500000,  900000, 1200000, 1500000, 2000000, 3000000
195 };
196
197 /* REG02[7:2] (ICHG) in uAh */
198 static const int bq24190_ccc_ichg_values[] = {
199          512000,  576000,  640000,  704000,  768000,  832000,  896000,  960000,
200         1024000, 1088000, 1152000, 1216000, 1280000, 1344000, 1408000, 1472000,
201         1536000, 1600000, 1664000, 1728000, 1792000, 1856000, 1920000, 1984000,
202         2048000, 2112000, 2176000, 2240000, 2304000, 2368000, 2432000, 2496000,
203         2560000, 2624000, 2688000, 2752000, 2816000, 2880000, 2944000, 3008000,
204         3072000, 3136000, 3200000, 3264000, 3328000, 3392000, 3456000, 3520000,
205         3584000, 3648000, 3712000, 3776000, 3840000, 3904000, 3968000, 4032000,
206         4096000, 4160000, 4224000, 4288000, 4352000, 4416000, 4480000, 4544000
207 };
208
209 /* REG04[7:2] (VREG) in uV */
210 static const int bq24190_cvc_vreg_values[] = {
211         3504000, 3520000, 3536000, 3552000, 3568000, 3584000, 3600000, 3616000,
212         3632000, 3648000, 3664000, 3680000, 3696000, 3712000, 3728000, 3744000,
213         3760000, 3776000, 3792000, 3808000, 3824000, 3840000, 3856000, 3872000,
214         3888000, 3904000, 3920000, 3936000, 3952000, 3968000, 3984000, 4000000,
215         4016000, 4032000, 4048000, 4064000, 4080000, 4096000, 4112000, 4128000,
216         4144000, 4160000, 4176000, 4192000, 4208000, 4224000, 4240000, 4256000,
217         4272000, 4288000, 4304000, 4320000, 4336000, 4352000, 4368000, 4384000,
218         4400000
219 };
220
221 /* REG06[1:0] (TREG) in tenths of degrees Celsius */
222 static const int bq24190_ictrc_treg_values[] = {
223         600, 800, 1000, 1200
224 };
225
226 /*
227  * Return the index in 'tbl' of greatest value that is less than or equal to
228  * 'val'.  The index range returned is 0 to 'tbl_size' - 1.  Assumes that
229  * the values in 'tbl' are sorted from smallest to largest and 'tbl_size'
230  * is less than 2^8.
231  */
232 static u8 bq24190_find_idx(const int tbl[], int tbl_size, int v)
233 {
234         int i;
235
236         for (i = 1; i < tbl_size; i++)
237                 if (v < tbl[i])
238                         break;
239
240         return i - 1;
241 }
242
243 /* Basic driver I/O routines */
244
245 static int bq24190_read(struct bq24190_dev_info *bdi, u8 reg, u8 *data)
246 {
247         int ret;
248
249         ret = i2c_smbus_read_byte_data(bdi->client, reg);
250         if (ret < 0)
251                 return ret;
252
253         *data = ret;
254         return 0;
255 }
256
257 static int bq24190_write(struct bq24190_dev_info *bdi, u8 reg, u8 data)
258 {
259         return i2c_smbus_write_byte_data(bdi->client, reg, data);
260 }
261
262 static int bq24190_read_mask(struct bq24190_dev_info *bdi, u8 reg,
263                 u8 mask, u8 shift, u8 *data)
264 {
265         u8 v;
266         int ret;
267
268         ret = bq24190_read(bdi, reg, &v);
269         if (ret < 0)
270                 return ret;
271
272         v &= mask;
273         v >>= shift;
274         *data = v;
275
276         return 0;
277 }
278
279 static int bq24190_write_mask(struct bq24190_dev_info *bdi, u8 reg,
280                 u8 mask, u8 shift, u8 data)
281 {
282         u8 v;
283         int ret;
284
285         ret = bq24190_read(bdi, reg, &v);
286         if (ret < 0)
287                 return ret;
288
289         v &= ~mask;
290         v |= ((data << shift) & mask);
291
292         return bq24190_write(bdi, reg, v);
293 }
294
295 static int bq24190_get_field_val(struct bq24190_dev_info *bdi,
296                 u8 reg, u8 mask, u8 shift,
297                 const int tbl[], int tbl_size,
298                 int *val)
299 {
300         u8 v;
301         int ret;
302
303         ret = bq24190_read_mask(bdi, reg, mask, shift, &v);
304         if (ret < 0)
305                 return ret;
306
307         v = (v >= tbl_size) ? (tbl_size - 1) : v;
308         *val = tbl[v];
309
310         return 0;
311 }
312
313 static int bq24190_set_field_val(struct bq24190_dev_info *bdi,
314                 u8 reg, u8 mask, u8 shift,
315                 const int tbl[], int tbl_size,
316                 int val)
317 {
318         u8 idx;
319
320         idx = bq24190_find_idx(tbl, tbl_size, val);
321
322         return bq24190_write_mask(bdi, reg, mask, shift, idx);
323 }
324
325 #ifdef CONFIG_SYSFS
326 /*
327  * There are a numerous options that are configurable on the bq24190
328  * that go well beyond what the power_supply properties provide access to.
329  * Provide sysfs access to them so they can be examined and possibly modified
330  * on the fly.  They will be provided for the charger power_supply object only
331  * and will be prefixed by 'f_' to make them easier to recognize.
332  */
333
334 #define BQ24190_SYSFS_FIELD(_name, r, f, m, store)                      \
335 {                                                                       \
336         .attr   = __ATTR(f_##_name, m, bq24190_sysfs_show, store),      \
337         .reg    = BQ24190_REG_##r,                                      \
338         .mask   = BQ24190_REG_##r##_##f##_MASK,                         \
339         .shift  = BQ24190_REG_##r##_##f##_SHIFT,                        \
340 }
341
342 #define BQ24190_SYSFS_FIELD_RW(_name, r, f)                             \
343                 BQ24190_SYSFS_FIELD(_name, r, f, S_IWUSR | S_IRUGO,     \
344                                 bq24190_sysfs_store)
345
346 #define BQ24190_SYSFS_FIELD_RO(_name, r, f)                             \
347                 BQ24190_SYSFS_FIELD(_name, r, f, S_IRUGO, NULL)
348
349 static ssize_t bq24190_sysfs_show(struct device *dev,
350                 struct device_attribute *attr, char *buf);
351 static ssize_t bq24190_sysfs_store(struct device *dev,
352                 struct device_attribute *attr, const char *buf, size_t count);
353
354 struct bq24190_sysfs_field_info {
355         struct device_attribute attr;
356         u8      reg;
357         u8      mask;
358         u8      shift;
359 };
360
361 /* On i386 ptrace-abi.h defines SS that breaks the macro calls below. */
362 #undef SS
363
364 static struct bq24190_sysfs_field_info bq24190_sysfs_field_tbl[] = {
365                         /*      sysfs name      reg     field in reg */
366         BQ24190_SYSFS_FIELD_RW(en_hiz,          ISC,    EN_HIZ),
367         BQ24190_SYSFS_FIELD_RW(vindpm,          ISC,    VINDPM),
368         BQ24190_SYSFS_FIELD_RW(iinlim,          ISC,    IINLIM),
369         BQ24190_SYSFS_FIELD_RW(chg_config,      POC,    CHG_CONFIG),
370         BQ24190_SYSFS_FIELD_RW(sys_min,         POC,    SYS_MIN),
371         BQ24190_SYSFS_FIELD_RW(boost_lim,       POC,    BOOST_LIM),
372         BQ24190_SYSFS_FIELD_RW(ichg,            CCC,    ICHG),
373         BQ24190_SYSFS_FIELD_RW(force_20_pct,    CCC,    FORCE_20PCT),
374         BQ24190_SYSFS_FIELD_RW(iprechg,         PCTCC,  IPRECHG),
375         BQ24190_SYSFS_FIELD_RW(iterm,           PCTCC,  ITERM),
376         BQ24190_SYSFS_FIELD_RW(vreg,            CVC,    VREG),
377         BQ24190_SYSFS_FIELD_RW(batlowv,         CVC,    BATLOWV),
378         BQ24190_SYSFS_FIELD_RW(vrechg,          CVC,    VRECHG),
379         BQ24190_SYSFS_FIELD_RW(en_term,         CTTC,   EN_TERM),
380         BQ24190_SYSFS_FIELD_RW(term_stat,       CTTC,   TERM_STAT),
381         BQ24190_SYSFS_FIELD_RO(watchdog,        CTTC,   WATCHDOG),
382         BQ24190_SYSFS_FIELD_RW(en_timer,        CTTC,   EN_TIMER),
383         BQ24190_SYSFS_FIELD_RW(chg_timer,       CTTC,   CHG_TIMER),
384         BQ24190_SYSFS_FIELD_RW(jeta_iset,       CTTC,   JEITA_ISET),
385         BQ24190_SYSFS_FIELD_RW(bat_comp,        ICTRC,  BAT_COMP),
386         BQ24190_SYSFS_FIELD_RW(vclamp,          ICTRC,  VCLAMP),
387         BQ24190_SYSFS_FIELD_RW(treg,            ICTRC,  TREG),
388         BQ24190_SYSFS_FIELD_RW(dpdm_en,         MOC,    DPDM_EN),
389         BQ24190_SYSFS_FIELD_RW(tmr2x_en,        MOC,    TMR2X_EN),
390         BQ24190_SYSFS_FIELD_RW(batfet_disable,  MOC,    BATFET_DISABLE),
391         BQ24190_SYSFS_FIELD_RW(jeita_vset,      MOC,    JEITA_VSET),
392         BQ24190_SYSFS_FIELD_RO(int_mask,        MOC,    INT_MASK),
393         BQ24190_SYSFS_FIELD_RO(vbus_stat,       SS,     VBUS_STAT),
394         BQ24190_SYSFS_FIELD_RO(chrg_stat,       SS,     CHRG_STAT),
395         BQ24190_SYSFS_FIELD_RO(dpm_stat,        SS,     DPM_STAT),
396         BQ24190_SYSFS_FIELD_RO(pg_stat,         SS,     PG_STAT),
397         BQ24190_SYSFS_FIELD_RO(therm_stat,      SS,     THERM_STAT),
398         BQ24190_SYSFS_FIELD_RO(vsys_stat,       SS,     VSYS_STAT),
399         BQ24190_SYSFS_FIELD_RO(watchdog_fault,  F,      WATCHDOG_FAULT),
400         BQ24190_SYSFS_FIELD_RO(boost_fault,     F,      BOOST_FAULT),
401         BQ24190_SYSFS_FIELD_RO(chrg_fault,      F,      CHRG_FAULT),
402         BQ24190_SYSFS_FIELD_RO(bat_fault,       F,      BAT_FAULT),
403         BQ24190_SYSFS_FIELD_RO(ntc_fault,       F,      NTC_FAULT),
404         BQ24190_SYSFS_FIELD_RO(pn,              VPRS,   PN),
405         BQ24190_SYSFS_FIELD_RO(ts_profile,      VPRS,   TS_PROFILE),
406         BQ24190_SYSFS_FIELD_RO(dev_reg,         VPRS,   DEV_REG),
407 };
408
409 static struct attribute *
410         bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1];
411
412 ATTRIBUTE_GROUPS(bq24190_sysfs);
413
414 static void bq24190_sysfs_init_attrs(void)
415 {
416         int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
417
418         for (i = 0; i < limit; i++)
419                 bq24190_sysfs_attrs[i] = &bq24190_sysfs_field_tbl[i].attr.attr;
420
421         bq24190_sysfs_attrs[limit] = NULL; /* Has additional entry for this */
422 }
423
424 static struct bq24190_sysfs_field_info *bq24190_sysfs_field_lookup(
425                 const char *name)
426 {
427         int i, limit = ARRAY_SIZE(bq24190_sysfs_field_tbl);
428
429         for (i = 0; i < limit; i++)
430                 if (!strcmp(name, bq24190_sysfs_field_tbl[i].attr.attr.name))
431                         break;
432
433         if (i >= limit)
434                 return NULL;
435
436         return &bq24190_sysfs_field_tbl[i];
437 }
438
439 static ssize_t bq24190_sysfs_show(struct device *dev,
440                 struct device_attribute *attr, char *buf)
441 {
442         struct power_supply *psy = dev_get_drvdata(dev);
443         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
444         struct bq24190_sysfs_field_info *info;
445         ssize_t count;
446         int ret;
447         u8 v;
448
449         info = bq24190_sysfs_field_lookup(attr->attr.name);
450         if (!info)
451                 return -EINVAL;
452
453         ret = pm_runtime_get_sync(bdi->dev);
454         if (ret < 0)
455                 return ret;
456
457         ret = bq24190_read_mask(bdi, info->reg, info->mask, info->shift, &v);
458         if (ret)
459                 count = ret;
460         else
461                 count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v);
462
463         pm_runtime_mark_last_busy(bdi->dev);
464         pm_runtime_put_autosuspend(bdi->dev);
465
466         return count;
467 }
468
469 static ssize_t bq24190_sysfs_store(struct device *dev,
470                 struct device_attribute *attr, const char *buf, size_t count)
471 {
472         struct power_supply *psy = dev_get_drvdata(dev);
473         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
474         struct bq24190_sysfs_field_info *info;
475         int ret;
476         u8 v;
477
478         info = bq24190_sysfs_field_lookup(attr->attr.name);
479         if (!info)
480                 return -EINVAL;
481
482         ret = kstrtou8(buf, 0, &v);
483         if (ret < 0)
484                 return ret;
485
486         ret = pm_runtime_get_sync(bdi->dev);
487         if (ret < 0)
488                 return ret;
489
490         ret = bq24190_write_mask(bdi, info->reg, info->mask, info->shift, v);
491         if (ret)
492                 count = ret;
493
494         pm_runtime_mark_last_busy(bdi->dev);
495         pm_runtime_put_autosuspend(bdi->dev);
496
497         return count;
498 }
499 #endif
500
501 #ifdef CONFIG_REGULATOR
502 static int bq24190_set_charge_mode(struct regulator_dev *dev, u8 val)
503 {
504         struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
505         int ret;
506
507         ret = pm_runtime_get_sync(bdi->dev);
508         if (ret < 0) {
509                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
510                 pm_runtime_put_noidle(bdi->dev);
511                 return ret;
512         }
513
514         ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
515                                  BQ24190_REG_POC_CHG_CONFIG_MASK,
516                                  BQ24190_REG_POC_CHG_CONFIG_SHIFT, val);
517
518         pm_runtime_mark_last_busy(bdi->dev);
519         pm_runtime_put_autosuspend(bdi->dev);
520
521         return ret;
522 }
523
524 static int bq24190_vbus_enable(struct regulator_dev *dev)
525 {
526         return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_OTG);
527 }
528
529 static int bq24190_vbus_disable(struct regulator_dev *dev)
530 {
531         return bq24190_set_charge_mode(dev, BQ24190_REG_POC_CHG_CONFIG_CHARGE);
532 }
533
534 static int bq24190_vbus_is_enabled(struct regulator_dev *dev)
535 {
536         struct bq24190_dev_info *bdi = rdev_get_drvdata(dev);
537         int ret;
538         u8 val;
539
540         ret = pm_runtime_get_sync(bdi->dev);
541         if (ret < 0) {
542                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", ret);
543                 pm_runtime_put_noidle(bdi->dev);
544                 return ret;
545         }
546
547         ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
548                                 BQ24190_REG_POC_CHG_CONFIG_MASK,
549                                 BQ24190_REG_POC_CHG_CONFIG_SHIFT, &val);
550
551         pm_runtime_mark_last_busy(bdi->dev);
552         pm_runtime_put_autosuspend(bdi->dev);
553
554         return ret ? ret : val == BQ24190_REG_POC_CHG_CONFIG_OTG;
555 }
556
557 static const struct regulator_ops bq24190_vbus_ops = {
558         .enable = bq24190_vbus_enable,
559         .disable = bq24190_vbus_disable,
560         .is_enabled = bq24190_vbus_is_enabled,
561 };
562
563 static const struct regulator_desc bq24190_vbus_desc = {
564         .name = "usb_otg_vbus",
565         .of_match = "usb-otg-vbus",
566         .type = REGULATOR_VOLTAGE,
567         .owner = THIS_MODULE,
568         .ops = &bq24190_vbus_ops,
569         .fixed_uV = 5000000,
570         .n_voltages = 1,
571 };
572
573 static const struct regulator_init_data bq24190_vbus_init_data = {
574         .constraints = {
575                 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
576         },
577 };
578
579 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
580 {
581         struct bq24190_platform_data *pdata = bdi->dev->platform_data;
582         struct regulator_config cfg = { };
583         struct regulator_dev *reg;
584         int ret = 0;
585
586         cfg.dev = bdi->dev;
587         if (pdata && pdata->regulator_init_data)
588                 cfg.init_data = pdata->regulator_init_data;
589         else
590                 cfg.init_data = &bq24190_vbus_init_data;
591         cfg.driver_data = bdi;
592         reg = devm_regulator_register(bdi->dev, &bq24190_vbus_desc, &cfg);
593         if (IS_ERR(reg)) {
594                 ret = PTR_ERR(reg);
595                 dev_err(bdi->dev, "Can't register regulator: %d\n", ret);
596         }
597
598         return ret;
599 }
600 #else
601 static int bq24190_register_vbus_regulator(struct bq24190_dev_info *bdi)
602 {
603         return 0;
604 }
605 #endif
606
607 static int bq24190_set_config(struct bq24190_dev_info *bdi)
608 {
609         int ret;
610         u8 v;
611
612         ret = bq24190_read(bdi, BQ24190_REG_CTTC, &v);
613         if (ret < 0)
614                 return ret;
615
616         bdi->watchdog = ((v & BQ24190_REG_CTTC_WATCHDOG_MASK) >>
617                                         BQ24190_REG_CTTC_WATCHDOG_SHIFT);
618
619         /*
620          * According to the "Host Mode and default Mode" section of the
621          * manual, a write to any register causes the bq24190 to switch
622          * from default mode to host mode.  It will switch back to default
623          * mode after a WDT timeout unless the WDT is turned off as well.
624          * So, by simply turning off the WDT, we accomplish both with the
625          * same write.
626          */
627         v &= ~BQ24190_REG_CTTC_WATCHDOG_MASK;
628
629         ret = bq24190_write(bdi, BQ24190_REG_CTTC, v);
630         if (ret < 0)
631                 return ret;
632
633         if (bdi->sys_min) {
634                 v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
635                 ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
636                                          BQ24190_REG_POC_SYS_MIN_MASK,
637                                          BQ24190_REG_POC_SYS_MIN_SHIFT,
638                                          v);
639                 if (ret < 0)
640                         return ret;
641         }
642
643         if (bdi->iprechg) {
644                 v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11
645                 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
646                                          BQ24190_REG_PCTCC_IPRECHG_MASK,
647                                          BQ24190_REG_PCTCC_IPRECHG_SHIFT,
648                                          v);
649                 if (ret < 0)
650                         return ret;
651         }
652
653         if (bdi->iterm) {
654                 v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11
655                 ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC,
656                                          BQ24190_REG_PCTCC_ITERM_MASK,
657                                          BQ24190_REG_PCTCC_ITERM_SHIFT,
658                                          v);
659                 if (ret < 0)
660                         return ret;
661         }
662
663         return 0;
664 }
665
666 static int bq24190_register_reset(struct bq24190_dev_info *bdi)
667 {
668         int ret, limit = 100;
669         u8 v;
670
671         /*
672          * This prop. can be passed on device instantiation from platform code:
673          * struct property_entry pe[] =
674          *   { PROPERTY_ENTRY_BOOL("disable-reset"), ... };
675          * struct i2c_board_info bi =
676          *   { .type = "bq24190", .addr = 0x6b, .properties = pe, .irq = irq };
677          * struct i2c_adapter ad = { ... };
678          * i2c_add_adapter(&ad);
679          * i2c_new_device(&ad, &bi);
680          */
681         if (device_property_read_bool(bdi->dev, "disable-reset"))
682                 return 0;
683
684         /* Reset the registers */
685         ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
686                         BQ24190_REG_POC_RESET_MASK,
687                         BQ24190_REG_POC_RESET_SHIFT,
688                         0x1);
689         if (ret < 0)
690                 return ret;
691
692         /* Reset bit will be cleared by hardware so poll until it is */
693         do {
694                 ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
695                                 BQ24190_REG_POC_RESET_MASK,
696                                 BQ24190_REG_POC_RESET_SHIFT,
697                                 &v);
698                 if (ret < 0)
699                         return ret;
700
701                 if (v == 0)
702                         return 0;
703
704                 usleep_range(100, 200);
705         } while (--limit);
706
707         return -EIO;
708 }
709
710 /* Charger power supply property routines */
711
712 static int bq24190_charger_get_charge_type(struct bq24190_dev_info *bdi,
713                 union power_supply_propval *val)
714 {
715         u8 v;
716         int type, ret;
717
718         ret = bq24190_read_mask(bdi, BQ24190_REG_POC,
719                         BQ24190_REG_POC_CHG_CONFIG_MASK,
720                         BQ24190_REG_POC_CHG_CONFIG_SHIFT,
721                         &v);
722         if (ret < 0)
723                 return ret;
724
725         /* If POC[CHG_CONFIG] (REG01[5:4]) == 0, charge is disabled */
726         if (!v) {
727                 type = POWER_SUPPLY_CHARGE_TYPE_NONE;
728         } else {
729                 ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
730                                 BQ24190_REG_CCC_FORCE_20PCT_MASK,
731                                 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
732                                 &v);
733                 if (ret < 0)
734                         return ret;
735
736                 type = (v) ? POWER_SUPPLY_CHARGE_TYPE_TRICKLE :
737                              POWER_SUPPLY_CHARGE_TYPE_FAST;
738         }
739
740         val->intval = type;
741
742         return 0;
743 }
744
745 static int bq24190_charger_set_charge_type(struct bq24190_dev_info *bdi,
746                 const union power_supply_propval *val)
747 {
748         u8 chg_config, force_20pct, en_term;
749         int ret;
750
751         /*
752          * According to the "Termination when REG02[0] = 1" section of
753          * the bq24190 manual, the trickle charge could be less than the
754          * termination current so it recommends turning off the termination
755          * function.
756          *
757          * Note: AFAICT from the datasheet, the user will have to manually
758          * turn off the charging when in 20% mode.  If its not turned off,
759          * there could be battery damage.  So, use this mode at your own risk.
760          */
761         switch (val->intval) {
762         case POWER_SUPPLY_CHARGE_TYPE_NONE:
763                 chg_config = 0x0;
764                 break;
765         case POWER_SUPPLY_CHARGE_TYPE_TRICKLE:
766                 chg_config = 0x1;
767                 force_20pct = 0x1;
768                 en_term = 0x0;
769                 break;
770         case POWER_SUPPLY_CHARGE_TYPE_FAST:
771                 chg_config = 0x1;
772                 force_20pct = 0x0;
773                 en_term = 0x1;
774                 break;
775         default:
776                 return -EINVAL;
777         }
778
779         if (chg_config) { /* Enabling the charger */
780                 ret = bq24190_write_mask(bdi, BQ24190_REG_CCC,
781                                 BQ24190_REG_CCC_FORCE_20PCT_MASK,
782                                 BQ24190_REG_CCC_FORCE_20PCT_SHIFT,
783                                 force_20pct);
784                 if (ret < 0)
785                         return ret;
786
787                 ret = bq24190_write_mask(bdi, BQ24190_REG_CTTC,
788                                 BQ24190_REG_CTTC_EN_TERM_MASK,
789                                 BQ24190_REG_CTTC_EN_TERM_SHIFT,
790                                 en_term);
791                 if (ret < 0)
792                         return ret;
793         }
794
795         return bq24190_write_mask(bdi, BQ24190_REG_POC,
796                         BQ24190_REG_POC_CHG_CONFIG_MASK,
797                         BQ24190_REG_POC_CHG_CONFIG_SHIFT, chg_config);
798 }
799
800 static int bq24190_charger_get_health(struct bq24190_dev_info *bdi,
801                 union power_supply_propval *val)
802 {
803         u8 v;
804         int health;
805
806         mutex_lock(&bdi->f_reg_lock);
807         v = bdi->f_reg;
808         mutex_unlock(&bdi->f_reg_lock);
809
810         if (v & BQ24190_REG_F_NTC_FAULT_MASK) {
811                 switch (v >> BQ24190_REG_F_NTC_FAULT_SHIFT & 0x7) {
812                 case 0x1: /* TS1  Cold */
813                 case 0x3: /* TS2  Cold */
814                 case 0x5: /* Both Cold */
815                         health = POWER_SUPPLY_HEALTH_COLD;
816                         break;
817                 case 0x2: /* TS1  Hot */
818                 case 0x4: /* TS2  Hot */
819                 case 0x6: /* Both Hot */
820                         health = POWER_SUPPLY_HEALTH_OVERHEAT;
821                         break;
822                 default:
823                         health = POWER_SUPPLY_HEALTH_UNKNOWN;
824                 }
825         } else if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
826                 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
827         } else if (v & BQ24190_REG_F_CHRG_FAULT_MASK) {
828                 switch (v >> BQ24190_REG_F_CHRG_FAULT_SHIFT & 0x3) {
829                 case 0x1: /* Input Fault (VBUS OVP or VBAT<VBUS<3.8V) */
830                         /*
831                          * This could be over-voltage or under-voltage
832                          * and there's no way to tell which.  Instead
833                          * of looking foolish and returning 'OVERVOLTAGE'
834                          * when its really under-voltage, just return
835                          * 'UNSPEC_FAILURE'.
836                          */
837                         health = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
838                         break;
839                 case 0x2: /* Thermal Shutdown */
840                         health = POWER_SUPPLY_HEALTH_OVERHEAT;
841                         break;
842                 case 0x3: /* Charge Safety Timer Expiration */
843                         health = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
844                         break;
845                 default:  /* prevent compiler warning */
846                         health = -1;
847                 }
848         } else if (v & BQ24190_REG_F_BOOST_FAULT_MASK) {
849                 /*
850                  * This could be over-current or over-voltage but there's
851                  * no way to tell which.  Return 'OVERVOLTAGE' since there
852                  * isn't an 'OVERCURRENT' value defined that we can return
853                  * even if it was over-current.
854                  */
855                 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
856         } else {
857                 health = POWER_SUPPLY_HEALTH_GOOD;
858         }
859
860         val->intval = health;
861
862         return 0;
863 }
864
865 static int bq24190_charger_get_online(struct bq24190_dev_info *bdi,
866                 union power_supply_propval *val)
867 {
868         u8 pg_stat, batfet_disable;
869         int ret;
870
871         ret = bq24190_read_mask(bdi, BQ24190_REG_SS,
872                         BQ24190_REG_SS_PG_STAT_MASK,
873                         BQ24190_REG_SS_PG_STAT_SHIFT, &pg_stat);
874         if (ret < 0)
875                 return ret;
876
877         ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
878                         BQ24190_REG_MOC_BATFET_DISABLE_MASK,
879                         BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
880         if (ret < 0)
881                 return ret;
882
883         val->intval = pg_stat && !batfet_disable;
884
885         return 0;
886 }
887
888 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
889                                       const union power_supply_propval *val);
890 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
891                                       union power_supply_propval *val);
892 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
893                                               union power_supply_propval *val);
894 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
895                                               const union power_supply_propval *val);
896
897 static int bq24190_charger_set_online(struct bq24190_dev_info *bdi,
898                                       const union power_supply_propval *val)
899 {
900         return bq24190_battery_set_online(bdi, val);
901 }
902
903 static int bq24190_charger_get_status(struct bq24190_dev_info *bdi,
904                                       union power_supply_propval *val)
905 {
906         return bq24190_battery_get_status(bdi, val);
907 }
908
909 static int bq24190_charger_get_temp_alert_max(struct bq24190_dev_info *bdi,
910                                               union power_supply_propval *val)
911 {
912         return bq24190_battery_get_temp_alert_max(bdi, val);
913 }
914
915 static int bq24190_charger_set_temp_alert_max(struct bq24190_dev_info *bdi,
916                                               const union power_supply_propval *val)
917 {
918         return bq24190_battery_set_temp_alert_max(bdi, val);
919 }
920
921 static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi,
922                 union power_supply_propval *val)
923 {
924         u8 v;
925         int ret;
926
927         ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
928                         BQ24190_REG_PCTCC_IPRECHG_MASK,
929                         BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v);
930         if (ret < 0)
931                 return ret;
932
933         val->intval = ++v * 128 * 1000;
934         return 0;
935 }
936
937 static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi,
938                 union power_supply_propval *val)
939 {
940         u8 v;
941         int ret;
942
943         ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC,
944                         BQ24190_REG_PCTCC_ITERM_MASK,
945                         BQ24190_REG_PCTCC_ITERM_SHIFT, &v);
946         if (ret < 0)
947                 return ret;
948
949         val->intval = ++v * 128 * 1000;
950         return 0;
951 }
952
953 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi,
954                 union power_supply_propval *val)
955 {
956         u8 v;
957         int curr, ret;
958
959         ret = bq24190_get_field_val(bdi, BQ24190_REG_CCC,
960                         BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
961                         bq24190_ccc_ichg_values,
962                         ARRAY_SIZE(bq24190_ccc_ichg_values), &curr);
963         if (ret < 0)
964                 return ret;
965
966         ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
967                         BQ24190_REG_CCC_FORCE_20PCT_MASK,
968                         BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
969         if (ret < 0)
970                 return ret;
971
972         /* If FORCE_20PCT is enabled, then current is 20% of ICHG value */
973         if (v)
974                 curr /= 5;
975
976         val->intval = curr;
977         return 0;
978 }
979
980 static int bq24190_charger_get_current_max(struct bq24190_dev_info *bdi,
981                 union power_supply_propval *val)
982 {
983         int idx = ARRAY_SIZE(bq24190_ccc_ichg_values) - 1;
984
985         val->intval = bq24190_ccc_ichg_values[idx];
986         return 0;
987 }
988
989 static int bq24190_charger_set_current(struct bq24190_dev_info *bdi,
990                 const union power_supply_propval *val)
991 {
992         u8 v;
993         int ret, curr = val->intval;
994
995         ret = bq24190_read_mask(bdi, BQ24190_REG_CCC,
996                         BQ24190_REG_CCC_FORCE_20PCT_MASK,
997                         BQ24190_REG_CCC_FORCE_20PCT_SHIFT, &v);
998         if (ret < 0)
999                 return ret;
1000
1001         /* If FORCE_20PCT is enabled, have to multiply value passed in by 5 */
1002         if (v)
1003                 curr *= 5;
1004
1005         return bq24190_set_field_val(bdi, BQ24190_REG_CCC,
1006                         BQ24190_REG_CCC_ICHG_MASK, BQ24190_REG_CCC_ICHG_SHIFT,
1007                         bq24190_ccc_ichg_values,
1008                         ARRAY_SIZE(bq24190_ccc_ichg_values), curr);
1009 }
1010
1011 static int bq24190_charger_get_voltage(struct bq24190_dev_info *bdi,
1012                 union power_supply_propval *val)
1013 {
1014         int voltage, ret;
1015
1016         ret = bq24190_get_field_val(bdi, BQ24190_REG_CVC,
1017                         BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1018                         bq24190_cvc_vreg_values,
1019                         ARRAY_SIZE(bq24190_cvc_vreg_values), &voltage);
1020         if (ret < 0)
1021                 return ret;
1022
1023         val->intval = voltage;
1024         return 0;
1025 }
1026
1027 static int bq24190_charger_get_voltage_max(struct bq24190_dev_info *bdi,
1028                 union power_supply_propval *val)
1029 {
1030         int idx = ARRAY_SIZE(bq24190_cvc_vreg_values) - 1;
1031
1032         val->intval = bq24190_cvc_vreg_values[idx];
1033         return 0;
1034 }
1035
1036 static int bq24190_charger_set_voltage(struct bq24190_dev_info *bdi,
1037                 const union power_supply_propval *val)
1038 {
1039         return bq24190_set_field_val(bdi, BQ24190_REG_CVC,
1040                         BQ24190_REG_CVC_VREG_MASK, BQ24190_REG_CVC_VREG_SHIFT,
1041                         bq24190_cvc_vreg_values,
1042                         ARRAY_SIZE(bq24190_cvc_vreg_values), val->intval);
1043 }
1044
1045 static int bq24190_charger_get_iinlimit(struct bq24190_dev_info *bdi,
1046                 union power_supply_propval *val)
1047 {
1048         int iinlimit, ret;
1049
1050         ret = bq24190_get_field_val(bdi, BQ24190_REG_ISC,
1051                         BQ24190_REG_ISC_IINLIM_MASK,
1052                         BQ24190_REG_ISC_IINLIM_SHIFT,
1053                         bq24190_isc_iinlim_values,
1054                         ARRAY_SIZE(bq24190_isc_iinlim_values), &iinlimit);
1055         if (ret < 0)
1056                 return ret;
1057
1058         val->intval = iinlimit;
1059         return 0;
1060 }
1061
1062 static int bq24190_charger_set_iinlimit(struct bq24190_dev_info *bdi,
1063                 const union power_supply_propval *val)
1064 {
1065         return bq24190_set_field_val(bdi, BQ24190_REG_ISC,
1066                         BQ24190_REG_ISC_IINLIM_MASK,
1067                         BQ24190_REG_ISC_IINLIM_SHIFT,
1068                         bq24190_isc_iinlim_values,
1069                         ARRAY_SIZE(bq24190_isc_iinlim_values), val->intval);
1070 }
1071
1072 static int bq24190_charger_get_property(struct power_supply *psy,
1073                 enum power_supply_property psp, union power_supply_propval *val)
1074 {
1075         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1076         int ret;
1077
1078         dev_dbg(bdi->dev, "prop: %d\n", psp);
1079
1080         ret = pm_runtime_get_sync(bdi->dev);
1081         if (ret < 0)
1082                 return ret;
1083
1084         switch (psp) {
1085         case POWER_SUPPLY_PROP_CHARGE_TYPE:
1086                 ret = bq24190_charger_get_charge_type(bdi, val);
1087                 break;
1088         case POWER_SUPPLY_PROP_HEALTH:
1089                 ret = bq24190_charger_get_health(bdi, val);
1090                 break;
1091         case POWER_SUPPLY_PROP_ONLINE:
1092                 ret = bq24190_charger_get_online(bdi, val);
1093                 break;
1094         case POWER_SUPPLY_PROP_STATUS:
1095                 ret = bq24190_charger_get_status(bdi, val);
1096                 break;
1097         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1098                 ret =  bq24190_charger_get_temp_alert_max(bdi, val);
1099                 break;
1100         case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
1101                 ret = bq24190_charger_get_precharge(bdi, val);
1102                 break;
1103         case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
1104                 ret = bq24190_charger_get_charge_term(bdi, val);
1105                 break;
1106         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1107                 ret = bq24190_charger_get_current(bdi, val);
1108                 break;
1109         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
1110                 ret = bq24190_charger_get_current_max(bdi, val);
1111                 break;
1112         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1113                 ret = bq24190_charger_get_voltage(bdi, val);
1114                 break;
1115         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
1116                 ret = bq24190_charger_get_voltage_max(bdi, val);
1117                 break;
1118         case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1119                 ret = bq24190_charger_get_iinlimit(bdi, val);
1120                 break;
1121         case POWER_SUPPLY_PROP_SCOPE:
1122                 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1123                 ret = 0;
1124                 break;
1125         case POWER_SUPPLY_PROP_MODEL_NAME:
1126                 val->strval = bdi->model_name;
1127                 ret = 0;
1128                 break;
1129         case POWER_SUPPLY_PROP_MANUFACTURER:
1130                 val->strval = BQ24190_MANUFACTURER;
1131                 ret = 0;
1132                 break;
1133         default:
1134                 ret = -ENODATA;
1135         }
1136
1137         pm_runtime_mark_last_busy(bdi->dev);
1138         pm_runtime_put_autosuspend(bdi->dev);
1139
1140         return ret;
1141 }
1142
1143 static int bq24190_charger_set_property(struct power_supply *psy,
1144                 enum power_supply_property psp,
1145                 const union power_supply_propval *val)
1146 {
1147         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1148         int ret;
1149
1150         dev_dbg(bdi->dev, "prop: %d\n", psp);
1151
1152         ret = pm_runtime_get_sync(bdi->dev);
1153         if (ret < 0)
1154                 return ret;
1155
1156         switch (psp) {
1157         case POWER_SUPPLY_PROP_ONLINE:
1158                 ret = bq24190_charger_set_online(bdi, val);
1159                 break;
1160         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1161                 ret = bq24190_charger_set_temp_alert_max(bdi, val);
1162                 break;
1163         case POWER_SUPPLY_PROP_CHARGE_TYPE:
1164                 ret = bq24190_charger_set_charge_type(bdi, val);
1165                 break;
1166         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1167                 ret = bq24190_charger_set_current(bdi, val);
1168                 break;
1169         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1170                 ret = bq24190_charger_set_voltage(bdi, val);
1171                 break;
1172         case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1173                 ret = bq24190_charger_set_iinlimit(bdi, val);
1174                 break;
1175         default:
1176                 ret = -EINVAL;
1177         }
1178
1179         pm_runtime_mark_last_busy(bdi->dev);
1180         pm_runtime_put_autosuspend(bdi->dev);
1181
1182         return ret;
1183 }
1184
1185 static int bq24190_charger_property_is_writeable(struct power_supply *psy,
1186                 enum power_supply_property psp)
1187 {
1188         switch (psp) {
1189         case POWER_SUPPLY_PROP_ONLINE:
1190         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1191         case POWER_SUPPLY_PROP_CHARGE_TYPE:
1192         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
1193         case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
1194         case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
1195                 return 1;
1196         default:
1197                 return 0;
1198         }
1199 }
1200
1201 static void bq24190_input_current_limit_work(struct work_struct *work)
1202 {
1203         struct bq24190_dev_info *bdi =
1204                 container_of(work, struct bq24190_dev_info,
1205                              input_current_limit_work.work);
1206
1207         power_supply_set_input_current_limit_from_supplier(bdi->charger);
1208 }
1209
1210 /* Sync the input-current-limit with our parent supply (if we have one) */
1211 static void bq24190_charger_external_power_changed(struct power_supply *psy)
1212 {
1213         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1214
1215         /*
1216          * The Power-Good detection may take up to 220ms, sometimes
1217          * the external charger detection is quicker, and the bq24190 will
1218          * reset to iinlim based on its own charger detection (which is not
1219          * hooked up when using external charger detection) resulting in a
1220          * too low default 500mA iinlim. Delay setting the input-current-limit
1221          * for 300ms to avoid this.
1222          */
1223         queue_delayed_work(system_wq, &bdi->input_current_limit_work,
1224                            msecs_to_jiffies(300));
1225 }
1226
1227 static enum power_supply_property bq24190_charger_properties[] = {
1228         POWER_SUPPLY_PROP_CHARGE_TYPE,
1229         POWER_SUPPLY_PROP_HEALTH,
1230         POWER_SUPPLY_PROP_ONLINE,
1231         POWER_SUPPLY_PROP_STATUS,
1232         POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1233         POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
1234         POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
1235         POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
1236         POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
1237         POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
1238         POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
1239         POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
1240         POWER_SUPPLY_PROP_SCOPE,
1241         POWER_SUPPLY_PROP_MODEL_NAME,
1242         POWER_SUPPLY_PROP_MANUFACTURER,
1243 };
1244
1245 static char *bq24190_charger_supplied_to[] = {
1246         "main-battery",
1247 };
1248
1249 static const struct power_supply_desc bq24190_charger_desc = {
1250         .name                   = "bq24190-charger",
1251         .type                   = POWER_SUPPLY_TYPE_USB,
1252         .properties             = bq24190_charger_properties,
1253         .num_properties         = ARRAY_SIZE(bq24190_charger_properties),
1254         .get_property           = bq24190_charger_get_property,
1255         .set_property           = bq24190_charger_set_property,
1256         .property_is_writeable  = bq24190_charger_property_is_writeable,
1257         .external_power_changed = bq24190_charger_external_power_changed,
1258 };
1259
1260 /* Battery power supply property routines */
1261
1262 static int bq24190_battery_get_status(struct bq24190_dev_info *bdi,
1263                 union power_supply_propval *val)
1264 {
1265         u8 ss_reg, chrg_fault;
1266         int status, ret;
1267
1268         mutex_lock(&bdi->f_reg_lock);
1269         chrg_fault = bdi->f_reg;
1270         mutex_unlock(&bdi->f_reg_lock);
1271
1272         chrg_fault &= BQ24190_REG_F_CHRG_FAULT_MASK;
1273         chrg_fault >>= BQ24190_REG_F_CHRG_FAULT_SHIFT;
1274
1275         ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1276         if (ret < 0)
1277                 return ret;
1278
1279         /*
1280          * The battery must be discharging when any of these are true:
1281          * - there is no good power source;
1282          * - there is a charge fault.
1283          * Could also be discharging when in "supplement mode" but
1284          * there is no way to tell when its in that mode.
1285          */
1286         if (!(ss_reg & BQ24190_REG_SS_PG_STAT_MASK) || chrg_fault) {
1287                 status = POWER_SUPPLY_STATUS_DISCHARGING;
1288         } else {
1289                 ss_reg &= BQ24190_REG_SS_CHRG_STAT_MASK;
1290                 ss_reg >>= BQ24190_REG_SS_CHRG_STAT_SHIFT;
1291
1292                 switch (ss_reg) {
1293                 case 0x0: /* Not Charging */
1294                         status = POWER_SUPPLY_STATUS_NOT_CHARGING;
1295                         break;
1296                 case 0x1: /* Pre-charge */
1297                 case 0x2: /* Fast Charging */
1298                         status = POWER_SUPPLY_STATUS_CHARGING;
1299                         break;
1300                 case 0x3: /* Charge Termination Done */
1301                         status = POWER_SUPPLY_STATUS_FULL;
1302                         break;
1303                 default:
1304                         ret = -EIO;
1305                 }
1306         }
1307
1308         if (!ret)
1309                 val->intval = status;
1310
1311         return ret;
1312 }
1313
1314 static int bq24190_battery_get_health(struct bq24190_dev_info *bdi,
1315                 union power_supply_propval *val)
1316 {
1317         u8 v;
1318         int health;
1319
1320         mutex_lock(&bdi->f_reg_lock);
1321         v = bdi->f_reg;
1322         mutex_unlock(&bdi->f_reg_lock);
1323
1324         if (v & BQ24190_REG_F_BAT_FAULT_MASK) {
1325                 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
1326         } else {
1327                 v &= BQ24190_REG_F_NTC_FAULT_MASK;
1328                 v >>= BQ24190_REG_F_NTC_FAULT_SHIFT;
1329
1330                 switch (v) {
1331                 case 0x0: /* Normal */
1332                         health = POWER_SUPPLY_HEALTH_GOOD;
1333                         break;
1334                 case 0x1: /* TS1 Cold */
1335                 case 0x3: /* TS2 Cold */
1336                 case 0x5: /* Both Cold */
1337                         health = POWER_SUPPLY_HEALTH_COLD;
1338                         break;
1339                 case 0x2: /* TS1 Hot */
1340                 case 0x4: /* TS2 Hot */
1341                 case 0x6: /* Both Hot */
1342                         health = POWER_SUPPLY_HEALTH_OVERHEAT;
1343                         break;
1344                 default:
1345                         health = POWER_SUPPLY_HEALTH_UNKNOWN;
1346                 }
1347         }
1348
1349         val->intval = health;
1350         return 0;
1351 }
1352
1353 static int bq24190_battery_get_online(struct bq24190_dev_info *bdi,
1354                 union power_supply_propval *val)
1355 {
1356         u8 batfet_disable;
1357         int ret;
1358
1359         ret = bq24190_read_mask(bdi, BQ24190_REG_MOC,
1360                         BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1361                         BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, &batfet_disable);
1362         if (ret < 0)
1363                 return ret;
1364
1365         val->intval = !batfet_disable;
1366         return 0;
1367 }
1368
1369 static int bq24190_battery_set_online(struct bq24190_dev_info *bdi,
1370                 const union power_supply_propval *val)
1371 {
1372         return bq24190_write_mask(bdi, BQ24190_REG_MOC,
1373                         BQ24190_REG_MOC_BATFET_DISABLE_MASK,
1374                         BQ24190_REG_MOC_BATFET_DISABLE_SHIFT, !val->intval);
1375 }
1376
1377 static int bq24190_battery_get_temp_alert_max(struct bq24190_dev_info *bdi,
1378                 union power_supply_propval *val)
1379 {
1380         int temp, ret;
1381
1382         ret = bq24190_get_field_val(bdi, BQ24190_REG_ICTRC,
1383                         BQ24190_REG_ICTRC_TREG_MASK,
1384                         BQ24190_REG_ICTRC_TREG_SHIFT,
1385                         bq24190_ictrc_treg_values,
1386                         ARRAY_SIZE(bq24190_ictrc_treg_values), &temp);
1387         if (ret < 0)
1388                 return ret;
1389
1390         val->intval = temp;
1391         return 0;
1392 }
1393
1394 static int bq24190_battery_set_temp_alert_max(struct bq24190_dev_info *bdi,
1395                 const union power_supply_propval *val)
1396 {
1397         return bq24190_set_field_val(bdi, BQ24190_REG_ICTRC,
1398                         BQ24190_REG_ICTRC_TREG_MASK,
1399                         BQ24190_REG_ICTRC_TREG_SHIFT,
1400                         bq24190_ictrc_treg_values,
1401                         ARRAY_SIZE(bq24190_ictrc_treg_values), val->intval);
1402 }
1403
1404 static int bq24190_battery_get_property(struct power_supply *psy,
1405                 enum power_supply_property psp, union power_supply_propval *val)
1406 {
1407         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1408         int ret;
1409
1410         dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1411         dev_dbg(bdi->dev, "prop: %d\n", psp);
1412
1413         ret = pm_runtime_get_sync(bdi->dev);
1414         if (ret < 0)
1415                 return ret;
1416
1417         switch (psp) {
1418         case POWER_SUPPLY_PROP_STATUS:
1419                 ret = bq24190_battery_get_status(bdi, val);
1420                 break;
1421         case POWER_SUPPLY_PROP_HEALTH:
1422                 ret = bq24190_battery_get_health(bdi, val);
1423                 break;
1424         case POWER_SUPPLY_PROP_ONLINE:
1425                 ret = bq24190_battery_get_online(bdi, val);
1426                 break;
1427         case POWER_SUPPLY_PROP_TECHNOLOGY:
1428                 /* Could be Li-on or Li-polymer but no way to tell which */
1429                 val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
1430                 ret = 0;
1431                 break;
1432         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1433                 ret = bq24190_battery_get_temp_alert_max(bdi, val);
1434                 break;
1435         case POWER_SUPPLY_PROP_SCOPE:
1436                 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
1437                 ret = 0;
1438                 break;
1439         default:
1440                 ret = -ENODATA;
1441         }
1442
1443         pm_runtime_mark_last_busy(bdi->dev);
1444         pm_runtime_put_autosuspend(bdi->dev);
1445
1446         return ret;
1447 }
1448
1449 static int bq24190_battery_set_property(struct power_supply *psy,
1450                 enum power_supply_property psp,
1451                 const union power_supply_propval *val)
1452 {
1453         struct bq24190_dev_info *bdi = power_supply_get_drvdata(psy);
1454         int ret;
1455
1456         dev_warn(bdi->dev, "warning: /sys/class/power_supply/bq24190-battery is deprecated\n");
1457         dev_dbg(bdi->dev, "prop: %d\n", psp);
1458
1459         ret = pm_runtime_get_sync(bdi->dev);
1460         if (ret < 0)
1461                 return ret;
1462
1463         switch (psp) {
1464         case POWER_SUPPLY_PROP_ONLINE:
1465                 ret = bq24190_battery_set_online(bdi, val);
1466                 break;
1467         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1468                 ret = bq24190_battery_set_temp_alert_max(bdi, val);
1469                 break;
1470         default:
1471                 ret = -EINVAL;
1472         }
1473
1474         pm_runtime_mark_last_busy(bdi->dev);
1475         pm_runtime_put_autosuspend(bdi->dev);
1476
1477         return ret;
1478 }
1479
1480 static int bq24190_battery_property_is_writeable(struct power_supply *psy,
1481                 enum power_supply_property psp)
1482 {
1483         int ret;
1484
1485         switch (psp) {
1486         case POWER_SUPPLY_PROP_ONLINE:
1487         case POWER_SUPPLY_PROP_TEMP_ALERT_MAX:
1488                 ret = 1;
1489                 break;
1490         default:
1491                 ret = 0;
1492         }
1493
1494         return ret;
1495 }
1496
1497 static enum power_supply_property bq24190_battery_properties[] = {
1498         POWER_SUPPLY_PROP_STATUS,
1499         POWER_SUPPLY_PROP_HEALTH,
1500         POWER_SUPPLY_PROP_ONLINE,
1501         POWER_SUPPLY_PROP_TECHNOLOGY,
1502         POWER_SUPPLY_PROP_TEMP_ALERT_MAX,
1503         POWER_SUPPLY_PROP_SCOPE,
1504 };
1505
1506 static const struct power_supply_desc bq24190_battery_desc = {
1507         .name                   = "bq24190-battery",
1508         .type                   = POWER_SUPPLY_TYPE_BATTERY,
1509         .properties             = bq24190_battery_properties,
1510         .num_properties         = ARRAY_SIZE(bq24190_battery_properties),
1511         .get_property           = bq24190_battery_get_property,
1512         .set_property           = bq24190_battery_set_property,
1513         .property_is_writeable  = bq24190_battery_property_is_writeable,
1514 };
1515
1516 static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg)
1517 {
1518         bool otg_enabled;
1519         int ret;
1520
1521         otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK);
1522         ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled);
1523         if (ret < 0)
1524                 dev_err(bdi->dev, "Can't set extcon state to %d: %d\n",
1525                         otg_enabled, ret);
1526
1527         return ret;
1528 }
1529
1530 static void bq24190_check_status(struct bq24190_dev_info *bdi)
1531 {
1532         const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK;
1533         const u8 battery_mask_f = BQ24190_REG_F_BAT_FAULT_MASK
1534                                 | BQ24190_REG_F_NTC_FAULT_MASK;
1535         bool alert_charger = false, alert_battery = false;
1536         u8 ss_reg = 0, f_reg = 0;
1537         int i, ret;
1538
1539         ret = bq24190_read(bdi, BQ24190_REG_SS, &ss_reg);
1540         if (ret < 0) {
1541                 dev_err(bdi->dev, "Can't read SS reg: %d\n", ret);
1542                 return;
1543         }
1544
1545         i = 0;
1546         do {
1547                 ret = bq24190_read(bdi, BQ24190_REG_F, &f_reg);
1548                 if (ret < 0) {
1549                         dev_err(bdi->dev, "Can't read F reg: %d\n", ret);
1550                         return;
1551                 }
1552         } while (f_reg && ++i < 2);
1553
1554         /* ignore over/under voltage fault after disconnect */
1555         if (f_reg == (1 << BQ24190_REG_F_CHRG_FAULT_SHIFT) &&
1556             !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK))
1557                 f_reg = 0;
1558
1559         if (f_reg != bdi->f_reg) {
1560                 dev_warn(bdi->dev,
1561                         "Fault: boost %d, charge %d, battery %d, ntc %d\n",
1562                         !!(f_reg & BQ24190_REG_F_BOOST_FAULT_MASK),
1563                         !!(f_reg & BQ24190_REG_F_CHRG_FAULT_MASK),
1564                         !!(f_reg & BQ24190_REG_F_BAT_FAULT_MASK),
1565                         !!(f_reg & BQ24190_REG_F_NTC_FAULT_MASK));
1566
1567                 mutex_lock(&bdi->f_reg_lock);
1568                 if ((bdi->f_reg & battery_mask_f) != (f_reg & battery_mask_f))
1569                         alert_battery = true;
1570                 if ((bdi->f_reg & ~battery_mask_f) != (f_reg & ~battery_mask_f))
1571                         alert_charger = true;
1572                 bdi->f_reg = f_reg;
1573                 mutex_unlock(&bdi->f_reg_lock);
1574         }
1575
1576         if (ss_reg != bdi->ss_reg) {
1577                 /*
1578                  * The device is in host mode so when PG_STAT goes from 1->0
1579                  * (i.e., power removed) HIZ needs to be disabled.
1580                  */
1581                 if ((bdi->ss_reg & BQ24190_REG_SS_PG_STAT_MASK) &&
1582                                 !(ss_reg & BQ24190_REG_SS_PG_STAT_MASK)) {
1583                         ret = bq24190_write_mask(bdi, BQ24190_REG_ISC,
1584                                         BQ24190_REG_ISC_EN_HIZ_MASK,
1585                                         BQ24190_REG_ISC_EN_HIZ_SHIFT,
1586                                         0);
1587                         if (ret < 0)
1588                                 dev_err(bdi->dev, "Can't access ISC reg: %d\n",
1589                                         ret);
1590                 }
1591
1592                 if ((bdi->ss_reg & battery_mask_ss) != (ss_reg & battery_mask_ss))
1593                         alert_battery = true;
1594                 if ((bdi->ss_reg & ~battery_mask_ss) != (ss_reg & ~battery_mask_ss))
1595                         alert_charger = true;
1596                 bdi->ss_reg = ss_reg;
1597         }
1598
1599         if (alert_charger || alert_battery) {
1600                 power_supply_changed(bdi->charger);
1601                 bq24190_configure_usb_otg(bdi, ss_reg);
1602         }
1603         if (alert_battery && bdi->battery)
1604                 power_supply_changed(bdi->battery);
1605
1606         dev_dbg(bdi->dev, "ss_reg: 0x%02x, f_reg: 0x%02x\n", ss_reg, f_reg);
1607 }
1608
1609 static irqreturn_t bq24190_irq_handler_thread(int irq, void *data)
1610 {
1611         struct bq24190_dev_info *bdi = data;
1612         int error;
1613
1614         bdi->irq_event = true;
1615         error = pm_runtime_get_sync(bdi->dev);
1616         if (error < 0) {
1617                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1618                 pm_runtime_put_noidle(bdi->dev);
1619                 return IRQ_NONE;
1620         }
1621         bq24190_check_status(bdi);
1622         pm_runtime_mark_last_busy(bdi->dev);
1623         pm_runtime_put_autosuspend(bdi->dev);
1624         bdi->irq_event = false;
1625
1626         return IRQ_HANDLED;
1627 }
1628
1629 static int bq24190_hw_init(struct bq24190_dev_info *bdi)
1630 {
1631         u8 v;
1632         int ret;
1633
1634         /* First check that the device really is what its supposed to be */
1635         ret = bq24190_read_mask(bdi, BQ24190_REG_VPRS,
1636                         BQ24190_REG_VPRS_PN_MASK,
1637                         BQ24190_REG_VPRS_PN_SHIFT,
1638                         &v);
1639         if (ret < 0)
1640                 return ret;
1641
1642         switch (v) {
1643         case BQ24190_REG_VPRS_PN_24190:
1644         case BQ24190_REG_VPRS_PN_24192:
1645         case BQ24190_REG_VPRS_PN_24192I:
1646                 break;
1647         default:
1648                 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v);
1649                 return -ENODEV;
1650         }
1651
1652         ret = bq24190_register_reset(bdi);
1653         if (ret < 0)
1654                 return ret;
1655
1656         ret = bq24190_set_config(bdi);
1657         if (ret < 0)
1658                 return ret;
1659
1660         return bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1661 }
1662
1663 static int bq24190_get_config(struct bq24190_dev_info *bdi)
1664 {
1665         const char * const s = "ti,system-minimum-microvolt";
1666         struct power_supply_battery_info info = {};
1667         int v;
1668
1669         if (device_property_read_u32(bdi->dev, s, &v) == 0) {
1670                 v /= 1000;
1671                 if (v >= BQ24190_REG_POC_SYS_MIN_MIN
1672                  && v <= BQ24190_REG_POC_SYS_MIN_MAX)
1673                         bdi->sys_min = v;
1674                 else
1675                         dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
1676         }
1677
1678         if (bdi->dev->of_node &&
1679             !power_supply_get_battery_info(bdi->charger, &info)) {
1680                 v = info.precharge_current_ua / 1000;
1681                 if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN
1682                  && v <= BQ24190_REG_PCTCC_IPRECHG_MAX)
1683                         bdi->iprechg = v;
1684                 else
1685                         dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n",
1686                                  v);
1687
1688                 v = info.charge_term_current_ua / 1000;
1689                 if (v >= BQ24190_REG_PCTCC_ITERM_MIN
1690                  && v <= BQ24190_REG_PCTCC_ITERM_MAX)
1691                         bdi->iterm = v;
1692                 else
1693                         dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n",
1694                                  v);
1695         }
1696
1697         return 0;
1698 }
1699
1700 static int bq24190_probe(struct i2c_client *client,
1701                 const struct i2c_device_id *id)
1702 {
1703         struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1704         struct device *dev = &client->dev;
1705         struct power_supply_config charger_cfg = {}, battery_cfg = {};
1706         struct bq24190_dev_info *bdi;
1707         int ret;
1708
1709         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
1710                 dev_err(dev, "No support for SMBUS_BYTE_DATA\n");
1711                 return -ENODEV;
1712         }
1713
1714         bdi = devm_kzalloc(dev, sizeof(*bdi), GFP_KERNEL);
1715         if (!bdi) {
1716                 dev_err(dev, "Can't alloc bdi struct\n");
1717                 return -ENOMEM;
1718         }
1719
1720         bdi->client = client;
1721         bdi->dev = dev;
1722         strncpy(bdi->model_name, id->name, I2C_NAME_SIZE);
1723         mutex_init(&bdi->f_reg_lock);
1724         bdi->f_reg = 0;
1725         bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1726         INIT_DELAYED_WORK(&bdi->input_current_limit_work,
1727                           bq24190_input_current_limit_work);
1728
1729         i2c_set_clientdata(client, bdi);
1730
1731         if (client->irq <= 0) {
1732                 dev_err(dev, "Can't get irq info\n");
1733                 return -EINVAL;
1734         }
1735
1736         bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable);
1737         if (IS_ERR(bdi->edev))
1738                 return PTR_ERR(bdi->edev);
1739
1740         ret = devm_extcon_dev_register(dev, bdi->edev);
1741         if (ret < 0)
1742                 return ret;
1743
1744         pm_runtime_enable(dev);
1745         pm_runtime_use_autosuspend(dev);
1746         pm_runtime_set_autosuspend_delay(dev, 600);
1747         ret = pm_runtime_get_sync(dev);
1748         if (ret < 0) {
1749                 dev_err(dev, "pm_runtime_get failed: %i\n", ret);
1750                 goto out_pmrt;
1751         }
1752
1753 #ifdef CONFIG_SYSFS
1754         bq24190_sysfs_init_attrs();
1755         charger_cfg.attr_grp = bq24190_sysfs_groups;
1756 #endif
1757
1758         charger_cfg.drv_data = bdi;
1759         charger_cfg.of_node = dev->of_node;
1760         charger_cfg.supplied_to = bq24190_charger_supplied_to;
1761         charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to),
1762         bdi->charger = power_supply_register(dev, &bq24190_charger_desc,
1763                                                 &charger_cfg);
1764         if (IS_ERR(bdi->charger)) {
1765                 dev_err(dev, "Can't register charger\n");
1766                 ret = PTR_ERR(bdi->charger);
1767                 goto out_pmrt;
1768         }
1769
1770         /* the battery class is deprecated and will be removed. */
1771         /* in the interim, this property hides it.              */
1772         if (!device_property_read_bool(dev, "omit-battery-class")) {
1773                 battery_cfg.drv_data = bdi;
1774                 bdi->battery = power_supply_register(dev, &bq24190_battery_desc,
1775                                                      &battery_cfg);
1776                 if (IS_ERR(bdi->battery)) {
1777                         dev_err(dev, "Can't register battery\n");
1778                         ret = PTR_ERR(bdi->battery);
1779                         goto out_charger;
1780                 }
1781         }
1782
1783         ret = bq24190_get_config(bdi);
1784         if (ret < 0) {
1785                 dev_err(dev, "Can't get devicetree config\n");
1786                 goto out_charger;
1787         }
1788
1789         ret = bq24190_hw_init(bdi);
1790         if (ret < 0) {
1791                 dev_err(dev, "Hardware init failed\n");
1792                 goto out_charger;
1793         }
1794
1795         ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg);
1796         if (ret < 0)
1797                 goto out_charger;
1798
1799         bdi->initialized = true;
1800
1801         ret = devm_request_threaded_irq(dev, client->irq, NULL,
1802                         bq24190_irq_handler_thread,
1803                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1804                         "bq24190-charger", bdi);
1805         if (ret < 0) {
1806                 dev_err(dev, "Can't set up irq handler\n");
1807                 goto out_charger;
1808         }
1809
1810         ret = bq24190_register_vbus_regulator(bdi);
1811         if (ret < 0)
1812                 goto out_charger;
1813
1814         enable_irq_wake(client->irq);
1815
1816         pm_runtime_mark_last_busy(dev);
1817         pm_runtime_put_autosuspend(dev);
1818
1819         return 0;
1820
1821 out_charger:
1822         if (!IS_ERR_OR_NULL(bdi->battery))
1823                 power_supply_unregister(bdi->battery);
1824         power_supply_unregister(bdi->charger);
1825
1826 out_pmrt:
1827         pm_runtime_put_sync(dev);
1828         pm_runtime_dont_use_autosuspend(dev);
1829         pm_runtime_disable(dev);
1830         return ret;
1831 }
1832
1833 static int bq24190_remove(struct i2c_client *client)
1834 {
1835         struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1836         int error;
1837
1838         error = pm_runtime_get_sync(bdi->dev);
1839         if (error < 0) {
1840                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1841                 pm_runtime_put_noidle(bdi->dev);
1842         }
1843
1844         bq24190_register_reset(bdi);
1845         if (bdi->battery)
1846                 power_supply_unregister(bdi->battery);
1847         power_supply_unregister(bdi->charger);
1848         if (error >= 0)
1849                 pm_runtime_put_sync(bdi->dev);
1850         pm_runtime_dont_use_autosuspend(bdi->dev);
1851         pm_runtime_disable(bdi->dev);
1852
1853         return 0;
1854 }
1855
1856 static __maybe_unused int bq24190_runtime_suspend(struct device *dev)
1857 {
1858         struct i2c_client *client = to_i2c_client(dev);
1859         struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1860
1861         if (!bdi->initialized)
1862                 return 0;
1863
1864         dev_dbg(bdi->dev, "%s\n", __func__);
1865
1866         return 0;
1867 }
1868
1869 static __maybe_unused int bq24190_runtime_resume(struct device *dev)
1870 {
1871         struct i2c_client *client = to_i2c_client(dev);
1872         struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1873
1874         if (!bdi->initialized)
1875                 return 0;
1876
1877         if (!bdi->irq_event) {
1878                 dev_dbg(bdi->dev, "checking events on possible wakeirq\n");
1879                 bq24190_check_status(bdi);
1880         }
1881
1882         return 0;
1883 }
1884
1885 static __maybe_unused int bq24190_pm_suspend(struct device *dev)
1886 {
1887         struct i2c_client *client = to_i2c_client(dev);
1888         struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1889         int error;
1890
1891         error = pm_runtime_get_sync(bdi->dev);
1892         if (error < 0) {
1893                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1894                 pm_runtime_put_noidle(bdi->dev);
1895         }
1896
1897         bq24190_register_reset(bdi);
1898
1899         if (error >= 0) {
1900                 pm_runtime_mark_last_busy(bdi->dev);
1901                 pm_runtime_put_autosuspend(bdi->dev);
1902         }
1903
1904         return 0;
1905 }
1906
1907 static __maybe_unused int bq24190_pm_resume(struct device *dev)
1908 {
1909         struct i2c_client *client = to_i2c_client(dev);
1910         struct bq24190_dev_info *bdi = i2c_get_clientdata(client);
1911         int error;
1912
1913         bdi->f_reg = 0;
1914         bdi->ss_reg = BQ24190_REG_SS_VBUS_STAT_MASK; /* impossible state */
1915
1916         error = pm_runtime_get_sync(bdi->dev);
1917         if (error < 0) {
1918                 dev_warn(bdi->dev, "pm_runtime_get failed: %i\n", error);
1919                 pm_runtime_put_noidle(bdi->dev);
1920         }
1921
1922         bq24190_register_reset(bdi);
1923         bq24190_set_config(bdi);
1924         bq24190_read(bdi, BQ24190_REG_SS, &bdi->ss_reg);
1925
1926         if (error >= 0) {
1927                 pm_runtime_mark_last_busy(bdi->dev);
1928                 pm_runtime_put_autosuspend(bdi->dev);
1929         }
1930
1931         /* Things may have changed while suspended so alert upper layer */
1932         power_supply_changed(bdi->charger);
1933         if (bdi->battery)
1934                 power_supply_changed(bdi->battery);
1935
1936         return 0;
1937 }
1938
1939 static const struct dev_pm_ops bq24190_pm_ops = {
1940         SET_RUNTIME_PM_OPS(bq24190_runtime_suspend, bq24190_runtime_resume,
1941                            NULL)
1942         SET_SYSTEM_SLEEP_PM_OPS(bq24190_pm_suspend, bq24190_pm_resume)
1943 };
1944
1945 static const struct i2c_device_id bq24190_i2c_ids[] = {
1946         { "bq24190" },
1947         { "bq24192" },
1948         { "bq24192i" },
1949         { "bq24196" },
1950         { },
1951 };
1952 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids);
1953
1954 #ifdef CONFIG_OF
1955 static const struct of_device_id bq24190_of_match[] = {
1956         { .compatible = "ti,bq24190", },
1957         { .compatible = "ti,bq24192", },
1958         { .compatible = "ti,bq24192i", },
1959         { .compatible = "ti,bq24196", },
1960         { },
1961 };
1962 MODULE_DEVICE_TABLE(of, bq24190_of_match);
1963 #else
1964 static const struct of_device_id bq24190_of_match[] = {
1965         { },
1966 };
1967 #endif
1968
1969 static struct i2c_driver bq24190_driver = {
1970         .probe          = bq24190_probe,
1971         .remove         = bq24190_remove,
1972         .id_table       = bq24190_i2c_ids,
1973         .driver = {
1974                 .name           = "bq24190-charger",
1975                 .pm             = &bq24190_pm_ops,
1976                 .of_match_table = of_match_ptr(bq24190_of_match),
1977         },
1978 };
1979 module_i2c_driver(bq24190_driver);
1980
1981 MODULE_LICENSE("GPL");
1982 MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
1983 MODULE_DESCRIPTION("TI BQ24190 Charger Driver");