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 10 // 'c*10 gap for tolerance
27 static int rt5025_set_charging_cc_switch (struct i2c_client *i2c, int onoff)
30 RTINFO("onoff = %d\n", onoff);
32 ret = rt5025_set_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCCEN_MASK);
34 ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCCEN_MASK);
38 static int rt5025_set_charging_cc(struct i2c_client *i2c, int cur_value)
43 RTINFO("current value = %d\n", cur_value);
46 else if (cur_value > 2000)
47 data = 0xf<<RT5025_CHGICC_SHIFT;
49 data = ((cur_value-500)/100)<<RT5025_CHGICC_SHIFT;
51 ret = rt5025_assign_bits(i2c, RT5025_REG_CHGCTL4, RT5025_CHGICC_MASK, data);
54 rt5025_set_charging_cc_switch(i2c, 0);
56 rt5025_set_charging_cc_switch(i2c, 1);
61 static int rt5025_set_charging_cv(struct i2c_client *i2c, int voltage)
66 RTINFO("voltage = %d\n", voltage);
69 else if (voltage > 4440)
70 data = 0x2f<<RT5025_CHGCV_SHIFT;
72 data = ((voltage-3500)/20)<<RT5025_CHGCV_SHIFT;
74 ret = rt5025_assign_bits(i2c, RT5025_REG_CHGCTL3, RT5025_CHGCV_MASK, data);
78 static int rt5025_sel_external_temp_index(struct rt5025_swjeita_info *swji)
80 int temp = swji->cur_temp;
84 if (temp < swji->temp[0])
86 else if (temp >= swji->temp[0] && temp < swji->temp[1])
88 else if (temp >= swji->temp[1] && temp < swji->temp[2])
90 else if (temp >= swji->temp[2] && temp < swji->temp[3])
92 else if (temp >= swji->temp[3])
95 RTINFO("sect_index = %d\n", sect_index);
99 static int rt5025_get_external_temp_index(struct rt5025_swjeita_info *swji)
106 if (rt5025_reg_block_read(swji->i2c, RT5025_REG_AINH, 2, data) < 0)
107 pr_err("%s: failed to read ext_temp register\n", __func__);
109 temp = (data[0]*256+data[1])*61/100;
110 temp = (temp * (-91738) +81521000)/100000;
112 swji->cur_temp = temp;
114 RTINFO("cur_section = %d, cur_temp = %d\n", swji->cur_section, swji->cur_temp);
116 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 int rt5025_set_exttemp_alert(struct rt5025_swjeita_info *swji, int index)
173 RTINFO("index = %d\n", index);
178 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[0]);
181 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[0]);
182 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[1]);
185 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[1]);
186 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[2]);
189 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[2]);
190 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMIN, swji->temp_scalar[3]);
193 rt5025_reg_write(swji->i2c, RT5025_REG_TALRTMAX, swji->temp_scalar[3]);
200 static int rt5025_exttemp_alert_switch(struct rt5025_swjeita_info *swji, int onoff)
204 rt5025_clr_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
205 rt5025_clr_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
209 switch (swji->cur_section)
212 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
215 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
216 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMNEN_MASK);
219 rt5025_set_bits(swji->i2c, RT5025_REG_IRQCTL, RT5025_TMXEN_MASK);
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);
232 RTINFO("index=%d, onoff=%d\n", swji->cur_section, onoff);
236 int rt5025_notify_charging_cable(struct rt5025_swjeita_info *swji, int cable_type)
241 RTINFO("cable_type = %d\n", cable_type);
243 rt5025_exttemp_alert_switch(swji, 0);
245 sect_index = rt5025_get_external_temp_index(swji);
246 if (swji->cur_section != sect_index || swji->init_once == 0)
248 rt5025_set_exttemp_alert(swji, sect_index);
249 swji->cur_section = sect_index;
255 case JEITA_NORMAL_USB:
256 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]);
257 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
260 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]);
261 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
263 case JEITA_AC_ADAPTER:
264 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]);
265 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
267 case JEITA_NO_CHARGE:
268 rt5025_set_charging_cc(swji->i2c, swji->temp_cc[cable_type][swji->cur_section]);
269 rt5025_set_charging_cv(swji->i2c, swji->temp_cv[cable_type][swji->cur_section]);
272 swji->cur_cable = cable_type;
274 rt5025_exttemp_alert_switch(swji, 1);
278 EXPORT_SYMBOL(rt5025_notify_charging_cable);
280 int rt5025_swjeita_irq_handler(struct rt5025_swjeita_info *swji, unsigned char event)
283 RTINFO("event = 0x%02x\n", event);
285 if (event&(RT5025_TMXEN_MASK|RT5025_TMNEN_MASK))
286 rt5025_notify_charging_cable(swji, swji->cur_cable);
290 EXPORT_SYMBOL(rt5025_swjeita_irq_handler);
292 static int __devinit rt5025_swjeita_probe(struct platform_device *pdev)
294 struct rt5025_chip *chip = dev_get_drvdata(pdev->dev.parent);
295 struct rt5025_platform_data *pdata = chip->dev->platform_data;
296 struct rt5025_swjeita_info *swji;
299 swji = kzalloc(sizeof(*swji), GFP_KERNEL);
303 #if 0 // for debug pdata->jeita_data
304 for (ret=0; ret<4; ret++)
305 RTINFO("jeita temp value %d\n", pdata->jeita_data->temp[ret]);
306 for (ret=0; ret<4; ret++)
308 RTINFO("jeita temp_cc value %d, %d, %d, %d, %d\n", pdata->jeita_data->temp_cc[ret][0], \
309 pdata->jeita_data->temp_cc[ret][1], pdata->jeita_data->temp_cc[ret][2], \
310 pdata->jeita_data->temp_cc[ret][3], pdata->jeita_data->temp_cc[ret][4]);
312 for (ret=0; ret<4; ret++)
314 RTINFO("jeita temp_cv value %d, %d, %d, %d, %d\n", pdata->jeita_data->temp_cv[ret][0], \
315 pdata->jeita_data->temp_cv[ret][1], pdata->jeita_data->temp_cv[ret][2], \
316 pdata->jeita_data->temp_cv[ret][3], pdata->jeita_data->temp_cv[ret][4]);
318 for (ret=0; ret<4; ret++)
320 RTINFO("temp_scalar[%d] = 0x%02x\n", ret, pdata->jeita_data->temp_scalar[ret]);
325 swji->i2c = chip->i2c;
327 swji->cur_section = 2; //initial as the normal temperature
328 swji->cur_cable = JEITA_NO_CHARGE;
329 swji->temp = pdata->jeita_data->temp;
330 swji->temp_scalar = pdata->jeita_data->temp_scalar;
331 swji->temp_cc = pdata->jeita_data->temp_cc;
332 swji->temp_cv = pdata->jeita_data->temp_cv;
333 platform_set_drvdata(pdev, swji);
335 rt5025_set_ainadc_onoff(swji, 1);
337 rt5025_notify_charging_cable(swji, swji->cur_cable);
339 chip->jeita_info = swji;
340 RTINFO("rt5025-swjeita driver is successfully loaded\n");
344 static int __devexit rt5025_swjeita_remove(struct platform_device *pdev)
346 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
348 swji->chip->jeita_info = NULL;
353 static int rt5025_swjeita_suspend(struct platform_device *pdev, pm_message_t state)
355 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
361 static int rt5025_swjeita_resume(struct platform_device *pdev)
363 struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev);
369 static struct platform_driver rt5025_swjeita_driver =
372 .name = RT5025_DEVICE_NAME "-swjeita",
373 .owner = THIS_MODULE,
375 .probe = rt5025_swjeita_probe,
376 .remove = __devexit_p(rt5025_swjeita_remove),
377 .suspend = rt5025_swjeita_suspend,
378 .resume = rt5025_swjeita_resume,
381 static int __init rt5025_swjeita_init(void)
383 return platform_driver_register(&rt5025_swjeita_driver);
385 module_init(rt5025_swjeita_init);
387 static void __exit rt5025_swjeita_exit(void)
389 platform_driver_unregister(&rt5025_swjeita_driver);
391 module_exit(rt5025_swjeita_exit);
394 MODULE_LICENSE("GPL v2");
395 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com");
396 MODULE_DESCRIPTION("Swjeita driver for RT5025");
397 MODULE_ALIAS("platform:" RT5025_DEVICE_NAME "-swjeita");