diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0254-Fix-for-Pisound-s-MIDI-Input-getting-blocked-for-a-w.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.14/950-0254-Fix-for-Pisound-s-MIDI-Input-getting-blocked-for-a-w.patch | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0254-Fix-for-Pisound-s-MIDI-Input-getting-blocked-for-a-w.patch b/target/linux/brcm2708/patches-4.14/950-0254-Fix-for-Pisound-s-MIDI-Input-getting-blocked-for-a-w.patch new file mode 100644 index 0000000000..9d77f45a93 --- /dev/null +++ b/target/linux/brcm2708/patches-4.14/950-0254-Fix-for-Pisound-s-MIDI-Input-getting-blocked-for-a-w.patch @@ -0,0 +1,50 @@ +From a845f23bddcb2b0e48e8158bb06b0990c4760e7e Mon Sep 17 00:00:00 2001 +From: Giedrius <giedrius@blokas.io> +Date: Fri, 16 Mar 2018 18:14:31 +0200 +Subject: [PATCH 254/454] Fix for Pisound's MIDI Input getting blocked for a + while in rare cases. + +There was a possible race condition which could lead to Input's FIFO queue +to be underflown, causing high amount of processing in the worker thread for +some period of time. + +Signed-off-by: Giedrius Trainavicius <giedrius@blokas.io> +--- + sound/soc/bcm/pisound.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +--- a/sound/soc/bcm/pisound.c ++++ b/sound/soc/bcm/pisound.c +@@ -56,6 +56,12 @@ static const char *pisnd_spi_get_version + static int pisnd_midi_init(struct snd_card *card); + static void pisnd_midi_uninit(void); + ++enum task_e { ++ TASK_PROCESS = 0, ++}; ++ ++static void pisnd_schedule_process(enum task_e task); ++ + #define PISOUND_LOG_PREFIX "pisound: " + + #ifdef PISOUND_DEBUG +@@ -129,7 +135,7 @@ static void pisnd_input_trigger(struct s + { + if (up) { + pisnd_spi_set_callback(pisnd_midi_recv_callback, substream); +- pisnd_midi_recv_callback(substream); ++ pisnd_schedule_process(TASK_PROCESS); + } else { + pisnd_spi_set_callback(NULL, NULL); + } +@@ -258,10 +264,6 @@ static bool pisnd_spi_has_more(void) + return gpiod_get_value(data_available); + } + +-enum task_e { +- TASK_PROCESS = 0, +-}; +- + static void pisnd_schedule_process(enum task_e task) + { + if (pisnd_spi_device != NULL && |