sound fixes for 5.12-rc2
Slightly bulky changes are seen at this time, mostly for dealing with the messed up Kconfig for ASoC Intel SOF stuff. The driver and its code was split to each module per platform now, which is far more straightforward. This should cover the randconfig problems, and more importantly, improve the actual device handling as well. Other than that, nothing particular stands out: the HDMI PCM assignment fix for Intel Tigerlake, MIPS n64 error handling fix, and the usual suspects, HD-audio / USB-audio quirks. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmA/vC4OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/YGRAArAk7E5l5T7j8O6fCgTX7E9Bw4v367QFpfvB6 ECVlbnP8efbnpxmZsyKHg9ge2HYTEqapQfBt+jHZXwC2X6OsEQRFGcrAjjOaqxp8 y7nLDIzD7e98d52a4TFKgUVO4niXesXNUy6xwSJwCROw7ryMgiRxhW1NOTXjdCgO koGcRBKT+4Q/FE/LFAwoOWzZMEQEBO2iMX6HWyILzsSlEMqUZ1I6q7+e7t8uJ8Hw Y4zTAahc6niqmrxJVmJb7XPRGw4B3jdBUJ75/uK9tc/+DHPHrD8OHkjFQJaOiw+o pzlLOpZ2gk++MPWgC7pWRQX7g114fguQSlE+XznI/xV0VIzDQpmldE5Z1s2Is3ws Zo48/m0DI82O1TuO3tSeNpu/SnCLu/OKv2HB9RMT2QtlLqWFqZq11+n5K+xZH2DO 4A6q1Jra4FaL4UnqHvN4xjTA3Lm9fayR3I0mWygvNsFu4XIy5vqcsCRL7cna0WH2 2ddBcFf1VnhpNOBGx6JKzrcc5OI3XKD7ww2Du97+5wjXpeTQuL+3FZl1PH8Gx6/t GEsJpuhWZKeNSSl8aVzfon2GSh4ugMZ44iTIA0vePVZrQk+T3aQKZdoYOVe9zswp pqId9iVoP2s4P/eqCfZzkCvy2APGusOOn0AeUmLfeSXMBPYqIk9hfSzP2OtR8bgL +MXfCi8= =FOED -----END PGP SIGNATURE----- Merge tag 'sound-5.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Slightly bulky changes are seen at this time, mostly for dealing with the messed up Kconfig for ASoC Intel SOF stuff. The driver and its code was split to each module per platform now, which is far more straightforward. This should cover the randconfig problems, and more importantly, improve the actual device handling as well. Other than that, nothing particular stands out: the HDMI PCM assignment fix for Intel Tigerlake, MIPS n64 error handling fix, and the usual suspects, HD-audio / USB-audio quirks" * tag 'sound-5.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (21 commits) ALSA: hda/realtek: Apply dual codec quirks for MSI Godlike X570 board ALSA: hda/realtek: Add quirk for Intel NUC 10 ALSA: hda/hdmi: let new platforms assign the pcm slot dynamically ALSA: hda/realtek: Add quirk for Clevo NH55RZQ ALSA: hda: intel-sdw-acpi: add missing include files ALSA: hda: move Intel SoundWire ACPI scan to dedicated module ASoC: SOF: Intel: SoundWire: simplify Kconfig ASoC: SOF: pci: move DSP_CONFIG use to platform-specific drivers ASoC: SOF: pci: split PCI into different drivers ASoC: SOF: ACPI: avoid reverse module dependency ASoC: soc-acpi: allow for partial match in parent name ALSA: hda: intel-nhlt: verify config type ALSA: hda: fix kernel-doc warnings ALSA: usb-audio: Fix Pioneer DJM devices URB_CONTROL request direction to set samplerate ALSA: usb-audio: use Corsair Virtuoso mapping for Corsair Virtuoso SE ALSA: hda/realtek: Enable headset mic of Acer SWIFT with ALC256 ALSA: ctxfi: cthw20k2: fix mask on conf to allow 4 bits ALSA: usb-audio: Allow modifying parameters with succeeding hw_params calls ALSA: usb-audio: Drop bogus dB range in too low level ALSA: usb-audio: Don't abort even if the clock rate differs ...
This commit is contained in:
Коммит
43df5242af
|
@ -48,8 +48,6 @@ struct sdw_intel {
|
|||
#endif
|
||||
};
|
||||
|
||||
#define SDW_INTEL_QUIRK_MASK_BUS_DISABLE BIT(1)
|
||||
|
||||
int intel_master_startup(struct platform_device *pdev);
|
||||
int intel_master_process_wakeen_event(struct platform_device *pdev);
|
||||
|
||||
|
|
|
@ -18,42 +18,12 @@
|
|||
#include "cadence_master.h"
|
||||
#include "intel.h"
|
||||
|
||||
#define SDW_LINK_TYPE 4 /* from Intel ACPI documentation */
|
||||
#define SDW_MAX_LINKS 4
|
||||
#define SDW_SHIM_LCAP 0x0
|
||||
#define SDW_SHIM_BASE 0x2C000
|
||||
#define SDW_ALH_BASE 0x2C800
|
||||
#define SDW_LINK_BASE 0x30000
|
||||
#define SDW_LINK_SIZE 0x10000
|
||||
|
||||
static int ctrl_link_mask;
|
||||
module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444);
|
||||
MODULE_PARM_DESC(sdw_link_mask, "Intel link mask (one bit per link)");
|
||||
|
||||
static bool is_link_enabled(struct fwnode_handle *fw_node, int i)
|
||||
{
|
||||
struct fwnode_handle *link;
|
||||
char name[32];
|
||||
u32 quirk_mask = 0;
|
||||
|
||||
/* Find master handle */
|
||||
snprintf(name, sizeof(name),
|
||||
"mipi-sdw-link-%d-subproperties", i);
|
||||
|
||||
link = fwnode_get_named_child_node(fw_node, name);
|
||||
if (!link)
|
||||
return false;
|
||||
|
||||
fwnode_property_read_u32(link,
|
||||
"intel-quirk-mask",
|
||||
&quirk_mask);
|
||||
|
||||
if (quirk_mask & SDW_INTEL_QUIRK_MASK_BUS_DISABLE)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int sdw_intel_cleanup(struct sdw_intel_ctx *ctx)
|
||||
{
|
||||
struct sdw_intel_link_res *link = ctx->links;
|
||||
|
@ -81,74 +51,6 @@ static int sdw_intel_cleanup(struct sdw_intel_ctx *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
int ret, i;
|
||||
u8 count;
|
||||
|
||||
if (acpi_bus_get_device(info->handle, &adev))
|
||||
return -EINVAL;
|
||||
|
||||
/* Found controller, find links supported */
|
||||
count = 0;
|
||||
ret = fwnode_property_read_u8_array(acpi_fwnode_handle(adev),
|
||||
"mipi-sdw-master-count", &count, 1);
|
||||
|
||||
/*
|
||||
* In theory we could check the number of links supported in
|
||||
* hardware, but in that step we cannot assume SoundWire IP is
|
||||
* powered.
|
||||
*
|
||||
* In addition, if the BIOS doesn't even provide this
|
||||
* 'master-count' property then all the inits based on link
|
||||
* masks will fail as well.
|
||||
*
|
||||
* We will check the hardware capabilities in the startup() step
|
||||
*/
|
||||
|
||||
if (ret) {
|
||||
dev_err(&adev->dev,
|
||||
"Failed to read mipi-sdw-master-count: %d\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Check count is within bounds */
|
||||
if (count > SDW_MAX_LINKS) {
|
||||
dev_err(&adev->dev, "Link count %d exceeds max %d\n",
|
||||
count, SDW_MAX_LINKS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
dev_warn(&adev->dev, "No SoundWire links detected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dev_dbg(&adev->dev, "ACPI reports %d SDW Link devices\n", count);
|
||||
|
||||
info->count = count;
|
||||
info->link_mask = 0;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (ctrl_link_mask && !(ctrl_link_mask & BIT(i))) {
|
||||
dev_dbg(&adev->dev,
|
||||
"Link %d masked, will not be enabled\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_link_enabled(acpi_fwnode_handle(adev), i)) {
|
||||
dev_dbg(&adev->dev,
|
||||
"Link %d not selected in firmware\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
info->link_mask |= BIT(i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define HDA_DSP_REG_ADSPIC2 (0x10)
|
||||
#define HDA_DSP_REG_ADSPIS2 (0x14)
|
||||
#define HDA_DSP_REG_ADSPIC2_SNDW BIT(5)
|
||||
|
@ -357,66 +259,6 @@ sdw_intel_startup_controller(struct sdw_intel_ctx *ctx)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static acpi_status sdw_intel_acpi_cb(acpi_handle handle, u32 level,
|
||||
void *cdata, void **return_value)
|
||||
{
|
||||
struct sdw_intel_acpi_info *info = cdata;
|
||||
struct acpi_device *adev;
|
||||
acpi_status status;
|
||||
u64 adr;
|
||||
|
||||
status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr);
|
||||
if (ACPI_FAILURE(status))
|
||||
return AE_OK; /* keep going */
|
||||
|
||||
if (acpi_bus_get_device(handle, &adev)) {
|
||||
pr_err("%s: Couldn't find ACPI handle\n", __func__);
|
||||
return AE_NOT_FOUND;
|
||||
}
|
||||
|
||||
info->handle = handle;
|
||||
|
||||
/*
|
||||
* On some Intel platforms, multiple children of the HDAS
|
||||
* device can be found, but only one of them is the SoundWire
|
||||
* controller. The SNDW device is always exposed with
|
||||
* Name(_ADR, 0x40000000), with bits 31..28 representing the
|
||||
* SoundWire link so filter accordingly
|
||||
*/
|
||||
if (FIELD_GET(GENMASK(31, 28), adr) != SDW_LINK_TYPE)
|
||||
return AE_OK; /* keep going */
|
||||
|
||||
/* device found, stop namespace walk */
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
/**
|
||||
* sdw_intel_acpi_scan() - SoundWire Intel init routine
|
||||
* @parent_handle: ACPI parent handle
|
||||
* @info: description of what firmware/DSDT tables expose
|
||||
*
|
||||
* This scans the namespace and queries firmware to figure out which
|
||||
* links to enable. A follow-up use of sdw_intel_probe() and
|
||||
* sdw_intel_startup() is required for creation of devices and bus
|
||||
* startup
|
||||
*/
|
||||
int sdw_intel_acpi_scan(acpi_handle *parent_handle,
|
||||
struct sdw_intel_acpi_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
info->handle = NULL;
|
||||
status = acpi_walk_namespace(ACPI_TYPE_DEVICE,
|
||||
parent_handle, 1,
|
||||
sdw_intel_acpi_cb,
|
||||
NULL, info, NULL);
|
||||
if (ACPI_FAILURE(status) || info->handle == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
return sdw_intel_scan_controller(info);
|
||||
}
|
||||
EXPORT_SYMBOL_NS(sdw_intel_acpi_scan, SOUNDWIRE_INTEL_INIT);
|
||||
|
||||
/**
|
||||
* sdw_intel_probe() - SoundWire Intel probe routine
|
||||
* @res: resource data
|
||||
|
|
|
@ -187,4 +187,6 @@ void sdw_intel_enable_irq(void __iomem *mmio_base, bool enable);
|
|||
|
||||
irqreturn_t sdw_intel_thread(int irq, void *dev_id);
|
||||
|
||||
#define SDW_INTEL_QUIRK_MASK_BUS_DISABLE BIT(1)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -112,6 +112,11 @@ struct nhlt_vendor_dmic_array_config {
|
|||
/* TODO add vendor mic config */
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
NHLT_CONFIG_TYPE_GENERIC = 0,
|
||||
NHLT_CONFIG_TYPE_MIC_ARRAY = 1
|
||||
};
|
||||
|
||||
enum {
|
||||
NHLT_MIC_ARRAY_2CH_SMALL = 0xa,
|
||||
NHLT_MIC_ARRAY_2CH_BIG = 0xb,
|
||||
|
|
|
@ -174,7 +174,7 @@ struct snd_soc_acpi_codecs {
|
|||
static inline bool snd_soc_acpi_sof_parent(struct device *dev)
|
||||
{
|
||||
return dev->parent && dev->parent->driver && dev->parent->driver->name &&
|
||||
!strcmp(dev->parent->driver->name, "sof-audio-acpi");
|
||||
!strncmp(dev->parent->driver->name, "sof-audio-acpi", strlen("sof-audio-acpi"));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -44,9 +44,13 @@ config SND_INTEL_NHLT
|
|||
config SND_INTEL_DSP_CONFIG
|
||||
tristate
|
||||
select SND_INTEL_NHLT if ACPI
|
||||
select SND_INTEL_SOUNDWIRE_ACPI if ACPI
|
||||
# this config should be selected only for Intel DSP platforms.
|
||||
# A fallback is provided so that the code compiles in all cases.
|
||||
|
||||
config SND_INTEL_SOUNDWIRE_ACPI
|
||||
tristate
|
||||
|
||||
config SND_INTEL_BYT_PREFER_SOF
|
||||
bool "Prefer SOF driver over SST on BY/CHT platforms"
|
||||
depends on SND_SST_ATOM_HIFI2_PLATFORM_ACPI && SND_SOC_SOF_BAYTRAIL
|
||||
|
|
|
@ -17,3 +17,6 @@ obj-$(CONFIG_SND_HDA_EXT_CORE) += ext/
|
|||
snd-intel-dspcfg-objs := intel-dsp-config.o
|
||||
snd-intel-dspcfg-$(CONFIG_SND_INTEL_NHLT) += intel-nhlt.o
|
||||
obj-$(CONFIG_SND_INTEL_DSP_CONFIG) += snd-intel-dspcfg.o
|
||||
|
||||
snd-intel-sdw-acpi-objs := intel-sdw-acpi.o
|
||||
obj-$(CONFIG_SND_INTEL_SOUNDWIRE_ACPI) += snd-intel-sdw-acpi.o
|
||||
|
|
|
@ -133,7 +133,7 @@ void snd_hdac_link_free_all(struct hdac_bus *bus)
|
|||
EXPORT_SYMBOL_GPL(snd_hdac_link_free_all);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_bus_get_link_index - get link based on codec name
|
||||
* snd_hdac_ext_bus_get_link - get link based on codec name
|
||||
* @bus: the pointer to HDAC bus object
|
||||
* @codec_name: codec name
|
||||
*/
|
||||
|
|
|
@ -133,7 +133,7 @@ void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
|
|||
EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_decouple);
|
||||
|
||||
/**
|
||||
* snd_hdac_ext_linkstream_start - start a stream
|
||||
* snd_hdac_ext_link_stream_start - start a stream
|
||||
* @stream: HD-audio ext core stream to start
|
||||
*/
|
||||
void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *stream)
|
||||
|
|
|
@ -386,7 +386,7 @@ int snd_hdac_regmap_init(struct hdac_device *codec)
|
|||
EXPORT_SYMBOL_GPL(snd_hdac_regmap_init);
|
||||
|
||||
/**
|
||||
* snd_hdac_regmap_init - Release the regmap from HDA codec
|
||||
* snd_hdac_regmap_exit - Release the regmap from HDA codec
|
||||
* @codec: the codec object
|
||||
*/
|
||||
void snd_hdac_regmap_exit(struct hdac_device *codec)
|
||||
|
|
|
@ -557,4 +557,4 @@ EXPORT_SYMBOL_GPL(snd_intel_acpi_dsp_driver_probe);
|
|||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("Intel DSP config driver");
|
||||
MODULE_IMPORT_NS(SOUNDWIRE_INTEL_INIT);
|
||||
MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
|
||||
|
|
|
@ -31,18 +31,44 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
|
|||
struct nhlt_endpoint *epnt;
|
||||
struct nhlt_dmic_array_config *cfg;
|
||||
struct nhlt_vendor_dmic_array_config *cfg_vendor;
|
||||
struct nhlt_fmt *fmt_configs;
|
||||
unsigned int dmic_geo = 0;
|
||||
u8 j;
|
||||
u16 max_ch = 0;
|
||||
u8 i, j;
|
||||
|
||||
if (!nhlt)
|
||||
return 0;
|
||||
|
||||
epnt = (struct nhlt_endpoint *)nhlt->desc;
|
||||
for (j = 0, epnt = nhlt->desc; j < nhlt->endpoint_count; j++,
|
||||
epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length)) {
|
||||
|
||||
for (j = 0; j < nhlt->endpoint_count; j++) {
|
||||
if (epnt->linktype == NHLT_LINK_DMIC) {
|
||||
cfg = (struct nhlt_dmic_array_config *)
|
||||
(epnt->config.caps);
|
||||
if (epnt->linktype != NHLT_LINK_DMIC)
|
||||
continue;
|
||||
|
||||
cfg = (struct nhlt_dmic_array_config *)(epnt->config.caps);
|
||||
fmt_configs = (struct nhlt_fmt *)(epnt->config.caps + epnt->config.size);
|
||||
|
||||
/* find max number of channels based on format_configuration */
|
||||
if (fmt_configs->fmt_count) {
|
||||
dev_dbg(dev, "%s: found %d format definitions\n",
|
||||
__func__, fmt_configs->fmt_count);
|
||||
|
||||
for (i = 0; i < fmt_configs->fmt_count; i++) {
|
||||
struct wav_fmt_ext *fmt_ext;
|
||||
|
||||
fmt_ext = &fmt_configs->fmt_config[i].fmt_ext;
|
||||
|
||||
if (fmt_ext->fmt.channels > max_ch)
|
||||
max_ch = fmt_ext->fmt.channels;
|
||||
}
|
||||
dev_dbg(dev, "%s: max channels found %d\n", __func__, max_ch);
|
||||
} else {
|
||||
dev_dbg(dev, "%s: No format information found\n", __func__);
|
||||
}
|
||||
|
||||
if (cfg->device_config.config_type != NHLT_CONFIG_TYPE_MIC_ARRAY) {
|
||||
dmic_geo = max_ch;
|
||||
} else {
|
||||
switch (cfg->array_type) {
|
||||
case NHLT_MIC_ARRAY_2CH_SMALL:
|
||||
case NHLT_MIC_ARRAY_2CH_BIG:
|
||||
|
@ -59,13 +85,23 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
|
|||
dmic_geo = cfg_vendor->nb_mics;
|
||||
break;
|
||||
default:
|
||||
dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
|
||||
cfg->array_type);
|
||||
dev_warn(dev, "%s: undefined DMIC array_type 0x%0x\n",
|
||||
__func__, cfg->array_type);
|
||||
}
|
||||
|
||||
if (dmic_geo > 0) {
|
||||
dev_dbg(dev, "%s: Array with %d dmics\n", __func__, dmic_geo);
|
||||
}
|
||||
if (max_ch > dmic_geo) {
|
||||
dev_dbg(dev, "%s: max channels %d exceed dmic number %d\n",
|
||||
__func__, max_ch, dmic_geo);
|
||||
}
|
||||
}
|
||||
epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s: dmic number %d max_ch %d\n",
|
||||
__func__, dmic_geo, max_ch);
|
||||
|
||||
return dmic_geo;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
|
||||
|
|
|
@ -0,0 +1,179 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
|
||||
// Copyright(c) 2015-2021 Intel Corporation.
|
||||
|
||||
/*
|
||||
* SDW Intel ACPI scan helpers
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fwnode.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/soundwire/sdw_intel.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#define SDW_LINK_TYPE 4 /* from Intel ACPI documentation */
|
||||
#define SDW_MAX_LINKS 4
|
||||
|
||||
static int ctrl_link_mask;
|
||||
module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444);
|
||||
MODULE_PARM_DESC(sdw_link_mask, "Intel link mask (one bit per link)");
|
||||
|
||||
static bool is_link_enabled(struct fwnode_handle *fw_node, int i)
|
||||
{
|
||||
struct fwnode_handle *link;
|
||||
char name[32];
|
||||
u32 quirk_mask = 0;
|
||||
|
||||
/* Find master handle */
|
||||
snprintf(name, sizeof(name),
|
||||
"mipi-sdw-link-%d-subproperties", i);
|
||||
|
||||
link = fwnode_get_named_child_node(fw_node, name);
|
||||
if (!link)
|
||||
return false;
|
||||
|
||||
fwnode_property_read_u32(link,
|
||||
"intel-quirk-mask",
|
||||
&quirk_mask);
|
||||
|
||||
if (quirk_mask & SDW_INTEL_QUIRK_MASK_BUS_DISABLE)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int
|
||||
sdw_intel_scan_controller(struct sdw_intel_acpi_info *info)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
int ret, i;
|
||||
u8 count;
|
||||
|
||||
if (acpi_bus_get_device(info->handle, &adev))
|
||||
return -EINVAL;
|
||||
|
||||
/* Found controller, find links supported */
|
||||
count = 0;
|
||||
ret = fwnode_property_read_u8_array(acpi_fwnode_handle(adev),
|
||||
"mipi-sdw-master-count", &count, 1);
|
||||
|
||||
/*
|
||||
* In theory we could check the number of links supported in
|
||||
* hardware, but in that step we cannot assume SoundWire IP is
|
||||
* powered.
|
||||
*
|
||||
* In addition, if the BIOS doesn't even provide this
|
||||
* 'master-count' property then all the inits based on link
|
||||
* masks will fail as well.
|
||||
*
|
||||
* We will check the hardware capabilities in the startup() step
|
||||
*/
|
||||
|
||||
if (ret) {
|
||||
dev_err(&adev->dev,
|
||||
"Failed to read mipi-sdw-master-count: %d\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Check count is within bounds */
|
||||
if (count > SDW_MAX_LINKS) {
|
||||
dev_err(&adev->dev, "Link count %d exceeds max %d\n",
|
||||
count, SDW_MAX_LINKS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!count) {
|
||||
dev_warn(&adev->dev, "No SoundWire links detected\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dev_dbg(&adev->dev, "ACPI reports %d SDW Link devices\n", count);
|
||||
|
||||
info->count = count;
|
||||
info->link_mask = 0;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (ctrl_link_mask && !(ctrl_link_mask & BIT(i))) {
|
||||
dev_dbg(&adev->dev,
|
||||
"Link %d masked, will not be enabled\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is_link_enabled(acpi_fwnode_handle(adev), i)) {
|
||||
dev_dbg(&adev->dev,
|
||||
"Link %d not selected in firmware\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
info->link_mask |= BIT(i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static acpi_status sdw_intel_acpi_cb(acpi_handle handle, u32 level,
|
||||
void *cdata, void **return_value)
|
||||
{
|
||||
struct sdw_intel_acpi_info *info = cdata;
|
||||
struct acpi_device *adev;
|
||||
acpi_status status;
|
||||
u64 adr;
|
||||
|
||||
status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &adr);
|
||||
if (ACPI_FAILURE(status))
|
||||
return AE_OK; /* keep going */
|
||||
|
||||
if (acpi_bus_get_device(handle, &adev)) {
|
||||
pr_err("%s: Couldn't find ACPI handle\n", __func__);
|
||||
return AE_NOT_FOUND;
|
||||
}
|
||||
|
||||
info->handle = handle;
|
||||
|
||||
/*
|
||||
* On some Intel platforms, multiple children of the HDAS
|
||||
* device can be found, but only one of them is the SoundWire
|
||||
* controller. The SNDW device is always exposed with
|
||||
* Name(_ADR, 0x40000000), with bits 31..28 representing the
|
||||
* SoundWire link so filter accordingly
|
||||
*/
|
||||
if (FIELD_GET(GENMASK(31, 28), adr) != SDW_LINK_TYPE)
|
||||
return AE_OK; /* keep going */
|
||||
|
||||
/* device found, stop namespace walk */
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
/**
|
||||
* sdw_intel_acpi_scan() - SoundWire Intel init routine
|
||||
* @parent_handle: ACPI parent handle
|
||||
* @info: description of what firmware/DSDT tables expose
|
||||
*
|
||||
* This scans the namespace and queries firmware to figure out which
|
||||
* links to enable. A follow-up use of sdw_intel_probe() and
|
||||
* sdw_intel_startup() is required for creation of devices and bus
|
||||
* startup
|
||||
*/
|
||||
int sdw_intel_acpi_scan(acpi_handle *parent_handle,
|
||||
struct sdw_intel_acpi_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
info->handle = NULL;
|
||||
status = acpi_walk_namespace(ACPI_TYPE_DEVICE,
|
||||
parent_handle, 1,
|
||||
sdw_intel_acpi_cb,
|
||||
NULL, info, NULL);
|
||||
if (ACPI_FAILURE(status) || info->handle == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
return sdw_intel_scan_controller(info);
|
||||
}
|
||||
EXPORT_SYMBOL_NS(sdw_intel_acpi_scan, SND_INTEL_SOUNDWIRE_ACPI);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("Intel Soundwire ACPI helpers");
|
|
@ -312,14 +312,14 @@ static int __init n64audio_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
priv->mi_reg_base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (!priv->mi_reg_base) {
|
||||
err = -EINVAL;
|
||||
if (IS_ERR(priv->mi_reg_base)) {
|
||||
err = PTR_ERR(priv->mi_reg_base);
|
||||
goto fail_dma_alloc;
|
||||
}
|
||||
|
||||
priv->ai_reg_base = devm_platform_ioremap_resource(pdev, 1);
|
||||
if (!priv->ai_reg_base) {
|
||||
err = -EINVAL;
|
||||
if (IS_ERR(priv->ai_reg_base)) {
|
||||
err = PTR_ERR(priv->ai_reg_base);
|
||||
goto fail_dma_alloc;
|
||||
}
|
||||
|
||||
|
|
|
@ -991,7 +991,7 @@ static int daio_mgr_dao_init(void *blk, unsigned int idx, unsigned int conf)
|
|||
|
||||
if (idx < 4) {
|
||||
/* S/PDIF output */
|
||||
switch ((conf & 0x7)) {
|
||||
switch ((conf & 0xf)) {
|
||||
case 1:
|
||||
set_field(&ctl->txctl[idx], ATXCTL_NUC, 0);
|
||||
break;
|
||||
|
|
|
@ -3483,7 +3483,7 @@ EXPORT_SYMBOL_GPL(snd_hda_check_amp_list_power);
|
|||
*/
|
||||
|
||||
/**
|
||||
* snd_hda_input_mux_info_info - Info callback helper for the input-mux enum
|
||||
* snd_hda_input_mux_info - Info callback helper for the input-mux enum
|
||||
* @imux: imux helper object
|
||||
* @uinfo: pointer to get/store the data
|
||||
*/
|
||||
|
@ -3506,7 +3506,7 @@ int snd_hda_input_mux_info(const struct hda_input_mux *imux,
|
|||
EXPORT_SYMBOL_GPL(snd_hda_input_mux_info);
|
||||
|
||||
/**
|
||||
* snd_hda_input_mux_info_put - Put callback helper for the input-mux enum
|
||||
* snd_hda_input_mux_put - Put callback helper for the input-mux enum
|
||||
* @codec: the HDA codec
|
||||
* @imux: imux helper object
|
||||
* @ucontrol: pointer to get/store the data
|
||||
|
@ -3941,7 +3941,7 @@ unsigned int snd_hda_correct_pin_ctl(struct hda_codec *codec,
|
|||
EXPORT_SYMBOL_GPL(snd_hda_correct_pin_ctl);
|
||||
|
||||
/**
|
||||
* _snd_hda_pin_ctl - Helper to set pin ctl value
|
||||
* _snd_hda_set_pin_ctl - Helper to set pin ctl value
|
||||
* @codec: the HDA codec
|
||||
* @pin: referred pin NID
|
||||
* @val: pin control value to set
|
||||
|
|
|
@ -3923,7 +3923,7 @@ static void vmaster_update_mute_led(void *private_data, int enabled)
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_dha_gen_add_mute_led_cdev - Create a LED classdev and enable as vmaster mute LED
|
||||
* snd_hda_gen_add_mute_led_cdev - Create a LED classdev and enable as vmaster mute LED
|
||||
* @codec: the HDA codec
|
||||
* @callback: the callback for LED classdev brightness_set_blocking
|
||||
*/
|
||||
|
@ -4074,7 +4074,7 @@ static int add_micmute_led_hook(struct hda_codec *codec)
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_dha_gen_add_micmute_led_cdev - Create a LED classdev and enable as mic-mute LED
|
||||
* snd_hda_gen_add_micmute_led_cdev - Create a LED classdev and enable as mic-mute LED
|
||||
* @codec: the HDA codec
|
||||
* @callback: the callback for LED classdev brightness_set_blocking
|
||||
*
|
||||
|
|
|
@ -213,7 +213,7 @@ static void jack_detect_update(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_hda_set_dirty_all - Mark all the cached as dirty
|
||||
* snd_hda_jack_set_dirty_all - Mark all the cached as dirty
|
||||
* @codec: the HDA codec
|
||||
*
|
||||
* This function sets the dirty flag to all entries of jack table.
|
||||
|
@ -293,7 +293,7 @@ find_callback_from_list(struct hda_jack_tbl *jack,
|
|||
}
|
||||
|
||||
/**
|
||||
* snd_hda_jack_detect_enable_mst - enable the jack-detection
|
||||
* snd_hda_jack_detect_enable_callback_mst - enable the jack-detection
|
||||
* @codec: the HDA codec
|
||||
* @nid: pin NID to enable
|
||||
* @func: callback function to register
|
||||
|
|
|
@ -2338,7 +2338,7 @@ static int dspio_send_scp_message(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/**
|
||||
* Prepare and send the SCP message to DSP
|
||||
* dspio_scp - Prepare and send the SCP message to DSP
|
||||
* @codec: the HDA codec
|
||||
* @mod_id: ID of the DSP module to send the command
|
||||
* @src_id: ID of the source
|
||||
|
@ -2865,7 +2865,7 @@ static int dsp_dma_stop(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/**
|
||||
* Allocate router ports
|
||||
* dsp_allocate_router_ports - Allocate router ports
|
||||
*
|
||||
* @codec: the HDA codec
|
||||
* @num_chans: number of channels in the stream
|
||||
|
@ -3178,8 +3178,7 @@ static int dspxfr_hci_write(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/**
|
||||
* Write a block of data into DSP code or data RAM using pre-allocated
|
||||
* DMA engine.
|
||||
* dspxfr_one_seg - Write a block of data into DSP code or data RAM using pre-allocated DMA engine.
|
||||
*
|
||||
* @codec: the HDA codec
|
||||
* @fls: pointer to a fast load image
|
||||
|
@ -3376,7 +3375,7 @@ static int dspxfr_one_seg(struct hda_codec *codec,
|
|||
}
|
||||
|
||||
/**
|
||||
* Write the entire DSP image of a DSP code/data overlay to DSP memories
|
||||
* dspxfr_image - Write the entire DSP image of a DSP code/data overlay to DSP memories
|
||||
*
|
||||
* @codec: the HDA codec
|
||||
* @fls_data: pointer to a fast load image
|
||||
|
|
|
@ -157,6 +157,7 @@ struct hdmi_spec {
|
|||
|
||||
bool dyn_pin_out;
|
||||
bool dyn_pcm_assign;
|
||||
bool dyn_pcm_no_legacy;
|
||||
bool intel_hsw_fixup; /* apply Intel platform-specific fixups */
|
||||
/*
|
||||
* Non-generic VIA/NVIDIA specific
|
||||
|
@ -1345,6 +1346,12 @@ static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
|
|||
{
|
||||
int i;
|
||||
|
||||
/* on the new machines, try to assign the pcm slot dynamically,
|
||||
* not use the preferred fixed map (legacy way) anymore.
|
||||
*/
|
||||
if (spec->dyn_pcm_no_legacy)
|
||||
goto last_try;
|
||||
|
||||
/*
|
||||
* generic_hdmi_build_pcms() may allocate extra PCMs on some
|
||||
* platforms (with maximum of 'num_nids + dev_num - 1')
|
||||
|
@ -1374,6 +1381,7 @@ static int hdmi_find_pcm_slot(struct hdmi_spec *spec,
|
|||
return i;
|
||||
}
|
||||
|
||||
last_try:
|
||||
/* the last try; check the empty slots in pins */
|
||||
for (i = 0; i < spec->num_nids; i++) {
|
||||
if (!test_bit(i, &spec->pcm_bitmap))
|
||||
|
@ -2987,8 +2995,16 @@ static int patch_i915_tgl_hdmi(struct hda_codec *codec)
|
|||
* the index indicate the port number.
|
||||
*/
|
||||
static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
|
||||
int ret;
|
||||
|
||||
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
|
||||
ret = intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
|
||||
if (!ret) {
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
|
||||
spec->dyn_pcm_no_legacy = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Intel Baytrail and Braswell; with eld notifier */
|
||||
|
|
|
@ -2532,6 +2532,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
|
||||
SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
|
||||
SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
|
||||
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
|
||||
|
@ -6396,6 +6397,7 @@ enum {
|
|||
ALC269_FIXUP_LEMOTE_A1802,
|
||||
ALC269_FIXUP_LEMOTE_A190X,
|
||||
ALC256_FIXUP_INTEL_NUC8_RUGGED,
|
||||
ALC256_FIXUP_INTEL_NUC10,
|
||||
ALC255_FIXUP_XIAOMI_HEADSET_MIC,
|
||||
ALC274_FIXUP_HP_MIC,
|
||||
ALC274_FIXUP_HP_HEADSET_MIC,
|
||||
|
@ -6406,6 +6408,7 @@ enum {
|
|||
ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
|
||||
ALC282_FIXUP_ACER_DISABLE_LINEOUT,
|
||||
ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
|
||||
ALC256_FIXUP_ACER_HEADSET_MIC,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -7782,6 +7785,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC256_FIXUP_INTEL_NUC10] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
|
@ -7853,6 +7865,16 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
|
||||
},
|
||||
[ALC256_FIXUP_ACER_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
|
||||
{ 0x1a, 0x90a1092f }, /* use as internal mic */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -7879,9 +7901,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
|
||||
SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
|
||||
SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
|
||||
|
@ -8128,6 +8152,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[5|7][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
|
@ -8222,6 +8247,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
|
||||
SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
|
||||
SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
|
||||
SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
|
||||
|
||||
#if 0
|
||||
/* Below is a quirk table taken from the old code.
|
||||
|
|
|
@ -9,29 +9,34 @@ config SND_SOC_SOF_TOPLEVEL
|
|||
|
||||
if SND_SOC_SOF_TOPLEVEL
|
||||
|
||||
config SND_SOC_SOF_PCI_DEV
|
||||
tristate
|
||||
|
||||
config SND_SOC_SOF_PCI
|
||||
tristate "SOF PCI enumeration support"
|
||||
depends on PCI
|
||||
select SND_SOC_SOF
|
||||
select SND_SOC_ACPI if ACPI
|
||||
help
|
||||
This adds support for PCI enumeration. This option is
|
||||
required to enable Intel Skylake+ 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.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ACPI
|
||||
tristate "SOF ACPI enumeration support"
|
||||
depends on ACPI || COMPILE_TEST
|
||||
select SND_SOC_SOF
|
||||
select SND_SOC_ACPI if ACPI
|
||||
select IOSF_MBI if X86 && PCI
|
||||
help
|
||||
This adds support for ACPI enumeration. This option is required
|
||||
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.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ACPI_DEV
|
||||
tristate
|
||||
|
||||
config SND_SOC_SOF_OF
|
||||
tristate "SOF OF enumeration support"
|
||||
depends on OF || COMPILE_TEST
|
||||
|
|
|
@ -14,9 +14,9 @@ obj-$(CONFIG_SND_SOC_SOF) += snd-sof.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_PCI) += snd-sof-pci.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_PCI_DEV) += snd-sof-pci.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL) += intel/
|
||||
obj-$(CONFIG_SND_SOC_SOF_IMX_TOPLEVEL) += imx/
|
||||
|
|
|
@ -9,31 +9,6 @@ config 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
|
||||
def_tristate SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_MERRIFIELD if SND_SOC_SOF_MERRIFIELD_SUPPORT
|
||||
select SND_SOC_SOF_APOLLOLAKE if SND_SOC_SOF_APOLLOLAKE_SUPPORT
|
||||
select SND_SOC_SOF_GEMINILAKE if SND_SOC_SOF_GEMINILAKE_SUPPORT
|
||||
select SND_SOC_SOF_CANNONLAKE if SND_SOC_SOF_CANNONLAKE_SUPPORT
|
||||
select SND_SOC_SOF_COFFEELAKE if SND_SOC_SOF_COFFEELAKE_SUPPORT
|
||||
select SND_SOC_SOF_ICELAKE if SND_SOC_SOF_ICELAKE_SUPPORT
|
||||
select SND_SOC_SOF_COMETLAKE if SND_SOC_SOF_COMETLAKE_SUPPORT
|
||||
select SND_SOC_SOF_TIGERLAKE if SND_SOC_SOF_TIGERLAKE_SUPPORT
|
||||
select SND_SOC_SOF_ELKHARTLAKE if SND_SOC_SOF_ELKHARTLAKE_SUPPORT
|
||||
select SND_SOC_SOF_JASPERLAKE if SND_SOC_SOF_JASPERLAKE_SUPPORT
|
||||
select SND_SOC_SOF_ALDERLAKE if SND_SOC_SOF_ALDERLAKE_SUPPORT
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_INTEL_HIFI_EP_IPC
|
||||
tristate
|
||||
help
|
||||
|
@ -50,18 +25,25 @@ config SND_SOC_SOF_INTEL_ATOM_HIFI_EP
|
|||
|
||||
config SND_SOC_SOF_INTEL_COMMON
|
||||
tristate
|
||||
select SND_SOC_SOF
|
||||
select SND_SOC_ACPI_INTEL_MATCH
|
||||
select SND_SOC_SOF_XTENSA
|
||||
select SND_SOC_INTEL_MACH
|
||||
select SND_SOC_ACPI if ACPI
|
||||
select SND_INTEL_DSP_CONFIG
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
if SND_SOC_SOF_INTEL_ACPI
|
||||
if SND_SOC_SOF_ACPI
|
||||
|
||||
config SND_SOC_SOF_BAYTRAIL_SUPPORT
|
||||
bool "SOF support for Baytrail, Braswell and Cherrytrail"
|
||||
config SND_SOC_SOF_BAYTRAIL
|
||||
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
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Baytrail, Braswell or Cherrytrail processors.
|
||||
|
@ -75,17 +57,12 @@ config SND_SOC_SOF_BAYTRAIL_SUPPORT
|
|||
Say Y if you want to enable SOF on Baytrail/Cherrytrail.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_BAYTRAIL
|
||||
tristate
|
||||
select SND_SOC_SOF_INTEL_ATOM_HIFI_EP
|
||||
select SND_INTEL_DSP_CONFIG
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_BROADWELL_SUPPORT
|
||||
bool "SOF support for Broadwell"
|
||||
select SND_INTEL_DSP_CONFIG
|
||||
config SND_SOC_SOF_BROADWELL
|
||||
tristate "SOF support for Broadwell"
|
||||
default SND_SOC_SOF_ACPI
|
||||
select SND_SOC_SOF_INTEL_COMMON
|
||||
select SND_SOC_SOF_INTEL_HIFI_EP_IPC
|
||||
select SND_SOC_SOF_ACPI_DEV
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Broadwell processors.
|
||||
|
@ -100,197 +77,143 @@ config SND_SOC_SOF_BROADWELL_SUPPORT
|
|||
Say Y if you want to enable SOF on Broadwell.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_BROADWELL
|
||||
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_ACPI
|
||||
|
||||
endif ## SND_SOC_SOF_INTEL_ACPI
|
||||
if SND_SOC_SOF_PCI
|
||||
|
||||
if SND_SOC_SOF_INTEL_PCI
|
||||
|
||||
config SND_SOC_SOF_MERRIFIELD_SUPPORT
|
||||
bool "SOF support for Tangier/Merrifield"
|
||||
config SND_SOC_SOF_MERRIFIELD
|
||||
tristate "SOF support for Tangier/Merrifield"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_ATOM_HIFI_EP
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Tangier/Merrifield processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_MERRIFIELD
|
||||
config SND_SOC_SOF_INTEL_APL
|
||||
tristate
|
||||
select SND_SOC_SOF_INTEL_ATOM_HIFI_EP
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
|
||||
config SND_SOC_SOF_APOLLOLAKE_SUPPORT
|
||||
bool "SOF support for Apollolake"
|
||||
config SND_SOC_SOF_APOLLOLAKE
|
||||
tristate "SOF support for Apollolake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_APL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Apollolake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_APOLLOLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_GEMINILAKE_SUPPORT
|
||||
bool "SOF support for GeminiLake"
|
||||
config SND_SOC_SOF_GEMINILAKE
|
||||
tristate "SOF support for GeminiLake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_APL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Geminilake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_GEMINILAKE
|
||||
config SND_SOC_SOF_INTEL_CNL
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
|
||||
config SND_SOC_SOF_CANNONLAKE_SUPPORT
|
||||
bool "SOF support for Cannonlake"
|
||||
config SND_SOC_SOF_CANNONLAKE
|
||||
tristate "SOF support for Cannonlake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_CNL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Cannonlake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_CANNONLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_COFFEELAKE_SUPPORT
|
||||
bool "SOF support for CoffeeLake"
|
||||
config SND_SOC_SOF_COFFEELAKE
|
||||
tristate "SOF support for CoffeeLake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_CNL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Coffeelake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_COFFEELAKE
|
||||
config SND_SOC_SOF_COMETLAKE
|
||||
tristate "SOF support for CometLake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_CNL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Cometlake processors.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_INTEL_ICL
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_ICELAKE_SUPPORT
|
||||
bool "SOF support for Icelake"
|
||||
config SND_SOC_SOF_ICELAKE
|
||||
tristate "SOF support for Icelake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_ICL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Icelake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ICELAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_COMETLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_COMETLAKE_SUPPORT
|
||||
bool
|
||||
|
||||
config SND_SOC_SOF_COMETLAKE_LP_SUPPORT
|
||||
bool "SOF support for CometLake"
|
||||
select SND_SOC_SOF_COMETLAKE_SUPPORT
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Cometlake processors.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_TIGERLAKE_SUPPORT
|
||||
bool "SOF support for Tigerlake"
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Tigerlake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_TIGERLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_ELKHARTLAKE_SUPPORT
|
||||
bool "SOF support for ElkhartLake"
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the ElkhartLake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ELKHARTLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_JASPERLAKE_SUPPORT
|
||||
bool "SOF support for JasperLake"
|
||||
config SND_SOC_SOF_JASPERLAKE
|
||||
tristate "SOF support for JasperLake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_ICL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the JasperLake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_JASPERLAKE
|
||||
config SND_SOC_SOF_INTEL_TGL
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
|
||||
config SND_SOC_SOF_ALDERLAKE_SUPPORT
|
||||
bool "SOF support for Alderlake"
|
||||
config SND_SOC_SOF_TIGERLAKE
|
||||
tristate "SOF support for Tigerlake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_TGL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Tigerlake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ELKHARTLAKE
|
||||
tristate "SOF support for ElkhartLake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_TGL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the ElkhartLake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ALDERLAKE
|
||||
tristate "SOF support for Alderlake"
|
||||
default SND_SOC_SOF_PCI
|
||||
select SND_SOC_SOF_INTEL_TGL
|
||||
help
|
||||
This adds support for Sound Open Firmware for Intel(R) platforms
|
||||
using the Alderlake processors.
|
||||
Say Y if you have such a device.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_ALDERLAKE
|
||||
tristate
|
||||
select SND_SOC_SOF_HDA_COMMON
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level
|
||||
|
||||
config SND_SOC_SOF_HDA_COMMON
|
||||
tristate
|
||||
select SND_INTEL_DSP_CONFIG
|
||||
select SND_SOC_SOF_INTEL_COMMON
|
||||
select SND_SOC_SOF_PCI_DEV
|
||||
select SND_INTEL_DSP_CONFIG
|
||||
select SND_SOC_SOF_HDA_LINK_BASELINE
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
|
@ -353,30 +276,23 @@ config SND_SOC_SOF_HDA
|
|||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_INTEL_SOUNDWIRE_LINK
|
||||
bool "SOF support for SoundWire"
|
||||
depends on ACPI
|
||||
config SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
tristate
|
||||
|
||||
config SND_SOC_SOF_INTEL_SOUNDWIRE
|
||||
tristate "SOF support for SoundWire"
|
||||
default SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
depends on SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
depends on ACPI && SOUNDWIRE
|
||||
depends on !(SOUNDWIRE=m && SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE=y)
|
||||
select SOUNDWIRE_INTEL
|
||||
select SND_INTEL_SOUNDWIRE_ACPI
|
||||
help
|
||||
This adds support for SoundWire with Sound Open Firmware
|
||||
for Intel(R) platforms.
|
||||
Say Y if you want to enable SoundWire links with SOF.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE
|
||||
tristate
|
||||
select SND_SOC_SOF_INTEL_SOUNDWIRE if SND_SOC_SOF_INTEL_SOUNDWIRE_LINK
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
config SND_SOC_SOF_INTEL_SOUNDWIRE
|
||||
tristate
|
||||
select SOUNDWIRE
|
||||
select SOUNDWIRE_INTEL
|
||||
help
|
||||
This option is not user-selectable but automagically handled by
|
||||
'select' statements at a higher level.
|
||||
|
||||
endif ## SND_SOC_SOF_INTEL_PCI
|
||||
|
||||
endif ## SND_SOC_SOF_INTEL_TOPLEVEL
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
|
||||
|
||||
snd-sof-intel-byt-objs := byt.o
|
||||
snd-sof-intel-bdw-objs := bdw.o
|
||||
snd-sof-acpi-intel-byt-objs := byt.o
|
||||
snd-sof-acpi-intel-bdw-objs := bdw.o
|
||||
|
||||
snd-sof-intel-ipc-objs := intel-ipc.o
|
||||
|
||||
|
@ -13,8 +13,20 @@ snd-sof-intel-hda-common-$(CONFIG_SND_SOC_SOF_HDA_PROBES) += hda-compress.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_BROADWELL) += snd-sof-intel-bdw.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP) += snd-sof-acpi-intel-byt.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_HDA_COMMON) += snd-sof-intel-hda-common.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_HDA) += snd-sof-intel-hda.o
|
||||
|
||||
snd-sof-pci-intel-tng-objs := pci-tng.o
|
||||
snd-sof-pci-intel-apl-objs := pci-apl.o
|
||||
snd-sof-pci-intel-cnl-objs := pci-cnl.o
|
||||
snd-sof-pci-intel-icl-objs := pci-icl.o
|
||||
snd-sof-pci-intel-tgl-objs := pci-tgl.o
|
||||
|
||||
obj-$(CONFIG_SND_SOC_SOF_MERRIFIELD) += snd-sof-pci-intel-tng.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_APL) += snd-sof-pci-intel-apl.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_CNL) += snd-sof-pci-intel-cnl.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_ICL) += snd-sof-pci-intel-icl.o
|
||||
obj-$(CONFIG_SND_SOC_SOF_INTEL_TGL) += snd-sof-pci-intel-tgl.o
|
||||
|
|
|
@ -15,8 +15,12 @@
|
|||
#include <linux/module.h>
|
||||
#include <sound/sof.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 "shim.h"
|
||||
#include "../sof-acpi-dev.h"
|
||||
#include "../sof-audio.h"
|
||||
|
||||
/* BARs */
|
||||
|
@ -590,7 +594,7 @@ static struct snd_soc_dai_driver bdw_dai[] = {
|
|||
};
|
||||
|
||||
/* broadwell ops */
|
||||
const struct snd_sof_dsp_ops sof_bdw_ops = {
|
||||
static const struct snd_sof_dsp_ops sof_bdw_ops = {
|
||||
/*Device init */
|
||||
.probe = bdw_probe,
|
||||
|
||||
|
@ -651,14 +655,69 @@ const struct snd_sof_dsp_ops sof_bdw_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,
|
||||
.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_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
|
||||
|
|
|
@ -15,8 +15,12 @@
|
|||
#include <linux/module.h>
|
||||
#include <sound/sof.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 "shim.h"
|
||||
#include "../sof-acpi-dev.h"
|
||||
#include "../sof-audio.h"
|
||||
#include "../../intel/common/soc-intel-quirks.h"
|
||||
|
||||
|
@ -822,7 +826,7 @@ irq:
|
|||
}
|
||||
|
||||
/* baytrail ops */
|
||||
const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||
static const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||
/* device init */
|
||||
.probe = byt_acpi_probe,
|
||||
.remove = byt_remove,
|
||||
|
@ -892,16 +896,14 @@ const struct snd_sof_dsp_ops sof_byt_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,
|
||||
.host_managed_cores_mask = 1,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(byt_chip_info, SND_SOC_SOF_BAYTRAIL);
|
||||
|
||||
/* 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 */
|
||||
.probe = byt_acpi_probe,
|
||||
.remove = byt_remove,
|
||||
|
@ -972,16 +974,104 @@ const struct snd_sof_dsp_ops sof_cht_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,
|
||||
.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 */
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
|
||||
|
|
|
@ -22,10 +22,12 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/soundwire/sdw_intel.h>
|
||||
#include <sound/intel-dsp-config.h>
|
||||
#include <sound/intel-nhlt.h>
|
||||
#include <sound/sof.h>
|
||||
#include <sound/sof/xtensa.h>
|
||||
#include "../sof-audio.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
#include "../ops.h"
|
||||
#include "hda.h"
|
||||
|
||||
|
@ -1258,8 +1260,24 @@ void hda_machine_select(struct snd_sof_dev *sdev)
|
|||
dev_warn(sdev->dev, "warning: No matching ASoC machine driver found\n");
|
||||
}
|
||||
|
||||
int hda_pci_intel_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = snd_intel_dsp_driver_probe(pci);
|
||||
if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) {
|
||||
dev_dbg(&pci->dev, "SOF PCI driver not selected, aborting probe\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return sof_pci_probe(pci, pci_id);
|
||||
}
|
||||
EXPORT_SYMBOL_NS(hda_pci_intel_probe, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_INTEL_SOUNDWIRE_ACPI);
|
||||
MODULE_IMPORT_NS(SOUNDWIRE_INTEL_INIT);
|
||||
|
|
|
@ -764,4 +764,7 @@ void hda_machine_select(struct snd_sof_dev *sdev);
|
|||
void hda_set_mach_params(const struct snd_soc_acpi_mach *mach,
|
||||
struct device *dev);
|
||||
|
||||
/* PCI driver selection and probe */
|
||||
int hda_pci_intel_probe(struct pci_dev *pci, const struct pci_device_id *pci_id);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
// 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) 2018-2021 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "hda.h"
|
||||
|
||||
static const struct sof_dev_desc bxt_desc = {
|
||||
.machines = snd_soc_acpi_intel_bxt_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-apl.ri",
|
||||
.nocodec_tplg_filename = "sof-apl-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc glk_desc = {
|
||||
.machines = snd_soc_acpi_intel_glk_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-glk.ri",
|
||||
.nocodec_tplg_filename = "sof-glk-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE(0x8086, 0x5a98), /* BXT-P (ApolloLake) */
|
||||
.driver_data = (unsigned long)&bxt_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x1a98),/* BXT-T */
|
||||
.driver_data = (unsigned long)&bxt_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x3198), /* GeminiLake */
|
||||
.driver_data = (unsigned long)&glk_desc},
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_intel_apl_driver = {
|
||||
.name = "sof-audio-pci-intel-apl",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = hda_pci_intel_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_intel_apl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
|
@ -0,0 +1,104 @@
|
|||
// 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) 2018 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "hda.h"
|
||||
|
||||
static const struct sof_dev_desc cnl_desc = {
|
||||
.machines = snd_soc_acpi_intel_cnl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cnl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cnl.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc cfl_desc = {
|
||||
.machines = snd_soc_acpi_intel_cfl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cfl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cfl.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc cml_desc = {
|
||||
.machines = snd_soc_acpi_intel_cml_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cml_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cml.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE(0x8086, 0x9dc8), /* CNL-LP */
|
||||
.driver_data = (unsigned long)&cnl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0xa348), /* CNL-H */
|
||||
.driver_data = (unsigned long)&cfl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x02c8), /* CML-LP */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x06c8), /* CML-H */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
{ PCI_DEVICE(0x8086, 0xa3f0), /* CML-S */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_intel_cnl_driver = {
|
||||
.name = "sof-audio-pci-intel-cnl",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = hda_pci_intel_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_intel_cnl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
|
@ -0,0 +1,84 @@
|
|||
// 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) 2018-2021 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "hda.h"
|
||||
|
||||
static const struct sof_dev_desc icl_desc = {
|
||||
.machines = snd_soc_acpi_intel_icl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_icl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &icl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-icl.ri",
|
||||
.nocodec_tplg_filename = "sof-icl-nocodec.tplg",
|
||||
.ops = &sof_icl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc jsl_desc = {
|
||||
.machines = snd_soc_acpi_intel_jsl_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &jsl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-jsl.ri",
|
||||
.nocodec_tplg_filename = "sof-jsl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE(0x8086, 0x34C8), /* ICL-LP */
|
||||
.driver_data = (unsigned long)&icl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x3dc8), /* ICL-H */
|
||||
.driver_data = (unsigned long)&icl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x38c8), /* ICL-N */
|
||||
.driver_data = (unsigned long)&jsl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x4dc8), /* JSL-N */
|
||||
.driver_data = (unsigned long)&jsl_desc},
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_intel_icl_driver = {
|
||||
.name = "sof-audio-pci-intel-icl",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = hda_pci_intel_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_intel_icl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
|
@ -0,0 +1,121 @@
|
|||
// 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) 2018-2021 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "hda.h"
|
||||
|
||||
static const struct sof_dev_desc tgl_desc = {
|
||||
.machines = snd_soc_acpi_intel_tgl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_tgl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tgl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl.ri",
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc tglh_desc = {
|
||||
.machines = snd_soc_acpi_intel_tgl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_tgl_sdw_machines,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tglh_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl-h.ri",
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc ehl_desc = {
|
||||
.machines = snd_soc_acpi_intel_ehl_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &ehl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-ehl.ri",
|
||||
.nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc adls_desc = {
|
||||
.machines = snd_soc_acpi_intel_adl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_adl_sdw_machines,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &adls_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-adl-s.ri",
|
||||
.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE(0x8086, 0xa0c8), /* TGL-LP */
|
||||
.driver_data = (unsigned long)&tgl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x43c8), /* TGL-H */
|
||||
.driver_data = (unsigned long)&tglh_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x4b55), /* EHL */
|
||||
.driver_data = (unsigned long)&ehl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x4b58), /* EHL */
|
||||
.driver_data = (unsigned long)&ehl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x7ad0), /* ADL-S */
|
||||
.driver_data = (unsigned long)&adls_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x51c8), /* ADL-P */
|
||||
.driver_data = (unsigned long)&tgl_desc},
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_intel_tgl_driver = {
|
||||
.name = "sof-audio-pci-intel-tgl",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = hda_pci_intel_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_intel_tgl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
// 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) 2018-2021 Intel Corporation. All rights reserved.
|
||||
//
|
||||
// Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
||||
//
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "shim.h"
|
||||
|
||||
static struct snd_soc_acpi_mach sof_tng_machines[] = {
|
||||
{
|
||||
.id = "INT343A",
|
||||
.drv_name = "edison",
|
||||
.sof_fw_filename = "sof-byt.ri",
|
||||
.sof_tplg_filename = "sof-byt.tplg",
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc tng_desc = {
|
||||
.machines = sof_tng_machines,
|
||||
.resindex_lpe_base = 3, /* IRAM, but subtract IRAM offset */
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = 0,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tng_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-byt.ri",
|
||||
.nocodec_tplg_filename = "sof-byt.tplg",
|
||||
.ops = &sof_tng_ops,
|
||||
};
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE(0x8086, 0x119a),
|
||||
.driver_data = (unsigned long)&tng_desc},
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_intel_tng_driver = {
|
||||
.name = "sof-audio-pci-intel-tng",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = sof_pci_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_intel_tng_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_MERRIFIELD);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
|
@ -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_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;
|
||||
|
||||
struct sof_intel_stream {
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
#include <linux/firmware.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <sound/intel-dsp-config.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "../intel/common/soc-intel-quirks.h"
|
||||
#include "ops.h"
|
||||
#include "sof-acpi-dev.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "intel/shim.h"
|
||||
|
@ -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)
|
||||
|
||||
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_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,
|
||||
};
|
||||
#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 = {
|
||||
const struct dev_pm_ops sof_acpi_pm = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume)
|
||||
SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume,
|
||||
snd_sof_runtime_idle)
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_acpi_pm, SND_SOC_SOF_ACPI_DEV);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
const struct acpi_device_id *id;
|
||||
const struct sof_dev_desc *desc;
|
||||
struct snd_sof_pdata *sof_pdata;
|
||||
const struct snd_sof_dsp_ops *ops;
|
||||
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");
|
||||
|
||||
sof_pdata = devm_kzalloc(dev, sizeof(*sof_pdata), GFP_KERNEL);
|
||||
if (!sof_pdata)
|
||||
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 */
|
||||
ops = desc->ops;
|
||||
if (!ops) {
|
||||
|
@ -194,44 +110,20 @@ static int sof_acpi_probe(struct platform_device *pdev)
|
|||
|
||||
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))
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_disable(dev);
|
||||
|
||||
/* call sof helper for DSP hardware remove */
|
||||
snd_sof_device_remove(&pdev->dev);
|
||||
snd_sof_device_remove(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#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);
|
||||
EXPORT_SYMBOL_NS(sof_acpi_remove, SND_SOC_SOF_ACPI_DEV);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_BAYTRAIL);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_BROADWELL);
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/* 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
|
|
@ -13,15 +13,11 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <sound/intel-dsp-config.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include <sound/soc-acpi-intel-match.h>
|
||||
#include <sound/sof.h>
|
||||
#include "ops.h"
|
||||
|
||||
/* platform specific devices */
|
||||
#include "intel/shim.h"
|
||||
#include "intel/hda.h"
|
||||
#include "sof-pci-dev.h"
|
||||
|
||||
static char *fw_path;
|
||||
module_param(fw_path, charp, 0444);
|
||||
|
@ -81,243 +77,14 @@ static const struct dmi_system_id community_key_platforms[] = {
|
|||
{},
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
|
||||
static const struct sof_dev_desc bxt_desc = {
|
||||
.machines = snd_soc_acpi_intel_bxt_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-apl.ri",
|
||||
.nocodec_tplg_filename = "sof-apl-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
|
||||
static const struct sof_dev_desc glk_desc = {
|
||||
.machines = snd_soc_acpi_intel_glk_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &apl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-glk.ri",
|
||||
.nocodec_tplg_filename = "sof-glk-nocodec.tplg",
|
||||
.ops = &sof_apl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
|
||||
static struct snd_soc_acpi_mach sof_tng_machines[] = {
|
||||
{
|
||||
.id = "INT343A",
|
||||
.drv_name = "edison",
|
||||
.sof_fw_filename = "sof-byt.ri",
|
||||
.sof_tplg_filename = "sof-byt.tplg",
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc tng_desc = {
|
||||
.machines = sof_tng_machines,
|
||||
.resindex_lpe_base = 3, /* IRAM, but subtract IRAM offset */
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = 0,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tng_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-byt.ri",
|
||||
.nocodec_tplg_filename = "sof-byt.tplg",
|
||||
.ops = &sof_tng_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
|
||||
static const struct sof_dev_desc cnl_desc = {
|
||||
.machines = snd_soc_acpi_intel_cnl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cnl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cnl.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
|
||||
static const struct sof_dev_desc cfl_desc = {
|
||||
.machines = snd_soc_acpi_intel_cfl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cfl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cfl.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
|
||||
static const struct sof_dev_desc cml_desc = {
|
||||
.machines = snd_soc_acpi_intel_cml_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_cml_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &cnl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-cml.ri",
|
||||
.nocodec_tplg_filename = "sof-cnl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
|
||||
static const struct sof_dev_desc icl_desc = {
|
||||
.machines = snd_soc_acpi_intel_icl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_icl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &icl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-icl.ri",
|
||||
.nocodec_tplg_filename = "sof-icl-nocodec.tplg",
|
||||
.ops = &sof_icl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE) || IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
|
||||
static const struct sof_dev_desc tgl_desc = {
|
||||
.machines = snd_soc_acpi_intel_tgl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_tgl_sdw_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tgl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl.ri",
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
|
||||
static const struct sof_dev_desc tglh_desc = {
|
||||
.machines = snd_soc_acpi_intel_tgl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_tgl_sdw_machines,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &tglh_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-tgl-h.ri",
|
||||
.nocodec_tplg_filename = "sof-tgl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
|
||||
static const struct sof_dev_desc ehl_desc = {
|
||||
.machines = snd_soc_acpi_intel_ehl_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &ehl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-ehl.ri",
|
||||
.nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
|
||||
static const struct sof_dev_desc jsl_desc = {
|
||||
.machines = snd_soc_acpi_intel_jsl_machines,
|
||||
.use_acpi_target_states = true,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &jsl_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-jsl.ri",
|
||||
.nocodec_tplg_filename = "sof-jsl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
|
||||
static const struct sof_dev_desc adls_desc = {
|
||||
.machines = snd_soc_acpi_intel_adl_machines,
|
||||
.alt_machines = snd_soc_acpi_intel_adl_sdw_machines,
|
||||
.resindex_lpe_base = 0,
|
||||
.resindex_pcicfg_base = -1,
|
||||
.resindex_imr_base = -1,
|
||||
.irqindex_host_ipc = -1,
|
||||
.resindex_dma_base = -1,
|
||||
.chip_info = &adls_chip_info,
|
||||
.default_fw_path = "intel/sof",
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-adl-s.ri",
|
||||
.nocodec_tplg_filename = "sof-adl-nocodec.tplg",
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops sof_pci_pm = {
|
||||
const struct dev_pm_ops sof_pci_pm = {
|
||||
.prepare = snd_sof_prepare,
|
||||
.complete = snd_sof_complete,
|
||||
SET_SYSTEM_SLEEP_PM_OPS(snd_sof_suspend, snd_sof_resume)
|
||||
SET_RUNTIME_PM_OPS(snd_sof_runtime_suspend, snd_sof_runtime_resume,
|
||||
snd_sof_runtime_idle)
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_pci_pm, SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
static void sof_pci_probe_complete(struct device *dev)
|
||||
{
|
||||
|
@ -343,8 +110,7 @@ static void sof_pci_probe_complete(struct device *dev)
|
|||
pm_runtime_put_noidle(dev);
|
||||
}
|
||||
|
||||
static int sof_pci_probe(struct pci_dev *pci,
|
||||
const struct pci_device_id *pci_id)
|
||||
int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)
|
||||
{
|
||||
struct device *dev = &pci->dev;
|
||||
const struct sof_dev_desc *desc =
|
||||
|
@ -353,13 +119,6 @@ static int sof_pci_probe(struct pci_dev *pci,
|
|||
const struct snd_sof_dsp_ops *ops;
|
||||
int ret;
|
||||
|
||||
if (IS_REACHABLE(CONFIG_SND_INTEL_DSP_CONFIG)) {
|
||||
ret = snd_intel_dsp_driver_probe(pci);
|
||||
if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) {
|
||||
dev_dbg(&pci->dev, "SOF PCI driver not selected, aborting probe\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
dev_dbg(&pci->dev, "PCI DSP detected");
|
||||
|
||||
/* get ops for platform */
|
||||
|
@ -447,8 +206,9 @@ release_regions:
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_NS(sof_pci_probe, SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
static void sof_pci_remove(struct pci_dev *pci)
|
||||
void sof_pci_remove(struct pci_dev *pci)
|
||||
{
|
||||
/* call sof helper for DSP hardware remove */
|
||||
snd_sof_device_remove(&pci->dev);
|
||||
|
@ -461,94 +221,12 @@ static void sof_pci_remove(struct pci_dev *pci)
|
|||
/* release pci regions and disable device */
|
||||
pci_release_regions(pci);
|
||||
}
|
||||
EXPORT_SYMBOL_NS(sof_pci_remove, SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
static void sof_pci_shutdown(struct pci_dev *pci)
|
||||
void sof_pci_shutdown(struct pci_dev *pci)
|
||||
{
|
||||
snd_sof_device_shutdown(&pci->dev);
|
||||
}
|
||||
|
||||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_MERRIFIELD)
|
||||
{ PCI_DEVICE(0x8086, 0x119a),
|
||||
.driver_data = (unsigned long)&tng_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
|
||||
/* BXT-P & Apollolake */
|
||||
{ PCI_DEVICE(0x8086, 0x5a98),
|
||||
.driver_data = (unsigned long)&bxt_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x1a98),
|
||||
.driver_data = (unsigned long)&bxt_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x3198),
|
||||
.driver_data = (unsigned long)&glk_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_CANNONLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x9dc8),
|
||||
.driver_data = (unsigned long)&cnl_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COFFEELAKE)
|
||||
{ PCI_DEVICE(0x8086, 0xa348),
|
||||
.driver_data = (unsigned long)&cfl_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ICELAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x34C8), /* ICL-LP */
|
||||
.driver_data = (unsigned long)&icl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x3dc8), /* ICL-H */
|
||||
.driver_data = (unsigned long)&icl_desc},
|
||||
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_JASPERLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x38c8),
|
||||
.driver_data = (unsigned long)&jsl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x4dc8),
|
||||
.driver_data = (unsigned long)&jsl_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_COMETLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x02c8), /* CML-LP */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x06c8), /* CML-H */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
{ PCI_DEVICE(0x8086, 0xa3f0), /* CML-S */
|
||||
.driver_data = (unsigned long)&cml_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_TIGERLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0xa0c8), /* TGL-LP */
|
||||
.driver_data = (unsigned long)&tgl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x43c8), /* TGL-H */
|
||||
.driver_data = (unsigned long)&tglh_desc},
|
||||
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ELKHARTLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x4b55),
|
||||
.driver_data = (unsigned long)&ehl_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x4b58),
|
||||
.driver_data = (unsigned long)&ehl_desc},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
|
||||
{ PCI_DEVICE(0x8086, 0x7ad0),
|
||||
.driver_data = (unsigned long)&adls_desc},
|
||||
{ PCI_DEVICE(0x8086, 0x51c8),
|
||||
.driver_data = (unsigned long)&tgl_desc},
|
||||
#endif
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
||||
/* pci_driver definition */
|
||||
static struct pci_driver snd_sof_pci_driver = {
|
||||
.name = "sof-audio-pci",
|
||||
.id_table = sof_pci_ids,
|
||||
.probe = sof_pci_probe,
|
||||
.remove = sof_pci_remove,
|
||||
.shutdown = sof_pci_shutdown,
|
||||
.driver = {
|
||||
.pm = &sof_pci_pm,
|
||||
},
|
||||
};
|
||||
module_pci_driver(snd_sof_pci_driver);
|
||||
EXPORT_SYMBOL_NS(sof_pci_shutdown, SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_MERRIFIELD);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
/* 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_PCI_H
|
||||
#define __SOUND_SOC_SOF_PCI_H
|
||||
|
||||
extern const struct dev_pm_ops sof_pci_pm;
|
||||
int sof_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id);
|
||||
void sof_pci_remove(struct pci_dev *pci);
|
||||
void sof_pci_shutdown(struct pci_dev *pci);
|
||||
|
||||
#endif
|
|
@ -652,10 +652,10 @@ static int set_sample_rate_v2v3(struct snd_usb_audio *chip,
|
|||
cur_rate = prev_rate;
|
||||
|
||||
if (cur_rate != rate) {
|
||||
usb_audio_warn(chip,
|
||||
"%d:%d: freq mismatch (RO clock): req %d, clock runs @%d\n",
|
||||
fmt->iface, fmt->altsetting, rate, cur_rate);
|
||||
return -ENXIO;
|
||||
usb_audio_dbg(chip,
|
||||
"%d:%d: freq mismatch: req %d, clock runs @%d\n",
|
||||
fmt->iface, fmt->altsetting, rate, cur_rate);
|
||||
/* continue processing */
|
||||
}
|
||||
|
||||
validation:
|
||||
|
|
|
@ -1307,6 +1307,17 @@ no_res_check:
|
|||
/* totally crap, return an error */
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
/* if the max volume is too low, it's likely a bogus range;
|
||||
* here we use -96dB as the threshold
|
||||
*/
|
||||
if (cval->dBmax <= -9600) {
|
||||
usb_audio_info(cval->head.mixer->chip,
|
||||
"%d:%d: bogus dB values (%d/%d), disabling dB reporting\n",
|
||||
cval->head.id, mixer_ctrl_intf(cval->head.mixer),
|
||||
cval->dBmin, cval->dBmax);
|
||||
cval->dBmin = cval->dBmax = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -536,6 +536,16 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|||
.id = USB_ID(0x05a7, 0x1020),
|
||||
.map = bose_companion5_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso SE (wired mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a3d),
|
||||
.map = corsair_virtuoso_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso SE (wireless mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a3e),
|
||||
.map = corsair_virtuoso_map,
|
||||
},
|
||||
{
|
||||
/* Corsair Virtuoso (wired mode) */
|
||||
.id = USB_ID(0x1b1c, 0x0a41),
|
||||
|
|
|
@ -845,13 +845,19 @@ get_sync_ep_from_substream(struct snd_usb_substream *subs)
|
|||
|
||||
list_for_each_entry(fp, &subs->fmt_list, list) {
|
||||
ep = snd_usb_get_endpoint(chip, fp->endpoint);
|
||||
if (ep && ep->cur_rate)
|
||||
return ep;
|
||||
if (ep && ep->cur_audiofmt) {
|
||||
/* if EP is already opened solely for this substream,
|
||||
* we still allow us to change the parameter; otherwise
|
||||
* this substream has to follow the existing parameter
|
||||
*/
|
||||
if (ep->cur_audiofmt != subs->cur_audiofmt || ep->opened > 1)
|
||||
return ep;
|
||||
}
|
||||
if (!fp->implicit_fb)
|
||||
continue;
|
||||
/* for the implicit fb, check the sync ep as well */
|
||||
ep = snd_usb_get_endpoint(chip, fp->sync_ep);
|
||||
if (ep && ep->cur_rate)
|
||||
if (ep && ep->cur_audiofmt)
|
||||
return ep;
|
||||
}
|
||||
return NULL;
|
||||
|
|
|
@ -1482,7 +1482,7 @@ static int pioneer_djm_set_format_quirk(struct snd_usb_substream *subs,
|
|||
usb_set_interface(subs->dev, 0, 1);
|
||||
// we should derive windex from fmt-sync_ep but it's not set
|
||||
snd_usb_ctl_msg(subs->stream->chip->dev,
|
||||
usb_rcvctrlpipe(subs->stream->chip->dev, 0),
|
||||
usb_sndctrlpipe(subs->stream->chip->dev, 0),
|
||||
0x01, 0x22, 0x0100, windex, &sr, 0x0003);
|
||||
return 0;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче