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>
This commit is contained in:
parent
c2d3171847
commit
b99258a315
@ -34,6 +34,9 @@ struct rsnd_adg {
|
|||||||
struct clk_onecell_data onecell;
|
struct clk_onecell_data onecell;
|
||||||
struct rsnd_mod mod;
|
struct rsnd_mod mod;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
u32 ckr;
|
||||||
|
u32 rbga;
|
||||||
|
u32 rbgb;
|
||||||
|
|
||||||
int rbga_rate_for_441khz; /* RBGA */
|
int rbga_rate_for_441khz; /* RBGA */
|
||||||
int rbgb_rate_for_48khz; /* RBGB */
|
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_priv *priv = rsnd_mod_to_priv(ssi_mod);
|
||||||
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
||||||
struct device *dev = rsnd_priv_to_dev(priv);
|
struct device *dev = rsnd_priv_to_dev(priv);
|
||||||
|
struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
int i;
|
int i;
|
||||||
u32 data;
|
u32 data;
|
||||||
|
u32 ckr = 0;
|
||||||
int sel_table[] = {
|
int sel_table[] = {
|
||||||
[CLKA] = 0x1,
|
[CLKA] = 0x1,
|
||||||
[CLKB] = 0x2,
|
[CLKB] = 0x2,
|
||||||
@ -360,15 +365,14 @@ found_clock:
|
|||||||
rsnd_adg_set_ssi_clk(ssi_mod, data);
|
rsnd_adg_set_ssi_clk(ssi_mod, data);
|
||||||
|
|
||||||
if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) {
|
if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) {
|
||||||
struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
|
|
||||||
u32 ckr = 0;
|
|
||||||
|
|
||||||
if (0 == (rate % 8000))
|
if (0 == (rate % 8000))
|
||||||
ckr = 0x80000000;
|
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",
|
dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n",
|
||||||
rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod),
|
rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod),
|
||||||
data, rate);
|
data, rate);
|
||||||
@ -421,7 +425,6 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
|
|||||||
struct rsnd_adg *adg)
|
struct rsnd_adg *adg)
|
||||||
{
|
{
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
|
|
||||||
struct device *dev = rsnd_priv_to_dev(priv);
|
struct device *dev = rsnd_priv_to_dev(priv);
|
||||||
struct device_node *np = dev->of_node;
|
struct device_node *np = dev->of_node;
|
||||||
u32 ckr, rbgx, rbga, rbgb;
|
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);
|
adg->ckr = ckr;
|
||||||
rsnd_mod_write(adg_mod, BRRA, rbga);
|
adg->rbga = rbga;
|
||||||
rsnd_mod_write(adg_mod, BRRB, rbgb);
|
adg->rbgb = rbgb;
|
||||||
|
|
||||||
for_each_rsnd_clkout(clk, adg, i)
|
for_each_rsnd_clkout(clk, adg, i)
|
||||||
dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk));
|
dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk));
|
||||||
|
Loading…
Reference in New Issue
Block a user