mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-17 18:16:22 +10:00
ASoC: cs35l56: Make a common function to shutdown the DSP
Move issuing of a CS35L56_MBOX_CMD_SHUTDOWN command and then waiting for the DSP to reach CS35L56_HALO_STATE_SHUTDOWN in the register appropriate for the hardware revision into a common function. Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com> Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Acked-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20230721132120.5523-10-rf@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
f32a2bcbc0
commit
444dfa0912
@ -274,6 +274,7 @@ extern const unsigned int cs35l56_tx_input_values[CS35L56_NUM_INPUT_SRC];
|
|||||||
|
|
||||||
int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);
|
int cs35l56_set_patch(struct cs35l56_base *cs35l56_base);
|
||||||
int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);
|
int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command);
|
||||||
|
int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base);
|
||||||
int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base);
|
int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base);
|
||||||
void cs35l56_wait_control_port_ready(void);
|
void cs35l56_wait_control_port_ready(void);
|
||||||
void cs35l56_wait_min_reset_pulse(void);
|
void cs35l56_wait_min_reset_pulse(void);
|
||||||
|
@ -213,6 +213,32 @@ int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsigned int command)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS_GPL(cs35l56_mbox_send, SND_SOC_CS35L56_SHARED);
|
EXPORT_SYMBOL_NS_GPL(cs35l56_mbox_send, SND_SOC_CS35L56_SHARED);
|
||||||
|
|
||||||
|
int cs35l56_firmware_shutdown(struct cs35l56_base *cs35l56_base)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
unsigned int reg;
|
||||||
|
unsigned int val;
|
||||||
|
|
||||||
|
ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_SHUTDOWN);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (cs35l56_base->rev < CS35L56_REVID_B0)
|
||||||
|
reg = CS35L56_DSP1_PM_CUR_STATE_A1;
|
||||||
|
else
|
||||||
|
reg = CS35L56_DSP1_PM_CUR_STATE;
|
||||||
|
|
||||||
|
ret = regmap_read_poll_timeout(cs35l56_base->regmap, reg,
|
||||||
|
val, (val == CS35L56_HALO_STATE_SHUTDOWN),
|
||||||
|
CS35L56_HALO_STATE_POLL_US,
|
||||||
|
CS35L56_HALO_STATE_TIMEOUT_US);
|
||||||
|
if (ret < 0)
|
||||||
|
dev_err(cs35l56_base->dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n",
|
||||||
|
val, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_NS_GPL(cs35l56_firmware_shutdown, SND_SOC_CS35L56_SHARED);
|
||||||
|
|
||||||
int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
|
int cs35l56_wait_for_firmware_boot(struct cs35l56_base *cs35l56_base)
|
||||||
{
|
{
|
||||||
unsigned int reg;
|
unsigned int reg;
|
||||||
|
@ -673,8 +673,6 @@ static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
|
|||||||
|
|
||||||
static void cs35l56_patch(struct cs35l56_private *cs35l56)
|
static void cs35l56_patch(struct cs35l56_private *cs35l56)
|
||||||
{
|
{
|
||||||
unsigned int reg;
|
|
||||||
unsigned int val;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -691,23 +689,10 @@ static void cs35l56_patch(struct cs35l56_private *cs35l56)
|
|||||||
flush_work(&cs35l56->sdw_irq_work);
|
flush_work(&cs35l56->sdw_irq_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = cs35l56_mbox_send(&cs35l56->base, CS35L56_MBOX_CMD_SHUTDOWN);
|
ret = cs35l56_firmware_shutdown(&cs35l56->base);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (cs35l56->base.rev < CS35L56_REVID_B0)
|
|
||||||
reg = CS35L56_DSP1_PM_CUR_STATE_A1;
|
|
||||||
else
|
|
||||||
reg = CS35L56_DSP1_PM_CUR_STATE;
|
|
||||||
|
|
||||||
ret = regmap_read_poll_timeout(cs35l56->base.regmap, reg,
|
|
||||||
val, (val == CS35L56_HALO_STATE_SHUTDOWN),
|
|
||||||
CS35L56_HALO_STATE_POLL_US,
|
|
||||||
CS35L56_HALO_STATE_TIMEOUT_US);
|
|
||||||
if (ret < 0)
|
|
||||||
dev_err(cs35l56->base.dev, "Failed to poll PM_CUR_STATE to 1 is %d (ret %d)\n",
|
|
||||||
val, ret);
|
|
||||||
|
|
||||||
/* Use wm_adsp to load and apply the firmware patch and coefficient files */
|
/* Use wm_adsp to load and apply the firmware patch and coefficient files */
|
||||||
ret = wm_adsp_power_up(&cs35l56->dsp);
|
ret = wm_adsp_power_up(&cs35l56->dsp);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
Loading…
Reference in New Issue
Block a user