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

Attachment: 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

Reply via email to