diff --git a/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_defconfig b/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_defconfig index 159ed9cfca2..79386de2f3a 100644 --- a/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_defconfig +++ b/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_defconfig @@ -21,3 +21,5 @@ CONFIG_BUILD_OUTPUT_BIN=n CONFIG_CLEANUP_INTERMEDIATE_FILES=y CONFIG_MP_NUM_CPUS=4 + +CONFIG_DAI_SSP_HAS_POWER_CONTROL=y diff --git a/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_tgph_defconfig b/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_tgph_defconfig index a145074b625..da64bfc722b 100644 --- a/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_tgph_defconfig +++ b/boards/xtensa/intel_adsp_cavs25/intel_adsp_cavs25_tgph_defconfig @@ -19,3 +19,5 @@ CONFIG_CAVS_ICTL=y CONFIG_BOOTLOADER_SRAM_SIZE=192 CONFIG_BUILD_OUTPUT_BIN=n CONFIG_CLEANUP_INTERMEDIATE_FILES=y + +CONFIG_DAI_SSP_HAS_POWER_CONTROL=y diff --git a/drivers/dai/intel/ssp/Kconfig.ssp b/drivers/dai/intel/ssp/Kconfig.ssp index f247c4b1668..4d9d4b22503 100644 --- a/drivers/dai/intel/ssp/Kconfig.ssp +++ b/drivers/dai/intel/ssp/Kconfig.ssp @@ -12,3 +12,7 @@ config DAI_INTEL_SSP help Enable Inter Sound (I2S) bus driver based on Synchronous Serial Port (SSP) module. + +config DAI_SSP_HAS_POWER_CONTROL + bool "DAI ssp pm_runtime en/dis ssp power" + depends on DAI_INTEL_SSP diff --git a/drivers/dai/intel/ssp/ssp.c b/drivers/dai/intel/ssp/ssp.c index 39d74e6f08b..a16181e1e7e 100644 --- a/drivers/dai/intel/ssp/ssp.c +++ b/drivers/dai/intel/ssp/ssp.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -706,7 +707,7 @@ static inline void dai_ssp_pm_runtime_en_ssp_clk_gating(struct dai_intel_ssp *dp static void dai_ssp_pm_runtime_en_ssp_power(struct dai_intel_ssp *dp, uint32_t index) { -#if CONFIG_SOC_SERIES_INTEL_CAVS_V25 +#if CONFIG_DAI_SSP_HAS_POWER_CONTROL int ret; LOG_INF("%s en_ssp_power index %d", __func__, index); @@ -724,12 +725,15 @@ static void dai_ssp_pm_runtime_en_ssp_power(struct dai_intel_ssp *dp, uint32_t i } LOG_INF("%s I2SLCTL", __func__); -#endif +#else + ARG_UNUSED(dp); + ARG_UNUSED(index); +#endif /* CONFIG_DAI_SSP_HAS_POWER_CONTROL */ } static void dai_ssp_pm_runtime_dis_ssp_power(struct dai_intel_ssp *dp, uint32_t index) { -#if CONFIG_SOC_SERIES_INTEL_CAVS_V25 +#if CONFIG_DAI_SSP_HAS_POWER_CONTROL int ret; LOG_INF("%s index %d", __func__, index); @@ -747,7 +751,10 @@ static void dai_ssp_pm_runtime_dis_ssp_power(struct dai_intel_ssp *dp, uint32_t } LOG_INF("%s I2SLCTL", __func__); -#endif +#else + ARG_UNUSED(dp); + ARG_UNUSED(index); +#endif /* CONFIG_DAI_SSP_HAS_POWER_CONTROL */ } /* empty SSP transmit FIFO */ @@ -1538,7 +1545,11 @@ static int dai_ssp_set_config_blob(struct dai_intel_ssp *dp, const void *spec_co ssrsa = blob->i2s_driver_config.i2s_config.ssrsa; sys_write32(ssc0, dai_base(dp) + SSCR0); + sys_write32(blob->i2s_driver_config.i2s_config.ssc2 & ~SSCR2_SFRMEN, + dai_base(dp) + SSCR2); /* hardware specific flow */ sys_write32(blob->i2s_driver_config.i2s_config.ssc1, dai_base(dp) + SSCR1); + sys_write32(blob->i2s_driver_config.i2s_config.ssc2 | SSCR2_SFRMEN, + dai_base(dp) + SSCR2); /* hardware specific flow */ sys_write32(blob->i2s_driver_config.i2s_config.ssc2, dai_base(dp) + SSCR2); sys_write32(blob->i2s_driver_config.i2s_config.ssc3, dai_base(dp) + SSCR3); sys_write32(blob->i2s_driver_config.i2s_config.sspsp, dai_base(dp) + SSPSP); @@ -1748,7 +1759,10 @@ static void dai_ssp_stop(struct dai_intel_ssp *dp, int direction) /* disable SSP port if no users */ if (ssp->state[DAI_DIR_CAPTURE] == DAI_STATE_PRE_RUNNING && ssp->state[DAI_DIR_PLAYBACK] == DAI_STATE_PRE_RUNNING) { - if (!(ssp->clk_active & SSP_CLK_BCLK_ES_REQ)) { + bool clear_rse_bits = COND_CODE_1(CONFIG_INTEL_ADSP_CAVS, + (!(ssp->clk_active & SSP_CLK_BCLK_ES_REQ)), + (false)); + if (clear_rse_bits) { /* clear TRSE/RSRE before SSE */ dai_ssp_update_bits(dp, SSCR1, SSCR1_TSRE | SSCR1_RSRE, 0); dai_ssp_update_bits(dp, SSCR0, SSCR0_SSE, 0); diff --git a/drivers/dai/intel/ssp/ssp.h b/drivers/dai/intel/ssp/ssp.h index d5915ce0481..4b76e8467b8 100644 --- a/drivers/dai/intel/ssp/ssp.h +++ b/drivers/dai/intel/ssp/ssp.h @@ -130,6 +130,8 @@ #define SSCR2_LJDFD BIT(17) #define SSCR2_MMRATF BIT(18) #define SSCR2_SMTATF BIT(19) +#define SSCR2_SFRMEN BIT(20) +#define SSCR2_ACIOLBS BIT(21) /* SSR bits */ #define SSSR_TNF BIT(2)