aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Rattray <crattray@opensource.wolfsonmicro.com>2013-01-18 03:43:09 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-01-18 03:46:28 -0500
commit94e205bfb73b6d19028dbd40404219fdeb27175e (patch)
tree2c6a6a0697e37d46124f0eec5d28f3a304fd8575
parentc712326d6c1e74678791d5864cd2ed283e1cc572 (diff)
ASoC: wm_adsp: Set ADSP1 clock rate to match sys clock
Sets the ADSP1 clock rate to match the system clock rate. To support this the codec driver provides details of register containing the system clock control bits. Signed-off-by: Chris Rattray <crattray@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/wm_adsp.c33
-rw-r--r--sound/soc/codecs/wm_adsp.h3
2 files changed, 36 insertions, 0 deletions
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 5841285c213f..9e311622190e 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -103,6 +103,13 @@
103#define ADSP1_START_SHIFT 0 /* DSP1_START */ 103#define ADSP1_START_SHIFT 0 /* DSP1_START */
104#define ADSP1_START_WIDTH 1 /* DSP1_START */ 104#define ADSP1_START_WIDTH 1 /* DSP1_START */
105 105
106/*
107 * ADSP1 Control 31
108 */
109#define ADSP1_CLK_SEL_MASK 0x0007 /* CLK_SEL_ENA */
110#define ADSP1_CLK_SEL_SHIFT 0 /* CLK_SEL_ENA */
111#define ADSP1_CLK_SEL_WIDTH 3 /* CLK_SEL_ENA */
112
106#define ADSP2_CONTROL 0 113#define ADSP2_CONTROL 0
107#define ADSP2_CLOCKING 1 114#define ADSP2_CLOCKING 1
108#define ADSP2_STATUS1 4 115#define ADSP2_STATUS1 4
@@ -806,12 +813,38 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
806 struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); 813 struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
807 struct wm_adsp *dsp = &dsps[w->shift]; 814 struct wm_adsp *dsp = &dsps[w->shift];
808 int ret; 815 int ret;
816 int val;
809 817
810 switch (event) { 818 switch (event) {
811 case SND_SOC_DAPM_POST_PMU: 819 case SND_SOC_DAPM_POST_PMU:
812 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30, 820 regmap_update_bits(dsp->regmap, dsp->base + ADSP1_CONTROL_30,
813 ADSP1_SYS_ENA, ADSP1_SYS_ENA); 821 ADSP1_SYS_ENA, ADSP1_SYS_ENA);
814 822
823 /*
824 * For simplicity set the DSP clock rate to be the
825 * SYSCLK rate rather than making it configurable.
826 */
827 if(dsp->sysclk_reg) {
828 ret = regmap_read(dsp->regmap, dsp->sysclk_reg, &val);
829 if (ret != 0) {
830 adsp_err(dsp, "Failed to read SYSCLK state: %d\n",
831 ret);
832 return ret;
833 }
834
835 val = (val & dsp->sysclk_mask)
836 >> dsp->sysclk_shift;
837
838 ret = regmap_update_bits(dsp->regmap,
839 dsp->base + ADSP1_CONTROL_31,
840 ADSP1_CLK_SEL_MASK, val);
841 if (ret != 0) {
842 adsp_err(dsp, "Failed to set clock rate: %d\n",
843 ret);
844 return ret;
845 }
846 }
847
815 ret = wm_adsp_load(dsp); 848 ret = wm_adsp_load(dsp);
816 if (ret != 0) 849 if (ret != 0)
817 goto err; 850 goto err;
diff --git a/sound/soc/codecs/wm_adsp.h b/sound/soc/codecs/wm_adsp.h
index 41206d79e038..cb8871a3ec00 100644
--- a/sound/soc/codecs/wm_adsp.h
+++ b/sound/soc/codecs/wm_adsp.h
@@ -40,6 +40,9 @@ struct wm_adsp {
40 struct regmap *regmap; 40 struct regmap *regmap;
41 41
42 int base; 42 int base;
43 int sysclk_reg;
44 int sysclk_mask;
45 int sysclk_shift;
43 46
44 struct list_head alg_regions; 47 struct list_head alg_regions;
45 48