From 5185a3d4d2c3f09417017d3d9ee0048287538feb Mon Sep 17 00:00:00 2001 From: jinchul kim Date: Wed, 12 Sep 2018 16:08:26 +0900 Subject: [PATCH] [ERD][RAMEN9610-13615] IFPMIC: S2MU00X: current control for thermal action Change-Id: Ib6fe1fb23c3126c383c137e4cf503912f90f8a05 Signed-off-by: jinchul kim --- drivers/power/supply/s2mu00x_battery.c | 117 +++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/drivers/power/supply/s2mu00x_battery.c b/drivers/power/supply/s2mu00x_battery.c index 47ea1cc98e7e..4a6e99d86808 100644 --- a/drivers/power/supply/s2mu00x_battery.c +++ b/drivers/power/supply/s2mu00x_battery.c @@ -231,6 +231,9 @@ struct s2mu00x_battery_info { int vchg_voltage; int vchg_current; int charge_temp; + + int thermal_enable; + int thermal_fast_charge_percentage; }; static int is_charging_mode = S2MU00X_NOR_MODE; @@ -297,6 +300,13 @@ static int set_charging_current(struct s2mu00x_battery_info *battery) get_charging_current(battery, &input_current, &charging_current); } + + if(battery->thermal_enable == 1) + { + charging_current = charging_current * battery->thermal_fast_charge_percentage / 100; + pr_info("%s: cable_type(%d), charging current: %d (by thermal_enable: %d %d \n", __func__, + battery->cable_type, charging_current, battery->thermal_enable, battery->thermal_fast_charge_percentage); + } /* set input current limit */ if (battery->input_current != input_current) { value.intval = input_current; @@ -1889,6 +1899,95 @@ static void soc_control_worker(struct work_struct *work) { struct s2mu00x_battery_info *battery = container_of(work, struct s2mu00x_battery_info, soc_control.work); + pr_err("%s \n", __func__); + return 1; +} + +static ssize_t charger_set_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct power_supply *psy = dev_get_drvdata(dev); + struct s2mu00x_battery_info *battery = power_supply_get_drvdata(psy); + int enable; + + sscanf(buf, "%d", &enable); + pr_err("%s enable: %d\n", __func__, enable); + + if(enable == 1) { + battery->cable_type = POWER_SUPPLY_TYPE_MAINS; + alarm_cancel(&battery->monitor_alarm); + wake_lock(&battery->monitor_wake_lock); + queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0); + } + else { + battery->cable_type = POWER_SUPPLY_TYPE_BATTERY; + alarm_cancel(&battery->monitor_alarm); + wake_lock(&battery->monitor_wake_lock); + queue_delayed_work(battery->monitor_wqueue, &battery->monitor_work, 0); + + } + return count; +} +static ssize_t charger_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct power_supply *psy = dev_get_drvdata(dev); + struct s2mu00x_battery_info *battery = power_supply_get_drvdata(psy); + + if(battery->cable_type == POWER_SUPPLY_TYPE_MAINS) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); + + pr_err("%s \n", __func__); + return 1; +} +static ssize_t charger_status_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + pr_err("%s \n", __func__); + return count; +} + +static ssize_t charger_current_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct power_supply *psy = dev_get_drvdata(dev); + struct s2mu00x_battery_info *battery = power_supply_get_drvdata(psy); + + return sprintf(buf, "Input current limit : %d , Charging current limit: %d\n", battery->input_current, battery->charging_current); +} + +static ssize_t charger_current_store(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + struct power_supply *psy = dev_get_drvdata(dev); + struct s2mu00x_battery_info *battery = power_supply_get_drvdata(psy); + int thermal_enable, thermal_fast_charge_percentage; + + sscanf(buf, "%d %d", &thermal_enable, &thermal_fast_charge_percentage); + pr_err("%s thermal_enable: %d thermal_fast_charge_percentage: %d\n", __func__, + thermal_enable, thermal_fast_charge_percentage); + + battery->thermal_enable = thermal_enable; + battery->thermal_fast_charge_percentage = thermal_fast_charge_percentage; + + set_charging_current(battery); + + + pr_err("%s \n", __func__); + return count; +} +DEVICE_ATTR(charger_set, 0664, charger_set_show, charger_set_store); +DEVICE_ATTR(charger_status, 0664, charger_status_show, charger_status_store); +DEVICE_ATTR(charger_current, 0664, charger_current_show, charger_current_store); + +#if 0 +static struct device_attribute s2mu00x_battery_attrs[] = { + dev_attr_charger_set, + dev_attr_charger_status, +}; +#endif pr_info("%s: S2MU00x battery capacity = %d, status = %d\n", __func__, battery->capacity, battery->status); @@ -1899,6 +1998,24 @@ static void soc_control_worker(struct work_struct *work) } queue_delayed_work(battery->monitor_wqueue, &battery->soc_control, 10*HZ); + ret = device_create_file(dev, &dev_attr_charger_status); + if (ret) + goto create_attrs_failed; + + ret = device_create_file(dev, &dev_attr_charger_current); + if (ret) + goto create_attrs_failed; + + + goto create_attrs_succeed; + +create_attrs_failed: + device_remove_file(dev, &dev_attr_charger_set); + device_remove_file(dev, &dev_attr_charger_status); + +#endif +create_attrs_succeed: + return ret; } static int s2mu00x_battery_probe(struct platform_device *pdev) -- 2.20.1