#include <linux/delay.h>
#include <linux/workqueue.h>
#include <linux/of.h>
-
+#include <linux/rtc.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
/* define for function */
#define ENABLE_FUEL_GAUGE_FUNCTION
#define ENABLE_LOW_BATTERY_DETECTION
-#define ENABLE_FACTORY_MODE
+//#define ENABLE_FACTORY_MODE
#define DISABLE_CHARGER_TIMER
/* #define ENABLE_FG_KEEP_ON_MODE */
/* #define ENABLE_OCV_TABLE_CALIB */
#define RICOH619_OCV_OFFSET_BOUND 3
#define RICOH619_OCV_OFFSET_RATIO 2
-#define RICOH619_VADP_DROP_WORK 1
+#define RICOH619_VADP_DROP_WORK
#define RICOH619_TIME_CHG_STEP (1*HZ)// unit:secound
#define RICOH619_TIME_CHG_COUNT 15*60//only for test //15*60
static int get_battery_temp_2(struct ricoh619_battery_info *info);
static int check_jeita_status(struct ricoh619_battery_info *info, bool *is_jeita_updated);
static void ricoh619_scaling_OCV_table(struct ricoh619_battery_info *info, int cutoff_vol, int full_vol, int *start_per, int *end_per);
-static int ricoh619_Check_OCV_Offset(struct ricoh619_battery_info *info);
+//static int ricoh619_Check_OCV_Offset(struct ricoh619_battery_info *info);
static int calc_ocv(struct ricoh619_battery_info *info)
{
return ocv;
}
-
+#if 0
static int set_Rlow(struct ricoh619_battery_info *info)
{
int err;
/**
**/
+
static int ricoh619_Check_OCV_Offset(struct ricoh619_battery_info *info)
{
int ocv_table[11]; // HEX value
return 0;
}
-
+#endif
static int reset_FG_process(struct ricoh619_battery_info *info)
{
int err;
int i,j;
int ocv_table[11];
int temp;
- int Target_Cutoff_Vol = 0;
+// int Target_Cutoff_Vol = 0;
int Ocv_ZeroPer_now;
int Ibat_now;
int fa_cap,use_cap;
int CC_OnePer_step;
int Ibat_min;
- int Ocv_now;
+// int Ocv_now;
int Ocv_now_table;
- int soc_per;
- int use_cap_now;
+// int soc_per;
+// int use_cap_now;
int Rsys_now;
/* get const value */
j = info->soca->soc - info->soca->soc/1000*1000;
Ocv_now_table = ocv_table[i]*100+(ocv_table[i+1]-ocv_table[i])*j/10;
- Rsys_now = (info->soca->Vsys_ave - Ocv_now_table) / info->soca->Ibat_ave;
+ Rsys_now = (info->soca->Vsys_ave - Ocv_now_table) / info->soca->Ibat_ave;
+ if (((abs(info->soca->soc - info->soca->displayed_soc)) > 10)
+ && (info->soca->Ibat_ave > -250)) {
+ if (Rsys_now < 0)
+ Rsys_now = max(-info->soca->Rbat, Rsys_now);
+ else
+ Rsys_now = min(info->soca->Rbat, Rsys_now);
+ }
Ocv_ZeroPer_now = info->soca->target_vsys * 1000 - Ibat_now * Rsys_now;
FA_CAP_now = fa_cap * ((10000 - start_per) / 100 ) / 100;
- RICOH_FG_DBG("PMU: ------- Target_Cutoff_Vol= %d: Ocv_ZeroPer_now= %d: start_per= %d =======\n",
- Target_Cutoff_Vol, Ocv_ZeroPer_now, start_per);
+ RICOH_FG_DBG("PMU: -------Ocv_ZeroPer_now= %d: start_per= %d =======\n",
+ Ocv_ZeroPer_now, start_per);
/* get RE_CAP_now */
RE_CAP_now = FA_CAP_now - use_cap;
info->soca->soc = calc_capacity(info) * 100;
}
}
- if (RICOH619_SOCA_DISP == info->soca->status) {
+ else if (RICOH619_SOCA_DISP == info->soca->status) {
info->soca->soc = calc_capacity_2(info);
info->soca->last_displayed_soc = info->soca->displayed_soc+50;
- if((info->soca->displayed_soc >= 9850) && (info->soca->Ibat_ave > -20) && (info->capacity < 100))
+ if ((info->soca->displayed_soc >= 9850) && (info->soca->Ibat_ave > -20) && (info->capacity < 100)
+ && (info->soca->chg_status == POWER_SUPPLY_STATUS_CHARGING))
{
if(info->chg_complete_rd_flag == 0)
{
RICOH_FG_DBG("info->chg_complete_rd_cnt = %d\n", info->chg_complete_rd_cnt);
RICOH_FG_DBG("info->chg_complete_rd_flag = %d\n", info->chg_complete_rd_flag);
RICOH_FG_DBG("info->chg_complete_tm_ov_flag = %d\n", info->chg_complete_tm_ov_flag);
- RICOH_FG_DBG("time_ov_flag = %d\n", time_ov_flag);
if(info->chg_complete_rd_flag == 1)
{
}
}
- if(time_ov_flag == 0)
+ if ((time_ov_flag == 0) && (info->soca->chg_status == POWER_SUPPLY_STATUS_CHARGING))
{
info->chg_complete_rd_cnt++;
queue_delayed_work(info->monitor_wqueue, &info->charge_complete_ready,
}
else
{
- time_ov_flag = 0;
+ info->chg_complete_rd_flag = 0;
}
RICOH_FG_DBG("PMU2: %s return\n", __func__);
{
struct ricoh619_battery_info *info
= container_of(work, struct ricoh619_battery_info, irq_work);
- int ret = 0,i;
+ int ret = 0;
uint8_t reg_val;
RICOH_FG_DBG("PMU:%s In\n", __func__);
ricoh619_read(info->dev->parent, CHGSTATE_REG, ®_val);
if (reg_val & 0x40) { /* USE ADP */
#ifdef SUPPORT_USB_CONNECT_TO_ADP
+ int i;
for(i =0;i<60;i++){
RICOH_FG_DBG("PMU:%s usb det dwc_otg_check_dpdm =%d\n", __func__,dwc_otg_check_dpdm(0));
if(2 == dwc_otg_check_dpdm(0)){
ricoh619_write(info->dev->parent, CHGISET_REG, 0xD3);
}
#endif
- }
- else if (reg_val & 0x80) { /* USE USB */
+ } else if (reg_val & 0x80) { /* USE ONLY USB */
queue_work(info->usb_workqueue, &info->usb_irq_work);
}
}
{
struct ricoh619_battery_info *info = container_of(work,
struct ricoh619_battery_info, usb_irq_work);
- int ret = 0,i;
+ int ret = 0;
uint8_t sts;
RICOH_FG_DBG("PMU:%s In\n", __func__);
dev_err(info->dev, "Error in reading the control register\n");
sts &= 0x02;
- if (sts) {
- for(i =0;i<60;i++){
+ if (sts)
ricoh619_usb_charge_det();
- mdelay(10);
- }
- } else {
- /*********************/
- /* No process ?? */
- /*********************/
- }
RICOH_FG_DBG("PMU:%s Out\n", __func__);
}
new_temp = get_battery_temp(info);
return new_temp;
}
-
+#if 0
static int get_time_to_empty(struct ricoh619_battery_info *info)
{
int ret = 0;
return ret;
}
-
+#endif
/* battery voltage is get from Fuel gauge */
static int measure_vbatt_FG(struct ricoh619_battery_info *info, int *data)
{
return ret;
}
#ifdef SUPPORT_USB_CONNECT_TO_ADP
- if (psy->type == POWER_SUPPLY_TYPE_MAINS)
+ if (psy->type == POWER_SUPPLY_TYPE_MAINS){
if((2 == dwc_otg_check_dpdm(0)) && (status & 0x40))
val->intval =1;
else
val->intval =0;
- else if (psy->type == POWER_SUPPLY_TYPE_USB)
+ }
+ else if (psy->type == POWER_SUPPLY_TYPE_USB){
if((1 == dwc_otg_check_dpdm(0)) && (status & 0x40))
val->intval =1;
else
val->intval =0;
+ }
#else
if (psy->type == POWER_SUPPLY_TYPE_MAINS)
val->intval = (status & 0x40 ? 1 : 0);
if (info->entry_factory_mode){
val->intval = 100;
info->capacity = 100;
- } else if (info->soca->displayed_soc < 0) {
- val->intval = 10;
- info->capacity = 10;
+ } else if ((info->soca->displayed_soc < 0) || (info->cur_voltage == 0)) {
+ val->intval = 50;
+ info->capacity = 50;
} else {
if(info->chg_complete_tm_ov_flag == 1)
{
struct device_node *nproot = pdev->dev.parent->of_node;
struct device_node *np;
struct ricoh619_battery_platform_data *pdata;
- int temp;
if (!nproot)
return pdev->dev.platform_data;
/* check rage of b,.attery type */
type_n = Battery_Type();
- RICOH_FG_DBG("%s type_n=%d,temp is %d\n", __func__, type_n,temp);
+ RICOH_FG_DBG("%s type_n=%d\n", __func__, type_n);
switch (type_n) {
case (0):
return 0;
out:
- kfree(info);
return ret;
}
#ifdef RICOH619_VADP_DROP_WORK
cancel_delayed_work(&info->vadp_drop_work);
#endif
+#ifdef ENABLE_FACTORY_MODE
cancel_delayed_work(&info->factory_mode_work);
+#endif
cancel_delayed_work(&info->jeita_work);
cancel_delayed_work(&info->charge_complete_ready);
flush_workqueue(info->monitor_wqueue);
flush_workqueue(info->workqueue);
flush_workqueue(info->usb_workqueue);
+#ifdef ENABLE_FACTORY_MODE
flush_workqueue(info->factory_mode_wqueue);
-
+#endif
destroy_workqueue(info->monitor_wqueue);
destroy_workqueue(info->workqueue);
destroy_workqueue(info->usb_workqueue);
+#ifdef ENABLE_FACTORY_MODE
destroy_workqueue(info->factory_mode_wqueue);
+#endif
power_supply_unregister(&info->battery);
- kfree(info);
platform_set_drvdata(pdev, NULL);
return 0;
}
#ifdef CONFIG_PM
+struct timeval ts_suspend;
static int ricoh619_battery_suspend(struct device *dev)
{
struct ricoh619_battery_info *info = dev_get_drvdata(dev);
int cc_cap = 0;
bool is_charging = true;
int displayed_soc_temp;
+ do_gettimeofday(&ts_suspend);
if (g_fg_on_mode
&& (info->soca->status == RICOH619_SOCA_STABLE)) {
#ifdef ENABLE_LOW_BATTERY_DETECTION
cancel_delayed_work(&info->low_battery_work);
#endif
- cancel_delayed_work(&info->charge_complete_ready);
+/* cancel_delayed_work(&info->charge_complete_ready);*/
+#ifdef ENABLE_FACTORY_MODE
cancel_delayed_work(&info->factory_mode_work);
+#endif
cancel_delayed_work(&info->jeita_work);
#ifdef RICOH619_VADP_DROP_WORK
cancel_delayed_work(&info->vadp_drop_work);
#endif
- info->chg_complete_rd_cnt = 0;
- info->chg_complete_rd_flag = 0;
+/* info->chg_complete_rd_cnt = 0;*/
+/* info->chg_complete_rd_flag = 0;*/
if(info->capacity == 100)
{
bool is_charging = true;
bool is_jeita_updated;
int i;
+ int err;
+ struct rtc_time tm;
+ struct timespec tv = {
+ .tv_nsec = NSEC_PER_SEC >> 1,
+ };
+ struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
+
+ err = rtc_read_time(rtc, &tm);
+ if (err) {
+ dev_err(rtc->dev.parent,
+ "hctosys: unable to read the hardware clock\n");
+ }
+
+ err = rtc_valid_tm(&tm);
+ if (err) {
+ dev_err(rtc->dev.parent,
+ "hctosys: invalid date/time\n");
+ }
+
+ rtc_tm_to_time(&tm, &tv.tv_sec);
+
+ /*printk("suspend time: %d sec\n", ts_suspend.tv_sec);*/
+ /*printk("resume time: %d sec\n", tv.tv_sec);*/
+
+ if(info->chg_complete_rd_flag == 2){
+ printk("chg_complete_rd_cnt suspend: %d\n", info->chg_complete_rd_cnt);
+ info->chg_complete_rd_cnt += (tv.tv_sec - ts_suspend.tv_sec);
+ printk("chg_complete_rd_cnt resume: %d\n", info->chg_complete_rd_cnt);
+ flush_work(&info->charge_complete_ready.work);
+ }
RICOH_FG_DBG(KERN_INFO "PMU: %s: \n", __func__);
info->soca->displayed_soc = -EINVAL;
} else if (RICOH619_SOCA_ZERO == info->soca->status) {
if (calc_ocv(info) > get_OCV_voltage(info, 0)) {
+ RICOH_FG_DBG(KERN_INFO "PMU: %s: RICOH619_SOCA_ZERO if ()...\n", __func__);
ret = ricoh619_read(info->dev->parent, PSWR_REG, &val);
val &= 0x7f;
info->soca->soc = val * 100;
dev_err(info->dev, "Error in writing the control register\n");
info->soca->status = RICOH619_SOCA_FG_RESET;
- } else
- info->soca->displayed_soc = 0;
+ } else {
+ RICOH_FG_DBG(KERN_INFO "PMU: %s: RICOH619_SOCA_ZERO else()...\n", __func__);
+ /*info->soca->displayed_soc = 0;*/
+ info->soca->displayed_soc = info->soca->suspend_soc;
+ }
} else {
info->soca->soc = info->soca->suspend_soc;