blob: 6cc27c21828b6c0b631b12dd37a3b90b5baec8f8 [file] [log] [blame]
Xiaozhe Shid5d21412013-02-06 17:14:41 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
David Keitel80668952012-07-27 14:25:49 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#define pr_fmt(fmt) "%s: " fmt, __func__
14
15#include <linux/module.h>
16#include <linux/slab.h>
17#include <linux/err.h>
18#include <linux/spmi.h>
19#include <linux/of.h>
20#include <linux/of_device.h>
21#include <linux/radix-tree.h>
22#include <linux/interrupt.h>
David Keiteld681cda2012-10-02 15:44:21 -070023#include <linux/delay.h>
David Keitel80668952012-07-27 14:25:49 -070024#include <linux/qpnp/qpnp-adc.h>
25#include <linux/power_supply.h>
26#include <linux/bitops.h>
Abhijeet Dharmapurikar53ce35a2013-03-29 16:14:16 -070027#include <linux/ratelimit.h>
David Keitel80668952012-07-27 14:25:49 -070028
29/* Interrupt offsets */
30#define INT_RT_STS(base) (base + 0x10)
31#define INT_SET_TYPE(base) (base + 0x11)
32#define INT_POLARITY_HIGH(base) (base + 0x12)
33#define INT_POLARITY_LOW(base) (base + 0x13)
34#define INT_LATCHED_CLR(base) (base + 0x14)
35#define INT_EN_SET(base) (base + 0x15)
36#define INT_EN_CLR(base) (base + 0x16)
37#define INT_LATCHED_STS(base) (base + 0x18)
38#define INT_PENDING_STS(base) (base + 0x19)
39#define INT_MID_SEL(base) (base + 0x1A)
40#define INT_PRIORITY(base) (base + 0x1B)
41
42/* Peripheral register offsets */
43#define CHGR_CHG_OPTION 0x08
44#define CHGR_ATC_STATUS 0x0A
45#define CHGR_VBAT_STATUS 0x0B
46#define CHGR_IBAT_BMS 0x0C
47#define CHGR_IBAT_STS 0x0D
48#define CHGR_VDD_MAX 0x40
49#define CHGR_VDD_SAFE 0x41
50#define CHGR_VDD_MAX_STEP 0x42
51#define CHGR_IBAT_MAX 0x44
52#define CHGR_IBAT_SAFE 0x45
53#define CHGR_VIN_MIN 0x47
54#define CHGR_VIN_MIN_STEP 0x48
55#define CHGR_CHG_CTRL 0x49
56#define CHGR_CHG_FAILED 0x4A
57#define CHGR_ATC_CTRL 0x4B
58#define CHGR_ATC_FAILED 0x4C
59#define CHGR_VBAT_TRKL 0x50
60#define CHGR_VBAT_WEAK 0x52
61#define CHGR_IBAT_ATC_A 0x54
62#define CHGR_IBAT_ATC_B 0x55
63#define CHGR_IBAT_TERM_CHGR 0x5B
64#define CHGR_IBAT_TERM_BMS 0x5C
65#define CHGR_VBAT_DET 0x5D
66#define CHGR_TTRKL_MAX 0x5F
67#define CHGR_TTRKL_MAX_EN 0x60
68#define CHGR_TCHG_MAX 0x61
69#define CHGR_CHG_WDOG_TIME 0x62
70#define CHGR_CHG_WDOG_DLY 0x63
71#define CHGR_CHG_WDOG_PET 0x64
72#define CHGR_CHG_WDOG_EN 0x65
David Keitel9201df32013-01-10 18:38:34 -080073#define CHGR_IR_DROP_COMPEN 0x67
David Keitel22ed2232013-01-28 11:04:07 -080074#define CHGR_I_MAX_REG 0x44
David Keiteld681cda2012-10-02 15:44:21 -070075#define CHGR_USB_USB_SUSP 0x47
David Keitel6f865cd2012-11-30 15:04:32 -080076#define CHGR_USB_USB_OTG_CTL 0x48
David Keitel80668952012-07-27 14:25:49 -070077#define CHGR_USB_ENUM_T_STOP 0x4E
78#define CHGR_CHG_TEMP_THRESH 0x66
79#define CHGR_BAT_IF_PRES_STATUS 0x08
David Keiteld681cda2012-10-02 15:44:21 -070080#define CHGR_STATUS 0x09
David Keitel80668952012-07-27 14:25:49 -070081#define CHGR_BAT_IF_VCP 0x42
82#define CHGR_BAT_IF_BATFET_CTRL1 0x90
83#define CHGR_MISC_BOOT_DONE 0x42
David Keiteld681cda2012-10-02 15:44:21 -070084#define CHGR_BUCK_COMPARATOR_OVRIDE_3 0xED
David Keitel9201df32013-01-10 18:38:34 -080085#define CHGR_BUCK_BCK_VBAT_REG_MODE 0x74
Sridhar Parasuramae183bd2012-12-21 09:28:46 -080086#define MISC_REVISION2 0x01
David Keitel5c3a7702012-12-20 11:13:21 -080087#define USB_OVP_CTL 0x42
David Keiteld681cda2012-10-02 15:44:21 -070088#define SEC_ACCESS 0xD0
David Keitel80668952012-07-27 14:25:49 -070089
David Keitel80668952012-07-27 14:25:49 -070090#define REG_OFFSET_PERP_SUBTYPE 0x05
David Keitelf2170cc2013-02-20 17:49:03 -080091/* SMBB peripheral subtype values */
David Keitel80668952012-07-27 14:25:49 -070092#define SMBB_CHGR_SUBTYPE 0x01
93#define SMBB_BUCK_SUBTYPE 0x02
94#define SMBB_BAT_IF_SUBTYPE 0x03
95#define SMBB_USB_CHGPTH_SUBTYPE 0x04
96#define SMBB_DC_CHGPTH_SUBTYPE 0x05
97#define SMBB_BOOST_SUBTYPE 0x06
98#define SMBB_MISC_SUBTYPE 0x07
99
David Keitelf2170cc2013-02-20 17:49:03 -0800100/* SMBB peripheral subtype values */
101#define SMBBP_CHGR_SUBTYPE 0x31
102#define SMBBP_BUCK_SUBTYPE 0x32
103#define SMBBP_BAT_IF_SUBTYPE 0x33
104#define SMBBP_USB_CHGPTH_SUBTYPE 0x34
105#define SMBBP_BOOST_SUBTYPE 0x36
106#define SMBBP_MISC_SUBTYPE 0x37
107
David Keitel80668952012-07-27 14:25:49 -0700108#define QPNP_CHARGER_DEV_NAME "qcom,qpnp-charger"
109
David Keitelb80eda82012-10-15 10:49:11 -0700110/* Status bits and masks */
111#define CHGR_BOOT_DONE BIT(7)
112#define CHGR_CHG_EN BIT(7)
113#define CHGR_ON_BAT_FORCE_BIT BIT(0)
David Keitel5c3a7702012-12-20 11:13:21 -0800114#define USB_VALID_DEB_20MS 0x03
David Keitel9201df32013-01-10 18:38:34 -0800115#define BUCK_VBAT_REG_NODE_SEL_BIT BIT(0)
David Keitelb80eda82012-10-15 10:49:11 -0700116
David Keitel80668952012-07-27 14:25:49 -0700117/* Interrupt definitions */
118/* smbb_chg_interrupts */
119#define CHG_DONE_IRQ BIT(7)
120#define CHG_FAILED_IRQ BIT(6)
121#define FAST_CHG_ON_IRQ BIT(5)
122#define TRKL_CHG_ON_IRQ BIT(4)
123#define STATE_CHANGE_ON_IR BIT(3)
124#define CHGWDDOG_IRQ BIT(2)
125#define VBAT_DET_HI_IRQ BIT(1)
126#define VBAT_DET_LOW_IRQ BIT(0)
127
128/* smbb_buck_interrupts */
129#define VDD_LOOP_IRQ BIT(6)
130#define IBAT_LOOP_IRQ BIT(5)
131#define ICHG_LOOP_IRQ BIT(4)
132#define VCHG_LOOP_IRQ BIT(3)
133#define OVERTEMP_IRQ BIT(2)
134#define VREF_OV_IRQ BIT(1)
135#define VBAT_OV_IRQ BIT(0)
136
137/* smbb_bat_if_interrupts */
138#define PSI_IRQ BIT(4)
139#define VCP_ON_IRQ BIT(3)
140#define BAT_FET_ON_IRQ BIT(2)
141#define BAT_TEMP_OK_IRQ BIT(1)
142#define BATT_PRES_IRQ BIT(0)
143
144/* smbb_usb_interrupts */
145#define CHG_GONE_IRQ BIT(2)
146#define USBIN_VALID_IRQ BIT(1)
147#define COARSE_DET_USB_IRQ BIT(0)
148
149/* smbb_dc_interrupts */
150#define DCIN_VALID_IRQ BIT(1)
151#define COARSE_DET_DC_IRQ BIT(0)
152
153/* smbb_boost_interrupts */
154#define LIMIT_ERROR_IRQ BIT(1)
155#define BOOST_PWR_OK_IRQ BIT(0)
156
157/* smbb_misc_interrupts */
158#define TFTWDOG_IRQ BIT(0)
159
David Keitelfe51cb92013-04-02 19:42:58 -0700160/* SMBB types */
161#define SMBB BIT(1)
162#define SMBBP BIT(2)
163#define SMBCL BIT(3)
164
David Keiteld681cda2012-10-02 15:44:21 -0700165/* Workaround flags */
166#define CHG_FLAGS_VCP_WA BIT(0)
167
David Keitel80668952012-07-27 14:25:49 -0700168/**
169 * struct qpnp_chg_chip - device information
170 * @dev: device pointer to access the parent
171 * @spmi: spmi pointer to access spmi information
172 * @chgr_base: charger peripheral base address
173 * @buck_base: buck peripheral base address
174 * @bat_if_base: battery interface peripheral base address
175 * @usb_chgpth_base: USB charge path peripheral base address
176 * @dc_chgpth_base: DC charge path peripheral base address
177 * @boost_base: boost peripheral base address
178 * @misc_base: misc peripheral base address
179 * @freq_base: freq peripheral base address
David Keitel454ee842013-03-08 16:19:11 -0800180 * @bat_is_cool: indicates that battery is cool
181 * @bat_is_warm: indicates that battery is warm
David Keitel80668952012-07-27 14:25:49 -0700182 * @chg_done: indicates that charging is completed
183 * @usb_present: present status of usb
184 * @dc_present: present status of dc
David Keitel42ae0aa2013-03-08 16:20:10 -0800185 * @batt_present: present status of battery
David Keitel3dd5e0f2012-12-12 18:12:36 -0800186 * @use_default_batt_values: flag to report default battery properties
David Keitel80668952012-07-27 14:25:49 -0700187 * @max_voltage_mv: the max volts the batt should be charged up to
David Keitel5d44fa52012-12-03 16:37:31 -0800188 * @min_voltage_mv: min battery voltage before turning the FET on
David Keitel454ee842013-03-08 16:19:11 -0800189 * @max_bat_chg_current: maximum battery charge current in mA
190 * @warm_bat_chg_ma: warm battery maximum charge current in mA
191 * @cool_bat_chg_ma: cool battery maximum charge current in mA
192 * @warm_bat_mv: warm temperature battery target voltage
193 * @cool_bat_mv: cool temperature battery target voltage
194 * @resume_delta_mv: voltage delta at which battery resumes charging
David Keitel80668952012-07-27 14:25:49 -0700195 * @term_current: the charging based term current
David Keitel5d44fa52012-12-03 16:37:31 -0800196 * @safe_current: battery safety current setting
David Keitel22ed2232013-01-28 11:04:07 -0800197 * @maxinput_usb_ma: Maximum Input current USB
198 * @maxinput_dc_ma: Maximum Input current DC
David Keitel0c1a4532013-03-21 16:39:06 -0700199 * @warm_bat_decidegc Warm battery temperature in degree Celsius
200 * @cool_bat_decidegc Cool battery temperature in degree Celsius
David Keitel80668952012-07-27 14:25:49 -0700201 * @revision: PMIC revision
David Keitelfe51cb92013-04-02 19:42:58 -0700202 * @type: SMBB type
203 * @tchg_mins maximum allowed software initiated charge time
David Keitelbe208252013-01-31 14:49:25 -0800204 * @thermal_levels amount of thermal mitigation levels
205 * @thermal_mitigation thermal mitigation level values
206 * @therm_lvl_sel thermal mitigation level selection
David Keitel80668952012-07-27 14:25:49 -0700207 * @dc_psy power supply to export information to userspace
208 * @usb_psy power supply to export information to userspace
209 * @bms_psy power supply to export information to userspace
210 * @batt_psy: power supply to export information to userspace
David Keiteld681cda2012-10-02 15:44:21 -0700211 * @flags: flags to activate specific workarounds
212 * throughout the driver
David Keitel80668952012-07-27 14:25:49 -0700213 *
214 */
215struct qpnp_chg_chip {
216 struct device *dev;
217 struct spmi_device *spmi;
218 u16 chgr_base;
219 u16 buck_base;
220 u16 bat_if_base;
221 u16 usb_chgpth_base;
222 u16 dc_chgpth_base;
223 u16 boost_base;
224 u16 misc_base;
225 u16 freq_base;
226 unsigned int usbin_valid_irq;
David Keitel7450dcd2013-01-29 18:41:41 -0800227 unsigned int dcin_valid_irq;
David Keitel80668952012-07-27 14:25:49 -0700228 unsigned int chg_done_irq;
David Keitel42ae0aa2013-03-08 16:20:10 -0800229 unsigned int chg_fastchg_irq;
230 unsigned int chg_trklchg_irq;
David Keitel80668952012-07-27 14:25:49 -0700231 unsigned int chg_failed_irq;
David Keitel454ee842013-03-08 16:19:11 -0800232 unsigned int batt_pres_irq;
233 bool bat_is_cool;
234 bool bat_is_warm;
David Keitel80668952012-07-27 14:25:49 -0700235 bool chg_done;
236 bool usb_present;
237 bool dc_present;
David Keitel42ae0aa2013-03-08 16:20:10 -0800238 bool batt_present;
David Keitel03ee6b52012-10-22 12:25:19 -0700239 bool charging_disabled;
David Keitel3dd5e0f2012-12-12 18:12:36 -0800240 bool use_default_batt_values;
David Keitel80668952012-07-27 14:25:49 -0700241 unsigned int max_bat_chg_current;
David Keitel454ee842013-03-08 16:19:11 -0800242 unsigned int warm_bat_chg_ma;
243 unsigned int cool_bat_chg_ma;
David Keitel80668952012-07-27 14:25:49 -0700244 unsigned int safe_voltage_mv;
245 unsigned int max_voltage_mv;
246 unsigned int min_voltage_mv;
David Keitel454ee842013-03-08 16:19:11 -0800247 unsigned int warm_bat_mv;
248 unsigned int cool_bat_mv;
249 unsigned int resume_delta_mv;
David Keitel80668952012-07-27 14:25:49 -0700250 unsigned int term_current;
David Keitel22ed2232013-01-28 11:04:07 -0800251 unsigned int maxinput_usb_ma;
252 unsigned int maxinput_dc_ma;
David Keitel0c1a4532013-03-21 16:39:06 -0700253 unsigned int warm_bat_decidegc;
254 unsigned int cool_bat_decidegc;
David Keitel5d44fa52012-12-03 16:37:31 -0800255 unsigned int safe_current;
David Keitel80668952012-07-27 14:25:49 -0700256 unsigned int revision;
David Keitelfe51cb92013-04-02 19:42:58 -0700257 unsigned int type;
258 unsigned int tchg_mins;
David Keitelbe208252013-01-31 14:49:25 -0800259 unsigned int thermal_levels;
260 unsigned int therm_lvl_sel;
261 unsigned int *thermal_mitigation;
David Keitel80668952012-07-27 14:25:49 -0700262 struct power_supply dc_psy;
263 struct power_supply *usb_psy;
264 struct power_supply *bms_psy;
265 struct power_supply batt_psy;
David Keiteld681cda2012-10-02 15:44:21 -0700266 uint32_t flags;
David Keitel454ee842013-03-08 16:19:11 -0800267 struct qpnp_adc_tm_btm_param adc_param;
David Keitel79f4c932013-04-03 16:08:39 -0700268 struct work_struct adc_measure_work;
David Keitel80668952012-07-27 14:25:49 -0700269};
270
David Keitel80668952012-07-27 14:25:49 -0700271static struct of_device_id qpnp_charger_match_table[] = {
272 { .compatible = QPNP_CHARGER_DEV_NAME, },
273 {}
274};
275
276static int
277qpnp_chg_read(struct qpnp_chg_chip *chip, u8 *val,
278 u16 base, int count)
279{
280 int rc;
281 struct spmi_device *spmi = chip->spmi;
282
283 rc = spmi_ext_register_readl(spmi->ctrl, spmi->sid, base, val,
284 count);
285 if (rc) {
286 pr_err("SPMI read failed base=0x%02x sid=0x%02x rc=%d\n", base,
287 spmi->sid, rc);
288 return rc;
289 }
290 return 0;
291}
292
293static int
294qpnp_chg_write(struct qpnp_chg_chip *chip, u8 *val,
295 u16 base, int count)
296{
297 int rc;
298 struct spmi_device *spmi = chip->spmi;
299
300 rc = spmi_ext_register_writel(spmi->ctrl, spmi->sid, base, val,
301 count);
302 if (rc) {
303 pr_err("write failed base=0x%02x sid=0x%02x rc=%d\n",
304 base, spmi->sid, rc);
305 return rc;
306 }
307
308 return 0;
309}
310
311static int
312qpnp_chg_masked_write(struct qpnp_chg_chip *chip, u16 base,
313 u8 mask, u8 val, int count)
314{
315 int rc;
316 u8 reg;
317
318 rc = qpnp_chg_read(chip, &reg, base, count);
319 if (rc) {
320 pr_err("spmi read failed: addr=%03X, rc=%d\n", base, rc);
321 return rc;
322 }
323 pr_debug("addr = 0x%x read 0x%x\n", base, reg);
324
325 reg &= ~mask;
326 reg |= val & mask;
327
328 pr_debug("Writing 0x%x\n", reg);
329
330 rc = qpnp_chg_write(chip, &reg, base, count);
331 if (rc) {
332 pr_err("spmi write failed: addr=%03X, rc=%d\n", base, rc);
333 return rc;
334 }
335
336 return 0;
337}
338
David Keitel6f865cd2012-11-30 15:04:32 -0800339#define USB_OTG_EN_BIT BIT(0)
340static int
341qpnp_chg_is_otg_en_set(struct qpnp_chg_chip *chip)
342{
343 u8 usb_otg_en;
344 int rc;
345
346 rc = qpnp_chg_read(chip, &usb_otg_en,
347 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
348 1);
349
350 if (rc) {
351 pr_err("spmi read failed: addr=%03X, rc=%d\n",
352 chip->usb_chgpth_base + CHGR_STATUS, rc);
353 return rc;
354 }
355 pr_debug("usb otg en 0x%x\n", usb_otg_en);
356
357 return (usb_otg_en & USB_OTG_EN_BIT) ? 1 : 0;
358}
359
David Keitel42ae0aa2013-03-08 16:20:10 -0800360static int
361qpnp_chg_is_batt_present(struct qpnp_chg_chip *chip)
362{
363 u8 batt_pres_rt_sts;
364 int rc;
365
366 rc = qpnp_chg_read(chip, &batt_pres_rt_sts,
367 INT_RT_STS(chip->bat_if_base), 1);
368 if (rc) {
369 pr_err("spmi read failed: addr=%03X, rc=%d\n",
370 INT_RT_STS(chip->bat_if_base), rc);
371 return rc;
372 }
373
374 return (batt_pres_rt_sts & BATT_PRES_IRQ) ? 1 : 0;
375}
376
David Keiteld681cda2012-10-02 15:44:21 -0700377#define USB_VALID_BIT BIT(7)
David Keitel80668952012-07-27 14:25:49 -0700378static int
379qpnp_chg_is_usb_chg_plugged_in(struct qpnp_chg_chip *chip)
380{
381 u8 usbin_valid_rt_sts;
382 int rc;
383
384 rc = qpnp_chg_read(chip, &usbin_valid_rt_sts,
David Keiteld681cda2012-10-02 15:44:21 -0700385 chip->usb_chgpth_base + CHGR_STATUS , 1);
David Keitel80668952012-07-27 14:25:49 -0700386
387 if (rc) {
388 pr_err("spmi read failed: addr=%03X, rc=%d\n",
David Keiteld681cda2012-10-02 15:44:21 -0700389 chip->usb_chgpth_base + CHGR_STATUS, rc);
David Keitel80668952012-07-27 14:25:49 -0700390 return rc;
391 }
392 pr_debug("chgr usb sts 0x%x\n", usbin_valid_rt_sts);
393
David Keiteld681cda2012-10-02 15:44:21 -0700394 return (usbin_valid_rt_sts & USB_VALID_BIT) ? 1 : 0;
David Keitel80668952012-07-27 14:25:49 -0700395}
396
397static int
398qpnp_chg_is_dc_chg_plugged_in(struct qpnp_chg_chip *chip)
399{
400 u8 dcin_valid_rt_sts;
401 int rc;
402
David Keitelf2170cc2013-02-20 17:49:03 -0800403 if (!chip->dc_chgpth_base)
404 return 0;
405
David Keitel80668952012-07-27 14:25:49 -0700406 rc = qpnp_chg_read(chip, &dcin_valid_rt_sts,
407 INT_RT_STS(chip->dc_chgpth_base), 1);
408 if (rc) {
409 pr_err("spmi read failed: addr=%03X, rc=%d\n",
410 INT_RT_STS(chip->dc_chgpth_base), rc);
411 return rc;
412 }
413
414 return (dcin_valid_rt_sts & DCIN_VALID_IRQ) ? 1 : 0;
415}
416
David Keitel22ed2232013-01-28 11:04:07 -0800417#define QPNP_CHG_I_MAX_MIN_100 100
418#define QPNP_CHG_I_MAX_MIN_150 150
419#define QPNP_CHG_I_MAX_MIN_MA 200
420#define QPNP_CHG_I_MAX_MAX_MA 2500
421#define QPNP_CHG_I_MAXSTEP_MA 100
422static int
423qpnp_chg_idcmax_set(struct qpnp_chg_chip *chip, int mA)
424{
425 int rc = 0;
426 u8 dc = 0;
427
428 if (mA < QPNP_CHG_I_MAX_MIN_100
429 || mA > QPNP_CHG_I_MAX_MAX_MA) {
430 pr_err("bad mA=%d asked to set\n", mA);
431 return -EINVAL;
432 }
433
434 if (mA == QPNP_CHG_I_MAX_MIN_100) {
435 dc = 0x00;
436 pr_debug("current=%d setting %02x\n", mA, dc);
437 return qpnp_chg_write(chip, &dc,
438 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
439 } else if (mA == QPNP_CHG_I_MAX_MIN_150) {
440 dc = 0x01;
441 pr_debug("current=%d setting %02x\n", mA, dc);
442 return qpnp_chg_write(chip, &dc,
443 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
444 }
445
446 dc = mA / QPNP_CHG_I_MAXSTEP_MA;
447
448 pr_debug("current=%d setting 0x%x\n", mA, dc);
449 rc = qpnp_chg_write(chip, &dc,
450 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
451
452 return rc;
453}
454
David Keitel80668952012-07-27 14:25:49 -0700455static int
456qpnp_chg_iusbmax_set(struct qpnp_chg_chip *chip, int mA)
457{
David Keiteld681cda2012-10-02 15:44:21 -0700458 int rc = 0;
459 u8 usb_reg = 0, temp = 8;
David Keitel80668952012-07-27 14:25:49 -0700460
David Keitel22ed2232013-01-28 11:04:07 -0800461 if (mA < QPNP_CHG_I_MAX_MIN_100
462 || mA > QPNP_CHG_I_MAX_MAX_MA) {
David Keitel80668952012-07-27 14:25:49 -0700463 pr_err("bad mA=%d asked to set\n", mA);
464 return -EINVAL;
465 }
466
David Keitel22ed2232013-01-28 11:04:07 -0800467 if (mA == QPNP_CHG_I_MAX_MIN_100) {
468 usb_reg = 0x00;
469 pr_debug("current=%d setting %02x\n", mA, usb_reg);
470 return qpnp_chg_write(chip, &usb_reg,
471 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
472 } else if (mA == QPNP_CHG_I_MAX_MIN_150) {
473 usb_reg = 0x01;
474 pr_debug("current=%d setting %02x\n", mA, usb_reg);
475 return qpnp_chg_write(chip, &usb_reg,
476 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
477 }
478
479 /* Impose input current limit */
480 if (chip->maxinput_usb_ma)
481 mA = (chip->maxinput_usb_ma) <= mA ? chip->maxinput_usb_ma : mA;
482
483 usb_reg = mA / QPNP_CHG_I_MAXSTEP_MA;
David Keitel80668952012-07-27 14:25:49 -0700484
David Keiteld681cda2012-10-02 15:44:21 -0700485 if (chip->flags & CHG_FLAGS_VCP_WA) {
486 temp = 0xA5;
487 rc = qpnp_chg_write(chip, &temp,
488 chip->buck_base + SEC_ACCESS, 1);
489 rc = qpnp_chg_masked_write(chip,
490 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
491 0x0C, 0x0C, 1);
492 }
493
David Keitel80668952012-07-27 14:25:49 -0700494 pr_debug("current=%d setting 0x%x\n", mA, usb_reg);
David Keiteld681cda2012-10-02 15:44:21 -0700495 rc = qpnp_chg_write(chip, &usb_reg,
David Keitel22ed2232013-01-28 11:04:07 -0800496 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
David Keiteld681cda2012-10-02 15:44:21 -0700497
498 if (chip->flags & CHG_FLAGS_VCP_WA) {
499 temp = 0xA5;
500 udelay(200);
501 rc = qpnp_chg_write(chip, &temp,
502 chip->buck_base + SEC_ACCESS, 1);
503 rc = qpnp_chg_masked_write(chip,
504 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
505 0x0C, 0x00, 1);
506 }
507
508 return rc;
509}
510
511#define USB_SUSPEND_BIT BIT(0)
512static int
513qpnp_chg_usb_suspend_enable(struct qpnp_chg_chip *chip, int enable)
514{
515 return qpnp_chg_masked_write(chip,
516 chip->usb_chgpth_base + CHGR_USB_USB_SUSP,
517 USB_SUSPEND_BIT,
518 enable ? USB_SUSPEND_BIT : 0, 1);
David Keitel80668952012-07-27 14:25:49 -0700519}
520
David Keitel79f4c932013-04-03 16:08:39 -0700521static void qpnp_bat_if_adc_measure_work(struct work_struct *work)
522{
523 struct qpnp_chg_chip *chip = container_of(work,
524 struct qpnp_chg_chip, adc_measure_work);
525
526 if (qpnp_adc_tm_channel_measure(&chip->adc_param))
527 pr_err("request ADC error\n");
528}
529
David Keitel80668952012-07-27 14:25:49 -0700530#define ENUM_T_STOP_BIT BIT(0)
531static irqreturn_t
532qpnp_chg_usb_usbin_valid_irq_handler(int irq, void *_chip)
533{
534 struct qpnp_chg_chip *chip = _chip;
David Keitel6f865cd2012-11-30 15:04:32 -0800535 int usb_present, host_mode;
David Keitel80668952012-07-27 14:25:49 -0700536
537 usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
David Keitel6f865cd2012-11-30 15:04:32 -0800538 host_mode = qpnp_chg_is_otg_en_set(chip);
539 pr_debug("usbin-valid triggered: %d host_mode: %d\n",
540 usb_present, host_mode);
541
542 /* In host mode notifications cmoe from USB supply */
543 if (host_mode)
544 return IRQ_HANDLED;
David Keitel80668952012-07-27 14:25:49 -0700545
546 if (chip->usb_present ^ usb_present) {
547 chip->usb_present = usb_present;
David Keitelc69f2d62013-03-17 14:52:35 -0700548 if (!usb_present)
549 qpnp_chg_iusbmax_set(chip, QPNP_CHG_I_MAX_MIN_100);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -0800550 power_supply_set_present(chip->usb_psy,
551 chip->usb_present);
David Keitel80668952012-07-27 14:25:49 -0700552 }
553
554 return IRQ_HANDLED;
555}
556
David Keitel7450dcd2013-01-29 18:41:41 -0800557static irqreturn_t
David Keitel42ae0aa2013-03-08 16:20:10 -0800558qpnp_chg_bat_if_batt_pres_irq_handler(int irq, void *_chip)
559{
560 struct qpnp_chg_chip *chip = _chip;
561 int batt_present;
562
563 batt_present = qpnp_chg_is_batt_present(chip);
564 pr_debug("batt-pres triggered: %d\n", batt_present);
565
566 if (chip->batt_present ^ batt_present) {
567 chip->batt_present = batt_present;
568 power_supply_changed(&chip->batt_psy);
David Keitel0c1a4532013-03-21 16:39:06 -0700569
570 if (chip->cool_bat_decidegc && chip->warm_bat_decidegc
571 && batt_present) {
David Keitel79f4c932013-04-03 16:08:39 -0700572 schedule_work(&chip->adc_measure_work);
David Keitel0c1a4532013-03-21 16:39:06 -0700573 }
David Keitel42ae0aa2013-03-08 16:20:10 -0800574 }
575
Xiaozhe Shid5d21412013-02-06 17:14:41 -0800576 if (chip->bms_psy)
577 power_supply_set_present(chip->bms_psy, batt_present);
578
David Keitel42ae0aa2013-03-08 16:20:10 -0800579 return IRQ_HANDLED;
580}
581
582static irqreturn_t
David Keitel7450dcd2013-01-29 18:41:41 -0800583qpnp_chg_dc_dcin_valid_irq_handler(int irq, void *_chip)
584{
585 struct qpnp_chg_chip *chip = _chip;
586 int dc_present;
587
588 dc_present = qpnp_chg_is_dc_chg_plugged_in(chip);
589 pr_debug("dcin-valid triggered: %d\n", dc_present);
590
591 if (chip->dc_present ^ dc_present) {
592 chip->dc_present = dc_present;
593 power_supply_changed(&chip->dc_psy);
594 }
595
596 return IRQ_HANDLED;
597}
598
David Keitel80668952012-07-27 14:25:49 -0700599#define CHGR_CHG_FAILED_BIT BIT(7)
600static irqreturn_t
601qpnp_chg_chgr_chg_failed_irq_handler(int irq, void *_chip)
602{
603 struct qpnp_chg_chip *chip = _chip;
David Keitel4429b1f2012-10-18 10:42:50 -0700604 int rc;
David Keitel80668952012-07-27 14:25:49 -0700605
606 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -0700607 chip->chgr_base + CHGR_CHG_FAILED,
David Keitel80668952012-07-27 14:25:49 -0700608 CHGR_CHG_FAILED_BIT,
609 CHGR_CHG_FAILED_BIT, 1);
610 if (rc)
611 pr_err("Failed to write chg_fail clear bit!\n");
612
David Keitel80668952012-07-27 14:25:49 -0700613 return IRQ_HANDLED;
614}
615
616static irqreturn_t
David Keitel42ae0aa2013-03-08 16:20:10 -0800617qpnp_chg_chgr_chg_trklchg_irq_handler(int irq, void *_chip)
618{
619 struct qpnp_chg_chip *chip = _chip;
620
621 pr_debug("TRKL IRQ triggered\n");
David Keitelc9ffe842013-01-25 19:37:51 -0800622
623 chip->chg_done = false;
David Keitel42ae0aa2013-03-08 16:20:10 -0800624 power_supply_changed(&chip->batt_psy);
625
626 return IRQ_HANDLED;
627}
628
629static irqreturn_t
630qpnp_chg_chgr_chg_fastchg_irq_handler(int irq, void *_chip)
631{
632 struct qpnp_chg_chip *chip = _chip;
633
634 pr_debug("FAST_CHG IRQ triggered\n");
David Keitelc9ffe842013-01-25 19:37:51 -0800635
636 chip->chg_done = false;
David Keitel42ae0aa2013-03-08 16:20:10 -0800637 power_supply_changed(&chip->batt_psy);
638
639 return IRQ_HANDLED;
640}
641
642static irqreturn_t
David Keitel80668952012-07-27 14:25:49 -0700643qpnp_chg_chgr_chg_done_irq_handler(int irq, void *_chip)
644{
645 struct qpnp_chg_chip *chip = _chip;
David Keitelc9ffe842013-01-25 19:37:51 -0800646 u8 chgr_sts;
647 int rc;
David Keitel80668952012-07-27 14:25:49 -0700648
649 pr_debug("CHG_DONE IRQ triggered\n");
David Keitel80668952012-07-27 14:25:49 -0700650
David Keitelc9ffe842013-01-25 19:37:51 -0800651 rc = qpnp_chg_read(chip, &chgr_sts,
652 INT_RT_STS(chip->chgr_base), 1);
653 if (rc)
654 pr_err("failed to read interrupt sts %d\n", rc);
655
656 chip->chg_done = true;
David Keitel42ae0aa2013-03-08 16:20:10 -0800657 power_supply_changed(&chip->batt_psy);
David Keitelc9ffe842013-01-25 19:37:51 -0800658
David Keitel80668952012-07-27 14:25:49 -0700659 return IRQ_HANDLED;
660}
661
David Keitel03ee6b52012-10-22 12:25:19 -0700662static int
663qpnp_batt_property_is_writeable(struct power_supply *psy,
664 enum power_supply_property psp)
665{
666 switch (psp) {
667 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitelbe208252013-01-31 14:49:25 -0800668 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
David Keitel03ee6b52012-10-22 12:25:19 -0700669 return 1;
670 default:
671 break;
672 }
673
674 return 0;
675}
676
David Keitel6f865cd2012-11-30 15:04:32 -0800677static int
678qpnp_chg_charge_en(struct qpnp_chg_chip *chip, int enable)
679{
680 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
681 CHGR_CHG_EN,
682 enable ? CHGR_CHG_EN : 0, 1);
683}
684
685static int
686qpnp_chg_force_run_on_batt(struct qpnp_chg_chip *chip, int disable)
687{
David Keitelb2eaaee2012-12-19 14:53:28 -0800688 /* Don't run on battery for batteryless hardware */
689 if (chip->use_default_batt_values)
690 return 0;
691
David Keitel6f865cd2012-11-30 15:04:32 -0800692 /* This bit forces the charger to run off of the battery rather
693 * than a connected charger */
694 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
695 CHGR_ON_BAT_FORCE_BIT,
696 disable ? CHGR_ON_BAT_FORCE_BIT : 0, 1);
697}
698
David Keitelbe208252013-01-31 14:49:25 -0800699static int
700qpnp_chg_buck_control(struct qpnp_chg_chip *chip, int enable)
701{
702 int rc;
703
704 if (chip->charging_disabled && enable) {
705 pr_debug("Charging disabled\n");
706 return 0;
707 }
708
709 rc = qpnp_chg_charge_en(chip, enable);
710 if (rc) {
711 pr_err("Failed to control charging %d\n", rc);
712 return rc;
713 }
714
715 rc = qpnp_chg_force_run_on_batt(chip, !enable);
716 if (rc)
717 pr_err("Failed to control charging %d\n", rc);
718
719 return rc;
720}
721
David Keitel454ee842013-03-08 16:19:11 -0800722static int
723switch_usb_to_charge_mode(struct qpnp_chg_chip *chip)
David Keitel6f865cd2012-11-30 15:04:32 -0800724{
725 int rc;
726
727 pr_debug("switch to charge mode\n");
728 if (!qpnp_chg_is_otg_en_set(chip))
729 return 0;
730
731 /* enable usb ovp fet */
732 rc = qpnp_chg_masked_write(chip,
733 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
734 USB_OTG_EN_BIT,
735 0, 1);
736 if (rc) {
737 pr_err("Failed to turn on usb ovp rc = %d\n", rc);
738 return rc;
739 }
740
741 rc = qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
742 if (rc) {
743 pr_err("Failed re-enable charging rc = %d\n", rc);
744 return rc;
745 }
746
747 return 0;
748}
749
David Keitel454ee842013-03-08 16:19:11 -0800750static int
751switch_usb_to_host_mode(struct qpnp_chg_chip *chip)
David Keitel6f865cd2012-11-30 15:04:32 -0800752{
753 int rc;
754
755 pr_debug("switch to host mode\n");
756 if (qpnp_chg_is_otg_en_set(chip))
757 return 0;
758
759 rc = qpnp_chg_force_run_on_batt(chip, 1);
760 if (rc) {
761 pr_err("Failed to disable charging rc = %d\n", rc);
762 return rc;
763 }
764
765 /* force usb ovp fet off */
766 rc = qpnp_chg_masked_write(chip,
767 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
768 USB_OTG_EN_BIT,
769 USB_OTG_EN_BIT, 1);
770 if (rc) {
771 pr_err("Failed to turn off usb ovp rc = %d\n", rc);
772 return rc;
773 }
774
775 return 0;
776}
777
David Keitel80668952012-07-27 14:25:49 -0700778static enum power_supply_property pm_power_props_mains[] = {
779 POWER_SUPPLY_PROP_PRESENT,
780 POWER_SUPPLY_PROP_ONLINE,
781};
782
783static enum power_supply_property msm_batt_power_props[] = {
David Keitelb80eda82012-10-15 10:49:11 -0700784 POWER_SUPPLY_PROP_CHARGING_ENABLED,
David Keitel80668952012-07-27 14:25:49 -0700785 POWER_SUPPLY_PROP_STATUS,
786 POWER_SUPPLY_PROP_CHARGE_TYPE,
787 POWER_SUPPLY_PROP_HEALTH,
788 POWER_SUPPLY_PROP_PRESENT,
789 POWER_SUPPLY_PROP_TECHNOLOGY,
790 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
791 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
792 POWER_SUPPLY_PROP_VOLTAGE_NOW,
793 POWER_SUPPLY_PROP_CAPACITY,
David Keitelabdf2872013-03-28 18:14:42 -0700794 POWER_SUPPLY_PROP_CURRENT_MAX,
David Keitel80668952012-07-27 14:25:49 -0700795 POWER_SUPPLY_PROP_CURRENT_NOW,
796 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
797 POWER_SUPPLY_PROP_TEMP,
David Keitelbe208252013-01-31 14:49:25 -0800798 POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL,
David Keitel80668952012-07-27 14:25:49 -0700799};
800
801static char *pm_power_supplied_to[] = {
802 "battery",
803};
804
805#define USB_WALL_THRESHOLD_MA 500
806static int
807qpnp_power_get_property_mains(struct power_supply *psy,
808 enum power_supply_property psp,
809 union power_supply_propval *val)
810{
811 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
812 dc_psy);
813
814 switch (psp) {
815 case POWER_SUPPLY_PROP_PRESENT:
816 case POWER_SUPPLY_PROP_ONLINE:
817 val->intval = 0;
David Keitel03ee6b52012-10-22 12:25:19 -0700818 if (chip->charging_disabled)
David Keitel80668952012-07-27 14:25:49 -0700819 return 0;
820
821 val->intval = qpnp_chg_is_dc_chg_plugged_in(chip);
822 break;
823 default:
824 return -EINVAL;
825 }
826 return 0;
827}
828
829static int
830get_prop_battery_voltage_now(struct qpnp_chg_chip *chip)
831{
832 int rc = 0;
833 struct qpnp_vadc_result results;
834
David Keitelfe51cb92013-04-02 19:42:58 -0700835 if (chip->revision == 0 && chip->type == SMBB) {
836 pr_err("vbat reading not supported for 1.0 rc=%d\n", rc);
837 return 0;
838 } else {
David Keitel80668952012-07-27 14:25:49 -0700839 rc = qpnp_vadc_read(VBAT_SNS, &results);
840 if (rc) {
841 pr_err("Unable to read vbat rc=%d\n", rc);
842 return 0;
843 }
844 return results.physical;
David Keitel80668952012-07-27 14:25:49 -0700845 }
846}
847
848#define BATT_PRES_BIT BIT(7)
849static int
850get_prop_batt_present(struct qpnp_chg_chip *chip)
851{
852 u8 batt_present;
853 int rc;
854
855 rc = qpnp_chg_read(chip, &batt_present,
856 chip->bat_if_base + CHGR_BAT_IF_PRES_STATUS, 1);
857 if (rc) {
858 pr_err("Couldn't read battery status read failed rc=%d\n", rc);
859 return 0;
860 };
861 return (batt_present & BATT_PRES_BIT) ? 1 : 0;
862}
863
864#define BATT_TEMP_HOT BIT(6)
865#define BATT_TEMP_OK BIT(7)
866static int
867get_prop_batt_health(struct qpnp_chg_chip *chip)
868{
869 u8 batt_health;
870 int rc;
871
872 rc = qpnp_chg_read(chip, &batt_health,
David Keiteld681cda2012-10-02 15:44:21 -0700873 chip->bat_if_base + CHGR_STATUS, 1);
David Keitel80668952012-07-27 14:25:49 -0700874 if (rc) {
875 pr_err("Couldn't read battery health read failed rc=%d\n", rc);
876 return POWER_SUPPLY_HEALTH_UNKNOWN;
877 };
878
879 if (BATT_TEMP_OK & batt_health)
880 return POWER_SUPPLY_HEALTH_GOOD;
881 if (BATT_TEMP_HOT & batt_health)
882 return POWER_SUPPLY_HEALTH_OVERHEAT;
883 else
884 return POWER_SUPPLY_HEALTH_COLD;
885}
886
887static int
888get_prop_charge_type(struct qpnp_chg_chip *chip)
889{
890 int rc;
891 u8 chgr_sts;
892
893 if (!get_prop_batt_present(chip))
894 return POWER_SUPPLY_CHARGE_TYPE_NONE;
895
896 rc = qpnp_chg_read(chip, &chgr_sts,
897 INT_RT_STS(chip->chgr_base), 1);
898 if (rc) {
899 pr_err("failed to read interrupt sts %d\n", rc);
900 return POWER_SUPPLY_CHARGE_TYPE_NONE;
901 }
902
903 if (chgr_sts & TRKL_CHG_ON_IRQ)
904 return POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
905 if (chgr_sts & FAST_CHG_ON_IRQ)
906 return POWER_SUPPLY_CHARGE_TYPE_FAST;
907
908 return POWER_SUPPLY_CHARGE_TYPE_NONE;
909}
910
911static int
912get_prop_batt_status(struct qpnp_chg_chip *chip)
913{
914 int rc;
915 u8 chgr_sts;
916
David Keitelc9ffe842013-01-25 19:37:51 -0800917 if (chip->chg_done)
918 return POWER_SUPPLY_STATUS_FULL;
919
David Keitel80668952012-07-27 14:25:49 -0700920 rc = qpnp_chg_read(chip, &chgr_sts,
921 INT_RT_STS(chip->chgr_base), 1);
922 if (rc) {
923 pr_err("failed to read interrupt sts %d\n", rc);
David Keitelc9ffe842013-01-25 19:37:51 -0800924 return POWER_SUPPLY_CHARGE_TYPE_NONE;
David Keitel80668952012-07-27 14:25:49 -0700925 }
926
David Keitel80668952012-07-27 14:25:49 -0700927 if (chgr_sts & TRKL_CHG_ON_IRQ)
928 return POWER_SUPPLY_STATUS_CHARGING;
929 if (chgr_sts & FAST_CHG_ON_IRQ)
930 return POWER_SUPPLY_STATUS_CHARGING;
931
932 return POWER_SUPPLY_STATUS_DISCHARGING;
933}
David Keitelabdf2872013-03-28 18:14:42 -0700934static int
935get_prop_current_max(struct qpnp_chg_chip *chip)
936{
937 union power_supply_propval ret = {0,};
938
939 if (chip->bms_psy) {
940 chip->bms_psy->get_property(chip->bms_psy,
941 POWER_SUPPLY_PROP_CURRENT_MAX, &ret);
942 return ret.intval;
943 } else {
944 pr_debug("No BMS supply registered return 0\n");
945 }
946
947 return 0;
948}
David Keitel80668952012-07-27 14:25:49 -0700949
950static int
951get_prop_current_now(struct qpnp_chg_chip *chip)
952{
953 union power_supply_propval ret = {0,};
954
955 if (chip->bms_psy) {
956 chip->bms_psy->get_property(chip->bms_psy,
957 POWER_SUPPLY_PROP_CURRENT_NOW, &ret);
958 return ret.intval;
959 } else {
960 pr_debug("No BMS supply registered return 0\n");
961 }
962
963 return 0;
964}
965
966static int
967get_prop_full_design(struct qpnp_chg_chip *chip)
968{
969 union power_supply_propval ret = {0,};
970
971 if (chip->bms_psy) {
972 chip->bms_psy->get_property(chip->bms_psy,
973 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, &ret);
974 return ret.intval;
975 } else {
976 pr_debug("No BMS supply registered return 0\n");
977 }
978
979 return 0;
980}
981
982#define DEFAULT_CAPACITY 50
983static int
984get_prop_capacity(struct qpnp_chg_chip *chip)
985{
986 union power_supply_propval ret = {0,};
Abhijeet Dharmapurikar53ce35a2013-03-29 16:14:16 -0700987 bool usb_online, dc_online;
David Keitel80668952012-07-27 14:25:49 -0700988
David Keitel3dd5e0f2012-12-12 18:12:36 -0800989 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
990 return DEFAULT_CAPACITY;
991
David Keitel80668952012-07-27 14:25:49 -0700992 if (chip->bms_psy) {
993 chip->bms_psy->get_property(chip->bms_psy,
994 POWER_SUPPLY_PROP_CAPACITY, &ret);
Abhijeet Dharmapurikar53ce35a2013-03-29 16:14:16 -0700995 if (ret.intval == 0) {
996 usb_online = chip->usb_psy->get_property(chip->usb_psy,
997 POWER_SUPPLY_PROP_ONLINE, &ret);
998 dc_online = chip->dc_psy.get_property(&chip->dc_psy,
999 POWER_SUPPLY_PROP_ONLINE, &ret);
1000 if (!usb_online && !dc_online)
1001 pr_warn_ratelimited("Battery 0, CHG absent\n");
1002 }
David Keitel80668952012-07-27 14:25:49 -07001003 return ret.intval;
1004 } else {
1005 pr_debug("No BMS supply registered return 50\n");
1006 }
1007
1008 /* return default capacity to avoid userspace
1009 * from shutting down unecessarily */
1010 return DEFAULT_CAPACITY;
1011}
1012
David Keitel3dd5e0f2012-12-12 18:12:36 -08001013#define DEFAULT_TEMP 250
David Keitel80668952012-07-27 14:25:49 -07001014#define MAX_TOLERABLE_BATT_TEMP_DDC 680
1015static int
1016get_prop_batt_temp(struct qpnp_chg_chip *chip)
1017{
1018 int rc = 0;
1019 struct qpnp_vadc_result results;
1020
David Keitel3dd5e0f2012-12-12 18:12:36 -08001021 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
1022 return DEFAULT_TEMP;
1023
David Keitel80668952012-07-27 14:25:49 -07001024 if (chip->revision > 0) {
1025 rc = qpnp_vadc_read(LR_MUX1_BATT_THERM, &results);
1026 if (rc) {
1027 pr_debug("Unable to read batt temperature rc=%d\n", rc);
1028 return 0;
1029 }
1030 pr_debug("get_bat_temp %d %lld\n",
1031 results.adc_code, results.physical);
1032 return (int)results.physical;
1033 } else {
1034 pr_debug("batt temp not supported for PMIC 1.0 rc=%d\n", rc);
1035 }
1036
1037 /* return default temperature to avoid userspace
1038 * from shutting down unecessarily */
1039 return DEFAULT_TEMP;
1040}
1041
1042static void
1043qpnp_batt_external_power_changed(struct power_supply *psy)
1044{
1045 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
1046 batt_psy);
1047 union power_supply_propval ret = {0,};
1048
1049 if (!chip->bms_psy)
1050 chip->bms_psy = power_supply_get_by_name("bms");
1051
1052 chip->usb_psy->get_property(chip->usb_psy,
David Keitel6f865cd2012-11-30 15:04:32 -08001053 POWER_SUPPLY_PROP_SCOPE, &ret);
1054 if (ret.intval) {
1055 if ((ret.intval == POWER_SUPPLY_SCOPE_SYSTEM)
1056 && !qpnp_chg_is_otg_en_set(chip)) {
1057 switch_usb_to_host_mode(chip);
1058 return;
1059 }
1060 if ((ret.intval == POWER_SUPPLY_SCOPE_DEVICE)
1061 && qpnp_chg_is_otg_en_set(chip)) {
1062 switch_usb_to_charge_mode(chip);
1063 return;
1064 }
1065 }
1066
1067 chip->usb_psy->get_property(chip->usb_psy,
David Keitel80668952012-07-27 14:25:49 -07001068 POWER_SUPPLY_PROP_ONLINE, &ret);
1069
David Keitelc69f2d62013-03-17 14:52:35 -07001070 /* Only honour requests while USB is present */
1071 if (qpnp_chg_is_usb_chg_plugged_in(chip)) {
David Keitel359ab652013-03-21 17:46:00 -07001072 chip->usb_psy->get_property(chip->usb_psy,
1073 POWER_SUPPLY_PROP_CURRENT_MAX, &ret);
David Keitel87473252013-03-21 14:39:45 -07001074 if (ret.intval <= 2 && !chip->use_default_batt_values &&
1075 get_prop_batt_present(chip)) {
David Keitelc69f2d62013-03-17 14:52:35 -07001076 qpnp_chg_iusbmax_set(chip, QPNP_CHG_I_MAX_MIN_100);
David Keitel359ab652013-03-21 17:46:00 -07001077 qpnp_chg_usb_suspend_enable(chip, 1);
David Keitelc69f2d62013-03-17 14:52:35 -07001078 } else {
David Keiteld681cda2012-10-02 15:44:21 -07001079 qpnp_chg_usb_suspend_enable(chip, 0);
David Keitel359ab652013-03-21 17:46:00 -07001080 qpnp_chg_iusbmax_set(chip, ret.intval / 1000);
David Keitelc69f2d62013-03-17 14:52:35 -07001081 }
David Keitel80668952012-07-27 14:25:49 -07001082 }
1083
1084 pr_debug("end of power supply changed\n");
1085 power_supply_changed(&chip->batt_psy);
1086}
1087
1088static int
1089qpnp_batt_power_get_property(struct power_supply *psy,
1090 enum power_supply_property psp,
1091 union power_supply_propval *val)
1092{
1093 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
1094 batt_psy);
1095
1096 switch (psp) {
1097 case POWER_SUPPLY_PROP_STATUS:
1098 val->intval = get_prop_batt_status(chip);
1099 break;
1100 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1101 val->intval = get_prop_charge_type(chip);
1102 break;
1103 case POWER_SUPPLY_PROP_HEALTH:
1104 val->intval = get_prop_batt_health(chip);
1105 break;
1106 case POWER_SUPPLY_PROP_PRESENT:
1107 val->intval = get_prop_batt_present(chip);
1108 break;
1109 case POWER_SUPPLY_PROP_TECHNOLOGY:
1110 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
1111 break;
1112 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
1113 val->intval = chip->max_voltage_mv * 1000;
1114 break;
1115 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
1116 val->intval = chip->min_voltage_mv * 1000;
1117 break;
1118 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
1119 val->intval = get_prop_battery_voltage_now(chip);
1120 break;
1121 case POWER_SUPPLY_PROP_TEMP:
1122 val->intval = get_prop_batt_temp(chip);
1123 break;
1124 case POWER_SUPPLY_PROP_CAPACITY:
1125 val->intval = get_prop_capacity(chip);
1126 break;
David Keitelabdf2872013-03-28 18:14:42 -07001127 case POWER_SUPPLY_PROP_CURRENT_MAX:
1128 val->intval = get_prop_current_max(chip);
1129 break;
David Keitel80668952012-07-27 14:25:49 -07001130 case POWER_SUPPLY_PROP_CURRENT_NOW:
1131 val->intval = get_prop_current_now(chip);
1132 break;
1133 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1134 val->intval = get_prop_full_design(chip);
1135 break;
David Keitelb80eda82012-10-15 10:49:11 -07001136 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitel03ee6b52012-10-22 12:25:19 -07001137 val->intval = !(chip->charging_disabled);
David Keitelb80eda82012-10-15 10:49:11 -07001138 break;
David Keitelbe208252013-01-31 14:49:25 -08001139 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
1140 val->intval = chip->therm_lvl_sel;
David Keitelb80eda82012-10-15 10:49:11 -07001141 break;
1142 default:
1143 return -EINVAL;
1144 }
1145
David Keitelb80eda82012-10-15 10:49:11 -07001146 return 0;
David Keitel80668952012-07-27 14:25:49 -07001147}
1148
David Keitel80668952012-07-27 14:25:49 -07001149#define QPNP_CHG_VINMIN_MIN_MV 3400
1150#define QPNP_CHG_VINMIN_HIGH_MIN_MV 5600
1151#define QPNP_CHG_VINMIN_HIGH_MIN_VAL 0x2B
1152#define QPNP_CHG_VINMIN_MAX_MV 9600
1153#define QPNP_CHG_VINMIN_STEP_MV 50
1154#define QPNP_CHG_VINMIN_STEP_HIGH_MV 200
1155#define QPNP_CHG_VINMIN_MASK 0x1F
1156static int
1157qpnp_chg_vinmin_set(struct qpnp_chg_chip *chip, int voltage)
1158{
1159 u8 temp;
1160
1161 if (voltage < QPNP_CHG_VINMIN_MIN_MV
1162 || voltage > QPNP_CHG_VINMIN_MAX_MV) {
1163 pr_err("bad mV=%d asked to set\n", voltage);
1164 return -EINVAL;
1165 }
1166 if (voltage >= QPNP_CHG_VINMIN_HIGH_MIN_MV) {
1167 temp = QPNP_CHG_VINMIN_HIGH_MIN_VAL;
1168 temp += (voltage - QPNP_CHG_VINMIN_MIN_MV)
1169 / QPNP_CHG_VINMIN_STEP_HIGH_MV;
1170 } else {
1171 temp = (voltage - QPNP_CHG_VINMIN_MIN_MV)
1172 / QPNP_CHG_VINMIN_STEP_MV;
1173 }
1174
1175 pr_debug("voltage=%d setting %02x\n", voltage, temp);
1176 return qpnp_chg_masked_write(chip,
1177 chip->chgr_base + CHGR_VIN_MIN,
1178 QPNP_CHG_VINMIN_MASK, temp, 1);
1179}
1180
David Keitel5d44fa52012-12-03 16:37:31 -08001181#define QPNP_CHG_IBATSAFE_MIN_MA 100
1182#define QPNP_CHG_IBATSAFE_MAX_MA 3250
1183#define QPNP_CHG_I_STEP_MA 50
1184#define QPNP_CHG_I_MIN_MA 100
1185#define QPNP_CHG_I_MASK 0x3F
1186static int
1187qpnp_chg_ibatsafe_set(struct qpnp_chg_chip *chip, int safe_current)
1188{
1189 u8 temp;
1190
1191 if (safe_current < QPNP_CHG_IBATSAFE_MIN_MA
1192 || safe_current > QPNP_CHG_IBATSAFE_MAX_MA) {
1193 pr_err("bad mA=%d asked to set\n", safe_current);
1194 return -EINVAL;
1195 }
1196
1197 temp = (safe_current - QPNP_CHG_IBATSAFE_MIN_MA)
1198 / QPNP_CHG_I_STEP_MA;
1199 return qpnp_chg_masked_write(chip,
1200 chip->chgr_base + CHGR_IBAT_SAFE,
1201 QPNP_CHG_I_MASK, temp, 1);
1202}
David Keitel80668952012-07-27 14:25:49 -07001203
1204#define QPNP_CHG_ITERM_MIN_MA 100
1205#define QPNP_CHG_ITERM_MAX_MA 250
1206#define QPNP_CHG_ITERM_STEP_MA 50
1207#define QPNP_CHG_ITERM_MASK 0x03
1208static int
1209qpnp_chg_ibatterm_set(struct qpnp_chg_chip *chip, int term_current)
1210{
1211 u8 temp;
1212
1213 if (term_current < QPNP_CHG_ITERM_MIN_MA
1214 || term_current > QPNP_CHG_ITERM_MAX_MA) {
1215 pr_err("bad mA=%d asked to set\n", term_current);
1216 return -EINVAL;
1217 }
1218
1219 temp = (term_current - QPNP_CHG_ITERM_MIN_MA)
1220 / QPNP_CHG_ITERM_STEP_MA;
1221 return qpnp_chg_masked_write(chip,
1222 chip->chgr_base + CHGR_IBAT_TERM_CHGR,
1223 QPNP_CHG_ITERM_MASK, temp, 1);
1224}
1225
1226#define QPNP_CHG_IBATMAX_MIN 100
1227#define QPNP_CHG_IBATMAX_MAX 3250
David Keitel80668952012-07-27 14:25:49 -07001228static int
1229qpnp_chg_ibatmax_set(struct qpnp_chg_chip *chip, int chg_current)
1230{
1231 u8 temp;
1232
1233 if (chg_current < QPNP_CHG_IBATMAX_MIN
1234 || chg_current > QPNP_CHG_IBATMAX_MAX) {
1235 pr_err("bad mA=%d asked to set\n", chg_current);
1236 return -EINVAL;
1237 }
1238 temp = (chg_current - QPNP_CHG_I_MIN_MA) / QPNP_CHG_I_STEP_MA;
1239 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_IBAT_MAX,
1240 QPNP_CHG_I_MASK, temp, 1);
1241}
1242
David Keitel5d44fa52012-12-03 16:37:31 -08001243#define QPNP_CHG_VBATDET_MIN_MV 3240
1244#define QPNP_CHG_VBATDET_MAX_MV 5780
1245#define QPNP_CHG_VBATDET_STEP_MV 20
1246static int
1247qpnp_chg_vbatdet_set(struct qpnp_chg_chip *chip, int vbatdet_mv)
1248{
1249 u8 temp;
1250
1251 if (vbatdet_mv < QPNP_CHG_VBATDET_MIN_MV
1252 || vbatdet_mv > QPNP_CHG_VBATDET_MAX_MV) {
1253 pr_err("bad mV=%d asked to set\n", vbatdet_mv);
1254 return -EINVAL;
1255 }
1256 temp = (vbatdet_mv - QPNP_CHG_VBATDET_MIN_MV)
1257 / QPNP_CHG_VBATDET_STEP_MV;
1258
1259 pr_debug("voltage=%d setting %02x\n", vbatdet_mv, temp);
1260 return qpnp_chg_write(chip, &temp,
1261 chip->chgr_base + CHGR_VBAT_DET, 1);
1262}
David Keitel80668952012-07-27 14:25:49 -07001263
1264#define QPNP_CHG_V_MIN_MV 3240
1265#define QPNP_CHG_V_MAX_MV 4500
1266#define QPNP_CHG_V_STEP_MV 10
1267static int
1268qpnp_chg_vddsafe_set(struct qpnp_chg_chip *chip, int voltage)
1269{
1270 u8 temp;
1271
1272 if (voltage < QPNP_CHG_V_MIN_MV
1273 || voltage > QPNP_CHG_V_MAX_MV) {
1274 pr_err("bad mV=%d asked to set\n", voltage);
1275 return -EINVAL;
1276 }
1277 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1278 pr_debug("voltage=%d setting %02x\n", voltage, temp);
1279 return qpnp_chg_write(chip, &temp,
1280 chip->chgr_base + CHGR_VDD_SAFE, 1);
1281}
1282
1283#define QPNP_CHG_VDDMAX_MIN 3400
1284static int
1285qpnp_chg_vddmax_set(struct qpnp_chg_chip *chip, int voltage)
1286{
1287 u8 temp = 0;
1288
1289 if (voltage < QPNP_CHG_VDDMAX_MIN
1290 || voltage > QPNP_CHG_V_MAX_MV) {
1291 pr_err("bad mV=%d asked to set\n", voltage);
1292 return -EINVAL;
1293 }
1294
1295 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1296
1297 pr_debug("voltage=%d setting %02x\n", voltage, temp);
David Keitel454ee842013-03-08 16:19:11 -08001298 return qpnp_chg_write(chip, &temp, chip->chgr_base + CHGR_VDD_MAX, 1);
1299}
1300
1301/* JEITA compliance logic */
1302static void
1303qpnp_chg_set_appropriate_vddmax(struct qpnp_chg_chip *chip)
1304{
1305 if (chip->bat_is_cool)
1306 qpnp_chg_vddmax_set(chip, chip->cool_bat_mv);
1307 else if (chip->bat_is_warm)
1308 qpnp_chg_vddmax_set(chip, chip->warm_bat_mv);
1309 else
1310 qpnp_chg_vddmax_set(chip, chip->max_voltage_mv);
1311}
1312
1313static void
1314qpnp_chg_set_appropriate_vbatdet(struct qpnp_chg_chip *chip)
1315{
1316 if (chip->bat_is_cool)
1317 qpnp_chg_vbatdet_set(chip, chip->cool_bat_mv
1318 - chip->resume_delta_mv);
1319 else if (chip->bat_is_warm)
1320 qpnp_chg_vbatdet_set(chip, chip->warm_bat_mv
1321 - chip->resume_delta_mv);
1322 else
1323 qpnp_chg_vbatdet_set(chip, chip->max_voltage_mv
1324 - chip->resume_delta_mv);
David Keitel80668952012-07-27 14:25:49 -07001325}
1326
David Keitelbe208252013-01-31 14:49:25 -08001327static void
1328qpnp_chg_set_appropriate_battery_current(struct qpnp_chg_chip *chip)
1329{
1330 unsigned int chg_current = chip->max_bat_chg_current;
1331
David Keitel454ee842013-03-08 16:19:11 -08001332 if (chip->bat_is_cool)
1333 chg_current = min(chg_current, chip->cool_bat_chg_ma);
1334
1335 if (chip->bat_is_warm)
1336 chg_current = min(chg_current, chip->warm_bat_chg_ma);
1337
David Keitelbe208252013-01-31 14:49:25 -08001338 if (chip->therm_lvl_sel != 0 && chip->thermal_mitigation)
1339 chg_current = min(chg_current,
1340 chip->thermal_mitigation[chip->therm_lvl_sel]);
1341
1342 pr_debug("setting %d mA\n", chg_current);
1343 qpnp_chg_ibatmax_set(chip, chg_current);
1344}
1345
1346static void
1347qpnp_batt_system_temp_level_set(struct qpnp_chg_chip *chip, int lvl_sel)
1348{
1349 if (lvl_sel >= 0 && lvl_sel < chip->thermal_levels) {
1350 chip->therm_lvl_sel = lvl_sel;
1351 if (lvl_sel == (chip->thermal_levels - 1)) {
1352 /* disable charging if highest value selected */
1353 qpnp_chg_buck_control(chip, 0);
1354 } else {
1355 qpnp_chg_buck_control(chip, 1);
1356 qpnp_chg_set_appropriate_battery_current(chip);
1357 }
1358 } else {
1359 pr_err("Unsupported level selected %d\n", lvl_sel);
1360 }
1361}
1362
David Keitel0c1a4532013-03-21 16:39:06 -07001363#define HYSTERISIS_DECIDEGC 20
David Keitel454ee842013-03-08 16:19:11 -08001364static void
1365qpnp_chg_adc_notification(enum qpnp_tm_state state, void *ctx)
1366{
1367 struct qpnp_chg_chip *chip = ctx;
1368 bool bat_warm = 0, bat_cool = 0;
David Keitel1219a802013-03-21 16:37:21 -07001369 int temp;
David Keitel454ee842013-03-08 16:19:11 -08001370
1371 if (state >= ADC_TM_STATE_NUM) {
1372 pr_err("invalid notification %d\n", state);
1373 return;
1374 }
1375
David Keitel1219a802013-03-21 16:37:21 -07001376 temp = get_prop_batt_temp(chip);
David Keitel454ee842013-03-08 16:19:11 -08001377
David Keitel1219a802013-03-21 16:37:21 -07001378 pr_debug("temp = %d state = %s\n", temp,
1379 state == ADC_TM_WARM_STATE ? "warm" : "cool");
1380
1381 if (state == ADC_TM_WARM_STATE) {
1382 if (temp > chip->warm_bat_decidegc) {
David Keitel454ee842013-03-08 16:19:11 -08001383 bat_warm = true;
1384 bat_cool = false;
1385 chip->adc_param.low_temp =
David Keitel0c1a4532013-03-21 16:39:06 -07001386 chip->warm_bat_decidegc - HYSTERISIS_DECIDEGC;
David Keitel1219a802013-03-21 16:37:21 -07001387 chip->adc_param.state_request =
1388 ADC_TM_COOL_THR_ENABLE;
1389 } else if (temp >
1390 chip->cool_bat_decidegc + HYSTERISIS_DECIDEGC){
David Keitel454ee842013-03-08 16:19:11 -08001391 bat_warm = false;
1392 bat_cool = false;
David Keitel1219a802013-03-21 16:37:21 -07001393
1394 chip->adc_param.low_temp = chip->cool_bat_decidegc;
David Keitel0c1a4532013-03-21 16:39:06 -07001395 chip->adc_param.high_temp = chip->warm_bat_decidegc;
David Keitel1219a802013-03-21 16:37:21 -07001396 chip->adc_param.state_request =
1397 ADC_TM_HIGH_LOW_THR_ENABLE;
David Keitel454ee842013-03-08 16:19:11 -08001398 }
1399 } else {
David Keitel1219a802013-03-21 16:37:21 -07001400 if (temp < chip->cool_bat_decidegc) {
David Keitel454ee842013-03-08 16:19:11 -08001401 bat_warm = false;
David Keitel1219a802013-03-21 16:37:21 -07001402 bat_cool = true;
David Keitel454ee842013-03-08 16:19:11 -08001403 chip->adc_param.high_temp =
David Keitel0c1a4532013-03-21 16:39:06 -07001404 chip->cool_bat_decidegc + HYSTERISIS_DECIDEGC;
David Keitel1219a802013-03-21 16:37:21 -07001405 chip->adc_param.state_request =
1406 ADC_TM_WARM_THR_ENABLE;
1407 } else if (temp >
1408 chip->warm_bat_decidegc - HYSTERISIS_DECIDEGC){
David Keitel454ee842013-03-08 16:19:11 -08001409 bat_warm = false;
David Keitel1219a802013-03-21 16:37:21 -07001410 bat_cool = false;
1411
David Keitel0c1a4532013-03-21 16:39:06 -07001412 chip->adc_param.low_temp = chip->cool_bat_decidegc;
David Keitel1219a802013-03-21 16:37:21 -07001413 chip->adc_param.high_temp = chip->warm_bat_decidegc;
1414 chip->adc_param.state_request =
1415 ADC_TM_HIGH_LOW_THR_ENABLE;
David Keitel454ee842013-03-08 16:19:11 -08001416 }
1417 }
1418
1419 if (chip->bat_is_cool ^ bat_cool || chip->bat_is_warm ^ bat_warm) {
David Keitel1219a802013-03-21 16:37:21 -07001420 chip->bat_is_cool = bat_cool;
1421 chip->bat_is_warm = bat_warm;
1422
David Keitel454ee842013-03-08 16:19:11 -08001423 /* set appropriate voltages and currents */
1424 qpnp_chg_set_appropriate_vddmax(chip);
1425 qpnp_chg_set_appropriate_battery_current(chip);
1426 qpnp_chg_set_appropriate_vbatdet(chip);
David Keitel454ee842013-03-08 16:19:11 -08001427 }
1428
David Keitel1219a802013-03-21 16:37:21 -07001429 if (qpnp_adc_tm_channel_measure(&chip->adc_param))
1430 pr_err("request ADC error\n");
David Keitel454ee842013-03-08 16:19:11 -08001431}
1432
David Keitelbe208252013-01-31 14:49:25 -08001433static int
1434qpnp_batt_power_set_property(struct power_supply *psy,
1435 enum power_supply_property psp,
1436 const union power_supply_propval *val)
1437{
1438 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
1439 batt_psy);
1440
1441 switch (psp) {
1442 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
1443 chip->charging_disabled = !(val->intval);
1444 qpnp_chg_charge_en(chip, !chip->charging_disabled);
1445 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
1446 break;
1447 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
1448 qpnp_batt_system_temp_level_set(chip, val->intval);
1449 break;
1450 default:
1451 return -EINVAL;
1452 }
1453
1454 power_supply_changed(&chip->batt_psy);
1455 return 0;
1456}
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001457
1458static void
1459qpnp_chg_setup_flags(struct qpnp_chg_chip *chip)
David Keiteld681cda2012-10-02 15:44:21 -07001460{
David Keitelfe51cb92013-04-02 19:42:58 -07001461 if (chip->revision > 0 && chip->type == SMBB)
David Keiteld681cda2012-10-02 15:44:21 -07001462 chip->flags |= CHG_FLAGS_VCP_WA;
1463}
1464
David Keitel80668952012-07-27 14:25:49 -07001465#define WDOG_EN_BIT BIT(7)
1466static int
1467qpnp_chg_hwinit(struct qpnp_chg_chip *chip, u8 subtype,
1468 struct spmi_resource *spmi_resource)
1469{
1470 int rc = 0;
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001471 u8 reg;
David Keitel80668952012-07-27 14:25:49 -07001472
1473 switch (subtype) {
1474 case SMBB_CHGR_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001475 case SMBBP_CHGR_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001476 chip->chg_done_irq = spmi_get_irq_byname(chip->spmi,
1477 spmi_resource, "chg-done");
1478 if (chip->chg_done_irq < 0) {
1479 pr_err("Unable to get chg_done irq\n");
1480 return -ENXIO;
1481 }
1482
David Keitel42ae0aa2013-03-08 16:20:10 -08001483 chip->chg_fastchg_irq = spmi_get_irq_byname(chip->spmi,
1484 spmi_resource, "fast-chg-on");
1485 if (chip->chg_fastchg_irq < 0) {
1486 pr_err("Unable to get fast-chg-on irq\n");
1487 return -ENXIO;
1488 }
1489
1490 chip->chg_trklchg_irq = spmi_get_irq_byname(chip->spmi,
1491 spmi_resource, "trkl-chg-on");
1492 if (chip->chg_trklchg_irq < 0) {
1493 pr_err("Unable to get trkl-chg-on irq\n");
1494 return -ENXIO;
1495 }
1496
David Keitel80668952012-07-27 14:25:49 -07001497 chip->chg_failed_irq = spmi_get_irq_byname(chip->spmi,
1498 spmi_resource, "chg-failed");
1499 if (chip->chg_failed_irq < 0) {
1500 pr_err("Unable to get chg_failed irq\n");
1501 return -ENXIO;
1502 }
David Keitel42ae0aa2013-03-08 16:20:10 -08001503
David Keitel80668952012-07-27 14:25:49 -07001504 rc |= devm_request_irq(chip->dev, chip->chg_done_irq,
1505 qpnp_chg_chgr_chg_done_irq_handler,
David Keitelc9ffe842013-01-25 19:37:51 -08001506 IRQF_TRIGGER_RISING,
1507 "chg_done", chip);
David Keitel80668952012-07-27 14:25:49 -07001508 if (rc < 0) {
1509 pr_err("Can't request %d chg_done for chg: %d\n",
1510 chip->chg_done_irq, rc);
1511 return -ENXIO;
1512 }
David Keitel42ae0aa2013-03-08 16:20:10 -08001513
David Keitel80668952012-07-27 14:25:49 -07001514 rc |= devm_request_irq(chip->dev, chip->chg_failed_irq,
1515 qpnp_chg_chgr_chg_failed_irq_handler,
1516 IRQF_TRIGGER_RISING, "chg_failed", chip);
1517 if (rc < 0) {
1518 pr_err("Can't request %d chg_failed chg: %d\n",
1519 chip->chg_failed_irq, rc);
1520 return -ENXIO;
1521 }
1522
David Keitel42ae0aa2013-03-08 16:20:10 -08001523 rc |= devm_request_irq(chip->dev, chip->chg_fastchg_irq,
1524 qpnp_chg_chgr_chg_fastchg_irq_handler,
David Keitelc9ffe842013-01-25 19:37:51 -08001525 IRQF_TRIGGER_RISING,
David Keitel42ae0aa2013-03-08 16:20:10 -08001526 "fast-chg-on", chip);
1527 if (rc < 0) {
1528 pr_err("Can't request %d fast-chg-on for chg: %d\n",
1529 chip->chg_fastchg_irq, rc);
1530 return -ENXIO;
1531 }
1532
1533 rc |= devm_request_irq(chip->dev, chip->chg_trklchg_irq,
1534 qpnp_chg_chgr_chg_trklchg_irq_handler,
1535 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1536 "fast-chg-on", chip);
1537 if (rc < 0) {
1538 pr_err("Can't request %d trkl-chg-on for chg: %d\n",
1539 chip->chg_trklchg_irq, rc);
1540 return -ENXIO;
1541 }
1542
David Keitel80668952012-07-27 14:25:49 -07001543 rc = qpnp_chg_vinmin_set(chip, chip->min_voltage_mv);
1544 if (rc) {
1545 pr_debug("failed setting min_voltage rc=%d\n", rc);
1546 return rc;
1547 }
1548 rc = qpnp_chg_vddmax_set(chip, chip->max_voltage_mv);
1549 if (rc) {
1550 pr_debug("failed setting max_voltage rc=%d\n", rc);
1551 return rc;
1552 }
1553 rc = qpnp_chg_vddsafe_set(chip, chip->safe_voltage_mv);
1554 if (rc) {
1555 pr_debug("failed setting safe_voltage rc=%d\n", rc);
1556 return rc;
1557 }
David Keitel454ee842013-03-08 16:19:11 -08001558 rc = qpnp_chg_vbatdet_set(chip,
1559 chip->max_voltage_mv - chip->resume_delta_mv);
David Keitel5d44fa52012-12-03 16:37:31 -08001560 if (rc) {
1561 pr_debug("failed setting resume_voltage rc=%d\n", rc);
1562 return rc;
1563 }
David Keitel80668952012-07-27 14:25:49 -07001564 rc = qpnp_chg_ibatmax_set(chip, chip->max_bat_chg_current);
1565 if (rc) {
1566 pr_debug("failed setting ibatmax rc=%d\n", rc);
1567 return rc;
1568 }
David Keitel365c4c42013-03-08 16:20:40 -08001569 if (chip->term_current) {
1570 rc = qpnp_chg_ibatterm_set(chip, chip->term_current);
1571 if (rc) {
1572 pr_debug("failed setting ibatterm rc=%d\n", rc);
1573 return rc;
1574 }
David Keitel80668952012-07-27 14:25:49 -07001575 }
David Keitel5d44fa52012-12-03 16:37:31 -08001576 rc = qpnp_chg_ibatsafe_set(chip, chip->safe_current);
1577 if (rc) {
1578 pr_debug("failed setting ibat_Safe rc=%d\n", rc);
1579 return rc;
1580 }
David Keitel80668952012-07-27 14:25:49 -07001581 /* HACK: Disable wdog */
1582 rc = qpnp_chg_masked_write(chip, chip->chgr_base + 0x62,
1583 0xFF, 0xA0, 1);
1584
David Keitel365c4c42013-03-08 16:20:40 -08001585 /* HACK: use digital EOC */
David Keitel80668952012-07-27 14:25:49 -07001586 rc = qpnp_chg_masked_write(chip, chip->chgr_base +
1587 CHGR_IBAT_TERM_CHGR,
David Keitel365c4c42013-03-08 16:20:40 -08001588 0x88, 0x80, 1);
David Keitel80668952012-07-27 14:25:49 -07001589
David Keitel42ae0aa2013-03-08 16:20:10 -08001590 enable_irq_wake(chip->chg_fastchg_irq);
1591 enable_irq_wake(chip->chg_trklchg_irq);
1592 enable_irq_wake(chip->chg_failed_irq);
David Keitel80668952012-07-27 14:25:49 -07001593 enable_irq_wake(chip->chg_done_irq);
1594 break;
1595 case SMBB_BUCK_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001596 case SMBBP_BUCK_SUBTYPE:
David Keitel9201df32013-01-10 18:38:34 -08001597 rc = qpnp_chg_masked_write(chip,
1598 chip->chgr_base + CHGR_BUCK_BCK_VBAT_REG_MODE,
1599 BUCK_VBAT_REG_NODE_SEL_BIT,
1600 BUCK_VBAT_REG_NODE_SEL_BIT, 1);
1601 if (rc) {
1602 pr_debug("failed to enable IR drop comp rc=%d\n", rc);
1603 return rc;
1604 }
David Keitel80668952012-07-27 14:25:49 -07001605 break;
1606 case SMBB_BAT_IF_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001607 case SMBBP_BAT_IF_SUBTYPE:
David Keitel42ae0aa2013-03-08 16:20:10 -08001608 chip->batt_pres_irq = spmi_get_irq_byname(chip->spmi,
1609 spmi_resource, "batt-pres");
1610 if (chip->batt_pres_irq < 0) {
1611 pr_err("Unable to get batt-pres irq\n");
1612 return -ENXIO;
1613 }
1614 rc = devm_request_irq(chip->dev, chip->batt_pres_irq,
1615 qpnp_chg_bat_if_batt_pres_irq_handler,
1616 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1617 "bat_if_batt_pres", chip);
1618 if (rc < 0) {
1619 pr_err("Can't request %d batt-pres irq for chg: %d\n",
1620 chip->batt_pres_irq, rc);
1621 return -ENXIO;
1622 }
1623
1624 enable_irq_wake(chip->batt_pres_irq);
David Keitel80668952012-07-27 14:25:49 -07001625 break;
1626 case SMBB_USB_CHGPTH_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001627 case SMBBP_USB_CHGPTH_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001628 chip->usbin_valid_irq = spmi_get_irq_byname(chip->spmi,
1629 spmi_resource, "usbin-valid");
1630 if (chip->usbin_valid_irq < 0) {
1631 pr_err("Unable to get usbin irq\n");
1632 return -ENXIO;
1633 }
1634 rc = devm_request_irq(chip->dev, chip->usbin_valid_irq,
1635 qpnp_chg_usb_usbin_valid_irq_handler,
1636 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1637 "chg_usbin_valid", chip);
1638 if (rc < 0) {
1639 pr_err("Can't request %d usbinvalid for chg: %d\n",
1640 chip->usbin_valid_irq, rc);
1641 return -ENXIO;
1642 }
1643
1644 enable_irq_wake(chip->usbin_valid_irq);
1645 chip->usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
1646 if (chip->usb_present) {
1647 rc = qpnp_chg_masked_write(chip,
1648 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1649 ENUM_T_STOP_BIT,
1650 ENUM_T_STOP_BIT, 1);
1651 if (rc) {
1652 pr_err("failed to write enum stop rc=%d\n", rc);
1653 return -ENXIO;
1654 }
1655 }
David Keiteld681cda2012-10-02 15:44:21 -07001656
1657 rc = qpnp_chg_masked_write(chip,
David Keitel5c3a7702012-12-20 11:13:21 -08001658 chip->usb_chgpth_base + USB_OVP_CTL,
1659 USB_VALID_DEB_20MS,
1660 USB_VALID_DEB_20MS, 1);
1661
1662 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -07001663 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1664 ENUM_T_STOP_BIT,
1665 ENUM_T_STOP_BIT, 1);
1666
David Keitel80668952012-07-27 14:25:49 -07001667 break;
1668 case SMBB_DC_CHGPTH_SUBTYPE:
David Keitel7450dcd2013-01-29 18:41:41 -08001669 chip->dcin_valid_irq = spmi_get_irq_byname(chip->spmi,
1670 spmi_resource, "dcin-valid");
1671 if (chip->dcin_valid_irq < 0) {
1672 pr_err("Unable to get dcin irq\n");
1673 return -ENXIO;
1674 }
1675 rc = devm_request_irq(chip->dev, chip->dcin_valid_irq,
1676 qpnp_chg_dc_dcin_valid_irq_handler,
1677 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1678 "chg_dcin_valid", chip);
1679 if (rc < 0) {
1680 pr_err("Can't request %d dcinvalid for chg: %d\n",
1681 chip->dcin_valid_irq, rc);
1682 return -ENXIO;
1683 }
1684
1685 enable_irq_wake(chip->dcin_valid_irq);
David Keitel80668952012-07-27 14:25:49 -07001686 break;
1687 case SMBB_BOOST_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001688 case SMBBP_BOOST_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001689 break;
1690 case SMBB_MISC_SUBTYPE:
David Keitelfe51cb92013-04-02 19:42:58 -07001691 chip->type = SMBB;
David Keitelf2170cc2013-02-20 17:49:03 -08001692 case SMBBP_MISC_SUBTYPE:
David Keitelfe51cb92013-04-02 19:42:58 -07001693 chip->type = SMBBP;
David Keitel80668952012-07-27 14:25:49 -07001694 pr_debug("Setting BOOT_DONE\n");
1695 rc = qpnp_chg_masked_write(chip,
1696 chip->misc_base + CHGR_MISC_BOOT_DONE,
1697 CHGR_BOOT_DONE, CHGR_BOOT_DONE, 1);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001698 rc = qpnp_chg_read(chip, &reg,
1699 chip->misc_base + MISC_REVISION2, 1);
1700 if (rc) {
1701 pr_err("failed to read revision register rc=%d\n", rc);
1702 return rc;
1703 }
David Keitel80668952012-07-27 14:25:49 -07001704
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001705 chip->revision = reg;
David Keitel80668952012-07-27 14:25:49 -07001706 break;
1707 default:
1708 pr_err("Invalid peripheral subtype\n");
1709 }
1710 return rc;
1711}
1712
1713static int __devinit
1714qpnp_charger_probe(struct spmi_device *spmi)
1715{
1716 u8 subtype;
1717 struct qpnp_chg_chip *chip;
1718 struct resource *resource;
1719 struct spmi_resource *spmi_resource;
Xiaozhe Shid5d21412013-02-06 17:14:41 -08001720 bool present;
David Keitel80668952012-07-27 14:25:49 -07001721 int rc = 0;
1722
1723 chip = kzalloc(sizeof *chip, GFP_KERNEL);
1724 if (chip == NULL) {
1725 pr_err("kzalloc() failed.\n");
1726 return -ENOMEM;
1727 }
1728
David Keitel80668952012-07-27 14:25:49 -07001729 chip->dev = &(spmi->dev);
1730 chip->spmi = spmi;
1731
1732 chip->usb_psy = power_supply_get_by_name("usb");
1733 if (!chip->usb_psy) {
1734 pr_err("usb supply not found deferring probe\n");
1735 rc = -EPROBE_DEFER;
1736 goto fail_chg_enable;
1737 }
1738
1739 /* Get the vddmax property */
David Keitele89d4782013-03-27 11:29:59 -07001740 rc = of_property_read_u32(spmi->dev.of_node, "qcom,vddmax-mv",
David Keitel80668952012-07-27 14:25:49 -07001741 &chip->max_voltage_mv);
David Keitel454ee842013-03-08 16:19:11 -08001742 if (rc) {
David Keitel80668952012-07-27 14:25:49 -07001743 pr_err("Error reading vddmax property %d\n", rc);
1744 goto fail_chg_enable;
1745 }
1746
1747 /* Get the vinmin property */
David Keitele89d4782013-03-27 11:29:59 -07001748 rc = of_property_read_u32(spmi->dev.of_node, "qcom,vinmin-mv",
David Keitel80668952012-07-27 14:25:49 -07001749 &chip->min_voltage_mv);
David Keitel454ee842013-03-08 16:19:11 -08001750 if (rc) {
David Keitel80668952012-07-27 14:25:49 -07001751 pr_err("Error reading vddmax property %d\n", rc);
1752 goto fail_chg_enable;
1753 }
1754
1755 /* Get the vddmax property */
David Keitele89d4782013-03-27 11:29:59 -07001756 rc = of_property_read_u32(spmi->dev.of_node, "qcom,vddsafe-mv",
David Keitel80668952012-07-27 14:25:49 -07001757 &chip->safe_voltage_mv);
David Keitel454ee842013-03-08 16:19:11 -08001758 if (rc) {
David Keitel80668952012-07-27 14:25:49 -07001759 pr_err("Error reading vddsave property %d\n", rc);
1760 goto fail_chg_enable;
1761 }
1762
David Keitel454ee842013-03-08 16:19:11 -08001763 /* Get the vbatdet-delta property */
David Keitel5d44fa52012-12-03 16:37:31 -08001764 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001765 "qcom,vbatdet-delta-mv",
David Keitel454ee842013-03-08 16:19:11 -08001766 &chip->resume_delta_mv);
1767 if (rc && rc != -EINVAL) {
1768 pr_err("Error reading vbatdet-delta property %d\n", rc);
David Keitel5d44fa52012-12-03 16:37:31 -08001769 goto fail_chg_enable;
1770 }
1771
1772 /* Get the ibatsafe property */
1773 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001774 "qcom,ibatsafe-ma",
David Keitel5d44fa52012-12-03 16:37:31 -08001775 &chip->safe_current);
1776 if (rc) {
1777 pr_err("Error reading ibatsafe property %d\n", rc);
1778 goto fail_chg_enable;
1779 }
1780
David Keitel80668952012-07-27 14:25:49 -07001781 /* Get the ibatterm property */
1782 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001783 "qcom,ibatterm-ma",
David Keitel80668952012-07-27 14:25:49 -07001784 &chip->term_current);
1785 if (rc && rc != -EINVAL) {
1786 pr_err("Error reading ibatterm property %d\n", rc);
1787 goto fail_chg_enable;
1788 }
1789
1790 /* Get the ibatmax property */
David Keitele89d4782013-03-27 11:29:59 -07001791 rc = of_property_read_u32(spmi->dev.of_node, "qcom,ibatmax-ma",
David Keitel80668952012-07-27 14:25:49 -07001792 &chip->max_bat_chg_current);
David Keitel22ed2232013-01-28 11:04:07 -08001793 if (rc) {
David Keitel454ee842013-03-08 16:19:11 -08001794 pr_err("Error reading ibatmax property %d\n", rc);
David Keitel22ed2232013-01-28 11:04:07 -08001795 goto fail_chg_enable;
1796 }
1797
1798 /* Get the maxinput-dc-ma property */
1799 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001800 "qcom,maxinput-dc-ma",
David Keitel22ed2232013-01-28 11:04:07 -08001801 &chip->maxinput_dc_ma);
1802 if (rc && rc != -EINVAL) {
1803 pr_err("Error reading maxinput-dc-ma property %d\n", rc);
1804 goto fail_chg_enable;
1805 }
1806
1807 /* Get the maxinput-usb-ma property */
1808 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001809 "qcom,maxinput-usb-ma",
David Keitel22ed2232013-01-28 11:04:07 -08001810 &chip->maxinput_usb_ma);
1811 if (rc && rc != -EINVAL) {
1812 pr_err("Error reading maxinput-usb-ma property %d\n", rc);
1813 goto fail_chg_enable;
1814 }
1815
David Keitelbf359042012-10-19 16:54:58 -07001816 /* Get the charging-disabled property */
David Keitel03ee6b52012-10-22 12:25:19 -07001817 chip->charging_disabled = of_property_read_bool(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001818 "qcom,charging-disabled");
David Keitelbf359042012-10-19 16:54:58 -07001819
David Keitel454ee842013-03-08 16:19:11 -08001820 /* Get the warm-bat-degc property */
1821 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001822 "qcom,warm-bat-decidegc",
David Keitel0c1a4532013-03-21 16:39:06 -07001823 &chip->warm_bat_decidegc);
David Keitel454ee842013-03-08 16:19:11 -08001824 if (rc && rc != -EINVAL) {
1825 pr_err("Error reading warm-bat-degc property %d\n", rc);
1826 goto fail_chg_enable;
1827 }
1828
1829 /* Get the cool-bat-degc property */
1830 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001831 "qcom,cool-bat-decidegc",
David Keitel0c1a4532013-03-21 16:39:06 -07001832 &chip->cool_bat_decidegc);
David Keitel454ee842013-03-08 16:19:11 -08001833 if (rc && rc != -EINVAL) {
1834 pr_err("Error reading cool-bat-degc property %d\n", rc);
1835 goto fail_chg_enable;
1836 }
1837
David Keitel0c1a4532013-03-21 16:39:06 -07001838 if (chip->cool_bat_decidegc && chip->warm_bat_decidegc) {
David Keitel454ee842013-03-08 16:19:11 -08001839 rc = qpnp_adc_tm_is_ready();
1840 if (rc) {
1841 pr_err("tm not ready %d\n", rc);
1842 goto fail_chg_enable;
1843 }
1844
1845 /* Get the ibatmax-warm property */
1846 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001847 "qcom,ibatmax-warm-ma",
David Keitel454ee842013-03-08 16:19:11 -08001848 &chip->warm_bat_chg_ma);
1849 if (rc) {
1850 pr_err("Error reading ibatmax-warm-ma %d\n", rc);
1851 goto fail_chg_enable;
1852 }
1853
1854 /* Get the ibatmax-cool property */
1855 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001856 "qcom,ibatmax-cool-ma",
David Keitel454ee842013-03-08 16:19:11 -08001857 &chip->cool_bat_chg_ma);
1858 if (rc) {
1859 pr_err("Error reading ibatmax-cool-ma %d\n", rc);
1860 goto fail_chg_enable;
1861 }
1862 /* Get the cool-bat-mv property */
1863 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001864 "qcom,cool-bat-mv",
David Keitel454ee842013-03-08 16:19:11 -08001865 &chip->cool_bat_mv);
1866 if (rc) {
1867 pr_err("Error reading cool-bat-mv property %d\n", rc);
1868 goto fail_chg_enable;
1869 }
1870
1871 /* Get the warm-bat-mv property */
1872 rc = of_property_read_u32(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001873 "qcom,warm-bat-mv",
David Keitel454ee842013-03-08 16:19:11 -08001874 &chip->warm_bat_mv);
1875 if (rc) {
1876 pr_err("Error reading warm-bat-mv property %d\n", rc);
1877 goto fail_chg_enable;
1878 }
1879 }
1880
David Keitel3dd5e0f2012-12-12 18:12:36 -08001881 /* Get the fake-batt-values property */
1882 chip->use_default_batt_values = of_property_read_bool(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001883 "qcom,use-default-batt-values");
David Keitel3dd5e0f2012-12-12 18:12:36 -08001884
David Keitele89d4782013-03-27 11:29:59 -07001885 of_get_property(spmi->dev.of_node, "qcom,thermal-mitigation",
David Keitelbe208252013-01-31 14:49:25 -08001886 &(chip->thermal_levels));
1887
1888 if (chip->thermal_levels > sizeof(int)) {
1889 chip->thermal_mitigation = kzalloc(
1890 chip->thermal_levels,
1891 GFP_KERNEL);
1892
1893 if (chip->thermal_mitigation == NULL) {
1894 pr_err("thermal mitigation kzalloc() failed.\n");
1895 goto fail_chg_enable;
1896 }
1897
1898 chip->thermal_levels /= sizeof(int);
1899 rc = of_property_read_u32_array(spmi->dev.of_node,
David Keitele89d4782013-03-27 11:29:59 -07001900 "qcom,thermal-mitigation",
David Keitelbe208252013-01-31 14:49:25 -08001901 chip->thermal_mitigation, chip->thermal_levels);
1902 if (rc) {
David Keitele89d4782013-03-27 11:29:59 -07001903 pr_err("qcom,thermal-mitigation missing in dt\n");
David Keitelbe208252013-01-31 14:49:25 -08001904 goto fail_chg_enable;
1905 }
1906 }
1907
David Keitel3dd5e0f2012-12-12 18:12:36 -08001908 /* Disable charging when faking battery values */
1909 if (chip->use_default_batt_values)
1910 chip->charging_disabled = true;
1911
David Keitel80668952012-07-27 14:25:49 -07001912 spmi_for_each_container_dev(spmi_resource, spmi) {
1913 if (!spmi_resource) {
1914 pr_err("qpnp_chg: spmi resource absent\n");
1915 rc = -ENXIO;
1916 goto fail_chg_enable;
1917 }
1918
1919 resource = spmi_get_resource(spmi, spmi_resource,
1920 IORESOURCE_MEM, 0);
1921 if (!(resource && resource->start)) {
1922 pr_err("node %s IO resource absent!\n",
1923 spmi->dev.of_node->full_name);
1924 rc = -ENXIO;
1925 goto fail_chg_enable;
1926 }
1927
1928 rc = qpnp_chg_read(chip, &subtype,
1929 resource->start + REG_OFFSET_PERP_SUBTYPE, 1);
1930 if (rc) {
1931 pr_err("Peripheral subtype read failed rc=%d\n", rc);
1932 goto fail_chg_enable;
1933 }
1934
1935 switch (subtype) {
1936 case SMBB_CHGR_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001937 case SMBBP_CHGR_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001938 chip->chgr_base = resource->start;
1939 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1940 if (rc) {
1941 pr_err("Failed to init subtype 0x%x rc=%d\n",
1942 subtype, rc);
1943 goto fail_chg_enable;
1944 }
1945 break;
1946 case SMBB_BUCK_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001947 case SMBBP_BUCK_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001948 chip->buck_base = resource->start;
1949 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1950 if (rc) {
1951 pr_err("Failed to init subtype 0x%x rc=%d\n",
1952 subtype, rc);
1953 goto fail_chg_enable;
1954 }
1955 break;
1956 case SMBB_BAT_IF_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001957 case SMBBP_BAT_IF_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001958 chip->bat_if_base = resource->start;
1959 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1960 if (rc) {
1961 pr_err("Failed to init subtype 0x%x rc=%d\n",
1962 subtype, rc);
1963 goto fail_chg_enable;
1964 }
1965 break;
1966 case SMBB_USB_CHGPTH_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001967 case SMBBP_USB_CHGPTH_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001968 chip->usb_chgpth_base = resource->start;
1969 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1970 if (rc) {
1971 pr_err("Failed to init subtype 0x%x rc=%d\n",
1972 subtype, rc);
1973 goto fail_chg_enable;
1974 }
1975 break;
1976 case SMBB_DC_CHGPTH_SUBTYPE:
1977 chip->dc_chgpth_base = resource->start;
1978 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1979 if (rc) {
1980 pr_err("Failed to init subtype 0x%x rc=%d\n",
1981 subtype, rc);
1982 goto fail_chg_enable;
1983 }
1984 break;
1985 case SMBB_BOOST_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001986 case SMBBP_BOOST_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001987 chip->boost_base = resource->start;
1988 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1989 if (rc) {
1990 pr_err("Failed to init subtype 0x%x rc=%d\n",
1991 subtype, rc);
1992 goto fail_chg_enable;
1993 }
1994 break;
1995 case SMBB_MISC_SUBTYPE:
David Keitelf2170cc2013-02-20 17:49:03 -08001996 case SMBBP_MISC_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001997 chip->misc_base = resource->start;
1998 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1999 if (rc) {
2000 pr_err("Failed to init subtype=0x%x rc=%d\n",
2001 subtype, rc);
2002 goto fail_chg_enable;
2003 }
2004 break;
2005 default:
2006 pr_err("Invalid peripheral subtype=0x%x\n", subtype);
2007 rc = -EINVAL;
2008 goto fail_chg_enable;
2009 }
2010 }
2011 dev_set_drvdata(&spmi->dev, chip);
2012 device_init_wakeup(&spmi->dev, 1);
2013
David Keitelf2170cc2013-02-20 17:49:03 -08002014 if (chip->bat_if_base) {
2015 rc = qpnp_vadc_is_ready();
2016 if (rc)
2017 goto fail_chg_enable;
David Keitel80668952012-07-27 14:25:49 -07002018
Xiaozhe Shid5d21412013-02-06 17:14:41 -08002019 /* if bms exists, notify it of the presence of the battery */
2020 if (!chip->bms_psy)
2021 chip->bms_psy = power_supply_get_by_name("bms");
2022 if (chip->bms_psy) {
2023 present = get_prop_batt_present(chip);
2024 power_supply_set_present(chip->bms_psy, present);
2025 }
2026
David Keitelf2170cc2013-02-20 17:49:03 -08002027 chip->batt_psy.name = "battery";
2028 chip->batt_psy.type = POWER_SUPPLY_TYPE_BATTERY;
2029 chip->batt_psy.properties = msm_batt_power_props;
2030 chip->batt_psy.num_properties =
2031 ARRAY_SIZE(msm_batt_power_props);
2032 chip->batt_psy.get_property = qpnp_batt_power_get_property;
2033 chip->batt_psy.set_property = qpnp_batt_power_set_property;
2034 chip->batt_psy.property_is_writeable =
2035 qpnp_batt_property_is_writeable;
2036 chip->batt_psy.external_power_changed =
David Keitel80668952012-07-27 14:25:49 -07002037 qpnp_batt_external_power_changed;
2038
David Keitelf2170cc2013-02-20 17:49:03 -08002039 rc = power_supply_register(chip->dev, &chip->batt_psy);
2040 if (rc < 0) {
2041 pr_err("batt failed to register rc = %d\n", rc);
2042 goto fail_chg_enable;
2043 }
David Keitel79f4c932013-04-03 16:08:39 -07002044 INIT_WORK(&chip->adc_measure_work,
2045 qpnp_bat_if_adc_measure_work);
David Keitelc7093b02013-02-14 12:50:04 -08002046 }
2047
David Keitelf2170cc2013-02-20 17:49:03 -08002048 if (chip->dc_chgpth_base) {
2049 chip->dc_psy.name = "qpnp-dc";
2050 chip->dc_psy.type = POWER_SUPPLY_TYPE_MAINS;
2051 chip->dc_psy.supplied_to = pm_power_supplied_to;
2052 chip->dc_psy.num_supplicants = ARRAY_SIZE(pm_power_supplied_to);
2053 chip->dc_psy.properties = pm_power_props_mains;
2054 chip->dc_psy.num_properties = ARRAY_SIZE(pm_power_props_mains);
2055 chip->dc_psy.get_property = qpnp_power_get_property_mains;
2056
2057 rc = power_supply_register(chip->dev, &chip->dc_psy);
2058 if (rc < 0) {
2059 pr_err("power_supply_register dc failed rc=%d\n", rc);
2060 goto unregister_batt;
2061 }
David Keitel80668952012-07-27 14:25:49 -07002062 }
2063
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08002064 /* Turn on appropriate workaround flags */
2065 qpnp_chg_setup_flags(chip);
2066
David Keitel80668952012-07-27 14:25:49 -07002067 power_supply_set_present(chip->usb_psy,
2068 qpnp_chg_is_usb_chg_plugged_in(chip));
2069
David Keitelf2170cc2013-02-20 17:49:03 -08002070 if (chip->maxinput_dc_ma && chip->dc_chgpth_base) {
David Keitel22ed2232013-01-28 11:04:07 -08002071 rc = qpnp_chg_idcmax_set(chip, chip->maxinput_dc_ma);
2072 if (rc) {
2073 pr_err("Error setting idcmax property %d\n", rc);
David Keitelf2170cc2013-02-20 17:49:03 -08002074 goto unregister_batt;
David Keitel22ed2232013-01-28 11:04:07 -08002075 }
2076 }
2077
David Keitel0c1a4532013-03-21 16:39:06 -07002078 if (chip->cool_bat_decidegc && chip->warm_bat_decidegc) {
2079 chip->adc_param.low_temp = chip->cool_bat_decidegc;
2080 chip->adc_param.high_temp = chip->warm_bat_decidegc;
David Keitel454ee842013-03-08 16:19:11 -08002081 chip->adc_param.timer_interval = ADC_MEAS2_INTERVAL_1S;
2082 chip->adc_param.state_request = ADC_TM_HIGH_LOW_THR_ENABLE;
2083 chip->adc_param.btm_ctx = chip;
2084 chip->adc_param.threshold_notification =
2085 qpnp_chg_adc_notification;
Siddartha Mohanadossa3e35512013-02-22 17:06:07 -08002086 chip->adc_param.channel = LR_MUX1_BATT_THERM;
David Keitel0c1a4532013-03-21 16:39:06 -07002087
2088 if (get_prop_batt_present(chip)) {
2089 rc = qpnp_adc_tm_channel_measure(&chip->adc_param);
2090 if (rc) {
2091 pr_err("request ADC error %d\n", rc);
2092 goto fail_chg_enable;
2093 }
David Keitel454ee842013-03-08 16:19:11 -08002094 }
2095 }
2096
David Keitel03ee6b52012-10-22 12:25:19 -07002097 qpnp_chg_charge_en(chip, !chip->charging_disabled);
David Keitelb1ddb742012-11-06 19:05:51 -08002098 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
David Keitelbf359042012-10-19 16:54:58 -07002099
Abhijeet Dharmapurikar2d996b12013-01-03 17:48:02 -08002100 pr_info("success chg_dis = %d, usb = %d, dc = %d b_health = %d batt_present = %d\n",
2101 chip->charging_disabled,
2102 qpnp_chg_is_usb_chg_plugged_in(chip),
2103 qpnp_chg_is_dc_chg_plugged_in(chip),
2104 get_prop_batt_present(chip),
2105 get_prop_batt_health(chip));
David Keitel80668952012-07-27 14:25:49 -07002106 return 0;
2107
David Keitelc7093b02013-02-14 12:50:04 -08002108unregister_batt:
David Keitelf2170cc2013-02-20 17:49:03 -08002109 if (chip->bat_if_base)
2110 power_supply_unregister(&chip->batt_psy);
David Keitel80668952012-07-27 14:25:49 -07002111fail_chg_enable:
David Keitelbe208252013-01-31 14:49:25 -08002112 kfree(chip->thermal_mitigation);
David Keitel80668952012-07-27 14:25:49 -07002113 kfree(chip);
2114 dev_set_drvdata(&spmi->dev, NULL);
2115 return rc;
2116}
2117
2118static int __devexit
2119qpnp_charger_remove(struct spmi_device *spmi)
2120{
2121 struct qpnp_chg_chip *chip = dev_get_drvdata(&spmi->dev);
David Keitel0c1a4532013-03-21 16:39:06 -07002122 if (chip->cool_bat_decidegc && chip->warm_bat_decidegc
2123 && chip->batt_present) {
2124 qpnp_adc_tm_disable_chan_meas(&chip->adc_param);
2125 }
David Keitel79f4c932013-04-03 16:08:39 -07002126 cancel_work_sync(&chip->adc_measure_work);
2127
David Keitel80668952012-07-27 14:25:49 -07002128 dev_set_drvdata(&spmi->dev, NULL);
2129 kfree(chip);
2130
2131 return 0;
2132}
2133
2134static struct spmi_driver qpnp_charger_driver = {
2135 .probe = qpnp_charger_probe,
2136 .remove = __devexit_p(qpnp_charger_remove),
2137 .driver = {
2138 .name = QPNP_CHARGER_DEV_NAME,
2139 .owner = THIS_MODULE,
2140 .of_match_table = qpnp_charger_match_table,
2141 },
2142};
2143
2144/**
2145 * qpnp_chg_init() - register spmi driver for qpnp-chg
2146 */
2147int __init
2148qpnp_chg_init(void)
2149{
2150 return spmi_driver_register(&qpnp_charger_driver);
2151}
2152module_init(qpnp_chg_init);
2153
2154static void __exit
2155qpnp_chg_exit(void)
2156{
2157 spmi_driver_unregister(&qpnp_charger_driver);
2158}
2159module_exit(qpnp_chg_exit);
2160
2161
2162MODULE_DESCRIPTION("QPNP charger driver");
2163MODULE_LICENSE("GPL v2");
2164MODULE_ALIAS("platform:" QPNP_CHARGER_DEV_NAME);