3 * Samsung SMB328 Charger Driver
5 * Copyright (C) 2013 Samsung Electronics
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/battery/sec_charger.h>
14 #include <linux/battery/charger/smb328_charger.h>
15 #include <linux/debugfs.h>
16 #include <linux/seq_file.h>
17 #include <linux/interrupt.h>
19 #include <linux/gpio-pxa.h>
20 #include <linux/of_device.h>
21 #include <linux/of_gpio.h>
22 #include <linux/of_irq.h>
24 #if defined(SIOP_CHARGING_CURRENT_LIMIT_FEATURE)
25 #define SIOP_CHARGING_LIMIT_CURRENT 800
26 static bool is_siop_limited;
29 static enum power_supply_property sec_charger_props[] = {
30 POWER_SUPPLY_PROP_STATUS,
31 POWER_SUPPLY_PROP_CHARGE_TYPE,
32 POWER_SUPPLY_PROP_HEALTH,
33 POWER_SUPPLY_PROP_ONLINE,
34 POWER_SUPPLY_PROP_CURRENT_MAX,
35 POWER_SUPPLY_PROP_CURRENT_AVG,
36 POWER_SUPPLY_PROP_CURRENT_NOW,
37 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
40 static int smb328_i2c_write(struct i2c_client *client,
44 ret = i2c_smbus_write_i2c_block_data(client, reg, 1, buf);
46 pr_err("%s: Error(%d) : 0x%x\n", __func__, ret, reg);
51 static int smb328_i2c_read(struct i2c_client *client,
55 ret = i2c_smbus_read_i2c_block_data(client, reg, 1, buf);
57 pr_err("%s: Error(%d) : 0x%x\n", __func__, ret, reg);
62 static void smb328_i2c_write_array(struct i2c_client *client,
66 for (i = 0; i < size; i += 3)
67 smb328_i2c_write(client, (u8) (*(buf + i)), (buf + i) + 1);
70 static void smb328_set_command(struct i2c_client *client,
75 val = smb328_i2c_read(client, reg, &data);
77 pr_debug("%s : reg(0x%02x): 0x%02x", __func__, reg, data);
80 if (smb328_i2c_write(client, reg, &data) < 0)
81 pr_err("%s : error!\n", __func__);
82 val = smb328_i2c_read(client, reg, &data);
84 pr_debug(" => 0x%02x\n", data);
89 static void smb328_test_read(struct i2c_client *client)
93 for (addr = 0; addr < 0x0c; addr++) {
94 smb328_i2c_read(client, addr, &data);
95 pr_info("smb328 addr : 0x%02x data : 0x%02x\n", addr, data);
97 for (addr = 0x31; addr < 0x3D; addr++) {
98 smb328_i2c_read(client, addr, &data);
99 pr_info("smb328 addr : 0x%02x data : 0x%02x\n", addr, data);
103 static void smb328_read_regs(struct i2c_client *client, char *str)
108 for (addr = 0x0; addr < 0x0A; addr++) {
109 smb328_i2c_read(client, addr, &data);
110 sprintf(str+strlen(str), "0x%x, ", data);
113 /* "#" considered as new line in application */
114 sprintf(str+strlen(str), "#");
116 for (addr = 0x31; addr < 0x39; addr++) {
117 smb328_i2c_read(client, addr, &data);
118 sprintf(str+strlen(str), "0x%x, ", data);
122 static int smb328_get_charging_status(struct i2c_client *client)
124 int status = POWER_SUPPLY_STATUS_UNKNOWN;
127 smb328_i2c_read(client, SMB328_BATTERY_CHARGING_STATUS_C, &stat_c);
128 pr_debug("%s : Charging status C(0x%02x)\n", __func__, stat_c);
130 /* At least one charge cycle terminated,
131 * Charge current < Termination Current
134 /* top-off by full charging */
135 status = POWER_SUPPLY_STATUS_FULL;
141 /* check for 0x30 : 'safety timer' (0b01 or 0b10) or
142 * 'waiting to begin charging' (0b11)
143 * check for 0x06 : no charging (0b00)
146 if ((stat_c & 0x30) || !(stat_c & 0x06))
147 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
149 status = POWER_SUPPLY_STATUS_CHARGING;
151 status = POWER_SUPPLY_STATUS_DISCHARGING;
157 static int smb328_get_battery_present(struct i2c_client *client)
159 u8 reg_data, irq_data;
161 smb328_i2c_read(client, SMB328_BATTERY_CHARGING_STATUS_B, ®_data);
162 smb328_i2c_read(client, SMB328_INTERRUPT_STATUS_C, &irq_data);
164 reg_data = ((reg_data & 0x01) && (irq_data & 0x10));
169 static void smb328_set_writable(struct i2c_client *client, int writable)
173 smb328_i2c_read(client, SMB328_COMMAND, ®_data);
176 reg_data |= CMD_A_ALLOW_WRITE;
178 reg_data &= ~CMD_A_ALLOW_WRITE;
180 smb328_i2c_write(client, SMB328_COMMAND, ®_data);
183 static u8 smb328_set_charge_enable(struct i2c_client *client, int enable)
190 smb328_i2c_write(client, SMB328_FUNCTION_CONTROL_C, ®_data);
192 smb328_i2c_read(client, SMB328_COMMAND, &chg_en);
194 chg_en |= CMD_CHARGE_EN;
196 chg_en &= ~CMD_CHARGE_EN;
198 smb328_i2c_write(client, SMB328_COMMAND, &chg_en);
203 static u8 smb328_set_float_voltage(struct i2c_client *client, int float_voltage)
205 u8 reg_data, float_data;
207 float_voltage = 4350;
209 if (float_voltage < 3460)
211 else if (float_voltage <= 4340)
212 float_data = (float_voltage - 3500) / 20 + 2;
213 else if ((float_voltage == 4350) || (float_voltage == 4360))
214 float_data = 0x2D; /* (4340 -3500)/20 + 1 */
218 smb328_i2c_read(client, SMB328_FLOAT_VOLTAGE, ®_data);
219 reg_data &= ~CFG_FLOAT_VOLTAGE_MASK;
220 reg_data |= float_data << CFG_FLOAT_VOLTAGE_SHIFT;
222 smb328_i2c_write(client, SMB328_FLOAT_VOLTAGE, ®_data);
227 static u8 smb328_set_input_current_limit(struct i2c_client *client,
230 u8 curr_data, reg_data;
232 curr_data = input_current < 500 ? 0x0 :
233 input_current > 1200 ? 0x7 :
234 (input_current - 500) / 100;
236 smb328_i2c_read(client, SMB328_INPUT_CURRENTLIMIT, ®_data);
237 reg_data &= ~CFG_INPUT_CURRENT_MASK;
238 reg_data |= curr_data << CFG_INPUT_CURRENT_SHIFT;
240 smb328_i2c_write(client, SMB328_INPUT_CURRENTLIMIT, ®_data);
242 pr_info("%s: set current limit : 0x%x\n", __func__, reg_data);
247 static u8 smb328_set_termination_current_limit(struct i2c_client *client,
248 int termination_current)
250 u8 reg_data, term_data;
252 term_data = termination_current < 25 ? 0x0 :
253 termination_current > 200 ? 0x7 :
254 (termination_current - 25) / 25;
256 /* Charge completion termination current */
257 smb328_i2c_read(client, SMB328_CHARGE_CURRENT, ®_data);
258 reg_data &= ~CFG_TERMINATION_CURRENT_MASK;
259 reg_data |= term_data << CFG_TERMINATION_CURRENT_SHIFT;
261 smb328_i2c_write(client, SMB328_CHARGE_CURRENT, ®_data);
263 /* set STAT assertion termination current */
264 smb328_i2c_read(client, SMB328_VARIOUS_FUNCTIONS, ®_data);
265 reg_data &= ~CFG_STAT_ASSETION_TERM_MASK;
266 reg_data |= term_data << CFG_STAT_ASSETION_TERM_SHIFT;
268 smb328_i2c_write(client, SMB328_VARIOUS_FUNCTIONS, ®_data);
273 static u8 smb328_set_fast_charging_current(struct i2c_client *client,
274 int fast_charging_current)
276 u8 reg_data, chg_data;
278 chg_data = fast_charging_current < 500 ? 0x0 :
279 fast_charging_current > 1200 ? 0x7 :
280 (fast_charging_current - 500) / 100;
282 smb328_i2c_read(client, SMB328_CHARGE_CURRENT, ®_data);
283 reg_data &= ~CFG_CHARGE_CURRENT_MASK;
284 reg_data |= chg_data << CFG_CHARGE_CURRENT_SHIFT;
286 smb328_i2c_write(client, SMB328_CHARGE_CURRENT, ®_data);
288 pr_info("%s: Charge Current : 0x%x\n", __func__, reg_data);
293 static void smb328_charger_function_control(struct sec_charger_info *charger)
295 u8 reg_data, charge_mode;
297 smb328_set_writable(charger->client, 1);
299 smb328_i2c_write(charger->client, SMB328_FUNCTION_CONTROL_B, ®_data);
301 smb328_i2c_read(charger->client,
302 SMB328_INTERRUPT_SIGNAL_SELECTION, ®_data);
304 smb328_i2c_write(charger->client,
305 SMB328_INTERRUPT_SIGNAL_SELECTION, ®_data);
307 if (charger->cable_type == POWER_SUPPLY_TYPE_BATTERY) {
308 /* turn off charger */
309 smb328_set_charge_enable(charger->client, 0);
311 pr_info("%s: Input : %d, Charge : %d\n", __func__,
312 charger->pdata->charging_current[charger->cable_type].input_current_limit,
313 charger->pdata->charging_current[charger->cable_type].fast_charging_current);
315 smb328_i2c_read(charger->client,
316 SMB328_INPUT_CURRENTLIMIT, ®_data);
317 reg_data &= ~CFG_AICL_ENABLE;
318 reg_data &= ~CFG_AICL_VOLTAGE; /* AICL enable voltage 4.25V */
319 smb328_i2c_write(charger->client,
320 SMB328_INPUT_CURRENTLIMIT, ®_data);
322 /* Function control A */
324 smb328_i2c_write(charger->client,
325 SMB328_FUNCTION_CONTROL_A, ®_data);
327 /* 4.2V float voltage */
328 smb328_set_float_voltage(charger->client,
329 charger->pdata->chg_float_voltage);
331 /* Set termination current */
332 smb328_set_termination_current_limit(charger->client,
333 charger->pdata->charging_current[charger->
334 cable_type].full_check_current_1st);
336 smb328_set_input_current_limit(charger->client,
337 charger->pdata->charging_current
338 [charger->cable_type].input_current_limit);
340 smb328_set_fast_charging_current(charger->client,
341 charger->pdata->charging_current
342 [charger->cable_type].fast_charging_current);
344 /* SET USB5/1, AC/USB Mode */
345 charge_mode = (charger->cable_type == POWER_SUPPLY_TYPE_MAINS) ||
346 (charger->cable_type == POWER_SUPPLY_TYPE_UARTOFF) ?
348 smb328_i2c_read(charger->client, SMB328_COMMAND, ®_data);
350 reg_data |= charge_mode << 2;
351 smb328_i2c_write(charger->client, SMB328_COMMAND, ®_data);
353 smb328_set_charge_enable(charger->client, 1);
355 smb328_test_read(charger->client);
356 smb328_set_writable(charger->client, 0);
359 static int smb328_get_charging_health(struct i2c_client *client)
361 struct sec_charger_info *charger = i2c_get_clientdata(client);
362 int health = POWER_SUPPLY_HEALTH_GOOD;
365 smb328_i2c_read(client, SMB328_INTERRUPT_STATUS_C, &status_reg);
366 pr_info("%s : Interrupt status C(0x%02x)\n", __func__, status_reg);
369 if (status_reg & 0x2) {
370 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
371 } else if (status_reg & 0x4) {
372 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
373 } else if (status_reg & 0x80) { /* watchdog enable workaround */
376 smb328_i2c_write(client, 0x30, &data);
377 /* reset function control */
378 smb328_charger_function_control(charger);
384 static int smb328_get_charge_now(struct i2c_client *client)
386 u8 chg_now, data, addr;
388 smb328_i2c_read(client, SMB328_BATTERY_CHARGING_STATUS_A, &chg_now);
390 for (addr = 0; addr < 0x0c; addr++) {
391 smb328_i2c_read(client, addr, &data);
392 pr_debug("smb328 addr : 0x%02x data : 0x%02x\n", addr, data);
394 for (addr = 0x31; addr <= 0x3D; addr++) {
395 smb328_i2c_read(client, addr, &data);
396 pr_debug("smb328 addr : 0x%02x data : 0x%02x\n", addr, data);
401 smb328_i2c_write(client, 0x30, &data);
403 return (chg_now & 0x2);
406 static void smb328_charger_otg_control(struct sec_charger_info *charger,
411 smb328_i2c_read(charger->client, SMB328_OTG_POWER_AND_LDO, ®_data);
414 reg_data |= CFG_OTG_ENABLE;
416 reg_data &= ~CFG_OTG_ENABLE;
418 smb328_set_writable(charger->client, 1);
419 smb328_i2c_write(charger->client, SMB328_OTG_POWER_AND_LDO, ®_data);
420 smb328_set_writable(charger->client, 0);
423 static void smb328_irq_enable(struct i2c_client *client)
427 smb328_set_writable(client, 1);
429 smb328_i2c_write(client, 0x04, &data);
431 smb328_i2c_read(client,
432 SMB328_INTERRUPT_SIGNAL_SELECTION, &data);
434 smb328_i2c_write(client,
435 SMB328_INTERRUPT_SIGNAL_SELECTION, &data);
437 smb328_set_writable(client, 0);
440 static void smb328_irq_disable(struct i2c_client *client)
444 smb328_set_writable(client, 1);
446 smb328_i2c_write(client, 0x04, &data);
448 smb328_i2c_read(client,
449 SMB328_INTERRUPT_SIGNAL_SELECTION, &data);
451 smb328_i2c_write(client,
452 SMB328_INTERRUPT_SIGNAL_SELECTION, &data);
454 smb328_set_writable(client, 0);
457 static int smb328_debugfs_show(struct seq_file *s, void *data)
459 struct sec_charger_info *charger = s->private;
463 seq_printf(s, "SMB CHARGER IC :\n");
464 seq_printf(s, "==================\n");
465 for (reg = 0x00; reg <= 0x0A; reg++) {
466 smb328_i2c_read(charger->client, reg, ®_data);
467 seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
470 for (reg = 0x30; reg <= 0x39; reg++) {
471 smb328_i2c_read(charger->client, reg, ®_data);
472 seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
479 static int smb328_debugfs_open(struct inode *inode, struct file *file)
481 return single_open(file, smb328_debugfs_show, inode->i_private);
484 static const struct file_operations smb328_debugfs_fops = {
485 .open = smb328_debugfs_open,
488 .release = single_release,
491 static bool smb328_chg_init(struct sec_charger_info *charger)
493 smb328_irq_disable(charger->client);
495 (void) debugfs_create_file("smb328-regs",
496 S_IRUGO, NULL, (void *)charger, &smb328_debugfs_fops);
501 static int sec_chg_get_property(struct power_supply *psy,
502 enum power_supply_property psp,
503 union power_supply_propval *val)
505 struct sec_charger_info *charger =
506 container_of(psy, struct sec_charger_info, psy_chg);
510 case POWER_SUPPLY_PROP_STATUS:
511 val->intval = smb328_get_charging_status(charger->client);
513 case POWER_SUPPLY_PROP_CHARGE_TYPE:
514 if (!charger->is_charging)
515 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
517 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
519 case POWER_SUPPLY_PROP_HEALTH:
520 val->intval = smb328_get_charging_health(charger->client);
522 case POWER_SUPPLY_PROP_PRESENT:
523 val->intval = smb328_get_battery_present(charger->client);
525 case POWER_SUPPLY_PROP_CURRENT_NOW:
526 smb328_irq_disable(charger->client);
527 if (charger->charging_current) {
528 smb328_i2c_read(charger->client, SMB328_CHARGE_CURRENT, &data);
558 case POWER_SUPPLY_PROP_CHARGE_NOW:
559 val->intval = smb328_get_charge_now(charger->client);
561 #if defined(CONFIG_FUELGAUGE_88PM822)
562 case POWER_SUPPLY_PROP_POWER_STATUS:
563 val->intval = smb328_get_power_status(charger);
572 static int sec_chg_set_property(struct power_supply *psy,
573 enum power_supply_property psp,
574 const union power_supply_propval *val)
576 struct sec_charger_info *charger =
577 container_of(psy, struct sec_charger_info, psy_chg);
578 int cable_type, current_now;
581 /* val->intval : charging current */
582 case POWER_SUPPLY_PROP_CURRENT_NOW:
583 smb328_set_writable(charger->client, 1);
585 charger->charging_current * val->intval / 100;
586 smb328_set_fast_charging_current(charger->client, current_now);
587 smb328_set_writable(charger->client, 0);
589 /* val->intval : type */
590 case POWER_SUPPLY_PROP_ONLINE:
591 if (charger->charging_current < 0)
592 smb328_charger_otg_control(charger, 1);
593 else if (charger->charging_current > 0) {
594 smb328_charger_function_control(charger);
595 smb328_charger_otg_control(charger, 1);
597 smb328_charger_function_control(charger);
598 smb328_charger_otg_control(charger, 0);
608 static int smb328_charger_parse_dt(struct device *dev,
609 sec_battery_platform_data_t *pdata)
611 struct device_node *np = dev->of_node;
617 pr_err("%s np NULL\n", __func__);
619 ret = of_property_read_u32(np, "chg_float_voltage",
620 &pdata->chg_float_voltage);
623 np = of_find_node_by_name(NULL, "sec-battery");
625 pr_err("%s np NULL\n", __func__);
627 p = of_get_property(np, "battery,input_current_limit", &len);
631 len = len / sizeof(u32);
633 pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
636 for(i = 0; i < len; i++) {
637 ret = of_property_read_u32_index(np,
638 "battery,input_current_limit", i,
639 &pdata->charging_current[i].input_current_limit);
640 ret = of_property_read_u32_index(np,
641 "battery,fast_charging_current", i,
642 &pdata->charging_current[i].fast_charging_current);
643 ret = of_property_read_u32_index(np,
644 "battery,full_check_current_1st", i,
645 &pdata->charging_current[i].full_check_current_1st);
646 ret = of_property_read_u32_index(np,
647 "battery,full_check_current_2nd", i,
648 &pdata->charging_current[i].full_check_current_2nd);
655 static struct of_device_id sec_charger_dt_ids[] = {
656 { .compatible = "QC,smb328", },
659 MODULE_DEVICE_TABLE(of, sec_charger_dt_ids);
662 static int max77843_charger_parse_dt(struct max77843_charger_data *charger)
667 #define rt5033_charger_match_table NULL
671 static int smb328_charger_probe(struct i2c_client *client,
672 const struct i2c_device_id *id)
674 sec_battery_platform_data_t *pdata;
675 struct sec_charger_info *charger;
678 dev_info(&client->dev,
679 "%s: SEC Charger Driver Loading\n", __func__);
681 if (IS_ENABLED(CONFIG_OF)) {
683 pdata = kzalloc(sizeof(sec_battery_platform_data_t),
688 ret = smb328_charger_parse_dt(&client->dev, pdata);
692 pdata = client->dev.platform_data;
695 ret = i2c_check_functionality(client->adapter,
696 I2C_FUNC_SMBUS_BYTE_DATA |
697 I2C_FUNC_SMBUS_I2C_BLOCK);
701 charger = kzalloc(sizeof(*charger), GFP_KERNEL);
705 charger->client = client;
706 charger->pdata = pdata;
708 i2c_set_clientdata(client, charger);
710 charger->psy_chg.name = "sec-charger";
711 charger->psy_chg.type = POWER_SUPPLY_TYPE_UNKNOWN;
712 charger->psy_chg.get_property = sec_chg_get_property;
713 charger->psy_chg.set_property = sec_chg_set_property;
714 charger->psy_chg.properties = sec_charger_props;
715 charger->psy_chg.num_properties = ARRAY_SIZE(sec_charger_props);
717 if (charger->pdata->chg_gpio_init) {
718 if (!charger->pdata->chg_gpio_init()) {
719 dev_err(&client->dev,
720 "%s: Failed to Initialize GPIO\n", __func__);
725 pr_info("%s: Clinet Address : 0x%x, Add : 0x%x\n", __func__, charger->client->addr, &charger->client->addr);
726 if (!smb328_chg_init(charger)) {
727 dev_err(&client->dev,
728 "%s: Failed to Initialize Charger\n", __func__);
732 ret = power_supply_register(&client->dev, &charger->psy_chg);
734 dev_err(&client->dev,
735 "%s: Failed to Register psy_chg\n", __func__);
739 dev_dbg(&client->dev,
740 "%s: SEC Charger Driver Loaded\n", __func__);
744 power_supply_unregister(&charger->psy_chg);
752 static int smb328_charger_remove(
753 struct i2c_client *client)
758 static int smb328_charger_suspend(struct i2c_client *client,
764 static int smb328_charger_resume(struct i2c_client *client)
769 static void smb328_charger_shutdown(struct i2c_client *client)
773 static const struct i2c_device_id sec_charger_id[] = {
774 {"smb328-charger", 0},
778 MODULE_DEVICE_TABLE(i2c, sec_charger_id);
780 static struct i2c_driver sec_charger_driver = {
782 .name = "smb328-charger",
783 .of_match_table = sec_charger_dt_ids,
785 .probe = smb328_charger_probe,
786 .remove = smb328_charger_remove,
787 .suspend = smb328_charger_suspend,
788 .resume = smb328_charger_resume,
789 .shutdown = smb328_charger_shutdown,
790 .id_table = sec_charger_id,
793 static int __init smb328_charger_init(void)
795 return i2c_add_driver(&sec_charger_driver);
798 static void __exit smb328_charger_exit(void)
800 i2c_del_driver(&sec_charger_driver);
803 module_init(smb328_charger_init);
804 module_exit(smb328_charger_exit);
806 MODULE_DESCRIPTION("SMB328 Charger Driver");
807 MODULE_AUTHOR("Samsung Electronics");
808 MODULE_LICENSE("GPL");