From 89d3ca77b6ffd0ad499d91e8c66100f6d852e358 Mon Sep 17 00:00:00 2001 From: Tomasz Moń Date: Sun, 4 Jul 2021 13:08:42 +0200 Subject: 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 --- .../target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c | 11 ++++++++++- .../target/arm/tms320dm320/sansa-connect/power-sansaconnect.c | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'firmware') diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c index a4efe0962a..a8e0d5eb5e 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c @@ -110,6 +110,7 @@ static struct mutex avr_mtx; /* AVR thread events */ #define INPUT_INTERRUPT 1 #define MONOTIME_OFFSET_UPDATE 2 +#define POWER_OFF_REQUEST 3 static int btn = 0; static bool hold_switch; static bool input_interrupt_pending; @@ -584,7 +585,10 @@ static void avr_hid_sys_ctrl(uint8_t parameter) 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) @@ -747,6 +751,11 @@ void avr_thread(void) { 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; if (avr_state_changed()) diff --git a/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c index b139572605..ccd91c6d2f 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c @@ -70,7 +70,6 @@ void power_off(void) /* Disable GIO0 and GIO2 interrupts */ IO_INTC_EINT1 &= ~(INTR_EINT1_EXT2 | INTR_EINT1_EXT0); - avr_hid_reset_codec(); avr_hid_power_off(); } -- cgit v1.2.3