rk31:pmu:rt5025:modify rt5025 fg init priority
[firefly-linux-kernel-4.4.55.git] / drivers / power / rt5025-power.c
1 /* drivers/power/rt5025-power.c
2  * I2C Driver for Richtek RT5025 PMIC
3  * Multi function device - multi functional baseband PMIC Power part
4  *
5  * Copyright (C) 2013
6  * Author: CY Huang <cy_huang@richtek.com>
7  *
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.
11  */
12
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>
26
27 static struct platform_device *dev_ptr;
28
29
30 static enum power_supply_property rt5025_adap_props[] = {
31         POWER_SUPPLY_PROP_ONLINE,
32 };
33
34 static char *rt5025_supply_list[] = {
35         "rt5025-battery",
36 };
37
38
39 int rt5025_set_charging_current_switch (struct i2c_client *i2c, int onoff)
40 {
41         int ret;
42         if (onoff)
43                 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCEN_MASK);
44         else
45                 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCEN_MASK);
46         return ret;
47 }
48 EXPORT_SYMBOL(rt5025_set_charging_current_switch);
49
50 int rt5025_set_charging_buck(struct i2c_client *i2c, int onoff)
51 {
52         int ret;
53         if (onoff)
54                 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
55         else
56                 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
57         return ret;
58 }
59 EXPORT_SYMBOL(rt5025_set_charging_buck);
60
61 int rt5025_ext_set_charging_buck(int onoff)
62 {
63         struct rt5025_power_info *pi = platform_get_drvdata(dev_ptr);
64         int ret;
65         if (onoff)
66         {
67                 pi->otg_en = 0;
68                 ret = rt5025_set_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
69                 msleep(100);
70         }
71         else
72         {
73                 pi->otg_en = 1;
74                 ret = rt5025_clr_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
75                 msleep(100);
76         }
77         return ret;
78 }
79 EXPORT_SYMBOL(rt5025_ext_set_charging_buck);
80
81 static int rt5025_set_charging_current(struct i2c_client *i2c, int cur_value)
82 {
83         int ret = 0;
84         u8 data = 0;
85
86         //ICC Setting
87         #if 0
88         if (cur_value > 2000)
89                 data |= 0x0f<<3;
90         else if (cur_value >= 500 && cur_value <= 2000)
91         {
92                 data = (cur_value-500)/100;
93                 data<<=3;
94         }
95         #endif
96
97         //AICR Setting
98         if (cur_value > 1000)
99                 data |= 0x03<<1;
100         else if (cur_value > 500 && cur_value <= 1000)
101                 data |= 0x02<<1;
102         else if (cur_value > 100 && cur_value >= 500)
103                 data |= 0x01<<1;
104
105         rt5025_assign_bits(i2c, RT5025_REG_CHGCTL4, RT5025_CHGAICR_MASK, data);
106         return ret;
107 }
108
109 static int rt5025_chgstat_changed(struct rt5025_power_info *info, unsigned new_val)
110 {
111         int ret = 0;
112         switch (new_val)
113         {
114                 case 0x00:
115                         #if 0
116                         rt5025_set_charging_current_switch(info->i2c, 1);
117                         rt5025_set_charging_buck(info->i2c, 1);
118                         #endif
119                         info->chg_stat = 0x00;
120                         #if 1
121                         if (info->chip->battery_info)
122                         {
123                                 if (info->chg_term <= 1)
124                                         rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
125                                 else if (info->chg_term == 2)
126                                 {
127                                         rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
128                                         //info->chg_term = 0;
129                                 }
130                                 else if (info->chg_term > 2)
131                                         ;
132                         }
133                         #else
134                         if (info->event_callback)
135                                 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_CHARGING);
136                         #endif
137                         break;
138                 case 0x01:
139                         //rt5025_set_charging_current_switch(info->i2c, 1);
140                         info->chg_stat = 0x01;
141                         #if 1
142                         if (info->chip->battery_info)
143                         {
144                                 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
145                                 info->chg_term = 0;
146                         }
147                         #else
148                         if (info->event_callback)
149                                 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_CHARGING);
150                         #endif
151                         break;
152                 case 0x02:
153                         #if 0
154                         rt5025_set_charging_current_switch(info->i2c, 0);
155                         #endif
156                         info->chg_stat = 0x02;
157                         #if 1
158                         if (info->chip->battery_info)
159                         {
160                                 rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
161                                 info->chg_term = 0;
162                         }
163                         #else
164                         if (info->event_callback)
165                                 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_FULL);
166                         #endif
167                         break;
168                 case 0x03:
169                         #if 0
170                         rt5025_set_charging_buck(info->i2c, 0);
171                         rt5025_set_charging_current_switch(info->i2c, 0);
172                         #endif
173                         info->chg_stat = 0x03;
174                         #if 1
175                         if (info->chip->battery_info)
176                         {
177                                 if (info->chg_term <= 1)
178                                         rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
179                                 else if (info->chg_term == 2)
180                                 {
181                                         rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
182                                         //info->chg_term = 0;
183                                 }
184                                 else if (info->chg_term > 2)
185                                         ;
186                         }
187                         #else
188                         if (info->event_callback)
189                                 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_DISCHARGING);
190                         #endif
191                         break;
192                 default:
193                         break;
194         }
195         return ret;
196 }
197
198 #if 0
199 int rt5025_power_passirq_to_gauge(struct rt5025_power_info *info)
200 {
201         if (info->event_callback)
202                 info->event_callback->rt5025_gauge_irq_handler();
203         return 0;
204 }
205 EXPORT_SYMBOL(rt5025_power_passirq_to_gauge);
206 #endif
207
208 int rt5025_power_charge_detect(struct rt5025_power_info *info)
209 {
210         int ret = 0;
211         unsigned char chgstatval = 0;
212         unsigned old_usbval, old_acval, old_chgval, new_usbval, new_acval, new_chgval;
213
214         old_acval = info->ac_online;
215         old_usbval = info->usb_online;
216         old_chgval = info->chg_stat;
217
218         mdelay(50);
219         
220         ret = rt5025_reg_read(info->i2c, RT5025_REG_CHGSTAT);
221         if (ret<0)
222         {
223                 dev_err(info->dev, "read chg stat reg fail\n");
224                 return ret;
225         }
226         chgstatval = ret;
227         RTINFO("chgstat = 0x%02x\n", chgstatval);
228
229         new_acval = (chgstatval&RT5025_CHG_ACONLINE)>>RT5025_CHG_ACSHIFT;
230         if (old_acval != new_acval)
231         {
232                 info->ac_online = new_acval;
233                 power_supply_changed(&info->ac);
234         }
235         new_usbval = (chgstatval&RT5025_CHG_USBONLINE)>>RT5025_CHG_USBSHIFT;
236         if (old_usbval != new_usbval)
237         {
238                 info->usb_online = new_usbval;
239                 power_supply_changed(&info->usb);
240         }
241
242         if (old_acval != new_acval || old_usbval != new_usbval)
243                 schedule_delayed_work(&info->usb_detect_work, 0); //no delay
244
245         new_chgval = (chgstatval&RT5025_CHGSTAT_MASK)>>RT5025_CHGSTAT_SHIFT;
246         
247         if (new_acval || new_usbval)
248         {
249                 //if (old_chgval != new_chgval)
250                 //{
251                         ret = rt5025_chgstat_changed(info, new_chgval);
252                 //}
253         }
254         else
255         {
256                 #if 0
257                 rt5025_set_charging_buck(info->i2c, 0);
258                 rt5025_set_charging_current_switch(info->i2c, 0);
259                 #endif
260                 info->chg_stat = RT5025_CHGSTAT_UNKNOWN;
261                 if (info->chip->jeita_info)
262                         rt5025_notify_charging_cable(info->chip->jeita_info, JEITA_NO_CHARGE);
263                 #if 1
264                 if (info->chip->battery_info)
265                         rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_DISCHARGING);
266                 #else
267                 if (info->event_callback)
268                         info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_NOT_CHARGING);
269                 #endif
270         }
271
272         return ret;
273 }
274 EXPORT_SYMBOL(rt5025_power_charge_detect);
275
276 static int rt5025_adap_get_props(struct power_supply *psy,
277                                 enum power_supply_property psp,
278                                 union power_supply_propval *val)
279 {
280         struct rt5025_power_info *info = dev_get_drvdata(psy->dev->parent);
281         switch(psp)
282         {
283                 case POWER_SUPPLY_PROP_ONLINE:
284                         if (psy->type == POWER_SUPPLY_TYPE_MAINS)
285                                 val->intval = info->ac_online;
286                         else if (psy->type == POWER_SUPPLY_TYPE_USB)
287                                 val->intval = info->usb_online;
288                         else
289                                 return -EINVAL;
290                         break;
291                 default:
292                         return -EINVAL;
293         }
294         return 0;
295 }
296
297
298 extern int dwc_vbus_status(void);
299
300
301 static void usb_detect_work_func(struct work_struct *work)
302 {
303         struct delayed_work *delayed_work = (struct delayed_work *)container_of(work, struct delayed_work, work);
304         struct rt5025_power_info *pi = (struct rt5025_power_info *)container_of(delayed_work, struct rt5025_power_info, usb_detect_work);
305         
306         RTINFO("rt5025: %s ++", __func__);
307
308         mutex_lock(&pi->var_lock);
309         if (pi->ac_online)
310         {
311                 rt5025_set_charging_current(pi->i2c, 1000);
312                 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_AC_ADAPTER);
313                 pi->usb_cnt = 0;
314         }
315         else if (pi->usb_online)
316         {
317                 RTINFO("%s: usb_cnt %d\n", __func__, pi->usb_cnt);
318                 switch(dwc_vbus_status())
319                 {
320                         case 2: // USB Wall charger
321                                 rt5025_set_charging_current(pi->i2c, 1000);
322                                 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_USB_TA);
323                                 RTINFO("rt5025: detect usb wall charger\n");
324                                 break;
325                         case 1: //normal USB
326                         default:
327                                 rt5025_set_charging_current(pi->i2c, 500);
328                                 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_NORMAL_USB);
329                                 RTINFO("rt5025: detect normal usb\n");
330                                 break;
331                 }
332                 if (pi->usb_cnt++ < 60)
333                         schedule_delayed_work(&pi->usb_detect_work, 1*HZ);
334         }
335         else
336         {
337                 //default to prevent over current charging
338                 rt5025_set_charging_current(pi->i2c, 500);
339                 rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_NO_CHARGE);
340                 //reset usb_cnt;
341                 pi->usb_cnt = 0;
342         }
343         mutex_unlock(&pi->var_lock);
344
345         RTINFO("rt5025: %s --", __func__);
346 }
347
348 static int __devinit rt5025_init_charger(struct rt5025_power_info *info, struct rt5025_power_data* pd)
349 {
350         //unsigned char data;
351         info->ac_online = 0;
352         info->usb_online =0;
353         //init charger buckck & charger current en to disable stat
354         info->chg_stat = RT5025_CHGSTAT_UNKNOWN;
355         #if 0
356         if (info->event_callback)
357                 info->event_callback->rt5025_gauge_set_status(POWER_SUPPLY_STATUS_DISCHARGING);
358         #endif
359         //rt5025_set_bits(info->i2c, RT5025_REG_CHGCTL4, RT5025_CHGRST_MASK);
360         //udelay(200);
361         //init register setting
362         rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL2, pd->CHGControl2.val);
363         rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL3, pd->CHGControl3.val);
364         rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL4, pd->CHGControl4.val);
365         rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL5, pd->CHGControl5.val);
366         rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL6, pd->CHGControl6.val);
367         //rt5025_reg_write(info->i2c, RT5025_REG_CHGCTL7, pd->CHGControl7.val);
368         rt5025_assign_bits(info->i2c, RT5025_REG_CHGCTL7, 0xEF, pd->CHGControl7.val);
369         rt5025_reg_write(info->i2c, 0xA9, 0x60 );
370         //Special buck setting
371         #if 0
372         //Buck 1
373         data = rt5025_reg_read(info->i2c, 0x47);
374         data ^=0xc2;
375         rt5025_reg_write(info->i2c, 0x47, data);
376         //Buck 2
377         data = rt5025_reg_read(info->i2c, 0x48);
378         data ^=0xc2;
379         rt5025_reg_write(info->i2c, 0x48, data);
380         //Buck 3
381         data = rt5025_reg_read(info->i2c, 0x49);
382         data ^=0xc2;
383         rt5025_reg_write(info->i2c, 0x49, data);
384         #endif  //#if 0
385         
386         rt5025_power_charge_detect(info);
387
388         return 0;
389 }
390
391 static int __devinit rt5025_power_probe(struct platform_device *pdev)
392 {
393         struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
394         struct rt5025_platform_data *pdata = chip->dev->platform_data;
395         struct rt5025_power_info *pi;
396         int ret = 0;
397         
398         pi = kzalloc(sizeof(*pi), GFP_KERNEL);
399         if (!pi)
400                 return -ENOMEM;
401
402         pi->i2c = chip->i2c;
403         pi->dev = &pdev->dev;
404         pi->chip = chip;
405         mutex_init(&pi->var_lock);
406         INIT_DELAYED_WORK(&pi->usb_detect_work, usb_detect_work_func);
407
408         #if 0
409         ret = rt5025_gauge_init(pi);
410         if (ret)
411                 goto out;
412         #endif
413
414         platform_set_drvdata(pdev, pi);
415         dev_ptr = pdev;
416
417         pi->ac.name = "rt5025-dc";
418         pi->ac.type = POWER_SUPPLY_TYPE_MAINS;
419         pi->ac.supplied_to = rt5025_supply_list;
420         pi->ac.properties = rt5025_adap_props;
421         pi->ac.num_properties = ARRAY_SIZE(rt5025_adap_props);
422         pi->ac.get_property = rt5025_adap_get_props;
423         ret = power_supply_register(&pdev->dev, &pi->ac);
424         if (ret)
425                 goto out;
426
427         pi->usb.name = "rt5025-usb";
428         pi->usb.type = POWER_SUPPLY_TYPE_USB;
429         pi->ac.supplied_to = rt5025_supply_list;
430         pi->usb.properties = rt5025_adap_props;
431         pi->usb.num_properties = ARRAY_SIZE(rt5025_adap_props);
432         pi->usb.get_property = rt5025_adap_get_props;
433         ret = power_supply_register(&pdev->dev, &pi->usb);
434         if (ret)
435                 goto out_usb;
436
437         rt5025_init_charger(pi, pdata->power_data);
438         chip->power_info = pi;
439
440         pr_info("rt5025-power driver is successfully loaded\n");
441
442         return ret;
443 out_usb:
444         power_supply_unregister(&pi->ac);
445 out:
446         kfree(pi);
447
448         return ret;
449 }
450
451 static int rt5025_power_suspend(struct platform_device *pdev, pm_message_t state)
452 {
453         #if 0
454         struct rt5025_power_info *pi = platform_get_drvdata(pdev);
455
456         if (pi->event_callback)
457                 pi->event_callback->rt5025_gauge_suspend();
458         #endif
459         RTINFO("\n");
460         return 0;
461 }
462
463 static int rt5025_power_resume(struct platform_device *pdev)
464 {
465         #if 0
466         struct rt5025_power_info *pi = platform_get_drvdata(pdev);
467
468         if (pi->event_callback)
469                 pi->event_callback->rt5025_gauge_resume();
470         #endif
471         RTINFO("\n");
472         return 0;
473 }
474
475 static int __devexit rt5025_power_remove(struct platform_device *pdev)
476 {
477         struct rt5025_power_info *pi = platform_get_drvdata(pdev);
478         struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
479
480         #if 0
481         if (pi->event_callback)
482                 pi->event_callback->rt5025_gauge_remove();
483         #endif
484         power_supply_unregister(&pi->usb);
485         power_supply_unregister(&pi->ac);
486         chip->power_info = NULL;
487         kfree(pi);
488         RTINFO("\n");
489
490         return 0;
491 }
492
493 static struct platform_driver rt5025_power_driver = 
494 {
495         .driver = {
496                 .name = RT5025_DEVICE_NAME "-power",
497                 .owner = THIS_MODULE,
498         },
499         .probe = rt5025_power_probe,
500         .remove = __devexit_p(rt5025_power_remove),
501         .suspend = rt5025_power_suspend,
502         .resume = rt5025_power_resume,
503 };
504
505 static int __init rt5025_power_init(void)
506 {
507         return platform_driver_register(&rt5025_power_driver);
508 }
509 late_initcall_sync(rt5025_power_init);
510
511 static void __exit rt5025_power_exit(void)
512 {
513         platform_driver_unregister(&rt5025_power_driver);
514 }
515 module_exit(rt5025_power_exit);
516
517
518 MODULE_LICENSE("GPL v2");
519 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
520 MODULE_DESCRIPTION("Power/Gauge driver for RT5025");
521 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-power");
522 MODULE_VERSION(RT5025_DRV_VER);