From 18baa47a9db3a7f0b5eaf97d6af9ec7b178aab7b Mon Sep 17 00:00:00 2001 From: Marcin Rajwa Date: Tue, 6 Nov 2018 13:33:39 +0100 Subject: [PATCH] DMIC: Enable power for DMIC for ICL platform. Signed-off-by: Marcin Rajwa --- src/drivers/intel/cavs/dmic.c | 4 +++ src/include/sof/pm_runtime.h | 1 + .../cannonlake/include/platform/memory.h | 5 ++++ .../cannonlake/include/platform/shim.h | 3 +++ .../icelake/include/platform/memory.h | 5 ++++ src/platform/icelake/include/platform/shim.h | 3 +++ src/platform/intel/cavs/pm_runtime.c | 26 +++++++++++++++++++ .../suecreek/include/platform/memory.h | 5 ++++ src/platform/suecreek/include/platform/shim.h | 3 +++ 9 files changed, 55 insertions(+) diff --git a/src/drivers/intel/cavs/dmic.c b/src/drivers/intel/cavs/dmic.c index 34ad33344f89..290aefbe0eb1 100644 --- a/src/drivers/intel/cavs/dmic.c +++ b/src/drivers/intel/cavs/dmic.c @@ -1450,6 +1450,8 @@ static int dmic_probe(struct dai *dai) if (dai_get_drvdata(dai)) return -EEXIST; /* already created */ + /* Enable DMIC power */ + pm_runtime_get_sync(DMIC_POW, dai->index); /* Disable dynamic clock gating for dmic before touching any reg */ pm_runtime_get_sync(DMIC_CLK, dai->index); @@ -1482,6 +1484,8 @@ static int dmic_remove(struct dai *dai) interrupt_unregister(dmic_irq(dai)); pm_runtime_put_sync(DMIC_CLK, dai->index); + /* Disable DMIC power */ + pm_runtime_put_sync(DMIC_POW, dai->index); rfree(dma_get_drvdata(dai)); dai_set_drvdata(dai, NULL); diff --git a/src/include/sof/pm_runtime.h b/src/include/sof/pm_runtime.h index b093185639b5..b17f81450559 100644 --- a/src/include/sof/pm_runtime.h +++ b/src/include/sof/pm_runtime.h @@ -62,6 +62,7 @@ enum pm_runtime_context { PM_RUNTIME_HOST_DMA_L1 = 0, /**< Host DMA L1 Exit */ SSP_CLK, /**< SSP Clock */ DMIC_CLK, /**< DMIC Clock */ + DMIC_POW, /**< DMIC Power */ DW_DMAC_CLK /**< DW DMAC Clock */ }; diff --git a/src/platform/cannonlake/include/platform/memory.h b/src/platform/cannonlake/include/platform/memory.h index 243890f23145..9235c78b7870 100644 --- a/src/platform/cannonlake/include/platform/memory.h +++ b/src/platform/cannonlake/include/platform/memory.h @@ -42,6 +42,11 @@ #define SHIM_BASE 0x00071F00 #define SHIM_SIZE 0x00000100 +/* Digital Mic Shim Registers */ +#define DMIC_SHIM_BASE 0x00071E80 +#define DMICLCTL_OFFSET 0x04 +#define DMICLCTL (DMIC_SHIM_BASE + DMICLCTL_OFFSET) + /* cmd IO to audio codecs */ #define CMD_BASE 0x00001100 #define CMD_SIZE 0x00000010 diff --git a/src/platform/cannonlake/include/platform/shim.h b/src/platform/cannonlake/include/platform/shim.h index a56980f0e394..6cb819567200 100644 --- a/src/platform/cannonlake/include/platform/shim.h +++ b/src/platform/cannonlake/include/platform/shim.h @@ -233,6 +233,9 @@ #define DMWBA_ENABLE (1 << 0) #define DMWBA_READONLY (1 << 1) +/* DMIC power ON bit */ +#define DMICLCTL_SPA ((uint32_t) BIT(0)) + #ifndef ASSEMBLY static inline uint16_t shim_read16(uint16_t reg) diff --git a/src/platform/icelake/include/platform/memory.h b/src/platform/icelake/include/platform/memory.h index 115671d23b2e..8549e6463586 100644 --- a/src/platform/icelake/include/platform/memory.h +++ b/src/platform/icelake/include/platform/memory.h @@ -42,6 +42,11 @@ #define SHIM_BASE 0x00071F00 #define SHIM_SIZE 0x00000100 +/* Digital Mic Shim Registers */ +#define DMIC_SHIM_BASE 0x00071E80 +#define DMICLCTL_OFFSET 0x04 +#define DMICLCTL (DMIC_SHIM_BASE + DMICLCTL_OFFSET) + /* cmd IO to audio codecs */ #define CMD_BASE 0x00001100 #define CMD_SIZE 0x00000010 diff --git a/src/platform/icelake/include/platform/shim.h b/src/platform/icelake/include/platform/shim.h index a56980f0e394..6cb819567200 100644 --- a/src/platform/icelake/include/platform/shim.h +++ b/src/platform/icelake/include/platform/shim.h @@ -233,6 +233,9 @@ #define DMWBA_ENABLE (1 << 0) #define DMWBA_READONLY (1 << 1) +/* DMIC power ON bit */ +#define DMICLCTL_SPA ((uint32_t) BIT(0)) + #ifndef ASSEMBLY static inline uint16_t shim_read16(uint16_t reg) diff --git a/src/platform/intel/cavs/pm_runtime.c b/src/platform/intel/cavs/pm_runtime.c index f46f59e7436c..cf64ce6887e2 100644 --- a/src/platform/intel/cavs/pm_runtime.c +++ b/src/platform/intel/cavs/pm_runtime.c @@ -123,7 +123,27 @@ static inline void cavs_pm_runtime_en_dmic_clk_gating(uint32_t index) index, shim_read(SHIM_CLKCTL)); #endif } +static inline void cavs_pm_runtime_en_dmic_power(uint32_t index) +{ + (void) index; +#if defined(CONFIG_CANNONLAKE) || defined(CONFIG_ICELAKE) \ + || defined(CONFIG_SUECREEK) + /* Enable DMIC power */ + io_reg_write(DMICLCTL, + (io_reg_read(DMICLCTL) | DMICLCTL_SPA)); +#endif +} +static inline void cavs_pm_runtime_dis_dmic_power(uint32_t index) +{ + (void) index; +#if defined(CONFIG_CANNONLAKE) || defined(CONFIG_ICELAKE) \ + || defined(CONFIG_SUECREEK) + /* Disable DMIC power */ + io_reg_write(DMICLCTL, + (io_reg_read(DMICLCTL) & (~DMICLCTL_SPA))); #endif +} +#endif /* #if defined(CONFIG_DMIC) */ static inline void cavs_pm_runtime_dis_dwdma_clk_gating(uint32_t index) { @@ -171,6 +191,9 @@ void platform_pm_runtime_get(enum pm_runtime_context context, uint32_t index, case DMIC_CLK: cavs_pm_runtime_dis_dmic_clk_gating(index); break; + case DMIC_POW: + cavs_pm_runtime_en_dmic_power(index); + break; #endif case DW_DMAC_CLK: cavs_pm_runtime_dis_dwdma_clk_gating(index); @@ -194,6 +217,9 @@ void platform_pm_runtime_put(enum pm_runtime_context context, uint32_t index, case DMIC_CLK: cavs_pm_runtime_en_dmic_clk_gating(index); break; + case DMIC_POW: + cavs_pm_runtime_dis_dmic_power(index); + break; #endif case DW_DMAC_CLK: cavs_pm_runtime_en_dwdma_clk_gating(index); diff --git a/src/platform/suecreek/include/platform/memory.h b/src/platform/suecreek/include/platform/memory.h index 2c10c85fa3fe..9a01debd460e 100644 --- a/src/platform/suecreek/include/platform/memory.h +++ b/src/platform/suecreek/include/platform/memory.h @@ -42,6 +42,11 @@ #define SHIM_BASE 0x00071F00 #define SHIM_SIZE 0x00000100 +/* Digital Mic Shim Registers */ +#define DMIC_SHIM_BASE 0x00071E80 +#define DMICLCTL_OFFSET 0x04 +#define DMICLCTL (DMIC_SHIM_BASE + DMICLCTL_OFFSET) + /* cmd IO to audio codecs */ #define CMD_BASE 0x00001100 #define CMD_SIZE 0x00000010 diff --git a/src/platform/suecreek/include/platform/shim.h b/src/platform/suecreek/include/platform/shim.h index 2a3f91baff16..63fa6c3b6421 100644 --- a/src/platform/suecreek/include/platform/shim.h +++ b/src/platform/suecreek/include/platform/shim.h @@ -233,6 +233,9 @@ #define DMWBA_ENABLE (1 << 0) #define DMWBA_READONLY (1 << 1) +/* DMIC power ON bit */ +#define DMICLCTL_SPA ((uint32_t) BIT(0)) + #ifndef ASSEMBLY static inline uint16_t shim_read16(uint16_t reg)