ASoC: cs35l56: In secure mode skip SHUTDOWN and RESET around fw download
If the device is in secure mode it's unnecessary to send a SHUTDOWN and SYSTEM_RESET around the firmware download. It could only be patching insecure tunings. A tuning patch doesn't need a SHUTDOWN and only needs a REINIT afterwards. This will reduce the overhead of exiting system suspend in secure mode. Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com> Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Link: https://lore.kernel.org/r/Message-Id: <20230518150250.1121006-4-rf@opensource.cirrus.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
c9001a2754
commit
1a8edfcffa
|
@ -223,6 +223,7 @@
|
|||
|
||||
#define CS35L56_MBOX_CMD_AUDIO_PLAY 0x0B000001
|
||||
#define CS35L56_MBOX_CMD_AUDIO_PAUSE 0x0B000002
|
||||
#define CS35L56_MBOX_CMD_AUDIO_REINIT 0x0B000003
|
||||
#define CS35L56_MBOX_CMD_HIBERNATE_NOW 0x02000001
|
||||
#define CS35L56_MBOX_CMD_WAKEUP 0x02000002
|
||||
#define CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE 0x02000003
|
||||
|
|
|
@ -825,19 +825,23 @@ static void cs35l56_system_reset(struct cs35l56_private *cs35l56)
|
|||
regcache_cache_only(cs35l56->regmap, false);
|
||||
}
|
||||
|
||||
static void cs35l56_dsp_work(struct work_struct *work)
|
||||
static void cs35l56_secure_patch(struct cs35l56_private *cs35l56)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Use wm_adsp to load and apply the firmware patch and coefficient files */
|
||||
ret = wm_adsp_power_up(&cs35l56->dsp);
|
||||
if (ret)
|
||||
dev_dbg(cs35l56->dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret);
|
||||
else
|
||||
cs35l56_mbox_send(cs35l56, CS35L56_MBOX_CMD_AUDIO_REINIT);
|
||||
}
|
||||
|
||||
static void cs35l56_patch(struct cs35l56_private *cs35l56)
|
||||
{
|
||||
struct cs35l56_private *cs35l56 = container_of(work,
|
||||
struct cs35l56_private,
|
||||
dsp_work);
|
||||
unsigned int reg;
|
||||
unsigned int val;
|
||||
int ret = 0;
|
||||
|
||||
if (!cs35l56->init_done)
|
||||
return;
|
||||
|
||||
pm_runtime_get_sync(cs35l56->dev);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Disable SoundWire interrupts to prevent race with IRQ work.
|
||||
|
@ -909,6 +913,29 @@ err:
|
|||
sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1,
|
||||
CS35L56_SDW_INT_MASK_CODEC_IRQ);
|
||||
}
|
||||
}
|
||||
|
||||
static void cs35l56_dsp_work(struct work_struct *work)
|
||||
{
|
||||
struct cs35l56_private *cs35l56 = container_of(work,
|
||||
struct cs35l56_private,
|
||||
dsp_work);
|
||||
|
||||
if (!cs35l56->init_done)
|
||||
return;
|
||||
|
||||
pm_runtime_get_sync(cs35l56->dev);
|
||||
|
||||
/*
|
||||
* When the device is running in secure mode the firmware files can
|
||||
* only contain insecure tunings and therefore we do not need to
|
||||
* shutdown the firmware to apply them and can use the lower cost
|
||||
* reinit sequence instead.
|
||||
*/
|
||||
if (cs35l56->secured)
|
||||
cs35l56_secure_patch(cs35l56);
|
||||
else
|
||||
cs35l56_patch(cs35l56);
|
||||
|
||||
pm_runtime_mark_last_busy(cs35l56->dev);
|
||||
pm_runtime_put_autosuspend(cs35l56->dev);
|
||||
|
|
Loading…
Reference in New Issue