EM/Battery: Implement APIs in Charger driver for FG
authorAmar Shankar <amarx.shankar@intel.com>
Thu, 12 Apr 2012 05:58:42 +0000 (11:28 +0530)
committerbuildbot <buildbot@intel.com>
Tue, 24 Apr 2012 20:31:28 +0000 (13:31 -0700)
BZ: 19894

This patch contains 5 APIs added to the charger driver code
for the FG driver to access

Change-Id: I4f74a78b51cf5b0c3a677a9b0e9d85cc82b9e90c
Signed-off-by: Amar Shankar <amarx.shankar@intel.com>
Reviewed-on: http://android.intel.com:8080/43227
Reviewed-by: Pujol, BenjaminX <benjaminx.pujol@intel.com>
Tested-by: P, Eshwar N <eshwar.n.p@intel.com>
Reviewed-by: Tc, Jenny <jenny.tc@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/power/basin_cove_charger.c
drivers/power/basin_cove_charger.h

index 2d4bf15..75ae343 100644 (file)
@@ -72,6 +72,19 @@ static int intel_scu_ipc_update_register(u16 addr, u8 bits, u8 mask)
        return 0;
 }
 
+/*FIXME: Remove this IPC call stub */
+static int intel_scu_ipc_ioread8(u16 addr, u8 *data)
+{
+       return 0;
+}
+
+/*TODO : Implement the function for adc value to temp conversion*/
+static int adc_to_temp(uint16_t adc_val, int *tp)
+{
+
+       return 0;
+
+}
 static int bc_enable_charger(void)
 {
        return intel_scu_ipc_update_register(CHGRCTRL0_ADDR, EXTCHRDIS_ENABLE,
@@ -131,10 +144,8 @@ static int mrfl_read_adc_regs(int channel, int *sensor_val,
 
        adc_val = GPADC_RSL(channel, adc_res);
        switch (channel) {
-       case GPADC_VBAT:
-               /*TO BE MODIFIED: This switch case retained for
-                use in future though vbus_volt cannot be obtained*/
-               *sensor_val = MSIC_ADC_TO_VBUS_VOL(adc_val);
+       case GPADC_BATTEMP0:
+               ret = adc_to_temp(adc_val, sensor_val);
                break;
        default:
                dev_err(&chrgr_drv_cxt->pdev->dev,
@@ -199,6 +210,34 @@ static int bc_chrgr_ps_get_property(struct power_supply *psy,
        return retval;
 }
 
+
+
+/**
+ * init_batt_props_context - initialize battery properties
+ * @chrgr_drv_cxt: basin cove charger driver structure
+ * init_batt_props function initializes the
+ * battery properties.
+ */
+static void init_batt_props_context(struct bc_chrgr_drv_context *chrgr_drv_cxt)
+{
+       unsigned char data;
+       int retval;
+
+       chrgr_drv_cxt->batt_props_cxt.status = POWER_SUPPLY_STATUS_DISCHARGING;
+       chrgr_drv_cxt->batt_props_cxt.health = POWER_SUPPLY_HEALTH_GOOD;
+       chrgr_drv_cxt->batt_props_cxt.present = BATT_NOT_PRESENT;
+       /*TODO: remove the default assignment: Assumed as battery present*/
+       chrgr_drv_cxt->current_sense_enabled = 1;
+
+       /*read specific to determine the status*/
+       retval = intel_scu_ipc_ioread8(SCHGRIRQ1_ADDR, &data);
+       if (retval)
+               dev_crit(bc_chrgr_dev, "PMIC IPC read access to SCHGRIRQ1_ADDR failed\n");
+       /* determine battery Presence */
+       else if (data & BATT_CHR_BATTDET_MASK)
+               chrgr_drv_cxt->batt_props_cxt.present = BATT_PRESENT;
+}
+
 static void init_charger_ps_context(struct bc_chrgr_drv_context *chrgr_drv_cxt)
 {
        chrgr_drv_cxt->bc_chrgr_ps.name = CHARGER_PS_NAME;
@@ -366,6 +405,98 @@ static int bc_charger_callback(void *arg, int event,
        return 0;
 }
 
+/* Exported Functions to use with Fuel Gauge driver */
+
+bool bc_is_current_sense_enabled(void)
+{
+       struct platform_device *pdev = container_of(bc_chrgr_dev,
+                                       struct platform_device, dev);
+       struct bc_chrgr_drv_context *chrgr_drv_cxt = platform_get_drvdata(pdev);
+       bool val;
+       /* check if basincove  charger is ready */
+       if (!power_supply_get_by_name(CHARGER_PS_NAME))
+               return -EAGAIN;
+
+       mutex_lock(&chrgr_drv_cxt->batt_lock);
+       val = chrgr_drv_cxt->current_sense_enabled;
+       mutex_unlock(&chrgr_drv_cxt->batt_lock);
+
+       return val;
+}
+EXPORT_SYMBOL(bc_is_current_sense_enabled);
+
+bool bc_check_battery_present(void)
+{
+       struct platform_device *pdev = container_of(bc_chrgr_dev,
+                                       struct platform_device, dev);
+       struct bc_chrgr_drv_context *chrgr_drv_cxt = platform_get_drvdata(pdev);
+       bool val;
+       /* check if basincove  charger is ready */
+       if (!power_supply_get_by_name(CHARGER_PS_NAME))
+               return -EAGAIN;
+
+       mutex_lock(&chrgr_drv_cxt->batt_lock);
+       val = chrgr_drv_cxt->batt_props_cxt.present;
+       mutex_unlock(&chrgr_drv_cxt->batt_lock);
+
+       return val;
+}
+EXPORT_SYMBOL(bc_check_battery_present);
+
+int bc_check_battery_health(void)
+{
+       struct platform_device *pdev = container_of(bc_chrgr_dev,
+                                       struct platform_device, dev);
+       struct bc_chrgr_drv_context *chrgr_drv_cxt = platform_get_drvdata(pdev);
+       unsigned int val;
+       /* check if basincove  charger is ready */
+       if (!power_supply_get_by_name(CHARGER_PS_NAME))
+               return -EAGAIN;
+
+       mutex_lock(&chrgr_drv_cxt->batt_lock);
+       val = chrgr_drv_cxt->batt_props_cxt.health;
+       mutex_unlock(&chrgr_drv_cxt->batt_lock);
+
+       return val;
+}
+EXPORT_SYMBOL(bc_check_battery_health);
+
+int bc_check_battery_status(void)
+{
+       struct platform_device *pdev = container_of(bc_chrgr_dev,
+                                       struct platform_device, dev);
+       struct bc_chrgr_drv_context *chrgr_drv_cxt = platform_get_drvdata(pdev);
+       unsigned int val;
+       /* check if basincove  charger is ready */
+       if (!power_supply_get_by_name(CHARGER_PS_NAME))
+               return -EAGAIN;
+
+       mutex_lock(&chrgr_drv_cxt->batt_lock);
+       val = chrgr_drv_cxt->batt_props_cxt.status;
+       mutex_unlock(&chrgr_drv_cxt->batt_lock);
+
+       return val;
+}
+EXPORT_SYMBOL(bc_check_battery_status);
+
+
+int bc_get_battery_pack_temp(int *temp)
+{
+       struct platform_device *pdev = container_of(bc_chrgr_dev,
+                                       struct platform_device, dev);
+       struct bc_chrgr_drv_context *chrgr_drv_cxt = platform_get_drvdata(pdev);
+
+       if (!chrgr_drv_cxt->current_sense_enabled)
+               return -ENODEV;
+       /* check if basincove  charger is ready */
+       if (!power_supply_get_by_name(CHARGER_PS_NAME))
+               return -EAGAIN;
+
+       return mrfl_read_adc_regs(GPADC_BATTEMP0, temp, chrgr_drv_cxt);
+}
+EXPORT_SYMBOL(bc_get_battery_pack_temp);
+
+
 /**
  * bc_charger_probe - basin cove charger probe function
  * @pdev: basin cove platform device structure
@@ -431,12 +562,14 @@ static int bc_chrgr_probe(struct platform_device *pdev)
        }
 
        init_charger_ps_context(chrgr_drv_cxt);
+       init_batt_props_context(chrgr_drv_cxt);
 
        /*TODO: Interrupt tree mapping */
        /*TODO: Register IRQ handler */
 
        /* initialize mutexes */
        mutex_init(&chrgr_drv_cxt->bc_chrgr_lock);
+       mutex_init(&chrgr_drv_cxt->batt_lock);
 
        retval = power_supply_register(&pdev->dev, &chrgr_drv_cxt->bc_chrgr_ps);
        if (retval) {
index 059ea49..44271ba 100644 (file)
 #define TT_CHGRENVAL_ADDR              0X32
 #define TT_CHGRDISVAL_ADDR             0X33
 
+/*Interrupt registers*/
+#define BATT_CHR_BATTDET_MASK  D2
+/*Status registers*/
+#define SCHGRIRQ1_ADDR         0x4F
+#define BATT_PRESENT           1
+#define BATT_NOT_PRESENT       0
 #define BATT_STRING_MAX                8
 #define BATTID_STR_LEN         8
 #define BATT_PROF_MAX_TEMP_NR_RNG      6
 
 #define CHARGER_PRESENT                1
 #define CHARGER_NOT_PRESENT    0
-/*FIXME: Modify below conversion formula*/
-/*Convert ADC value to VBUS voltage*/
-#define MSIC_ADC_TO_VBUS_VOL(adc_val)   ((6843 * (adc_val)) / 1000)
 /*FIXME: Modify default values */
 #define BATT_DEAD_CUTOFF_VOLT          3400    /* 3400 mV */
 #define BATT_CRIT_CUTOFF_VOLT          3700    /* 3700 mV */
@@ -198,6 +201,12 @@ struct charging_profile {
        struct temp_mon_table temp_mon_range[BATT_PROF_MAX_TEMP_NR_RNG];
 } __packed;
 
+struct bc_batt_props_cxt {
+       unsigned int status;
+       unsigned int health;
+       bool present;
+};
+
 struct bc_charger_props_cxt {
        unsigned int charging_mode;
        unsigned int charger_present;
@@ -253,6 +262,14 @@ struct bc_chrgr_drv_context {
 
        unsigned int irq;               /* GPE_ID or IRQ# */
 
+       /* bc battery data */
+       /* lock to protect battery  properties
+       * locking is applied wherever read or write
+       * operation is being performed to the battery
+       * property structure.
+       */
+       struct mutex batt_lock;
+       struct bc_batt_props_cxt batt_props_cxt;
 
        /* lock to avoid concurrent  access to HW Registers.
         * As some charger control and parameter registers
@@ -262,6 +279,14 @@ struct bc_chrgr_drv_context {
        struct mutex bc_ipc_rw_lock;
        /* Worker to handle otg callback events */
        struct delayed_work chrg_callback_dwrk;
+       bool current_sense_enabled;
+
 };
 
+extern bool bc_is_current_sense_enabled(void);
+extern bool bc_check_battery_present(void);
+extern int bc_check_battery_health(void);
+extern int bc_check_battery_status(void);
+extern int bc_get_battery_pack_temp(int *val);
+
 #endif