mirror of
https://github.com/torvalds/linux.git
synced 2024-12-05 02:23:16 +00:00
ASoC: SOF: misc updates for 6.7
Merge series from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>: New PCI ID, one fix for a delayed IRQ thread causing issues, one update for debug and one follow-up cleanup for the .remove callback.
This commit is contained in:
commit
85045a9e44
@ -575,7 +575,7 @@ unregister_dev:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS(amd_sof_acp_probe, SND_SOC_SOF_AMD_COMMON);
|
EXPORT_SYMBOL_NS(amd_sof_acp_probe, SND_SOC_SOF_AMD_COMMON);
|
||||||
|
|
||||||
int amd_sof_acp_remove(struct snd_sof_dev *sdev)
|
void amd_sof_acp_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct acp_dev_data *adata = sdev->pdata->hw_pdata;
|
struct acp_dev_data *adata = sdev->pdata->hw_pdata;
|
||||||
|
|
||||||
@ -588,7 +588,7 @@ int amd_sof_acp_remove(struct snd_sof_dev *sdev)
|
|||||||
if (adata->dmic_dev)
|
if (adata->dmic_dev)
|
||||||
platform_device_unregister(adata->dmic_dev);
|
platform_device_unregister(adata->dmic_dev);
|
||||||
|
|
||||||
return acp_reset(sdev);
|
acp_reset(sdev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_NS(amd_sof_acp_remove, SND_SOC_SOF_AMD_COMMON);
|
EXPORT_SYMBOL_NS(amd_sof_acp_remove, SND_SOC_SOF_AMD_COMMON);
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
|
|||||||
|
|
||||||
/* ACP device probe/remove */
|
/* ACP device probe/remove */
|
||||||
int amd_sof_acp_probe(struct snd_sof_dev *sdev);
|
int amd_sof_acp_probe(struct snd_sof_dev *sdev);
|
||||||
int amd_sof_acp_remove(struct snd_sof_dev *sdev);
|
void amd_sof_acp_remove(struct snd_sof_dev *sdev);
|
||||||
|
|
||||||
/* DSP Loader callbacks */
|
/* DSP Loader callbacks */
|
||||||
int acp_sof_dsp_run(struct snd_sof_dev *sdev);
|
int acp_sof_dsp_run(struct snd_sof_dev *sdev);
|
||||||
|
@ -338,7 +338,7 @@ exit_unroll_pm:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx8_remove(struct snd_sof_dev *sdev)
|
static void imx8_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct imx8_priv *priv = sdev->pdata->hw_pdata;
|
struct imx8_priv *priv = sdev->pdata->hw_pdata;
|
||||||
int i;
|
int i;
|
||||||
@ -350,8 +350,6 @@ static int imx8_remove(struct snd_sof_dev *sdev)
|
|||||||
device_link_del(priv->link[i]);
|
device_link_del(priv->link[i]);
|
||||||
dev_pm_domain_detach(priv->pd_dev[i], false);
|
dev_pm_domain_detach(priv->pd_dev[i], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||||
|
@ -269,14 +269,12 @@ exit_pdev_unregister:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx8m_remove(struct snd_sof_dev *sdev)
|
static void imx8m_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct imx8m_priv *priv = sdev->pdata->hw_pdata;
|
struct imx8m_priv *priv = sdev->pdata->hw_pdata;
|
||||||
|
|
||||||
imx8_disable_clocks(sdev, priv->clks);
|
imx8_disable_clocks(sdev, priv->clks);
|
||||||
platform_device_unregister(priv->ipc_dev);
|
platform_device_unregister(priv->ipc_dev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||||
|
@ -278,14 +278,12 @@ exit_pdev_unregister:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx8ulp_remove(struct snd_sof_dev *sdev)
|
static void imx8ulp_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct imx8ulp_priv *priv = sdev->pdata->hw_pdata;
|
struct imx8ulp_priv *priv = sdev->pdata->hw_pdata;
|
||||||
|
|
||||||
imx8_disable_clocks(sdev, priv->clks);
|
imx8_disable_clocks(sdev, priv->clks);
|
||||||
platform_device_unregister(priv->ipc_dev);
|
platform_device_unregister(priv->ipc_dev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
/* on i.MX8 there is 1 to 1 match between type and BAR idx */
|
||||||
|
@ -100,11 +100,9 @@ static int byt_resume(struct snd_sof_dev *sdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_remove(struct snd_sof_dev *sdev)
|
static void byt_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
byt_reset_dsp_disable_int(sdev);
|
byt_reset_dsp_disable_int(sdev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_acpi_probe(struct snd_sof_dev *sdev)
|
static int byt_acpi_probe(struct snd_sof_dev *sdev)
|
||||||
|
@ -699,6 +699,9 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* make sure that no irq handler is pending before shutdown */
|
||||||
|
synchronize_irq(sdev->ipc_irq);
|
||||||
|
|
||||||
hda_codec_jack_wake_enable(sdev, runtime_suspend);
|
hda_codec_jack_wake_enable(sdev, runtime_suspend);
|
||||||
|
|
||||||
/* power down all hda links */
|
/* power down all hda links */
|
||||||
|
@ -1317,7 +1317,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hda_dsp_remove(struct snd_sof_dev *sdev)
|
void hda_dsp_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
|
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
|
||||||
const struct sof_intel_dsp_desc *chip = hda->desc;
|
const struct sof_intel_dsp_desc *chip = hda->desc;
|
||||||
@ -1377,8 +1377,6 @@ skip_disable_dsp:
|
|||||||
sof_hda_bus_exit(sdev);
|
sof_hda_bus_exit(sdev);
|
||||||
|
|
||||||
hda_codec_i915_exit(sdev);
|
hda_codec_i915_exit(sdev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int hda_power_down_dsp(struct snd_sof_dev *sdev)
|
int hda_power_down_dsp(struct snd_sof_dev *sdev)
|
||||||
|
@ -577,7 +577,7 @@ struct sof_intel_hda_stream {
|
|||||||
* DSP Core services.
|
* DSP Core services.
|
||||||
*/
|
*/
|
||||||
int hda_dsp_probe(struct snd_sof_dev *sdev);
|
int hda_dsp_probe(struct snd_sof_dev *sdev);
|
||||||
int hda_dsp_remove(struct snd_sof_dev *sdev);
|
void hda_dsp_remove(struct snd_sof_dev *sdev);
|
||||||
int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask);
|
int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask);
|
||||||
int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask);
|
int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask);
|
||||||
int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask);
|
int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask);
|
||||||
|
@ -50,9 +50,40 @@ static const struct sof_dev_desc mtl_desc = {
|
|||||||
.ops_free = hda_ops_free,
|
.ops_free = hda_ops_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct sof_dev_desc arl_desc = {
|
||||||
|
.use_acpi_target_states = true,
|
||||||
|
.machines = snd_soc_acpi_intel_arl_machines,
|
||||||
|
.alt_machines = snd_soc_acpi_intel_arl_sdw_machines,
|
||||||
|
.resindex_lpe_base = 0,
|
||||||
|
.resindex_pcicfg_base = -1,
|
||||||
|
.resindex_imr_base = -1,
|
||||||
|
.irqindex_host_ipc = -1,
|
||||||
|
.chip_info = &mtl_chip_info,
|
||||||
|
.ipc_supported_mask = BIT(SOF_IPC_TYPE_4),
|
||||||
|
.ipc_default = SOF_IPC_TYPE_4,
|
||||||
|
.dspless_mode_supported = true, /* Only supported for HDaudio */
|
||||||
|
.default_fw_path = {
|
||||||
|
[SOF_IPC_TYPE_4] = "intel/sof-ipc4/arl",
|
||||||
|
},
|
||||||
|
.default_lib_path = {
|
||||||
|
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/arl",
|
||||||
|
},
|
||||||
|
.default_tplg_path = {
|
||||||
|
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||||
|
},
|
||||||
|
.default_fw_filename = {
|
||||||
|
[SOF_IPC_TYPE_4] = "sof-arl.ri",
|
||||||
|
},
|
||||||
|
.nocodec_tplg_filename = "sof-arl-nocodec.tplg",
|
||||||
|
.ops = &sof_mtl_ops,
|
||||||
|
.ops_init = sof_mtl_ops_init,
|
||||||
|
.ops_free = hda_ops_free,
|
||||||
|
};
|
||||||
|
|
||||||
/* PCI IDs */
|
/* PCI IDs */
|
||||||
static const struct pci_device_id sof_pci_ids[] = {
|
static const struct pci_device_id sof_pci_ids[] = {
|
||||||
{ PCI_DEVICE_DATA(INTEL, HDA_MTL, &mtl_desc) },
|
{ PCI_DEVICE_DATA(INTEL, HDA_MTL, &mtl_desc) },
|
||||||
|
{ PCI_DEVICE_DATA(INTEL, HDA_ARL_S, &arl_desc) },
|
||||||
{ 0, }
|
{ 0, }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||||
|
@ -666,6 +666,10 @@ static void sof_ipc4_rx_msg(struct snd_sof_dev *sdev)
|
|||||||
sof_ipc4_log_header(sdev->dev, "ipc rx done ", ipc4_msg, true);
|
sof_ipc4_log_header(sdev->dev, "ipc rx done ", ipc4_msg, true);
|
||||||
|
|
||||||
if (data_size) {
|
if (data_size) {
|
||||||
|
if (sof_debug_check_flag(SOF_DBG_DUMP_IPC_MESSAGE_PAYLOAD))
|
||||||
|
sof_ipc4_dump_payload(sdev, ipc4_msg->data_ptr,
|
||||||
|
ipc4_msg->data_size);
|
||||||
|
|
||||||
kfree(ipc4_msg->data_ptr);
|
kfree(ipc4_msg->data_ptr);
|
||||||
ipc4_msg->data_ptr = NULL;
|
ipc4_msg->data_ptr = NULL;
|
||||||
ipc4_msg->data_size = 0;
|
ipc4_msg->data_size = 0;
|
||||||
|
@ -391,7 +391,7 @@ err_adsp_off:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt8186_dsp_remove(struct snd_sof_dev *sdev)
|
static void mt8186_dsp_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct adsp_priv *priv = sdev->pdata->hw_pdata;
|
struct adsp_priv *priv = sdev->pdata->hw_pdata;
|
||||||
|
|
||||||
@ -399,8 +399,6 @@ static int mt8186_dsp_remove(struct snd_sof_dev *sdev)
|
|||||||
mt8186_sof_hifixdsp_shutdown(sdev);
|
mt8186_sof_hifixdsp_shutdown(sdev);
|
||||||
adsp_sram_power_off(sdev);
|
adsp_sram_power_off(sdev);
|
||||||
mt8186_adsp_clock_off(sdev);
|
mt8186_adsp_clock_off(sdev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt8186_dsp_shutdown(struct snd_sof_dev *sdev)
|
static int mt8186_dsp_shutdown(struct snd_sof_dev *sdev)
|
||||||
|
@ -388,7 +388,7 @@ static int mt8195_dsp_shutdown(struct snd_sof_dev *sdev)
|
|||||||
return snd_sof_suspend(sdev->dev);
|
return snd_sof_suspend(sdev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt8195_dsp_remove(struct snd_sof_dev *sdev)
|
static void mt8195_dsp_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
||||||
struct adsp_priv *priv = sdev->pdata->hw_pdata;
|
struct adsp_priv *priv = sdev->pdata->hw_pdata;
|
||||||
@ -396,8 +396,6 @@ static int mt8195_dsp_remove(struct snd_sof_dev *sdev)
|
|||||||
platform_device_unregister(priv->ipc_dev);
|
platform_device_unregister(priv->ipc_dev);
|
||||||
adsp_sram_power_on(&pdev->dev, false);
|
adsp_sram_power_on(&pdev->dev, false);
|
||||||
adsp_clock_off(sdev);
|
adsp_clock_off(sdev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt8195_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
static int mt8195_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
||||||
|
@ -43,12 +43,10 @@ static inline int snd_sof_probe(struct snd_sof_dev *sdev)
|
|||||||
return sof_ops(sdev)->probe(sdev);
|
return sof_ops(sdev)->probe(sdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int snd_sof_remove(struct snd_sof_dev *sdev)
|
static inline void snd_sof_remove(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
if (sof_ops(sdev)->remove)
|
if (sof_ops(sdev)->remove)
|
||||||
return sof_ops(sdev)->remove(sdev);
|
sof_ops(sdev)->remove(sdev);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int snd_sof_shutdown(struct snd_sof_dev *sdev)
|
static inline int snd_sof_shutdown(struct snd_sof_dev *sdev)
|
||||||
|
@ -166,7 +166,7 @@ struct snd_sof_dsp_ops {
|
|||||||
|
|
||||||
/* probe/remove/shutdown */
|
/* probe/remove/shutdown */
|
||||||
int (*probe)(struct snd_sof_dev *sof_dev); /* mandatory */
|
int (*probe)(struct snd_sof_dev *sof_dev); /* mandatory */
|
||||||
int (*remove)(struct snd_sof_dev *sof_dev); /* optional */
|
void (*remove)(struct snd_sof_dev *sof_dev); /* optional */
|
||||||
int (*shutdown)(struct snd_sof_dev *sof_dev); /* optional */
|
int (*shutdown)(struct snd_sof_dev *sof_dev); /* optional */
|
||||||
|
|
||||||
/* DSP core boot / reset */
|
/* DSP core boot / reset */
|
||||||
|
Loading…
Reference in New Issue
Block a user