Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/drivers/battery/sec_fuelgauge.c b/drivers/battery/sec_fuelgauge.c
- index df999fa53..30c5d322c
- --- a/drivers/battery/sec_fuelgauge.c
- +++ b/drivers/battery/sec_fuelgauge.c
- @@ -157,6 +157,14 @@ static int sec_fg_get_property(struct power_supply *psy,
- sec_fg_get_atomic_capacity(fuelgauge, val);
- }
- break;
- + case POWER_SUPPLY_PROP_STATUS:
- + /* TODO */
- + val->intval = 0;
- + break;
- + case POWER_SUPPLY_PROP_CHARGE_FULL:
- + /* TODO */
- + val->intval = 0;
- + break;
- default:
- return -EINVAL;
- }
- diff --git a/drivers/battery/sm5701_charger.c b/drivers/battery/sm5701_charger.c
- index a8c7fd172..2d108e17c
- --- a/drivers/battery/sm5701_charger.c
- +++ b/drivers/battery/sm5701_charger.c
- @@ -53,6 +53,7 @@ static enum power_supply_property sec_charger_props[] = {
- POWER_SUPPLY_PROP_HEALTH,
- POWER_SUPPLY_PROP_PRESENT,
- POWER_SUPPLY_PROP_ONLINE,
- + POWER_SUPPLY_PROP_VOLTAGE_MAX,
- POWER_SUPPLY_PROP_CURRENT_MAX,
- POWER_SUPPLY_PROP_CURRENT_AVG,
- POWER_SUPPLY_PROP_CURRENT_NOW,
- @@ -209,6 +210,14 @@ static u8 SM5701_set_vbuslimit_current(
- if (input_current >= 1200)
- input_current = 1200;
- + if (charger->voltage_max != 4200) {
- + if (charger->cable_type != POWER_SUPPLY_TYPE_BATTERY) {
- + data &= ~SM5701_VBUSCNTL_VBUSLIMIT;
- + SM5701_reg_write(charger->SM5701->i2c, SM5701_VBUSCNTL, data);
- + pr_info("%s : SM5701_VBUSCNTL (Input current limit) : 0x%02x\n",
- + __func__, data);
- + }
- + }
- if(input_current <= 100)
- data &= ~SM5701_VBUSCNTL_VBUSLIMIT;
- else if(input_current <= 500)
- @@ -524,6 +533,9 @@ static int sec_chg_get_property(struct power_supply *psy,
- break;
- case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
- break;
- + case POWER_SUPPLY_PROP_VOLTAGE_MAX:
- + val->intval = charger->voltage_max;
- + break;
- default:
- return -EINVAL;
- }
- @@ -599,8 +611,15 @@ static int sec_chg_set_property(struct power_supply *psy,
- /* Set float voltage */
- pr_info("%s : float voltage (%dmV)\n",
- __func__, charger->pdata->chg_float_voltage);
- - SM5701_set_batreg_voltage(
- - charger, charger->pdata->chg_float_voltage);
- + if (charger->pdata->chg_float_voltage > charger->voltage_max) {
- + SM5701_set_batreg_voltage(
- + charger, charger->voltage_max);
- + pr_info("%s : set float voltage to voltage_max (%dmV)\n",
- + __func__, charger->voltage_max);
- + } else {
- + SM5701_set_batreg_voltage(
- + charger, charger->pdata->chg_float_voltage);
- + }
- /* if battery is removed, put vbus current limit to minimum */
- if ((value.intval == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) ||
- @@ -641,8 +660,11 @@ static int sec_chg_set_property(struct power_supply *psy,
- pr_info("%s : topoff current (%dmA)\n",
- __func__, charger->pdata->charging_current[
- charger->cable_type].full_check_current_1st);
- - SM5701_set_topoff(
- - charger, charger->pdata->charging_current[
- + if (charger->voltage_max == 4200)
- + SM5701_set_topoff(charger, 100);
- + else
- + SM5701_set_topoff(
- + charger, charger->pdata->charging_current[
- charger->cable_type].full_check_current_1st);
- /* Set fast charge current */
- @@ -652,6 +674,18 @@ static int sec_chg_set_property(struct power_supply *psy,
- charger, charger->charging_current);
- }
- break;
- + /* val->intval : float voltage */
- + case POWER_SUPPLY_PROP_VOLTAGE_MAX:
- + charger->voltage_max = val->intval;
- + SM5701_set_batreg_voltage(
- + charger, charger->voltage_max);
- + pr_info("POWER_SUPPLY_PROP_VOLTAGE_MAX[%d]\n", charger->voltage_max);
- + if (charger->voltage_max == 4200)
- + SM5701_set_topoff(charger, 100);
- + else if (charger->voltage_max == 4350)
- + SM5701_set_topoff(charger, charger->pdata->charging_current[
- + charger->cable_type].full_check_current_1st);
- + break;
- /* val->intval : input charging current */
- case POWER_SUPPLY_PROP_CURRENT_MAX:
- charger->charging_current_max = val->intval;
- @@ -717,6 +751,8 @@ static int SM5701_charger_probe(struct platform_device *pdev)
- } else
- charger->pdata = pdata->charger_data;
- + charger->voltage_max = charger->pdata->chg_float_voltage;
- +
- platform_set_drvdata(pdev, charger);
- if (charger->pdata->charger_name == NULL)
- diff --git a/drivers/battery/sprd27x3_fuelgauge4samsung.c b/drivers/battery/sprd27x3_fuelgauge4samsung.c
- index e46e00e9f..52875e1aa
- --- a/drivers/battery/sprd27x3_fuelgauge4samsung.c
- +++ b/drivers/battery/sprd27x3_fuelgauge4samsung.c
- @@ -321,11 +321,24 @@ bool sec_hal_fg_get_property(fuelgauge_variable_t * fg_var,
- }
- break;
- + case POWER_SUPPLY_PROP_PRESENT:
- + /* TODO */
- + break;
- +
- + case POWER_SUPPLY_PROP_ENERGY_NOW:
- + /* TODO */
- + break;
- +
- /* Battery Temperature */
- case POWER_SUPPLY_PROP_TEMP:
- + /* TODO */
- + break;
- /* Target Temperature */
- case POWER_SUPPLY_PROP_TEMP_AMBIENT:
- + /* TODO */
- + break;
- +
- default:
- return false;
- }
- diff --git a/drivers/power/s3c_adc_battery.c b/drivers/power/s3c_adc_battery.c
- index 5948ce058..3d00b35ca 100644
- --- a/drivers/power/s3c_adc_battery.c
- +++ b/drivers/power/s3c_adc_battery.c
- @@ -28,7 +28,7 @@
- #define JITTER_DELAY 500 /* ms */
- struct s3c_adc_bat {
- - struct power_supply psy;
- + struct power_supply *psy;
- struct s3c_adc_client *client;
- struct s3c_adc_bat_pdata *pdata;
- int volt_value;
- @@ -73,10 +73,10 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
- enum power_supply_property psp,
- union power_supply_propval *val)
- {
- - struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
- + struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
- if (!bat) {
- - dev_err(psy->dev, "%s: no battery infos ?!\n", __func__);
- + dev_err(&psy->dev, "%s: no battery infos ?!\n", __func__);
- return -EINVAL;
- }
- @@ -105,17 +105,17 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
- }
- }
- -static struct s3c_adc_bat backup_bat = {
- - .psy = {
- - .name = "backup-battery",
- - .type = POWER_SUPPLY_TYPE_BATTERY,
- - .properties = s3c_adc_backup_bat_props,
- - .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
- - .get_property = s3c_adc_backup_bat_get_property,
- - .use_for_apm = 1,
- - },
- +static const struct power_supply_desc backup_bat_desc = {
- + .name = "backup-battery",
- + .type = POWER_SUPPLY_TYPE_BATTERY,
- + .properties = s3c_adc_backup_bat_props,
- + .num_properties = ARRAY_SIZE(s3c_adc_backup_bat_props),
- + .get_property = s3c_adc_backup_bat_get_property,
- + .use_for_apm = 1,
- };
- +static struct s3c_adc_bat backup_bat;
- +
- static enum power_supply_property s3c_adc_main_bat_props[] = {
- POWER_SUPPLY_PROP_STATUS,
- POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
- @@ -141,7 +141,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
- enum power_supply_property psp,
- union power_supply_propval *val)
- {
- - struct s3c_adc_bat *bat = container_of(psy, struct s3c_adc_bat, psy);
- + struct s3c_adc_bat *bat = power_supply_get_drvdata(psy);
- int new_level;
- int full_volt;
- @@ -149,7 +149,7 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
- unsigned int lut_size;
- if (!bat) {
- - dev_err(psy->dev, "no battery infos ?!\n");
- + dev_err(&psy->dev, "no battery infos ?!\n");
- return -EINVAL;
- }
- @@ -232,18 +232,18 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
- }
- }
- -static struct s3c_adc_bat main_bat = {
- - .psy = {
- - .name = "main-battery",
- - .type = POWER_SUPPLY_TYPE_BATTERY,
- - .properties = s3c_adc_main_bat_props,
- - .num_properties = ARRAY_SIZE(s3c_adc_main_bat_props),
- - .get_property = s3c_adc_bat_get_property,
- - .external_power_changed = s3c_adc_bat_ext_power_changed,
- - .use_for_apm = 1,
- - },
- +static const struct power_supply_desc main_bat_desc = {
- + .name = "main-battery",
- + .type = POWER_SUPPLY_TYPE_BATTERY,
- + .properties = s3c_adc_main_bat_props,
- + .num_properties = ARRAY_SIZE(s3c_adc_main_bat_props),
- + .get_property = s3c_adc_bat_get_property,
- + .external_power_changed = s3c_adc_bat_ext_power_changed,
- + .use_for_apm = 1,
- };
- +static struct s3c_adc_bat main_bat;
- +
- static void s3c_adc_bat_work(struct work_struct *work)
- {
- struct s3c_adc_bat *bat = &main_bat;
- @@ -251,7 +251,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
- int is_plugged;
- static int was_plugged;
- - is_plugged = power_supply_am_i_supplied(&bat->psy);
- + is_plugged = power_supply_am_i_supplied(bat->psy);
- bat->cable_plugged = is_plugged;
- if (is_plugged != was_plugged) {
- was_plugged = is_plugged;
- @@ -279,7 +279,7 @@ static void s3c_adc_bat_work(struct work_struct *work)
- }
- }
- - power_supply_changed(&bat->psy);
- + power_supply_changed(bat->psy);
- }
- static irqreturn_t s3c_adc_bat_charged(int irq, void *dev_id)
- @@ -293,6 +293,7 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
- {
- struct s3c_adc_client *client;
- struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data;
- + struct power_supply_config psy_cfg = {};
- int ret;
- client = s3c_adc_register(pdev, NULL, NULL, 0);
- @@ -309,17 +310,27 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
- main_bat.cur_value = -1;
- main_bat.cable_plugged = 0;
- main_bat.status = POWER_SUPPLY_STATUS_DISCHARGING;
- + psy_cfg.drv_data = &main_bat;
- - ret = power_supply_register(&pdev->dev, &main_bat.psy);
- - if (ret)
- + main_bat.psy = power_supply_register(&pdev->dev, &main_bat_desc, &psy_cfg);
- + if (IS_ERR(main_bat.psy)) {
- + ret = PTR_ERR(main_bat.psy);
- goto err_reg_main;
- + }
- if (pdata->backup_volt_mult) {
- + const struct power_supply_config backup_psy_cfg
- + = { .drv_data = &backup_bat, };
- +
- backup_bat.client = client;
- backup_bat.pdata = pdev->dev.platform_data;
- backup_bat.volt_value = -1;
- - ret = power_supply_register(&pdev->dev, &backup_bat.psy);
- - if (ret)
- + backup_bat.psy = power_supply_register(&pdev->dev,
- + &backup_bat_desc,
- + &backup_psy_cfg);
- + if (IS_ERR(backup_bat.psy)) {
- + ret = PTR_ERR(backup_bat.psy);
- goto err_reg_backup;
- + }
- }
- INIT_DELAYED_WORK(&bat_work, s3c_adc_bat_work);
- @@ -360,9 +371,9 @@ static int s3c_adc_bat_probe(struct platform_device *pdev)
- gpio_free(pdata->gpio_charge_finished);
- err_gpio:
- if (pdata->backup_volt_mult)
- - power_supply_unregister(&backup_bat.psy);
- + power_supply_unregister(backup_bat.psy);
- err_reg_backup:
- - power_supply_unregister(&main_bat.psy);
- + power_supply_unregister(main_bat.psy);
- err_reg_main:
- return ret;
- }
- @@ -372,9 +383,9 @@ static int s3c_adc_bat_remove(struct platform_device *pdev)
- struct s3c_adc_client *client = platform_get_drvdata(pdev);
- struct s3c_adc_bat_pdata *pdata = pdev->dev.platform_data;
- - power_supply_unregister(&main_bat.psy);
- + power_supply_unregister(main_bat.psy);
- if (pdata->backup_volt_mult)
- - power_supply_unregister(&backup_bat.psy);
- + power_supply_unregister(backup_bat.psy);
- s3c_adc_release(client);
- diff --git a/include/linux/mfd/sm5701_core.h b/include/linux/mfd/sm5701_core.h
- index 483993a5e..90e38e38a 100644
- --- a/include/linux/mfd/sm5701_core.h
- +++ b/include/linux/mfd/sm5701_core.h
- @@ -97,6 +97,7 @@ struct SM5701_charger_data {
- unsigned int charging_current;
- unsigned int input_current_limit;
- unsigned int vbus_state;
- + unsigned int voltage_max;
- bool is_fullcharged;
- int aicl_on;
- int status;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement