diff options
-rw-r--r-- | arch/arm/mach-tegra/board-ventana.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra2_clocks.c | 36 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc_wm8903.c | 1 |
3 files changed, 26 insertions, 12 deletions
diff --git a/arch/arm/mach-tegra/board-ventana.c b/arch/arm/mach-tegra/board-ventana.c index 04beec75935d..146856df0977 100644 --- a/arch/arm/mach-tegra/board-ventana.c +++ b/arch/arm/mach-tegra/board-ventana.c @@ -309,6 +309,7 @@ static __initdata struct tegra_clk_init_table ventana_clk_init_table[] = { { "pwm", "clk_32k", 32768, false}, { "pll_a", NULL, 56448000, false}, { "pll_a_out0", NULL, 11289600, false}, + { "clk_dev1", "pll_a_out0", 0, true}, { "i2s1", "pll_a_out0", 11289600, false}, { "i2s2", "pll_a_out0", 11289600, false}, { "audio", "pll_a_out0", 11289600, false}, diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index a48baf9c8d35..15f3b75cbdee 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c @@ -1233,25 +1233,38 @@ static struct clk_ops tegra_audio_sync_clk_ops = { }; /* call this function after pinmux configuration */ -static void tegra2_cdev_clk_set_parent(struct clk *c) +static int tegra2_cdev_clk_set_parent(struct clk *c, struct clk *p) { const struct clk_mux_sel *mux = 0; const struct clk_mux_sel *sel; enum tegra_pingroup pg = TEGRA_PINGROUP_CDEV1; int val; - /* Get pinmux setting for cdev1 and cdev2 from APB_MISC register */ - if (!strcmp(c->name, "clk_dev2")) - pg = TEGRA_PINGROUP_CDEV2; + if (p) { + for (sel = c->inputs; sel->input != NULL; sel++) { + if (sel->input == p) { + clk_reparent(c, p); + return 0; + } + } + } + else { + /* Get pinmux setting for cdev1 and cdev2 from APB_MISC reg */ + if (!strcmp(c->name, "clk_dev2")) + pg = TEGRA_PINGROUP_CDEV2; - val = tegra_pinmux_get_func(pg); - for (sel = c->inputs; sel->input != NULL; sel++) { - if (val == sel->value) - mux = sel; + val = tegra_pinmux_get_func(pg); + for (sel = c->inputs; sel->input != NULL; sel++) { + if (val == sel->value) { + mux = sel; + BUG_ON(!mux); + clk_reparent(c, mux->input); + return 0; + } + } } - BUG_ON(!mux); - c->parent = mux->input; + return -EINVAL; } /* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */ @@ -1276,7 +1289,7 @@ static int tegra2_cdev_clk_enable(struct clk *c) { if (!c->parent) { /* Set parent from inputs */ - tegra2_cdev_clk_set_parent(c); + tegra2_cdev_clk_set_parent(c, NULL); clk_enable(c->parent); } @@ -1295,6 +1308,7 @@ static struct clk_ops tegra_cdev_clk_ops = { .init = &tegra2_cdev_clk_init, .enable = &tegra2_cdev_clk_enable, .disable = &tegra2_cdev_clk_disable, + .set_parent = &tegra2_cdev_clk_set_parent, }; /* shared bus ops */ diff --git a/sound/soc/tegra/tegra_soc_wm8903.c b/sound/soc/tegra/tegra_soc_wm8903.c index 2483d2efb115..bad6c1f80966 100644 --- a/sound/soc/tegra/tegra_soc_wm8903.c +++ b/sound/soc/tegra/tegra_soc_wm8903.c @@ -516,7 +516,6 @@ static int tegra_codec_init(struct snd_soc_codec *codec) err = -ENODEV; return err; } - clk_enable(audio_data->dap_mclk); /* Add tegra specific widgets */ snd_soc_dapm_new_controls(codec, tegra_dapm_widgets, |