#include <linux/power/rt5025-power.h>
#include <linux/delay.h>
+static struct platform_device *dev_ptr;
+
static enum power_supply_property rt5025_adap_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};
-#if 0
-static int rt5025_set_charging_current_switch (struct i2c_client *i2c, int onoff)
+int rt5025_set_charging_current_switch (struct i2c_client *i2c, int onoff)
{
int ret;
if (onoff)
ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL7, RT5025_CHGCEN_MASK);
return ret;
}
+EXPORT_SYMBOL(rt5025_set_charging_current_switch);
-static int rt5025_set_charging_buck(struct i2c_client *i2c, int onoff)
+int rt5025_set_charging_buck(struct i2c_client *i2c, int onoff)
{
int ret;
if (onoff)
ret = rt5025_clr_bits(i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
return ret;
}
-#endif
+EXPORT_SYMBOL(rt5025_set_charging_buck);
+
+int rt5025_ext_set_charging_buck(int onoff)
+{
+ struct rt5025_power_info *pi = platform_get_drvdata(dev_ptr);
+ int ret;
+ if (onoff)
+ {
+ pi->otg_en = 0;
+ ret = rt5025_set_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
+ msleep(100);
+ }
+ else
+ {
+ pi->otg_en = 1;
+ ret = rt5025_clr_bits(pi->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
+ msleep(100);
+ }
+ return ret;
+}
+EXPORT_SYMBOL(rt5025_ext_set_charging_buck);
+
+int rt5025_charger_reset_and_reinit(struct rt5025_power_info *pi)
+{
+ struct rt5025_platform_data *pdata = pi->dev->parent->platform_data;
+ int ret;
+
+ RTINFO("\n");
+
+ //do charger reset
+ ret = rt5025_reg_read(pi->i2c, RT5025_REG_CHGCTL4);
+ if (ret < 0)
+ return ret;
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL4, ret|RT5025_CHGRST_MASK);
+ mdelay(200);
+
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL2, pdata->power_data->CHGControl2.val);
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL3, pdata->power_data->CHGControl3.val);
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL4, pdata->power_data->CHGControl4.val);
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL5, pdata->power_data->CHGControl5.val);
+ rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL6, pdata->power_data->CHGControl6.val);
+ //rt5025_reg_write(pi->i2c, RT5025_REG_CHGCTL7, pd->CHGControl7.val);
+ rt5025_assign_bits(pi->i2c, RT5025_REG_CHGCTL7, 0xEF, pdata->power_data->CHGControl7.val);
+ rt5025_reg_write(pi->i2c, 0xA9, 0x60 );
+ return 0;
+}
+EXPORT_SYMBOL(rt5025_charger_reset_and_reinit);
static int rt5025_set_charging_current(struct i2c_client *i2c, int cur_value)
{
#if 1
if (info->chip->battery_info)
{
- if (info->chg_term == 0)
+ if (info->chg_term <= 1)
rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
- else if (info->chg_term > 0)
+ else if (info->chg_term == 2)
{
rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
- info->chg_term = 0;
+ //info->chg_term = 0;
}
-
+ else if (info->chg_term > 2)
+ ;
}
#else
if (info->event_callback)
#if 1
if (info->chip->battery_info)
{
- if (info->chg_term == 0)
+ if (info->chg_term <= 1)
rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_CHARGING);
- else if (info->chg_term > 1)
+ else if (info->chg_term == 2)
{
rt5025_gauge_set_status(info->chip->battery_info, POWER_SUPPLY_STATUS_FULL);
- info->chg_term = 0;
+ //info->chg_term = 0;
}
+ else if (info->chg_term > 2)
+ ;
}
#else
if (info->event_callback)
old_usbval = info->usb_online;
old_chgval = info->chg_stat;
- mdelay(10);
+ mdelay(50);
ret = rt5025_reg_read(info->i2c, RT5025_REG_CHGSTAT);
if (ret<0)
return ret;
}
chgstatval = ret;
+ RTINFO("chgstat = 0x%02x\n", chgstatval);
+
+ if (info->otg_en)
+ {
+ ret = rt5025_set_bits(info->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
+ msleep(100);
+ }
new_acval = (chgstatval&RT5025_CHG_ACONLINE)>>RT5025_CHG_ACSHIFT;
if (old_acval != new_acval)
info->ac_online = new_acval;
power_supply_changed(&info->ac);
}
- new_usbval = (chgstatval&RT5025_CHG_USBONLINE)>>RT5025_CHG_USBSHIFT;
+
+ new_usbval = (info->otg_en? \
+ 0:(chgstatval&RT5025_CHG_USBONLINE)>>RT5025_CHG_USBSHIFT);
if (old_usbval != new_usbval)
{
info->usb_online = new_usbval;
power_supply_changed(&info->usb);
}
- if (old_acval != new_acval || old_usbval != new_usbval)
+ if (info->otg_en && new_acval == 0)
+ {
+ ret = rt5025_clr_bits(info->i2c, RT5025_REG_CHGCTL2, RT5025_CHGBUCKEN_MASK);
+ msleep(100);
+ }
+
+ //if (old_acval != new_acval || old_usbval != new_usbval)
+ if (new_acval || new_usbval)
+ {
+ info->usb_cnt = 0;
schedule_delayed_work(&info->usb_detect_work, 0); //no delay
+ }
new_chgval = (chgstatval&RT5025_CHGSTAT_MASK)>>RT5025_CHGSTAT_SHIFT;
mutex_lock(&pi->var_lock);
if (pi->ac_online)
{
- rt5025_set_charging_current(pi->i2c, 1000);
+ rt5025_set_charging_current(pi->i2c, 2000);
rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_AC_ADAPTER);
pi->usb_cnt = 0;
}
switch(dwc_vbus_status())
{
case 2: // USB Wall charger
- rt5025_set_charging_current(pi->i2c, 1000);
+ rt5025_set_charging_current(pi->i2c, 2000);
rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_USB_TA);
RTINFO("rt5025: detect usb wall charger\n");
break;
case 1: //normal USB
default:
- rt5025_set_charging_current(pi->i2c, 500);
+ rt5025_set_charging_current(pi->i2c, 2000);
rt5025_notify_charging_cable(pi->chip->jeita_info, JEITA_NORMAL_USB);
RTINFO("rt5025: detect normal usb\n");
break;
#endif
platform_set_drvdata(pdev, pi);
+ dev_ptr = pdev;
pi->ac.name = "rt5025-dc";
pi->ac.type = POWER_SUPPLY_TYPE_MAINS;
rt5025_init_charger(pi, pdata->power_data);
chip->power_info = pi;
+ pr_info("rt5025-power driver is successfully loaded\n");
+
return ret;
out_usb:
power_supply_unregister(&pi->ac);
power_supply_unregister(&pi->ac);
chip->power_info = NULL;
kfree(pi);
+ RTINFO("\n");
return 0;
}