mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
ASoC: cs35l35: Correct handling of PDN_DONE with external boost
When using an external boost supply the PDN_DONE bit is not set, update the handling in this case to use to use an appropriate fixed delay. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Acked-by: Brian Austin <brian.austin@cirrus.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
2c84afb52e
commit
77b329d194
2 changed files with 26 additions and 8 deletions
|
@ -96,6 +96,8 @@ struct cs35l35_platform_data {
|
|||
int adv_channel;
|
||||
/* Shared Boost for stereo */
|
||||
bool shared_bst;
|
||||
/* Specifies this amp is using an external boost supply */
|
||||
bool ext_bst;
|
||||
/* ClassH Algorithm */
|
||||
struct classh_cfg classh_algo;
|
||||
/* Monitor Config */
|
||||
|
|
|
@ -162,6 +162,27 @@ static bool cs35l35_precious_register(struct device *dev, unsigned int reg)
|
|||
}
|
||||
}
|
||||
|
||||
static int cs35l35_wait_for_pdn(struct cs35l35_private *cs35l35)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (cs35l35->pdata.ext_bst) {
|
||||
usleep_range(5000, 5500);
|
||||
return 0;
|
||||
}
|
||||
|
||||
reinit_completion(&cs35l35->pdn_done);
|
||||
|
||||
ret = wait_for_completion_timeout(&cs35l35->pdn_done,
|
||||
msecs_to_jiffies(100));
|
||||
if (ret == 0) {
|
||||
dev_err(cs35l35->dev, "PDN_DONE did not complete\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs35l35_sdin_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
|
@ -191,14 +212,7 @@ static int cs35l35_sdin_event(struct snd_soc_dapm_widget *w,
|
|||
regmap_update_bits(cs35l35->regmap, CS35L35_AMP_DIG_VOL_CTL,
|
||||
CS35L35_AMP_DIGSFT_MASK, 0);
|
||||
|
||||
reinit_completion(&cs35l35->pdn_done);
|
||||
|
||||
ret = wait_for_completion_timeout(&cs35l35->pdn_done,
|
||||
msecs_to_jiffies(100));
|
||||
if (ret == 0) {
|
||||
dev_err(codec->dev, "TIMEOUT PDN_DONE did not complete in 100ms\n");
|
||||
ret = -ETIMEDOUT;
|
||||
}
|
||||
ret = cs35l35_wait_for_pdn(cs35l35);
|
||||
|
||||
regmap_update_bits(cs35l35->regmap, CS35L35_CLK_CTL1,
|
||||
CS35L35_MCLK_DIS_MASK,
|
||||
|
@ -1198,6 +1212,8 @@ static int cs35l35_handle_of_data(struct i2c_client *i2c_client,
|
|||
"cirrus,shared-boost");
|
||||
}
|
||||
|
||||
pdata->ext_bst = of_property_read_bool(np, "cirrus,external-boost");
|
||||
|
||||
pdata->gain_zc = of_property_read_bool(np, "cirrus,amp-gain-zc");
|
||||
|
||||
classh = of_get_child_by_name(np, "cirrus,classh-internal-algo");
|
||||
|
|
Loading…
Reference in a new issue