blob: e2ba0423667a679efb92bfea3128ef163e9bf6a6 [file] [log] [blame]
Abhijeet Dharmapurikar2d996b12013-01-03 17:48:02 -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>
27
28/* Interrupt offsets */
29#define INT_RT_STS(base) (base + 0x10)
30#define INT_SET_TYPE(base) (base + 0x11)
31#define INT_POLARITY_HIGH(base) (base + 0x12)
32#define INT_POLARITY_LOW(base) (base + 0x13)
33#define INT_LATCHED_CLR(base) (base + 0x14)
34#define INT_EN_SET(base) (base + 0x15)
35#define INT_EN_CLR(base) (base + 0x16)
36#define INT_LATCHED_STS(base) (base + 0x18)
37#define INT_PENDING_STS(base) (base + 0x19)
38#define INT_MID_SEL(base) (base + 0x1A)
39#define INT_PRIORITY(base) (base + 0x1B)
40
41/* Peripheral register offsets */
42#define CHGR_CHG_OPTION 0x08
43#define CHGR_ATC_STATUS 0x0A
44#define CHGR_VBAT_STATUS 0x0B
45#define CHGR_IBAT_BMS 0x0C
46#define CHGR_IBAT_STS 0x0D
47#define CHGR_VDD_MAX 0x40
48#define CHGR_VDD_SAFE 0x41
49#define CHGR_VDD_MAX_STEP 0x42
50#define CHGR_IBAT_MAX 0x44
51#define CHGR_IBAT_SAFE 0x45
52#define CHGR_VIN_MIN 0x47
53#define CHGR_VIN_MIN_STEP 0x48
54#define CHGR_CHG_CTRL 0x49
55#define CHGR_CHG_FAILED 0x4A
56#define CHGR_ATC_CTRL 0x4B
57#define CHGR_ATC_FAILED 0x4C
58#define CHGR_VBAT_TRKL 0x50
59#define CHGR_VBAT_WEAK 0x52
60#define CHGR_IBAT_ATC_A 0x54
61#define CHGR_IBAT_ATC_B 0x55
62#define CHGR_IBAT_TERM_CHGR 0x5B
63#define CHGR_IBAT_TERM_BMS 0x5C
64#define CHGR_VBAT_DET 0x5D
65#define CHGR_TTRKL_MAX 0x5F
66#define CHGR_TTRKL_MAX_EN 0x60
67#define CHGR_TCHG_MAX 0x61
68#define CHGR_CHG_WDOG_TIME 0x62
69#define CHGR_CHG_WDOG_DLY 0x63
70#define CHGR_CHG_WDOG_PET 0x64
71#define CHGR_CHG_WDOG_EN 0x65
David Keitel9201df32013-01-10 18:38:34 -080072#define CHGR_IR_DROP_COMPEN 0x67
David Keitel22ed2232013-01-28 11:04:07 -080073#define CHGR_I_MAX_REG 0x44
David Keiteld681cda2012-10-02 15:44:21 -070074#define CHGR_USB_USB_SUSP 0x47
David Keitel6f865cd2012-11-30 15:04:32 -080075#define CHGR_USB_USB_OTG_CTL 0x48
David Keitel80668952012-07-27 14:25:49 -070076#define CHGR_USB_ENUM_T_STOP 0x4E
77#define CHGR_CHG_TEMP_THRESH 0x66
78#define CHGR_BAT_IF_PRES_STATUS 0x08
David Keiteld681cda2012-10-02 15:44:21 -070079#define CHGR_STATUS 0x09
David Keitel80668952012-07-27 14:25:49 -070080#define CHGR_BAT_IF_VCP 0x42
81#define CHGR_BAT_IF_BATFET_CTRL1 0x90
82#define CHGR_MISC_BOOT_DONE 0x42
David Keiteld681cda2012-10-02 15:44:21 -070083#define CHGR_BUCK_COMPARATOR_OVRIDE_3 0xED
David Keitel9201df32013-01-10 18:38:34 -080084#define CHGR_BUCK_BCK_VBAT_REG_MODE 0x74
Sridhar Parasuramae183bd2012-12-21 09:28:46 -080085#define MISC_REVISION2 0x01
David Keitel5c3a7702012-12-20 11:13:21 -080086#define USB_OVP_CTL 0x42
David Keiteld681cda2012-10-02 15:44:21 -070087#define SEC_ACCESS 0xD0
David Keitel80668952012-07-27 14:25:49 -070088
89/* SMBB peripheral subtype values */
90#define REG_OFFSET_PERP_SUBTYPE 0x05
91#define SMBB_CHGR_SUBTYPE 0x01
92#define SMBB_BUCK_SUBTYPE 0x02
93#define SMBB_BAT_IF_SUBTYPE 0x03
94#define SMBB_USB_CHGPTH_SUBTYPE 0x04
95#define SMBB_DC_CHGPTH_SUBTYPE 0x05
96#define SMBB_BOOST_SUBTYPE 0x06
97#define SMBB_MISC_SUBTYPE 0x07
98
99#define QPNP_CHARGER_DEV_NAME "qcom,qpnp-charger"
100
David Keitelb80eda82012-10-15 10:49:11 -0700101/* Status bits and masks */
102#define CHGR_BOOT_DONE BIT(7)
103#define CHGR_CHG_EN BIT(7)
104#define CHGR_ON_BAT_FORCE_BIT BIT(0)
David Keitel5c3a7702012-12-20 11:13:21 -0800105#define USB_VALID_DEB_20MS 0x03
David Keitel9201df32013-01-10 18:38:34 -0800106#define BUCK_VBAT_REG_NODE_SEL_BIT BIT(0)
David Keitelb80eda82012-10-15 10:49:11 -0700107
David Keitel80668952012-07-27 14:25:49 -0700108/* Interrupt definitions */
109/* smbb_chg_interrupts */
110#define CHG_DONE_IRQ BIT(7)
111#define CHG_FAILED_IRQ BIT(6)
112#define FAST_CHG_ON_IRQ BIT(5)
113#define TRKL_CHG_ON_IRQ BIT(4)
114#define STATE_CHANGE_ON_IR BIT(3)
115#define CHGWDDOG_IRQ BIT(2)
116#define VBAT_DET_HI_IRQ BIT(1)
117#define VBAT_DET_LOW_IRQ BIT(0)
118
119/* smbb_buck_interrupts */
120#define VDD_LOOP_IRQ BIT(6)
121#define IBAT_LOOP_IRQ BIT(5)
122#define ICHG_LOOP_IRQ BIT(4)
123#define VCHG_LOOP_IRQ BIT(3)
124#define OVERTEMP_IRQ BIT(2)
125#define VREF_OV_IRQ BIT(1)
126#define VBAT_OV_IRQ BIT(0)
127
128/* smbb_bat_if_interrupts */
129#define PSI_IRQ BIT(4)
130#define VCP_ON_IRQ BIT(3)
131#define BAT_FET_ON_IRQ BIT(2)
132#define BAT_TEMP_OK_IRQ BIT(1)
133#define BATT_PRES_IRQ BIT(0)
134
135/* smbb_usb_interrupts */
136#define CHG_GONE_IRQ BIT(2)
137#define USBIN_VALID_IRQ BIT(1)
138#define COARSE_DET_USB_IRQ BIT(0)
139
140/* smbb_dc_interrupts */
141#define DCIN_VALID_IRQ BIT(1)
142#define COARSE_DET_DC_IRQ BIT(0)
143
144/* smbb_boost_interrupts */
145#define LIMIT_ERROR_IRQ BIT(1)
146#define BOOST_PWR_OK_IRQ BIT(0)
147
148/* smbb_misc_interrupts */
149#define TFTWDOG_IRQ BIT(0)
150
David Keiteld681cda2012-10-02 15:44:21 -0700151/* Workaround flags */
152#define CHG_FLAGS_VCP_WA BIT(0)
153
David Keitel80668952012-07-27 14:25:49 -0700154/**
155 * struct qpnp_chg_chip - device information
156 * @dev: device pointer to access the parent
157 * @spmi: spmi pointer to access spmi information
158 * @chgr_base: charger peripheral base address
159 * @buck_base: buck peripheral base address
160 * @bat_if_base: battery interface peripheral base address
161 * @usb_chgpth_base: USB charge path peripheral base address
162 * @dc_chgpth_base: DC charge path peripheral base address
163 * @boost_base: boost peripheral base address
164 * @misc_base: misc peripheral base address
165 * @freq_base: freq peripheral base address
166 * @chg_done: indicates that charging is completed
167 * @usb_present: present status of usb
168 * @dc_present: present status of dc
David Keitel3dd5e0f2012-12-12 18:12:36 -0800169 * @use_default_batt_values: flag to report default battery properties
David Keitel80668952012-07-27 14:25:49 -0700170 * @max_voltage_mv: the max volts the batt should be charged up to
David Keitel5d44fa52012-12-03 16:37:31 -0800171 * @min_voltage_mv: min battery voltage before turning the FET on
172 * @resume_voltage_mv: voltage at which the battery resumes charging
David Keitel80668952012-07-27 14:25:49 -0700173 * @term_current: the charging based term current
David Keitel5d44fa52012-12-03 16:37:31 -0800174 * @safe_current: battery safety current setting
David Keitel22ed2232013-01-28 11:04:07 -0800175 * @maxinput_usb_ma: Maximum Input current USB
176 * @maxinput_dc_ma: Maximum Input current DC
David Keitel80668952012-07-27 14:25:49 -0700177 * @revision: PMIC revision
David Keitelbe208252013-01-31 14:49:25 -0800178 * @thermal_levels amount of thermal mitigation levels
179 * @thermal_mitigation thermal mitigation level values
180 * @therm_lvl_sel thermal mitigation level selection
David Keitel80668952012-07-27 14:25:49 -0700181 * @dc_psy power supply to export information to userspace
182 * @usb_psy power supply to export information to userspace
183 * @bms_psy power supply to export information to userspace
184 * @batt_psy: power supply to export information to userspace
David Keiteld681cda2012-10-02 15:44:21 -0700185 * @flags: flags to activate specific workarounds
186 * throughout the driver
David Keitel80668952012-07-27 14:25:49 -0700187 *
188 */
189struct qpnp_chg_chip {
190 struct device *dev;
191 struct spmi_device *spmi;
192 u16 chgr_base;
193 u16 buck_base;
194 u16 bat_if_base;
195 u16 usb_chgpth_base;
196 u16 dc_chgpth_base;
197 u16 boost_base;
198 u16 misc_base;
199 u16 freq_base;
200 unsigned int usbin_valid_irq;
David Keitel7450dcd2013-01-29 18:41:41 -0800201 unsigned int dcin_valid_irq;
David Keitel80668952012-07-27 14:25:49 -0700202 unsigned int chg_done_irq;
203 unsigned int chg_failed_irq;
204 bool chg_done;
205 bool usb_present;
206 bool dc_present;
David Keitel03ee6b52012-10-22 12:25:19 -0700207 bool charging_disabled;
David Keitel3dd5e0f2012-12-12 18:12:36 -0800208 bool use_default_batt_values;
David Keitel80668952012-07-27 14:25:49 -0700209 unsigned int max_bat_chg_current;
210 unsigned int safe_voltage_mv;
211 unsigned int max_voltage_mv;
212 unsigned int min_voltage_mv;
David Keitel5d44fa52012-12-03 16:37:31 -0800213 unsigned int resume_voltage_mv;
David Keitel80668952012-07-27 14:25:49 -0700214 unsigned int term_current;
David Keitel22ed2232013-01-28 11:04:07 -0800215 unsigned int maxinput_usb_ma;
216 unsigned int maxinput_dc_ma;
David Keitel5d44fa52012-12-03 16:37:31 -0800217 unsigned int safe_current;
David Keitel80668952012-07-27 14:25:49 -0700218 unsigned int revision;
David Keitelbe208252013-01-31 14:49:25 -0800219 unsigned int thermal_levels;
220 unsigned int therm_lvl_sel;
221 unsigned int *thermal_mitigation;
David Keitel80668952012-07-27 14:25:49 -0700222 struct power_supply dc_psy;
223 struct power_supply *usb_psy;
224 struct power_supply *bms_psy;
225 struct power_supply batt_psy;
David Keiteld681cda2012-10-02 15:44:21 -0700226 uint32_t flags;
David Keitel80668952012-07-27 14:25:49 -0700227};
228
David Keitel80668952012-07-27 14:25:49 -0700229static struct of_device_id qpnp_charger_match_table[] = {
230 { .compatible = QPNP_CHARGER_DEV_NAME, },
231 {}
232};
233
234static int
235qpnp_chg_read(struct qpnp_chg_chip *chip, u8 *val,
236 u16 base, int count)
237{
238 int rc;
239 struct spmi_device *spmi = chip->spmi;
240
241 rc = spmi_ext_register_readl(spmi->ctrl, spmi->sid, base, val,
242 count);
243 if (rc) {
244 pr_err("SPMI read failed base=0x%02x sid=0x%02x rc=%d\n", base,
245 spmi->sid, rc);
246 return rc;
247 }
248 return 0;
249}
250
251static int
252qpnp_chg_write(struct qpnp_chg_chip *chip, u8 *val,
253 u16 base, int count)
254{
255 int rc;
256 struct spmi_device *spmi = chip->spmi;
257
258 rc = spmi_ext_register_writel(spmi->ctrl, spmi->sid, base, val,
259 count);
260 if (rc) {
261 pr_err("write failed base=0x%02x sid=0x%02x rc=%d\n",
262 base, spmi->sid, rc);
263 return rc;
264 }
265
266 return 0;
267}
268
269static int
270qpnp_chg_masked_write(struct qpnp_chg_chip *chip, u16 base,
271 u8 mask, u8 val, int count)
272{
273 int rc;
274 u8 reg;
275
276 rc = qpnp_chg_read(chip, &reg, base, count);
277 if (rc) {
278 pr_err("spmi read failed: addr=%03X, rc=%d\n", base, rc);
279 return rc;
280 }
281 pr_debug("addr = 0x%x read 0x%x\n", base, reg);
282
283 reg &= ~mask;
284 reg |= val & mask;
285
286 pr_debug("Writing 0x%x\n", reg);
287
288 rc = qpnp_chg_write(chip, &reg, base, count);
289 if (rc) {
290 pr_err("spmi write failed: addr=%03X, rc=%d\n", base, rc);
291 return rc;
292 }
293
294 return 0;
295}
296
David Keitel6f865cd2012-11-30 15:04:32 -0800297#define USB_OTG_EN_BIT BIT(0)
298static int
299qpnp_chg_is_otg_en_set(struct qpnp_chg_chip *chip)
300{
301 u8 usb_otg_en;
302 int rc;
303
304 rc = qpnp_chg_read(chip, &usb_otg_en,
305 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
306 1);
307
308 if (rc) {
309 pr_err("spmi read failed: addr=%03X, rc=%d\n",
310 chip->usb_chgpth_base + CHGR_STATUS, rc);
311 return rc;
312 }
313 pr_debug("usb otg en 0x%x\n", usb_otg_en);
314
315 return (usb_otg_en & USB_OTG_EN_BIT) ? 1 : 0;
316}
317
David Keiteld681cda2012-10-02 15:44:21 -0700318#define USB_VALID_BIT BIT(7)
David Keitel80668952012-07-27 14:25:49 -0700319static int
320qpnp_chg_is_usb_chg_plugged_in(struct qpnp_chg_chip *chip)
321{
322 u8 usbin_valid_rt_sts;
323 int rc;
324
325 rc = qpnp_chg_read(chip, &usbin_valid_rt_sts,
David Keiteld681cda2012-10-02 15:44:21 -0700326 chip->usb_chgpth_base + CHGR_STATUS , 1);
David Keitel80668952012-07-27 14:25:49 -0700327
328 if (rc) {
329 pr_err("spmi read failed: addr=%03X, rc=%d\n",
David Keiteld681cda2012-10-02 15:44:21 -0700330 chip->usb_chgpth_base + CHGR_STATUS, rc);
David Keitel80668952012-07-27 14:25:49 -0700331 return rc;
332 }
333 pr_debug("chgr usb sts 0x%x\n", usbin_valid_rt_sts);
334
David Keiteld681cda2012-10-02 15:44:21 -0700335 return (usbin_valid_rt_sts & USB_VALID_BIT) ? 1 : 0;
David Keitel80668952012-07-27 14:25:49 -0700336}
337
338static int
339qpnp_chg_is_dc_chg_plugged_in(struct qpnp_chg_chip *chip)
340{
341 u8 dcin_valid_rt_sts;
342 int rc;
343
344 rc = qpnp_chg_read(chip, &dcin_valid_rt_sts,
345 INT_RT_STS(chip->dc_chgpth_base), 1);
346 if (rc) {
347 pr_err("spmi read failed: addr=%03X, rc=%d\n",
348 INT_RT_STS(chip->dc_chgpth_base), rc);
349 return rc;
350 }
351
352 return (dcin_valid_rt_sts & DCIN_VALID_IRQ) ? 1 : 0;
353}
354
David Keitel22ed2232013-01-28 11:04:07 -0800355#define QPNP_CHG_I_MAX_MIN_100 100
356#define QPNP_CHG_I_MAX_MIN_150 150
357#define QPNP_CHG_I_MAX_MIN_MA 200
358#define QPNP_CHG_I_MAX_MAX_MA 2500
359#define QPNP_CHG_I_MAXSTEP_MA 100
360static int
361qpnp_chg_idcmax_set(struct qpnp_chg_chip *chip, int mA)
362{
363 int rc = 0;
364 u8 dc = 0;
365
366 if (mA < QPNP_CHG_I_MAX_MIN_100
367 || mA > QPNP_CHG_I_MAX_MAX_MA) {
368 pr_err("bad mA=%d asked to set\n", mA);
369 return -EINVAL;
370 }
371
372 if (mA == QPNP_CHG_I_MAX_MIN_100) {
373 dc = 0x00;
374 pr_debug("current=%d setting %02x\n", mA, dc);
375 return qpnp_chg_write(chip, &dc,
376 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
377 } else if (mA == QPNP_CHG_I_MAX_MIN_150) {
378 dc = 0x01;
379 pr_debug("current=%d setting %02x\n", mA, dc);
380 return qpnp_chg_write(chip, &dc,
381 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
382 }
383
384 dc = mA / QPNP_CHG_I_MAXSTEP_MA;
385
386 pr_debug("current=%d setting 0x%x\n", mA, dc);
387 rc = qpnp_chg_write(chip, &dc,
388 chip->dc_chgpth_base + CHGR_I_MAX_REG, 1);
389
390 return rc;
391}
392
David Keitel80668952012-07-27 14:25:49 -0700393static int
394qpnp_chg_iusbmax_set(struct qpnp_chg_chip *chip, int mA)
395{
David Keiteld681cda2012-10-02 15:44:21 -0700396 int rc = 0;
397 u8 usb_reg = 0, temp = 8;
David Keitel80668952012-07-27 14:25:49 -0700398
David Keitel22ed2232013-01-28 11:04:07 -0800399 if (mA < QPNP_CHG_I_MAX_MIN_100
400 || mA > QPNP_CHG_I_MAX_MAX_MA) {
David Keitel80668952012-07-27 14:25:49 -0700401 pr_err("bad mA=%d asked to set\n", mA);
402 return -EINVAL;
403 }
404
David Keitel22ed2232013-01-28 11:04:07 -0800405 if (mA == QPNP_CHG_I_MAX_MIN_100) {
406 usb_reg = 0x00;
407 pr_debug("current=%d setting %02x\n", mA, usb_reg);
408 return qpnp_chg_write(chip, &usb_reg,
409 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
410 } else if (mA == QPNP_CHG_I_MAX_MIN_150) {
411 usb_reg = 0x01;
412 pr_debug("current=%d setting %02x\n", mA, usb_reg);
413 return qpnp_chg_write(chip, &usb_reg,
414 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
415 }
416
417 /* Impose input current limit */
418 if (chip->maxinput_usb_ma)
419 mA = (chip->maxinput_usb_ma) <= mA ? chip->maxinput_usb_ma : mA;
420
421 usb_reg = mA / QPNP_CHG_I_MAXSTEP_MA;
David Keitel80668952012-07-27 14:25:49 -0700422
David Keiteld681cda2012-10-02 15:44:21 -0700423 if (chip->flags & CHG_FLAGS_VCP_WA) {
424 temp = 0xA5;
425 rc = qpnp_chg_write(chip, &temp,
426 chip->buck_base + SEC_ACCESS, 1);
427 rc = qpnp_chg_masked_write(chip,
428 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
429 0x0C, 0x0C, 1);
430 }
431
David Keitel80668952012-07-27 14:25:49 -0700432 pr_debug("current=%d setting 0x%x\n", mA, usb_reg);
David Keiteld681cda2012-10-02 15:44:21 -0700433 rc = qpnp_chg_write(chip, &usb_reg,
David Keitel22ed2232013-01-28 11:04:07 -0800434 chip->usb_chgpth_base + CHGR_I_MAX_REG, 1);
David Keiteld681cda2012-10-02 15:44:21 -0700435
436 if (chip->flags & CHG_FLAGS_VCP_WA) {
437 temp = 0xA5;
438 udelay(200);
439 rc = qpnp_chg_write(chip, &temp,
440 chip->buck_base + SEC_ACCESS, 1);
441 rc = qpnp_chg_masked_write(chip,
442 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
443 0x0C, 0x00, 1);
444 }
445
446 return rc;
447}
448
449#define USB_SUSPEND_BIT BIT(0)
450static int
451qpnp_chg_usb_suspend_enable(struct qpnp_chg_chip *chip, int enable)
452{
453 return qpnp_chg_masked_write(chip,
454 chip->usb_chgpth_base + CHGR_USB_USB_SUSP,
455 USB_SUSPEND_BIT,
456 enable ? USB_SUSPEND_BIT : 0, 1);
David Keitel80668952012-07-27 14:25:49 -0700457}
458
459#define ENUM_T_STOP_BIT BIT(0)
460static irqreturn_t
461qpnp_chg_usb_usbin_valid_irq_handler(int irq, void *_chip)
462{
463 struct qpnp_chg_chip *chip = _chip;
David Keitel6f865cd2012-11-30 15:04:32 -0800464 int usb_present, host_mode;
David Keitel80668952012-07-27 14:25:49 -0700465
466 usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
David Keitel6f865cd2012-11-30 15:04:32 -0800467 host_mode = qpnp_chg_is_otg_en_set(chip);
468 pr_debug("usbin-valid triggered: %d host_mode: %d\n",
469 usb_present, host_mode);
470
471 /* In host mode notifications cmoe from USB supply */
472 if (host_mode)
473 return IRQ_HANDLED;
David Keitel80668952012-07-27 14:25:49 -0700474
475 if (chip->usb_present ^ usb_present) {
476 chip->usb_present = usb_present;
Sridhar Parasuramae183bd2012-12-21 09:28:46 -0800477 power_supply_set_present(chip->usb_psy,
478 chip->usb_present);
David Keitel80668952012-07-27 14:25:49 -0700479 }
480
481 return IRQ_HANDLED;
482}
483
David Keitel7450dcd2013-01-29 18:41:41 -0800484static irqreturn_t
485qpnp_chg_dc_dcin_valid_irq_handler(int irq, void *_chip)
486{
487 struct qpnp_chg_chip *chip = _chip;
488 int dc_present;
489
490 dc_present = qpnp_chg_is_dc_chg_plugged_in(chip);
491 pr_debug("dcin-valid triggered: %d\n", dc_present);
492
493 if (chip->dc_present ^ dc_present) {
494 chip->dc_present = dc_present;
495 power_supply_changed(&chip->dc_psy);
496 }
497
498 return IRQ_HANDLED;
499}
500
David Keitel80668952012-07-27 14:25:49 -0700501#define CHGR_CHG_FAILED_BIT BIT(7)
502static irqreturn_t
503qpnp_chg_chgr_chg_failed_irq_handler(int irq, void *_chip)
504{
505 struct qpnp_chg_chip *chip = _chip;
David Keitel4429b1f2012-10-18 10:42:50 -0700506 int rc;
David Keitel80668952012-07-27 14:25:49 -0700507
508 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -0700509 chip->chgr_base + CHGR_CHG_FAILED,
David Keitel80668952012-07-27 14:25:49 -0700510 CHGR_CHG_FAILED_BIT,
511 CHGR_CHG_FAILED_BIT, 1);
512 if (rc)
513 pr_err("Failed to write chg_fail clear bit!\n");
514
David Keitel80668952012-07-27 14:25:49 -0700515 return IRQ_HANDLED;
516}
517
518static irqreturn_t
519qpnp_chg_chgr_chg_done_irq_handler(int irq, void *_chip)
520{
521 struct qpnp_chg_chip *chip = _chip;
522
523 pr_debug("CHG_DONE IRQ triggered\n");
524 chip->chg_done = true;
525
526 return IRQ_HANDLED;
527}
528
David Keitel03ee6b52012-10-22 12:25:19 -0700529static int
530qpnp_batt_property_is_writeable(struct power_supply *psy,
531 enum power_supply_property psp)
532{
533 switch (psp) {
534 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitelbe208252013-01-31 14:49:25 -0800535 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
David Keitel03ee6b52012-10-22 12:25:19 -0700536 return 1;
537 default:
538 break;
539 }
540
541 return 0;
542}
543
David Keitel6f865cd2012-11-30 15:04:32 -0800544static int
545qpnp_chg_charge_en(struct qpnp_chg_chip *chip, int enable)
546{
547 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
548 CHGR_CHG_EN,
549 enable ? CHGR_CHG_EN : 0, 1);
550}
551
552static int
553qpnp_chg_force_run_on_batt(struct qpnp_chg_chip *chip, int disable)
554{
David Keitelb2eaaee2012-12-19 14:53:28 -0800555 /* Don't run on battery for batteryless hardware */
556 if (chip->use_default_batt_values)
557 return 0;
558
David Keitel6f865cd2012-11-30 15:04:32 -0800559 /* This bit forces the charger to run off of the battery rather
560 * than a connected charger */
561 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
562 CHGR_ON_BAT_FORCE_BIT,
563 disable ? CHGR_ON_BAT_FORCE_BIT : 0, 1);
564}
565
David Keitelbe208252013-01-31 14:49:25 -0800566static int
567qpnp_chg_buck_control(struct qpnp_chg_chip *chip, int enable)
568{
569 int rc;
570
571 if (chip->charging_disabled && enable) {
572 pr_debug("Charging disabled\n");
573 return 0;
574 }
575
576 rc = qpnp_chg_charge_en(chip, enable);
577 if (rc) {
578 pr_err("Failed to control charging %d\n", rc);
579 return rc;
580 }
581
582 rc = qpnp_chg_force_run_on_batt(chip, !enable);
583 if (rc)
584 pr_err("Failed to control charging %d\n", rc);
585
586 return rc;
587}
588
David Keitel6f865cd2012-11-30 15:04:32 -0800589static
590int switch_usb_to_charge_mode(struct qpnp_chg_chip *chip)
591{
592 int rc;
593
594 pr_debug("switch to charge mode\n");
595 if (!qpnp_chg_is_otg_en_set(chip))
596 return 0;
597
598 /* enable usb ovp fet */
599 rc = qpnp_chg_masked_write(chip,
600 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
601 USB_OTG_EN_BIT,
602 0, 1);
603 if (rc) {
604 pr_err("Failed to turn on usb ovp rc = %d\n", rc);
605 return rc;
606 }
607
608 rc = qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
609 if (rc) {
610 pr_err("Failed re-enable charging rc = %d\n", rc);
611 return rc;
612 }
613
614 return 0;
615}
616
617static
618int switch_usb_to_host_mode(struct qpnp_chg_chip *chip)
619{
620 int rc;
621
622 pr_debug("switch to host mode\n");
623 if (qpnp_chg_is_otg_en_set(chip))
624 return 0;
625
626 rc = qpnp_chg_force_run_on_batt(chip, 1);
627 if (rc) {
628 pr_err("Failed to disable charging rc = %d\n", rc);
629 return rc;
630 }
631
632 /* force usb ovp fet off */
633 rc = qpnp_chg_masked_write(chip,
634 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
635 USB_OTG_EN_BIT,
636 USB_OTG_EN_BIT, 1);
637 if (rc) {
638 pr_err("Failed to turn off usb ovp rc = %d\n", rc);
639 return rc;
640 }
641
642 return 0;
643}
644
David Keitel80668952012-07-27 14:25:49 -0700645static enum power_supply_property pm_power_props_mains[] = {
646 POWER_SUPPLY_PROP_PRESENT,
647 POWER_SUPPLY_PROP_ONLINE,
648};
649
650static enum power_supply_property msm_batt_power_props[] = {
David Keitelb80eda82012-10-15 10:49:11 -0700651 POWER_SUPPLY_PROP_CHARGING_ENABLED,
David Keitel80668952012-07-27 14:25:49 -0700652 POWER_SUPPLY_PROP_STATUS,
653 POWER_SUPPLY_PROP_CHARGE_TYPE,
654 POWER_SUPPLY_PROP_HEALTH,
655 POWER_SUPPLY_PROP_PRESENT,
656 POWER_SUPPLY_PROP_TECHNOLOGY,
657 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
658 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
659 POWER_SUPPLY_PROP_VOLTAGE_NOW,
660 POWER_SUPPLY_PROP_CAPACITY,
661 POWER_SUPPLY_PROP_CURRENT_NOW,
662 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
663 POWER_SUPPLY_PROP_TEMP,
David Keitelbe208252013-01-31 14:49:25 -0800664 POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL,
David Keitel80668952012-07-27 14:25:49 -0700665};
666
667static char *pm_power_supplied_to[] = {
668 "battery",
669};
670
671#define USB_WALL_THRESHOLD_MA 500
672static int
673qpnp_power_get_property_mains(struct power_supply *psy,
674 enum power_supply_property psp,
675 union power_supply_propval *val)
676{
677 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
678 dc_psy);
679
680 switch (psp) {
681 case POWER_SUPPLY_PROP_PRESENT:
682 case POWER_SUPPLY_PROP_ONLINE:
683 val->intval = 0;
David Keitel03ee6b52012-10-22 12:25:19 -0700684 if (chip->charging_disabled)
David Keitel80668952012-07-27 14:25:49 -0700685 return 0;
686
687 val->intval = qpnp_chg_is_dc_chg_plugged_in(chip);
688 break;
689 default:
690 return -EINVAL;
691 }
692 return 0;
693}
694
695static int
696get_prop_battery_voltage_now(struct qpnp_chg_chip *chip)
697{
698 int rc = 0;
699 struct qpnp_vadc_result results;
700
701 if (chip->revision > 0) {
702 rc = qpnp_vadc_read(VBAT_SNS, &results);
703 if (rc) {
704 pr_err("Unable to read vbat rc=%d\n", rc);
705 return 0;
706 }
707 return results.physical;
708 } else {
709 pr_err("vbat reading not supported for 1.0 rc=%d\n", rc);
710 return 0;
711 }
712}
713
714#define BATT_PRES_BIT BIT(7)
715static int
716get_prop_batt_present(struct qpnp_chg_chip *chip)
717{
718 u8 batt_present;
719 int rc;
720
721 rc = qpnp_chg_read(chip, &batt_present,
722 chip->bat_if_base + CHGR_BAT_IF_PRES_STATUS, 1);
723 if (rc) {
724 pr_err("Couldn't read battery status read failed rc=%d\n", rc);
725 return 0;
726 };
727 return (batt_present & BATT_PRES_BIT) ? 1 : 0;
728}
729
730#define BATT_TEMP_HOT BIT(6)
731#define BATT_TEMP_OK BIT(7)
732static int
733get_prop_batt_health(struct qpnp_chg_chip *chip)
734{
735 u8 batt_health;
736 int rc;
737
738 rc = qpnp_chg_read(chip, &batt_health,
David Keiteld681cda2012-10-02 15:44:21 -0700739 chip->bat_if_base + CHGR_STATUS, 1);
David Keitel80668952012-07-27 14:25:49 -0700740 if (rc) {
741 pr_err("Couldn't read battery health read failed rc=%d\n", rc);
742 return POWER_SUPPLY_HEALTH_UNKNOWN;
743 };
744
745 if (BATT_TEMP_OK & batt_health)
746 return POWER_SUPPLY_HEALTH_GOOD;
747 if (BATT_TEMP_HOT & batt_health)
748 return POWER_SUPPLY_HEALTH_OVERHEAT;
749 else
750 return POWER_SUPPLY_HEALTH_COLD;
751}
752
753static int
754get_prop_charge_type(struct qpnp_chg_chip *chip)
755{
756 int rc;
757 u8 chgr_sts;
758
759 if (!get_prop_batt_present(chip))
760 return POWER_SUPPLY_CHARGE_TYPE_NONE;
761
762 rc = qpnp_chg_read(chip, &chgr_sts,
763 INT_RT_STS(chip->chgr_base), 1);
764 if (rc) {
765 pr_err("failed to read interrupt sts %d\n", rc);
766 return POWER_SUPPLY_CHARGE_TYPE_NONE;
767 }
768
769 if (chgr_sts & TRKL_CHG_ON_IRQ)
770 return POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
771 if (chgr_sts & FAST_CHG_ON_IRQ)
772 return POWER_SUPPLY_CHARGE_TYPE_FAST;
773
774 return POWER_SUPPLY_CHARGE_TYPE_NONE;
775}
776
777static int
778get_prop_batt_status(struct qpnp_chg_chip *chip)
779{
780 int rc;
781 u8 chgr_sts;
782
783 rc = qpnp_chg_read(chip, &chgr_sts,
784 INT_RT_STS(chip->chgr_base), 1);
785 if (rc) {
786 pr_err("failed to read interrupt sts %d\n", rc);
787 return POWER_SUPPLY_STATUS_DISCHARGING;
788 }
789
790 pr_debug("chgr sts 0x%x\n", chgr_sts);
791 if (chgr_sts & CHG_DONE_IRQ || chip->chg_done)
792 return POWER_SUPPLY_STATUS_FULL;
793 else
794 chip->chg_done = false;
795
796 if (chgr_sts & TRKL_CHG_ON_IRQ)
797 return POWER_SUPPLY_STATUS_CHARGING;
798 if (chgr_sts & FAST_CHG_ON_IRQ)
799 return POWER_SUPPLY_STATUS_CHARGING;
800
801 return POWER_SUPPLY_STATUS_DISCHARGING;
802}
803
804static int
805get_prop_current_now(struct qpnp_chg_chip *chip)
806{
807 union power_supply_propval ret = {0,};
808
809 if (chip->bms_psy) {
810 chip->bms_psy->get_property(chip->bms_psy,
811 POWER_SUPPLY_PROP_CURRENT_NOW, &ret);
812 return ret.intval;
813 } else {
814 pr_debug("No BMS supply registered return 0\n");
815 }
816
817 return 0;
818}
819
820static int
821get_prop_full_design(struct qpnp_chg_chip *chip)
822{
823 union power_supply_propval ret = {0,};
824
825 if (chip->bms_psy) {
826 chip->bms_psy->get_property(chip->bms_psy,
827 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, &ret);
828 return ret.intval;
829 } else {
830 pr_debug("No BMS supply registered return 0\n");
831 }
832
833 return 0;
834}
835
836#define DEFAULT_CAPACITY 50
837static int
838get_prop_capacity(struct qpnp_chg_chip *chip)
839{
840 union power_supply_propval ret = {0,};
841
David Keitel3dd5e0f2012-12-12 18:12:36 -0800842 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
843 return DEFAULT_CAPACITY;
844
David Keitel80668952012-07-27 14:25:49 -0700845 if (chip->bms_psy) {
846 chip->bms_psy->get_property(chip->bms_psy,
847 POWER_SUPPLY_PROP_CAPACITY, &ret);
848 return ret.intval;
849 } else {
850 pr_debug("No BMS supply registered return 50\n");
851 }
852
853 /* return default capacity to avoid userspace
854 * from shutting down unecessarily */
855 return DEFAULT_CAPACITY;
856}
857
David Keitel3dd5e0f2012-12-12 18:12:36 -0800858#define DEFAULT_TEMP 250
David Keitel80668952012-07-27 14:25:49 -0700859#define MAX_TOLERABLE_BATT_TEMP_DDC 680
860static int
861get_prop_batt_temp(struct qpnp_chg_chip *chip)
862{
863 int rc = 0;
864 struct qpnp_vadc_result results;
865
David Keitel3dd5e0f2012-12-12 18:12:36 -0800866 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
867 return DEFAULT_TEMP;
868
David Keitel80668952012-07-27 14:25:49 -0700869 if (chip->revision > 0) {
870 rc = qpnp_vadc_read(LR_MUX1_BATT_THERM, &results);
871 if (rc) {
872 pr_debug("Unable to read batt temperature rc=%d\n", rc);
873 return 0;
874 }
875 pr_debug("get_bat_temp %d %lld\n",
876 results.adc_code, results.physical);
877 return (int)results.physical;
878 } else {
879 pr_debug("batt temp not supported for PMIC 1.0 rc=%d\n", rc);
880 }
881
882 /* return default temperature to avoid userspace
883 * from shutting down unecessarily */
884 return DEFAULT_TEMP;
885}
886
887static void
888qpnp_batt_external_power_changed(struct power_supply *psy)
889{
890 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
891 batt_psy);
892 union power_supply_propval ret = {0,};
893
894 if (!chip->bms_psy)
895 chip->bms_psy = power_supply_get_by_name("bms");
896
897 chip->usb_psy->get_property(chip->usb_psy,
David Keitel6f865cd2012-11-30 15:04:32 -0800898 POWER_SUPPLY_PROP_SCOPE, &ret);
899 if (ret.intval) {
900 if ((ret.intval == POWER_SUPPLY_SCOPE_SYSTEM)
901 && !qpnp_chg_is_otg_en_set(chip)) {
902 switch_usb_to_host_mode(chip);
903 return;
904 }
905 if ((ret.intval == POWER_SUPPLY_SCOPE_DEVICE)
906 && qpnp_chg_is_otg_en_set(chip)) {
907 switch_usb_to_charge_mode(chip);
908 return;
909 }
910 }
911
912 chip->usb_psy->get_property(chip->usb_psy,
David Keitel80668952012-07-27 14:25:49 -0700913 POWER_SUPPLY_PROP_ONLINE, &ret);
914
915 if (ret.intval && qpnp_chg_is_usb_chg_plugged_in(chip)) {
916 chip->usb_psy->get_property(chip->usb_psy,
917 POWER_SUPPLY_PROP_CURRENT_MAX, &ret);
918 qpnp_chg_iusbmax_set(chip, ret.intval / 1000);
David Keitel22ed2232013-01-28 11:04:07 -0800919 if ((ret.intval / 1000) <= QPNP_CHG_I_MAX_MIN_MA)
David Keiteld681cda2012-10-02 15:44:21 -0700920 qpnp_chg_usb_suspend_enable(chip, 1);
921 else
922 qpnp_chg_usb_suspend_enable(chip, 0);
David Keitel80668952012-07-27 14:25:49 -0700923 } else {
David Keitel22ed2232013-01-28 11:04:07 -0800924 qpnp_chg_iusbmax_set(chip, QPNP_CHG_I_MAX_MIN_100);
David Keiteld681cda2012-10-02 15:44:21 -0700925 qpnp_chg_usb_suspend_enable(chip, 0);
David Keitel80668952012-07-27 14:25:49 -0700926 }
927
928 pr_debug("end of power supply changed\n");
929 power_supply_changed(&chip->batt_psy);
930}
931
932static int
933qpnp_batt_power_get_property(struct power_supply *psy,
934 enum power_supply_property psp,
935 union power_supply_propval *val)
936{
937 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
938 batt_psy);
939
940 switch (psp) {
941 case POWER_SUPPLY_PROP_STATUS:
942 val->intval = get_prop_batt_status(chip);
943 break;
944 case POWER_SUPPLY_PROP_CHARGE_TYPE:
945 val->intval = get_prop_charge_type(chip);
946 break;
947 case POWER_SUPPLY_PROP_HEALTH:
948 val->intval = get_prop_batt_health(chip);
949 break;
950 case POWER_SUPPLY_PROP_PRESENT:
951 val->intval = get_prop_batt_present(chip);
952 break;
953 case POWER_SUPPLY_PROP_TECHNOLOGY:
954 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
955 break;
956 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
957 val->intval = chip->max_voltage_mv * 1000;
958 break;
959 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
960 val->intval = chip->min_voltage_mv * 1000;
961 break;
962 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
963 val->intval = get_prop_battery_voltage_now(chip);
964 break;
965 case POWER_SUPPLY_PROP_TEMP:
966 val->intval = get_prop_batt_temp(chip);
967 break;
968 case POWER_SUPPLY_PROP_CAPACITY:
969 val->intval = get_prop_capacity(chip);
970 break;
971 case POWER_SUPPLY_PROP_CURRENT_NOW:
972 val->intval = get_prop_current_now(chip);
973 break;
974 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
975 val->intval = get_prop_full_design(chip);
976 break;
David Keitelb80eda82012-10-15 10:49:11 -0700977 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitel03ee6b52012-10-22 12:25:19 -0700978 val->intval = !(chip->charging_disabled);
David Keitelb80eda82012-10-15 10:49:11 -0700979 break;
David Keitelbe208252013-01-31 14:49:25 -0800980 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
981 val->intval = chip->therm_lvl_sel;
David Keitelb80eda82012-10-15 10:49:11 -0700982 break;
983 default:
984 return -EINVAL;
985 }
986
David Keitelb80eda82012-10-15 10:49:11 -0700987 return 0;
David Keitel80668952012-07-27 14:25:49 -0700988}
989
David Keitel80668952012-07-27 14:25:49 -0700990#define QPNP_CHG_VINMIN_MIN_MV 3400
991#define QPNP_CHG_VINMIN_HIGH_MIN_MV 5600
992#define QPNP_CHG_VINMIN_HIGH_MIN_VAL 0x2B
993#define QPNP_CHG_VINMIN_MAX_MV 9600
994#define QPNP_CHG_VINMIN_STEP_MV 50
995#define QPNP_CHG_VINMIN_STEP_HIGH_MV 200
996#define QPNP_CHG_VINMIN_MASK 0x1F
997static int
998qpnp_chg_vinmin_set(struct qpnp_chg_chip *chip, int voltage)
999{
1000 u8 temp;
1001
1002 if (voltage < QPNP_CHG_VINMIN_MIN_MV
1003 || voltage > QPNP_CHG_VINMIN_MAX_MV) {
1004 pr_err("bad mV=%d asked to set\n", voltage);
1005 return -EINVAL;
1006 }
1007 if (voltage >= QPNP_CHG_VINMIN_HIGH_MIN_MV) {
1008 temp = QPNP_CHG_VINMIN_HIGH_MIN_VAL;
1009 temp += (voltage - QPNP_CHG_VINMIN_MIN_MV)
1010 / QPNP_CHG_VINMIN_STEP_HIGH_MV;
1011 } else {
1012 temp = (voltage - QPNP_CHG_VINMIN_MIN_MV)
1013 / QPNP_CHG_VINMIN_STEP_MV;
1014 }
1015
1016 pr_debug("voltage=%d setting %02x\n", voltage, temp);
1017 return qpnp_chg_masked_write(chip,
1018 chip->chgr_base + CHGR_VIN_MIN,
1019 QPNP_CHG_VINMIN_MASK, temp, 1);
1020}
1021
David Keitel5d44fa52012-12-03 16:37:31 -08001022#define QPNP_CHG_IBATSAFE_MIN_MA 100
1023#define QPNP_CHG_IBATSAFE_MAX_MA 3250
1024#define QPNP_CHG_I_STEP_MA 50
1025#define QPNP_CHG_I_MIN_MA 100
1026#define QPNP_CHG_I_MASK 0x3F
1027static int
1028qpnp_chg_ibatsafe_set(struct qpnp_chg_chip *chip, int safe_current)
1029{
1030 u8 temp;
1031
1032 if (safe_current < QPNP_CHG_IBATSAFE_MIN_MA
1033 || safe_current > QPNP_CHG_IBATSAFE_MAX_MA) {
1034 pr_err("bad mA=%d asked to set\n", safe_current);
1035 return -EINVAL;
1036 }
1037
1038 temp = (safe_current - QPNP_CHG_IBATSAFE_MIN_MA)
1039 / QPNP_CHG_I_STEP_MA;
1040 return qpnp_chg_masked_write(chip,
1041 chip->chgr_base + CHGR_IBAT_SAFE,
1042 QPNP_CHG_I_MASK, temp, 1);
1043}
David Keitel80668952012-07-27 14:25:49 -07001044
1045#define QPNP_CHG_ITERM_MIN_MA 100
1046#define QPNP_CHG_ITERM_MAX_MA 250
1047#define QPNP_CHG_ITERM_STEP_MA 50
1048#define QPNP_CHG_ITERM_MASK 0x03
1049static int
1050qpnp_chg_ibatterm_set(struct qpnp_chg_chip *chip, int term_current)
1051{
1052 u8 temp;
1053
1054 if (term_current < QPNP_CHG_ITERM_MIN_MA
1055 || term_current > QPNP_CHG_ITERM_MAX_MA) {
1056 pr_err("bad mA=%d asked to set\n", term_current);
1057 return -EINVAL;
1058 }
1059
1060 temp = (term_current - QPNP_CHG_ITERM_MIN_MA)
1061 / QPNP_CHG_ITERM_STEP_MA;
1062 return qpnp_chg_masked_write(chip,
1063 chip->chgr_base + CHGR_IBAT_TERM_CHGR,
1064 QPNP_CHG_ITERM_MASK, temp, 1);
1065}
1066
1067#define QPNP_CHG_IBATMAX_MIN 100
1068#define QPNP_CHG_IBATMAX_MAX 3250
David Keitel80668952012-07-27 14:25:49 -07001069static int
1070qpnp_chg_ibatmax_set(struct qpnp_chg_chip *chip, int chg_current)
1071{
1072 u8 temp;
1073
1074 if (chg_current < QPNP_CHG_IBATMAX_MIN
1075 || chg_current > QPNP_CHG_IBATMAX_MAX) {
1076 pr_err("bad mA=%d asked to set\n", chg_current);
1077 return -EINVAL;
1078 }
1079 temp = (chg_current - QPNP_CHG_I_MIN_MA) / QPNP_CHG_I_STEP_MA;
1080 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_IBAT_MAX,
1081 QPNP_CHG_I_MASK, temp, 1);
1082}
1083
David Keitel5d44fa52012-12-03 16:37:31 -08001084#define QPNP_CHG_VBATDET_MIN_MV 3240
1085#define QPNP_CHG_VBATDET_MAX_MV 5780
1086#define QPNP_CHG_VBATDET_STEP_MV 20
1087static int
1088qpnp_chg_vbatdet_set(struct qpnp_chg_chip *chip, int vbatdet_mv)
1089{
1090 u8 temp;
1091
1092 if (vbatdet_mv < QPNP_CHG_VBATDET_MIN_MV
1093 || vbatdet_mv > QPNP_CHG_VBATDET_MAX_MV) {
1094 pr_err("bad mV=%d asked to set\n", vbatdet_mv);
1095 return -EINVAL;
1096 }
1097 temp = (vbatdet_mv - QPNP_CHG_VBATDET_MIN_MV)
1098 / QPNP_CHG_VBATDET_STEP_MV;
1099
1100 pr_debug("voltage=%d setting %02x\n", vbatdet_mv, temp);
1101 return qpnp_chg_write(chip, &temp,
1102 chip->chgr_base + CHGR_VBAT_DET, 1);
1103}
David Keitel80668952012-07-27 14:25:49 -07001104
1105#define QPNP_CHG_V_MIN_MV 3240
1106#define QPNP_CHG_V_MAX_MV 4500
1107#define QPNP_CHG_V_STEP_MV 10
1108static int
1109qpnp_chg_vddsafe_set(struct qpnp_chg_chip *chip, int voltage)
1110{
1111 u8 temp;
1112
1113 if (voltage < QPNP_CHG_V_MIN_MV
1114 || voltage > QPNP_CHG_V_MAX_MV) {
1115 pr_err("bad mV=%d asked to set\n", voltage);
1116 return -EINVAL;
1117 }
1118 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1119 pr_debug("voltage=%d setting %02x\n", voltage, temp);
1120 return qpnp_chg_write(chip, &temp,
1121 chip->chgr_base + CHGR_VDD_SAFE, 1);
1122}
1123
1124#define QPNP_CHG_VDDMAX_MIN 3400
1125static int
1126qpnp_chg_vddmax_set(struct qpnp_chg_chip *chip, int voltage)
1127{
1128 u8 temp = 0;
1129
1130 if (voltage < QPNP_CHG_VDDMAX_MIN
1131 || voltage > QPNP_CHG_V_MAX_MV) {
1132 pr_err("bad mV=%d asked to set\n", voltage);
1133 return -EINVAL;
1134 }
1135
1136 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1137
1138 pr_debug("voltage=%d setting %02x\n", voltage, temp);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001139 return qpnp_chg_write(chip, &temp,
1140 chip->chgr_base + CHGR_VDD_MAX, 1);
David Keitel80668952012-07-27 14:25:49 -07001141}
1142
David Keitelbe208252013-01-31 14:49:25 -08001143static void
1144qpnp_chg_set_appropriate_battery_current(struct qpnp_chg_chip *chip)
1145{
1146 unsigned int chg_current = chip->max_bat_chg_current;
1147
1148 if (chip->therm_lvl_sel != 0 && chip->thermal_mitigation)
1149 chg_current = min(chg_current,
1150 chip->thermal_mitigation[chip->therm_lvl_sel]);
1151
1152 pr_debug("setting %d mA\n", chg_current);
1153 qpnp_chg_ibatmax_set(chip, chg_current);
1154}
1155
1156static void
1157qpnp_batt_system_temp_level_set(struct qpnp_chg_chip *chip, int lvl_sel)
1158{
1159 if (lvl_sel >= 0 && lvl_sel < chip->thermal_levels) {
1160 chip->therm_lvl_sel = lvl_sel;
1161 if (lvl_sel == (chip->thermal_levels - 1)) {
1162 /* disable charging if highest value selected */
1163 qpnp_chg_buck_control(chip, 0);
1164 } else {
1165 qpnp_chg_buck_control(chip, 1);
1166 qpnp_chg_set_appropriate_battery_current(chip);
1167 }
1168 } else {
1169 pr_err("Unsupported level selected %d\n", lvl_sel);
1170 }
1171}
1172
1173static int
1174qpnp_batt_power_set_property(struct power_supply *psy,
1175 enum power_supply_property psp,
1176 const union power_supply_propval *val)
1177{
1178 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
1179 batt_psy);
1180
1181 switch (psp) {
1182 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
1183 chip->charging_disabled = !(val->intval);
1184 qpnp_chg_charge_en(chip, !chip->charging_disabled);
1185 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
1186 break;
1187 case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL:
1188 qpnp_batt_system_temp_level_set(chip, val->intval);
1189 break;
1190 default:
1191 return -EINVAL;
1192 }
1193
1194 power_supply_changed(&chip->batt_psy);
1195 return 0;
1196}
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001197
1198static void
1199qpnp_chg_setup_flags(struct qpnp_chg_chip *chip)
David Keiteld681cda2012-10-02 15:44:21 -07001200{
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001201 if (chip->revision > 0)
David Keiteld681cda2012-10-02 15:44:21 -07001202 chip->flags |= CHG_FLAGS_VCP_WA;
1203}
1204
David Keitel80668952012-07-27 14:25:49 -07001205#define WDOG_EN_BIT BIT(7)
1206static int
1207qpnp_chg_hwinit(struct qpnp_chg_chip *chip, u8 subtype,
1208 struct spmi_resource *spmi_resource)
1209{
1210 int rc = 0;
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001211 u8 reg;
David Keitel80668952012-07-27 14:25:49 -07001212
1213 switch (subtype) {
1214 case SMBB_CHGR_SUBTYPE:
1215 chip->chg_done_irq = spmi_get_irq_byname(chip->spmi,
1216 spmi_resource, "chg-done");
1217 if (chip->chg_done_irq < 0) {
1218 pr_err("Unable to get chg_done irq\n");
1219 return -ENXIO;
1220 }
1221
1222 chip->chg_failed_irq = spmi_get_irq_byname(chip->spmi,
1223 spmi_resource, "chg-failed");
1224 if (chip->chg_failed_irq < 0) {
1225 pr_err("Unable to get chg_failed irq\n");
1226 return -ENXIO;
1227 }
1228 rc |= devm_request_irq(chip->dev, chip->chg_done_irq,
1229 qpnp_chg_chgr_chg_done_irq_handler,
1230 IRQF_TRIGGER_RISING, "chg_done", chip);
1231 if (rc < 0) {
1232 pr_err("Can't request %d chg_done for chg: %d\n",
1233 chip->chg_done_irq, rc);
1234 return -ENXIO;
1235 }
1236 rc |= devm_request_irq(chip->dev, chip->chg_failed_irq,
1237 qpnp_chg_chgr_chg_failed_irq_handler,
1238 IRQF_TRIGGER_RISING, "chg_failed", chip);
1239 if (rc < 0) {
1240 pr_err("Can't request %d chg_failed chg: %d\n",
1241 chip->chg_failed_irq, rc);
1242 return -ENXIO;
1243 }
1244
1245 rc = qpnp_chg_vinmin_set(chip, chip->min_voltage_mv);
1246 if (rc) {
1247 pr_debug("failed setting min_voltage rc=%d\n", rc);
1248 return rc;
1249 }
1250 rc = qpnp_chg_vddmax_set(chip, chip->max_voltage_mv);
1251 if (rc) {
1252 pr_debug("failed setting max_voltage rc=%d\n", rc);
1253 return rc;
1254 }
1255 rc = qpnp_chg_vddsafe_set(chip, chip->safe_voltage_mv);
1256 if (rc) {
1257 pr_debug("failed setting safe_voltage rc=%d\n", rc);
1258 return rc;
1259 }
David Keitel5d44fa52012-12-03 16:37:31 -08001260 rc = qpnp_chg_vbatdet_set(chip, chip->resume_voltage_mv);
1261 if (rc) {
1262 pr_debug("failed setting resume_voltage rc=%d\n", rc);
1263 return rc;
1264 }
David Keitel80668952012-07-27 14:25:49 -07001265 rc = qpnp_chg_ibatmax_set(chip, chip->max_bat_chg_current);
1266 if (rc) {
1267 pr_debug("failed setting ibatmax rc=%d\n", rc);
1268 return rc;
1269 }
1270 rc = qpnp_chg_ibatterm_set(chip, chip->term_current);
1271 if (rc) {
1272 pr_debug("failed setting ibatterm rc=%d\n", rc);
1273 return rc;
1274 }
David Keitel5d44fa52012-12-03 16:37:31 -08001275 rc = qpnp_chg_ibatsafe_set(chip, chip->safe_current);
1276 if (rc) {
1277 pr_debug("failed setting ibat_Safe rc=%d\n", rc);
1278 return rc;
1279 }
David Keitel80668952012-07-27 14:25:49 -07001280 /* HACK: Disable wdog */
1281 rc = qpnp_chg_masked_write(chip, chip->chgr_base + 0x62,
1282 0xFF, 0xA0, 1);
1283
1284 /* HACK: use analog EOC */
1285 rc = qpnp_chg_masked_write(chip, chip->chgr_base +
1286 CHGR_IBAT_TERM_CHGR,
1287 0x80, 0x80, 1);
1288
1289 enable_irq_wake(chip->chg_done_irq);
1290 break;
1291 case SMBB_BUCK_SUBTYPE:
David Keitel9201df32013-01-10 18:38:34 -08001292 rc = qpnp_chg_masked_write(chip,
1293 chip->chgr_base + CHGR_BUCK_BCK_VBAT_REG_MODE,
1294 BUCK_VBAT_REG_NODE_SEL_BIT,
1295 BUCK_VBAT_REG_NODE_SEL_BIT, 1);
1296 if (rc) {
1297 pr_debug("failed to enable IR drop comp rc=%d\n", rc);
1298 return rc;
1299 }
David Keitel80668952012-07-27 14:25:49 -07001300 break;
1301 case SMBB_BAT_IF_SUBTYPE:
David Keitel80668952012-07-27 14:25:49 -07001302 break;
1303 case SMBB_USB_CHGPTH_SUBTYPE:
1304 chip->usbin_valid_irq = spmi_get_irq_byname(chip->spmi,
1305 spmi_resource, "usbin-valid");
1306 if (chip->usbin_valid_irq < 0) {
1307 pr_err("Unable to get usbin irq\n");
1308 return -ENXIO;
1309 }
1310 rc = devm_request_irq(chip->dev, chip->usbin_valid_irq,
1311 qpnp_chg_usb_usbin_valid_irq_handler,
1312 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1313 "chg_usbin_valid", chip);
1314 if (rc < 0) {
1315 pr_err("Can't request %d usbinvalid for chg: %d\n",
1316 chip->usbin_valid_irq, rc);
1317 return -ENXIO;
1318 }
1319
1320 enable_irq_wake(chip->usbin_valid_irq);
1321 chip->usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
1322 if (chip->usb_present) {
1323 rc = qpnp_chg_masked_write(chip,
1324 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1325 ENUM_T_STOP_BIT,
1326 ENUM_T_STOP_BIT, 1);
1327 if (rc) {
1328 pr_err("failed to write enum stop rc=%d\n", rc);
1329 return -ENXIO;
1330 }
1331 }
David Keiteld681cda2012-10-02 15:44:21 -07001332
1333 rc = qpnp_chg_masked_write(chip,
David Keitel5c3a7702012-12-20 11:13:21 -08001334 chip->usb_chgpth_base + USB_OVP_CTL,
1335 USB_VALID_DEB_20MS,
1336 USB_VALID_DEB_20MS, 1);
1337
1338 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -07001339 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1340 ENUM_T_STOP_BIT,
1341 ENUM_T_STOP_BIT, 1);
1342
David Keitel80668952012-07-27 14:25:49 -07001343 break;
1344 case SMBB_DC_CHGPTH_SUBTYPE:
David Keitel7450dcd2013-01-29 18:41:41 -08001345 chip->dcin_valid_irq = spmi_get_irq_byname(chip->spmi,
1346 spmi_resource, "dcin-valid");
1347 if (chip->dcin_valid_irq < 0) {
1348 pr_err("Unable to get dcin irq\n");
1349 return -ENXIO;
1350 }
1351 rc = devm_request_irq(chip->dev, chip->dcin_valid_irq,
1352 qpnp_chg_dc_dcin_valid_irq_handler,
1353 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1354 "chg_dcin_valid", chip);
1355 if (rc < 0) {
1356 pr_err("Can't request %d dcinvalid for chg: %d\n",
1357 chip->dcin_valid_irq, rc);
1358 return -ENXIO;
1359 }
1360
1361 enable_irq_wake(chip->dcin_valid_irq);
David Keitel80668952012-07-27 14:25:49 -07001362 break;
1363 case SMBB_BOOST_SUBTYPE:
1364 break;
1365 case SMBB_MISC_SUBTYPE:
1366 pr_debug("Setting BOOT_DONE\n");
1367 rc = qpnp_chg_masked_write(chip,
1368 chip->misc_base + CHGR_MISC_BOOT_DONE,
1369 CHGR_BOOT_DONE, CHGR_BOOT_DONE, 1);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001370 rc = qpnp_chg_read(chip, &reg,
1371 chip->misc_base + MISC_REVISION2, 1);
1372 if (rc) {
1373 pr_err("failed to read revision register rc=%d\n", rc);
1374 return rc;
1375 }
David Keitel80668952012-07-27 14:25:49 -07001376
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001377 chip->revision = reg;
David Keitel80668952012-07-27 14:25:49 -07001378 break;
1379 default:
1380 pr_err("Invalid peripheral subtype\n");
1381 }
1382 return rc;
1383}
1384
1385static int __devinit
1386qpnp_charger_probe(struct spmi_device *spmi)
1387{
1388 u8 subtype;
1389 struct qpnp_chg_chip *chip;
1390 struct resource *resource;
1391 struct spmi_resource *spmi_resource;
1392 int rc = 0;
1393
1394 chip = kzalloc(sizeof *chip, GFP_KERNEL);
1395 if (chip == NULL) {
1396 pr_err("kzalloc() failed.\n");
1397 return -ENOMEM;
1398 }
1399
1400 rc = qpnp_vadc_is_ready();
1401 if (rc)
1402 goto fail_chg_enable;
1403
1404 chip->dev = &(spmi->dev);
1405 chip->spmi = spmi;
1406
1407 chip->usb_psy = power_supply_get_by_name("usb");
1408 if (!chip->usb_psy) {
1409 pr_err("usb supply not found deferring probe\n");
1410 rc = -EPROBE_DEFER;
1411 goto fail_chg_enable;
1412 }
1413
1414 /* Get the vddmax property */
1415 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vddmax-mv",
1416 &chip->max_voltage_mv);
1417 if (rc && rc != -EINVAL) {
1418 pr_err("Error reading vddmax property %d\n", rc);
1419 goto fail_chg_enable;
1420 }
1421
1422 /* Get the vinmin property */
1423 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vinmin-mv",
1424 &chip->min_voltage_mv);
1425 if (rc && rc != -EINVAL) {
1426 pr_err("Error reading vddmax property %d\n", rc);
1427 goto fail_chg_enable;
1428 }
1429
1430 /* Get the vddmax property */
1431 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vddsafe-mv",
1432 &chip->safe_voltage_mv);
1433 if (rc && rc != -EINVAL) {
1434 pr_err("Error reading vddsave property %d\n", rc);
1435 goto fail_chg_enable;
1436 }
1437
David Keitel5d44fa52012-12-03 16:37:31 -08001438 /* Get the ibatsafe property */
1439 rc = of_property_read_u32(spmi->dev.of_node,
1440 "qcom,chg-vbatdet-mv",
1441 &chip->resume_voltage_mv);
1442 if (rc) {
1443 pr_err("Error reading vbatdet property %d\n", rc);
1444 goto fail_chg_enable;
1445 }
1446
1447 /* Get the ibatsafe property */
1448 rc = of_property_read_u32(spmi->dev.of_node,
1449 "qcom,chg-ibatsafe-ma",
1450 &chip->safe_current);
1451 if (rc) {
1452 pr_err("Error reading ibatsafe property %d\n", rc);
1453 goto fail_chg_enable;
1454 }
1455
David Keitel80668952012-07-27 14:25:49 -07001456 /* Get the ibatterm property */
1457 rc = of_property_read_u32(spmi->dev.of_node,
1458 "qcom,chg-ibatterm-ma",
1459 &chip->term_current);
1460 if (rc && rc != -EINVAL) {
1461 pr_err("Error reading ibatterm property %d\n", rc);
1462 goto fail_chg_enable;
1463 }
1464
1465 /* Get the ibatmax property */
1466 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-ibatmax-ma",
1467 &chip->max_bat_chg_current);
1468 if (rc && rc != -EINVAL) {
1469 pr_err("Error reading ibatmax property %d\n", rc);
1470 goto fail_chg_enable;
1471 }
1472
David Keitel22ed2232013-01-28 11:04:07 -08001473 /* Get the ibatsafe property */
1474 rc = of_property_read_u32(spmi->dev.of_node,
1475 "qcom,chg-vbatdet-mv",
1476 &chip->resume_voltage_mv);
1477 if (rc) {
1478 pr_err("Error reading vbatdet property %d\n", rc);
1479 goto fail_chg_enable;
1480 }
1481
1482 /* Get the maxinput-dc-ma property */
1483 rc = of_property_read_u32(spmi->dev.of_node,
1484 "qcom,chg-maxinput-dc-ma",
1485 &chip->maxinput_dc_ma);
1486 if (rc && rc != -EINVAL) {
1487 pr_err("Error reading maxinput-dc-ma property %d\n", rc);
1488 goto fail_chg_enable;
1489 }
1490
1491 /* Get the maxinput-usb-ma property */
1492 rc = of_property_read_u32(spmi->dev.of_node,
1493 "qcom,chg-maxinput-usb-ma",
1494 &chip->maxinput_usb_ma);
1495 if (rc && rc != -EINVAL) {
1496 pr_err("Error reading maxinput-usb-ma property %d\n", rc);
1497 goto fail_chg_enable;
1498 }
1499
David Keitelbf359042012-10-19 16:54:58 -07001500 /* Get the charging-disabled property */
David Keitel03ee6b52012-10-22 12:25:19 -07001501 chip->charging_disabled = of_property_read_bool(spmi->dev.of_node,
David Keitelbf359042012-10-19 16:54:58 -07001502 "qcom,chg-charging-disabled");
1503
David Keitel3dd5e0f2012-12-12 18:12:36 -08001504 /* Get the fake-batt-values property */
1505 chip->use_default_batt_values = of_property_read_bool(spmi->dev.of_node,
1506 "qcom,chg-use-default-batt-values");
1507
David Keitelbe208252013-01-31 14:49:25 -08001508 of_get_property(spmi->dev.of_node, "qcom,chg-thermal-mitigation",
1509 &(chip->thermal_levels));
1510
1511 if (chip->thermal_levels > sizeof(int)) {
1512 chip->thermal_mitigation = kzalloc(
1513 chip->thermal_levels,
1514 GFP_KERNEL);
1515
1516 if (chip->thermal_mitigation == NULL) {
1517 pr_err("thermal mitigation kzalloc() failed.\n");
1518 goto fail_chg_enable;
1519 }
1520
1521 chip->thermal_levels /= sizeof(int);
1522 rc = of_property_read_u32_array(spmi->dev.of_node,
1523 "qcom,chg-thermal-mitigation",
1524 chip->thermal_mitigation, chip->thermal_levels);
1525 if (rc) {
1526 pr_err("qcom,chg-thermal-mitigation missing in dt\n");
1527 goto fail_chg_enable;
1528 }
1529 }
1530
David Keitel3dd5e0f2012-12-12 18:12:36 -08001531 /* Disable charging when faking battery values */
1532 if (chip->use_default_batt_values)
1533 chip->charging_disabled = true;
1534
David Keitel80668952012-07-27 14:25:49 -07001535 spmi_for_each_container_dev(spmi_resource, spmi) {
1536 if (!spmi_resource) {
1537 pr_err("qpnp_chg: spmi resource absent\n");
1538 rc = -ENXIO;
1539 goto fail_chg_enable;
1540 }
1541
1542 resource = spmi_get_resource(spmi, spmi_resource,
1543 IORESOURCE_MEM, 0);
1544 if (!(resource && resource->start)) {
1545 pr_err("node %s IO resource absent!\n",
1546 spmi->dev.of_node->full_name);
1547 rc = -ENXIO;
1548 goto fail_chg_enable;
1549 }
1550
1551 rc = qpnp_chg_read(chip, &subtype,
1552 resource->start + REG_OFFSET_PERP_SUBTYPE, 1);
1553 if (rc) {
1554 pr_err("Peripheral subtype read failed rc=%d\n", rc);
1555 goto fail_chg_enable;
1556 }
1557
1558 switch (subtype) {
1559 case SMBB_CHGR_SUBTYPE:
1560 chip->chgr_base = resource->start;
1561 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1562 if (rc) {
1563 pr_err("Failed to init subtype 0x%x rc=%d\n",
1564 subtype, rc);
1565 goto fail_chg_enable;
1566 }
1567 break;
1568 case SMBB_BUCK_SUBTYPE:
1569 chip->buck_base = resource->start;
1570 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1571 if (rc) {
1572 pr_err("Failed to init subtype 0x%x rc=%d\n",
1573 subtype, rc);
1574 goto fail_chg_enable;
1575 }
1576 break;
1577 case SMBB_BAT_IF_SUBTYPE:
1578 chip->bat_if_base = resource->start;
1579 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1580 if (rc) {
1581 pr_err("Failed to init subtype 0x%x rc=%d\n",
1582 subtype, rc);
1583 goto fail_chg_enable;
1584 }
1585 break;
1586 case SMBB_USB_CHGPTH_SUBTYPE:
1587 chip->usb_chgpth_base = resource->start;
1588 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1589 if (rc) {
1590 pr_err("Failed to init subtype 0x%x rc=%d\n",
1591 subtype, rc);
1592 goto fail_chg_enable;
1593 }
1594 break;
1595 case SMBB_DC_CHGPTH_SUBTYPE:
1596 chip->dc_chgpth_base = resource->start;
1597 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1598 if (rc) {
1599 pr_err("Failed to init subtype 0x%x rc=%d\n",
1600 subtype, rc);
1601 goto fail_chg_enable;
1602 }
1603 break;
1604 case SMBB_BOOST_SUBTYPE:
1605 chip->boost_base = resource->start;
1606 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1607 if (rc) {
1608 pr_err("Failed to init subtype 0x%x rc=%d\n",
1609 subtype, rc);
1610 goto fail_chg_enable;
1611 }
1612 break;
1613 case SMBB_MISC_SUBTYPE:
1614 chip->misc_base = resource->start;
1615 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1616 if (rc) {
1617 pr_err("Failed to init subtype=0x%x rc=%d\n",
1618 subtype, rc);
1619 goto fail_chg_enable;
1620 }
1621 break;
1622 default:
1623 pr_err("Invalid peripheral subtype=0x%x\n", subtype);
1624 rc = -EINVAL;
1625 goto fail_chg_enable;
1626 }
1627 }
1628 dev_set_drvdata(&spmi->dev, chip);
1629 device_init_wakeup(&spmi->dev, 1);
1630
1631 chip->dc_psy.name = "qpnp-dc";
1632 chip->dc_psy.type = POWER_SUPPLY_TYPE_MAINS;
1633 chip->dc_psy.supplied_to = pm_power_supplied_to;
1634 chip->dc_psy.num_supplicants = ARRAY_SIZE(pm_power_supplied_to);
1635 chip->dc_psy.properties = pm_power_props_mains;
1636 chip->dc_psy.num_properties = ARRAY_SIZE(pm_power_props_mains);
1637 chip->dc_psy.get_property = qpnp_power_get_property_mains;
1638
1639 chip->batt_psy.name = "battery";
1640 chip->batt_psy.type = POWER_SUPPLY_TYPE_BATTERY;
1641 chip->batt_psy.properties = msm_batt_power_props;
1642 chip->batt_psy.num_properties = ARRAY_SIZE(msm_batt_power_props);
1643 chip->batt_psy.get_property = qpnp_batt_power_get_property;
David Keitelb80eda82012-10-15 10:49:11 -07001644 chip->batt_psy.set_property = qpnp_batt_power_set_property;
David Keitel03ee6b52012-10-22 12:25:19 -07001645 chip->batt_psy.property_is_writeable = qpnp_batt_property_is_writeable;
David Keitel80668952012-07-27 14:25:49 -07001646 chip->batt_psy.external_power_changed =
1647 qpnp_batt_external_power_changed;
1648
David Keitel80668952012-07-27 14:25:49 -07001649 rc = power_supply_register(chip->dev, &chip->batt_psy);
1650 if (rc < 0) {
1651 pr_err("power_supply_register batt failed rc = %d\n", rc);
David Keitelc7093b02013-02-14 12:50:04 -08001652 goto fail_chg_enable;
1653 }
1654
1655 rc = power_supply_register(chip->dev, &chip->dc_psy);
1656 if (rc < 0) {
1657 pr_err("power_supply_register usb failed rc = %d\n", rc);
1658 goto unregister_batt;
David Keitel80668952012-07-27 14:25:49 -07001659 }
1660
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001661 /* Turn on appropriate workaround flags */
1662 qpnp_chg_setup_flags(chip);
1663
David Keitel80668952012-07-27 14:25:49 -07001664 power_supply_set_present(chip->usb_psy,
1665 qpnp_chg_is_usb_chg_plugged_in(chip));
1666
David Keitel22ed2232013-01-28 11:04:07 -08001667 if (chip->maxinput_dc_ma) {
1668 rc = qpnp_chg_idcmax_set(chip, chip->maxinput_dc_ma);
1669 if (rc) {
1670 pr_err("Error setting idcmax property %d\n", rc);
1671 goto fail_chg_enable;
1672 }
1673 }
1674
David Keitel03ee6b52012-10-22 12:25:19 -07001675 qpnp_chg_charge_en(chip, !chip->charging_disabled);
David Keitelb1ddb742012-11-06 19:05:51 -08001676 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
David Keitelbf359042012-10-19 16:54:58 -07001677
Abhijeet Dharmapurikar2d996b12013-01-03 17:48:02 -08001678 pr_info("success chg_dis = %d, usb = %d, dc = %d b_health = %d batt_present = %d\n",
1679 chip->charging_disabled,
1680 qpnp_chg_is_usb_chg_plugged_in(chip),
1681 qpnp_chg_is_dc_chg_plugged_in(chip),
1682 get_prop_batt_present(chip),
1683 get_prop_batt_health(chip));
David Keitel80668952012-07-27 14:25:49 -07001684 return 0;
1685
David Keitelc7093b02013-02-14 12:50:04 -08001686unregister_batt:
1687 power_supply_unregister(&chip->batt_psy);
David Keitel80668952012-07-27 14:25:49 -07001688fail_chg_enable:
David Keitelbe208252013-01-31 14:49:25 -08001689 kfree(chip->thermal_mitigation);
David Keitel80668952012-07-27 14:25:49 -07001690 kfree(chip);
1691 dev_set_drvdata(&spmi->dev, NULL);
1692 return rc;
1693}
1694
1695static int __devexit
1696qpnp_charger_remove(struct spmi_device *spmi)
1697{
1698 struct qpnp_chg_chip *chip = dev_get_drvdata(&spmi->dev);
David Keitel80668952012-07-27 14:25:49 -07001699 dev_set_drvdata(&spmi->dev, NULL);
1700 kfree(chip);
1701
1702 return 0;
1703}
1704
1705static struct spmi_driver qpnp_charger_driver = {
1706 .probe = qpnp_charger_probe,
1707 .remove = __devexit_p(qpnp_charger_remove),
1708 .driver = {
1709 .name = QPNP_CHARGER_DEV_NAME,
1710 .owner = THIS_MODULE,
1711 .of_match_table = qpnp_charger_match_table,
1712 },
1713};
1714
1715/**
1716 * qpnp_chg_init() - register spmi driver for qpnp-chg
1717 */
1718int __init
1719qpnp_chg_init(void)
1720{
1721 return spmi_driver_register(&qpnp_charger_driver);
1722}
1723module_init(qpnp_chg_init);
1724
1725static void __exit
1726qpnp_chg_exit(void)
1727{
1728 spmi_driver_unregister(&qpnp_charger_driver);
1729}
1730module_exit(qpnp_chg_exit);
1731
1732
1733MODULE_DESCRIPTION("QPNP charger driver");
1734MODULE_LICENSE("GPL v2");
1735MODULE_ALIAS("platform:" QPNP_CHARGER_DEV_NAME);