Commit 8a49cd11 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Takashi Iwai

ASoC: SOF: ACPI: avoid reverse module dependency

The SOF-ACPI driver is backwards from the normal Linux model, it has a
generic driver that knows about all the specific drivers, as opposed to
having hardware specific drivers that link against a common framework.

This requires ugly Kconfig magic and leads to missed dependencies as
seen in this link error:

arm-linux-gnueabi-ld: sound/soc/sof/sof-pci-dev.o: in function `sof_acpi_probe':
sof-pci-dev.c:(.text+0x1c): undefined reference to `snd_intel_dsp_driver_probe'

Change it to use the normal probe order of starting with a specific
device in a driver, turning the sof-acpi-dev.c driver into a
library (exported symbols are name-spaced to avoid symbol pollution).

For backwards-compatibility with previous Kconfigs, the default values
for platform drivers uses the top-level ACPI configurations. The
modules were also renamed to allow for gradual transitions in test
scripts.
Co-developed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarBard Liao <bard.liao@intel.com>
Acked-by: default avatarMark Brown <broonie@kernel.org>
Acked-by: default avatarVinod Koul <vkoul@kernel.org>
Link: https://lore.kernel.org/r/20210302003125.1178419-3-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c7929b15
...@@ -23,15 +23,17 @@ config SND_SOC_SOF_PCI ...@@ -23,15 +23,17 @@ config SND_SOC_SOF_PCI
config SND_SOC_SOF_ACPI config SND_SOC_SOF_ACPI
tristate "SOF ACPI enumeration support" tristate "SOF ACPI enumeration support"
depends on ACPI || COMPILE_TEST depends on ACPI || COMPILE_TEST
select SND_SOC_SOF
select SND_SOC_ACPI if ACPI
select IOSF_MBI if X86 && PCI
help help
This adds support for ACPI enumeration. This option is required This adds support for ACPI enumeration. This option is required
to enable Intel Broadwell/Baytrail/Cherrytrail devices. to enable Intel Broadwell/Baytrail/Cherrytrail devices.
For backwards-compatibility with previous configurations the selection will
be used as default for platform-specific drivers.
Say Y if you need this option. Say Y if you need this option.
If unsure select "N". If unsure select "N".
config SND_SOC_SOF_ACPI_DEV
tristate
config SND_SOC_SOF_OF config SND_SOC_SOF_OF
tristate "SOF OF enumeration support" tristate "SOF OF enumeration support"
depends on OF || COMPILE_TEST depends on OF || COMPILE_TEST
......
...@@ -14,7 +14,7 @@ obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o ...@@ -14,7 +14,7 @@ obj-$(CONFIG_SND_SOC_SOF) += snd-sof.o
obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o obj-$(CONFIG_SND_SOC_SOF_NOCODEC) += snd-sof-nocodec.o
obj-$(CONFIG_SND_SOC_SOF_ACPI) += snd-sof-acpi.o obj-$(CONFIG_SND_SOC_SOF_ACPI_DEV) += snd-sof-acpi.o
obj-$(CONFIG_SND_SOC_SOF_OF) += snd-sof-of.o obj-$(CONFIG_SND_SOC_SOF_OF) += snd-sof-of.o
obj-$(CONFIG_SND_SOC_SOF_PCI) += snd-sof-pci.o obj-$(CONFIG_SND_SOC_SOF_PCI) += snd-sof-pci.o
......
...@@ -9,14 +9,6 @@ config SND_SOC_SOF_INTEL_TOPLEVEL ...@@ -9,14 +9,6 @@ config SND_SOC_SOF_INTEL_TOPLEVEL
if SND_SOC_SOF_INTEL_TOPLEVEL if SND_SOC_SOF_INTEL_TOPLEVEL
config SND_SOC_SOF_INTEL_ACPI
def_tristate SND_SOC_SOF_ACPI
select SND_SOC_SOF_BAYTRAIL if SND_SOC_SOF_BAYTRAIL_SUPPORT
select SND_SOC_SOF_BROADWELL if SND_SOC_SOF_BROADWELL_SUPPORT
help
This option is not user-selectable but automagically handled by
'select' statements at a higher level.
config SND_SOC_SOF_INTEL_PCI config SND_SOC_SOF_INTEL_PCI
def_tristate SND_SOC_SOF_PCI def_tristate SND_SOC_SOF_PCI
select SND_SOC_SOF_MERRIFIELD if SND_SOC_SOF_MERRIFIELD_SUPPORT select SND_SOC_SOF_MERRIFIELD if SND_SOC_SOF_MERRIFIELD_SUPPORT
...@@ -50,18 +42,25 @@ config SND_SOC_SOF_INTEL_ATOM_HIFI_EP ...@@ -50,18 +42,25 @@ config SND_SOC_SOF_INTEL_ATOM_HIFI_EP
config SND_SOC_SOF_INTEL_COMMON config SND_SOC_SOF_INTEL_COMMON
tristate tristate
select SND_SOC_SOF
select SND_SOC_ACPI_INTEL_MATCH select SND_SOC_ACPI_INTEL_MATCH
select SND_SOC_SOF_XTENSA select SND_SOC_SOF_XTENSA
select SND_SOC_INTEL_MACH select SND_SOC_INTEL_MACH
select SND_SOC_ACPI if ACPI select SND_SOC_ACPI if ACPI
select SND_INTEL_DSP_CONFIG
help help
This option is not user-selectable but automagically handled by This option is not user-selectable but automagically handled by
'select' statements at a higher level. 'select' statements at a higher level.
if SND_SOC_SOF_INTEL_ACPI if SND_SOC_SOF_ACPI
config SND_SOC_SOF_BAYTRAIL_SUPPORT config SND_SOC_SOF_BAYTRAIL
bool "SOF support for Baytrail, Braswell and Cherrytrail" tristate "SOF support for Baytrail, Braswell and Cherrytrail"
default SND_SOC_SOF_ACPI
select SND_SOC_SOF_INTEL_COMMON
select SND_SOC_SOF_INTEL_ATOM_HIFI_EP
select SND_SOC_SOF_ACPI_DEV
select IOSF_MBI if X86 && PCI
help help
This adds support for Sound Open Firmware for Intel(R) platforms This adds support for Sound Open Firmware for Intel(R) platforms
using the Baytrail, Braswell or Cherrytrail processors. using the Baytrail, Braswell or Cherrytrail processors.
...@@ -75,17 +74,12 @@ config SND_SOC_SOF_BAYTRAIL_SUPPORT ...@@ -75,17 +74,12 @@ config SND_SOC_SOF_BAYTRAIL_SUPPORT
Say Y if you want to enable SOF on Baytrail/Cherrytrail. Say Y if you want to enable SOF on Baytrail/Cherrytrail.
If unsure select "N". If unsure select "N".
config SND_SOC_SOF_BAYTRAIL config SND_SOC_SOF_BROADWELL
tristate tristate "SOF support for Broadwell"
select SND_SOC_SOF_INTEL_ATOM_HIFI_EP default SND_SOC_SOF_ACPI
select SND_INTEL_DSP_CONFIG select SND_SOC_SOF_INTEL_COMMON
help select SND_SOC_SOF_INTEL_HIFI_EP_IPC
This option is not user-selectable but automagically handled by select SND_SOC_SOF_ACPI_DEV
'select' statements at a higher level.
config SND_SOC_SOF_BROADWELL_SUPPORT
bool "SOF support for Broadwell"
select SND_INTEL_DSP_CONFIG
help help
This adds support for Sound Open Firmware for Intel(R) platforms This adds support for Sound Open Firmware for Intel(R) platforms
using the Broadwell processors. using the Broadwell processors.
...@@ -100,15 +94,7 @@ config SND_SOC_SOF_BROADWELL_SUPPORT ...@@ -100,15 +94,7 @@ config SND_SOC_SOF_BROADWELL_SUPPORT
Say Y if you want to enable SOF on Broadwell. Say Y if you want to enable SOF on Broadwell.
If unsure select "N". If unsure select "N".
config SND_SOC_SOF_BROADWELL endif ## SND_SOC_SOF_ACPI
tristate
select SND_SOC_SOF_INTEL_COMMON
select SND_SOC_SOF_INTEL_HIFI_EP_IPC
help
This option is not user-selectable but automagically handled by
'select' statements at a higher level.
endif ## SND_SOC_SOF_INTEL_ACPI
if SND_SOC_SOF_INTEL_PCI if SND_SOC_SOF_INTEL_PCI
......
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) # SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
snd-sof-intel-byt-objs := byt.o snd-sof-acpi-intel-byt-objs := byt.o
snd-sof-intel-bdw-objs := bdw.o snd-sof-acpi-intel-bdw-objs := bdw.o
snd-sof-intel-ipc-objs := intel-ipc.o snd-sof-intel-ipc-objs := intel-ipc.o
...@@ -13,8 +13,8 @@ snd-sof-intel-hda-common-$(CONFIG_SND_SOC_SOF_HDA_PROBES) += hda-compress.o ...@@ -13,8 +13,8 @@ snd-sof-intel-hda-common-$(CONFIG_SND_SOC_SOF_HDA_PROBES) += hda-compress.o
snd-sof-intel-hda-objs := hda-codec.o snd-sof-intel-hda-objs := hda-codec.o
obj-$(CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP) += snd-sof-intel-byt.o obj-$(CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP) += snd-sof-acpi-intel-byt.o
obj-$(CONFIG_SND_SOC_SOF_BROADWELL) += snd-sof-intel-bdw.o obj-$(CONFIG_SND_SOC_SOF_BROADWELL) += snd-sof-acpi-intel-bdw.o
obj-$(CONFIG_SND_SOC_SOF_INTEL_HIFI_EP_IPC) += snd-sof-intel-ipc.o obj-$(CONFIG_SND_SOC_SOF_INTEL_HIFI_EP_IPC) += snd-sof-intel-ipc.o
obj-$(CONFIG_SND_SOC_SOF_HDA_COMMON) += snd-sof-intel-hda-common.o obj-$(CONFIG_SND_SOC_SOF_HDA_COMMON) += snd-sof-intel-hda-common.o
obj-$(CONFIG_SND_SOC_SOF_HDA) += snd-sof-intel-hda.o obj-$(CONFIG_SND_SOC_SOF_HDA) += snd-sof-intel-hda.o
...@@ -15,8 +15,12 @@ ...@@ -15,8 +15,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <sound/sof.h> #include <sound/sof.h>
#include <sound/sof/xtensa.h> #include <sound/sof/xtensa.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
#include <sound/intel-dsp-config.h>
#include "../ops.h" #include "../ops.h"
#include "shim.h" #include "shim.h"
#include "../sof-acpi-dev.h"
#include "../sof-audio.h" #include "../sof-audio.h"
/* BARs */ /* BARs */
...@@ -590,7 +594,7 @@ static struct snd_soc_dai_driver bdw_dai[] = { ...@@ -590,7 +594,7 @@ static struct snd_soc_dai_driver bdw_dai[] = {
}; };
/* broadwell ops */ /* broadwell ops */
const struct snd_sof_dsp_ops sof_bdw_ops = { static const struct snd_sof_dsp_ops sof_bdw_ops = {
/*Device init */ /*Device init */
.probe = bdw_probe, .probe = bdw_probe,
...@@ -651,14 +655,69 @@ const struct snd_sof_dsp_ops sof_bdw_ops = { ...@@ -651,14 +655,69 @@ const struct snd_sof_dsp_ops sof_bdw_ops = {
.arch_ops = &sof_xtensa_arch_ops, .arch_ops = &sof_xtensa_arch_ops,
}; };
EXPORT_SYMBOL_NS(sof_bdw_ops, SND_SOC_SOF_BROADWELL);
const struct sof_intel_dsp_desc bdw_chip_info = { static const struct sof_intel_dsp_desc bdw_chip_info = {
.cores_num = 1, .cores_num = 1,
.host_managed_cores_mask = 1, .host_managed_cores_mask = 1,
}; };
EXPORT_SYMBOL_NS(bdw_chip_info, SND_SOC_SOF_BROADWELL);
static const struct sof_dev_desc sof_acpi_broadwell_desc = {
.machines = snd_soc_acpi_intel_broadwell_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = -1,
.irqindex_host_ipc = 0,
.chip_info = &bdw_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-bdw.ri",
.nocodec_tplg_filename = "sof-bdw-nocodec.tplg",
.ops = &sof_bdw_ops,
};
static const struct acpi_device_id sof_broadwell_match[] = {
{ "INT3438", (unsigned long)&sof_acpi_broadwell_desc },
{ }
};
MODULE_DEVICE_TABLE(acpi, sof_broadwell_match);
static int sof_broadwell_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
const struct acpi_device_id *id;
const struct sof_dev_desc *desc;
int ret;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return -ENODEV;
ret = snd_intel_acpi_dsp_driver_probe(dev, id->id);
if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) {
dev_dbg(dev, "SOF ACPI driver not selected, aborting probe\n");
return -ENODEV;
}
desc = device_get_match_data(dev);
if (!desc)
return -ENODEV;
return sof_acpi_probe(pdev, device_get_match_data(dev));
}
/* acpi_driver definition */
static struct platform_driver snd_sof_acpi_intel_bdw_driver = {
.probe = sof_broadwell_probe,
.remove = sof_acpi_remove,
.driver = {
.name = "sof-audio-acpi-intel-bdw",
.pm = &sof_acpi_pm,
.acpi_match_table = sof_broadwell_match,
},
};
module_platform_driver(snd_sof_acpi_intel_bdw_driver);
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC); MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA); MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
...@@ -15,8 +15,12 @@ ...@@ -15,8 +15,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <sound/sof.h> #include <sound/sof.h>
#include <sound/sof/xtensa.h> #include <sound/sof/xtensa.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
#include <sound/intel-dsp-config.h>
#include "../ops.h" #include "../ops.h"
#include "shim.h" #include "shim.h"
#include "../sof-acpi-dev.h"
#include "../sof-audio.h" #include "../sof-audio.h"
#include "../../intel/common/soc-intel-quirks.h" #include "../../intel/common/soc-intel-quirks.h"
...@@ -822,7 +826,7 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev) ...@@ -822,7 +826,7 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev)
} }
/* baytrail ops */ /* baytrail ops */
const struct snd_sof_dsp_ops sof_byt_ops = { static const struct snd_sof_dsp_ops sof_byt_ops = {
/* device init */ /* device init */
.probe = byt_acpi_probe, .probe = byt_acpi_probe,
.remove = byt_remove, .remove = byt_remove,
...@@ -892,16 +896,14 @@ const struct snd_sof_dsp_ops sof_byt_ops = { ...@@ -892,16 +896,14 @@ const struct snd_sof_dsp_ops sof_byt_ops = {
.arch_ops = &sof_xtensa_arch_ops, .arch_ops = &sof_xtensa_arch_ops,
}; };
EXPORT_SYMBOL_NS(sof_byt_ops, SND_SOC_SOF_BAYTRAIL);
const struct sof_intel_dsp_desc byt_chip_info = { static const struct sof_intel_dsp_desc byt_chip_info = {
.cores_num = 1, .cores_num = 1,
.host_managed_cores_mask = 1, .host_managed_cores_mask = 1,
}; };
EXPORT_SYMBOL_NS(byt_chip_info, SND_SOC_SOF_BAYTRAIL);
/* cherrytrail and braswell ops */ /* cherrytrail and braswell ops */
const struct snd_sof_dsp_ops sof_cht_ops = { static const struct snd_sof_dsp_ops sof_cht_ops = {
/* device init */ /* device init */
.probe = byt_acpi_probe, .probe = byt_acpi_probe,
.remove = byt_remove, .remove = byt_remove,
...@@ -972,16 +974,104 @@ const struct snd_sof_dsp_ops sof_cht_ops = { ...@@ -972,16 +974,104 @@ const struct snd_sof_dsp_ops sof_cht_ops = {
.arch_ops = &sof_xtensa_arch_ops, .arch_ops = &sof_xtensa_arch_ops,
}; };
EXPORT_SYMBOL_NS(sof_cht_ops, SND_SOC_SOF_BAYTRAIL);
const struct sof_intel_dsp_desc cht_chip_info = { static const struct sof_intel_dsp_desc cht_chip_info = {
.cores_num = 1, .cores_num = 1,
.host_managed_cores_mask = 1, .host_managed_cores_mask = 1,
}; };
EXPORT_SYMBOL_NS(cht_chip_info, SND_SOC_SOF_BAYTRAIL);
/* BYTCR uses different IRQ index */
static const struct sof_dev_desc sof_acpi_baytrailcr_desc = {
.machines = snd_soc_acpi_intel_baytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 0,
.chip_info = &byt_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-byt.ri",
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
.ops = &sof_byt_ops,
};
static const struct sof_dev_desc sof_acpi_baytrail_desc = {
.machines = snd_soc_acpi_intel_baytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 5,
.chip_info = &byt_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-byt.ri",
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
.ops = &sof_byt_ops,
};
static const struct sof_dev_desc sof_acpi_cherrytrail_desc = {
.machines = snd_soc_acpi_intel_cherrytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 5,
.chip_info = &cht_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-cht.ri",
.nocodec_tplg_filename = "sof-cht-nocodec.tplg",
.ops = &sof_cht_ops,
};
static const struct acpi_device_id sof_baytrail_match[] = {
{ "80860F28", (unsigned long)&sof_acpi_baytrail_desc },
{ "808622A8", (unsigned long)&sof_acpi_cherrytrail_desc },
{ }
};
MODULE_DEVICE_TABLE(acpi, sof_baytrail_match);
static int sof_baytrail_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
const struct sof_dev_desc *desc;
const struct acpi_device_id *id;
int ret;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return -ENODEV;
ret = snd_intel_acpi_dsp_driver_probe(dev, id->id);
if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) {
dev_dbg(dev, "SOF ACPI driver not selected, aborting probe\n");
return -ENODEV;
}
desc = device_get_match_data(&pdev->dev);
if (!desc)
return -ENODEV;
if (desc == &sof_acpi_baytrail_desc && soc_intel_is_byt_cr(pdev))
desc = &sof_acpi_baytrailcr_desc;
return sof_acpi_probe(pdev, desc);
}
/* acpi_driver definition */
static struct platform_driver snd_sof_acpi_intel_byt_driver = {
.probe = sof_baytrail_probe,
.remove = sof_acpi_remove,
.driver = {
.name = "sof-audio-acpi-intel-byt",
.pm = &sof_acpi_pm,
.acpi_match_table = sof_baytrail_match,
},
};
module_platform_driver(snd_sof_acpi_intel_byt_driver);
#endif /* CONFIG_SND_SOC_SOF_BAYTRAIL */ #endif /* CONFIG_SND_SOC_SOF_BAYTRAIL */
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC); MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA); MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
...@@ -167,13 +167,7 @@ struct sof_intel_dsp_desc { ...@@ -167,13 +167,7 @@ struct sof_intel_dsp_desc {
}; };
extern const struct snd_sof_dsp_ops sof_tng_ops; extern const struct snd_sof_dsp_ops sof_tng_ops;
extern const struct snd_sof_dsp_ops sof_byt_ops;
extern const struct snd_sof_dsp_ops sof_cht_ops;
extern const struct snd_sof_dsp_ops sof_bdw_ops;
extern const struct sof_intel_dsp_desc byt_chip_info;
extern const struct sof_intel_dsp_desc cht_chip_info;
extern const struct sof_intel_dsp_desc bdw_chip_info;
extern const struct sof_intel_dsp_desc tng_chip_info; extern const struct sof_intel_dsp_desc tng_chip_info;
struct sof_intel_stream { struct sof_intel_stream {
......
...@@ -12,12 +12,12 @@ ...@@ -12,12 +12,12 @@
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <sound/intel-dsp-config.h>
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h> #include <sound/soc-acpi-intel-match.h>
#include <sound/sof.h> #include <sound/sof.h>
#include "../intel/common/soc-intel-quirks.h" #include "../intel/common/soc-intel-quirks.h"
#include "ops.h" #include "ops.h"
#include "sof-acpi-dev.h"
/* platform specific devices */ /* platform specific devices */
#include "intel/shim.h" #include "intel/shim.h"
...@@ -36,74 +36,12 @@ MODULE_PARM_DESC(sof_acpi_debug, "SOF ACPI debug options (0x0 all off)"); ...@@ -36,74 +36,12 @@ MODULE_PARM_DESC(sof_acpi_debug, "SOF ACPI debug options (0x0 all off)");
#define SOF_ACPI_DISABLE_PM_RUNTIME BIT(0) #define SOF_ACPI_DISABLE_PM_RUNTIME BIT(0)
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL) const struct dev_pm_ops sof_acpi_pm = {
static const struct sof_dev_desc sof_acpi_broadwell_desc = {
.machines = snd_soc_acpi_intel_broadwell_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = -1,
.irqindex_host_ipc = 0,
.chip_info = &bdw_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-bdw.ri",
.nocodec_tplg_filename = "sof-bdw-nocodec.tplg",
.ops = &sof_bdw_ops,
};
#endif
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
/* BYTCR uses different IRQ index */
static const struct sof_dev_desc sof_acpi_baytrailcr_desc = {
.machines = snd_soc_acpi_intel_baytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 0,
.chip_info = &byt_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-byt.ri",
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
.ops = &sof_byt_ops,
};
static const struct sof_dev_desc sof_acpi_baytrail_desc = {
.machines = snd_soc_acpi_intel_baytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 5,
.chip_info = &byt_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-byt.ri",
.nocodec_tplg_filename = "sof-byt-nocodec.tplg",
.ops = &sof_byt_ops,
};
static const struct sof_dev_desc sof_acpi_cherrytrail_desc = {
.machines = snd_soc_acpi_intel_cherrytrail_machines,
.resindex_lpe_base = 0,
.resindex_pcicfg_base = 1,
.resindex_imr_base = 2,
.irqindex_host_ipc = 5,
.chip_info = &cht_chip_info,
.default_fw_path = "intel/sof",
.default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-cht.ri",
.nocodec_tplg_filename = "sof-cht-nocodec.tplg",
.ops = &sof_cht_ops,
};
#endif
static const struct dev_pm_ops sof_acpi_pm = {
SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume) SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume)
SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume, SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume,
snd_sof_runtime_idle) snd_sof_runtime_idle)
}; };
EXPORT_SYMBOL_NS(sof_acpi_pm, SND_SOC_SOF_ACPI_DEV);
static void sof_acpi_probe_complete(struct device *dev) static void sof_acpi_probe_complete(struct device *dev)
{ {
...@@ -118,41 +56,19 @@ static void sof_acpi_probe_complete(struct device *dev) ...@@ -118,41 +56,19 @@ static void sof_acpi_probe_complete(struct device *dev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
} }
static int sof_acpi_probe(struct platform_device *pdev) int sof_acpi_probe(struct platform_device *pdev, const struct sof_dev_desc *desc)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
const struct acpi_device_id *id;
const struct sof_dev_desc *desc;
struct snd_sof_pdata *sof_pdata; struct snd_sof_pdata *sof_pdata;
const struct snd_sof_dsp_ops *ops; const struct snd_sof_dsp_ops *ops;
int ret; int ret;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return -ENODEV;
if (IS_REACHABLE(CONFIG_SND_INTEL_DSP_CONFIG)) {
ret = snd_intel_acpi_dsp_driver_probe(dev, id->id);
if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) {
dev_dbg(dev, "SOF ACPI driver not selected, aborting probe\n");
return -ENODEV;
}
}
dev_dbg(dev, "ACPI DSP detected"); dev_dbg(dev, "ACPI DSP detected");
sof_pdata = devm_kzalloc(dev, sizeof(*sof_pdata), GFP_KERNEL); sof_pdata = devm_kzalloc(dev, sizeof(*sof_pdata), GFP_KERNEL);
if (!sof_pdata) if (!sof_pdata)
return -ENOMEM; return -ENOMEM;
desc = device_get_match_data(dev);
if (!desc)
return -ENODEV;
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
if (desc == &sof_acpi_baytrail_desc && soc_intel_is_byt_cr(pdev))
desc = &sof_acpi_baytrailcr_desc;
#endif
/* get ops for platform */ /* get ops for platform */
ops = desc->ops; ops = desc->ops;
if (!ops) { if (!ops) {
...@@ -194,44 +110,20 @@ static int sof_acpi_probe(struct platform_device *pdev) ...@@ -194,44 +110,20 @@ static int sof_acpi_probe(struct platform_device *pdev)
return ret; return ret;
} }
EXPORT_SYMBOL_NS(sof_acpi_probe, SND_SOC_SOF_ACPI_DEV);
static int sof_acpi_remove(struct platform_device *pdev) int sof_acpi_remove(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev;
if (!(sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME)) if (!(sof_acpi_debug & SOF_ACPI_DISABLE_PM_RUNTIME))
pm_runtime_disable(&pdev->dev); pm_runtime_disable(dev);
/* call sof helper for DSP hardware remove */ /* call sof helper for DSP hardware remove */
snd_sof_device_remove(&pdev->dev); snd_sof_device_remove(dev);
return 0; return 0;
} }
EXPORT_SYMBOL_NS(sof_acpi_remove, SND_SOC_SOF_ACPI_DEV);
#ifdef CONFIG_ACPI
static const struct acpi_device_id sof_acpi_match[] = {
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BROADWELL)
{ "INT3438", (unsigned long)&sof_acpi_broadwell_desc },
#endif
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
{ "80860F28", (unsigned long)&sof_acpi_baytrail_desc },
{ "808622A8", (unsigned long)&sof_acpi_cherrytrail_desc },
#endif
{ }
};
MODULE_DEVICE_TABLE(acpi, sof_acpi_match);
#endif
/* acpi_driver definition */
static struct platform_driver snd_sof_acpi_driver = {
.probe = sof_acpi_probe,
.remove = sof_acpi_remove,
.driver = {
.name = "sof-audio-acpi",
.pm = &sof_acpi_pm,
.acpi_match_table = ACPI_PTR(sof_acpi_match),
},
};
module_platform_driver(snd_sof_acpi_driver);
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
MODULE_IMPORT_NS(SND_SOC_SOF_BAYTRAIL);
MODULE_IMPORT_NS(SND_SOC_SOF_BROADWELL);
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
/*
* This file is provided under a dual BSD/GPLv2 license. When using or
* redistributing this file, you may do so under either license.
*
* Copyright(c) 2021 Intel Corporation. All rights reserved.
*/
#ifndef __SOUND_SOC_SOF_ACPI_H
#define __SOUND_SOC_SOF_ACPI_H
extern const struct dev_pm_ops sof_acpi_pm;
int sof_acpi_probe(struct platform_device *pdev, const struct sof_dev_desc *desc);
int sof_acpi_remove(struct platform_device *pdev);
#endif
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