1 /* drivers/power/rt5025-swjeita.c
2 * swjeita Driver for Richtek RT5025 PMIC
3 * Multi function device - multi functional baseband PMIC swjeita 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/platform_device.h>
18 #include <linux/err.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
22 #include <linux/mfd/rt5025.h>
23 #include <linux/power/rt5025-swjeita.h>
25 #define TEMP_TOLERANCE 30 /*'c*10 gap for tolerance*/
27 static int rt5025_set_charging_cc_switch (struct i2c_client *i2c, int onoff)
31 RTINFO("onoff = %d\n", onoff);
33 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCCEN_MASK);
35 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCCEN_MASK);
39 static int rt5025_set_charging_cc(struct i2c_client *i2c, int cur_value)
44 RTINFO("current value = %d\n", cur_value);
47 else if (cur_value > 2000)
48 data = 0xf << RT5025_CHGICC_SHIFT;
50 data = ((cur_value - 500) / 100) << RT5025_CHGICC_SHIFT;
52 ret = rt5025_assign_bits(i2c, RT5025_REG_CHGCTL4, RT5025_CHGICC_MASK, data);
55 rt5025_set_charging_cc_switch(i2c, 0);
57 rt5025_set_charging_cc_switch(i2c, 1);
62 static int rt5025_set_charging_cv(struct i2c_client *i2c, int voltage)
67 RTINFO("voltage = %d\n", voltage);
70 else if (voltage > 4440)
71 data = 0x2f << RT5025_CHGCV_SHIFT;
73 data = ((voltage - 3500) / 20) << RT5025_CHGCV_SHIFT;
75 ret = rt5025_assign_bits(i2c, RT5025_REG_CHGCTL3, RT5025_CHGCV_MASK, data);
79 static int rt5025_sel_external_temp_index(struct rt5025_swjeita_info *swji)
81 int temp = swji->cur_temp;
85 if (temp < swji->temp[0])
87 else if (temp >= swji->temp[0] && temp < swji->temp[1])
89 else if (temp >= swji->temp[1] && temp < swji->temp[2])
91 else if (temp >= swji->temp[2] && temp < swji->temp[3])
93 else if (temp >= swji->temp[3])
96 RTINFO("sect_index = %d\n", sect_index);
100 static int rt5025_get_external_temp_index(struct rt5025_swjeita_info *swji)
107 if (rt5025_reg_block_read(swji->i2c, RT5025_REG_AINH, 2, data) < 0)
108 pr_err("%s: failed to read ext_temp register\n", __func__);
110 temp = (data[0] * 256 + data[1]) * 61 / 100;
111 temp = (temp * (-91738) + 81521000) / 100000;
113 swji->cur_temp = temp;
115 RTINFO("cur_section = %d, cur_temp = %d\n", swji->cur_section, swji->cur_temp);
117 switch (swji->cur_section) {
119 if (temp < swji->temp[0] + TEMP_TOLERANCE)
120 sect_index = rt5025_sel_external_temp_index(swji);
122 sect_index = swji->cur_section;
125 if (temp <= swji->temp[0] - TEMP_TOLERANCE || temp >= swji->temp[1] + TEMP_TOLERANCE)
126 sect_index = rt5025_sel_external_temp_index(swji);
128 sect_index = swji->cur_section;
131 if (temp <= swji->temp[1] - TEMP_TOLERANCE || temp >= swji->temp[2] + TEMP_TOLERANCE)
132 sect_index = rt5025_sel_external_temp_index(swji);
134 sect_index = swji->cur_section;
137 if (temp <= swji->temp[2] - TEMP_TOLERANCE || temp >= swji->temp[3] + TEMP_TOLERANCE)
138 sect_index = rt5025_sel_external_temp_index(swji);
140 sect_index = swji->cur_section;
143 if (temp <= swji->temp[3] - TEMP_TOLERANCE)
144 sect_index = rt5025_sel_external_temp_index(swji);
146 sect_index = swji->cur_section;
149 sect_index = swji->cur_section;
152 RTINFO("sect_index = %d\n", sect_index);
156 static inline int rt5025_set_ainadc_onoff(struct rt5025_swjeita_info *swji, int enable)
160 RTINFO("enable = %d\n", enable);
162 ret = rt5025_set_bits(swji->i2c, RT5025_REG_CHANNELL, RT5025_AINEN_MASK);
164 ret = rt5025_clr_bits(swji->i2c, RT5025_REG_CHANNELL, RT5025_AINEN_MASK);
169 static inline int rt5025_set_intadc_onoff(struct rt5025_swjeita_info *swji, int enable)
173 RTINFO("enable = %d\n", enable);
175 ret = rt5025_set_bits(swji->i2c, RT5025_REG_CHANNELL, RT5025_INTEN_MASK);
177 ret = rt5025_clr_bits(swji->i2c, RT5025_REG_CHANNELL, RT5025_INTEN_MASK);
182 static int rt5025_set_exttemp_alert(struct rt5025_swjeita_info *swji, int index)
186 RTINFO("index = %d\n", index);
190 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[1]);
193 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[0]);
194 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[3]);
197 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[2]);
198 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[5]);
201 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[4]);
202 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[7]);
205 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[6]);
212 static int rt5025_exttemp_alert_switch(struct rt5025_swjeita_info *swji, int onoff)
215 rt5025_clr_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
216 rt5025_clr_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
218 switch (swji->cur_section) {
220 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
223 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
224 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
227 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
228 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
231 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
232 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
235 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
240 RTINFO("index=%d, onoff=%d\n", swji->cur_section, onoff);
244 int rt5025_notify_charging_cable(struct rt5025_swjeita_info *swji, int cable_type)
249 RTINFO("cable_type = %d\n", cable_type);
251 rt5025_exttemp_alert_switch(swji, 0);
253 sect_index = rt5025_get_external_temp_index(swji);
254 if (swji->cur_section != sect_index || swji->init_once == 0) {
255 rt5025_set_exttemp_alert(swji, sect_index);
256 swji->cur_section = sect_index;
260 switch (cable_type) {
261 case JEITA_NORMAL_USB:
262 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]\
263 - swji->dec_current);
264 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
267 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]\
268 - swji->dec_current);
269 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
271 case JEITA_AC_ADAPTER:
272 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]\
273 - swji->dec_current);
274 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
276 case JEITA_NO_CHARGE:
277 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]);
278 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
281 swji->cur_cable = cable_type;
283 rt5025_exttemp_alert_switch(swji, 1);
287 EXPORT_SYMBOL(rt5025_notify_charging_cable);
289 int rt5025_swjeita_irq_handler(struct rt5025_swjeita_info *swji, unsigned char event)
292 RTINFO("event = 0x%02x\n", event);
294 if (event&(RT5025_TMXEN_MASK | RT5025_TMNEN_MASK))
295 rt5025_notify_charging_cable(swji, swji->cur_cable);
299 EXPORT_SYMBOL(rt5025_swjeita_irq_handler);
301 static void rt5025_get_internal_temp(struct rt5025_swjeita_info *swji)
305 if (rt5025_reg_block_read(swji->i2c, RT5025_REG_INTTEMP_MSB, 2, data) < 0)
306 pr_err("%s: Failed to read internal TEMPERATURE\n", __func__);
308 temp = ((data[0] & 0x1F) << 8) + data[1];
312 temp = (data[0] & 0x20) ? -temp : temp;
313 swji->cur_inttemp = temp;
315 RTINFO("internal temperature: %d\n", temp);
318 static void thermal_reg_work_func(struct work_struct *work)
320 struct delayed_work *delayed_work = (struct delayed_work *)container_of(work, struct delayed_work, work);
321 struct rt5025_swjeita_info *swji = (struct rt5025_swjeita_info *)container_of(delayed_work, struct rt5025_swjeita_info, thermal_reg_work);
322 int therm_region = 0;
324 RTINFO("%s ++", __func__);
325 rt5025_get_internal_temp(swji);
328 switch (swji->cur_therm_region) {
330 if (swji->cur_inttemp >= 820)
336 if (swji->cur_inttemp <= 780)
338 else if (swji->cur_inttemp >= 1020)
344 if (swji->cur_inttemp <= 980)
351 if (swji->cur_inttemp < 800)
353 else if (swji->cur_inttemp >= 800 && swji->cur_inttemp < 1000)
359 if (therm_region != swji->cur_therm_region) {
360 switch (therm_region) {
362 swji->dec_current = 0;
365 swji->dec_current = 300;
368 swji->dec_current = 800;
371 swji->cur_therm_region = therm_region;
372 rt5025_notify_charging_cable(swji, swji->cur_cable);
376 schedule_delayed_work(&swji->thermal_reg_work, 5*HZ);
378 RTINFO("%s --", __func__);
381 static int rt5025_swjeita_probe(struct platform_device *pdev)
383 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
384 struct rt5025_platform_data *pdata = chip->dev->platform_data;
385 struct rt5025_swjeita_info *swji;
388 swji = kzalloc(sizeof(*swji), GFP_KERNEL);
392 #if 0 /* for debug pdata->jeita_data*/
393 for (ret = 0; ret < 4; ret++)
394 RTINFO("jeita temp value %d\n", pdata->jeita_data->temp[ret]);
395 for (ret = 0; ret < 4; ret++) {
396 RTINFO("jeita temp_cc value %d, %d, %d, %d, %d\n", pdata->jeita_data->temp_cc[ret][0], \
397 pdata->jeita_data->temp_cc[ret][1], pdata->jeita_data->temp_cc[ret][2], \
398 pdata->jeita_data->temp_cc[ret][3], pdata->jeita_data->temp_cc[ret][4]);
400 for (ret = 0; ret < 4; ret++) {
401 RTINFO("jeita temp_cv value %d, %d, %d, %d, %d\n", pdata->jeita_data->temp_cv[ret][0], \
402 pdata->jeita_data->temp_cv[ret][1], pdata->jeita_data->temp_cv[ret][2], \
403 pdata->jeita_data->temp_cv[ret][3], pdata->jeita_data->temp_cv[ret][4]);
405 for (ret = 0; ret < 8; ret++) {
406 RTINFO("temp_scalar[%d] = 0x%02x\n", ret, pdata->jeita_data->temp_scalar[ret]);
411 swji->i2c = chip->i2c;
413 swji->cur_section = 2;
414 /*initial as the normal temperature*/
415 swji->cur_cable = JEITA_NO_CHARGE;
416 swji->temp = pdata->jeita_data->temp;
417 swji->temp_scalar = pdata->jeita_data->temp_scalar;
418 swji->temp_cc = pdata->jeita_data->temp_cc;
419 swji->temp_cv = pdata->jeita_data->temp_cv;
420 INIT_DELAYED_WORK(&swji->thermal_reg_work, thermal_reg_work_func);
421 platform_set_drvdata(pdev, swji);
423 rt5025_set_ainadc_onoff(swji, 1);
424 rt5025_set_intadc_onoff(swji, 1);
426 rt5025_notify_charging_cable(swji, swji->cur_cable);
427 schedule_delayed_work(&swji->thermal_reg_work, 1*HZ);
429 chip->jeita_info = swji;
430 RTINFO("rt5025-swjeita driver is successfully loaded\n");
434 static int rt5025_swjeita_remove(struct platform_device *pdev)
436 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
438 swji->chip->jeita_info = NULL;
444 static int rt5025_swjeita_suspend(struct platform_device *pdev, pm_message_t state)
446 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
449 cancel_delayed_work_sync(&swji->thermal_reg_work);
450 swji->cur_therm_region = swji->dec_current = 0;
451 rt5025_notify_charging_cable(swji, swji->cur_cable);
456 static int rt5025_swjeita_resume(struct platform_device *pdev)
458 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
461 schedule_delayed_work(&swji->thermal_reg_work, 0);
466 static struct platform_driver rt5025_swjeita_driver = {
468 .name = RT5025_DEVICE_NAME "-swjeita",
469 .owner = THIS_MODULE,
471 .probe = rt5025_swjeita_probe,
472 .remove = __devexit_p(rt5025_swjeita_remove),
473 .suspend = rt5025_swjeita_suspend,
474 .resume = rt5025_swjeita_resume,
477 static int rt5025_swjeita_init(void)
479 return platform_driver_register(&rt5025_swjeita_driver);
481 module_init(rt5025_swjeita_init);
483 static void rt5025_swjeita_exit(void)
485 platform_driver_unregister(&rt5025_swjeita_driver);
487 module_exit(rt5025_swjeita_exit);
490 MODULE_LICENSE("GPL v2");
491 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
492 MODULE_DESCRIPTION("Swjeita driver for RT5025");
493 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-swjeita");
494 MODULE_VERSION(RT5025_DRV_VER);