#include <linux/delay.h>
#include <linux/power_supply.h>
#include <linux/workqueue.h>
+#include <linux/reboot.h>
#include <asm/unaligned.h>
#include <mach/gpio.h>
#include <mach/iomux.h>
#define PWR_ON_THRESHD 5 //power on threshd of capacity
//unsigned int pre_cnt = 0; //for long press counter
//int charge_disp_mode = 0;
-int pwr_on_thrsd = 5; //power on capcity threshold
+static int pwr_on_thrsd = 5; //power on capcity threshold
-//extern int board_boot_mode(void);
//extern int boot_mode_init(char * s);
-extern void kernel_power_off(void);
-
static int __init pwr_on_thrsd_setup(char *str)
{
__setup("pwr_on_thrsd=", pwr_on_thrsd_setup);
+static int usb_status;
+static int ac_status;
+static int __rk_get_system_battery_status(struct device *dev, void *data)
+{
+ union power_supply_propval val_status = {POWER_SUPPLY_STATUS_DISCHARGING};
+ struct power_supply *psy = dev_get_drvdata(dev);
+
+ psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val_status);
+
+ if (val_status.intval != 0) {
+ if (psy->type == POWER_SUPPLY_TYPE_USB)
+ usb_status = POWER_SUPPLY_TYPE_USB;
+ if (psy->type == POWER_SUPPLY_TYPE_MAINS)
+ ac_status = POWER_SUPPLY_TYPE_MAINS;
+ }
+
+ return 0;
+}
+
+// POWER_SUPPLY_TYPE_BATTERY --- discharge
+// POWER_SUPPLY_TYPE_USB --- usb_charging
+// POWER_SUPPLY_TYPE_MAINS --- AC_charging
+int rk_get_system_battery_status(void)
+{
+ class_for_each_device(power_supply_class, NULL, NULL, __rk_get_system_battery_status);
+
+ if (ac_status == POWER_SUPPLY_TYPE_MAINS) {
+ return POWER_SUPPLY_TYPE_MAINS;
+ } else if (usb_status == POWER_SUPPLY_TYPE_USB) {
+ return POWER_SUPPLY_TYPE_USB;
+ }
+
+ return POWER_SUPPLY_TYPE_BATTERY;
+}
+EXPORT_SYMBOL(rk_get_system_battery_status);
-LIST_HEAD(rk_psy_head); //add by yxj for charge logo display boot_command_line
+static union power_supply_propval battery_capacity = { 100 };
+static int __rk_get_system_battery_capacity(struct device *dev, void *data)
+{
+ struct power_supply *psy = dev_get_drvdata(dev);
+
+ psy->get_property(psy, POWER_SUPPLY_PROP_CAPACITY, &battery_capacity);
+
+ return 0;
+}
+
+int rk_get_system_battery_capacity(void)
+{
+ class_for_each_device(power_supply_class, NULL, NULL, __rk_get_system_battery_capacity);
+
+ return battery_capacity.intval;
+}
+EXPORT_SYMBOL(rk_get_system_battery_capacity);
+
+#ifdef CONFIG_POWER_ON_CHARGER_DISPLAY
//int charger_mode=0; //1:charge,0:not charge
static void add_bootmode_charger_to_cmdline(void)
{
{
union power_supply_propval val_status = {POWER_SUPPLY_STATUS_DISCHARGING};
union power_supply_propval val_capacity ={ 100} ;
- struct power_supply *psy;
- int online = 0;
printk("start_charge_logo_display\n");
}
- list_for_each_entry(psy, &rk_psy_head, rk_psy_node)
- {
- psy->get_property(psy,POWER_SUPPLY_PROP_ONLINE,&val_status);
-
- online += val_status.intval;
-
- psy->get_property(psy,POWER_SUPPLY_PROP_CAPACITY,&val_capacity);
- }
-
- if(online >= 1)
+ if (rk_get_system_battery_status() != POWER_SUPPLY_TYPE_BATTERY)
val_status.intval = POWER_SUPPLY_STATUS_CHARGING;
+ val_capacity.intval = rk_get_system_battery_capacity();
+
// low power and discharging
#if 0
if((val_capacity.intval < pwr_on_thrsd )&&(val_status.intval != POWER_SUPPLY_STATUS_CHARGING))
if(val_status.intval == POWER_SUPPLY_STATUS_CHARGING)
{
- if(board_boot_mode() != BOOT_MODE_REBOOT) //do not enter power on charge mode when soft reset
+ if ((board_boot_mode() != BOOT_MODE_REBOOT) || (val_capacity.intval <= pwr_on_thrsd)) //do not enter power on charge mode when soft reset
{
add_bootmode_charger_to_cmdline();
//boot_mode_init("charge");
}
//subsys_initcall_sync(start_charge_logo_display);
-late_initcall(start_charge_logo_display);
+module_init(start_charge_logo_display);
+#endif