Commit c414d5df authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown

ASoC: SOF: Add ops for core_get and core_put

Add ops to get/put a core that will be used to power
up/down a core along with incrementing/decrementing
its ref_count.
Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211119192621.4096077-4-kai.vehmanen@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5974f684
...@@ -103,6 +103,69 @@ static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev, ...@@ -103,6 +103,69 @@ static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev,
return ret; return ret;
} }
static inline int snd_sof_dsp_core_get(struct snd_sof_dev *sdev, int core)
{
if (core > sdev->num_cores - 1) {
dev_err(sdev->dev, "invalid core id: %d for num_cores: %d\n", core,
sdev->num_cores);
return -EINVAL;
}
if (sof_ops(sdev)->core_get) {
int ret;
/* if current ref_count is > 0, increment it and return */
if (sdev->dsp_core_ref_count[core] > 0) {
sdev->dsp_core_ref_count[core]++;
return 0;
}
/* power up the core */
ret = sof_ops(sdev)->core_get(sdev, core);
if (ret < 0)
return ret;
/* increment ref_count */
sdev->dsp_core_ref_count[core]++;
/* and update enabled_cores_mask */
sdev->enabled_cores_mask |= BIT(core);
dev_dbg(sdev->dev, "Core %d powered up\n", core);
}
return 0;
}
static inline int snd_sof_dsp_core_put(struct snd_sof_dev *sdev, int core)
{
if (core > sdev->num_cores - 1) {
dev_err(sdev->dev, "invalid core id: %d for num_cores: %d\n", core,
sdev->num_cores);
return -EINVAL;
}
if (sof_ops(sdev)->core_put) {
int ret;
/* decrement ref_count and return if it is > 0 */
if (--(sdev->dsp_core_ref_count[core]) > 0)
return 0;
/* power down the core */
ret = sof_ops(sdev)->core_put(sdev, core);
if (ret < 0)
return ret;
/* and update enabled_cores_mask */
sdev->enabled_cores_mask &= ~BIT(core);
dev_dbg(sdev->dev, "Core %d powered down\n", core);
}
return 0;
}
/* pre/post fw load */ /* pre/post fw load */
static inline int snd_sof_dsp_pre_fw_run(struct snd_sof_dev *sdev) static inline int snd_sof_dsp_pre_fw_run(struct snd_sof_dev *sdev)
{ {
......
...@@ -134,6 +134,8 @@ struct snd_sof_dsp_ops { ...@@ -134,6 +134,8 @@ struct snd_sof_dsp_ops {
unsigned int core_mask); /* optional */ unsigned int core_mask); /* optional */
int (*core_power_down)(struct snd_sof_dev *sof_dev, int (*core_power_down)(struct snd_sof_dev *sof_dev,
unsigned int core_mask); /* optional */ unsigned int core_mask); /* optional */
int (*core_get)(struct snd_sof_dev *sof_dev, int core); /* optional */
int (*core_put)(struct snd_sof_dev *sof_dev, int core); /* optional */
/* /*
* Register IO: only used by respective drivers themselves, * Register IO: only used by respective drivers themselves,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment