summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Moń <desowin@gmail.com>2021-07-04 13:08:42 +0200
committerTomasz Moń <desowin@gmail.com>2021-07-04 13:08:42 +0200
commit89d3ca77b6ffd0ad499d91e8c66100f6d852e358 (patch)
treedb11bdda5c1020c77b8cc2ac64ab1f0e53b1c377
parente11fa5f74eb49b10ebefbe8882bb50186dffb2a4 (diff)
downloadrockbox-89d3ca77b6ffd0ad499d91e8c66100f6d852e358.tar.gz
rockbox-89d3ca77b6ffd0ad499d91e8c66100f6d852e358.zip
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
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c11
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/power-sansaconnect.c1
2 files changed, 10 insertions, 2 deletions
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;
110/* AVR thread events */ 110/* AVR thread events */
111#define INPUT_INTERRUPT 1 111#define INPUT_INTERRUPT 1
112#define MONOTIME_OFFSET_UPDATE 2 112#define MONOTIME_OFFSET_UPDATE 2
113#define POWER_OFF_REQUEST 3
113static int btn = 0; 114static int btn = 0;
114static bool hold_switch; 115static bool hold_switch;
115static bool input_interrupt_pending; 116static bool input_interrupt_pending;
@@ -584,7 +585,10 @@ static void avr_hid_sys_ctrl(uint8_t parameter)
584 585
585void avr_hid_power_off(void) 586void avr_hid_power_off(void)
586{ 587{
587 avr_hid_sys_ctrl(SYS_CTRL_POWEROFF); 588 /* Do not execute command directly here because we can get called inside
589 * tick task context that must not acquire mutex.
590 */
591 queue_post(&avr_queue, POWER_OFF_REQUEST, 0);
588} 592}
589 593
590static bool avr_state_changed(void) 594static bool avr_state_changed(void)
@@ -747,6 +751,11 @@ void avr_thread(void)
747 { 751 {
748 monotime_offset_update_pending = true; 752 monotime_offset_update_pending = true;
749 } 753 }
754 else if (ev.id == POWER_OFF_REQUEST)
755 {
756 avr_hid_reset_codec();
757 avr_hid_sys_ctrl(SYS_CTRL_POWEROFF);
758 }
750 759
751 input_interrupt_pending = false; 760 input_interrupt_pending = false;
752 if (avr_state_changed()) 761 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)
70 /* Disable GIO0 and GIO2 interrupts */ 70 /* Disable GIO0 and GIO2 interrupts */
71 IO_INTC_EINT1 &= ~(INTR_EINT1_EXT2 | INTR_EINT1_EXT0); 71 IO_INTC_EINT1 &= ~(INTR_EINT1_EXT2 | INTR_EINT1_EXT0);
72 72
73 avr_hid_reset_codec();
74 avr_hid_power_off(); 73 avr_hid_power_off();
75} 74}
76 75