| From b7636b5265b4dd5ff5ed03601ea8c1f44ac5648a Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Wed, 7 Dec 2016 00:28:11 +0000 |
| Subject: [PATCH 082/299] ASoC: rsnd: setup BRGCKR/BRRA/BRRB when starting |
| |
| Current rsnd driver setups BRGCKR/BRRA/BRRB when .probe timing. |
| But it breaks sound after Suspend/Resume. These should be setups |
| every start timing. |
| This patch is tested on R-Car Gen3 Salvator-X board |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Tested-by: Gaku Inami <gaku.inami.xw@bp.renesas.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| (cherry picked from commit b99258a3151a70da9b4125f940c4dcc091df84c1) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/adg.c | 21 ++++++++++++--------- |
| 1 file changed, 12 insertions(+), 9 deletions(-) |
| |
| --- a/sound/soc/sh/rcar/adg.c |
| +++ b/sound/soc/sh/rcar/adg.c |
| @@ -34,6 +34,9 @@ struct rsnd_adg { |
| struct clk_onecell_data onecell; |
| struct rsnd_mod mod; |
| u32 flags; |
| + u32 ckr; |
| + u32 rbga; |
| + u32 rbgb; |
| |
| int rbga_rate_for_441khz; /* RBGA */ |
| int rbgb_rate_for_48khz; /* RBGB */ |
| @@ -316,9 +319,11 @@ int rsnd_adg_ssi_clk_try_start(struct rs |
| struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); |
| struct rsnd_adg *adg = rsnd_priv_to_adg(priv); |
| struct device *dev = rsnd_priv_to_dev(priv); |
| + struct rsnd_mod *adg_mod = rsnd_mod_get(adg); |
| struct clk *clk; |
| int i; |
| u32 data; |
| + u32 ckr = 0; |
| int sel_table[] = { |
| [CLKA] = 0x1, |
| [CLKB] = 0x2, |
| @@ -360,15 +365,14 @@ found_clock: |
| rsnd_adg_set_ssi_clk(ssi_mod, data); |
| |
| if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) { |
| - struct rsnd_mod *adg_mod = rsnd_mod_get(adg); |
| - u32 ckr = 0; |
| - |
| if (0 == (rate % 8000)) |
| ckr = 0x80000000; |
| - |
| - rsnd_mod_bset(adg_mod, BRGCKR, 0x80000000, ckr); |
| } |
| |
| + rsnd_mod_bset(adg_mod, BRGCKR, 0x80FF0000, adg->ckr | ckr); |
| + rsnd_mod_write(adg_mod, BRRA, adg->rbga); |
| + rsnd_mod_write(adg_mod, BRRB, adg->rbgb); |
| + |
| dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n", |
| rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod), |
| data, rate); |
| @@ -421,7 +425,6 @@ static void rsnd_adg_get_clkout(struct r |
| struct rsnd_adg *adg) |
| { |
| struct clk *clk; |
| - struct rsnd_mod *adg_mod = rsnd_mod_get(adg); |
| struct device *dev = rsnd_priv_to_dev(priv); |
| struct device_node *np = dev->of_node; |
| u32 ckr, rbgx, rbga, rbgb; |
| @@ -546,9 +549,9 @@ static void rsnd_adg_get_clkout(struct r |
| } |
| } |
| |
| - rsnd_mod_bset(adg_mod, BRGCKR, 0x80FF0000, ckr); |
| - rsnd_mod_write(adg_mod, BRRA, rbga); |
| - rsnd_mod_write(adg_mod, BRRB, rbgb); |
| + adg->ckr = ckr; |
| + adg->rbga = rbga; |
| + adg->rbgb = rbgb; |
| |
| for_each_rsnd_clkout(clk, adg, i) |
| dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk)); |