2 * Driver for LP8727 Micro/Mini USB IC with integrated charger
4 * Copyright (C) 2011 Texas Instruments
5 * Copyright (C) 2011 National Semiconductor
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/interrupt.h>
16 #include <linux/i2c.h>
17 #include <linux/power_supply.h>
18 #include <linux/lp8727.h>
20 #define DEBOUNCE_MSEC 270
33 #define CP_EN (1 << 0)
34 #define ADC_EN (1 << 1)
35 #define ID200_EN (1 << 4)
38 #define CHGDET_EN (1 << 1)
39 #define INT_EN (1 << 6)
42 #define SW_DM1_DM (0x0 << 0)
43 #define SW_DM1_U1 (0x1 << 0)
44 #define SW_DM1_HiZ (0x7 << 0)
45 #define SW_DP2_DP (0x0 << 3)
46 #define SW_DP2_U2 (0x1 << 3)
47 #define SW_DP2_HiZ (0x7 << 3)
50 #define IDNO (0xF << 0)
53 /* STATUS1 register */
54 #define CHGSTAT (3 << 4)
55 #define CHPORT (1 << 6)
56 #define DCPORT (1 << 7)
58 /* STATUS2 register */
59 #define TEMP_STAT (3 << 5)
70 enum lp8727_chg_stat
{
78 struct power_supply ac
;
79 struct power_supply usb
;
80 struct power_supply batt
;
85 struct i2c_client
*client
;
86 struct mutex xfer_lock
;
87 struct delayed_work work
;
88 struct workqueue_struct
*irqthread
;
89 struct lp8727_platform_data
*pdata
;
90 struct lp8727_psy
*psy
;
91 struct lp8727_chg_param
*chg_parm
;
92 enum lp8727_dev_id devid
;
95 static int lp8727_read_bytes(struct lp8727_chg
*pchg
, u8 reg
, u8
*data
, u8 len
)
99 mutex_lock(&pchg
->xfer_lock
);
100 ret
= i2c_smbus_read_i2c_block_data(pchg
->client
, reg
, len
, data
);
101 mutex_unlock(&pchg
->xfer_lock
);
103 return (ret
!= len
) ? -EIO
: 0;
106 static inline int lp8727_read_byte(struct lp8727_chg
*pchg
, u8 reg
, u8
*data
)
108 return lp8727_read_bytes(pchg
, reg
, data
, 1);
111 static int lp8727_write_byte(struct lp8727_chg
*pchg
, u8 reg
, u8 data
)
115 mutex_lock(&pchg
->xfer_lock
);
116 ret
= i2c_smbus_write_byte_data(pchg
->client
, reg
, data
);
117 mutex_unlock(&pchg
->xfer_lock
);
122 static int lp8727_is_charger_attached(const char *name
, int id
)
125 if (!strcmp(name
, "ac"))
126 return (id
== ID_TA
|| id
== ID_DEDICATED_CHG
) ? 1 : 0;
127 else if (!strcmp(name
, "usb"))
128 return (id
== ID_USB_CHG
) ? 1 : 0;
131 return (id
>= ID_TA
&& id
<= ID_USB_CHG
) ? 1 : 0;
134 static int lp8727_init_device(struct lp8727_chg
*pchg
)
139 val
= ID200_EN
| ADC_EN
| CP_EN
;
140 ret
= lp8727_write_byte(pchg
, CTRL1
, val
);
144 val
= INT_EN
| CHGDET_EN
;
145 ret
= lp8727_write_byte(pchg
, CTRL2
, val
);
152 static int lp8727_is_dedicated_charger(struct lp8727_chg
*pchg
)
155 lp8727_read_byte(pchg
, STATUS1
, &val
);
159 static int lp8727_is_usb_charger(struct lp8727_chg
*pchg
)
162 lp8727_read_byte(pchg
, STATUS1
, &val
);
166 static void lp8727_ctrl_switch(struct lp8727_chg
*pchg
, u8 sw
)
168 lp8727_write_byte(pchg
, SWCTRL
, sw
);
171 static void lp8727_id_detection(struct lp8727_chg
*pchg
, u8 id
, int vbusin
)
174 u8 swctrl
= SW_DM1_HiZ
| SW_DP2_HiZ
;
179 pchg
->chg_parm
= &pchg
->pdata
->ac
;
182 if (lp8727_is_dedicated_charger(pchg
)) {
183 pchg
->chg_parm
= &pchg
->pdata
->ac
;
184 devid
= ID_DEDICATED_CHG
;
185 } else if (lp8727_is_usb_charger(pchg
)) {
186 pchg
->chg_parm
= &pchg
->pdata
->usb
;
188 swctrl
= SW_DM1_DM
| SW_DP2_DP
;
191 swctrl
= SW_DM1_DM
| SW_DP2_DP
;
196 pchg
->chg_parm
= NULL
;
201 lp8727_ctrl_switch(pchg
, swctrl
);
204 static void lp8727_enable_chgdet(struct lp8727_chg
*pchg
)
208 lp8727_read_byte(pchg
, CTRL2
, &val
);
210 lp8727_write_byte(pchg
, CTRL2
, val
);
213 static void lp8727_delayed_func(struct work_struct
*_work
)
215 u8 intstat
[2], idno
, vbus
;
216 struct lp8727_chg
*pchg
=
217 container_of(_work
, struct lp8727_chg
, work
.work
);
219 if (lp8727_read_bytes(pchg
, INT1
, intstat
, 2)) {
220 dev_err(pchg
->dev
, "can not read INT registers\n");
224 idno
= intstat
[0] & IDNO
;
225 vbus
= intstat
[0] & VBUS
;
227 lp8727_id_detection(pchg
, idno
, vbus
);
228 lp8727_enable_chgdet(pchg
);
230 power_supply_changed(&pchg
->psy
->ac
);
231 power_supply_changed(&pchg
->psy
->usb
);
232 power_supply_changed(&pchg
->psy
->batt
);
235 static irqreturn_t
lp8727_isr_func(int irq
, void *ptr
)
237 struct lp8727_chg
*pchg
= ptr
;
238 unsigned long delay
= msecs_to_jiffies(DEBOUNCE_MSEC
);
240 queue_delayed_work(pchg
->irqthread
, &pchg
->work
, delay
);
245 static int lp8727_intr_config(struct lp8727_chg
*pchg
)
247 INIT_DELAYED_WORK(&pchg
->work
, lp8727_delayed_func
);
249 pchg
->irqthread
= create_singlethread_workqueue("lp8727-irqthd");
250 if (!pchg
->irqthread
) {
251 dev_err(pchg
->dev
, "can not create thread for lp8727\n");
255 return request_threaded_irq(pchg
->client
->irq
,
258 IRQF_TRIGGER_FALLING
,
263 static enum power_supply_property lp8727_charger_prop
[] = {
264 POWER_SUPPLY_PROP_ONLINE
,
267 static enum power_supply_property lp8727_battery_prop
[] = {
268 POWER_SUPPLY_PROP_STATUS
,
269 POWER_SUPPLY_PROP_HEALTH
,
270 POWER_SUPPLY_PROP_PRESENT
,
271 POWER_SUPPLY_PROP_VOLTAGE_NOW
,
272 POWER_SUPPLY_PROP_CAPACITY
,
273 POWER_SUPPLY_PROP_TEMP
,
276 static char *battery_supplied_to
[] = {
280 static int lp8727_charger_get_property(struct power_supply
*psy
,
281 enum power_supply_property psp
,
282 union power_supply_propval
*val
)
284 struct lp8727_chg
*pchg
= dev_get_drvdata(psy
->dev
->parent
);
286 if (psp
== POWER_SUPPLY_PROP_ONLINE
)
287 val
->intval
= lp8727_is_charger_attached(psy
->name
,
293 static int lp8727_battery_get_property(struct power_supply
*psy
,
294 enum power_supply_property psp
,
295 union power_supply_propval
*val
)
297 struct lp8727_chg
*pchg
= dev_get_drvdata(psy
->dev
->parent
);
301 case POWER_SUPPLY_PROP_STATUS
:
302 if (lp8727_is_charger_attached(psy
->name
, pchg
->devid
)) {
303 lp8727_read_byte(pchg
, STATUS1
, &read
);
304 if (((read
& CHGSTAT
) >> 4) == EOC
)
305 val
->intval
= POWER_SUPPLY_STATUS_FULL
;
307 val
->intval
= POWER_SUPPLY_STATUS_CHARGING
;
309 val
->intval
= POWER_SUPPLY_STATUS_DISCHARGING
;
312 case POWER_SUPPLY_PROP_HEALTH
:
313 lp8727_read_byte(pchg
, STATUS2
, &read
);
314 read
= (read
& TEMP_STAT
) >> 5;
315 if (read
>= 0x1 && read
<= 0x3)
316 val
->intval
= POWER_SUPPLY_HEALTH_OVERHEAT
;
318 val
->intval
= POWER_SUPPLY_HEALTH_GOOD
;
320 case POWER_SUPPLY_PROP_PRESENT
:
321 if (pchg
->pdata
->get_batt_present
)
322 val
->intval
= pchg
->pdata
->get_batt_present();
324 case POWER_SUPPLY_PROP_VOLTAGE_NOW
:
325 if (pchg
->pdata
->get_batt_level
)
326 val
->intval
= pchg
->pdata
->get_batt_level();
328 case POWER_SUPPLY_PROP_CAPACITY
:
329 if (pchg
->pdata
->get_batt_capacity
)
330 val
->intval
= pchg
->pdata
->get_batt_capacity();
332 case POWER_SUPPLY_PROP_TEMP
:
333 if (pchg
->pdata
->get_batt_temp
)
334 val
->intval
= pchg
->pdata
->get_batt_temp();
343 static void lp8727_charger_changed(struct power_supply
*psy
)
345 struct lp8727_chg
*pchg
= dev_get_drvdata(psy
->dev
->parent
);
349 if (lp8727_is_charger_attached(psy
->name
, pchg
->devid
)) {
350 if (pchg
->chg_parm
) {
351 eoc_level
= pchg
->chg_parm
->eoc_level
;
352 ichg
= pchg
->chg_parm
->ichg
;
353 val
= (ichg
<< 4) | eoc_level
;
354 lp8727_write_byte(pchg
, CHGCTRL2
, val
);
359 static int lp8727_register_psy(struct lp8727_chg
*pchg
)
361 struct lp8727_psy
*psy
;
363 psy
= kzalloc(sizeof(*psy
), GFP_KERNEL
);
370 psy
->ac
.type
= POWER_SUPPLY_TYPE_MAINS
;
371 psy
->ac
.properties
= lp8727_charger_prop
;
372 psy
->ac
.num_properties
= ARRAY_SIZE(lp8727_charger_prop
);
373 psy
->ac
.get_property
= lp8727_charger_get_property
;
374 psy
->ac
.supplied_to
= battery_supplied_to
;
375 psy
->ac
.num_supplicants
= ARRAY_SIZE(battery_supplied_to
);
377 if (power_supply_register(pchg
->dev
, &psy
->ac
))
380 psy
->usb
.name
= "usb";
381 psy
->usb
.type
= POWER_SUPPLY_TYPE_USB
;
382 psy
->usb
.properties
= lp8727_charger_prop
;
383 psy
->usb
.num_properties
= ARRAY_SIZE(lp8727_charger_prop
);
384 psy
->usb
.get_property
= lp8727_charger_get_property
;
385 psy
->usb
.supplied_to
= battery_supplied_to
;
386 psy
->usb
.num_supplicants
= ARRAY_SIZE(battery_supplied_to
);
388 if (power_supply_register(pchg
->dev
, &psy
->usb
))
391 psy
->batt
.name
= "main_batt";
392 psy
->batt
.type
= POWER_SUPPLY_TYPE_BATTERY
;
393 psy
->batt
.properties
= lp8727_battery_prop
;
394 psy
->batt
.num_properties
= ARRAY_SIZE(lp8727_battery_prop
);
395 psy
->batt
.get_property
= lp8727_battery_get_property
;
396 psy
->batt
.external_power_changed
= lp8727_charger_changed
;
398 if (power_supply_register(pchg
->dev
, &psy
->batt
))
410 static void lp8727_unregister_psy(struct lp8727_chg
*pchg
)
412 struct lp8727_psy
*psy
= pchg
->psy
;
417 power_supply_unregister(&psy
->ac
);
418 power_supply_unregister(&psy
->usb
);
419 power_supply_unregister(&psy
->batt
);
423 static int lp8727_probe(struct i2c_client
*cl
, const struct i2c_device_id
*id
)
425 struct lp8727_chg
*pchg
;
428 if (!i2c_check_functionality(cl
->adapter
, I2C_FUNC_SMBUS_I2C_BLOCK
))
431 pchg
= kzalloc(sizeof(*pchg
), GFP_KERNEL
);
436 pchg
->dev
= &cl
->dev
;
437 pchg
->pdata
= cl
->dev
.platform_data
;
438 i2c_set_clientdata(cl
, pchg
);
440 mutex_init(&pchg
->xfer_lock
);
442 ret
= lp8727_init_device(pchg
);
444 dev_err(pchg
->dev
, "i2c communication err: %d", ret
);
448 ret
= lp8727_intr_config(pchg
);
450 dev_err(pchg
->dev
, "irq handler err: %d", ret
);
454 ret
= lp8727_register_psy(pchg
);
456 dev_err(pchg
->dev
, "power supplies register err: %d", ret
);
467 static int __devexit
lp8727_remove(struct i2c_client
*cl
)
469 struct lp8727_chg
*pchg
= i2c_get_clientdata(cl
);
471 lp8727_unregister_psy(pchg
);
472 free_irq(pchg
->client
->irq
, pchg
);
473 flush_workqueue(pchg
->irqthread
);
474 destroy_workqueue(pchg
->irqthread
);
479 static const struct i2c_device_id lp8727_ids
[] = {
483 MODULE_DEVICE_TABLE(i2c
, lp8727_ids
);
485 static struct i2c_driver lp8727_driver
= {
489 .probe
= lp8727_probe
,
490 .remove
= __devexit_p(lp8727_remove
),
491 .id_table
= lp8727_ids
,
493 module_i2c_driver(lp8727_driver
);
495 MODULE_DESCRIPTION("TI/National Semiconductor LP8727 charger driver");
496 MODULE_AUTHOR("Woogyom Kim <milo.kim@ti.com>, "
497 "Daniel Jeong <daniel.jeong@ti.com>");
498 MODULE_LICENSE("GPL");