3 * Samsung SMB358 Charger Driver
5 * Copyright (C) 2012 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.
15 #include <linux/battery/sec_charger.h>
17 #include <linux/debugfs.h>
18 #include <linux/seq_file.h>
19 #include <linux/of_gpio.h>
21 #ifndef SLOW_CHARGING_CURRENT_STANDARD
23 #if defined(CONFIG_MACH_HEAT_AIO)
24 #define SLOW_CHARGING_CURRENT_STANDARD 400
26 #define SLOW_CHARGING_CURRENT_STANDARD 1000
31 static int smb358_i2c_write(struct i2c_client *client,
35 ret = i2c_smbus_write_i2c_block_data(client, reg, 1, buf);
37 dev_err(&client->dev, "%s: Error(%d)\n", __func__, ret);
41 static int smb358_i2c_read(struct i2c_client *client,
45 ret = i2c_smbus_read_i2c_block_data(client, reg, 1, buf);
47 dev_err(&client->dev, "%s: Error(%d)\n", __func__, ret);
51 /*static void smb358_i2c_write_array(struct i2c_client *client,
55 for (i = 0; i < size; i += 3)
56 smb358_i2c_write(client, (u8) (*(buf + i)), (buf + i) + 1);
59 static int smb358_update_reg(struct i2c_client *client, int reg, u8 data)
66 ret = smb358_i2c_read(client, reg, &r_data);
68 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
72 w_data = r_data | data;
73 ret = smb358_i2c_write(client, reg, &w_data);
75 dev_err(&client->dev, "%s: error - write(%d)\n", __func__, ret);
79 ret = smb358_i2c_read(client, reg, &data);
81 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
86 "%s: reg(0x%02x) 0x%02x : 0x%02x -> 0x%02x -> 0x%02x\n",
87 __func__, reg, o_data, r_data, w_data, data);
93 static int smb358_clear_reg(struct i2c_client *client, int reg, u8 data)
100 ret = smb358_i2c_read(client, reg, &r_data);
102 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
106 w_data = r_data & (~data);
107 ret = smb358_i2c_write(client, reg, &w_data);
109 dev_err(&client->dev, "%s: error - write(%d)\n", __func__, ret);
113 ret = smb358_i2c_read(client, reg, &data);
115 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
119 dev_dbg(&client->dev,
120 "%s: reg(0x%02x)- 0x%02x : 0x%02x -> 0x%02x -> 0x%02x\n",
121 __func__, reg, o_data, r_data, w_data, data);
127 static int smb358_volatile_writes(struct i2c_client *client, u8 value)
131 if (value == SMB358_ENABLE_WRITE) {
132 ret = smb358_update_reg(client, SMB358_COMMAND_A, 0x80);
134 dev_err(&client->dev, "%s: error(%d)\n", __func__, ret);
137 dev_dbg(&client->dev, "%s: ENABLED\n", __func__);
139 ret = smb358_clear_reg(client, SMB358_COMMAND_A, 0x80);
141 dev_err(&client->dev, "%s: error(%d)\n", __func__, ret);
144 dev_dbg(&client->dev, "%s: DISABLED\n", __func__);
151 static void smb358_set_command(struct i2c_client *client,
157 if (smb358_i2c_write(client, reg, &datum) < 0)
158 dev_err(&client->dev,
159 "%s : error!\n", __func__);
161 val = smb358_i2c_read(client, reg, &after_data);
163 dev_info(&client->dev,
164 "%s : reg(0x%02x) 0x%02x => 0x%02x\n",
165 __func__, reg, datum, after_data);
167 dev_err(&client->dev, "%s : error!\n", __func__);
171 static void smb358_test_read(struct i2c_client *client)
175 for (addr = 0; addr <= 0x0f; addr++) {
176 smb358_i2c_read(client, addr, &data);
177 dev_dbg(&client->dev,
178 "%s : smb358 addr : 0x%02x data : 0x%02x\n",
179 __func__, addr, data);
181 for (addr = 0x30; addr <= 0x3f; addr++) {
182 smb358_i2c_read(client, addr, &data);
183 dev_dbg(&client->dev,
184 "%s : smb358 addr : 0x%02x data : 0x%02x\n",
185 __func__, addr, data);
190 static void smb358_read_regs(struct i2c_client *client, char *str)
195 for (addr = 0; addr <= 0x0f; addr++) {
196 smb358_i2c_read(client, addr, &data);
197 sprintf(str+strlen(str), "0x%x, ", data);
200 /* "#" considered as new line in application */
201 sprintf(str+strlen(str), "#");
203 for (addr = 0x30; addr <= 0x3f; addr++) {
204 smb358_i2c_read(client, addr, &data);
205 sprintf(str+strlen(str), "0x%x, ", data);
209 static int smb358_get_aicl_current(u8 aicl_current)
213 if (aicl_current <= 0x10)
215 else if (aicl_current <= 0x11)
217 else if (aicl_current <= 0x12)
219 else if (aicl_current <= 0x13)
221 else if (aicl_current <= 0x14)
223 else if (aicl_current <= 0x15)
225 else if (aicl_current <= 0x16)
233 static int smb358_get_charging_status(struct i2c_client *client)
235 int status = POWER_SUPPLY_STATUS_UNKNOWN;
241 u8 therm_control_a = 0;
242 u8 other_control_a = 0;
245 /*smb358_test_read(client);*/
247 smb358_i2c_read(client, SMB358_STATUS_A, &data_a);
248 dev_dbg(&client->dev,
249 "%s : charger status A(0x%02x)\n", __func__, data_a);
250 smb358_i2c_read(client, SMB358_STATUS_B, &data_b);
251 dev_dbg(&client->dev,
252 "%s : charger status B(0x%02x)\n", __func__, data_b);
253 smb358_i2c_read(client, SMB358_STATUS_C, &data_c);
254 dev_dbg(&client->dev,
255 "%s : charger status C(0x%02x)\n", __func__, data_c);
256 smb358_i2c_read(client, SMB358_STATUS_D, &data_d);
257 dev_dbg(&client->dev,
258 "%s : charger status D(0x%02x)\n", __func__, data_d);
259 smb358_i2c_read(client, SMB358_STATUS_E, &data_e);
260 dev_dbg(&client->dev,
261 "%s : charger status E(0x%02x)\n", __func__, data_e);
262 smb358_i2c_read(client, SMB358_THERM_CONTROL_A, &therm_control_a);
263 dev_dbg(&client->dev,
264 "%s : THERM_CONTROL_A(0x%02x)\n", __func__, therm_control_a);
265 smb358_i2c_read(client, SMB358_OTHER_CONTROL_A, &other_control_a);
266 dev_dbg(&client->dev,
267 "%s : OTHER_CONTROL_A(0x%02x)\n", __func__, other_control_a);
268 /* At least one charge cycle terminated,
269 * Charge current < Termination Current
272 /* top-off by full charging */
273 status = POWER_SUPPLY_STATUS_FULL;
274 goto charging_status_end;
279 /* check for 0x06 : no charging (0b00) */
281 if (!(data_c & 0x06)) {
282 status = POWER_SUPPLY_STATUS_NOT_CHARGING;
283 goto charging_status_end;
285 status = POWER_SUPPLY_STATUS_CHARGING;
286 goto charging_status_end;
289 status = POWER_SUPPLY_STATUS_DISCHARGING;
295 static int smb358_get_charging_health(struct i2c_client *client)
297 int health = POWER_SUPPLY_HEALTH_GOOD;
304 smb358_i2c_read(client, SMB358_STATUS_A, &data_a);
305 dev_dbg(&client->dev,
306 "%s : charger status A(0x%02x)\n", __func__, data_a);
307 smb358_i2c_read(client, SMB358_STATUS_B, &data_b);
308 dev_dbg(&client->dev,
309 "%s : charger status B(0x%02x)\n", __func__, data_b);
310 smb358_i2c_read(client, SMB358_STATUS_C, &data_c);
311 dev_dbg(&client->dev,
312 "%s : charger status C(0x%02x)\n", __func__, data_c);
313 smb358_i2c_read(client, SMB358_STATUS_D, &data_d);
314 dev_dbg(&client->dev,
315 "%s : charger status D(0x%02x)\n", __func__, data_d);
316 smb358_i2c_read(client, SMB358_STATUS_E, &data_e);
317 dev_dbg(&client->dev,
318 "%s : charger status E(0x%02x)\n", __func__, data_e);
319 smb358_i2c_read(client, SMB358_INTERRUPT_STATUS_E, &data_e);
320 dev_dbg(&client->dev,
321 "%s : charger interrupt status E(0x%02x)\n", __func__, data_e);
324 health = POWER_SUPPLY_HEALTH_UNDERVOLTAGE;
325 else if (data_e & 0x04)
326 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
331 /*static void smb358_allow_volatile_writes(struct i2c_client *client)
335 reg = SMB358_COMMAND_A;
336 val = smb358_i2c_read(client, reg, &data);
337 if ((val >= 0) && !(data & 0x80)) {
338 dev_dbg(&client->dev,
339 "%s : reg(0x%02x): 0x%02x", __func__, reg, data);
341 if (smb358_i2c_write(client, reg, &data) < 0)
342 dev_err(&client->dev, "%s : error!\n", __func__);
343 val = smb358_i2c_read(client, reg, &data);
346 dev_dbg(&client->dev, " => 0x%02x\n", data);
351 static u8 smb358_get_float_voltage_data(int float_voltage)
355 if (float_voltage < 3500)
357 else if(float_voltage <= 4340)
358 data = (float_voltage - 3500) / 20;
359 else if(float_voltage == 4350)
360 data = 0x2B; /* (4340 -3500)/20 + 1 */
361 else if(float_voltage <= 4500)
362 data = (float_voltage - 3500) / 20 + 1;
369 static u8 smb358_get_input_current_limit_data(
370 struct sec_charger_info *charger, int input_current)
374 if (input_current <= 300)
376 else if (input_current <= 500)
378 else if (input_current <= 700)
380 else if (input_current <= 1000)
382 else if (input_current <= 1200)
384 else if (input_current <= 1500)
386 else if (input_current <= 1800)
389 data = 0x07; /* set input current to 2000mA */
394 static u8 smb358_get_term_current_limit_data(
395 int termination_current)
399 if (termination_current <= 30)
401 else if (termination_current <= 40)
403 else if (termination_current <= 60)
405 else if (termination_current <= 80)
407 else if (termination_current <= 100)
409 else if (termination_current <= 125)
411 else if (termination_current <= 150)
414 data = 0x07; /* set termination current limit to 200mA */
419 static u8 smb358_get_fast_charging_current_data(
420 int fast_charging_current)
424 if (fast_charging_current <= 200)
426 else if (fast_charging_current <= 450)
428 else if (fast_charging_current <= 600)
430 else if (fast_charging_current <= 900)
432 else if (fast_charging_current <= 1300)
434 else if (fast_charging_current <= 1500)
436 else if (fast_charging_current <= 1800)
439 data = 0x07; /* set fast charging current to 2000mA */
444 static void smb358_enter_suspend(struct i2c_client *client)
448 pr_info("%s: ENTER SUSPEND\n", __func__);
449 smb358_update_reg(client, SMB358_COMMAND_A, 0x80);
450 smb358_set_command(client, SMB358_PIN_ENABLE_CONTROL, 0x18);
452 smb358_set_command(client, SMB358_COMMAND_A, data);
456 #if (defined(CONFIG_MACH_MILLET3G_EUR) || defined(CONFIG_MACH_MATISSE3G_OPEN) || defined(CONFIG_MACH_BERLUTI3G_EUR))
457 static void smb358_aicl_calibrate(struct i2c_client *client)
460 struct sec_charger_info *charger = i2c_get_clientdata(client);
464 u8 current_initial = 0;
465 u8 current_final = 0;
467 ret = smb358_i2c_read(client, SMB358_STATUS_E, &data);
469 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
472 /* check If AICL complete */
474 current_initial = (data & 0x0F);
476 if((current_initial >= 0x04) && (current_initial <= 0x05)){
478 ret = smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
481 smb358_set_command(client,SMB358_INPUT_CURRENTLIMIT, data);
484 ret = smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
487 smb358_set_command(client,SMB358_INPUT_CURRENTLIMIT, data);
490 smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
491 current_final = (data & 0x0F);
493 dev_err(&charger->client->dev,
494 "%s: AICL calibration success! input current (%dmA) -> (%dmA) ! \n",
495 __func__,current_initial,current_final);
499 /* Incase of AICL not complete check three times */
500 for(count=0 ;count < 3;count++)
503 ret = smb358_i2c_read(client, SMB358_STATUS_E, &data);
505 dev_err(&client->dev, "%s: error - read(%d)\n", __func__, ret);
509 current_initial = (data & 0x0F);
511 if((current_initial >= 0x04) && (current_initial <= 0x05)){
513 ret = smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
516 smb358_set_command(client,SMB358_INPUT_CURRENTLIMIT, data);
519 ret = smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
522 smb358_set_command(client,SMB358_INPUT_CURRENTLIMIT, data);
525 smb358_i2c_read(client, SMB358_INPUT_CURRENTLIMIT, &data);
526 current_final = (data & 0x0F);
528 dev_err(&charger->client->dev,
529 "%s: AICL calibration success! input current (%dmA) -> (%dmA) ! \n",
530 __func__,current_initial,current_final);
533 dev_err(&charger->client->dev,
534 "%s: AICL not complete \n",__func__);
539 dev_err(&charger->client->dev,
540 "%s: AICL calibration Failed! current (%dmA) ! \n",__func__,current_initial);
547 static void smb358_check_slow_charging(struct work_struct *work)
549 struct sec_charger_info *charger =
550 container_of(work, struct sec_charger_info, slow_work.work);
553 int aicl_current = 0;
554 union power_supply_propval val;
556 if (charger->pdata->chg_functions_setting &
557 SEC_CHARGER_NO_GRADUAL_CHARGING_CURRENT) {
558 pr_err("%s: aicl is disabled\n", __func__);
561 if (charger->pdata->charging_current
562 [charger->cable_type].input_current_limit <= SLOW_CHARGING_CURRENT_STANDARD) {
563 charger->is_slow_charging = true;
565 for(i = 0; i < 20; i++) {
566 if (charger->cable_type ==
567 POWER_SUPPLY_TYPE_BATTERY) {
568 pr_info("%s: cable is removed\n", __func__);
572 smb358_i2c_read(charger->client, SMB358_STATUS_E, &aicl_data);
573 if (aicl_data & 0x10) { /* check AICL complete */
577 pr_info("%s: aicl not complete, retry\n", __func__);
579 smb358_set_command(charger->client,
580 SMB358_VARIOUS_FUNCTIONS, 0x81);
582 smb358_set_command(charger->client,
583 SMB358_VARIOUS_FUNCTIONS, 0x95);
587 aicl_data &= 0xF; /* get only AICL result field */
589 case 0: /* AICL result 300mA */
592 case 1: /* AICL result 500mA */
595 case 2: /* AICL result 700mA */
598 case 3: /* AICL result 1000mA */
601 case 4: /* AICL result 1200mA */
604 case 5: /* AICL result 1300mA */
607 case 6: /* AICL result 1800mA */
610 case 7: /* AICL result 2000mA */
617 if (aicl_current <= SLOW_CHARGING_CURRENT_STANDARD)
618 charger->is_slow_charging = true;
620 charger->is_slow_charging = false;
623 pr_info("%s: Slow(%d), aicl_current(%d), input_current(%d)\n",
624 __func__, charger->is_slow_charging, aicl_current, charger->pdata->charging_current
625 [charger->cable_type].input_current_limit);
627 psy_do_property("battery", set,
628 POWER_SUPPLY_PROP_CHARGE_TYPE, val);
631 static void smb358_charger_function_control(
632 struct i2c_client *client)
634 struct sec_charger_info *charger = i2c_get_clientdata(client);
635 union power_supply_propval val, input_value;
639 psy_do_property("battery", get,
640 POWER_SUPPLY_PROP_STATUS, input_value);
641 status = input_value.intval;
643 charger->charging_current_max =
644 charger->pdata->charging_current[
645 charger->cable_type].input_current_limit;
647 charger->charging_current =
648 charger->pdata->charging_current[
649 charger->cable_type].fast_charging_current;
651 if (charger->charging_current < 0) {
652 dev_dbg(&client->dev,
653 "%s : OTG is activated. Ignore command!\n", __func__);
657 psy_do_property("battery", get,
658 POWER_SUPPLY_PROP_HEALTH, input_value);
659 if (input_value.intval ==
660 POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
661 pr_info("[SMB358] Unspec_failure, charger suspend\n");
662 smb358_enter_suspend(client);
664 else if (charger->cable_type ==
665 POWER_SUPPLY_TYPE_BATTERY) {
666 /* Charger Disabled */
667 smb358_set_command(client, SMB358_COMMAND_A, 0xc0);
668 if ((status == POWER_SUPPLY_STATUS_FULL) ||\
669 (input_value.intval == POWER_SUPPLY_HEALTH_OVERHEAT) ||\
670 (input_value.intval == POWER_SUPPLY_HEALTH_COLD))
672 pr_info("[SMB358] Set the registers to the default configuration\n");
673 /* Set the registers to the default configuration */
674 smb358_set_command(client, SMB358_CHARGE_CURRENT, 0xFE);
675 smb358_set_command(client, SMB358_INPUT_CURRENTLIMIT, 0x74);
676 smb358_set_command(client, SMB358_VARIOUS_FUNCTIONS, 0xD7);
678 data |= smb358_get_float_voltage_data(charger->pdata->chg_float_voltage);
679 smb358_set_command(client, SMB358_FLOAT_VOLTAGE, data);
680 /* Disable Automatic Recharge */
681 smb358_set_command(client, SMB358_CHARGE_CONTROL, 0x84);
682 smb358_set_command(client, SMB358_PIN_ENABLE_CONTROL, 0x09);
683 smb358_set_command(client, SMB358_THERM_CONTROL_A, 0xF0);
684 smb358_set_command(client, SMB358_SYSOK_USB30_SELECTION, 0x08);
685 smb358_set_command(client, SMB358_OTHER_CONTROL_A, 0x01);
686 smb358_set_command(client, SMB358_OTG_TLIM_THERM_CONTROL, 0xF6);
687 smb358_set_command(client, SMB358_LIMIT_CELL_TEMPERATURE_MONITOR, 0xA5);
688 smb358_set_command(client, SMB358_STATUS_INTERRUPT, 0x00);
689 smb358_set_command(client, SMB358_COMMAND_B, 0x00);
690 if (charger->pdata->chg_irq) {
691 smb358_set_command(client, SMB358_STAT_TIMERS_CONTROL, 0x1F);
692 smb358_set_command(client, SMB358_FAULT_INTERRUPT, 0x0C);
694 smb358_set_command(client, SMB358_STAT_TIMERS_CONTROL, 0x0F);
695 smb358_set_command(client, SMB358_FAULT_INTERRUPT, 0x00);
700 psy_do_property("battery", get,
701 POWER_SUPPLY_PROP_CHARGE_NOW, val);
702 if (val.intval == SEC_BATTERY_CHARGING_1ST)
703 full_check_type = charger->pdata->full_check_type;
705 full_check_type = charger->pdata->full_check_type_2nd;
707 smb358_i2c_read(client, SMB358_COMMAND_A, &data);
709 if ((data & 0x10) && charger->pdata->vbus_ctrl_gpio) {
711 /* disable otg & charging */
712 smb358_clear_reg(client, SMB358_COMMAND_A, 0x12);
715 gpio_set_value(charger->pdata->vbus_ctrl_gpio, 1);
718 level = gpio_get_value_cansleep(charger->pdata->vbus_ctrl_gpio);
719 pr_info("[SMB358] vbus ctrl gpio %d level %d\n", charger->pdata->vbus_ctrl_gpio, level);
722 gpio_set_value(charger->pdata->vbus_ctrl_gpio, 0);
724 /* [STEP - 1] ================================================
725 * Volatile write permission(bit 7) - allow(1)
726 * Charging Enable(bit 1) - Disabled(0, default)
727 * STAT Output(bit 0) - Enabled(0)
732 smb358_i2c_read(client, SMB358_STATUS_C, &status_c);
733 smb358_i2c_read(client, SMB358_STATUS_E, &status_e);
734 pr_info("[SMB358] status_c: 0x%x, status_e: 0x%x\n", status_c, status_e);
736 /* no charge or aicl not complete*/
737 if (((status_c & 0x06) == 0) || (status_e & 0x10) == 0)
738 smb358_set_command(client,
739 SMB358_COMMAND_A, 0xC0);
742 /* [STEP - 2] ================================================
743 * USB 5/1(9/1.5) Mode(bit 1) - USB1/USB1.5(0), USB5/USB9(1)
744 * USB/HC Mode(bit 0) - USB5/1 or USB9/1.5 Mode(0)
745 * High-Current Mode(1)
747 switch (charger->cable_type) {
748 case POWER_SUPPLY_TYPE_UNKNOWN:
749 case POWER_SUPPLY_TYPE_MAINS:
750 case POWER_SUPPLY_TYPE_USB_CDP:
751 case POWER_SUPPLY_TYPE_MISC:
752 case POWER_SUPPLY_TYPE_WIRELESS:
753 case POWER_SUPPLY_TYPE_CARDOCK:
754 case POWER_SUPPLY_TYPE_UARTOFF:
755 case POWER_SUPPLY_TYPE_LAN_HUB:
756 case POWER_SUPPLY_TYPE_MHL_900:
757 case POWER_SUPPLY_TYPE_MHL_1500:
758 case POWER_SUPPLY_TYPE_SMART_NOTG:
759 /* High-current mode */
762 case POWER_SUPPLY_TYPE_UPS:
763 case POWER_SUPPLY_TYPE_USB:
764 case POWER_SUPPLY_TYPE_USB_DCP:
765 case POWER_SUPPLY_TYPE_USB_ACA:
766 case POWER_SUPPLY_TYPE_MHL_500:
767 case POWER_SUPPLY_TYPE_MHL_USB:
768 case POWER_SUPPLY_TYPE_SMART_OTG:
769 case POWER_SUPPLY_TYPE_POWER_SHARING:
778 smb358_set_command(client,
779 SMB358_COMMAND_B, data);
782 /* [STEP 3] Charge Current(0x00) ===============================
783 * Set pre-charge current(bit 4:3) - 450mA(11)
784 * Set fast charge current(bit 7:5)
785 * Set termination current(bit 2:0)
787 if (charger->siop_level < 100) {
788 charger->charging_current =
789 charger->charging_current * charger->siop_level / 100;
791 dev_info(&client->dev,
792 "%s : fast charging current (%dmA)\n",
793 __func__, charger->charging_current);
796 data |= smb358_get_fast_charging_current_data(
797 charger->charging_current);
798 switch (full_check_type) {
799 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
800 case SEC_BATTERY_FULLCHARGED_CHGINT:
801 case SEC_BATTERY_FULLCHARGED_CHGPSY:
802 if (val.intval == SEC_BATTERY_CHARGING_1ST) {
803 dev_info(&client->dev,
804 "%s : termination current (%dmA)\n",
805 __func__, charger->pdata->charging_current[
806 charger->cable_type].full_check_current_1st);
807 data |= smb358_get_term_current_limit_data(
808 charger->pdata->charging_current[
809 charger->cable_type].full_check_current_1st);
811 dev_info(&client->dev,
812 "%s : termination current (%dmA)\n",
813 __func__, charger->pdata->charging_current[
814 charger->cable_type].full_check_current_2nd);
815 data |= smb358_get_term_current_limit_data(
816 charger->pdata->charging_current[
817 charger->cable_type].full_check_current_2nd);
821 smb358_set_command(client,
822 SMB358_CHARGE_CURRENT, data);
824 /* [STEP - 4] =================================================
825 * Enable(EN) Pin Control(bit 6) - i2c(0), Pin(1)
826 * Pin control(bit 5) - active high(0), active low(1)
827 * USB5/1/HC input State(bit3) - Dual-state input(1)
828 * USB Input Pre-bias(bit 0) - Enable(1)
831 if (charger->pdata->chg_gpio_en)
833 if (charger->pdata->chg_polarity_en)
835 smb358_set_command(client,
836 SMB358_PIN_ENABLE_CONTROL, data);
838 /* [STEP - 5] =============================================== */
839 dev_info(&client->dev, "%s : input current (%dmA)\n",
840 __func__, charger->pdata->charging_current
841 [charger->cable_type].input_current_limit);
842 /* Input current limit */
844 data |= smb358_get_input_current_limit_data(
846 charger->pdata->charging_current
847 [charger->cable_type].input_current_limit);
848 smb358_set_command(client,
849 SMB358_INPUT_CURRENTLIMIT, data);
851 /* [STEP - 6] =================================================
852 * Input to System FET(bit 7) - Controlled by Register(1)
853 * Max System voltage(bit 5) - Vflt + 0.1v(0)
854 * AICL(bit 4) - Enabled(1)
855 * VCHG Function(bit 0) - Enabled(1)
857 if (charger->pdata->chg_functions_setting &
858 SEC_CHARGER_NO_GRADUAL_CHARGING_CURRENT)
860 smb358_set_command(client,
861 SMB358_VARIOUS_FUNCTIONS, 0x81);
864 smb358_set_command(client,
865 SMB358_VARIOUS_FUNCTIONS, 0x81);
867 smb358_set_command(client,
868 SMB358_VARIOUS_FUNCTIONS, 0x95);
871 /* [STEP - 7] =================================================
872 * Pre-charged to Fast-charge Voltage Threshold(Bit 7:6) - 2.3V
873 * Float Voltage(bit 5:0)
875 dev_dbg(&client->dev, "%s : float voltage (%dmV)\n",
876 __func__, charger->pdata->chg_float_voltage);
878 data |= smb358_get_float_voltage_data(
879 charger->pdata->chg_float_voltage);
880 smb358_set_command(client,
881 SMB358_FLOAT_VOLTAGE, data);
883 /* [STEP - 8] =================================================
885 * Automatic Recharge disable(bit 7),
886 * Current Termination disable(bit 6),
887 * BMD disable(bit 5:4),
888 * INOK Output Configuration : Push-pull(bit 3)
889 * AICL glitch filter duration : 20msec(bit 0)
894 switch (full_check_type) {
895 case SEC_BATTERY_FULLCHARGED_CHGGPIO:
896 case SEC_BATTERY_FULLCHARGED_CHGINT:
897 case SEC_BATTERY_FULLCHARGED_CHGPSY:
898 /* Enable Current Termination */
902 smb358_set_command(client,
903 SMB358_CHARGE_CONTROL, data);
905 /* [STEP - 9] =================================================
906 * STAT active low(bit 7),
907 * Complete charge Timeout(bit 3:2) - Disabled(11)
908 * Pre-charge Timeout(bit 1:0) - Disable(11)
910 smb358_set_command(client,
911 SMB358_STAT_TIMERS_CONTROL, 0x1F);
913 #if defined(CONFIG_MACH_MATISSELTE_VZW)
914 /* [STEP - 10] =================================================
915 * Mininum System Voltage(bit 6) - 3.15v(0)
916 * Therm monitor(bit 4) - Disabled(1)
917 * Soft Cold/Hot Temp Limit Behavior(bit 3:2, bit 1:0) -
918 * Charger Current + Float voltage Compensation(11)
920 smb358_set_command(client,
921 SMB358_THERM_CONTROL_A, 0xB0);
923 /* [STEP - 11] ================================================
924 * OTG/ID Pin Control(bit 7:6) - RID Disabled, OTG I2c(00)
925 * Minimum System Voltage(bit 4) - 3.15V(0)
926 * Low-Battery/SYSOK Voltage threshold(bit 3:0) - 2.5V(0001)
927 * if this bit is disabled,
928 * input current for system will be disabled
930 smb358_set_command(client,
931 SMB358_OTHER_CONTROL_A, 0x11);
932 #elif defined(CONFIG_MACH_CHAGALL_USC)
933 /* [STEP - 10] =================================================
934 * Mininum System Voltage(bit 6) - 3.45v(0)
935 * Therm monitor(bit 4) - Disabled(1)
936 * Soft Cold/Hot Temp Limit Behavior(bit 3:2, bit 1:0) -
937 * Charger Current + Float voltage Compensation(11)
939 smb358_set_command(client,
940 SMB358_THERM_CONTROL_A, 0xB0);
942 /* [STEP - 11] ================================================
943 * OTG/ID Pin Control(bit 7:6) - RID Disabled, OTG I2c(00)
944 * Minimum System Voltage(bit 4) - 3.45V(0)
945 * Low-Battery/SYSOK Voltage threshold(bit 3:0) - 2.5V(0001)
946 * if this bit is disabled,
947 * input current for system will be disabled
949 smb358_set_command(client,
950 SMB358_OTHER_CONTROL_A, 0x01);
953 u8 therm_control_a, other_control_a;
954 /* [STEP - 10] =================================================
955 * Mininum System Voltage(bit 6)
956 * 3.15V(0), 3.45V(0), 3.60V(1), 3.75V(1)
957 * Therm monitor(bit 4) - Disabled(1)
958 * Soft Cold/Hot Temp Limit Behavior(bit 3:2, bit 1:0) -
959 * Charger Current + Float voltage Compensation(11)
961 smb358_i2c_read(client, SMB358_THERM_CONTROL_A, &therm_control_a);
962 pr_info("%s : THERM_CONTROL_A(0x%02x)\n", __func__, therm_control_a);
963 smb358_i2c_read(client, SMB358_OTHER_CONTROL_A, &other_control_a);
964 pr_info("%s : OTHER_CONTROL_A(0x%02x)\n", __func__, other_control_a);
966 pr_info("%s: chg_min_system_voltage(%d)\n", __func__, charger->pdata->chg_min_system_voltage);
968 if (charger->pdata->chg_min_system_voltage <= 3150) {
969 therm_control_a &= ~(0x1 << 6);
970 other_control_a |= 0x1 << 4;
971 } else if (charger->pdata->chg_min_system_voltage <= 3450) {
972 therm_control_a &= ~(0x1 << 6);
973 other_control_a &= ~(0x1 << 4);
974 } else if (charger->pdata->chg_min_system_voltage <= 3600) {
975 therm_control_a |= 0x1 << 6;
976 other_control_a &= ~(0x1 << 4);
978 therm_control_a |= 0x1 << 6;
979 other_control_a |= 0x1 << 4;
982 pr_info("%s: therm_control_a(0x%02x)\n", __func__, therm_control_a);
983 pr_info("%s: other_control_a(0x%02x)\n", __func__, other_control_a);
985 smb358_set_command(client,
986 SMB358_THERM_CONTROL_A, therm_control_a);
988 /* [STEP - 11] ================================================
989 * OTG/ID Pin Control(bit 7:6) - RID Disabled, OTG I2c(00)
990 * Minimum System Voltage(bit 4)
991 * 3.15V(1), 3.45V(0), 3.60V(0), 3.75(1)
992 * Low-Battery/SYSOK Voltage threshold(bit 3:0) - 2.5V(0001)
993 * if this bit is disabled,
994 * input current for system will be disabled
996 smb358_set_command(client,
997 SMB358_OTHER_CONTROL_A, other_control_a);
1001 /* [STEP - 12] ================================================
1002 * Charge Current Compensation(bit 7:6) - 200mA(00)
1003 * Digital Thermal Regulation Threshold(bit 5:4) - 130c
1004 * OTG current Limit at USBIN(Bit 3:2) - 900mA(11)
1005 * OTG Battery UVLO Threshold(Bit 1:0) - 3.3V(11)
1007 smb358_set_command(client,
1008 SMB358_OTG_TLIM_THERM_CONTROL, 0x3F);
1010 /* [STEP - 13] ================================================
1011 * Hard/Soft Limit Cell temp monitor
1013 smb358_set_command(client,
1014 SMB358_LIMIT_CELL_TEMPERATURE_MONITOR, 0x01);
1016 /* [STEP - 14] ================================================
1017 * FAULT interrupt - Disabled for non chg_irq, OVP enabled for chg_irq
1019 if (charger->pdata->chg_irq) {
1020 smb358_set_command(client,
1021 SMB358_FAULT_INTERRUPT, 0x0C);
1023 smb358_set_command(client,
1024 SMB358_FAULT_INTERRUPT, 0x00);
1027 /* [STEP - 15] ================================================
1028 * STATUS interrupt - Clear
1030 smb358_set_command(client,
1031 SMB358_STATUS_INTERRUPT, 0x00);
1033 /* [STEP - 16] ================================================
1034 * Volatile write permission(bit 7) - allowed(1)
1035 * Charging Enable(bit 1) - Enabled(1)
1036 * STAT Output(bit 0) - Enabled(0)
1038 smb358_set_command(client,
1039 SMB358_COMMAND_A, 0xC2);
1041 schedule_delayed_work(&charger->slow_work, 0);
1044 #if (defined(CONFIG_MACH_MILLET3G_EUR) || defined(CONFIG_MACH_MATISSE3G_OPEN) || defined(CONFIG_MACH_BERLUTI3G_EUR))
1045 /* Allow time for AICL to complete */
1047 smb358_aicl_calibrate(client);
1052 static void smb358_charger_otg_control(
1053 struct i2c_client *client)
1055 struct sec_charger_info *charger = i2c_get_clientdata(client);
1057 if (charger->cable_type ==
1058 POWER_SUPPLY_TYPE_BATTERY) {
1059 dev_info(&client->dev, "%s : turn off OTG\n", __func__);
1062 smb358_clear_reg(client, SMB358_COMMAND_A, 0x10);
1064 /* Change "OTG output current limit" to 250mA */
1065 smb358_clear_reg(client, SMB358_OTG_TLIM_THERM_CONTROL, 0x0C);
1068 smb358_update_reg(client, SMB358_COMMAND_A, 0x10);
1070 dev_info(&client->dev, "%s : turn on OTG\n", __func__);
1071 smb358_set_command(client, SMB358_COMMAND_B, 0x00);
1073 /* Change "OTG output current limit" to 500mA */
1074 smb358_update_reg(client, SMB358_OTG_TLIM_THERM_CONTROL, 0x84);
1079 static void smb358_set_charging_current(
1080 struct i2c_client *client, int charging_current)
1084 smb358_clear_reg(client, SMB358_COMMAND_A, 0x02);
1086 if (!charging_current)
1089 smb358_i2c_read(client, SMB358_CHARGE_CURRENT, &data);
1091 data |= smb358_get_fast_charging_current_data(charging_current);
1092 smb358_set_command(client, SMB358_CHARGE_CURRENT, data);
1094 smb358_update_reg(client, SMB358_COMMAND_A, 0x02);
1097 static void smb358_set_charging_input_current_limit(
1098 struct i2c_client *client, int input_current_limit)
1100 struct sec_charger_info *charger = i2c_get_clientdata(client);
1103 /* Input current limit */
1105 data = smb358_get_input_current_limit_data(
1106 charger, input_current_limit);
1107 smb358_set_command(client, SMB358_INPUT_CURRENTLIMIT, data);
1110 void smb358_charger_shutdown(struct i2c_client *client)
1112 pr_info("%s: smb358 Charging Disabled\n", __func__);
1114 smb358_set_command(client, SMB358_THERM_CONTROL_A, 0xF0);
1115 smb358_set_command(client, SMB358_COMMAND_A, 0x80);
1116 smb358_volatile_writes(client, SMB358_DISABLE_WRITE);
1119 static int smb358_debugfs_show(struct seq_file *s, void *data)
1121 struct sec_charger_info *charger = s->private;
1125 seq_printf(s, "SMB CHARGER IC :\n");
1126 seq_printf(s, "==================\n");
1127 for (reg = 0x00; reg <= 0x0E; reg++) {
1128 smb358_i2c_read(charger->client, reg, ®_data);
1129 seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
1132 for (reg = 0x30; reg <= 0x3F; reg++) {
1133 smb358_i2c_read(charger->client, reg, ®_data);
1134 seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
1137 seq_printf(s, "\n");
1141 static int smb358_debugfs_open(struct inode *inode, struct file *file)
1143 return single_open(file, smb358_debugfs_show, inode->i_private);
1146 static const struct file_operations smb358_debugfs_fops = {
1147 .open = smb358_debugfs_open,
1149 .llseek = seq_lseek,
1150 .release = single_release,
1153 bool smb358_hal_chg_init(struct i2c_client *client)
1155 struct sec_charger_info *charger = i2c_get_clientdata(client);
1157 dev_info(&client->dev,
1158 "%s: SMB358 Charger init(Start)!!\n", __func__);
1160 smb358_volatile_writes(client, SMB358_ENABLE_WRITE);
1162 /*smb358_test_read(client);*/
1163 (void) debugfs_create_file("smb358_regs",
1164 S_IRUGO, NULL, (void *)charger, &smb358_debugfs_fops);
1169 bool smb358_hal_chg_suspend(struct i2c_client *client)
1174 bool smb358_hal_chg_resume(struct i2c_client *client)
1179 bool smb358_hal_chg_get_property(struct i2c_client *client,
1180 enum power_supply_property psp,
1181 union power_supply_propval *val)
1183 struct sec_charger_info *charger = i2c_get_clientdata(client);
1186 case POWER_SUPPLY_PROP_STATUS:
1187 val->intval = smb358_get_charging_status(client);
1190 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1191 if (charger->is_charging) {
1192 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
1193 if (charger->is_slow_charging) {
1194 val->intval = POWER_SUPPLY_CHARGE_TYPE_SLOW;
1195 pr_info("%s: slow-charging mode\n", __func__);
1199 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
1202 case POWER_SUPPLY_PROP_HEALTH:
1203 val->intval = smb358_get_charging_health(client);
1205 /* calculated input current limit value */
1206 case POWER_SUPPLY_PROP_CURRENT_NOW:
1207 case POWER_SUPPLY_PROP_CURRENT_AVG: /* charging current */
1208 if (charger->charging_current) {
1209 smb358_i2c_read(client, SMB358_STATUS_B, &data);
1211 switch (data & 0x07) {
1238 switch ((data & 0x18) >> 3) {
1254 dev_dbg(&client->dev,
1255 "%s : set-current(%dmA), current now(%dmA)\n",
1256 __func__, charger->charging_current, val->intval);
1264 bool smb358_hal_chg_set_property(struct i2c_client *client,
1265 enum power_supply_property psp,
1266 const union power_supply_propval *val)
1268 struct sec_charger_info *charger = i2c_get_clientdata(client);
1271 /* val->intval : type */
1272 case POWER_SUPPLY_PROP_ONLINE:
1273 if (val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
1274 union power_supply_propval ps_status;
1275 psy_do_property("ps", get,
1276 POWER_SUPPLY_PROP_STATUS, ps_status);
1277 if (ps_status.intval) {
1278 charger->cable_type = POWER_SUPPLY_TYPE_OTG;
1279 pr_info("%s: ps enable\n", __func__);
1281 charger->cable_type = POWER_SUPPLY_TYPE_BATTERY;
1282 pr_info("%s: ps disable\n", __func__);
1285 if (charger->cable_type == POWER_SUPPLY_TYPE_OTG) {
1286 smb358_charger_otg_control(client);
1287 } else if (charger->cable_type == POWER_SUPPLY_TYPE_BATTERY) {
1288 smb358_charger_function_control(client);
1289 smb358_charger_otg_control(client);
1291 smb358_charger_function_control(client);
1293 /* smb358_test_read(client); */
1295 case POWER_SUPPLY_PROP_CURRENT_MAX: /* input current limit set */
1296 /* calculated input current limit value */
1297 case POWER_SUPPLY_PROP_CURRENT_NOW:
1298 smb358_set_charging_input_current_limit(client, val->intval);
1300 /* val->intval : charging current */
1301 case POWER_SUPPLY_PROP_CURRENT_AVG:
1302 smb358_set_charging_current(client, val->intval);
1310 ssize_t smb358_hal_chg_show_attrs(struct device *dev,
1311 const ptrdiff_t offset, char *buf)
1313 struct power_supply *psy = dev_get_drvdata(dev);
1314 struct sec_charger_info *chg =
1315 container_of(psy, struct sec_charger_info, psy_chg);
1321 i += scnprintf(buf + i, PAGE_SIZE - i, "%x\n",
1325 str = kzalloc(sizeof(char)*1024, GFP_KERNEL);
1329 smb358_read_regs(chg->client, str);
1330 i += scnprintf(buf + i, PAGE_SIZE - i, "%s\n",
1343 ssize_t smb358_hal_chg_store_attrs(struct device *dev,
1344 const ptrdiff_t offset,
1345 const char *buf, size_t count)
1347 struct power_supply *psy = dev_get_drvdata(dev);
1348 struct sec_charger_info *chg =
1349 container_of(psy, struct sec_charger_info, psy_chg);
1356 if (sscanf(buf, "%x\n", &x) == 1) {
1358 smb358_i2c_read(chg->client,
1359 chg->reg_addr, &data);
1360 chg->reg_data = data;
1361 dev_dbg(dev, "%s: (read) addr = 0x%x, data = 0x%x\n",
1362 __func__, chg->reg_addr, chg->reg_data);
1367 if (sscanf(buf, "%x\n", &x) == 1) {
1369 dev_dbg(dev, "%s: (write) addr = 0x%x, data = 0x%x\n",
1370 __func__, chg->reg_addr, data);
1371 smb358_i2c_write(chg->client,
1372 chg->reg_addr, &data);
1384 static struct device_attribute smb358_charger_attrs[] = {
1385 SMB358_CHARGER_ATTR(reg),
1386 SMB358_CHARGER_ATTR(data),
1387 SMB358_CHARGER_ATTR(regs),
1390 static enum power_supply_property smb358_charger_props[] = {
1391 POWER_SUPPLY_PROP_STATUS,
1392 POWER_SUPPLY_PROP_CHARGE_TYPE,
1393 POWER_SUPPLY_PROP_HEALTH,
1394 POWER_SUPPLY_PROP_ONLINE,
1395 POWER_SUPPLY_PROP_CURRENT_MAX,
1396 POWER_SUPPLY_PROP_CURRENT_AVG,
1397 POWER_SUPPLY_PROP_CURRENT_NOW,
1398 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
1401 static int smb358_chg_get_property(struct power_supply *psy,
1402 enum power_supply_property psp,
1403 union power_supply_propval *val)
1405 struct sec_charger_info *charger =
1406 container_of(psy, struct sec_charger_info, psy_chg);
1410 case POWER_SUPPLY_PROP_CURRENT_MAX: /* input current limit set */
1411 smb358_i2c_read(charger->client, SMB358_STATUS_E, &data);
1413 int aicl_result = smb358_get_aicl_current(data);
1414 dev_info(&charger->client->dev,
1415 "%s : AICL completed (%dmA)\n", __func__, aicl_result);
1416 charger->charging_current_max = aicl_result;
1418 dev_info(&charger->client->dev,
1419 "%s : AICL is not completed \n", __func__);
1420 charger->charging_current_max = 300;
1422 val->intval = charger->charging_current_max;
1425 case POWER_SUPPLY_PROP_ONLINE:
1426 case POWER_SUPPLY_PROP_STATUS:
1427 case POWER_SUPPLY_PROP_CHARGE_TYPE:
1428 case POWER_SUPPLY_PROP_HEALTH:
1429 case POWER_SUPPLY_PROP_CURRENT_AVG: /* charging current */
1430 /* calculated input current limit value */
1431 case POWER_SUPPLY_PROP_CURRENT_NOW:
1432 if (!smb358_hal_chg_get_property(charger->client, psp, val))
1441 static int smb358_chg_set_property(struct power_supply *psy,
1442 enum power_supply_property psp,
1443 const union power_supply_propval *val)
1445 struct sec_charger_info *charger =
1446 container_of(psy, struct sec_charger_info, psy_chg);
1447 union power_supply_propval input_value;
1450 case POWER_SUPPLY_PROP_STATUS:
1451 charger->status = val->intval;
1454 /* val->intval : type */
1455 case POWER_SUPPLY_PROP_ONLINE:
1456 charger->cable_type = val->intval;
1457 if (val->intval == POWER_SUPPLY_TYPE_BATTERY || \
1458 val->intval == POWER_SUPPLY_TYPE_OTG || \
1459 val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
1460 charger->is_charging = false;
1461 charger->is_slow_charging = false;
1464 charger->is_charging = true;
1466 if (!smb358_hal_chg_set_property(charger->client, psp, val))
1470 /* val->intval : input current limit set */
1471 case POWER_SUPPLY_PROP_CURRENT_MAX:
1472 charger->charging_current_max = val->intval;
1473 /* to control charging current,
1474 * use input current limit and set charging current as much as possible
1475 * so we only control input current limit to control charge current
1477 case POWER_SUPPLY_PROP_CURRENT_NOW:
1478 if (!smb358_hal_chg_set_property(charger->client, psp, val))
1482 /* val->intval : charging current */
1483 case POWER_SUPPLY_PROP_CURRENT_AVG:
1484 charger->charging_current = val->intval;
1486 if (!smb358_hal_chg_set_property(charger->client, psp, val))
1490 /* val->intval : SIOP level (%)
1491 * SIOP charging current setting
1493 case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
1494 charger->siop_level = val->intval;
1495 if (charger->is_charging) {
1496 /* change val as charging current by SIOP level
1497 * do NOT change initial charging current setting
1499 input_value.intval =
1500 charger->pdata->charging_current[
1501 charger->cable_type].fast_charging_current * val->intval / 100;
1503 /* charging current should be over than USB charging current */
1504 if (charger->pdata->chg_functions_setting &
1505 SEC_CHARGER_MINIMUM_SIOP_CHARGING_CURRENT) {
1506 if (input_value.intval > 0 &&
1507 input_value.intval <
1508 charger->pdata->charging_current[
1509 POWER_SUPPLY_TYPE_USB].fast_charging_current)
1510 input_value.intval =
1511 charger->pdata->charging_current[
1512 POWER_SUPPLY_TYPE_USB].fast_charging_current;
1515 /* set charging current as new value */
1516 if (!smb358_hal_chg_set_property(charger->client,
1517 POWER_SUPPLY_PROP_CURRENT_AVG, &input_value))
1528 static void smb358_chg_isr_work(struct work_struct *work)
1530 struct sec_charger_info *charger =
1531 container_of(work, struct sec_charger_info, isr_work.work);
1532 union power_supply_propval val;
1533 int full_check_type;
1535 dev_info(&charger->client->dev,
1536 "%s: Charger Interrupt\n", __func__);
1538 psy_do_property("battery", get,
1539 POWER_SUPPLY_PROP_CHARGE_NOW, val);
1540 if (val.intval == SEC_BATTERY_CHARGING_1ST)
1541 full_check_type = charger->pdata->full_check_type;
1543 full_check_type = charger->pdata->full_check_type_2nd;
1545 if (full_check_type == SEC_BATTERY_FULLCHARGED_CHGINT) {
1546 if (!smb358_hal_chg_get_property(charger->client,
1547 POWER_SUPPLY_PROP_STATUS, &val))
1550 switch (val.intval) {
1551 case POWER_SUPPLY_STATUS_DISCHARGING:
1552 dev_err(&charger->client->dev,
1553 "%s: Interrupted but Discharging\n", __func__);
1556 case POWER_SUPPLY_STATUS_NOT_CHARGING:
1557 dev_err(&charger->client->dev,
1558 "%s: Interrupted but NOT Charging\n", __func__);
1561 case POWER_SUPPLY_STATUS_FULL:
1562 dev_info(&charger->client->dev,
1563 "%s: Interrupted by Full\n", __func__);
1564 psy_do_property("battery", set,
1565 POWER_SUPPLY_PROP_STATUS, val);
1568 case POWER_SUPPLY_STATUS_CHARGING:
1569 dev_err(&charger->client->dev,
1570 "%s: Interrupted but Charging\n", __func__);
1573 case POWER_SUPPLY_STATUS_UNKNOWN:
1575 dev_err(&charger->client->dev,
1576 "%s: Invalid Charger Status\n", __func__);
1581 if (charger->pdata->ovp_uvlo_check_type ==
1582 SEC_BATTERY_OVP_UVLO_CHGINT) {
1583 if (!smb358_hal_chg_get_property(charger->client,
1584 POWER_SUPPLY_PROP_HEALTH, &val))
1587 switch (val.intval) {
1588 case POWER_SUPPLY_HEALTH_OVERHEAT:
1589 case POWER_SUPPLY_HEALTH_COLD:
1590 dev_err(&charger->client->dev,
1591 "%s: Interrupted but Hot/Cold\n", __func__);
1594 case POWER_SUPPLY_HEALTH_DEAD:
1595 dev_err(&charger->client->dev,
1596 "%s: Interrupted but Dead\n", __func__);
1599 case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
1600 case POWER_SUPPLY_HEALTH_UNDERVOLTAGE:
1601 dev_info(&charger->client->dev,
1602 "%s: Interrupted by OVP/UVLO\n", __func__);
1603 /* Do not set POWER_SUPPLY_PROP_HEALTH
1604 * excute monitor work again.
1605 * ovp/uvlo is checked by polling
1607 psy_do_property("battery", set,
1608 POWER_SUPPLY_PROP_CHARGE_TYPE, val);
1611 case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE:
1612 dev_err(&charger->client->dev,
1613 "%s: Interrupted but Unspec\n", __func__);
1616 case POWER_SUPPLY_HEALTH_GOOD:
1617 dev_err(&charger->client->dev,
1618 "%s: Interrupted but Good\n", __func__);
1619 /* Do not set POWER_SUPPLY_PROP_HEALTH
1620 * excute monitor work again.
1621 * ovp/uvlo is checked by polling
1623 psy_do_property("battery", set,
1624 POWER_SUPPLY_PROP_CHARGE_TYPE, val);
1627 case POWER_SUPPLY_HEALTH_UNKNOWN:
1629 dev_err(&charger->client->dev,
1630 "%s: Invalid Charger Health\n", __func__);
1635 if (charger->pdata->cable_check_type & SEC_BATTERY_CABLE_CHECK_CHGINT) {
1636 if (!smb358_hal_chg_get_property(charger->client,
1637 POWER_SUPPLY_PROP_ONLINE, &val))
1640 /* use SEC_BATTERY_CABLE_SOURCE_EXTERNAL for cable_source_type
1641 * charger would call battery driver to set ONLINE property
1642 * check battery driver loaded or not
1644 if (get_power_supply_by_name("battery")) {
1645 psy_do_property("battery", set,
1646 POWER_SUPPLY_PROP_ONLINE, val);
1648 if (charger->pdata->check_cable_result_callback)
1649 charger->pdata->check_cable_result_callback(val.intval);
1654 static irqreturn_t smb358_chg_irq_thread(int irq, void *irq_data)
1656 struct sec_charger_info *charger = irq_data;
1658 schedule_delayed_work(&charger->isr_work, 0);
1663 static int smb358_chg_create_attrs(struct device *dev)
1667 for (i = 0; i < ARRAY_SIZE(smb358_charger_attrs); i++) {
1668 rc = device_create_file(dev, &smb358_charger_attrs[i]);
1670 goto create_attrs_failed;
1672 goto create_attrs_succeed;
1674 create_attrs_failed:
1675 dev_err(dev, "%s: failed (%d)\n", __func__, rc);
1677 device_remove_file(dev, &smb358_charger_attrs[i]);
1678 create_attrs_succeed:
1682 ssize_t smb358_chg_show_attrs(struct device *dev,
1683 struct device_attribute *attr, char *buf)
1685 const ptrdiff_t offset = attr - smb358_charger_attrs;
1692 i = smb358_hal_chg_show_attrs(dev, offset, buf);
1702 ssize_t smb358_chg_store_attrs(struct device *dev,
1703 struct device_attribute *attr,
1704 const char *buf, size_t count)
1706 const ptrdiff_t offset = attr - smb358_charger_attrs;
1712 ret = smb358_hal_chg_store_attrs(dev, offset, buf, count);
1722 static int smb358_charger_read_u32_index_dt(const struct device_node *np,
1723 const char *propname,
1724 u32 index, u32 *out_value)
1726 struct property *prop = of_find_property(np, propname, NULL);
1727 u32 len = (index + 1) * sizeof(*out_value);
1733 if (len > prop->length)
1734 return (-EOVERFLOW);
1736 *out_value = be32_to_cpup(((__be32 *)prop->value) + index);
1740 extern unsigned int system_rev;
1741 static int smb358_charger_parse_dt(struct device *dev,
1742 struct sec_charger_info *charger)
1744 struct device_node *np = dev->of_node;
1745 sec_battery_platform_data_t *pdata = charger->pdata;
1751 pr_err("%s np NULL\n", __func__);
1754 #if defined(CONFIG_MACH_VIENNAVZW) || defined(CONFIG_MACH_VIENNAATT)
1755 if (system_rev >= 0xC)
1756 pdata->vbus_ctrl_gpio = 28;
1758 pdata->vbus_ctrl_gpio = 0;
1759 pr_info("%s reading vbus_ctrl_gpio = %d\n",
1760 __func__, pdata->vbus_ctrl_gpio);
1762 ret = of_get_named_gpio(np, "charger,vbus_ctrl_gpio", 0);
1764 pdata->vbus_ctrl_gpio = ret;
1765 pr_info("%s reading vbus_ctrl_gpio = %d\n", __func__, ret);
1767 pdata->vbus_ctrl_gpio = 0;
1768 pr_info("%s vbus_ctrl_gpio read fail\n", __func__);
1772 np = of_find_node_by_name(NULL, "sec-battery");
1774 pr_err("%s np NULL\n", __func__);
1776 ret = of_property_read_u32(np, "battery,chg_float_voltage",
1777 &pdata->chg_float_voltage);
1779 pr_err("%s: chg_float_voltage read failed (%d)\n", __func__, ret);
1781 ret = of_property_read_u32(np, "battery,chg_min_system_voltage",
1782 &pdata->chg_min_system_voltage);
1784 pr_err("%s: chg_min_system_voltage read failed (%d)\n", __func__, ret);
1785 pdata->chg_min_system_voltage = 3750;
1786 pr_err("%s: chg_min_system_voltage is used as default setting (%d)\n",
1787 __func__, pdata->chg_min_system_voltage);
1790 ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
1791 &pdata->ovp_uvlo_check_type);
1793 pr_err("%s: ovp_uvlo_check_type read failed (%d)\n", __func__, ret);
1795 ret = of_get_named_gpio(np, "battery,chg_int", 0);
1797 pdata->chg_irq = gpio_to_irq(ret);
1798 pr_info("%s reading chg_int_gpio = %d\n", __func__, ret);
1800 pr_info("%s reading chg_int_gpio is empty\n", __func__);
1803 ret = of_property_read_u32(np, "battery,chg_irq_attr",
1804 (unsigned int *)&pdata->chg_irq_attr);
1806 pr_info("%s: chg_irq_attr is Empty\n", __func__);
1808 ret = of_property_read_u32(np, "battery,full_check_type",
1809 &pdata->full_check_type);
1811 pr_err("%s: full_check_type read failed (%d)\n", __func__, ret);
1813 p = of_get_property(np, "battery,input_current_limit", &len);
1814 len = len / sizeof(u32);
1815 pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
1818 for(i = 0; i < len; i++) {
1819 ret = smb358_charger_read_u32_index_dt(np,
1820 "battery,input_current_limit", i,
1821 &pdata->charging_current[i].input_current_limit);
1822 ret = smb358_charger_read_u32_index_dt(np,
1823 "battery,fast_charging_current", i,
1824 &pdata->charging_current[i].fast_charging_current);
1825 ret = smb358_charger_read_u32_index_dt(np,
1826 "battery,full_check_current_1st", i,
1827 &pdata->charging_current[i].full_check_current_1st);
1828 ret = smb358_charger_read_u32_index_dt(np,
1829 "battery,full_check_current_2nd", i,
1830 &pdata->charging_current[i].full_check_current_2nd);
1836 static int smb358_charger_parse_dt(struct max77803_charger_data *charger)
1842 static int smb358_charger_probe(
1843 struct i2c_client *client,
1844 const struct i2c_device_id *id)
1846 struct i2c_adapter *adapter =
1847 to_i2c_adapter(client->dev.parent);
1848 struct sec_charger_info *charger;
1851 dev_info(&client->dev,
1852 "%s: SMB358 Charger Driver Loading\n", __func__);
1854 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
1857 charger = kzalloc(sizeof(*charger), GFP_KERNEL);
1861 charger->client = client;
1862 if (client->dev.of_node) {
1863 void * pdata = kzalloc(sizeof(sec_battery_platform_data_t), GFP_KERNEL);
1866 charger->pdata = pdata;
1867 if (smb358_charger_parse_dt(&client->dev, charger))
1868 dev_err(&client->dev,
1869 "%s : Failed to get charger dt\n", __func__);
1871 charger->pdata = client->dev.platform_data;
1873 i2c_set_clientdata(client, charger);
1875 charger->siop_level = 100;
1876 charger->psy_chg.name = "sec-charger";
1877 charger->psy_chg.type = POWER_SUPPLY_TYPE_UNKNOWN;
1878 charger->psy_chg.get_property = smb358_chg_get_property;
1879 charger->psy_chg.set_property = smb358_chg_set_property;
1880 charger->psy_chg.properties = smb358_charger_props;
1881 charger->psy_chg.num_properties = ARRAY_SIZE(smb358_charger_props);
1882 charger->is_slow_charging = false;
1884 if (charger->pdata->chg_gpio_init) {
1885 if (!charger->pdata->chg_gpio_init()) {
1886 dev_err(&client->dev,
1887 "%s: Failed to Initialize GPIO\n", __func__);
1892 if (!smb358_hal_chg_init(charger->client)) {
1893 dev_err(&client->dev,
1894 "%s: Failed to Initialize Charger\n", __func__);
1898 ret = power_supply_register(&client->dev, &charger->psy_chg);
1900 dev_err(&client->dev,
1901 "%s: Failed to Register psy_chg\n", __func__);
1905 INIT_DELAYED_WORK(&charger->slow_work,
1906 smb358_check_slow_charging);
1908 if (charger->pdata->chg_irq) {
1910 &charger->isr_work, smb358_chg_isr_work);
1912 ret = request_threaded_irq(charger->pdata->chg_irq,
1913 NULL, smb358_chg_irq_thread,
1914 charger->pdata->chg_irq_attr,
1915 "charger-irq", charger);
1917 dev_err(&client->dev,
1918 "%s: Failed to Reqeust IRQ\n", __func__);
1919 goto err_supply_unreg;
1922 ret = enable_irq_wake(charger->pdata->chg_irq);
1924 dev_err(&client->dev,
1925 "%s: Failed to Enable Wakeup Source(%d)\n",
1929 ret = smb358_chg_create_attrs(charger->psy_chg.dev);
1931 dev_err(&client->dev,
1932 "%s : Failed to create_attrs\n", __func__);
1936 dev_info(&client->dev,
1937 "%s: SMB358 Charger Driver Loaded\n", __func__);
1941 if (charger->pdata->chg_irq)
1942 free_irq(charger->pdata->chg_irq, charger);
1944 power_supply_unregister(&charger->psy_chg);
1946 kfree(charger->pdata);
1953 static int smb358_charger_remove(
1954 struct i2c_client *client)
1959 static int smb358_charger_suspend(struct i2c_client *client,
1962 if (!smb358_hal_chg_suspend(client))
1963 dev_err(&client->dev,
1964 "%s: Failed to Suspend Charger\n", __func__);
1969 static int smb358_charger_resume(struct i2c_client *client)
1971 dev_info(&client->dev,"%s: start\n", __func__);
1973 if (!smb358_hal_chg_resume(client))
1974 dev_err(&client->dev,
1975 "%s: Failed to Resume Charger\n", __func__);
1980 static const struct i2c_device_id smb358_charger_id[] = {
1985 MODULE_DEVICE_TABLE(i2c, smb358_charger_id);
1986 static struct of_device_id smb358_i2c_match_table[] = {
1987 { .compatible = "smb358,i2c", },
1990 MODULE_DEVICE_TABLE(i2c, smb358_i2c_match_table);
1992 static struct i2c_driver smb358_charger_driver = {
1995 .owner = THIS_MODULE,
1996 .of_match_table = smb358_i2c_match_table,
1998 .probe = smb358_charger_probe,
1999 .remove = smb358_charger_remove,
2000 .suspend = smb358_charger_suspend,
2001 .resume = smb358_charger_resume,
2002 .shutdown = smb358_charger_shutdown,
2003 .id_table = smb358_charger_id,
2006 static int __init smb358_charger_init(void)
2008 return i2c_add_driver(&smb358_charger_driver);
2011 static void __exit smb358_charger_exit(void)
2013 i2c_del_driver(&smb358_charger_driver);
2016 module_init(smb358_charger_init);
2017 module_exit(smb358_charger_exit);
2019 MODULE_DESCRIPTION("Samsung SMB358 Charger Driver");
2020 MODULE_AUTHOR("Samsung Electronics");
2021 MODULE_LICENSE("GPL");