From b2c470719a79f301ff4e9a6adcc5307ef47cfacf Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Fri, 13 Oct 2017 06:28:50 +0200 Subject: imx233: Implement mutex for cpu_boost_lock/unlock Playing AAC-HE files resulted in a race condition between audio/codec/buffering for set_cpu_frequency Change-Id: I35e1c1fd18db623e2990c305acdca03f57184d0d --- firmware/target/arm/imx233/system-imx233.c | 17 +++++++++++++++++ firmware/target/arm/imx233/system-target.h | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'firmware') diff --git a/firmware/target/arm/imx233/system-imx233.c b/firmware/target/arm/imx233/system-imx233.c index 4e1583d568..3ac5d0e557 100644 --- a/firmware/target/arm/imx233/system-imx233.c +++ b/firmware/target/arm/imx233/system-imx233.c @@ -53,6 +53,8 @@ #define WATCHDOG_HW_DELAY (10 * HZ) #define WATCHDOG_SW_DELAY (5 * HZ) +static struct mutex cpufreq_mtx; + void UIE(unsigned int pc, unsigned int num); static void woof_woof(void) @@ -183,6 +185,7 @@ void system_init(void) * The main() will naturally set cpu speed to normal after kernel_init() * so don't bother if the cpu is running at 24MHz here. * Make sure IO clock is running at expected speed */ + mutex_init(&cpufreq_mtx); imx233_clkctrl_init(); imx233_clkctrl_enable(CLK_PLL, true); #if IMX233_SUBTARGET >= 3700 @@ -364,6 +367,20 @@ void imx233_set_cpu_frequency(long frequency) } #ifdef HAVE_ADJUSTABLE_CPU_FREQ +bool set_cpu_frequency__lock(void) +{ + if (get_processor_mode() != CPU_MODE_THREAD_CONTEXT) + return false; + + mutex_lock(&cpufreq_mtx); + return true; +} + +void set_cpu_frequency__unlock(void) +{ + mutex_unlock(&cpufreq_mtx); +} + void set_cpu_frequency(long frequency) { return imx233_set_cpu_frequency(frequency); diff --git a/firmware/target/arm/imx233/system-target.h b/firmware/target/arm/imx233/system-target.h index ee2df9a3e9..45dc58698a 100644 --- a/firmware/target/arm/imx233/system-target.h +++ b/firmware/target/arm/imx233/system-target.h @@ -54,6 +54,23 @@ bool imx233_us_elapsed(uint32_t ref, unsigned us_delay); void imx233_reset_block(volatile uint32_t *block_reg); void imx233_enable_usb_controller(bool enable); void imx233_enable_usb_phy(bool enable); + +#ifdef HAVE_ADJUSTABLE_CPU_FREQ +#define CPU_BOOST_LOCK_DEFINED + +static inline bool cpu_boost_lock(void) +{ + bool set_cpu_frequency__lock(void); + return set_cpu_frequency__lock(); +} + +static inline void cpu_boost_unlock(void) +{ + void set_cpu_frequency__unlock(void); + set_cpu_frequency__unlock(); +} +#endif /* HAVE_ADJUSTABLE_CPU_FREQ */ + // NOTE: this is available even if HAVE_ADJUSTABLE_CPU_FREQ is undef void imx233_set_cpu_frequency(long frequency); -- cgit v1.2.3