This patch adds support for charger enable or disable from user space. As part of this a sysfs interface is added so that the user space app can set or get the usr_chrg_enbl. If the usr_chrg_enbl is set charging functionality will work as expected. If the usr_chrg_enbl is unset(false) it will completely block the charging even if we connect the charger battery will not charge. To charge the battery we need to set usr_chrg_enbl to true. As part of this patch emrg_chrg_enbl variable also initialized to false.
Signed-off-by: Ramakrishna Pallala <[email protected]> --- drivers/power/intel_mdf_battery.c | 77 +++++++++++++++++++++++++++++++++++- 1 files changed, 74 insertions(+), 3 deletions(-) diff --git a/drivers/power/intel_mdf_battery.c b/drivers/power/intel_mdf_battery.c index 0d23ae0..c89ac97 100644 --- a/drivers/power/intel_mdf_battery.c +++ b/drivers/power/intel_mdf_battery.c @@ -466,6 +466,7 @@ struct msic_power_module_info { int batt_event; int charging_mode; int emrg_chrg_enbl; /* Emergency call charge enable */ + int usr_chrg_enbl; /* User Charge Enable or Disable */ int refresh_charger; /* Refresh charger parameters */ /* Worker to monitor status and faluts */ @@ -488,6 +489,16 @@ static ssize_t get_emrg_chrg(struct device *device, static DEVICE_ATTR(emrg_charge_enable, S_IWUGO | S_IRUGO, get_emrg_chrg, set_emrg_chrg); + +/* Sysfs Entry for enable or disable Charging from user space */ +static ssize_t set_chrg_enable(struct device *device, + struct device_attribute *attr, const char *buf, size_t count); +static ssize_t get_chrg_enable(struct device *device, + struct device_attribute *attr, char *buf); +static DEVICE_ATTR(charge_enable, S_IWUGO | S_IRUGO, + get_chrg_enable, set_chrg_enable); + + /* * msic usb properties */ @@ -1918,7 +1929,8 @@ static int msic_charger_callback(void *arg, int event, struct otg_bc_cap *cap) * on the USB event. */ spin_lock(&mbi->event_lock); - if (mbi->batt_event == event && event != USBCHRG_EVENT_UPDATE) { + if ((mbi->batt_event == event && event != USBCHRG_EVENT_UPDATE) || + (!mbi->usr_chrg_enbl)) { spin_unlock(&mbi->event_lock); return 0; } @@ -2187,6 +2199,55 @@ static int check_charger_conn(struct msic_power_module_info *mbi) return retval; } +static ssize_t set_chrg_enable(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct msic_power_module_info *mbi = platform_get_drvdata(pdev); + unsigned long value; + int retval, chr_mode; + + if (strict_strtoul(buf, 10, &value)) + return -EINVAL; + + spin_lock(&mbi->event_lock); + if (value) + mbi->usr_chrg_enbl = true; + else + mbi->usr_chrg_enbl = false; + chr_mode = mbi->charging_mode; + spin_unlock(&mbi->event_lock); + + if (!value && (chr_mode != BATT_CHARGING_MODE_NONE)) { + dev_dbg(msic_dev, "User App charger disable !\n"); + msic_charger_callback(mbi, USBCHRG_EVENT_DISCONN, NULL); + + } else if (value && (chr_mode == BATT_CHARGING_MODE_NONE)) { + dev_dbg(msic_dev, "User App charger enable!\n"); + retval = check_charger_conn(mbi); + if (retval) + dev_warn(msic_dev, "check_charger_conn failed\n"); + } + + return count; +} + +static ssize_t get_chrg_enable(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct msic_power_module_info *mbi = platform_get_drvdata(pdev); + unsigned int val; + + spin_lock(&mbi->event_lock); + val = mbi->usr_chrg_enbl; + spin_unlock(&mbi->event_lock); + + return sprintf(buf, "%d\n", val); +} + /** * sfi_table_populate - Simple Firmware Interface table Populate * @sfi_table: Simple Firmware Interface table structure @@ -2273,6 +2334,8 @@ static void init_batt_props(struct msic_power_module_info *mbi) mbi->batt_event = USBCHRG_EVENT_DISCONN; mbi->charging_mode = BATT_CHARGING_MODE_NONE; + mbi->emrg_chrg_enbl = false; + mbi->usr_chrg_enbl = true; mbi->batt_props.status = POWER_SUPPLY_STATUS_DISCHARGING; mbi->batt_props.health = POWER_SUPPLY_HEALTH_GOOD; @@ -2475,7 +2538,12 @@ static int msic_battery_probe(struct platform_device *pdev) retval = device_create_file(&pdev->dev, &dev_attr_emrg_charge_enable); if (retval) - goto sysfs_create_faied; + goto sysfs1_create_faied; + + retval = device_create_file(&pdev->dev, &dev_attr_charge_enable); + if (retval) + goto sysfs2_create_faied; + /* Register with OTG */ otg_handle = penwell_otg_register_bc_callback(msic_charger_callback, @@ -2511,8 +2579,10 @@ static int msic_battery_probe(struct platform_device *pdev) requestirq_failed: penwell_otg_unregister_bc_callback(otg_handle); otg_failed: + device_remove_file(&pdev->dev, &dev_attr_charge_enable); +sysfs2_create_faied: device_remove_file(&pdev->dev, &dev_attr_emrg_charge_enable); -sysfs_create_faied: +sysfs1_create_faied: power_supply_unregister(&mbi->usb); power_reg_failed_usb: power_supply_unregister(&mbi->batt); @@ -2560,6 +2630,7 @@ static int msic_battery_remove(struct platform_device *pdev) if (mbi->msic_regs_iomap != NULL) iounmap(mbi->msic_regs_iomap); device_remove_file(&pdev->dev, &dev_attr_emrg_charge_enable); + device_remove_file(&pdev->dev, &dev_attr_charge_enable); power_supply_unregister(&mbi->usb); power_supply_unregister(&mbi->batt); -- 1.7.2.3
0002-Charer-enable-or-disable-from-user-space.patch
Description: 0002-Charer-enable-or-disable-from-user-space.patch
_______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
