diff options
| author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2016-12-07 00:28:11 +0000 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2016-12-07 15:47:45 +0000 | 
| commit | b99258a3151a70da9b4125f940c4dcc091df84c1 (patch) | |
| tree | 25de504c141b678961f5df87176c5d96c3431249 /sound | |
| parent | c2d3171847611e8a33d3e10a9942f6c065d05c1f (diff) | |
| download | linux-b99258a3151a70da9b4125f940c4dcc091df84c1.tar.bz2 | |
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>
Diffstat (limited to 'sound')
| -rw-r--r-- | sound/soc/sh/rcar/adg.c | 21 | 
1 files changed, 12 insertions, 9 deletions
| diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index 54b28fd502ef..85a33ac0a5c4 100644 --- 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 rsnd_mod *ssi_mod, unsigned int rate)  	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 rsnd_priv *priv,  				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 rsnd_priv *priv,  		}  	} -	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)); |