mirror of
https://github.com/torvalds/linux.git
synced 2025-04-09 14:45:27 +00:00
sound fixes for 6.14-rc1
Here is a collection of fixes that have been gathered since the previous PR. All about device-specific fixes and quirks, and most of them are pretty small and trivial. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmecg4cOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE81hA/+KOMzEBGv0JDPYmVujjCOpAW7sl48JWmAWhxj v0roRbmYttVDtljxGvMze8B4lH8o16pTd+OUXWBV99Py9bG4w3mqGT540kYMlwp3 P1h1sXtBWXdOPqjTH54d+73qPLSHBLvivPDfZ3KUVekTGA6TMvUsMr6BsiOgpFV6 OKduEN1r2yf80IkWLDv2dC8LHKynGUY+sOZYFMk0ILiXzL1ejlilL/pMPFt2FKHG 9+wHE9iIKnZCG7nsLFgHVjNDDnnCNQ7+xIFIcNwxP1d3QQ3XgnyLn5MNYShGEzRy xv+8NJiBEwLlBh7ebqFoSChxGlphwep5PyTg3sfPOAzZMkYeP8KkR0vc7LegvBl/ zYkyEUCid/h9d3TvxCrgRxjcWdSryHHIYYmAwaQgwCoiS4oEHucj1KtMUYJvxzdS JLi6JzLtWZWFAYY6MSD+f9m6cZY5fSXuNyZ/cQHtF1j5XV0byQ0V3f2s3EPAWj0f psqZ2jNv8Ih8JqCYJwy6IRCursZEmgzIXdnjIxXJf+aXUuCFVwuBsDIiJrLTliAr un8k0p2O5QjtT8iguQUmmJgLrIQ7JxOGPtDnMDHZ9GT/fs7HtVBPdZys2L40slGV BjUT8S7Tj77GhJ5n/OwexRFBdr6UBxUH9KXQMpMwfjbf/u/04G/8yYKwpIoVQBoV gPjvgFc= =FOg9 -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Here is a collection of fixes that have been gathered since the previous pull request. All about device-specific fixes and quirks, and most of them are pretty small and trivial" * tag 'sound-fix-6.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (25 commits) ALSA: hda/realtek: Workaround for resume on Dell Venue 11 Pro 7130 ALSA: hda: Fix headset detection failure due to unstable sort ALSA: pcm: use new array-copying-wrapper ASoC: codec: es8316: "DAC Soft Ramp Rate" is just a 2 bit control ASoC: amd: acp: Fix possible deadlock firmware: cs_dsp: FW_CS_DSP_KUNIT_TEST should not select REGMAP ALSA: usb-audio: Add delay quirk for iBasso DC07 Pro ALSA: hda/realtek: Fix quirk matching for Legion Pro 7 ASoC: renesas: SND_SIU_MIGOR should depend on DMADEVICES ASoC: Intel: bytcr_rt5640: Add DMI quirk for Vexia Edu Atla 10 tablet 5V ASoC: da7213: Initialize the mutex ASoC: use to_platform_device() instead of container_of() ASoC: acp: Support microphone from Lenovo Go S ASoC: SOF: imx8m: Add entry for new 8M Plus revision ASoC: SOF: imx8: Add entries for new 8QM and 8QXP revisions ASoC: SOF: imx: Add mach entry to select cs42888 topology dt-bindings: arm: imx: Add board revisions for i.MX8MP, i.MX8QM and i.MX8QXP ASoC: fsl_asrc_m2m: select CONFIG_DMA_SHARED_BUFFER ASoC: audio-graph-card2: use correct endpoint when getting link parameters ASoC: SOF: imx8m: add SAI2,5,6,7 ...
This commit is contained in:
commit
8f08ed05b3
@ -1091,6 +1091,7 @@ properties:
|
||||
- dmo,imx8mp-data-modul-edm-sbc # i.MX8MP eDM SBC
|
||||
- emcraft,imx8mp-navqp # i.MX8MP Emcraft Systems NavQ+ Kit
|
||||
- fsl,imx8mp-evk # i.MX8MP EVK Board
|
||||
- fsl,imx8mp-evk-revb4 # i.MX8MP EVK Rev B4 Board
|
||||
- gateworks,imx8mp-gw71xx-2x # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw72xx-2x # i.MX8MP Gateworks Board
|
||||
- gateworks,imx8mp-gw73xx-2x # i.MX8MP Gateworks Board
|
||||
@ -1271,6 +1272,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- fsl,imx8qm-mek # i.MX8QM MEK Board
|
||||
- fsl,imx8qm-mek-revd # i.MX8QM MEK Rev D Board
|
||||
- toradex,apalis-imx8 # Apalis iMX8 Modules
|
||||
- toradex,apalis-imx8-v1.1 # Apalis iMX8 V1.1 Modules
|
||||
- const: fsl,imx8qm
|
||||
@ -1299,6 +1301,7 @@ properties:
|
||||
- enum:
|
||||
- einfochips,imx8qxp-ai_ml # i.MX8QXP AI_ML Board
|
||||
- fsl,imx8qxp-mek # i.MX8QXP MEK Board
|
||||
- fsl,imx8qxp-mek-wcpu # i.MX8QXP MEK WCPU Board
|
||||
- const: fsl,imx8qxp
|
||||
|
||||
- description: i.MX8DXL based Boards
|
||||
|
@ -4,7 +4,7 @@
|
||||
$id: http://devicetree.org/schemas/sound/ti,pcm1681.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments PCM1681 8-channel PWM Processor
|
||||
title: Texas Instruments PCM1681 8-channel Digital-to-Analog Converter
|
||||
|
||||
maintainers:
|
||||
- Shenghao Ding <shenghao-ding@ti.com>
|
||||
|
@ -6,15 +6,13 @@ config FW_CS_DSP
|
||||
|
||||
config FW_CS_DSP_KUNIT_TEST_UTILS
|
||||
tristate
|
||||
depends on KUNIT
|
||||
select REGMAP
|
||||
depends on KUNIT && REGMAP
|
||||
select FW_CS_DSP
|
||||
|
||||
config FW_CS_DSP_KUNIT_TEST
|
||||
tristate "KUnit tests for Cirrus Logic cs_dsp" if !KUNIT_ALL_TESTS
|
||||
depends on KUNIT
|
||||
depends on KUNIT && REGMAP
|
||||
default KUNIT_ALL_TESTS
|
||||
select REGMAP
|
||||
select FW_CS_DSP
|
||||
select FW_CS_DSP_KUNIT_TEST_UTILS
|
||||
help
|
||||
|
@ -3245,7 +3245,7 @@ static int snd_pcm_xfern_frames_ioctl(struct snd_pcm_substream *substream,
|
||||
if (copy_from_user(&xfern, _xfern, sizeof(xfern)))
|
||||
return -EFAULT;
|
||||
|
||||
bufs = memdup_user(xfern.bufs, sizeof(void *) * runtime->channels);
|
||||
bufs = memdup_array_user(xfern.bufs, runtime->channels, sizeof(void *));
|
||||
if (IS_ERR(bufs))
|
||||
return PTR_ERR(bufs);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
|
@ -80,7 +80,11 @@ static int compare_input_type(const void *ap, const void *bp)
|
||||
|
||||
/* In case one has boost and the other one has not,
|
||||
pick the one with boost first. */
|
||||
return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
||||
if (a->has_boost_on_pin != b->has_boost_on_pin)
|
||||
return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
||||
|
||||
/* Keep the original order */
|
||||
return a->order - b->order;
|
||||
}
|
||||
|
||||
/* Reorder the surround channels
|
||||
@ -400,6 +404,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
|
||||
reorder_outputs(cfg->speaker_outs, cfg->speaker_pins);
|
||||
|
||||
/* sort inputs in the order of AUTO_PIN_* type */
|
||||
for (i = 0; i < cfg->num_inputs; i++)
|
||||
cfg->inputs[i].order = i;
|
||||
sort(cfg->inputs, cfg->num_inputs, sizeof(cfg->inputs[0]),
|
||||
compare_input_type, NULL);
|
||||
|
||||
|
@ -37,6 +37,7 @@ struct auto_pin_cfg_item {
|
||||
unsigned int is_headset_mic:1;
|
||||
unsigned int is_headphone_mic:1; /* Mic-only in headphone jack */
|
||||
unsigned int has_boost_on_pin:1;
|
||||
int order;
|
||||
};
|
||||
|
||||
struct auto_pin_cfg;
|
||||
|
@ -7497,6 +7497,16 @@ static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,
|
||||
spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear COEF 0x0d (PCBEEP passthrough) bit 0x40 where BIOS sets it wrongly
|
||||
* at PM resume
|
||||
*/
|
||||
static void alc283_fixup_dell_hp_resume(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action == HDA_FIXUP_ACT_INIT)
|
||||
alc_write_coef_idx(codec, 0xd, 0x2800);
|
||||
}
|
||||
|
||||
enum {
|
||||
ALC269_FIXUP_GPIO2,
|
||||
@ -7799,6 +7809,7 @@ enum {
|
||||
ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE,
|
||||
ALC233_FIXUP_MEDION_MTL_SPK,
|
||||
ALC294_FIXUP_BASS_SPEAKER_15,
|
||||
ALC283_FIXUP_DELL_HP_RESUME,
|
||||
};
|
||||
|
||||
/* A special fixup for Lenovo C940 and Yoga Duet 7;
|
||||
@ -10143,6 +10154,10 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc294_fixup_bass_speaker_15,
|
||||
},
|
||||
[ALC283_FIXUP_DELL_HP_RESUME] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc283_fixup_dell_hp_resume,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
@ -10203,6 +10218,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x0604, "Dell Venue 11 Pro 7130", ALC283_FIXUP_DELL_HP_RESUME),
|
||||
SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
|
||||
SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
|
||||
SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
|
||||
@ -10918,7 +10934,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
|
||||
HDA_CODEC_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x386e, "Yoga Pro 7 14ARP8", ALC285_FIXUP_SPEAKER2_TO_DAC1),
|
||||
HDA_CODEC_QUIRK(0x17aa, 0x386f, "Legion Pro 7 16ARX8H", ALC287_FIXUP_TAS2781_I2C),
|
||||
HDA_CODEC_QUIRK(0x17aa, 0x38a8, "Legion Pro 7 16ARX8H", ALC287_FIXUP_TAS2781_I2C), /* this must match before PCI SSID 17aa:386f below */
|
||||
SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7i 16IAX7", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
|
@ -181,6 +181,7 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_mas
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev);
|
||||
spin_unlock_irq(&adata->acp_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
@ -304,6 +304,34 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83AS"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83L3"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83N6"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83Q2"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
@ -2203,6 +2203,8 @@ static int da7213_i2c_probe(struct i2c_client *i2c)
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_init(&da7213->ctrl_lock);
|
||||
|
||||
pm_runtime_set_autosuspend_delay(&i2c->dev, 100);
|
||||
pm_runtime_use_autosuspend(&i2c->dev);
|
||||
pm_runtime_set_active(&i2c->dev);
|
||||
|
@ -101,7 +101,7 @@ static const struct snd_kcontrol_new es8316_snd_controls[] = {
|
||||
SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL,
|
||||
ES8316_DAC_VOLR, 0, 0xc0, 1, dac_vol_tlv),
|
||||
SOC_SINGLE("DAC Soft Ramp Switch", ES8316_DAC_SET1, 4, 1, 1),
|
||||
SOC_SINGLE("DAC Soft Ramp Rate", ES8316_DAC_SET1, 2, 4, 0),
|
||||
SOC_SINGLE("DAC Soft Ramp Rate", ES8316_DAC_SET1, 2, 3, 0),
|
||||
SOC_SINGLE("DAC Notch Filter Switch", ES8316_DAC_SET2, 6, 1, 0),
|
||||
SOC_SINGLE("DAC Double Fs Switch", ES8316_DAC_SET2, 7, 1, 0),
|
||||
SOC_SINGLE("DAC Stereo Enhancement", ES8316_DAC_SET3, 0, 7, 0),
|
||||
|
@ -911,7 +911,7 @@ static void es8326_jack_detect_handler(struct work_struct *work)
|
||||
regmap_write(es8326->regmap, ES8326_INT_SOURCE,
|
||||
(ES8326_INT_SRC_PIN9 | ES8326_INT_SRC_BUTTON));
|
||||
regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x1f);
|
||||
regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x08);
|
||||
regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x0d);
|
||||
queue_delayed_work(system_wq, &es8326->jack_detect_work,
|
||||
msecs_to_jiffies(400));
|
||||
es8326->hp = 1;
|
||||
@ -1023,7 +1023,7 @@ static void es8326_init(struct snd_soc_component *component)
|
||||
struct es8326_priv *es8326 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
regmap_write(es8326->regmap, ES8326_RESET, 0x1f);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDSEL, 0x0E);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDSEL, 0x3E);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0);
|
||||
usleep_range(10000, 15000);
|
||||
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xd9);
|
||||
|
@ -1091,8 +1091,7 @@ static int rt5514_set_bias_level(struct snd_soc_component *component,
|
||||
static int rt5514_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component);
|
||||
struct platform_device *pdev = container_of(component->dev,
|
||||
struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(component->dev);
|
||||
|
||||
rt5514->mclk = devm_clk_get_optional(component->dev, "mclk");
|
||||
if (IS_ERR(rt5514->mclk))
|
||||
|
@ -6,6 +6,7 @@ comment "Common SoC Audio options for Freescale CPUs:"
|
||||
config SND_SOC_FSL_ASRC
|
||||
tristate "Asynchronous Sample Rate Converter (ASRC) module support"
|
||||
depends on HAS_DMA
|
||||
select DMA_SHARED_BUFFER
|
||||
select REGMAP_MMIO
|
||||
select SND_SOC_GENERIC_DMAENGINE_PCM
|
||||
select SND_COMPRESS_ACCEL
|
||||
|
@ -183,7 +183,7 @@ static int asrc_dmaconfig(struct fsl_asrc_pair *pair,
|
||||
}
|
||||
|
||||
/* main function of converter */
|
||||
static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_task_runtime *task)
|
||||
static int asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_task_runtime *task)
|
||||
{
|
||||
struct fsl_asrc *asrc = pair->asrc;
|
||||
struct device *dev = &asrc->pdev->dev;
|
||||
@ -193,7 +193,7 @@ static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_tas
|
||||
unsigned int out_dma_len;
|
||||
unsigned int width;
|
||||
u32 fifo_addr;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
/* set ratio mod */
|
||||
if (asrc->m2m_set_ratio_mod) {
|
||||
@ -215,6 +215,7 @@ static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_tas
|
||||
in_buf_len > ASRC_M2M_BUFFER_SIZE ||
|
||||
in_buf_len % (width * pair->channels / 8)) {
|
||||
dev_err(dev, "out buffer size is error: [%d]\n", in_buf_len);
|
||||
ret = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
@ -245,6 +246,7 @@ static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_tas
|
||||
}
|
||||
} else if (out_dma_len > ASRC_M2M_BUFFER_SIZE) {
|
||||
dev_err(dev, "cap buffer size error\n");
|
||||
ret = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
@ -263,12 +265,14 @@ static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_tas
|
||||
|
||||
if (!wait_for_completion_interruptible_timeout(&pair->complete[IN], 10 * HZ)) {
|
||||
dev_err(dev, "out DMA task timeout\n");
|
||||
ret = -ETIMEDOUT;
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (out_dma_len > 0) {
|
||||
if (!wait_for_completion_interruptible_timeout(&pair->complete[OUT], 10 * HZ)) {
|
||||
dev_err(dev, "cap DMA task timeout\n");
|
||||
ret = -ETIMEDOUT;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
@ -278,7 +282,7 @@ static void asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_tas
|
||||
/* update payload length for capture */
|
||||
task->output_size = out_dma_len;
|
||||
end:
|
||||
return;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fsl_asrc_m2m_comp_open(struct snd_compr_stream *stream)
|
||||
@ -525,9 +529,7 @@ static int fsl_asrc_m2m_comp_task_start(struct snd_compr_stream *stream,
|
||||
struct snd_compr_runtime *runtime = stream->runtime;
|
||||
struct fsl_asrc_pair *pair = runtime->private_data;
|
||||
|
||||
asrc_m2m_device_run(pair, task);
|
||||
|
||||
return 0;
|
||||
return asrc_m2m_device_run(pair, task);
|
||||
}
|
||||
|
||||
static int fsl_asrc_m2m_comp_task_stop(struct snd_compr_stream *stream,
|
||||
@ -633,7 +635,7 @@ int fsl_asrc_m2m_suspend(struct fsl_asrc *asrc)
|
||||
|
||||
for (i = 0; i < PAIR_CTX_NUM; i++) {
|
||||
pair = asrc->pair[i];
|
||||
if (!pair)
|
||||
if (!pair || !pair->dma_buffer[IN].area || !pair->dma_buffer[OUT].area)
|
||||
continue;
|
||||
if (!completion_done(&pair->complete[IN])) {
|
||||
if (pair->dma_chan[IN])
|
||||
|
@ -648,23 +648,23 @@ multi_err:
|
||||
|
||||
static int graph_parse_node_single(struct simple_util_priv *priv,
|
||||
enum graph_type gtype,
|
||||
struct device_node *port,
|
||||
struct device_node *ep,
|
||||
struct link_info *li, int is_cpu)
|
||||
{
|
||||
struct device_node *ep __free(device_node) = of_graph_get_next_port_endpoint(port, NULL);
|
||||
|
||||
return __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
|
||||
}
|
||||
|
||||
static int graph_parse_node(struct simple_util_priv *priv,
|
||||
enum graph_type gtype,
|
||||
struct device_node *port,
|
||||
struct device_node *ep,
|
||||
struct link_info *li, int is_cpu)
|
||||
{
|
||||
struct device_node *port __free(device_node) = ep_to_port(ep);
|
||||
|
||||
if (graph_lnk_is_multi(port))
|
||||
return graph_parse_node_multi(priv, gtype, port, li, is_cpu);
|
||||
else
|
||||
return graph_parse_node_single(priv, gtype, port, li, is_cpu);
|
||||
return graph_parse_node_single(priv, gtype, ep, li, is_cpu);
|
||||
}
|
||||
|
||||
static void graph_parse_daifmt(struct device_node *node, unsigned int *daifmt)
|
||||
@ -722,14 +722,15 @@ static unsigned int graph_parse_bitframe(struct device_node *ep)
|
||||
|
||||
static void graph_link_init(struct simple_util_priv *priv,
|
||||
struct device_node *lnk,
|
||||
struct device_node *port_cpu,
|
||||
struct device_node *port_codec,
|
||||
struct device_node *ep_cpu,
|
||||
struct device_node *ep_codec,
|
||||
struct link_info *li,
|
||||
int is_cpu_node)
|
||||
{
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
struct device_node *ep_cpu, *ep_codec;
|
||||
struct device_node *port_cpu = ep_to_port(ep_cpu);
|
||||
struct device_node *port_codec = ep_to_port(ep_codec);
|
||||
struct device_node *multi_cpu_port = NULL, *multi_codec_port = NULL;
|
||||
struct snd_soc_dai_link_component *dlc;
|
||||
unsigned int daifmt = 0;
|
||||
@ -739,25 +740,23 @@ static void graph_link_init(struct simple_util_priv *priv,
|
||||
int multi_cpu_port_idx = 1, multi_codec_port_idx = 1;
|
||||
int i;
|
||||
|
||||
of_node_get(port_cpu);
|
||||
if (graph_lnk_is_multi(port_cpu)) {
|
||||
multi_cpu_port = port_cpu;
|
||||
ep_cpu = graph_get_next_multi_ep(&multi_cpu_port, multi_cpu_port_idx++);
|
||||
of_node_put(port_cpu);
|
||||
port_cpu = ep_to_port(ep_cpu);
|
||||
} else {
|
||||
ep_cpu = of_graph_get_next_port_endpoint(port_cpu, NULL);
|
||||
of_node_get(ep_cpu);
|
||||
}
|
||||
struct device_node *ports_cpu __free(device_node) = port_to_ports(port_cpu);
|
||||
|
||||
of_node_get(port_codec);
|
||||
if (graph_lnk_is_multi(port_codec)) {
|
||||
multi_codec_port = port_codec;
|
||||
ep_codec = graph_get_next_multi_ep(&multi_codec_port, multi_codec_port_idx++);
|
||||
of_node_put(port_codec);
|
||||
port_codec = ep_to_port(ep_codec);
|
||||
} else {
|
||||
ep_codec = of_graph_get_next_port_endpoint(port_codec, NULL);
|
||||
of_node_get(ep_codec);
|
||||
}
|
||||
struct device_node *ports_codec __free(device_node) = port_to_ports(port_codec);
|
||||
|
||||
@ -833,7 +832,7 @@ int audio_graph2_link_normal(struct simple_util_priv *priv,
|
||||
{
|
||||
struct device_node *cpu_port = lnk;
|
||||
struct device_node *cpu_ep __free(device_node) = of_graph_get_next_port_endpoint(cpu_port, NULL);
|
||||
struct device_node *codec_port __free(device_node) = of_graph_get_remote_port(cpu_ep);
|
||||
struct device_node *codec_ep __free(device_node) = of_graph_get_remote_endpoint(cpu_ep);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
@ -841,18 +840,18 @@ int audio_graph2_link_normal(struct simple_util_priv *priv,
|
||||
* see
|
||||
* __graph_parse_node() :: DAI Naming
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, codec_port, li, 0);
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, codec_ep, li, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* call CPU, and set DAI Name
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_port, li, 1);
|
||||
ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_ep, li, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
graph_link_init(priv, lnk, cpu_port, codec_port, li, 1);
|
||||
graph_link_init(priv, lnk, cpu_ep, codec_ep, li, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -864,15 +863,15 @@ int audio_graph2_link_dpcm(struct simple_util_priv *priv,
|
||||
{
|
||||
struct device_node *ep __free(device_node) = of_graph_get_next_port_endpoint(lnk, NULL);
|
||||
struct device_node *rep __free(device_node) = of_graph_get_remote_endpoint(ep);
|
||||
struct device_node *cpu_port = NULL;
|
||||
struct device_node *codec_port = NULL;
|
||||
struct device_node *cpu_ep = NULL;
|
||||
struct device_node *codec_ep = NULL;
|
||||
struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
|
||||
struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
|
||||
int is_cpu = graph_util_is_ports0(lnk);
|
||||
int ret;
|
||||
|
||||
if (is_cpu) {
|
||||
cpu_port = of_graph_get_remote_port(ep); /* rport */
|
||||
cpu_ep = rep;
|
||||
|
||||
/*
|
||||
* dpcm {
|
||||
@ -901,12 +900,12 @@ int audio_graph2_link_dpcm(struct simple_util_priv *priv,
|
||||
dai_link->dynamic = 1;
|
||||
dai_link->dpcm_merged_format = 1;
|
||||
|
||||
ret = graph_parse_node(priv, GRAPH_DPCM, cpu_port, li, 1);
|
||||
ret = graph_parse_node(priv, GRAPH_DPCM, cpu_ep, li, 1);
|
||||
if (ret)
|
||||
goto err;
|
||||
return ret;
|
||||
|
||||
} else {
|
||||
codec_port = of_graph_get_remote_port(ep); /* rport */
|
||||
codec_ep = rep;
|
||||
|
||||
/*
|
||||
* dpcm {
|
||||
@ -937,18 +936,15 @@ int audio_graph2_link_dpcm(struct simple_util_priv *priv,
|
||||
dai_link->no_pcm = 1;
|
||||
dai_link->be_hw_params_fixup = simple_util_be_hw_params_fixup;
|
||||
|
||||
ret = graph_parse_node(priv, GRAPH_DPCM, codec_port, li, 0);
|
||||
ret = graph_parse_node(priv, GRAPH_DPCM, codec_ep, li, 0);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
return ret;
|
||||
}
|
||||
|
||||
graph_parse_convert(ep, dai_props); /* at node of <dpcm> */
|
||||
graph_parse_convert(rep, dai_props); /* at node of <CPU/Codec> */
|
||||
|
||||
graph_link_init(priv, lnk, cpu_port, codec_port, li, is_cpu);
|
||||
err:
|
||||
of_node_put(cpu_port);
|
||||
of_node_put(codec_port);
|
||||
graph_link_init(priv, lnk, cpu_ep, codec_ep, li, is_cpu);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1013,26 +1009,26 @@ int audio_graph2_link_c2c(struct simple_util_priv *priv,
|
||||
struct device_node *ep0 __free(device_node) = of_graph_get_next_port_endpoint(port0, NULL);
|
||||
struct device_node *ep1 __free(device_node) = of_graph_get_next_port_endpoint(port1, NULL);
|
||||
|
||||
struct device_node *codec0_port __free(device_node) = of_graph_get_remote_port(ep0);
|
||||
struct device_node *codec1_port __free(device_node) = of_graph_get_remote_port(ep1);
|
||||
struct device_node *codec0_ep __free(device_node) = of_graph_get_remote_endpoint(ep0);
|
||||
struct device_node *codec1_ep __free(device_node) = of_graph_get_remote_endpoint(ep1);
|
||||
|
||||
/*
|
||||
* call Codec first.
|
||||
* see
|
||||
* __graph_parse_node() :: DAI Naming
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0);
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec1_ep, li, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* call CPU, and set DAI Name
|
||||
*/
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1);
|
||||
ret = graph_parse_node(priv, GRAPH_C2C, codec0_ep, li, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
graph_link_init(priv, lnk, codec0_port, codec1_port, li, 1);
|
||||
graph_link_init(priv, lnk, codec0_ep, codec1_ep, li, 1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1132,7 +1132,22 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
||||
BYT_RT5640_SSP0_AIF2 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Vexia Edu Atla 10 tablet */
|
||||
{
|
||||
/* Vexia Edu Atla 10 tablet 5V version */
|
||||
.matches = {
|
||||
/* Having all 3 of these not set is somewhat unique */
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "To be filled by O.E.M."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "To be filled by O.E.M."),
|
||||
/* Above strings are too generic, also match on BIOS date */
|
||||
DMI_MATCH(DMI_BIOS_DATE, "05/14/2015"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_JD_NOT_INV |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Vexia Edu Atla 10 tablet 9V version */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
|
||||
|
@ -67,7 +67,7 @@ config SND_SH7760_AC97
|
||||
|
||||
config SND_SIU_MIGOR
|
||||
tristate "SIU sound support on Migo-R"
|
||||
depends on SH_MIGOR && I2C
|
||||
depends on SH_MIGOR && I2C && DMADEVICES
|
||||
select SND_SOC_SH4_SIU
|
||||
select SND_SOC_WM8978
|
||||
help
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
#define DRV_NAME "rockchip-i2s-tdm"
|
||||
|
||||
#define DEFAULT_MCLK_FS 256
|
||||
#define CH_GRP_MAX 4 /* The max channel 8 / 2 */
|
||||
#define MULTIPLEX_CH_MAX 10
|
||||
|
||||
@ -70,6 +69,8 @@ struct rk_i2s_tdm_dev {
|
||||
bool has_playback;
|
||||
bool has_capture;
|
||||
struct snd_soc_dai_driver *dai;
|
||||
unsigned int mclk_rx_freq;
|
||||
unsigned int mclk_tx_freq;
|
||||
};
|
||||
|
||||
static int to_ch_num(unsigned int val)
|
||||
@ -617,6 +618,27 @@ static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
|
||||
unsigned int freq, int dir)
|
||||
{
|
||||
struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
|
||||
|
||||
if (i2s_tdm->clk_trcm) {
|
||||
i2s_tdm->mclk_tx_freq = freq;
|
||||
i2s_tdm->mclk_rx_freq = freq;
|
||||
} else {
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
i2s_tdm->mclk_tx_freq = freq;
|
||||
else
|
||||
i2s_tdm->mclk_rx_freq = freq;
|
||||
}
|
||||
|
||||
dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
|
||||
stream ? "rx" : "tx", freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct snd_soc_dai *dai)
|
||||
@ -631,15 +653,19 @@ static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
if (i2s_tdm->clk_trcm == TRCM_TX) {
|
||||
mclk = i2s_tdm->mclk_tx;
|
||||
mclk_rate = i2s_tdm->mclk_tx_freq;
|
||||
} else if (i2s_tdm->clk_trcm == TRCM_RX) {
|
||||
mclk = i2s_tdm->mclk_rx;
|
||||
mclk_rate = i2s_tdm->mclk_rx_freq;
|
||||
} else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
mclk = i2s_tdm->mclk_tx;
|
||||
mclk_rate = i2s_tdm->mclk_tx_freq;
|
||||
} else {
|
||||
mclk = i2s_tdm->mclk_rx;
|
||||
mclk_rate = i2s_tdm->mclk_rx_freq;
|
||||
}
|
||||
|
||||
err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params));
|
||||
err = clk_set_rate(mclk, mclk_rate);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -799,6 +825,7 @@ static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
|
||||
.hw_params = rockchip_i2s_tdm_hw_params,
|
||||
.set_bclk_ratio = rockchip_i2s_tdm_set_bclk_ratio,
|
||||
.set_fmt = rockchip_i2s_tdm_set_fmt,
|
||||
.set_sysclk = rockchip_i2s_tdm_set_sysclk,
|
||||
.set_tdm_slot = rockchip_dai_tdm_slot,
|
||||
.trigger = rockchip_i2s_tdm_trigger,
|
||||
};
|
||||
|
@ -175,8 +175,7 @@ static int imx8_run(struct snd_sof_dev *sdev)
|
||||
|
||||
static int imx8_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev =
|
||||
container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *res_node;
|
||||
struct resource *mmio;
|
||||
@ -606,11 +605,32 @@ static struct snd_sof_of_mach sof_imx8_machs[] = {
|
||||
.sof_tplg_filename = "sof-imx8-wm8960.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8qxp-mek-wcpu",
|
||||
.sof_tplg_filename = "sof-imx8-wm8962.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8qm-mek",
|
||||
.sof_tplg_filename = "sof-imx8-wm8960.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8qm-mek-revd",
|
||||
.sof_tplg_filename = "sof-imx8-wm8962.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8qxp-mek-bb",
|
||||
.sof_tplg_filename = "sof-imx8-cs42888.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8qm-mek-bb",
|
||||
.sof_tplg_filename = "sof-imx8-cs42888.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -144,8 +144,7 @@ static int imx8m_reset(struct snd_sof_dev *sdev)
|
||||
|
||||
static int imx8m_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev =
|
||||
container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *res_node;
|
||||
struct resource *mmio;
|
||||
@ -294,6 +293,17 @@ static struct snd_soc_dai_driver imx8m_dai[] = {
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "sai2",
|
||||
.playback = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
.capture = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "sai3",
|
||||
.playback = {
|
||||
@ -305,6 +315,39 @@ static struct snd_soc_dai_driver imx8m_dai[] = {
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "sai5",
|
||||
.playback = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
.capture = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "sai6",
|
||||
.playback = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
.capture = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "sai7",
|
||||
.playback = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
.capture = {
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
},
|
||||
},
|
||||
{
|
||||
.name = "micfil",
|
||||
.capture = {
|
||||
@ -471,6 +514,11 @@ static const struct snd_sof_dsp_ops sof_imx8m_ops = {
|
||||
};
|
||||
|
||||
static struct snd_sof_of_mach sof_imx8mp_machs[] = {
|
||||
{
|
||||
.compatible = "fsl,imx8mp-evk-revb4",
|
||||
.sof_tplg_filename = "sof-imx8mp-wm8962.tplg",
|
||||
.drv_name = "asoc-audio-graph-card2",
|
||||
},
|
||||
{
|
||||
.compatible = "fsl,imx8mp-evk",
|
||||
.sof_tplg_filename = "sof-imx8mp-wm8960.tplg",
|
||||
|
@ -155,8 +155,7 @@ static int imx8ulp_reset(struct snd_sof_dev *sdev)
|
||||
|
||||
static int imx8ulp_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev =
|
||||
container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *res_node;
|
||||
struct resource *mmio;
|
||||
|
@ -410,8 +410,7 @@ static int bdw_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct snd_sof_pdata *pdata = sdev->pdata;
|
||||
const struct sof_dev_desc *desc = pdata->desc;
|
||||
struct platform_device *pdev =
|
||||
container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
const struct sof_intel_dsp_desc *chip;
|
||||
struct resource *mmio;
|
||||
u32 base, size;
|
||||
|
@ -109,8 +109,7 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct snd_sof_pdata *pdata = sdev->pdata;
|
||||
const struct sof_dev_desc *desc = pdata->desc;
|
||||
struct platform_device *pdev =
|
||||
container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
const struct sof_intel_dsp_desc *chip;
|
||||
struct resource *mmio;
|
||||
u32 base, size;
|
||||
|
@ -238,7 +238,7 @@ static int mt8186_run(struct snd_sof_dev *sdev)
|
||||
|
||||
static int mt8186_dsp_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct adsp_priv *priv;
|
||||
int ret;
|
||||
|
||||
|
@ -228,7 +228,7 @@ static int mt8195_run(struct snd_sof_dev *sdev)
|
||||
|
||||
static int mt8195_dsp_probe(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct adsp_priv *priv;
|
||||
int ret;
|
||||
|
||||
@ -341,7 +341,7 @@ static int mt8195_dsp_shutdown(struct snd_sof_dev *sdev)
|
||||
|
||||
static void mt8195_dsp_remove(struct snd_sof_dev *sdev)
|
||||
{
|
||||
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
struct adsp_priv *priv = sdev->pdata->hw_pdata;
|
||||
|
||||
platform_device_unregister(priv->ipc_dev);
|
||||
@ -351,7 +351,7 @@ static void mt8195_dsp_remove(struct snd_sof_dev *sdev)
|
||||
|
||||
static int mt8195_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
||||
{
|
||||
struct platform_device *pdev = container_of(sdev->dev, struct platform_device, dev);
|
||||
struct platform_device *pdev = to_platform_device(sdev->dev);
|
||||
int ret;
|
||||
u32 reset_sw, dbg_pc;
|
||||
|
||||
|
@ -2343,6 +2343,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x2d95, 0x8021, /* VIVO USB-C-XE710 HEADSET */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x30be, 0x0101, /* Schiit Hel */
|
||||
QUIRK_FLAG_IGNORE_CTL_ERROR),
|
||||
DEVICE_FLG(0x413c, 0xa506, /* Dell AE515 sound bar */
|
||||
|
Loading…
x
Reference in New Issue
Block a user