ASoC: SOF: Intel: Enable d0i3 work for ipc4
Schedule a delayed work for d0i3 entry after every non-pm ipc msg. Signed-off-by: Rander Wang <rander.wang@intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Link: https://lore.kernel.org/r/20230214103345.30669-5-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
1c91e927e5
commit
3e6b6ed34b
@ -280,6 +280,8 @@ int cnl_ipc4_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
||||
snd_sof_dsp_write(sdev, HDA_DSP_BAR, CNL_DSP_REG_HIPCIDR,
|
||||
msg_data->primary | CNL_DSP_REG_HIPCIDR_BUSY);
|
||||
|
||||
hda_dsp_ipc4_schedule_d0i3_work(hdev, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,32 @@ int hda_dsp_ipc_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool hda_dsp_ipc4_pm_msg(u32 primary)
|
||||
{
|
||||
/* pm setting is only supported by module msg */
|
||||
if (SOF_IPC4_MSG_IS_MODULE_MSG(primary) != SOF_IPC4_MODULE_MSG)
|
||||
return false;
|
||||
|
||||
if (SOF_IPC4_MSG_TYPE_GET(primary) == SOF_IPC4_MOD_SET_DX ||
|
||||
SOF_IPC4_MSG_TYPE_GET(primary) == SOF_IPC4_MOD_SET_D0IX)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void hda_dsp_ipc4_schedule_d0i3_work(struct sof_intel_hda_dev *hdev,
|
||||
struct snd_sof_ipc_msg *msg)
|
||||
{
|
||||
struct sof_ipc4_msg *msg_data = msg->msg_data;
|
||||
|
||||
/* Schedule a delayed work for d0i3 entry after sending non-pm ipc msg */
|
||||
if (hda_dsp_ipc4_pm_msg(msg_data->primary))
|
||||
return;
|
||||
|
||||
mod_delayed_work(system_wq, &hdev->d0i3_work,
|
||||
msecs_to_jiffies(SOF_HDA_D0I3_WORK_DELAY_MS));
|
||||
}
|
||||
|
||||
int hda_dsp_ipc4_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
||||
{
|
||||
struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
|
||||
@ -88,6 +114,8 @@ int hda_dsp_ipc4_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
||||
snd_sof_dsp_write(sdev, HDA_DSP_BAR, HDA_DSP_REG_HIPCI,
|
||||
msg_data->primary | HDA_DSP_REG_HIPCI_BUSY);
|
||||
|
||||
hda_dsp_ipc4_schedule_d0i3_work(hdev, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -919,6 +919,8 @@ irqreturn_t cnl_ipc4_irq_thread(int irq, void *context);
|
||||
int cnl_ipc4_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg);
|
||||
irqreturn_t hda_dsp_ipc4_irq_thread(int irq, void *context);
|
||||
bool hda_ipc4_tx_is_busy(struct snd_sof_dev *sdev);
|
||||
void hda_dsp_ipc4_schedule_d0i3_work(struct sof_intel_hda_dev *hdev,
|
||||
struct snd_sof_ipc_msg *msg);
|
||||
int hda_dsp_ipc4_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg);
|
||||
void hda_ipc4_dump(struct snd_sof_dev *sdev);
|
||||
extern struct sdw_intel_ops sdw_callback;
|
||||
|
@ -110,6 +110,8 @@ static int mtl_ipc_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *ms
|
||||
snd_sof_dsp_write(sdev, HDA_DSP_BAR, MTL_DSP_REG_HFIPCXIDR,
|
||||
msg_data->primary | MTL_DSP_REG_HFIPCXIDR_BUSY);
|
||||
|
||||
hda_dsp_ipc4_schedule_d0i3_work(hdev, msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user