ASoC: rsnd: enable/disable ADG when suspend/resume timing
Current rsnd driver enables ADG clock when .probe timing, but it breaks sound after Suspend/Resume. These should be setups every suspend/resume timing too. 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
6bf66b1c35
commit
c2d3171847
|
@ -376,6 +376,25 @@ found_clock:
|
|||
return 0;
|
||||
}
|
||||
|
||||
void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable)
|
||||
{
|
||||
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct clk *clk;
|
||||
int i, ret;
|
||||
|
||||
for_each_rsnd_clk(clk, adg, i) {
|
||||
ret = 0;
|
||||
if (enable)
|
||||
ret = clk_prepare_enable(clk);
|
||||
else
|
||||
clk_disable_unprepare(clk);
|
||||
|
||||
if (ret < 0)
|
||||
dev_warn(dev, "can't use clk %d\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
|
||||
struct rsnd_adg *adg)
|
||||
{
|
||||
|
@ -387,20 +406,15 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
|
|||
[CLKC] = "clk_c",
|
||||
[CLKI] = "clk_i",
|
||||
};
|
||||
int i, ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CLKMAX; i++) {
|
||||
clk = devm_clk_get(dev, clk_name[i]);
|
||||
adg->clk[i] = IS_ERR(clk) ? NULL : clk;
|
||||
}
|
||||
|
||||
for_each_rsnd_clk(clk, adg, i) {
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret < 0)
|
||||
dev_warn(dev, "can't use clk %d\n", i);
|
||||
|
||||
for_each_rsnd_clk(clk, adg, i)
|
||||
dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk));
|
||||
}
|
||||
}
|
||||
|
||||
static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
|
||||
|
@ -565,16 +579,12 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
|
|||
|
||||
priv->adg = adg;
|
||||
|
||||
rsnd_adg_clk_enable(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rsnd_adg_remove(struct rsnd_priv *priv)
|
||||
{
|
||||
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
||||
struct clk *clk;
|
||||
int i;
|
||||
|
||||
for_each_rsnd_clk(clk, adg, i) {
|
||||
clk_disable_unprepare(clk);
|
||||
}
|
||||
rsnd_adg_clk_disable(priv);
|
||||
}
|
||||
|
|
|
@ -1308,9 +1308,33 @@ static int rsnd_remove(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int rsnd_suspend(struct device *dev)
|
||||
{
|
||||
struct rsnd_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
rsnd_adg_clk_disable(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rsnd_resume(struct device *dev)
|
||||
{
|
||||
struct rsnd_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
rsnd_adg_clk_enable(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dev_pm_ops rsnd_pm_ops = {
|
||||
.suspend = rsnd_suspend,
|
||||
.resume = rsnd_resume,
|
||||
};
|
||||
|
||||
static struct platform_driver rsnd_driver = {
|
||||
.driver = {
|
||||
.name = "rcar_sound",
|
||||
.pm = &rsnd_pm_ops,
|
||||
.of_match_table = rsnd_of_match,
|
||||
},
|
||||
.probe = rsnd_probe,
|
||||
|
|
|
@ -499,6 +499,9 @@ int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod,
|
|||
unsigned int out_rate);
|
||||
int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io);
|
||||
#define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1)
|
||||
#define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0)
|
||||
void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
|
||||
|
||||
/*
|
||||
* R-Car sound priv
|
||||
|
|
Loading…
Reference in New Issue