sound fixes for 5.9-rc4
A collection of small changes, nothing intrusive: * Remaining tasklet API conversions, now all sound stuff have been converted * A few HD-audio and USB-audio quirks and minor fixes * FireWire Tascam and Digi00xx fixes * Drop of kernel WARNING from PCM OSS for syzkaller -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAl9R8ckOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+Dtg//ShtXFp622T5NiMvDF5sG8AlbvGLf1dUdja62 6sF2kba9vhncI9ejjGSJBCdfun3dtNkjsffacKOzTbnSHbwsBjU7J68zP1dru+d2 88WXb4h8iAxAPcPHSgblpdi+ifeKGEYsAr7tbVa5KIpFKDxW7qLw5ntXu0G0vuW3 +ao/p3TB/LT5I42bu0UmXsfuO7dVoyyzOSDdlse0mFNNeNSLVslAkaqqYSosmp1/ I2gPyP814OwqrPITGvlnDWLfCnuTVDQodtAYb6sADPpplBTGu4uVfJUD+w6xVNDX 2byY6Q2TYYolrBUSvsPxUSXAfogvGQFppOnpbxnZftIrDoFC8WN048vWEfYZ2CWn bVDQmErqAk8+l3r8kllW6IXhJxF2CMivv92Ht+8VA4sw29RVGtUXw6Gm7aJvoqP3 zewF7RZh6vNJVsjAv4KEpYTyNLQi9eYCygeB9INA7dWBZeyaolchX1Ptrd4fhyo7 ko20Fbu+vuk18B9zNE5yIpBKNpqDVNyTCnZSU9kzCicVZ/OD15fw/sUXUVo3wx5X ZRLBdJrccXni+LlbYHT6tJPtnQtBHITffN2/zvGPPXlViLexz88jtqWaTayy4J1u L63BIA3L8IfAW1ln22CfNlKbwN+Ku1uJwJnPHiUPDABXH6Uk2oeCxI5BRLzyTieB oe1jrcs= =CwOB -----END PGP SIGNATURE----- Merge tag 'sound-5.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small changes, nothing intrusive: - remaining tasklet API conversions, now all sound stuff have been converted - a few HD-audio and USB-audio quirks and minor fixes - FireWire Tascam and Digi00xx fixes - drop a kernel WARNING from PCM OSS for syzkaller" * tag 'sound-5.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (29 commits) ALSA: hda/realtek - Improved routing for Thinkpad X1 7th/8th Gen ALSA: hda: use consistent HDAudio spelling in comments/docs ALSA: hda: add dev_dbg log when driver is not selected ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is disabled ALSA: hda: hdmi - add Rocketlake support ALSA: ua101: convert tasklets to use new tasklet_setup() API ALSA: usb-audio: convert tasklets to use new tasklet_setup() API ASoC: txx9: convert tasklets to use new tasklet_setup() API ASoC: siu: convert tasklets to use new tasklet_setup() API ASoC: fsl_esai: convert tasklets to use new tasklet_setup() API ALSA: hdsp: convert tasklets to use new tasklet_setup() API ALSA: riptide: convert tasklets to use new tasklet_setup() API ALSA: pci/asihpi: convert tasklets to use new tasklet_setup() API ALSA: firewire: convert tasklets to use new tasklet_setup() API ALSA: core: convert tasklets to use new tasklet_setup() API ALSA: pcm: oss: Remove superfluous WARN_ON() for mulaw sanity check ALSA: hda - Fix silent audio output and corrupted input on MSI X570-A PRO ALSA: hda/hdmi: always check pin power status in i915 pin fixup ALSA: hda/realtek: Add quirk for Samsung Galaxy Book Ion NT950XCJ-X716A ALSA: usb-audio: Add basic capture support for Pioneer DJ DJM-250MK2 ...
This commit is contained in:
commit
86edf52e7c
|
@ -332,7 +332,7 @@ WO 9901953 (A1)
|
|||
|
||||
|
||||
US Patents (https://www.uspto.gov/)
|
||||
----------------------------------
|
||||
-----------------------------------
|
||||
|
||||
US 5925841
|
||||
Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
|
|
@ -337,7 +337,7 @@ WO 9901953 (A1)
|
|||
|
||||
|
||||
US Patents (https://www.uspto.gov/)
|
||||
----------------------------------
|
||||
-----------------------------------
|
||||
|
||||
US 5925841
|
||||
Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
|
|
@ -143,7 +143,7 @@ timestamp shows when the information is put together by the driver
|
|||
before returning from the ``STATUS`` and ``STATUS_EXT`` ioctl. in most cases
|
||||
this driver_timestamp will be identical to the regular system tstamp.
|
||||
|
||||
Examples of typestamping with HDaudio:
|
||||
Examples of timestamping with HDAudio:
|
||||
|
||||
1. DMA timestamp, no compensation for DMA+analog delay
|
||||
::
|
||||
|
|
|
@ -329,8 +329,8 @@ int snd_pcm_plugin_build_mulaw(struct snd_pcm_substream *plug,
|
|||
snd_BUG();
|
||||
return -EINVAL;
|
||||
}
|
||||
if (snd_BUG_ON(!snd_pcm_format_linear(format->format)))
|
||||
return -ENXIO;
|
||||
if (!snd_pcm_format_linear(format->format))
|
||||
return -EINVAL;
|
||||
|
||||
err = snd_pcm_plugin_build(plug, "Mu-Law<->linear conversion",
|
||||
src_format, dst_format,
|
||||
|
|
|
@ -816,9 +816,9 @@ static void snd_timer_clear_callbacks(struct snd_timer *timer,
|
|||
* timer tasklet
|
||||
*
|
||||
*/
|
||||
static void snd_timer_tasklet(unsigned long arg)
|
||||
static void snd_timer_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct snd_timer *timer = (struct snd_timer *) arg;
|
||||
struct snd_timer *timer = from_tasklet(timer, t, task_queue);
|
||||
unsigned long flags;
|
||||
|
||||
if (timer->card && timer->card->shutdown) {
|
||||
|
@ -967,8 +967,7 @@ int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid,
|
|||
INIT_LIST_HEAD(&timer->ack_list_head);
|
||||
INIT_LIST_HEAD(&timer->sack_list_head);
|
||||
spin_lock_init(&timer->lock);
|
||||
tasklet_init(&timer->task_queue, snd_timer_tasklet,
|
||||
(unsigned long)timer);
|
||||
tasklet_setup(&timer->task_queue, snd_timer_tasklet);
|
||||
timer->max_instances = 1000; /* default limit per timer */
|
||||
if (card != NULL) {
|
||||
timer->module = card->module;
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
#define IT_PKT_HEADER_SIZE_CIP 8 // For 2 CIP header.
|
||||
#define IT_PKT_HEADER_SIZE_NO_CIP 0 // Nothing.
|
||||
|
||||
static void pcm_period_tasklet(unsigned long data);
|
||||
static void pcm_period_tasklet(struct tasklet_struct *t);
|
||||
|
||||
/**
|
||||
* amdtp_stream_init - initialize an AMDTP stream structure
|
||||
|
@ -94,7 +94,7 @@ int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
|
|||
s->flags = flags;
|
||||
s->context = ERR_PTR(-1);
|
||||
mutex_init(&s->mutex);
|
||||
tasklet_init(&s->period_tasklet, pcm_period_tasklet, (unsigned long)s);
|
||||
tasklet_setup(&s->period_tasklet, pcm_period_tasklet);
|
||||
s->packet_index = 0;
|
||||
|
||||
init_waitqueue_head(&s->callback_wait);
|
||||
|
@ -441,9 +441,9 @@ static void update_pcm_pointers(struct amdtp_stream *s,
|
|||
}
|
||||
}
|
||||
|
||||
static void pcm_period_tasklet(unsigned long data)
|
||||
static void pcm_period_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct amdtp_stream *s = (void *)data;
|
||||
struct amdtp_stream *s = from_tasklet(s, t, period_tasklet);
|
||||
struct snd_pcm_substream *pcm = READ_ONCE(s->pcm);
|
||||
|
||||
if (pcm)
|
||||
|
|
|
@ -14,6 +14,7 @@ MODULE_LICENSE("GPL v2");
|
|||
#define VENDOR_DIGIDESIGN 0x00a07e
|
||||
#define MODEL_CONSOLE 0x000001
|
||||
#define MODEL_RACK 0x000002
|
||||
#define SPEC_VERSION 0x000001
|
||||
|
||||
static int name_card(struct snd_dg00x *dg00x)
|
||||
{
|
||||
|
@ -175,14 +176,18 @@ static const struct ieee1394_device_id snd_dg00x_id_table[] = {
|
|||
/* Both of 002/003 use the same ID. */
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_VERSION |
|
||||
IEEE1394_MATCH_MODEL_ID,
|
||||
.vendor_id = VENDOR_DIGIDESIGN,
|
||||
.version = SPEC_VERSION,
|
||||
.model_id = MODEL_CONSOLE,
|
||||
},
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_VERSION |
|
||||
IEEE1394_MATCH_MODEL_ID,
|
||||
.vendor_id = VENDOR_DIGIDESIGN,
|
||||
.version = SPEC_VERSION,
|
||||
.model_id = MODEL_RACK,
|
||||
},
|
||||
{}
|
||||
|
|
|
@ -39,9 +39,6 @@ static const struct snd_tscm_spec model_specs[] = {
|
|||
.midi_capture_ports = 2,
|
||||
.midi_playback_ports = 4,
|
||||
},
|
||||
// This kernel module doesn't support FE-8 because the most of features
|
||||
// can be implemented in userspace without any specific support of this
|
||||
// module.
|
||||
};
|
||||
|
||||
static int identify_model(struct snd_tscm *tscm)
|
||||
|
@ -211,11 +208,39 @@ static void snd_tscm_remove(struct fw_unit *unit)
|
|||
}
|
||||
|
||||
static const struct ieee1394_device_id snd_tscm_id_table[] = {
|
||||
// Tascam, FW-1884.
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_SPECIFIER_ID,
|
||||
IEEE1394_MATCH_SPECIFIER_ID |
|
||||
IEEE1394_MATCH_VERSION,
|
||||
.vendor_id = 0x00022e,
|
||||
.specifier_id = 0x00022e,
|
||||
.version = 0x800000,
|
||||
},
|
||||
// Tascam, FE-8 (.version = 0x800001)
|
||||
// This kernel module doesn't support FE-8 because the most of features
|
||||
// can be implemented in userspace without any specific support of this
|
||||
// module.
|
||||
//
|
||||
// .version = 0x800002 is unknown.
|
||||
//
|
||||
// Tascam, FW-1082.
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_SPECIFIER_ID |
|
||||
IEEE1394_MATCH_VERSION,
|
||||
.vendor_id = 0x00022e,
|
||||
.specifier_id = 0x00022e,
|
||||
.version = 0x800003,
|
||||
},
|
||||
// Tascam, FW-1804.
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_SPECIFIER_ID |
|
||||
IEEE1394_MATCH_VERSION,
|
||||
.vendor_id = 0x00022e,
|
||||
.specifier_id = 0x00022e,
|
||||
.version = 0x800004,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
|
|
@ -127,6 +127,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_device_init);
|
|||
void snd_hdac_device_exit(struct hdac_device *codec)
|
||||
{
|
||||
pm_runtime_put_noidle(&codec->dev);
|
||||
/* keep balance of runtime PM child_count in parent device */
|
||||
pm_runtime_set_suspended(&codec->dev);
|
||||
snd_hdac_bus_remove_device(codec->bus, codec);
|
||||
kfree(codec->vendor_name);
|
||||
kfree(codec->chip_name);
|
||||
|
|
|
@ -54,7 +54,7 @@ static const struct config_entry config_table[] = {
|
|||
#endif
|
||||
/*
|
||||
* Apollolake (Broxton-P)
|
||||
* the legacy HDaudio driver is used except on Up Squared (SOF) and
|
||||
* the legacy HDAudio driver is used except on Up Squared (SOF) and
|
||||
* Chromebooks (SST)
|
||||
*/
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
|
||||
|
@ -89,7 +89,7 @@ static const struct config_entry config_table[] = {
|
|||
},
|
||||
#endif
|
||||
/*
|
||||
* Skylake and Kabylake use legacy HDaudio driver except for Google
|
||||
* Skylake and Kabylake use legacy HDAudio driver except for Google
|
||||
* Chromebooks (SST)
|
||||
*/
|
||||
|
||||
|
@ -135,7 +135,7 @@ static const struct config_entry config_table[] = {
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Geminilake uses legacy HDaudio driver except for Google
|
||||
* Geminilake uses legacy HDAudio driver except for Google
|
||||
* Chromebooks
|
||||
*/
|
||||
/* Geminilake */
|
||||
|
@ -157,7 +157,7 @@ static const struct config_entry config_table[] = {
|
|||
|
||||
/*
|
||||
* CoffeeLake, CannonLake, CometLake, IceLake, TigerLake use legacy
|
||||
* HDaudio driver except for Google Chromebooks and when DMICs are
|
||||
* HDAudio driver except for Google Chromebooks and when DMICs are
|
||||
* present. Two cases are required since Coreboot does not expose NHLT
|
||||
* tables.
|
||||
*
|
||||
|
@ -391,7 +391,7 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
|
|||
if (pci->class == 0x040300)
|
||||
return SND_INTEL_DSP_DRIVER_LEGACY;
|
||||
if (pci->class != 0x040100 && pci->class != 0x040380) {
|
||||
dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDA legacy driver\n", pci->class);
|
||||
dev_err(&pci->dev, "Unknown PCI class/subclass/prog-if information (0x%06x) found, selecting HDAudio legacy driver\n", pci->class);
|
||||
return SND_INTEL_DSP_DRIVER_LEGACY;
|
||||
}
|
||||
|
||||
|
|
|
@ -921,10 +921,10 @@ static void snd_card_asihpi_timer_function(struct timer_list *t)
|
|||
add_timer(&dpcm->timer);
|
||||
}
|
||||
|
||||
static void snd_card_asihpi_int_task(unsigned long data)
|
||||
static void snd_card_asihpi_int_task(struct tasklet_struct *t)
|
||||
{
|
||||
struct hpi_adapter *a = (struct hpi_adapter *)data;
|
||||
struct snd_card_asihpi *asihpi;
|
||||
struct snd_card_asihpi *asihpi = from_tasklet(asihpi, t, t);
|
||||
struct hpi_adapter *a = asihpi->hpi;
|
||||
|
||||
WARN_ON(!a || !a->snd_card || !a->snd_card->private_data);
|
||||
asihpi = (struct snd_card_asihpi *)a->snd_card->private_data;
|
||||
|
@ -2871,8 +2871,7 @@ static int snd_asihpi_probe(struct pci_dev *pci_dev,
|
|||
if (hpi->interrupt_mode) {
|
||||
asihpi->pcm_start = snd_card_asihpi_pcm_int_start;
|
||||
asihpi->pcm_stop = snd_card_asihpi_pcm_int_stop;
|
||||
tasklet_init(&asihpi->t, snd_card_asihpi_int_task,
|
||||
(unsigned long)hpi);
|
||||
tasklet_setup(&asihpi->t, snd_card_asihpi_int_task);
|
||||
hpi->interrupt_callback = snd_card_asihpi_isr;
|
||||
} else {
|
||||
asihpi->pcm_start = snd_card_asihpi_pcm_timer_start;
|
||||
|
|
|
@ -537,7 +537,8 @@ static int snd_ca0106_pcm_power_dac(struct snd_ca0106 *chip, int channel_id,
|
|||
else
|
||||
/* Power down */
|
||||
chip->spi_dac_reg[reg] |= bit;
|
||||
return snd_ca0106_spi_write(chip, chip->spi_dac_reg[reg]);
|
||||
if (snd_ca0106_spi_write(chip, chip->spi_dac_reg[reg]) != 0)
|
||||
return -ENXIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -2127,9 +2127,10 @@ static int azx_probe(struct pci_dev *pci,
|
|||
*/
|
||||
if (dmic_detect) {
|
||||
err = snd_intel_dsp_driver_probe(pci);
|
||||
if (err != SND_INTEL_DSP_DRIVER_ANY &&
|
||||
err != SND_INTEL_DSP_DRIVER_LEGACY)
|
||||
if (err != SND_INTEL_DSP_DRIVER_ANY && err != SND_INTEL_DSP_DRIVER_LEGACY) {
|
||||
dev_dbg(&pci->dev, "HDAudio driver not selected, aborting probe\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
} else {
|
||||
dev_warn(&pci->dev, "dmic_detect option is deprecated, pass snd-intel-dspcfg.dsp_driver=1 option instead\n");
|
||||
}
|
||||
|
@ -2745,8 +2746,6 @@ static const struct pci_device_id azx_ids[] = {
|
|||
.driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
|
||||
/* Zhaoxin */
|
||||
{ PCI_DEVICE(0x1d17, 0x3288), .driver_data = AZX_DRIVER_ZHAOXIN },
|
||||
/* Loongson */
|
||||
{ PCI_DEVICE(0x0014, 0x7a07), .driver_data = AZX_DRIVER_GENERIC },
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, azx_ids);
|
||||
|
|
|
@ -179,6 +179,10 @@ static int __maybe_unused hda_tegra_runtime_suspend(struct device *dev)
|
|||
struct hda_tegra *hda = container_of(chip, struct hda_tegra, chip);
|
||||
|
||||
if (chip && chip->running) {
|
||||
/* enable controller wake up event */
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
|
||||
STATESTS_INT_MASK);
|
||||
|
||||
azx_stop_chip(chip);
|
||||
azx_enter_link_reset(chip);
|
||||
}
|
||||
|
@ -200,6 +204,9 @@ static int __maybe_unused hda_tegra_runtime_resume(struct device *dev)
|
|||
if (chip && chip->running) {
|
||||
hda_tegra_init(hda);
|
||||
azx_init_chip(chip, 1);
|
||||
/* disable controller wake up event*/
|
||||
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
|
||||
~STATESTS_INT_MASK);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2794,6 +2794,7 @@ static void i915_pin_cvt_fixup(struct hda_codec *codec,
|
|||
hda_nid_t cvt_nid)
|
||||
{
|
||||
if (per_pin) {
|
||||
haswell_verify_D0(codec, per_pin->cvt_nid, per_pin->pin_nid);
|
||||
snd_hda_set_dev_select(codec, per_pin->pin_nid,
|
||||
per_pin->dev_id);
|
||||
intel_verify_pin_cvt_connect(codec, per_pin);
|
||||
|
@ -3734,6 +3735,7 @@ static int tegra_hdmi_build_pcms(struct hda_codec *codec)
|
|||
|
||||
static int patch_tegra_hdmi(struct hda_codec *codec)
|
||||
{
|
||||
struct hdmi_spec *spec;
|
||||
int err;
|
||||
|
||||
err = patch_generic_hdmi(codec);
|
||||
|
@ -3741,6 +3743,10 @@ static int patch_tegra_hdmi(struct hda_codec *codec)
|
|||
return err;
|
||||
|
||||
codec->patch_ops.build_pcms = tegra_hdmi_build_pcms;
|
||||
spec = codec->spec;
|
||||
spec->chmap.ops.chmap_cea_alloc_validate_get_type =
|
||||
nvhdmi_chmap_cea_alloc_validate_get_type;
|
||||
spec->chmap.ops.chmap_validate = nvhdmi_chmap_validate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -4263,6 +4269,7 @@ HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI", patch_i915_glk_hdmi),
|
|||
HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862816, "Rocketlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
|
||||
|
|
|
@ -2475,6 +2475,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, 0x9c37, "MSI X570-A PRO", ALC1220_FIXUP_CLEVO_P950),
|
||||
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),
|
||||
|
@ -5867,6 +5868,39 @@ static void alc275_fixup_gpio4_off(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
/* Quirk for Thinkpad X1 7th and 8th Gen
|
||||
* The following fixed routing needed
|
||||
* DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
|
||||
* DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
|
||||
* DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
|
||||
*/
|
||||
static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
|
||||
static const hda_nid_t preferred_pairs[] = {
|
||||
0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
|
||||
};
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
||||
spec->gen.preferred_dacs = preferred_pairs;
|
||||
break;
|
||||
case HDA_FIXUP_ACT_BUILD:
|
||||
/* The generic parser creates somewhat unintuitive volume ctls
|
||||
* with the fixed routing above, and the shared DAC2 may be
|
||||
* confusing for PA.
|
||||
* Rename those to unique names so that PA doesn't touch them
|
||||
* and use only Master volume.
|
||||
*/
|
||||
rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
|
||||
rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix,
|
||||
int action)
|
||||
|
@ -6135,6 +6169,7 @@ enum {
|
|||
ALC289_FIXUP_DUAL_SPK,
|
||||
ALC294_FIXUP_SPK2_TO_DAC1,
|
||||
ALC294_FIXUP_ASUS_DUAL_SPK,
|
||||
ALC285_FIXUP_THINKPAD_X1_GEN7,
|
||||
ALC285_FIXUP_THINKPAD_HEADSET_JACK,
|
||||
ALC294_FIXUP_ASUS_HPE,
|
||||
ALC294_FIXUP_ASUS_COEF_1B,
|
||||
|
@ -7280,11 +7315,17 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
|
||||
},
|
||||
[ALC285_FIXUP_THINKPAD_X1_GEN7] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_thinkpad_x1_gen7,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI
|
||||
},
|
||||
[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_headset_jack,
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1
|
||||
.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_HPE] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
|
@ -7695,7 +7736,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
|
||||
SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
||||
|
|
|
@ -1070,9 +1070,9 @@ getmixer(struct cmdif *cif, short num, unsigned short *rval,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void riptide_handleirq(unsigned long dev_id)
|
||||
static void riptide_handleirq(struct tasklet_struct *t)
|
||||
{
|
||||
struct snd_riptide *chip = (void *)dev_id;
|
||||
struct snd_riptide *chip = from_tasklet(chip, t, riptide_tq);
|
||||
struct cmdif *cif = chip->cif;
|
||||
struct snd_pcm_substream *substream[PLAYBACK_SUBSTREAMS + 1];
|
||||
struct snd_pcm_runtime *runtime;
|
||||
|
@ -1843,7 +1843,7 @@ snd_riptide_create(struct snd_card *card, struct pci_dev *pci,
|
|||
chip->received_irqs = 0;
|
||||
chip->handled_irqs = 0;
|
||||
chip->cif = NULL;
|
||||
tasklet_init(&chip->riptide_tq, riptide_handleirq, (unsigned long)chip);
|
||||
tasklet_setup(&chip->riptide_tq, riptide_handleirq);
|
||||
|
||||
if ((chip->res_port =
|
||||
request_region(chip->port, 64, "RIPTIDE")) == NULL) {
|
||||
|
|
|
@ -3791,9 +3791,9 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hdsp_midi_tasklet(unsigned long arg)
|
||||
static void hdsp_midi_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct hdsp *hdsp = (struct hdsp *)arg;
|
||||
struct hdsp *hdsp = from_tasklet(hdsp, t, midi_tasklet);
|
||||
|
||||
if (hdsp->midi[0].pending)
|
||||
snd_hdsp_midi_input_read (&hdsp->midi[0]);
|
||||
|
@ -5182,7 +5182,7 @@ static int snd_hdsp_create(struct snd_card *card,
|
|||
|
||||
spin_lock_init(&hdsp->lock);
|
||||
|
||||
tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp);
|
||||
tasklet_setup(&hdsp->midi_tasklet, hdsp_midi_tasklet);
|
||||
|
||||
pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev);
|
||||
hdsp->firmware_rev &= 0xff;
|
||||
|
|
|
@ -2169,9 +2169,9 @@ static int snd_hdspm_create_midi(struct snd_card *card,
|
|||
}
|
||||
|
||||
|
||||
static void hdspm_midi_tasklet(unsigned long arg)
|
||||
static void hdspm_midi_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct hdspm *hdspm = (struct hdspm *)arg;
|
||||
struct hdspm *hdspm = from_tasklet(hdspm, t, midi_tasklet);
|
||||
int i = 0;
|
||||
|
||||
while (i < hdspm->midiPorts) {
|
||||
|
@ -6836,8 +6836,7 @@ static int snd_hdspm_create(struct snd_card *card,
|
|||
|
||||
}
|
||||
|
||||
tasklet_init(&hdspm->midi_tasklet,
|
||||
hdspm_midi_tasklet, (unsigned long) hdspm);
|
||||
tasklet_setup(&hdspm->midi_tasklet, hdspm_midi_tasklet);
|
||||
|
||||
|
||||
if (hdspm->io_type != MADIface) {
|
||||
|
|
|
@ -708,9 +708,9 @@ static void fsl_esai_trigger_stop(struct fsl_esai *esai_priv, bool tx)
|
|||
ESAI_xFCR_xFR, 0);
|
||||
}
|
||||
|
||||
static void fsl_esai_hw_reset(unsigned long arg)
|
||||
static void fsl_esai_hw_reset(struct tasklet_struct *t)
|
||||
{
|
||||
struct fsl_esai *esai_priv = (struct fsl_esai *)arg;
|
||||
struct fsl_esai *esai_priv = from_tasklet(esai_priv, t, task);
|
||||
bool tx = true, rx = false, enabled[2];
|
||||
unsigned long lock_flags;
|
||||
u32 tfcr, rfcr;
|
||||
|
@ -1070,8 +1070,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
tasklet_init(&esai_priv->task, fsl_esai_hw_reset,
|
||||
(unsigned long)esai_priv);
|
||||
tasklet_setup(&esai_priv->task, fsl_esai_hw_reset);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
||||
|
|
|
@ -198,9 +198,9 @@ static int siu_pcm_rd_set(struct siu_port *port_info,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void siu_io_tasklet(unsigned long data)
|
||||
static void siu_io_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct siu_stream *siu_stream = (struct siu_stream *)data;
|
||||
struct siu_stream *siu_stream = from_tasklet(siu_stream, t, tasklet);
|
||||
struct snd_pcm_substream *substream = siu_stream->substream;
|
||||
struct device *dev = substream->pcm->card->dev;
|
||||
struct snd_pcm_runtime *rt = substream->runtime;
|
||||
|
@ -520,10 +520,8 @@ static int siu_pcm_new(struct snd_soc_component *component,
|
|||
(*port_info)->pcm = pcm;
|
||||
|
||||
/* IO tasklets */
|
||||
tasklet_init(&(*port_info)->playback.tasklet, siu_io_tasklet,
|
||||
(unsigned long)&(*port_info)->playback);
|
||||
tasklet_init(&(*port_info)->capture.tasklet, siu_io_tasklet,
|
||||
(unsigned long)&(*port_info)->capture);
|
||||
tasklet_setup(&(*port_info)->playback.tasklet, siu_io_tasklet);
|
||||
tasklet_setup(&(*port_info)->capture.tasklet, siu_io_tasklet);
|
||||
}
|
||||
|
||||
dev_info(card->dev, "SuperH SIU driver initialized.\n");
|
||||
|
|
|
@ -134,9 +134,9 @@ txx9aclc_dma_submit(struct txx9aclc_dmadata *dmadata, dma_addr_t buf_dma_addr)
|
|||
|
||||
#define NR_DMA_CHAIN 2
|
||||
|
||||
static void txx9aclc_dma_tasklet(unsigned long data)
|
||||
static void txx9aclc_dma_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct txx9aclc_dmadata *dmadata = (struct txx9aclc_dmadata *)data;
|
||||
struct txx9aclc_dmadata *dmadata = from_tasklet(dmadata, t, tasklet);
|
||||
struct dma_chan *chan = dmadata->dma_chan;
|
||||
struct dma_async_tx_descriptor *desc;
|
||||
struct snd_pcm_substream *substream = dmadata->substream;
|
||||
|
@ -352,8 +352,7 @@ static int txx9aclc_dma_init(struct txx9aclc_soc_device *dev,
|
|||
"playback" : "capture");
|
||||
return -EBUSY;
|
||||
}
|
||||
tasklet_init(&dmadata->tasklet, txx9aclc_dma_tasklet,
|
||||
(unsigned long)dmadata);
|
||||
tasklet_setup(&dmadata->tasklet, txx9aclc_dma_tasklet);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -344,10 +344,9 @@ static void snd_usbmidi_do_output(struct snd_usb_midi_out_endpoint *ep)
|
|||
spin_unlock_irqrestore(&ep->buffer_lock, flags);
|
||||
}
|
||||
|
||||
static void snd_usbmidi_out_tasklet(unsigned long data)
|
||||
static void snd_usbmidi_out_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct snd_usb_midi_out_endpoint *ep =
|
||||
(struct snd_usb_midi_out_endpoint *) data;
|
||||
struct snd_usb_midi_out_endpoint *ep = from_tasklet(ep, t, tasklet);
|
||||
|
||||
snd_usbmidi_do_output(ep);
|
||||
}
|
||||
|
@ -1441,7 +1440,7 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
|||
}
|
||||
|
||||
spin_lock_init(&ep->buffer_lock);
|
||||
tasklet_init(&ep->tasklet, snd_usbmidi_out_tasklet, (unsigned long)ep);
|
||||
tasklet_setup(&ep->tasklet, snd_usbmidi_out_tasklet);
|
||||
init_waitqueue_head(&ep->drain_wait);
|
||||
|
||||
for (i = 0; i < 0x10; ++i)
|
||||
|
|
|
@ -247,9 +247,9 @@ static inline void add_with_wraparound(struct ua101 *ua,
|
|||
*value -= ua->playback.queue_length;
|
||||
}
|
||||
|
||||
static void playback_tasklet(unsigned long data)
|
||||
static void playback_tasklet(struct tasklet_struct *t)
|
||||
{
|
||||
struct ua101 *ua = (void *)data;
|
||||
struct ua101 *ua = from_tasklet(ua, t, playback_tasklet);
|
||||
unsigned long flags;
|
||||
unsigned int frames;
|
||||
struct ua101_urb *urb;
|
||||
|
@ -1218,8 +1218,7 @@ static int ua101_probe(struct usb_interface *interface,
|
|||
spin_lock_init(&ua->lock);
|
||||
mutex_init(&ua->mutex);
|
||||
INIT_LIST_HEAD(&ua->ready_playback_urbs);
|
||||
tasklet_init(&ua->playback_tasklet,
|
||||
playback_tasklet, (unsigned long)ua);
|
||||
tasklet_setup(&ua->playback_tasklet, playback_tasklet);
|
||||
init_waitqueue_head(&ua->alsa_capture_wait);
|
||||
init_waitqueue_head(&ua->rate_feedback_wait);
|
||||
init_waitqueue_head(&ua->alsa_playback_wait);
|
||||
|
|
|
@ -369,11 +369,13 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|||
case USB_ID(0x07fd, 0x0008): /* MOTU M Series */
|
||||
case USB_ID(0x31e9, 0x0001): /* Solid State Logic SSL2 */
|
||||
case USB_ID(0x31e9, 0x0002): /* Solid State Logic SSL2+ */
|
||||
case USB_ID(0x0499, 0x172f): /* Steinberg UR22C */
|
||||
case USB_ID(0x0d9a, 0x00df): /* RTX6001 */
|
||||
ep = 0x81;
|
||||
ifnum = 2;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
case USB_ID(0x2b73, 0x000a): /* Pioneer DJ DJM-900NXS2 */
|
||||
case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */
|
||||
ep = 0x82;
|
||||
ifnum = 0;
|
||||
goto add_sync_ep_from_ifnum;
|
||||
|
|
|
@ -2827,14 +2827,24 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|||
/* Lenovo ThinkStation P620 Rear Line-in, Line-out and Microphone */
|
||||
{
|
||||
USB_DEVICE(0x17aa, 0x1046),
|
||||
QUIRK_DEVICE_PROFILE("Lenovo", "ThinkStation P620 Rear",
|
||||
"Lenovo-ThinkStation-P620-Rear"),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Lenovo",
|
||||
.product_name = "ThinkStation P620 Rear",
|
||||
.profile_name = "Lenovo-ThinkStation-P620-Rear",
|
||||
.ifnum = QUIRK_ANY_INTERFACE,
|
||||
.type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
|
||||
}
|
||||
},
|
||||
/* Lenovo ThinkStation P620 Internal Speaker + Front Headset */
|
||||
{
|
||||
USB_DEVICE(0x17aa, 0x104d),
|
||||
QUIRK_DEVICE_PROFILE("Lenovo", "ThinkStation P620 Main",
|
||||
"Lenovo-ThinkStation-P620-Main"),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Lenovo",
|
||||
.product_name = "ThinkStation P620 Main",
|
||||
.profile_name = "Lenovo-ThinkStation-P620-Main",
|
||||
.ifnum = QUIRK_ANY_INTERFACE,
|
||||
.type = QUIRK_SETUP_DISABLE_AUTOSUSPEND
|
||||
}
|
||||
},
|
||||
|
||||
/* Native Instruments MK2 series */
|
||||
|
@ -3549,14 +3559,40 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
|||
{
|
||||
/*
|
||||
* Pioneer DJ DJM-250MK2
|
||||
* PCM is 8 channels out @ 48 fixed (endpoints 0x01).
|
||||
* The output from computer to the mixer is usable.
|
||||
* PCM is 8 channels out @ 48 fixed (endpoint 0x01)
|
||||
* and 8 channels in @ 48 fixed (endpoint 0x82).
|
||||
*
|
||||
* The input (phono or line to computer) is not working.
|
||||
* It should be at endpoint 0x82 and probably also 8 channels,
|
||||
* but it seems that it works only with Pioneer proprietary software.
|
||||
* Even on officially supported OS, the Audacity was unable to record
|
||||
* and Mixxx to recognize the control vinyls.
|
||||
* Both playback and recording is working, even simultaneously.
|
||||
*
|
||||
* Playback channels could be mapped to:
|
||||
* - CH1
|
||||
* - CH2
|
||||
* - AUX
|
||||
*
|
||||
* Recording channels could be mapped to:
|
||||
* - Post CH1 Fader
|
||||
* - Post CH2 Fader
|
||||
* - Cross Fader A
|
||||
* - Cross Fader B
|
||||
* - MIC
|
||||
* - AUX
|
||||
* - REC OUT
|
||||
*
|
||||
* There is remaining problem with recording directly from PHONO/LINE.
|
||||
* If we map a channel to:
|
||||
* - CH1 Control Tone PHONO
|
||||
* - CH1 Control Tone LINE
|
||||
* - CH2 Control Tone PHONO
|
||||
* - CH2 Control Tone LINE
|
||||
* it is silent.
|
||||
* There is no signal even on other operating systems with official drivers.
|
||||
* The signal appears only when a supported application is started.
|
||||
* This needs to be investigated yet...
|
||||
* (there is quite a lot communication on the USB in both directions)
|
||||
*
|
||||
* In current version this mixer could be used for playback
|
||||
* and for recording from vinyls (through Post CH* Fader)
|
||||
* but not for DVS (Digital Vinyl Systems) like in Mixxx.
|
||||
*/
|
||||
USB_DEVICE_VENDOR_SPEC(0x2b73, 0x0017),
|
||||
.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
|
||||
|
@ -3580,6 +3616,26 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
|||
.rate_max = 48000,
|
||||
.nr_rates = 1,
|
||||
.rate_table = (unsigned int[]) { 48000 }
|
||||
}
|
||||
},
|
||||
{
|
||||
.ifnum = 0,
|
||||
.type = QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||
.data = &(const struct audioformat) {
|
||||
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
|
||||
.channels = 8, // inputs
|
||||
.iface = 0,
|
||||
.altsetting = 1,
|
||||
.altset_idx = 1,
|
||||
.endpoint = 0x82,
|
||||
.ep_attr = USB_ENDPOINT_XFER_ISOC|
|
||||
USB_ENDPOINT_SYNC_ASYNC|
|
||||
USB_ENDPOINT_USAGE_IMPLICIT_FB,
|
||||
.rates = SNDRV_PCM_RATE_48000,
|
||||
.rate_min = 48000,
|
||||
.rate_max = 48000,
|
||||
.nr_rates = 1,
|
||||
.rate_table = (unsigned int[]) { 48000 }
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -518,6 +518,15 @@ static int setup_fmt_after_resume_quirk(struct snd_usb_audio *chip,
|
|||
return 1; /* Continue with creating streams and mixer */
|
||||
}
|
||||
|
||||
static int setup_disable_autosuspend(struct snd_usb_audio *chip,
|
||||
struct usb_interface *iface,
|
||||
struct usb_driver *driver,
|
||||
const struct snd_usb_audio_quirk *quirk)
|
||||
{
|
||||
driver->supports_autosuspend = 0;
|
||||
return 1; /* Continue with creating streams and mixer */
|
||||
}
|
||||
|
||||
/*
|
||||
* audio-interface quirks
|
||||
*
|
||||
|
@ -557,6 +566,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
|||
[QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk,
|
||||
[QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
|
||||
[QUIRK_SETUP_FMT_AFTER_RESUME] = setup_fmt_after_resume_quirk,
|
||||
[QUIRK_SETUP_DISABLE_AUTOSUSPEND] = setup_disable_autosuspend,
|
||||
};
|
||||
|
||||
if (quirk->type < QUIRK_TYPE_COUNT) {
|
||||
|
@ -1493,6 +1503,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
|
|||
set_format_emu_quirk(subs, fmt);
|
||||
break;
|
||||
case USB_ID(0x2b73, 0x000a): /* Pioneer DJ DJM-900NXS2 */
|
||||
case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */
|
||||
pioneer_djm_set_format_quirk(subs);
|
||||
break;
|
||||
case USB_ID(0x534d, 0x2109): /* MacroSilicon MS2109 */
|
||||
|
|
|
@ -102,6 +102,7 @@ enum quirk_type {
|
|||
QUIRK_AUDIO_ALIGN_TRANSFER,
|
||||
QUIRK_AUDIO_STANDARD_MIXER,
|
||||
QUIRK_SETUP_FMT_AFTER_RESUME,
|
||||
QUIRK_SETUP_DISABLE_AUTOSUSPEND,
|
||||
|
||||
QUIRK_TYPE_COUNT
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@ menuconfig SND_X86
|
|||
if SND_X86
|
||||
|
||||
config HDMI_LPE_AUDIO
|
||||
tristate "HDMI audio without HDaudio on Intel Atom platforms"
|
||||
tristate "HDMI audio without HDAudio on Intel Atom platforms"
|
||||
depends on DRM_I915
|
||||
select SND_PCM
|
||||
help
|
||||
|
|
Loading…
Reference in New Issue