diff options
Diffstat (limited to 'firmware/target/arm/imx31/gigabeat-s/power-imx31.c')
-rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/power-imx31.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/power-imx31.c b/firmware/target/arm/imx31/gigabeat-s/power-imx31.c index 17008cec4b..39724c7b75 100644 --- a/firmware/target/arm/imx31/gigabeat-s/power-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/power-imx31.c | |||
@@ -20,6 +20,8 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include "config.h" | 21 | #include "config.h" |
22 | #include "system.h" | 22 | #include "system.h" |
23 | #include "usb.h" | ||
24 | #include "usb_core.h" | ||
23 | #include "power.h" | 25 | #include "power.h" |
24 | #include "power-imx31.h" | 26 | #include "power-imx31.h" |
25 | #include "backlight.h" | 27 | #include "backlight.h" |
@@ -29,35 +31,47 @@ | |||
29 | #include "i2c-imx31.h" | 31 | #include "i2c-imx31.h" |
30 | 32 | ||
31 | extern struct i2c_node si4700_i2c_node; | 33 | extern struct i2c_node si4700_i2c_node; |
34 | static unsigned int power_status = POWER_INPUT_NONE; | ||
32 | 35 | ||
33 | static bool charger_detect = false; | 36 | /* Detect which power sources are present. */ |
34 | |||
35 | /* This is called from the mc13783 interrupt thread */ | ||
36 | void charger_detect_event(void) | ||
37 | { | ||
38 | charger_detect = | ||
39 | mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_CHGDETS; | ||
40 | } | ||
41 | |||
42 | unsigned int power_input_status(void) | 37 | unsigned int power_input_status(void) |
43 | { | 38 | { |
44 | unsigned int status = POWER_INPUT_NONE; | 39 | unsigned int status = power_status; |
45 | 40 | ||
46 | if ((GPIO3_DR & (1 << 20)) != 0) | 41 | if (GPIO3_DR & (1 << 20)) |
47 | status |= POWER_INPUT_BATTERY; | 42 | status |= POWER_INPUT_BATTERY; |
48 | 43 | ||
49 | if (charger_detect) | 44 | if (usb_allowed_current() < 500) |
50 | status |= POWER_INPUT_MAIN_CHARGER; | 45 | { |
46 | /* ACK that USB is connected but NOT chargeable */ | ||
47 | status &= ~(POWER_INPUT_USB_CHARGER & POWER_INPUT_CHARGER); | ||
48 | } | ||
51 | 49 | ||
52 | return status; | 50 | return status; |
53 | } | 51 | } |
54 | 52 | ||
55 | /* Returns true if the unit is charging the batteries. */ | 53 | /* Detect changes in presence of the AC adaptor. */ |
56 | bool charging_state(void) | 54 | void charger_main_detect_event(void) |
57 | { | 55 | { |
58 | return false; | 56 | if (mc13783_read(MC13783_INTERRUPT_SENSE0) & MC13783_SE1S) |
57 | power_status |= POWER_INPUT_MAIN_CHARGER; | ||
58 | else | ||
59 | power_status &= ~POWER_INPUT_MAIN_CHARGER; | ||
59 | } | 60 | } |
60 | 61 | ||
62 | /* Detect changes in USB bus power. Called from usb connect event handler. */ | ||
63 | void charger_usb_detect_event(int status) | ||
64 | { | ||
65 | /* USB plugged does not imply charging is possible or even | ||
66 | * powering the device to maintain the battery. */ | ||
67 | if (status == USB_INSERTED) | ||
68 | power_status |= POWER_INPUT_USB_CHARGER; | ||
69 | else | ||
70 | power_status &= ~POWER_INPUT_USB_CHARGER; | ||
71 | } | ||
72 | |||
73 | /* charging_state is implemented in powermgmt-imx31.c */ | ||
74 | |||
61 | void ide_power_enable(bool on) | 75 | void ide_power_enable(bool on) |
62 | { | 76 | { |
63 | if (!on) | 77 | if (!on) |
@@ -129,9 +143,8 @@ void power_off(void) | |||
129 | void power_init(void) | 143 | void power_init(void) |
130 | { | 144 | { |
131 | /* Poll initial state */ | 145 | /* Poll initial state */ |
132 | charger_detect_event(); | 146 | charger_main_detect_event(); |
133 | 147 | ||
134 | /* Enable detect event */ | 148 | /* Enable detect event */ |
135 | mc13783_enable_event(MC13783_CHGDET_EVENT); | 149 | mc13783_enable_event(MC13783_SE1_EVENT); |
136 | } | 150 | } |
137 | |||