EM/Battery: Implement ADC sensor reading for charger
authorAmar Shankar <amarx.shankar@intel.com>
Thu, 12 Apr 2012 05:55:27 +0000 (11:25 +0530)
committerbuildbot <buildbot@intel.com>
Tue, 24 Apr 2012 20:31:22 +0000 (13:31 -0700)
BZ: 15402

Implementation to fetch ADC sensor reading for obtaining adc channel
values in charger driver

Change-Id: If7800da1c6f145facaaf350cc39fac886c011f85
Signed-off-by: Amar Shankar <amarx.shankar@intel.com>
Reviewed-on: http://android.intel.com:8080/43226
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 0fcc512..2d4bf15 100644 (file)
@@ -42,7 +42,7 @@
 #include <linux/reboot.h>
 /*TODO remove this below header file once tangier_otg.h is available*/
 #include <linux/usb/penwell_otg.h>
-
+#include <asm/intel_basincove_gpadc.h>
 #include "basin_cove_charger.h"
 
 #define CHARGER_PS_NAME "bcove_charger"
@@ -106,6 +106,47 @@ static int bc_set_chrgr_current_limit(int cur_inlmt)
 }
 
 /**
+ * mrfl_read_adc_regs - read ADC value of specified sensors
+ * @channel: channel of the sensor to be sampled
+ * @sensor_val: pointer to the charger property to hold sampled value
+ * @chrgr_drv_cxt :  battery info pointer
+ *
+ * Returns 0 if success
+ */
+
+static int mrfl_read_adc_regs(int channel, int *sensor_val,
+       struct bc_chrgr_drv_context *chrgr_drv_cxt)
+{
+       int ret, adc_val;
+       struct gpadc_result *adc_res;
+       adc_res = kzalloc(sizeof(struct gpadc_result), GFP_KERNEL);
+       if (!adc_res)
+               return -ENOMEM;
+       ret = intel_basincove_gpadc_sample(channel, adc_res);
+       if (ret) {
+               dev_err(&chrgr_drv_cxt->pdev->dev,
+                       "gpadc_sample failed:%d\n", ret);
+               goto exit;
+       }
+
+       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);
+               break;
+       default:
+               dev_err(&chrgr_drv_cxt->pdev->dev,
+                       "invalid sensor%d", channel);
+               ret = -EINVAL;
+       }
+exit:
+       kfree(adc_res);
+       return ret;
+}
+
+/**
  * bc_chrgr_get_property - charger power supply get property
  * @psy: charger power supply context
  * @psp: charger property
@@ -121,7 +162,7 @@ static int bc_chrgr_ps_get_property(struct power_supply *psy,
 {
        struct bc_chrgr_drv_context *chrgr_drv_cxt =
            container_of(psy, struct bc_chrgr_drv_context, bc_chrgr_ps);
-
+       int retval = 0;
        mutex_lock(&chrgr_drv_cxt->bc_chrgr_lock);
 
        switch (psp) {
@@ -140,7 +181,7 @@ static int bc_chrgr_ps_get_property(struct power_supply *psy,
                val->intval = chrgr_drv_cxt->chrgr_props_cxt.charger_health;
                break;
        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-               /* TODO: ADC sampling of voltage */
+               /*from hardcoded value since no adc channel for vbus_volt*/
                val->intval = chrgr_drv_cxt->chrgr_props_cxt.vbus_vol * 1000;
                break;
        case POWER_SUPPLY_PROP_MODEL_NAME:
@@ -155,7 +196,7 @@ static int bc_chrgr_ps_get_property(struct power_supply *psy,
        }
 
        mutex_unlock(&chrgr_drv_cxt->bc_chrgr_lock);
-       return 0;
+       return retval;
 }
 
 static void init_charger_ps_context(struct bc_chrgr_drv_context *chrgr_drv_cxt)
@@ -174,7 +215,7 @@ static void init_charger_ps_context(struct bc_chrgr_drv_context *chrgr_drv_cxt)
               sizeof("Unknown"));
        memcpy(chrgr_drv_cxt->chrgr_props_cxt.charger_vender, "Unknown",
               sizeof("Unknown"));
-       /*TODO remove this assignment. No default val. Read from ADC */
+       /*Vbus_volt hardcoded.Not reading from ADC since no channel available*/
        chrgr_drv_cxt->chrgr_props_cxt.vbus_vol = 4200;
 }
 
index 18db0f3..059ea49 100644 (file)
 
 #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 */