forked from len0rd/rockbox
Sansa Connect: Fix power off panic screen
Queue power off requests because power_off() can be called within tick context that must not acquire mutex. Change-Id: I6f1a8f81d15518876cd03556118fc9eb37b8175f
This commit is contained in:
parent
e11fa5f74e
commit
89d3ca77b6
2 changed files with 10 additions and 2 deletions
|
@ -110,6 +110,7 @@ static struct mutex avr_mtx;
|
||||||
/* AVR thread events */
|
/* AVR thread events */
|
||||||
#define INPUT_INTERRUPT 1
|
#define INPUT_INTERRUPT 1
|
||||||
#define MONOTIME_OFFSET_UPDATE 2
|
#define MONOTIME_OFFSET_UPDATE 2
|
||||||
|
#define POWER_OFF_REQUEST 3
|
||||||
static int btn = 0;
|
static int btn = 0;
|
||||||
static bool hold_switch;
|
static bool hold_switch;
|
||||||
static bool input_interrupt_pending;
|
static bool input_interrupt_pending;
|
||||||
|
@ -584,7 +585,10 @@ static void avr_hid_sys_ctrl(uint8_t parameter)
|
||||||
|
|
||||||
void avr_hid_power_off(void)
|
void avr_hid_power_off(void)
|
||||||
{
|
{
|
||||||
avr_hid_sys_ctrl(SYS_CTRL_POWEROFF);
|
/* Do not execute command directly here because we can get called inside
|
||||||
|
* tick task context that must not acquire mutex.
|
||||||
|
*/
|
||||||
|
queue_post(&avr_queue, POWER_OFF_REQUEST, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool avr_state_changed(void)
|
static bool avr_state_changed(void)
|
||||||
|
@ -747,6 +751,11 @@ void avr_thread(void)
|
||||||
{
|
{
|
||||||
monotime_offset_update_pending = true;
|
monotime_offset_update_pending = true;
|
||||||
}
|
}
|
||||||
|
else if (ev.id == POWER_OFF_REQUEST)
|
||||||
|
{
|
||||||
|
avr_hid_reset_codec();
|
||||||
|
avr_hid_sys_ctrl(SYS_CTRL_POWEROFF);
|
||||||
|
}
|
||||||
|
|
||||||
input_interrupt_pending = false;
|
input_interrupt_pending = false;
|
||||||
if (avr_state_changed())
|
if (avr_state_changed())
|
||||||
|
|
|
@ -70,7 +70,6 @@ void power_off(void)
|
||||||
/* Disable GIO0 and GIO2 interrupts */
|
/* Disable GIO0 and GIO2 interrupts */
|
||||||
IO_INTC_EINT1 &= ~(INTR_EINT1_EXT2 | INTR_EINT1_EXT0);
|
IO_INTC_EINT1 &= ~(INTR_EINT1_EXT2 | INTR_EINT1_EXT0);
|
||||||
|
|
||||||
avr_hid_reset_codec();
|
|
||||||
avr_hid_power_off();
|
avr_hid_power_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue