blob: 005f78975490bc11cbe1728f026bbcca3dca48a5 [file] [log] [blame]
David Keitel80668952012-07-27 14:25:49 -07001/* Copyright (c) 2012 The Linux Foundation. All rights reserved.
2 *
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
72#define CHGR_USB_IUSB_MAX 0x44
David Keiteld681cda2012-10-02 15:44:21 -070073#define CHGR_USB_USB_SUSP 0x47
David Keitel6f865cd2012-11-30 15:04:32 -080074#define CHGR_USB_USB_OTG_CTL 0x48
David Keitel80668952012-07-27 14:25:49 -070075#define CHGR_USB_ENUM_T_STOP 0x4E
76#define CHGR_CHG_TEMP_THRESH 0x66
77#define CHGR_BAT_IF_PRES_STATUS 0x08
David Keiteld681cda2012-10-02 15:44:21 -070078#define CHGR_STATUS 0x09
David Keitel80668952012-07-27 14:25:49 -070079#define CHGR_BAT_IF_VCP 0x42
80#define CHGR_BAT_IF_BATFET_CTRL1 0x90
81#define CHGR_MISC_BOOT_DONE 0x42
David Keiteld681cda2012-10-02 15:44:21 -070082#define CHGR_BUCK_COMPARATOR_OVRIDE_3 0xED
Sridhar Parasuramae183bd2012-12-21 09:28:46 -080083#define MISC_REVISION2 0x01
David Keiteld681cda2012-10-02 15:44:21 -070084#define SEC_ACCESS 0xD0
David Keitel80668952012-07-27 14:25:49 -070085
86/* SMBB peripheral subtype values */
87#define REG_OFFSET_PERP_SUBTYPE 0x05
88#define SMBB_CHGR_SUBTYPE 0x01
89#define SMBB_BUCK_SUBTYPE 0x02
90#define SMBB_BAT_IF_SUBTYPE 0x03
91#define SMBB_USB_CHGPTH_SUBTYPE 0x04
92#define SMBB_DC_CHGPTH_SUBTYPE 0x05
93#define SMBB_BOOST_SUBTYPE 0x06
94#define SMBB_MISC_SUBTYPE 0x07
95
96#define QPNP_CHARGER_DEV_NAME "qcom,qpnp-charger"
97
David Keitelb80eda82012-10-15 10:49:11 -070098/* Status bits and masks */
99#define CHGR_BOOT_DONE BIT(7)
100#define CHGR_CHG_EN BIT(7)
101#define CHGR_ON_BAT_FORCE_BIT BIT(0)
102
David Keitel80668952012-07-27 14:25:49 -0700103/* Interrupt definitions */
104/* smbb_chg_interrupts */
105#define CHG_DONE_IRQ BIT(7)
106#define CHG_FAILED_IRQ BIT(6)
107#define FAST_CHG_ON_IRQ BIT(5)
108#define TRKL_CHG_ON_IRQ BIT(4)
109#define STATE_CHANGE_ON_IR BIT(3)
110#define CHGWDDOG_IRQ BIT(2)
111#define VBAT_DET_HI_IRQ BIT(1)
112#define VBAT_DET_LOW_IRQ BIT(0)
113
114/* smbb_buck_interrupts */
115#define VDD_LOOP_IRQ BIT(6)
116#define IBAT_LOOP_IRQ BIT(5)
117#define ICHG_LOOP_IRQ BIT(4)
118#define VCHG_LOOP_IRQ BIT(3)
119#define OVERTEMP_IRQ BIT(2)
120#define VREF_OV_IRQ BIT(1)
121#define VBAT_OV_IRQ BIT(0)
122
123/* smbb_bat_if_interrupts */
124#define PSI_IRQ BIT(4)
125#define VCP_ON_IRQ BIT(3)
126#define BAT_FET_ON_IRQ BIT(2)
127#define BAT_TEMP_OK_IRQ BIT(1)
128#define BATT_PRES_IRQ BIT(0)
129
130/* smbb_usb_interrupts */
131#define CHG_GONE_IRQ BIT(2)
132#define USBIN_VALID_IRQ BIT(1)
133#define COARSE_DET_USB_IRQ BIT(0)
134
135/* smbb_dc_interrupts */
136#define DCIN_VALID_IRQ BIT(1)
137#define COARSE_DET_DC_IRQ BIT(0)
138
139/* smbb_boost_interrupts */
140#define LIMIT_ERROR_IRQ BIT(1)
141#define BOOST_PWR_OK_IRQ BIT(0)
142
143/* smbb_misc_interrupts */
144#define TFTWDOG_IRQ BIT(0)
145
David Keiteld681cda2012-10-02 15:44:21 -0700146/* Workaround flags */
147#define CHG_FLAGS_VCP_WA BIT(0)
148
David Keitel80668952012-07-27 14:25:49 -0700149/**
150 * struct qpnp_chg_chip - device information
151 * @dev: device pointer to access the parent
152 * @spmi: spmi pointer to access spmi information
153 * @chgr_base: charger peripheral base address
154 * @buck_base: buck peripheral base address
155 * @bat_if_base: battery interface peripheral base address
156 * @usb_chgpth_base: USB charge path peripheral base address
157 * @dc_chgpth_base: DC charge path peripheral base address
158 * @boost_base: boost peripheral base address
159 * @misc_base: misc peripheral base address
160 * @freq_base: freq peripheral base address
161 * @chg_done: indicates that charging is completed
162 * @usb_present: present status of usb
163 * @dc_present: present status of dc
David Keitel3dd5e0f2012-12-12 18:12:36 -0800164 * @use_default_batt_values: flag to report default battery properties
David Keitel80668952012-07-27 14:25:49 -0700165 * @max_voltage_mv: the max volts the batt should be charged up to
David Keitel5d44fa52012-12-03 16:37:31 -0800166 * @min_voltage_mv: min battery voltage before turning the FET on
167 * @resume_voltage_mv: voltage at which the battery resumes charging
David Keitel80668952012-07-27 14:25:49 -0700168 * @term_current: the charging based term current
David Keitel5d44fa52012-12-03 16:37:31 -0800169 * @safe_current: battery safety current setting
David Keitel80668952012-07-27 14:25:49 -0700170 * @revision: PMIC revision
171 * @dc_psy power supply to export information to userspace
172 * @usb_psy power supply to export information to userspace
173 * @bms_psy power supply to export information to userspace
174 * @batt_psy: power supply to export information to userspace
David Keiteld681cda2012-10-02 15:44:21 -0700175 * @flags: flags to activate specific workarounds
176 * throughout the driver
David Keitel80668952012-07-27 14:25:49 -0700177 *
178 */
179struct qpnp_chg_chip {
180 struct device *dev;
181 struct spmi_device *spmi;
182 u16 chgr_base;
183 u16 buck_base;
184 u16 bat_if_base;
185 u16 usb_chgpth_base;
186 u16 dc_chgpth_base;
187 u16 boost_base;
188 u16 misc_base;
189 u16 freq_base;
190 unsigned int usbin_valid_irq;
191 unsigned int chg_done_irq;
192 unsigned int chg_failed_irq;
193 bool chg_done;
194 bool usb_present;
195 bool dc_present;
David Keitel03ee6b52012-10-22 12:25:19 -0700196 bool charging_disabled;
David Keitel3dd5e0f2012-12-12 18:12:36 -0800197 bool use_default_batt_values;
David Keitel80668952012-07-27 14:25:49 -0700198 unsigned int max_bat_chg_current;
199 unsigned int safe_voltage_mv;
200 unsigned int max_voltage_mv;
201 unsigned int min_voltage_mv;
David Keitel5d44fa52012-12-03 16:37:31 -0800202 unsigned int resume_voltage_mv;
David Keitel80668952012-07-27 14:25:49 -0700203 unsigned int term_current;
David Keitel5d44fa52012-12-03 16:37:31 -0800204 unsigned int safe_current;
David Keitel80668952012-07-27 14:25:49 -0700205 unsigned int revision;
206 struct power_supply dc_psy;
207 struct power_supply *usb_psy;
208 struct power_supply *bms_psy;
209 struct power_supply batt_psy;
David Keiteld681cda2012-10-02 15:44:21 -0700210 uint32_t flags;
David Keitel80668952012-07-27 14:25:49 -0700211};
212
David Keitel80668952012-07-27 14:25:49 -0700213static struct of_device_id qpnp_charger_match_table[] = {
214 { .compatible = QPNP_CHARGER_DEV_NAME, },
215 {}
216};
217
218static int
219qpnp_chg_read(struct qpnp_chg_chip *chip, u8 *val,
220 u16 base, int count)
221{
222 int rc;
223 struct spmi_device *spmi = chip->spmi;
224
225 rc = spmi_ext_register_readl(spmi->ctrl, spmi->sid, base, val,
226 count);
227 if (rc) {
228 pr_err("SPMI read failed base=0x%02x sid=0x%02x rc=%d\n", base,
229 spmi->sid, rc);
230 return rc;
231 }
232 return 0;
233}
234
235static int
236qpnp_chg_write(struct qpnp_chg_chip *chip, u8 *val,
237 u16 base, int count)
238{
239 int rc;
240 struct spmi_device *spmi = chip->spmi;
241
242 rc = spmi_ext_register_writel(spmi->ctrl, spmi->sid, base, val,
243 count);
244 if (rc) {
245 pr_err("write failed base=0x%02x sid=0x%02x rc=%d\n",
246 base, spmi->sid, rc);
247 return rc;
248 }
249
250 return 0;
251}
252
253static int
254qpnp_chg_masked_write(struct qpnp_chg_chip *chip, u16 base,
255 u8 mask, u8 val, int count)
256{
257 int rc;
258 u8 reg;
259
260 rc = qpnp_chg_read(chip, &reg, base, count);
261 if (rc) {
262 pr_err("spmi read failed: addr=%03X, rc=%d\n", base, rc);
263 return rc;
264 }
265 pr_debug("addr = 0x%x read 0x%x\n", base, reg);
266
267 reg &= ~mask;
268 reg |= val & mask;
269
270 pr_debug("Writing 0x%x\n", reg);
271
272 rc = qpnp_chg_write(chip, &reg, base, count);
273 if (rc) {
274 pr_err("spmi write failed: addr=%03X, rc=%d\n", base, rc);
275 return rc;
276 }
277
278 return 0;
279}
280
David Keitel6f865cd2012-11-30 15:04:32 -0800281#define USB_OTG_EN_BIT BIT(0)
282static int
283qpnp_chg_is_otg_en_set(struct qpnp_chg_chip *chip)
284{
285 u8 usb_otg_en;
286 int rc;
287
288 rc = qpnp_chg_read(chip, &usb_otg_en,
289 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
290 1);
291
292 if (rc) {
293 pr_err("spmi read failed: addr=%03X, rc=%d\n",
294 chip->usb_chgpth_base + CHGR_STATUS, rc);
295 return rc;
296 }
297 pr_debug("usb otg en 0x%x\n", usb_otg_en);
298
299 return (usb_otg_en & USB_OTG_EN_BIT) ? 1 : 0;
300}
301
David Keiteld681cda2012-10-02 15:44:21 -0700302#define USB_VALID_BIT BIT(7)
David Keitel80668952012-07-27 14:25:49 -0700303static int
304qpnp_chg_is_usb_chg_plugged_in(struct qpnp_chg_chip *chip)
305{
306 u8 usbin_valid_rt_sts;
307 int rc;
308
309 rc = qpnp_chg_read(chip, &usbin_valid_rt_sts,
David Keiteld681cda2012-10-02 15:44:21 -0700310 chip->usb_chgpth_base + CHGR_STATUS , 1);
David Keitel80668952012-07-27 14:25:49 -0700311
312 if (rc) {
313 pr_err("spmi read failed: addr=%03X, rc=%d\n",
David Keiteld681cda2012-10-02 15:44:21 -0700314 chip->usb_chgpth_base + CHGR_STATUS, rc);
David Keitel80668952012-07-27 14:25:49 -0700315 return rc;
316 }
317 pr_debug("chgr usb sts 0x%x\n", usbin_valid_rt_sts);
318
David Keiteld681cda2012-10-02 15:44:21 -0700319 return (usbin_valid_rt_sts & USB_VALID_BIT) ? 1 : 0;
David Keitel80668952012-07-27 14:25:49 -0700320}
321
322static int
323qpnp_chg_is_dc_chg_plugged_in(struct qpnp_chg_chip *chip)
324{
325 u8 dcin_valid_rt_sts;
326 int rc;
327
328 rc = qpnp_chg_read(chip, &dcin_valid_rt_sts,
329 INT_RT_STS(chip->dc_chgpth_base), 1);
330 if (rc) {
331 pr_err("spmi read failed: addr=%03X, rc=%d\n",
332 INT_RT_STS(chip->dc_chgpth_base), rc);
333 return rc;
334 }
335
336 return (dcin_valid_rt_sts & DCIN_VALID_IRQ) ? 1 : 0;
337}
338
David Keitel80668952012-07-27 14:25:49 -0700339#define QPNP_CHG_IUSB_MAX_MIN_100 100
340#define QPNP_CHG_IUSB_MAX_MIN_150 150
341#define QPNP_CHG_IUSB_MAX_MIN_MA 200
342#define QPNP_CHG_IUSB_MAX_MAX_MA 2500
343#define QPNP_CHG_IUSB_MAX_STEP_MA 100
344static int
345qpnp_chg_iusbmax_set(struct qpnp_chg_chip *chip, int mA)
346{
David Keiteld681cda2012-10-02 15:44:21 -0700347 int rc = 0;
348 u8 usb_reg = 0, temp = 8;
David Keitel80668952012-07-27 14:25:49 -0700349
350 if (mA == QPNP_CHG_IUSB_MAX_MIN_100) {
351 usb_reg = 0x00;
352 pr_debug("current=%d setting %02x\n", mA, usb_reg);
353 return qpnp_chg_write(chip, &usb_reg,
354 chip->usb_chgpth_base + CHGR_USB_IUSB_MAX, 1);
355 } else if (mA == QPNP_CHG_IUSB_MAX_MIN_150) {
356 usb_reg = 0x01;
357 pr_debug("current=%d setting %02x\n", mA, usb_reg);
358 return qpnp_chg_write(chip, &usb_reg,
359 chip->usb_chgpth_base + CHGR_USB_IUSB_MAX, 1);
360 }
361
362 if (mA < QPNP_CHG_IUSB_MAX_MIN_MA
363 || mA > QPNP_CHG_IUSB_MAX_MAX_MA) {
364 pr_err("bad mA=%d asked to set\n", mA);
365 return -EINVAL;
366 }
367
David Keitel80668952012-07-27 14:25:49 -0700368 usb_reg = mA / QPNP_CHG_IUSB_MAX_STEP_MA;
369
David Keiteld681cda2012-10-02 15:44:21 -0700370 if (chip->flags & CHG_FLAGS_VCP_WA) {
371 temp = 0xA5;
372 rc = qpnp_chg_write(chip, &temp,
373 chip->buck_base + SEC_ACCESS, 1);
374 rc = qpnp_chg_masked_write(chip,
375 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
376 0x0C, 0x0C, 1);
377 }
378
David Keitel80668952012-07-27 14:25:49 -0700379 pr_debug("current=%d setting 0x%x\n", mA, usb_reg);
David Keiteld681cda2012-10-02 15:44:21 -0700380 rc = qpnp_chg_write(chip, &usb_reg,
David Keitel80668952012-07-27 14:25:49 -0700381 chip->usb_chgpth_base + CHGR_USB_IUSB_MAX, 1);
David Keiteld681cda2012-10-02 15:44:21 -0700382
383 if (chip->flags & CHG_FLAGS_VCP_WA) {
384 temp = 0xA5;
385 udelay(200);
386 rc = qpnp_chg_write(chip, &temp,
387 chip->buck_base + SEC_ACCESS, 1);
388 rc = qpnp_chg_masked_write(chip,
389 chip->buck_base + CHGR_BUCK_COMPARATOR_OVRIDE_3,
390 0x0C, 0x00, 1);
391 }
392
393 return rc;
394}
395
396#define USB_SUSPEND_BIT BIT(0)
397static int
398qpnp_chg_usb_suspend_enable(struct qpnp_chg_chip *chip, int enable)
399{
400 return qpnp_chg_masked_write(chip,
401 chip->usb_chgpth_base + CHGR_USB_USB_SUSP,
402 USB_SUSPEND_BIT,
403 enable ? USB_SUSPEND_BIT : 0, 1);
David Keitel80668952012-07-27 14:25:49 -0700404}
405
406#define ENUM_T_STOP_BIT BIT(0)
407static irqreturn_t
408qpnp_chg_usb_usbin_valid_irq_handler(int irq, void *_chip)
409{
410 struct qpnp_chg_chip *chip = _chip;
David Keitel6f865cd2012-11-30 15:04:32 -0800411 int usb_present, host_mode;
David Keitel80668952012-07-27 14:25:49 -0700412
413 usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
David Keitel6f865cd2012-11-30 15:04:32 -0800414 host_mode = qpnp_chg_is_otg_en_set(chip);
415 pr_debug("usbin-valid triggered: %d host_mode: %d\n",
416 usb_present, host_mode);
417
418 /* In host mode notifications cmoe from USB supply */
419 if (host_mode)
420 return IRQ_HANDLED;
David Keitel80668952012-07-27 14:25:49 -0700421
422 if (chip->usb_present ^ usb_present) {
423 chip->usb_present = usb_present;
Sridhar Parasuramae183bd2012-12-21 09:28:46 -0800424 power_supply_set_present(chip->usb_psy,
425 chip->usb_present);
David Keitel80668952012-07-27 14:25:49 -0700426 }
427
428 return IRQ_HANDLED;
429}
430
431#define CHGR_CHG_FAILED_BIT BIT(7)
432static irqreturn_t
433qpnp_chg_chgr_chg_failed_irq_handler(int irq, void *_chip)
434{
435 struct qpnp_chg_chip *chip = _chip;
David Keitel4429b1f2012-10-18 10:42:50 -0700436 int rc;
David Keitel80668952012-07-27 14:25:49 -0700437
438 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -0700439 chip->chgr_base + CHGR_CHG_FAILED,
David Keitel80668952012-07-27 14:25:49 -0700440 CHGR_CHG_FAILED_BIT,
441 CHGR_CHG_FAILED_BIT, 1);
442 if (rc)
443 pr_err("Failed to write chg_fail clear bit!\n");
444
David Keitel80668952012-07-27 14:25:49 -0700445 return IRQ_HANDLED;
446}
447
448static irqreturn_t
449qpnp_chg_chgr_chg_done_irq_handler(int irq, void *_chip)
450{
451 struct qpnp_chg_chip *chip = _chip;
452
453 pr_debug("CHG_DONE IRQ triggered\n");
454 chip->chg_done = true;
455
456 return IRQ_HANDLED;
457}
458
David Keitel03ee6b52012-10-22 12:25:19 -0700459static int
460qpnp_batt_property_is_writeable(struct power_supply *psy,
461 enum power_supply_property psp)
462{
463 switch (psp) {
464 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
465 return 1;
466 default:
467 break;
468 }
469
470 return 0;
471}
472
David Keitel6f865cd2012-11-30 15:04:32 -0800473static int
474qpnp_chg_charge_en(struct qpnp_chg_chip *chip, int enable)
475{
476 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
477 CHGR_CHG_EN,
478 enable ? CHGR_CHG_EN : 0, 1);
479}
480
481static int
482qpnp_chg_force_run_on_batt(struct qpnp_chg_chip *chip, int disable)
483{
484 /* This bit forces the charger to run off of the battery rather
485 * than a connected charger */
486 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_CHG_CTRL,
487 CHGR_ON_BAT_FORCE_BIT,
488 disable ? CHGR_ON_BAT_FORCE_BIT : 0, 1);
489}
490
491static
492int switch_usb_to_charge_mode(struct qpnp_chg_chip *chip)
493{
494 int rc;
495
496 pr_debug("switch to charge mode\n");
497 if (!qpnp_chg_is_otg_en_set(chip))
498 return 0;
499
500 /* enable usb ovp fet */
501 rc = qpnp_chg_masked_write(chip,
502 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
503 USB_OTG_EN_BIT,
504 0, 1);
505 if (rc) {
506 pr_err("Failed to turn on usb ovp rc = %d\n", rc);
507 return rc;
508 }
509
510 rc = qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
511 if (rc) {
512 pr_err("Failed re-enable charging rc = %d\n", rc);
513 return rc;
514 }
515
516 return 0;
517}
518
519static
520int switch_usb_to_host_mode(struct qpnp_chg_chip *chip)
521{
522 int rc;
523
524 pr_debug("switch to host mode\n");
525 if (qpnp_chg_is_otg_en_set(chip))
526 return 0;
527
528 rc = qpnp_chg_force_run_on_batt(chip, 1);
529 if (rc) {
530 pr_err("Failed to disable charging rc = %d\n", rc);
531 return rc;
532 }
533
534 /* force usb ovp fet off */
535 rc = qpnp_chg_masked_write(chip,
536 chip->usb_chgpth_base + CHGR_USB_USB_OTG_CTL,
537 USB_OTG_EN_BIT,
538 USB_OTG_EN_BIT, 1);
539 if (rc) {
540 pr_err("Failed to turn off usb ovp rc = %d\n", rc);
541 return rc;
542 }
543
544 return 0;
545}
546
David Keitel80668952012-07-27 14:25:49 -0700547static enum power_supply_property pm_power_props_mains[] = {
548 POWER_SUPPLY_PROP_PRESENT,
549 POWER_SUPPLY_PROP_ONLINE,
550};
551
552static enum power_supply_property msm_batt_power_props[] = {
David Keitelb80eda82012-10-15 10:49:11 -0700553 POWER_SUPPLY_PROP_CHARGING_ENABLED,
David Keitel80668952012-07-27 14:25:49 -0700554 POWER_SUPPLY_PROP_STATUS,
555 POWER_SUPPLY_PROP_CHARGE_TYPE,
556 POWER_SUPPLY_PROP_HEALTH,
557 POWER_SUPPLY_PROP_PRESENT,
558 POWER_SUPPLY_PROP_TECHNOLOGY,
559 POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
560 POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
561 POWER_SUPPLY_PROP_VOLTAGE_NOW,
562 POWER_SUPPLY_PROP_CAPACITY,
563 POWER_SUPPLY_PROP_CURRENT_NOW,
564 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
565 POWER_SUPPLY_PROP_TEMP,
566};
567
568static char *pm_power_supplied_to[] = {
569 "battery",
570};
571
572#define USB_WALL_THRESHOLD_MA 500
573static int
574qpnp_power_get_property_mains(struct power_supply *psy,
575 enum power_supply_property psp,
576 union power_supply_propval *val)
577{
578 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
579 dc_psy);
580
581 switch (psp) {
582 case POWER_SUPPLY_PROP_PRESENT:
583 case POWER_SUPPLY_PROP_ONLINE:
584 val->intval = 0;
David Keitel03ee6b52012-10-22 12:25:19 -0700585 if (chip->charging_disabled)
David Keitel80668952012-07-27 14:25:49 -0700586 return 0;
587
588 val->intval = qpnp_chg_is_dc_chg_plugged_in(chip);
589 break;
590 default:
591 return -EINVAL;
592 }
593 return 0;
594}
595
596static int
597get_prop_battery_voltage_now(struct qpnp_chg_chip *chip)
598{
599 int rc = 0;
600 struct qpnp_vadc_result results;
601
602 if (chip->revision > 0) {
603 rc = qpnp_vadc_read(VBAT_SNS, &results);
604 if (rc) {
605 pr_err("Unable to read vbat rc=%d\n", rc);
606 return 0;
607 }
608 return results.physical;
609 } else {
610 pr_err("vbat reading not supported for 1.0 rc=%d\n", rc);
611 return 0;
612 }
613}
614
615#define BATT_PRES_BIT BIT(7)
616static int
617get_prop_batt_present(struct qpnp_chg_chip *chip)
618{
619 u8 batt_present;
620 int rc;
621
622 rc = qpnp_chg_read(chip, &batt_present,
623 chip->bat_if_base + CHGR_BAT_IF_PRES_STATUS, 1);
624 if (rc) {
625 pr_err("Couldn't read battery status read failed rc=%d\n", rc);
626 return 0;
627 };
628 return (batt_present & BATT_PRES_BIT) ? 1 : 0;
629}
630
631#define BATT_TEMP_HOT BIT(6)
632#define BATT_TEMP_OK BIT(7)
633static int
634get_prop_batt_health(struct qpnp_chg_chip *chip)
635{
636 u8 batt_health;
637 int rc;
638
639 rc = qpnp_chg_read(chip, &batt_health,
David Keiteld681cda2012-10-02 15:44:21 -0700640 chip->bat_if_base + CHGR_STATUS, 1);
David Keitel80668952012-07-27 14:25:49 -0700641 if (rc) {
642 pr_err("Couldn't read battery health read failed rc=%d\n", rc);
643 return POWER_SUPPLY_HEALTH_UNKNOWN;
644 };
645
646 if (BATT_TEMP_OK & batt_health)
647 return POWER_SUPPLY_HEALTH_GOOD;
648 if (BATT_TEMP_HOT & batt_health)
649 return POWER_SUPPLY_HEALTH_OVERHEAT;
650 else
651 return POWER_SUPPLY_HEALTH_COLD;
652}
653
654static int
655get_prop_charge_type(struct qpnp_chg_chip *chip)
656{
657 int rc;
658 u8 chgr_sts;
659
660 if (!get_prop_batt_present(chip))
661 return POWER_SUPPLY_CHARGE_TYPE_NONE;
662
663 rc = qpnp_chg_read(chip, &chgr_sts,
664 INT_RT_STS(chip->chgr_base), 1);
665 if (rc) {
666 pr_err("failed to read interrupt sts %d\n", rc);
667 return POWER_SUPPLY_CHARGE_TYPE_NONE;
668 }
669
670 if (chgr_sts & TRKL_CHG_ON_IRQ)
671 return POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
672 if (chgr_sts & FAST_CHG_ON_IRQ)
673 return POWER_SUPPLY_CHARGE_TYPE_FAST;
674
675 return POWER_SUPPLY_CHARGE_TYPE_NONE;
676}
677
678static int
679get_prop_batt_status(struct qpnp_chg_chip *chip)
680{
681 int rc;
682 u8 chgr_sts;
683
684 rc = qpnp_chg_read(chip, &chgr_sts,
685 INT_RT_STS(chip->chgr_base), 1);
686 if (rc) {
687 pr_err("failed to read interrupt sts %d\n", rc);
688 return POWER_SUPPLY_STATUS_DISCHARGING;
689 }
690
691 pr_debug("chgr sts 0x%x\n", chgr_sts);
692 if (chgr_sts & CHG_DONE_IRQ || chip->chg_done)
693 return POWER_SUPPLY_STATUS_FULL;
694 else
695 chip->chg_done = false;
696
697 if (chgr_sts & TRKL_CHG_ON_IRQ)
698 return POWER_SUPPLY_STATUS_CHARGING;
699 if (chgr_sts & FAST_CHG_ON_IRQ)
700 return POWER_SUPPLY_STATUS_CHARGING;
701
702 return POWER_SUPPLY_STATUS_DISCHARGING;
703}
704
705static int
706get_prop_current_now(struct qpnp_chg_chip *chip)
707{
708 union power_supply_propval ret = {0,};
709
710 if (chip->bms_psy) {
711 chip->bms_psy->get_property(chip->bms_psy,
712 POWER_SUPPLY_PROP_CURRENT_NOW, &ret);
713 return ret.intval;
714 } else {
715 pr_debug("No BMS supply registered return 0\n");
716 }
717
718 return 0;
719}
720
721static int
722get_prop_full_design(struct qpnp_chg_chip *chip)
723{
724 union power_supply_propval ret = {0,};
725
726 if (chip->bms_psy) {
727 chip->bms_psy->get_property(chip->bms_psy,
728 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, &ret);
729 return ret.intval;
730 } else {
731 pr_debug("No BMS supply registered return 0\n");
732 }
733
734 return 0;
735}
736
737#define DEFAULT_CAPACITY 50
738static int
739get_prop_capacity(struct qpnp_chg_chip *chip)
740{
741 union power_supply_propval ret = {0,};
742
David Keitel3dd5e0f2012-12-12 18:12:36 -0800743 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
744 return DEFAULT_CAPACITY;
745
David Keitel80668952012-07-27 14:25:49 -0700746 if (chip->bms_psy) {
747 chip->bms_psy->get_property(chip->bms_psy,
748 POWER_SUPPLY_PROP_CAPACITY, &ret);
749 return ret.intval;
750 } else {
751 pr_debug("No BMS supply registered return 50\n");
752 }
753
754 /* return default capacity to avoid userspace
755 * from shutting down unecessarily */
756 return DEFAULT_CAPACITY;
757}
758
David Keitel3dd5e0f2012-12-12 18:12:36 -0800759#define DEFAULT_TEMP 250
David Keitel80668952012-07-27 14:25:49 -0700760#define MAX_TOLERABLE_BATT_TEMP_DDC 680
761static int
762get_prop_batt_temp(struct qpnp_chg_chip *chip)
763{
764 int rc = 0;
765 struct qpnp_vadc_result results;
766
David Keitel3dd5e0f2012-12-12 18:12:36 -0800767 if (chip->use_default_batt_values || !get_prop_batt_present(chip))
768 return DEFAULT_TEMP;
769
David Keitel80668952012-07-27 14:25:49 -0700770 if (chip->revision > 0) {
771 rc = qpnp_vadc_read(LR_MUX1_BATT_THERM, &results);
772 if (rc) {
773 pr_debug("Unable to read batt temperature rc=%d\n", rc);
774 return 0;
775 }
776 pr_debug("get_bat_temp %d %lld\n",
777 results.adc_code, results.physical);
778 return (int)results.physical;
779 } else {
780 pr_debug("batt temp not supported for PMIC 1.0 rc=%d\n", rc);
781 }
782
783 /* return default temperature to avoid userspace
784 * from shutting down unecessarily */
785 return DEFAULT_TEMP;
786}
787
788static void
789qpnp_batt_external_power_changed(struct power_supply *psy)
790{
791 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
792 batt_psy);
793 union power_supply_propval ret = {0,};
794
795 if (!chip->bms_psy)
796 chip->bms_psy = power_supply_get_by_name("bms");
797
798 chip->usb_psy->get_property(chip->usb_psy,
David Keitel6f865cd2012-11-30 15:04:32 -0800799 POWER_SUPPLY_PROP_SCOPE, &ret);
800 if (ret.intval) {
801 if ((ret.intval == POWER_SUPPLY_SCOPE_SYSTEM)
802 && !qpnp_chg_is_otg_en_set(chip)) {
803 switch_usb_to_host_mode(chip);
804 return;
805 }
806 if ((ret.intval == POWER_SUPPLY_SCOPE_DEVICE)
807 && qpnp_chg_is_otg_en_set(chip)) {
808 switch_usb_to_charge_mode(chip);
809 return;
810 }
811 }
812
813 chip->usb_psy->get_property(chip->usb_psy,
David Keitel80668952012-07-27 14:25:49 -0700814 POWER_SUPPLY_PROP_ONLINE, &ret);
815
816 if (ret.intval && qpnp_chg_is_usb_chg_plugged_in(chip)) {
817 chip->usb_psy->get_property(chip->usb_psy,
818 POWER_SUPPLY_PROP_CURRENT_MAX, &ret);
819 qpnp_chg_iusbmax_set(chip, ret.intval / 1000);
David Keiteld681cda2012-10-02 15:44:21 -0700820 if ((ret.intval / 1000) <= QPNP_CHG_IUSB_MAX_MIN_MA)
821 qpnp_chg_usb_suspend_enable(chip, 1);
822 else
823 qpnp_chg_usb_suspend_enable(chip, 0);
David Keitel80668952012-07-27 14:25:49 -0700824 } else {
David Keiteld681cda2012-10-02 15:44:21 -0700825 qpnp_chg_iusbmax_set(chip, QPNP_CHG_IUSB_MAX_MIN_100);
826 qpnp_chg_usb_suspend_enable(chip, 0);
David Keitel80668952012-07-27 14:25:49 -0700827 }
828
829 pr_debug("end of power supply changed\n");
830 power_supply_changed(&chip->batt_psy);
831}
832
833static int
834qpnp_batt_power_get_property(struct power_supply *psy,
835 enum power_supply_property psp,
836 union power_supply_propval *val)
837{
838 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
839 batt_psy);
840
841 switch (psp) {
842 case POWER_SUPPLY_PROP_STATUS:
843 val->intval = get_prop_batt_status(chip);
844 break;
845 case POWER_SUPPLY_PROP_CHARGE_TYPE:
846 val->intval = get_prop_charge_type(chip);
847 break;
848 case POWER_SUPPLY_PROP_HEALTH:
849 val->intval = get_prop_batt_health(chip);
850 break;
851 case POWER_SUPPLY_PROP_PRESENT:
852 val->intval = get_prop_batt_present(chip);
853 break;
854 case POWER_SUPPLY_PROP_TECHNOLOGY:
855 val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
856 break;
857 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
858 val->intval = chip->max_voltage_mv * 1000;
859 break;
860 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
861 val->intval = chip->min_voltage_mv * 1000;
862 break;
863 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
864 val->intval = get_prop_battery_voltage_now(chip);
865 break;
866 case POWER_SUPPLY_PROP_TEMP:
867 val->intval = get_prop_batt_temp(chip);
868 break;
869 case POWER_SUPPLY_PROP_CAPACITY:
870 val->intval = get_prop_capacity(chip);
871 break;
872 case POWER_SUPPLY_PROP_CURRENT_NOW:
873 val->intval = get_prop_current_now(chip);
874 break;
875 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
876 val->intval = get_prop_full_design(chip);
877 break;
David Keitelb80eda82012-10-15 10:49:11 -0700878 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitel03ee6b52012-10-22 12:25:19 -0700879 val->intval = !(chip->charging_disabled);
David Keitelb80eda82012-10-15 10:49:11 -0700880 break;
David Keitel80668952012-07-27 14:25:49 -0700881 default:
882 return -EINVAL;
883 }
884
885 return 0;
886}
887
David Keitel80668952012-07-27 14:25:49 -0700888static int
David Keitelb80eda82012-10-15 10:49:11 -0700889qpnp_batt_power_set_property(struct power_supply *psy,
890 enum power_supply_property psp,
891 const union power_supply_propval *val)
David Keitel80668952012-07-27 14:25:49 -0700892{
David Keitelb80eda82012-10-15 10:49:11 -0700893 struct qpnp_chg_chip *chip = container_of(psy, struct qpnp_chg_chip,
894 batt_psy);
David Keitel80668952012-07-27 14:25:49 -0700895
David Keitelb80eda82012-10-15 10:49:11 -0700896 switch (psp) {
897 case POWER_SUPPLY_PROP_CHARGING_ENABLED:
David Keitel03ee6b52012-10-22 12:25:19 -0700898 chip->charging_disabled = !(val->intval);
David Keitelb1ddb742012-11-06 19:05:51 -0800899 qpnp_chg_charge_en(chip, !chip->charging_disabled);
900 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
David Keitelb80eda82012-10-15 10:49:11 -0700901 break;
902 default:
903 return -EINVAL;
904 }
905
906 power_supply_changed(&chip->batt_psy);
907 return 0;
David Keitel80668952012-07-27 14:25:49 -0700908}
909
David Keitel80668952012-07-27 14:25:49 -0700910#define QPNP_CHG_VINMIN_MIN_MV 3400
911#define QPNP_CHG_VINMIN_HIGH_MIN_MV 5600
912#define QPNP_CHG_VINMIN_HIGH_MIN_VAL 0x2B
913#define QPNP_CHG_VINMIN_MAX_MV 9600
914#define QPNP_CHG_VINMIN_STEP_MV 50
915#define QPNP_CHG_VINMIN_STEP_HIGH_MV 200
916#define QPNP_CHG_VINMIN_MASK 0x1F
917static int
918qpnp_chg_vinmin_set(struct qpnp_chg_chip *chip, int voltage)
919{
920 u8 temp;
921
922 if (voltage < QPNP_CHG_VINMIN_MIN_MV
923 || voltage > QPNP_CHG_VINMIN_MAX_MV) {
924 pr_err("bad mV=%d asked to set\n", voltage);
925 return -EINVAL;
926 }
927 if (voltage >= QPNP_CHG_VINMIN_HIGH_MIN_MV) {
928 temp = QPNP_CHG_VINMIN_HIGH_MIN_VAL;
929 temp += (voltage - QPNP_CHG_VINMIN_MIN_MV)
930 / QPNP_CHG_VINMIN_STEP_HIGH_MV;
931 } else {
932 temp = (voltage - QPNP_CHG_VINMIN_MIN_MV)
933 / QPNP_CHG_VINMIN_STEP_MV;
934 }
935
936 pr_debug("voltage=%d setting %02x\n", voltage, temp);
937 return qpnp_chg_masked_write(chip,
938 chip->chgr_base + CHGR_VIN_MIN,
939 QPNP_CHG_VINMIN_MASK, temp, 1);
940}
941
David Keitel5d44fa52012-12-03 16:37:31 -0800942#define QPNP_CHG_IBATSAFE_MIN_MA 100
943#define QPNP_CHG_IBATSAFE_MAX_MA 3250
944#define QPNP_CHG_I_STEP_MA 50
945#define QPNP_CHG_I_MIN_MA 100
946#define QPNP_CHG_I_MASK 0x3F
947static int
948qpnp_chg_ibatsafe_set(struct qpnp_chg_chip *chip, int safe_current)
949{
950 u8 temp;
951
952 if (safe_current < QPNP_CHG_IBATSAFE_MIN_MA
953 || safe_current > QPNP_CHG_IBATSAFE_MAX_MA) {
954 pr_err("bad mA=%d asked to set\n", safe_current);
955 return -EINVAL;
956 }
957
958 temp = (safe_current - QPNP_CHG_IBATSAFE_MIN_MA)
959 / QPNP_CHG_I_STEP_MA;
960 return qpnp_chg_masked_write(chip,
961 chip->chgr_base + CHGR_IBAT_SAFE,
962 QPNP_CHG_I_MASK, temp, 1);
963}
David Keitel80668952012-07-27 14:25:49 -0700964
965#define QPNP_CHG_ITERM_MIN_MA 100
966#define QPNP_CHG_ITERM_MAX_MA 250
967#define QPNP_CHG_ITERM_STEP_MA 50
968#define QPNP_CHG_ITERM_MASK 0x03
969static int
970qpnp_chg_ibatterm_set(struct qpnp_chg_chip *chip, int term_current)
971{
972 u8 temp;
973
974 if (term_current < QPNP_CHG_ITERM_MIN_MA
975 || term_current > QPNP_CHG_ITERM_MAX_MA) {
976 pr_err("bad mA=%d asked to set\n", term_current);
977 return -EINVAL;
978 }
979
980 temp = (term_current - QPNP_CHG_ITERM_MIN_MA)
981 / QPNP_CHG_ITERM_STEP_MA;
982 return qpnp_chg_masked_write(chip,
983 chip->chgr_base + CHGR_IBAT_TERM_CHGR,
984 QPNP_CHG_ITERM_MASK, temp, 1);
985}
986
987#define QPNP_CHG_IBATMAX_MIN 100
988#define QPNP_CHG_IBATMAX_MAX 3250
David Keitel80668952012-07-27 14:25:49 -0700989static int
990qpnp_chg_ibatmax_set(struct qpnp_chg_chip *chip, int chg_current)
991{
992 u8 temp;
993
994 if (chg_current < QPNP_CHG_IBATMAX_MIN
995 || chg_current > QPNP_CHG_IBATMAX_MAX) {
996 pr_err("bad mA=%d asked to set\n", chg_current);
997 return -EINVAL;
998 }
999 temp = (chg_current - QPNP_CHG_I_MIN_MA) / QPNP_CHG_I_STEP_MA;
1000 return qpnp_chg_masked_write(chip, chip->chgr_base + CHGR_IBAT_MAX,
1001 QPNP_CHG_I_MASK, temp, 1);
1002}
1003
David Keitel5d44fa52012-12-03 16:37:31 -08001004#define QPNP_CHG_VBATDET_MIN_MV 3240
1005#define QPNP_CHG_VBATDET_MAX_MV 5780
1006#define QPNP_CHG_VBATDET_STEP_MV 20
1007static int
1008qpnp_chg_vbatdet_set(struct qpnp_chg_chip *chip, int vbatdet_mv)
1009{
1010 u8 temp;
1011
1012 if (vbatdet_mv < QPNP_CHG_VBATDET_MIN_MV
1013 || vbatdet_mv > QPNP_CHG_VBATDET_MAX_MV) {
1014 pr_err("bad mV=%d asked to set\n", vbatdet_mv);
1015 return -EINVAL;
1016 }
1017 temp = (vbatdet_mv - QPNP_CHG_VBATDET_MIN_MV)
1018 / QPNP_CHG_VBATDET_STEP_MV;
1019
1020 pr_debug("voltage=%d setting %02x\n", vbatdet_mv, temp);
1021 return qpnp_chg_write(chip, &temp,
1022 chip->chgr_base + CHGR_VBAT_DET, 1);
1023}
David Keitel80668952012-07-27 14:25:49 -07001024
1025#define QPNP_CHG_V_MIN_MV 3240
1026#define QPNP_CHG_V_MAX_MV 4500
1027#define QPNP_CHG_V_STEP_MV 10
1028static int
1029qpnp_chg_vddsafe_set(struct qpnp_chg_chip *chip, int voltage)
1030{
1031 u8 temp;
1032
1033 if (voltage < QPNP_CHG_V_MIN_MV
1034 || voltage > QPNP_CHG_V_MAX_MV) {
1035 pr_err("bad mV=%d asked to set\n", voltage);
1036 return -EINVAL;
1037 }
1038 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1039 pr_debug("voltage=%d setting %02x\n", voltage, temp);
1040 return qpnp_chg_write(chip, &temp,
1041 chip->chgr_base + CHGR_VDD_SAFE, 1);
1042}
1043
1044#define QPNP_CHG_VDDMAX_MIN 3400
1045static int
1046qpnp_chg_vddmax_set(struct qpnp_chg_chip *chip, int voltage)
1047{
1048 u8 temp = 0;
1049
1050 if (voltage < QPNP_CHG_VDDMAX_MIN
1051 || voltage > QPNP_CHG_V_MAX_MV) {
1052 pr_err("bad mV=%d asked to set\n", voltage);
1053 return -EINVAL;
1054 }
1055
1056 temp = (voltage - QPNP_CHG_V_MIN_MV) / QPNP_CHG_V_STEP_MV;
1057
1058 pr_debug("voltage=%d setting %02x\n", voltage, temp);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001059 return qpnp_chg_write(chip, &temp,
1060 chip->chgr_base + CHGR_VDD_MAX, 1);
David Keitel80668952012-07-27 14:25:49 -07001061}
1062
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001063
1064static void
1065qpnp_chg_setup_flags(struct qpnp_chg_chip *chip)
David Keiteld681cda2012-10-02 15:44:21 -07001066{
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001067 if (chip->revision > 0)
David Keiteld681cda2012-10-02 15:44:21 -07001068 chip->flags |= CHG_FLAGS_VCP_WA;
1069}
1070
David Keitel80668952012-07-27 14:25:49 -07001071#define WDOG_EN_BIT BIT(7)
1072static int
1073qpnp_chg_hwinit(struct qpnp_chg_chip *chip, u8 subtype,
1074 struct spmi_resource *spmi_resource)
1075{
1076 int rc = 0;
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001077 u8 reg;
David Keitel80668952012-07-27 14:25:49 -07001078
1079 switch (subtype) {
1080 case SMBB_CHGR_SUBTYPE:
1081 chip->chg_done_irq = spmi_get_irq_byname(chip->spmi,
1082 spmi_resource, "chg-done");
1083 if (chip->chg_done_irq < 0) {
1084 pr_err("Unable to get chg_done irq\n");
1085 return -ENXIO;
1086 }
1087
1088 chip->chg_failed_irq = spmi_get_irq_byname(chip->spmi,
1089 spmi_resource, "chg-failed");
1090 if (chip->chg_failed_irq < 0) {
1091 pr_err("Unable to get chg_failed irq\n");
1092 return -ENXIO;
1093 }
1094 rc |= devm_request_irq(chip->dev, chip->chg_done_irq,
1095 qpnp_chg_chgr_chg_done_irq_handler,
1096 IRQF_TRIGGER_RISING, "chg_done", chip);
1097 if (rc < 0) {
1098 pr_err("Can't request %d chg_done for chg: %d\n",
1099 chip->chg_done_irq, rc);
1100 return -ENXIO;
1101 }
1102 rc |= devm_request_irq(chip->dev, chip->chg_failed_irq,
1103 qpnp_chg_chgr_chg_failed_irq_handler,
1104 IRQF_TRIGGER_RISING, "chg_failed", chip);
1105 if (rc < 0) {
1106 pr_err("Can't request %d chg_failed chg: %d\n",
1107 chip->chg_failed_irq, rc);
1108 return -ENXIO;
1109 }
1110
1111 rc = qpnp_chg_vinmin_set(chip, chip->min_voltage_mv);
1112 if (rc) {
1113 pr_debug("failed setting min_voltage rc=%d\n", rc);
1114 return rc;
1115 }
1116 rc = qpnp_chg_vddmax_set(chip, chip->max_voltage_mv);
1117 if (rc) {
1118 pr_debug("failed setting max_voltage rc=%d\n", rc);
1119 return rc;
1120 }
1121 rc = qpnp_chg_vddsafe_set(chip, chip->safe_voltage_mv);
1122 if (rc) {
1123 pr_debug("failed setting safe_voltage rc=%d\n", rc);
1124 return rc;
1125 }
David Keitel5d44fa52012-12-03 16:37:31 -08001126 rc = qpnp_chg_vbatdet_set(chip, chip->resume_voltage_mv);
1127 if (rc) {
1128 pr_debug("failed setting resume_voltage rc=%d\n", rc);
1129 return rc;
1130 }
David Keitel80668952012-07-27 14:25:49 -07001131 rc = qpnp_chg_ibatmax_set(chip, chip->max_bat_chg_current);
1132 if (rc) {
1133 pr_debug("failed setting ibatmax rc=%d\n", rc);
1134 return rc;
1135 }
1136 rc = qpnp_chg_ibatterm_set(chip, chip->term_current);
1137 if (rc) {
1138 pr_debug("failed setting ibatterm rc=%d\n", rc);
1139 return rc;
1140 }
David Keitel5d44fa52012-12-03 16:37:31 -08001141 rc = qpnp_chg_ibatsafe_set(chip, chip->safe_current);
1142 if (rc) {
1143 pr_debug("failed setting ibat_Safe rc=%d\n", rc);
1144 return rc;
1145 }
David Keitel80668952012-07-27 14:25:49 -07001146 /* HACK: Disable wdog */
1147 rc = qpnp_chg_masked_write(chip, chip->chgr_base + 0x62,
1148 0xFF, 0xA0, 1);
1149
1150 /* HACK: use analog EOC */
1151 rc = qpnp_chg_masked_write(chip, chip->chgr_base +
1152 CHGR_IBAT_TERM_CHGR,
1153 0x80, 0x80, 1);
1154
1155 enable_irq_wake(chip->chg_done_irq);
1156 break;
1157 case SMBB_BUCK_SUBTYPE:
1158 break;
1159 case SMBB_BAT_IF_SUBTYPE:
1160 /* HACK: Unlock secure access to override temp comparator */
1161 rc = qpnp_chg_masked_write(chip,
David Keiteld681cda2012-10-02 15:44:21 -07001162 chip->bat_if_base + SEC_ACCESS,
David Keitel80668952012-07-27 14:25:49 -07001163 0xA5, 0xA5, 1);
1164 pr_debug("override hot cold\n");
1165 rc = qpnp_chg_masked_write(chip,
1166 chip->bat_if_base + 0xE5,
1167 0xFF, 0x28, 1);
1168 break;
1169 case SMBB_USB_CHGPTH_SUBTYPE:
1170 chip->usbin_valid_irq = spmi_get_irq_byname(chip->spmi,
1171 spmi_resource, "usbin-valid");
1172 if (chip->usbin_valid_irq < 0) {
1173 pr_err("Unable to get usbin irq\n");
1174 return -ENXIO;
1175 }
1176 rc = devm_request_irq(chip->dev, chip->usbin_valid_irq,
1177 qpnp_chg_usb_usbin_valid_irq_handler,
1178 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1179 "chg_usbin_valid", chip);
1180 if (rc < 0) {
1181 pr_err("Can't request %d usbinvalid for chg: %d\n",
1182 chip->usbin_valid_irq, rc);
1183 return -ENXIO;
1184 }
1185
1186 enable_irq_wake(chip->usbin_valid_irq);
1187 chip->usb_present = qpnp_chg_is_usb_chg_plugged_in(chip);
1188 if (chip->usb_present) {
1189 rc = qpnp_chg_masked_write(chip,
1190 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1191 ENUM_T_STOP_BIT,
1192 ENUM_T_STOP_BIT, 1);
1193 if (rc) {
1194 pr_err("failed to write enum stop rc=%d\n", rc);
1195 return -ENXIO;
1196 }
1197 }
David Keiteld681cda2012-10-02 15:44:21 -07001198
1199 rc = qpnp_chg_masked_write(chip,
1200 chip->usb_chgpth_base + CHGR_USB_ENUM_T_STOP,
1201 ENUM_T_STOP_BIT,
1202 ENUM_T_STOP_BIT, 1);
1203
David Keitel80668952012-07-27 14:25:49 -07001204 break;
1205 case SMBB_DC_CHGPTH_SUBTYPE:
1206 break;
1207 case SMBB_BOOST_SUBTYPE:
1208 break;
1209 case SMBB_MISC_SUBTYPE:
1210 pr_debug("Setting BOOT_DONE\n");
1211 rc = qpnp_chg_masked_write(chip,
1212 chip->misc_base + CHGR_MISC_BOOT_DONE,
1213 CHGR_BOOT_DONE, CHGR_BOOT_DONE, 1);
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001214 rc = qpnp_chg_read(chip, &reg,
1215 chip->misc_base + MISC_REVISION2, 1);
1216 if (rc) {
1217 pr_err("failed to read revision register rc=%d\n", rc);
1218 return rc;
1219 }
David Keitel80668952012-07-27 14:25:49 -07001220
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001221 chip->revision = reg;
David Keitel80668952012-07-27 14:25:49 -07001222 break;
1223 default:
1224 pr_err("Invalid peripheral subtype\n");
1225 }
1226 return rc;
1227}
1228
1229static int __devinit
1230qpnp_charger_probe(struct spmi_device *spmi)
1231{
1232 u8 subtype;
1233 struct qpnp_chg_chip *chip;
1234 struct resource *resource;
1235 struct spmi_resource *spmi_resource;
1236 int rc = 0;
1237
1238 chip = kzalloc(sizeof *chip, GFP_KERNEL);
1239 if (chip == NULL) {
1240 pr_err("kzalloc() failed.\n");
1241 return -ENOMEM;
1242 }
1243
1244 rc = qpnp_vadc_is_ready();
1245 if (rc)
1246 goto fail_chg_enable;
1247
1248 chip->dev = &(spmi->dev);
1249 chip->spmi = spmi;
1250
1251 chip->usb_psy = power_supply_get_by_name("usb");
1252 if (!chip->usb_psy) {
1253 pr_err("usb supply not found deferring probe\n");
1254 rc = -EPROBE_DEFER;
1255 goto fail_chg_enable;
1256 }
1257
1258 /* Get the vddmax property */
1259 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vddmax-mv",
1260 &chip->max_voltage_mv);
1261 if (rc && rc != -EINVAL) {
1262 pr_err("Error reading vddmax property %d\n", rc);
1263 goto fail_chg_enable;
1264 }
1265
1266 /* Get the vinmin property */
1267 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vinmin-mv",
1268 &chip->min_voltage_mv);
1269 if (rc && rc != -EINVAL) {
1270 pr_err("Error reading vddmax property %d\n", rc);
1271 goto fail_chg_enable;
1272 }
1273
1274 /* Get the vddmax property */
1275 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-vddsafe-mv",
1276 &chip->safe_voltage_mv);
1277 if (rc && rc != -EINVAL) {
1278 pr_err("Error reading vddsave property %d\n", rc);
1279 goto fail_chg_enable;
1280 }
1281
David Keitel5d44fa52012-12-03 16:37:31 -08001282 /* Get the ibatsafe property */
1283 rc = of_property_read_u32(spmi->dev.of_node,
1284 "qcom,chg-vbatdet-mv",
1285 &chip->resume_voltage_mv);
1286 if (rc) {
1287 pr_err("Error reading vbatdet property %d\n", rc);
1288 goto fail_chg_enable;
1289 }
1290
1291 /* Get the ibatsafe property */
1292 rc = of_property_read_u32(spmi->dev.of_node,
1293 "qcom,chg-ibatsafe-ma",
1294 &chip->safe_current);
1295 if (rc) {
1296 pr_err("Error reading ibatsafe property %d\n", rc);
1297 goto fail_chg_enable;
1298 }
1299
David Keitel80668952012-07-27 14:25:49 -07001300 /* Get the ibatterm property */
1301 rc = of_property_read_u32(spmi->dev.of_node,
1302 "qcom,chg-ibatterm-ma",
1303 &chip->term_current);
1304 if (rc && rc != -EINVAL) {
1305 pr_err("Error reading ibatterm property %d\n", rc);
1306 goto fail_chg_enable;
1307 }
1308
1309 /* Get the ibatmax property */
1310 rc = of_property_read_u32(spmi->dev.of_node, "qcom,chg-ibatmax-ma",
1311 &chip->max_bat_chg_current);
1312 if (rc && rc != -EINVAL) {
1313 pr_err("Error reading ibatmax property %d\n", rc);
1314 goto fail_chg_enable;
1315 }
1316
David Keitelbf359042012-10-19 16:54:58 -07001317 /* Get the charging-disabled property */
David Keitel03ee6b52012-10-22 12:25:19 -07001318 chip->charging_disabled = of_property_read_bool(spmi->dev.of_node,
David Keitelbf359042012-10-19 16:54:58 -07001319 "qcom,chg-charging-disabled");
1320
David Keitel3dd5e0f2012-12-12 18:12:36 -08001321 /* Get the fake-batt-values property */
1322 chip->use_default_batt_values = of_property_read_bool(spmi->dev.of_node,
1323 "qcom,chg-use-default-batt-values");
1324
1325 /* Disable charging when faking battery values */
1326 if (chip->use_default_batt_values)
1327 chip->charging_disabled = true;
1328
David Keitel80668952012-07-27 14:25:49 -07001329 spmi_for_each_container_dev(spmi_resource, spmi) {
1330 if (!spmi_resource) {
1331 pr_err("qpnp_chg: spmi resource absent\n");
1332 rc = -ENXIO;
1333 goto fail_chg_enable;
1334 }
1335
1336 resource = spmi_get_resource(spmi, spmi_resource,
1337 IORESOURCE_MEM, 0);
1338 if (!(resource && resource->start)) {
1339 pr_err("node %s IO resource absent!\n",
1340 spmi->dev.of_node->full_name);
1341 rc = -ENXIO;
1342 goto fail_chg_enable;
1343 }
1344
1345 rc = qpnp_chg_read(chip, &subtype,
1346 resource->start + REG_OFFSET_PERP_SUBTYPE, 1);
1347 if (rc) {
1348 pr_err("Peripheral subtype read failed rc=%d\n", rc);
1349 goto fail_chg_enable;
1350 }
1351
1352 switch (subtype) {
1353 case SMBB_CHGR_SUBTYPE:
1354 chip->chgr_base = resource->start;
1355 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1356 if (rc) {
1357 pr_err("Failed to init subtype 0x%x rc=%d\n",
1358 subtype, rc);
1359 goto fail_chg_enable;
1360 }
1361 break;
1362 case SMBB_BUCK_SUBTYPE:
1363 chip->buck_base = resource->start;
1364 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1365 if (rc) {
1366 pr_err("Failed to init subtype 0x%x rc=%d\n",
1367 subtype, rc);
1368 goto fail_chg_enable;
1369 }
1370 break;
1371 case SMBB_BAT_IF_SUBTYPE:
1372 chip->bat_if_base = resource->start;
1373 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1374 if (rc) {
1375 pr_err("Failed to init subtype 0x%x rc=%d\n",
1376 subtype, rc);
1377 goto fail_chg_enable;
1378 }
1379 break;
1380 case SMBB_USB_CHGPTH_SUBTYPE:
1381 chip->usb_chgpth_base = resource->start;
1382 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1383 if (rc) {
1384 pr_err("Failed to init subtype 0x%x rc=%d\n",
1385 subtype, rc);
1386 goto fail_chg_enable;
1387 }
1388 break;
1389 case SMBB_DC_CHGPTH_SUBTYPE:
1390 chip->dc_chgpth_base = resource->start;
1391 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1392 if (rc) {
1393 pr_err("Failed to init subtype 0x%x rc=%d\n",
1394 subtype, rc);
1395 goto fail_chg_enable;
1396 }
1397 break;
1398 case SMBB_BOOST_SUBTYPE:
1399 chip->boost_base = resource->start;
1400 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1401 if (rc) {
1402 pr_err("Failed to init subtype 0x%x rc=%d\n",
1403 subtype, rc);
1404 goto fail_chg_enable;
1405 }
1406 break;
1407 case SMBB_MISC_SUBTYPE:
1408 chip->misc_base = resource->start;
1409 rc = qpnp_chg_hwinit(chip, subtype, spmi_resource);
1410 if (rc) {
1411 pr_err("Failed to init subtype=0x%x rc=%d\n",
1412 subtype, rc);
1413 goto fail_chg_enable;
1414 }
1415 break;
1416 default:
1417 pr_err("Invalid peripheral subtype=0x%x\n", subtype);
1418 rc = -EINVAL;
1419 goto fail_chg_enable;
1420 }
1421 }
1422 dev_set_drvdata(&spmi->dev, chip);
1423 device_init_wakeup(&spmi->dev, 1);
1424
1425 chip->dc_psy.name = "qpnp-dc";
1426 chip->dc_psy.type = POWER_SUPPLY_TYPE_MAINS;
1427 chip->dc_psy.supplied_to = pm_power_supplied_to;
1428 chip->dc_psy.num_supplicants = ARRAY_SIZE(pm_power_supplied_to);
1429 chip->dc_psy.properties = pm_power_props_mains;
1430 chip->dc_psy.num_properties = ARRAY_SIZE(pm_power_props_mains);
1431 chip->dc_psy.get_property = qpnp_power_get_property_mains;
1432
1433 chip->batt_psy.name = "battery";
1434 chip->batt_psy.type = POWER_SUPPLY_TYPE_BATTERY;
1435 chip->batt_psy.properties = msm_batt_power_props;
1436 chip->batt_psy.num_properties = ARRAY_SIZE(msm_batt_power_props);
1437 chip->batt_psy.get_property = qpnp_batt_power_get_property;
David Keitelb80eda82012-10-15 10:49:11 -07001438 chip->batt_psy.set_property = qpnp_batt_power_set_property;
David Keitel03ee6b52012-10-22 12:25:19 -07001439 chip->batt_psy.property_is_writeable = qpnp_batt_property_is_writeable;
David Keitel80668952012-07-27 14:25:49 -07001440 chip->batt_psy.external_power_changed =
1441 qpnp_batt_external_power_changed;
1442
1443 rc = power_supply_register(chip->dev, &chip->dc_psy);
1444 if (rc < 0) {
1445 pr_err("power_supply_register usb failed rc = %d\n", rc);
1446 goto fail_chg_enable;
1447 }
1448
1449 rc = power_supply_register(chip->dev, &chip->batt_psy);
1450 if (rc < 0) {
1451 pr_err("power_supply_register batt failed rc = %d\n", rc);
1452 goto unregister_dc;
1453 }
1454
Sridhar Parasuramae183bd2012-12-21 09:28:46 -08001455 /* Turn on appropriate workaround flags */
1456 qpnp_chg_setup_flags(chip);
1457
David Keitel80668952012-07-27 14:25:49 -07001458 power_supply_set_present(chip->usb_psy,
1459 qpnp_chg_is_usb_chg_plugged_in(chip));
1460
David Keitel03ee6b52012-10-22 12:25:19 -07001461 qpnp_chg_charge_en(chip, !chip->charging_disabled);
David Keitelb1ddb742012-11-06 19:05:51 -08001462 qpnp_chg_force_run_on_batt(chip, chip->charging_disabled);
David Keitelbf359042012-10-19 16:54:58 -07001463
David Keitel80668952012-07-27 14:25:49 -07001464 pr_info("Probe success !\n");
1465 return 0;
1466
1467unregister_dc:
1468 power_supply_unregister(&chip->dc_psy);
1469fail_chg_enable:
1470 kfree(chip);
1471 dev_set_drvdata(&spmi->dev, NULL);
1472 return rc;
1473}
1474
1475static int __devexit
1476qpnp_charger_remove(struct spmi_device *spmi)
1477{
1478 struct qpnp_chg_chip *chip = dev_get_drvdata(&spmi->dev);
David Keitel80668952012-07-27 14:25:49 -07001479 dev_set_drvdata(&spmi->dev, NULL);
1480 kfree(chip);
1481
1482 return 0;
1483}
1484
1485static struct spmi_driver qpnp_charger_driver = {
1486 .probe = qpnp_charger_probe,
1487 .remove = __devexit_p(qpnp_charger_remove),
1488 .driver = {
1489 .name = QPNP_CHARGER_DEV_NAME,
1490 .owner = THIS_MODULE,
1491 .of_match_table = qpnp_charger_match_table,
1492 },
1493};
1494
1495/**
1496 * qpnp_chg_init() - register spmi driver for qpnp-chg
1497 */
1498int __init
1499qpnp_chg_init(void)
1500{
1501 return spmi_driver_register(&qpnp_charger_driver);
1502}
1503module_init(qpnp_chg_init);
1504
1505static void __exit
1506qpnp_chg_exit(void)
1507{
1508 spmi_driver_unregister(&qpnp_charger_driver);
1509}
1510module_exit(qpnp_chg_exit);
1511
1512
1513MODULE_DESCRIPTION("QPNP charger driver");
1514MODULE_LICENSE("GPL v2");
1515MODULE_ALIAS("platform:" QPNP_CHARGER_DEV_NAME);