From 74c3ebec1ec9b2c94209dbdd95999f8deb3abfb2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=BC=A0=E6=99=B4?= Date: Wed, 23 Oct 2013 10:51:17 +0800 Subject: [PATCH] rk31:pmu:rt5025:support AC & usb charger --- arch/arm/mach-rk30/board-pmu-rt5025.c | 4 ++-- drivers/mfd/rt5025-irq.c | 2 +- drivers/power/rt5025-power.c | 22 ++++++++++++++++++---- drivers/power/rt5025-swjeita.c | 6 +++--- include/linux/mfd/rt5025.h | 2 +- include/linux/power/rt5025-power.h | 7 +++++++ 6 files changed, 32 insertions(+), 11 deletions(-) mode change 100755 => 100644 drivers/power/rt5025-power.c diff --git a/arch/arm/mach-rk30/board-pmu-rt5025.c b/arch/arm/mach-rk30/board-pmu-rt5025.c index 852e326a0785..e6aee327ff7a 100644 --- a/arch/arm/mach-rk30/board-pmu-rt5025.c +++ b/arch/arm/mach-rk30/board-pmu-rt5025.c @@ -424,8 +424,8 @@ static u8 jeita_scalar[8] = { 0x30, 0x2B, 0x25, 0x20, 0x15, 0x10, 0x10, 0x0D }; //cc unit: xxx mA static int jeita_temp_cc[][5] = {{ 500, 500, 500, 500, 500}, // not plugin { 0 , 500, 500, 500, 0}, // normal USB - { 0, 500, 1000, 500, 0}, // USB charger - { 0, 500, 1000, 500, 0}}; // AC Adapter + { 0, 1000, 2000, 1000, 0}, // USB charger + { 0, 1000, 2000, 1000, 0}}; // AC Adapter //cv unit: xxx mV static int jeita_temp_cv[][5] = {{ 4200, 4200, 4200, 4200, 4200}, // not plugin { 4200, 4200, 4200, 4200, 4200}, // normal USB diff --git a/drivers/mfd/rt5025-irq.c b/drivers/mfd/rt5025-irq.c index 8bf1bea23b37..84619d7bca15 100644 --- a/drivers/mfd/rt5025-irq.c +++ b/drivers/mfd/rt5025-irq.c @@ -95,7 +95,7 @@ static void rt5025_work_func(struct work_struct *work) chg_event = irq_stat[0]<<16 | irq_stat[1]<<8 | irq_stat[2]; pwr_event = irq_stat[3]<<8 | irq_stat[4]; #ifdef CONFIG_POWER_RT5025 - if ((chg_event & CHARGER_DETECT_MASK) && ii->chip->power_info->otg_en == 0) + if ((chg_event & CHARGER_DETECT_MASK)) { if (chg_event & CHG_EVENT_CHTERMI) { diff --git a/drivers/power/rt5025-power.c b/drivers/power/rt5025-power.c old mode 100755 new mode 100644 index 565912ff5030..85d089e9dcdb --- a/drivers/power/rt5025-power.c +++ b/drivers/power/rt5025-power.c @@ -226,19 +226,33 @@ int rt5025_power_charge_detect(struct rt5025_power_info *info) 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 (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) schedule_delayed_work(&info->usb_detect_work, 0); //no delay @@ -308,7 +322,7 @@ static void usb_detect_work_func(struct work_struct *work) 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; } @@ -318,13 +332,13 @@ static void usb_detect_work_func(struct work_struct *work) 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; diff --git a/drivers/power/rt5025-swjeita.c b/drivers/power/rt5025-swjeita.c index 56179d2be936..965fe64fc42e 100644 --- a/drivers/power/rt5025-swjeita.c +++ b/drivers/power/rt5025-swjeita.c @@ -349,7 +349,7 @@ static void thermal_reg_work_func(struct work_struct *work) swji->dec_current = 300; break; case 2: - swji->dec_current = 1000; + swji->dec_current = 800; break; } swji->cur_therm_region = therm_region; @@ -430,10 +430,10 @@ static int __devexit rt5025_swjeita_remove(struct platform_device *pdev) static int rt5025_swjeita_suspend(struct platform_device *pdev, pm_message_t state) { struct rt5025_swjeita_info *swji = platform_get_drvdata(pdev); - swji->cur_therm_region = swji->dec_current = 0; - rt5025_notify_charging_cable(swji, swji->cur_cable); swji->suspend = 1; cancel_delayed_work_sync(&swji->thermal_reg_work); + swji->cur_therm_region = swji->dec_current = 0; + rt5025_notify_charging_cable(swji, swji->cur_cable); RTINFO("\n"); return 0; } diff --git a/include/linux/mfd/rt5025.h b/include/linux/mfd/rt5025.h index a7a8fe7c15f4..267766deeeff 100644 --- a/include/linux/mfd/rt5025.h +++ b/include/linux/mfd/rt5025.h @@ -17,7 +17,7 @@ #include #define RT5025_DEVICE_NAME "RT5025" -#define RT5025_DRV_VER "1.0.4_R" +#define RT5025_DRV_VER "1.0.5_R" enum { RT5025_RSTDELAY1_100MS, diff --git a/include/linux/power/rt5025-power.h b/include/linux/power/rt5025-power.h index 50bdde02cabf..c625999c9986 100755 --- a/include/linux/power/rt5025-power.h +++ b/include/linux/power/rt5025-power.h @@ -31,9 +31,16 @@ #define RT5025_CHGSTAT_SHIFT 4 #define RT5025_CHGSTAT_UNKNOWN 0x04 +#ifdef CONFIG_RT5025_SUPPORT_ACUSB_DUALIN +#define RT5025_CHG_ACONLINE 0x02 +#define RT5025_CHG_ACSHIFT 1 +#define RT5025_CHG_USBONLINE 0x01 +#define RT5025_CHG_USBSHIFT 0 +#else #define RT5025_CHG_ACONLINE 0x01 #define RT5025_CHG_ACSHIFT 0 #define RT5025_CHG_USBONLINE 0x02 #define RT5025_CHG_USBSHIFT 1 +#endif /* CONFIG_RT5025_SUPPORT_ACUSB_DUALIN */ #endif /* #ifndef __LINUX_RT5025_POWER_H */ -- 2.34.1