Advertisement
Guest User

Untitled

a guest
Nov 20th, 2022
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.28 KB | Source Code | 0 0
  1. diff --git a/drivers/battery/sec_fuelgauge.c b/drivers/battery/sec_fuelgauge.c
  2. index df999fa53..30c5d322c
  3. --- a/drivers/battery/sec_fuelgauge.c
  4. +++ b/drivers/battery/sec_fuelgauge.c
  5. @@ -157,6 +157,14 @@ static int sec_fg_get_property(struct power_supply *psy,
  6.                 sec_fg_get_atomic_capacity(fuelgauge, val);
  7.         }
  8.         break;
  9. +   case POWER_SUPPLY_PROP_STATUS:
  10. +       /* TODO */
  11. +       val->intval = 0;
  12. +       break;
  13. +   case POWER_SUPPLY_PROP_CHARGE_FULL:
  14. +       /* TODO */
  15. +       val->intval = 0;
  16. +       break;
  17.     default:
  18.         return -EINVAL;
  19.     }
  20. diff --git a/drivers/battery/sm5701_charger.c b/drivers/battery/sm5701_charger.c
  21. index a8c7fd172..2d108e17c
  22. --- a/drivers/battery/sm5701_charger.c
  23. +++ b/drivers/battery/sm5701_charger.c
  24. @@ -53,6 +53,7 @@ static enum power_supply_property sec_charger_props[] = {
  25.          POWER_SUPPLY_PROP_HEALTH,
  26.          POWER_SUPPLY_PROP_PRESENT,
  27.          POWER_SUPPLY_PROP_ONLINE,
  28. +        POWER_SUPPLY_PROP_VOLTAGE_MAX,
  29.          POWER_SUPPLY_PROP_CURRENT_MAX,
  30.          POWER_SUPPLY_PROP_CURRENT_AVG,
  31.          POWER_SUPPLY_PROP_CURRENT_NOW,
  32. @@ -209,6 +210,14 @@ static u8 SM5701_set_vbuslimit_current(
  33.     if (input_current >= 1200)
  34.         input_current = 1200;
  35.  
  36. +   if (charger->voltage_max != 4200) {
  37. +       if (charger->cable_type != POWER_SUPPLY_TYPE_BATTERY) {
  38. +           data &= ~SM5701_VBUSCNTL_VBUSLIMIT;
  39. +           SM5701_reg_write(charger->SM5701->i2c, SM5701_VBUSCNTL, data);
  40. +           pr_info("%s : SM5701_VBUSCNTL (Input current limit) : 0x%02x\n",
  41. +               __func__, data);
  42. +       }
  43. +   }
  44.     if(input_current <= 100)
  45.         data &= ~SM5701_VBUSCNTL_VBUSLIMIT;
  46.     else if(input_current <= 500)
  47. @@ -524,6 +533,9 @@ static int sec_chg_get_property(struct power_supply *psy,
  48.         break;
  49.     case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  50.         break;
  51. +   case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  52. +       val->intval = charger->voltage_max;
  53. +       break;
  54.     default:
  55.         return -EINVAL;
  56.     }
  57. @@ -599,8 +611,15 @@ static int sec_chg_set_property(struct power_supply *psy,
  58.             /* Set float voltage */
  59.             pr_info("%s : float voltage (%dmV)\n",
  60.                 __func__, charger->pdata->chg_float_voltage);
  61. -           SM5701_set_batreg_voltage(
  62. -               charger, charger->pdata->chg_float_voltage);
  63. +           if (charger->pdata->chg_float_voltage > charger->voltage_max) {
  64. +               SM5701_set_batreg_voltage(
  65. +                   charger, charger->voltage_max);
  66. +               pr_info("%s : set float voltage to voltage_max (%dmV)\n",
  67. +                   __func__, charger->voltage_max);
  68. +           } else {
  69. +               SM5701_set_batreg_voltage(
  70. +                   charger, charger->pdata->chg_float_voltage);
  71. +           }
  72.  
  73.             /* if battery is removed, put vbus current limit to minimum */
  74.             if ((value.intval == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) ||
  75. @@ -641,8 +660,11 @@ static int sec_chg_set_property(struct power_supply *psy,
  76.             pr_info("%s : topoff current (%dmA)\n",
  77.                 __func__, charger->pdata->charging_current[
  78.                 charger->cable_type].full_check_current_1st);
  79. -           SM5701_set_topoff(
  80. -               charger, charger->pdata->charging_current[
  81. +           if (charger->voltage_max == 4200)
  82. +               SM5701_set_topoff(charger, 100);
  83. +           else
  84. +               SM5701_set_topoff(
  85. +                   charger, charger->pdata->charging_current[
  86.                     charger->cable_type].full_check_current_1st);
  87.  
  88.             /* Set fast charge current */
  89. @@ -652,6 +674,18 @@ static int sec_chg_set_property(struct power_supply *psy,
  90.                 charger, charger->charging_current);
  91.         }
  92.         break;
  93. +   /* val->intval : float voltage */
  94. +   case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  95. +       charger->voltage_max = val->intval;
  96. +       SM5701_set_batreg_voltage(
  97. +               charger, charger->voltage_max);
  98. +       pr_info("POWER_SUPPLY_PROP_VOLTAGE_MAX[%d]\n", charger->voltage_max);
  99. +       if (charger->voltage_max == 4200)
  100. +           SM5701_set_topoff(charger, 100);
  101. +       else if (charger->voltage_max == 4350)
  102. +           SM5701_set_topoff(charger, charger->pdata->charging_current[
  103. +                   charger->cable_type].full_check_current_1st);
  104. +       break;
  105.     /* val->intval : input charging current */
  106.     case POWER_SUPPLY_PROP_CURRENT_MAX:
  107.         charger->charging_current_max = val->intval;
  108. @@ -717,6 +751,8 @@ static int SM5701_charger_probe(struct platform_device *pdev)
  109.     } else
  110.         charger->pdata = pdata->charger_data;
  111.  
  112. +   charger->voltage_max = charger->pdata->chg_float_voltage;
  113. +
  114.     platform_set_drvdata(pdev, charger);
  115.  
  116.      if (charger->pdata->charger_name == NULL)
  117. diff --git a/drivers/battery/sprd27x3_fuelgauge4samsung.c b/drivers/battery/sprd27x3_fuelgauge4samsung.c
  118. index e46e00e9f..52875e1aa
  119. --- a/drivers/battery/sprd27x3_fuelgauge4samsung.c
  120. +++ b/drivers/battery/sprd27x3_fuelgauge4samsung.c
  121. @@ -321,11 +321,24 @@ bool sec_hal_fg_get_property(fuelgauge_variable_t * fg_var,
  122.         }
  123.         break;
  124.  
  125. +   case POWER_SUPPLY_PROP_PRESENT:
  126. +       /* TODO */
  127. +       break;
  128. +
  129. +   case POWER_SUPPLY_PROP_ENERGY_NOW:
  130. +       /* TODO */
  131. +       break;
  132. +
  133.     /* Battery Temperature */
  134.     case POWER_SUPPLY_PROP_TEMP:
  135. +       /* TODO */
  136. +       break;
  137.  
  138.     /* Target Temperature */
  139.     case POWER_SUPPLY_PROP_TEMP_AMBIENT:
  140. +       /* TODO */
  141. +       break;
  142. +
  143.     default:
  144.         return false;
  145.     }
  146. diff --git a/drivers/power/s3c_adc_battery.c b/drivers/power/s3c_adc_battery.c
  147. index 5948ce058..3d00b35ca 100644
  148. --- a/drivers/power/s3c_adc_battery.c
  149. +++ b/drivers/power/s3c_adc_battery.c
  150. @@ -28,7 +28,7 @@
  151.  #define JITTER_DELAY           500 /* ms */
  152.  
  153.  struct s3c_adc_bat {
  154. -   struct power_supply     psy;
  155. +   struct power_supply     *psy;
  156.     struct s3c_adc_client       *client;
  157.     struct s3c_adc_bat_pdata    *pdata;
  158.     int             volt_value;
  159. @@ -73,10 +73,10 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
  160.                 enum power_supply_property psp,
  161.                 union power_supply_propval *val)
  162.  {
  163. -   struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
  164. +   struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
  165.  
  166.     if (!bat) {
  167. -       dev_err(psy->dev, "%s: no battery infos ?!\n", __func__);
  168. +       dev_err(&psy->dev, "%s: no battery infos ?!\n", __func__);
  169.         return -EINVAL;
  170.     }
  171.  
  172. @@ -105,17 +105,17 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
  173.     }
  174.  }
  175.  
  176. -static struct s3c_adc_bat backup_bat = {
  177. -   .psy = {
  178. -       .name       = "backup-battery",
  179. -       .type       = POWER_SUPPLY_TYPE_BATTERY,
  180. -       .properties = s3c_adc_backup_bat_props,
  181. -       .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
  182. -       .get_property   = s3c_adc_backup_bat_get_property,
  183. -       .use_for_apm    = 1,
  184. -   },
  185. +static const struct power_supply_desc backup_bat_desc = {
  186. +   .name       = "backup-battery",
  187. +   .type       = POWER_SUPPLY_TYPE_BATTERY,
  188. +   .properties = s3c_adc_backup_bat_props,
  189. +   .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
  190. +   .get_property   = s3c_adc_backup_bat_get_property,
  191. +   .use_for_apm    = 1,
  192.  };
  193.  
  194. +static struct s3c_adc_bat backup_bat;
  195. +
  196.  static enum power_supply_property s3c_adc_main_bat_props[] = {
  197.     POWER_SUPPLY_PROP_STATUS,
  198.     POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  199. @@ -141,7 +141,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
  200.                     enum power_supply_property psp,
  201.                     union power_supply_propval *val)
  202.  {
  203. -   struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
  204. +   struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
  205.  
  206.     int new_level;
  207.     int full_volt;
  208. @@ -149,7 +149,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
  209.     unsigned int lut_size;
  210.  
  211.     if (!bat) {
  212. -       dev_err(psy->dev, "no battery infos ?!\n");
  213. +       dev_err(&psy->dev, "no battery infos ?!\n");
  214.         return -EINVAL;
  215.     }
  216.  
  217. @@ -232,18 +232,18 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
  218.     }
  219.  }
  220.  
  221. -static struct s3c_adc_bat main_bat = {
  222. -   .psy = {
  223. -       .name           = "main-battery",
  224. -       .type           = POWER_SUPPLY_TYPE_BATTERY,
  225. -       .properties     = s3c_adc_main_bat_props,
  226. -       .num_properties     = ARRAY_SIZE(s3c_adc_main_bat_props),
  227. -       .get_property       = s3c_adc_bat_get_property,
  228. -       .external_power_changed = s3c_adc_bat_ext_power_changed,
  229. -       .use_for_apm        = 1,
  230. -   },
  231. +static const struct power_supply_desc main_bat_desc = {
  232. +   .name           = "main-battery",
  233. +   .type           = POWER_SUPPLY_TYPE_BATTERY,
  234. +   .properties     = s3c_adc_main_bat_props,
  235. +   .num_properties     = ARRAY_SIZE(s3c_adc_main_bat_props),
  236. +   .get_property       = s3c_adc_bat_get_property,
  237. +   .external_power_changed = s3c_adc_bat_ext_power_changed,
  238. +   .use_for_apm        = 1,
  239.  };
  240.  
  241. +static struct s3c_adc_bat main_bat;
  242. +
  243.  static void s3c_adc_bat_work(struct work_struct *work)
  244.  {
  245.     struct s3c_adc_bat *bat = &main_bat;
  246. @@ -251,7 +251,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
  247.     int is_plugged;
  248.     static int was_plugged;
  249.  
  250. -   is_plugged = power_supply_am_i_supplied(&bat->psy);
  251. +   is_plugged = power_supply_am_i_supplied(bat->psy);
  252.     bat->cable_plugged = is_plugged;
  253.     if (is_plugged != was_plugged) {
  254.         was_plugged = is_plugged;
  255. @@ -279,7 +279,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
  256.         }
  257.     }
  258.  
  259. -   power_supply_changed(&bat->psy);
  260. +   power_supply_changed(bat->psy);
  261.  }
  262.  
  263.  static irqreturn_t s3c_adc_bat_charged(int irq, void *dev_id)
  264. @@ -293,6 +293,7 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
  265.  {
  266.     struct s3c_adc_client   *client;
  267.     struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data;
  268. +   struct power_supply_config psy_cfg = {};
  269.     int ret;
  270.  
  271.     client = s3c_adc_register(pdev, NULL, NULL, 0);
  272. @@ -309,17 +310,27 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
  273.     main_bat.cur_value = -1;
  274.     main_bat.cable_plugged = 0;
  275.     main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING;
  276. +   psy_cfg.drv_data = &main_bat;
  277.  
  278. -   ret = power_supply_register(&pdev->dev, &main_bat.psy);
  279. -   if (ret)
  280. +   main_bat.psy = power_supply_register(&pdev->dev, &main_bat_desc, &psy_cfg);
  281. +   if (IS_ERR(main_bat.psy)) {
  282. +       ret = PTR_ERR(main_bat.psy);
  283.         goto err_reg_main;
  284. +   }
  285.     if (pdata->backup_volt_mult) {
  286. +       const struct power_supply_config backup_psy_cfg
  287. +                       = { .drv_data = &backup_bat, };
  288. +
  289.         backup_bat.client = client;
  290.         backup_bat.pdata = pdev->dev.platform_data;
  291.         backup_bat.volt_value = -1;
  292. -       ret = power_supply_register(&pdev->dev, &backup_bat.psy);
  293. -       if (ret)
  294. +       backup_bat.psy = power_supply_register(&pdev->dev,
  295. +                              &backup_bat_desc,
  296. +                              &backup_psy_cfg);
  297. +       if (IS_ERR(backup_bat.psy)) {
  298. +           ret = PTR_ERR(backup_bat.psy);
  299.             goto err_reg_backup;
  300. +       }
  301.     }
  302.  
  303.     INIT_DELAYED_WORK(&bat_work, s3c_adc_bat_work);
  304. @@ -360,9 +371,9 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
  305.         gpio_free(pdata->gpio_charge_finished);
  306.  err_gpio:
  307.     if (pdata->backup_volt_mult)
  308. -       power_supply_unregister(&backup_bat.psy);
  309. +       power_supply_unregister(backup_bat.psy);
  310.  err_reg_backup:
  311. -   power_supply_unregister(&main_bat.psy);
  312. +   power_supply_unregister(main_bat.psy);
  313.  err_reg_main:
  314.     return ret;
  315.  }
  316. @@ -372,9 +383,9 @@ static int s3c_adc_bat_remove(struct platform_device *pdev)
  317.     struct s3c_adc_client *client = platform_get_drvdata(pdev);
  318.     struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data;
  319.  
  320. -   power_supply_unregister(&main_bat.psy);
  321. +   power_supply_unregister(main_bat.psy);
  322.     if (pdata->backup_volt_mult)
  323. -       power_supply_unregister(&backup_bat.psy);
  324. +       power_supply_unregister(backup_bat.psy);
  325.  
  326.     s3c_adc_release(client);
  327.  
  328. diff --git a/include/linux/mfd/sm5701_core.h b/include/linux/mfd/sm5701_core.h
  329. index 483993a5e..90e38e38a 100644
  330. --- a/include/linux/mfd/sm5701_core.h
  331. +++ b/include/linux/mfd/sm5701_core.h
  332. @@ -97,6 +97,7 @@ struct SM5701_charger_data {
  333.     unsigned int    charging_current;
  334.     unsigned int    input_current_limit;
  335.     unsigned int    vbus_state;
  336. +   unsigned int    voltage_max;
  337.     bool is_fullcharged;
  338.     int     aicl_on;
  339.     int     status;
  340.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement