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,
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,
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;
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
}
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) {
#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 */
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;
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
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