1 /* drivers/power/rt5025-power.c
2 * I2C Driver for Richtek RT5025 PMIC
3 * Multi function device - multi functional baseband PMIC Power part
6 * Author: CY Huang <cy_huang@richtek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/i2c.h>
17 #include <linux/power_supply.h>
18 #include <linux/platform_device.h>
19 #include <linux/err.h>
20 #include <linux/version.h>
21 #include <linux/slab.h>
22 #include <linux/workqueue.h>
23 #include <linux/mfd/rt5025.h>
24 #include <linux/power/rt5025-power.h>
25 #include <linux/delay.h>
27 static struct platform_device *dev_ptr;
30 static enum power_supply_property rt5025_adap_props[] = {
31 POWER_SUPPLY_PROP_ONLINE,
34 static char *rt5025_supply_list[] = {
39 int rt5025_set_charging_current_switch (struct i2c_client *i2c, int onoff)
43 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCEN_MASK);
45 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCEN_MASK);
48 EXPORT_SYMBOL(rt5025_set_charging_current_switch);
50 int rt5025_set_charging_buck(struct i2c_client *i2c, int onoff)
54 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
56 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
59 EXPORT_SYMBOL(rt5025_set_charging_buck);
61 int rt5025_ext_set_charging_buck(int onoff)
63 struct rt5025_power_info *pi = platform_get_drvdata(dev_ptr);
68 ret = rt5025_set_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
74 ret = rt5025_clr_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
79 EXPORT_SYMBOL(rt5025_ext_set_charging_buck);
81 int rt5025_charger_reset_and_reinit(struct rt5025_power_info *pi)
83 struct rt5025_platform_data *pdata = pi->dev->parent->platform_data;
89 ret = rt5025_reg_read(pi->i2c, RT5025_REG_CHGCTL4);
92 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL4, ret|RT5025_CHGRST_MASK);
95 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL2, pdata->power_data->CHGControl2.val);
96 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL3, pdata->power_data->CHGControl3.val);
97 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL4, pdata->power_data->CHGControl4.val);
98 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL5, pdata->power_data->CHGControl5.val);
99 rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL6, pdata->power_data->CHGControl6.val);
100 //rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL7, pd->CHGControl7.val);
101 rt5025_assign_bits(pi->i2c, RT5025_REG_CHGCTL7, 0xEF, pdata->power_data->CHGControl7.val);
102 rt5025_reg_write(pi->i2c, 0xA9, 0x60 );
105 EXPORT_SYMBOL(rt5025_charger_reset_and_reinit);
107 static int rt5025_set_charging_current(struct i2c_client *i2c, int cur_value)
114 if (cur_value > 2000)
116 else if (cur_value >= 500 && cur_value <= 2000)
118 data = (cur_value-500)/100;
124 if (cur_value > 1000)
126 else if (cur_value > 500 && cur_value <= 1000)
128 else if (cur_value > 100 && cur_value >= 500)
131 rt5025_assign_bits(i2c, RT5025_REG_CHGCTL4, RT5025_CHGAICR_MASK, data);
135 static int rt5025_chgstat_changed(struct rt5025_power_info *info, unsigned new_val)
142 rt5025_set_charging_current_switch(info->i2c, 1);
143 rt5025_set_charging_buck(info->i2c, 1);
145 info->chg_stat = 0x00;
147 if (info->chip->battery_info)
149 if (info->chg_term <= 1)
150 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
151 else if (info->chg_term == 2)
153 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
154 //info->chg_term = 0;
156 else if (info->chg_term > 2)
160 if (info->event_callback)
161 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_CHARGING);
165 //rt5025_set_charging_current_switch(info->i2c, 1);
166 info->chg_stat = 0x01;
168 if (info->chip->battery_info)
170 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
174 if (info->event_callback)
175 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_CHARGING);
180 rt5025_set_charging_current_switch(info->i2c, 0);
182 info->chg_stat = 0x02;
184 if (info->chip->battery_info)
186 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
190 if (info->event_callback)
191 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_FULL);
196 rt5025_set_charging_buck(info->i2c, 0);
197 rt5025_set_charging_current_switch(info->i2c, 0);
199 info->chg_stat = 0x03;
201 if (info->chip->battery_info)
203 if (info->chg_term <= 1)
204 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
205 else if (info->chg_term == 2)
207 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
208 //info->chg_term = 0;
210 else if (info->chg_term > 2)
214 if (info->event_callback)
215 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_DISCHARGING);
225 int rt5025_power_passirq_to_gauge(struct rt5025_power_info *info)
227 if (info->event_callback)
228 info->event_callback->rt5025_gauge_irq_handler();
231 EXPORT_SYMBOL(rt5025_power_passirq_to_gauge);
234 int rt5025_power_charge_detect(struct rt5025_power_info *info)
237 unsigned char chgstatval = 0;
238 unsigned old_usbval, old_acval, old_chgval, new_usbval, new_acval, new_chgval;
240 old_acval = info->ac_online;
241 old_usbval = info->usb_online;
242 old_chgval = info->chg_stat;
246 ret = rt5025_reg_read(info->i2c, RT5025_REG_CHGSTAT);
249 dev_err(info->dev, "read chg stat reg fail\n");
253 RTINFO("chgstat = 0x%02x\n", chgstatval);
257 ret = rt5025_set_bits(info->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
261 new_acval = (chgstatval&RT5025_CHG_ACONLINE)>>RT5025_CHG_ACSHIFT;
262 if (old_acval != new_acval)
264 info->ac_online = new_acval;
265 power_supply_changed(&info->ac);
268 new_usbval = (info->otg_en? \
269 0:(chgstatval&RT5025_CHG_USBONLINE)>>RT5025_CHG_USBSHIFT);
270 if (old_usbval != new_usbval)
272 info->usb_online = new_usbval;
273 power_supply_changed(&info->usb);
276 if (info->otg_en && new_acval == 0)
278 ret = rt5025_clr_bits(info->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
282 //if (old_acval != new_acval || old_usbval != new_usbval)
283 if (new_acval || new_usbval)
286 schedule_delayed_work(&info->usb_detect_work, 0); //no delay
289 new_chgval = (chgstatval&RT5025_CHGSTAT_MASK)>>RT5025_CHGSTAT_SHIFT;
291 if (new_acval || new_usbval)
293 //if (old_chgval != new_chgval)
295 ret = rt5025_chgstat_changed(info, new_chgval);
301 rt5025_set_charging_buck(info->i2c, 0);
302 rt5025_set_charging_current_switch(info->i2c, 0);
304 info->chg_stat = RT5025_CHGSTAT_UNKNOWN;
305 if (info->chip->jeita_info)
306 rt5025_notify_charging_cable(info->chip->jeita_info, JEITA_NO_CHARGE);
308 if (info->chip->battery_info)
309 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_DISCHARGING);
311 if (info->event_callback)
312 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_NOT_CHARGING);
318 EXPORT_SYMBOL(rt5025_power_charge_detect);
320 static int rt5025_adap_get_props(struct power_supply *psy,
321 enum power_supply_property psp,
322 union power_supply_propval *val)
324 struct rt5025_power_info *info = dev_get_drvdata(psy->dev->parent);
327 case POWER_SUPPLY_PROP_ONLINE:
328 if (psy->type == POWER_SUPPLY_TYPE_MAINS)
329 val->intval = info->ac_online;
330 else if (psy->type == POWER_SUPPLY_TYPE_USB)
331 val->intval = info->usb_online;
342 extern int dwc_vbus_status(void);
345 static void usb_detect_work_func(struct work_struct *work)
347 struct delayed_work *delayed_work = (struct delayed_work *)container_of(work, struct delayed_work, work);
348 struct rt5025_power_info *pi = (struct rt5025_power_info *)container_of(delayed_work, struct rt5025_power_info, usb_detect_work);
350 RTINFO("rt5025: %s ++", __func__);
352 mutex_lock(&pi->var_lock);
355 rt5025_set_charging_current(pi->i2c, 2000);
356 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_AC_ADAPTER);
359 else if (pi->usb_online)
361 RTINFO("%s: usb_cnt %d\n", __func__, pi->usb_cnt);
362 switch(dwc_vbus_status())
364 case 2: // USB Wall charger
365 rt5025_set_charging_current(pi->i2c, 2000);
366 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_USB_TA);
367 RTINFO("rt5025: detect usb wall charger\n");
371 rt5025_set_charging_current(pi->i2c, 2000);
372 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_NORMAL_USB);
373 RTINFO("rt5025: detect normal usb\n");
376 if (pi->usb_cnt++ < 60)
377 schedule_delayed_work(&pi->usb_detect_work, 1*HZ);
381 //default to prevent over current charging
382 rt5025_set_charging_current(pi->i2c, 500);
383 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_NO_CHARGE);
387 mutex_unlock(&pi->var_lock);
389 RTINFO("rt5025: %s --", __func__);
392 static int __devinit rt5025_init_charger(struct rt5025_power_info *info, struct rt5025_power_data* pd)
394 //unsigned char data;
397 //init charger buckck & charger current en to disable stat
398 info->chg_stat = RT5025_CHGSTAT_UNKNOWN;
400 if (info->event_callback)
401 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_DISCHARGING);
403 //rt5025_set_bits(info->i2c, RT5025_REG_CHGCTL4, RT5025_CHGRST_MASK);
405 //init register setting
406 rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL2, pd->CHGControl2.val);
407 rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL3, pd->CHGControl3.val);
408 rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL4, pd->CHGControl4.val);
409 rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL5, pd->CHGControl5.val);
410 rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL6, pd->CHGControl6.val);
411 //rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL7, pd->CHGControl7.val);
412 rt5025_assign_bits(info->i2c, RT5025_REG_CHGCTL7, 0xEF, pd->CHGControl7.val);
413 rt5025_reg_write(info->i2c, 0xA9, 0x60 );
414 //Special buck setting
417 data = rt5025_reg_read(info->i2c, 0x47);
419 rt5025_reg_write(info->i2c, 0x47, data);
421 data = rt5025_reg_read(info->i2c, 0x48);
423 rt5025_reg_write(info->i2c, 0x48, data);
425 data = rt5025_reg_read(info->i2c, 0x49);
427 rt5025_reg_write(info->i2c, 0x49, data);
430 rt5025_power_charge_detect(info);
435 static int __devinit rt5025_power_probe(struct platform_device *pdev)
437 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
438 struct rt5025_platform_data *pdata = chip->dev->platform_data;
439 struct rt5025_power_info *pi;
442 pi = kzalloc(sizeof(*pi), GFP_KERNEL);
447 pi->dev = &pdev->dev;
449 mutex_init(&pi->var_lock);
450 INIT_DELAYED_WORK(&pi->usb_detect_work, usb_detect_work_func);
453 ret = rt5025_gauge_init(pi);
458 platform_set_drvdata(pdev, pi);
461 pi->ac.name = "rt5025-dc";
462 pi->ac.type = POWER_SUPPLY_TYPE_MAINS;
463 pi->ac.supplied_to = rt5025_supply_list;
464 pi->ac.properties = rt5025_adap_props;
465 pi->ac.num_properties = ARRAY_SIZE(rt5025_adap_props);
466 pi->ac.get_property = rt5025_adap_get_props;
467 ret = power_supply_register(&pdev->dev, &pi->ac);
471 pi->usb.name = "rt5025-usb";
472 pi->usb.type = POWER_SUPPLY_TYPE_USB;
473 pi->ac.supplied_to = rt5025_supply_list;
474 pi->usb.properties = rt5025_adap_props;
475 pi->usb.num_properties = ARRAY_SIZE(rt5025_adap_props);
476 pi->usb.get_property = rt5025_adap_get_props;
477 ret = power_supply_register(&pdev->dev, &pi->usb);
481 rt5025_init_charger(pi, pdata->power_data);
482 chip->power_info = pi;
484 pr_info("rt5025-power driver is successfully loaded\n");
488 power_supply_unregister(&pi->ac);
495 static int rt5025_power_suspend(struct platform_device *pdev, pm_message_t state)
498 struct rt5025_power_info *pi = platform_get_drvdata(pdev);
500 if (pi->event_callback)
501 pi->event_callback->rt5025_gauge_suspend();
507 static int rt5025_power_resume(struct platform_device *pdev)
510 struct rt5025_power_info *pi = platform_get_drvdata(pdev);
512 if (pi->event_callback)
513 pi->event_callback->rt5025_gauge_resume();
519 static int __devexit rt5025_power_remove(struct platform_device *pdev)
521 struct rt5025_power_info *pi = platform_get_drvdata(pdev);
522 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
525 if (pi->event_callback)
526 pi->event_callback->rt5025_gauge_remove();
528 power_supply_unregister(&pi->usb);
529 power_supply_unregister(&pi->ac);
530 chip->power_info = NULL;
537 static struct platform_driver rt5025_power_driver =
540 .name = RT5025_DEVICE_NAME "-power",
541 .owner = THIS_MODULE,
543 .probe = rt5025_power_probe,
544 .remove = __devexit_p(rt5025_power_remove),
545 .suspend = rt5025_power_suspend,
546 .resume = rt5025_power_resume,
549 static int __init rt5025_power_init(void)
551 return platform_driver_register(&rt5025_power_driver);
553 late_initcall_sync(rt5025_power_init);
555 static void __exit rt5025_power_exit(void)
557 platform_driver_unregister(&rt5025_power_driver);
559 module_exit(rt5025_power_exit);
562 MODULE_LICENSE("GPL v2");
563 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
564 MODULE_DESCRIPTION("Power/Gauge driver for RT5025");
565 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-power");
566 MODULE_VERSION(RT5025_DRV_VER);