mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 04:53:36 +01:00
sound fixes for 6.12-rc6
Here we see slightly more commits than wished, but basically all are small and mostly trivial fixes. The only core change is the workaround for __counted_by() usage in ASoC DAPM code, while the rest are device-specific fixes for Intel Baytrail devices, Cirrus and wcd937x codecs, and HD-audio / USB-audio devices. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmcjTV8OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9b9hAAxRs+58mtAIALYftOW79hZPyus5ww/yJyc/me Xpou/u2FgdQs+Ae67QSvhOZImNVHtfg2rU4jSdck8ih+zsaBTOv8EvheTRk1Qjzc C7bZPo1r7AtRawbWV/fXHrL+74Hg0u2FOQLQEs3KXyc85OMR3vN2d479Y8HM6jnF qsFDSgCA7eG1NaimbjHakYxE4s1DXkY+1Gm83nx+y21mZ542mjNVlNstvHPo8huk epchutti72OTKNsdp6ueXxmPfS3GNCNAgc5CcoEXKOEzXYjqhYGhGuHWIveCG0k6 7h4iEklDwp0Pelrai7d2bd6K3mB/AL5CzCuPyg4UduKzaXaIFHI9Stys/6FwuauK D6Hlzsbgb/3a4wR0e1VHznPEnAu6keIaPtVqKuMBCEyN41NYwcTNVFQUx6WW31ZY BwizZvTxG8RMDfctjc0q+l9oM8y0jZLiSjL651qxoik0jB/cLkLF+gKd+L6lrxud q0KHuWKFPKb1+/7ZX5psCjGjsE0fEFtLjSGb3UVtwAGajcqiHCPHEdSWG0GZGyqr oSJ00PJcZj/Qjz6bJIZXHNqZUgN0qlMKuHvxszDRvXMd06KU3jI/57pM3zwAVvfv JNKxcc5icOXB0asrOjxShXu8E3SzDD2YnUioLsZ19hilwE/+J32tZRPt8kaKEeNE efgpjqw= =5pCP -----END PGP SIGNATURE----- Merge tag 'sound-6.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Here we see slightly more commits than wished, but basically all are small and mostly trivial fixes. The only core change is the workaround for __counted_by() usage in ASoC DAPM code, while the rest are device-specific fixes for Intel Baytrail devices, Cirrus and wcd937x codecs, and HD-audio / USB-audio devices" * tag 'sound-6.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek: Fix headset mic on TUXEDO Stellaris 16 Gen6 mb1 ALSA: hda/realtek: Fix headset mic on TUXEDO Gemini 17 Gen3 ALSA: usb-audio: Add quirks for Dell WD19 dock ASoC: codecs: wcd937x: relax the AUX PDM watchdog ASoC: codecs: wcd937x: add missing LO Switch control ASoC: dt-bindings: rockchip,rk3308-codec: add port property ALSA: hda/realtek: Add subwoofer quirk for Infinix ZERO BOOK 13 ASoC: dapm: fix bounds checker error in dapm_widget_list_create ASoC: Intel: sst: Fix used of uninitialized ctx to log an error ASoC: cs42l51: Fix some error handling paths in cs42l51_probe() ASoC: Intel: sst: Support LPE0F28 ACPI HID ALSA: hda/realtek: Limit internal Mic boost on Dell platform ASoC: Intel: bytcr_rt5640: Add DMI quirk for Vexia Edu Atla 10 tablet ASoC: Intel: bytcr_rt5640: Add support for non ACPI instantiated codec ASoC: codecs: rt5640: Always disable IRQs from rt5640_cancel_work()
This commit is contained in:
commit
15cb732c16
11 changed files with 179 additions and 31 deletions
|
@ -48,6 +48,10 @@ properties:
|
|||
- const: mclk_rx
|
||||
- const: hclk
|
||||
|
||||
port:
|
||||
$ref: audio-graph-port.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
|
|
|
@ -721,6 +721,10 @@ static const struct config_entry acpi_config_table[] = {
|
|||
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
|
||||
IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||
/* BayTrail */
|
||||
{
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "LPE0F28",
|
||||
},
|
||||
{
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "80860F28",
|
||||
|
|
|
@ -7521,6 +7521,7 @@ enum {
|
|||
ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
|
||||
ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
|
@ -7551,10 +7552,12 @@ enum {
|
|||
ALC290_FIXUP_SUBWOOFER_HSJACK,
|
||||
ALC269_FIXUP_THINKPAD_ACPI,
|
||||
ALC269_FIXUP_DMIC_THINKPAD_ACPI,
|
||||
ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13,
|
||||
ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
|
||||
ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_HEADSET_MODE,
|
||||
ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
|
||||
|
@ -7996,6 +7999,16 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
|
||||
},
|
||||
[ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x14, 0x90170151 }, /* use as internal speaker (LFE) */
|
||||
{ 0x1b, 0x90170152 }, /* use as internal speaker (back) */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
|
||||
},
|
||||
[ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -8114,6 +8127,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||
},
|
||||
[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -8394,6 +8413,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||
},
|
||||
[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -10725,6 +10750,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x28c1, "Clevo V370VND", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
|
@ -10982,6 +11008,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
|
||||
SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
|
||||
SND_PCI_QUIRK(0x1d05, 0x1387, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d05, 0x1409, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d17, 0x3288, "Haier Boyue G42", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
|
@ -10989,6 +11016,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13),
|
||||
SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
|
||||
SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
|
||||
SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
|
||||
|
@ -11076,6 +11104,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
|
||||
{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
|
||||
{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
|
||||
{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, .name = "dell-headset4-quiet"},
|
||||
{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
|
||||
{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
|
||||
{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
|
||||
|
@ -11630,16 +11659,16 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
|
|||
SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
{0x19, 0x40000000},
|
||||
{0x1b, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
|
||||
{0x19, 0x40000000},
|
||||
{0x1b, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
|
||||
|
|
|
@ -747,8 +747,10 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
|
|||
|
||||
cs42l51->reset_gpio = devm_gpiod_get_optional(dev, "reset",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(cs42l51->reset_gpio))
|
||||
return PTR_ERR(cs42l51->reset_gpio);
|
||||
if (IS_ERR(cs42l51->reset_gpio)) {
|
||||
ret = PTR_ERR(cs42l51->reset_gpio);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (cs42l51->reset_gpio) {
|
||||
dev_dbg(dev, "Release reset gpio\n");
|
||||
|
@ -780,6 +782,7 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
|
|||
return 0;
|
||||
|
||||
error:
|
||||
gpiod_set_value_cansleep(cs42l51->reset_gpio, 1);
|
||||
regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
|
||||
cs42l51->supplies);
|
||||
return ret;
|
||||
|
|
|
@ -2419,10 +2419,20 @@ static irqreturn_t rt5640_jd_gpio_irq(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void rt5640_cancel_work(void *data)
|
||||
static void rt5640_disable_irq_and_cancel_work(void *data)
|
||||
{
|
||||
struct rt5640_priv *rt5640 = data;
|
||||
|
||||
if (rt5640->jd_gpio_irq_requested) {
|
||||
free_irq(rt5640->jd_gpio_irq, rt5640);
|
||||
rt5640->jd_gpio_irq_requested = false;
|
||||
}
|
||||
|
||||
if (rt5640->irq_requested) {
|
||||
free_irq(rt5640->irq, rt5640);
|
||||
rt5640->irq_requested = false;
|
||||
}
|
||||
|
||||
cancel_delayed_work_sync(&rt5640->jack_work);
|
||||
cancel_delayed_work_sync(&rt5640->bp_work);
|
||||
}
|
||||
|
@ -2463,13 +2473,7 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component)
|
|||
if (!rt5640->jack)
|
||||
return;
|
||||
|
||||
if (rt5640->jd_gpio_irq_requested)
|
||||
free_irq(rt5640->jd_gpio_irq, rt5640);
|
||||
|
||||
if (rt5640->irq_requested)
|
||||
free_irq(rt5640->irq, rt5640);
|
||||
|
||||
rt5640_cancel_work(rt5640);
|
||||
rt5640_disable_irq_and_cancel_work(rt5640);
|
||||
|
||||
if (rt5640->jack->status & SND_JACK_MICROPHONE) {
|
||||
rt5640_disable_micbias1_ovcd_irq(component);
|
||||
|
@ -2477,8 +2481,6 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component)
|
|||
snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0);
|
||||
}
|
||||
|
||||
rt5640->jd_gpio_irq_requested = false;
|
||||
rt5640->irq_requested = false;
|
||||
rt5640->jd_gpio = NULL;
|
||||
rt5640->jack = NULL;
|
||||
}
|
||||
|
@ -2798,7 +2800,8 @@ static int rt5640_suspend(struct snd_soc_component *component)
|
|||
if (rt5640->jack) {
|
||||
/* disable jack interrupts during system suspend */
|
||||
disable_irq(rt5640->irq);
|
||||
rt5640_cancel_work(rt5640);
|
||||
cancel_delayed_work_sync(&rt5640->jack_work);
|
||||
cancel_delayed_work_sync(&rt5640->bp_work);
|
||||
}
|
||||
|
||||
snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
|
||||
|
@ -3032,7 +3035,7 @@ static int rt5640_i2c_probe(struct i2c_client *i2c)
|
|||
INIT_DELAYED_WORK(&rt5640->jack_work, rt5640_jack_work);
|
||||
|
||||
/* Make sure work is stopped on probe-error / remove */
|
||||
ret = devm_add_action_or_reset(&i2c->dev, rt5640_cancel_work, rt5640);
|
||||
ret = devm_add_action_or_reset(&i2c->dev, rt5640_disable_irq_and_cancel_work, rt5640);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -715,12 +715,17 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
|
|||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||
struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component);
|
||||
int hph_mode = wcd937x->hph_mode;
|
||||
u8 val;
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_PRE_PMU:
|
||||
val = WCD937X_DIGITAL_PDM_WD_CTL2_EN |
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL |
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF;
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2,
|
||||
BIT(0), BIT(0));
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
|
||||
val);
|
||||
break;
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
usleep_range(1000, 1010);
|
||||
|
@ -741,7 +746,8 @@ static int wcd937x_codec_enable_aux_pa(struct snd_soc_dapm_widget *w,
|
|||
hph_mode);
|
||||
snd_soc_component_update_bits(component,
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2,
|
||||
BIT(0), 0x00);
|
||||
WCD937X_DIGITAL_PDM_WD_CTL2_MASK,
|
||||
0x00);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2049,6 +2055,8 @@ static const struct snd_kcontrol_new wcd937x_snd_controls[] = {
|
|||
wcd937x_get_swr_port, wcd937x_set_swr_port),
|
||||
SOC_SINGLE_EXT("HPHR Switch", WCD937X_HPH_R, 0, 1, 0,
|
||||
wcd937x_get_swr_port, wcd937x_set_swr_port),
|
||||
SOC_SINGLE_EXT("LO Switch", WCD937X_LO, 0, 1, 0,
|
||||
wcd937x_get_swr_port, wcd937x_set_swr_port),
|
||||
|
||||
SOC_SINGLE_EXT("ADC1 Switch", WCD937X_ADC1, 1, 1, 0,
|
||||
wcd937x_get_swr_port, wcd937x_set_swr_port),
|
||||
|
|
|
@ -391,6 +391,10 @@
|
|||
#define WCD937X_DIGITAL_PDM_WD_CTL0 0x3465
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL1 0x3466
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL2 0x3467
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL2_HOLD_OFF BIT(2)
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL2_TIMEOUT_SEL BIT(1)
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL2_EN BIT(0)
|
||||
#define WCD937X_DIGITAL_PDM_WD_CTL2_MASK GENMASK(2, 0)
|
||||
#define WCD937X_DIGITAL_INTR_MODE 0x346A
|
||||
#define WCD937X_DIGITAL_INTR_MASK_0 0x346B
|
||||
#define WCD937X_DIGITAL_INTR_MASK_1 0x346C
|
||||
|
|
|
@ -125,6 +125,28 @@ static const struct sst_res_info bytcr_res_info = {
|
|||
.acpi_ipc_irq_index = 0
|
||||
};
|
||||
|
||||
/* For "LPE0F28" ACPI device found on some Android factory OS models */
|
||||
static const struct sst_res_info lpe8086_res_info = {
|
||||
.shim_offset = 0x140000,
|
||||
.shim_size = 0x000100,
|
||||
.shim_phy_addr = SST_BYT_SHIM_PHY_ADDR,
|
||||
.ssp0_offset = 0xa0000,
|
||||
.ssp0_size = 0x1000,
|
||||
.dma0_offset = 0x98000,
|
||||
.dma0_size = 0x4000,
|
||||
.dma1_offset = 0x9c000,
|
||||
.dma1_size = 0x4000,
|
||||
.iram_offset = 0x0c0000,
|
||||
.iram_size = 0x14000,
|
||||
.dram_offset = 0x100000,
|
||||
.dram_size = 0x28000,
|
||||
.mbox_offset = 0x144000,
|
||||
.mbox_size = 0x1000,
|
||||
.acpi_lpe_res_index = 1,
|
||||
.acpi_ddr_index = 0,
|
||||
.acpi_ipc_irq_index = 0
|
||||
};
|
||||
|
||||
static struct sst_platform_info byt_rvp_platform_data = {
|
||||
.probe_data = &byt_fwparse_info,
|
||||
.ipc_info = &byt_ipc_info,
|
||||
|
@ -268,10 +290,38 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
|||
mach->pdata = &chv_platform_data;
|
||||
pdata = mach->pdata;
|
||||
|
||||
ret = kstrtouint(id->id, 16, &dev_id);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Unique device id conversion error: %d\n", ret);
|
||||
return ret;
|
||||
if (!strcmp(id->id, "LPE0F28")) {
|
||||
struct resource *rsrc;
|
||||
|
||||
/* Use regular BYT SST PCI VID:PID */
|
||||
dev_id = 0x80860F28;
|
||||
byt_rvp_platform_data.res_info = &lpe8086_res_info;
|
||||
|
||||
/*
|
||||
* The "LPE0F28" ACPI device has separate IO-mem resources for:
|
||||
* DDR, SHIM, MBOX, IRAM, DRAM, CFG
|
||||
* None of which covers the entire LPE base address range.
|
||||
* lpe8086_res_info.acpi_lpe_res_index points to the SHIM.
|
||||
* Patch this to cover the entire base address range as expected
|
||||
* by sst_platform_get_resources().
|
||||
*/
|
||||
rsrc = platform_get_resource(pdev, IORESOURCE_MEM,
|
||||
pdata->res_info->acpi_lpe_res_index);
|
||||
if (!rsrc) {
|
||||
dev_err(dev, "Invalid SHIM base\n");
|
||||
return -EIO;
|
||||
}
|
||||
rsrc->start -= pdata->res_info->shim_offset;
|
||||
rsrc->end = rsrc->start + 0x200000 - 1;
|
||||
} else {
|
||||
ret = kstrtouint(id->id, 16, &dev_id);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Unique device id conversion error: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (soc_intel_is_byt_cr(pdev))
|
||||
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "ACPI device id: %x\n", dev_id);
|
||||
|
@ -280,11 +330,6 @@ static int sst_acpi_probe(struct platform_device *pdev)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (soc_intel_is_byt_cr(pdev)) {
|
||||
/* override resource info */
|
||||
byt_rvp_platform_data.res_info = &bytcr_res_info;
|
||||
}
|
||||
|
||||
/* update machine parameters */
|
||||
mach->mach_params.acpi_ipc_irq_index =
|
||||
pdata->res_info->acpi_ipc_irq_index;
|
||||
|
@ -344,6 +389,7 @@ static void sst_acpi_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
static const struct acpi_device_id sst_acpi_ids[] = {
|
||||
{ "LPE0F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
|
||||
{ "80860F28", (unsigned long)&snd_soc_acpi_intel_baytrail_machines},
|
||||
{ "808622A8", (unsigned long)&snd_soc_acpi_intel_cherrytrail_machines},
|
||||
{ },
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/device/bus.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
|
@ -32,6 +33,8 @@
|
|||
#include "../atom/sst-atom-controls.h"
|
||||
#include "../common/soc-intel-quirks.h"
|
||||
|
||||
#define BYT_RT5640_FALLBACK_CODEC_DEV_NAME "i2c-rt5640"
|
||||
|
||||
enum {
|
||||
BYT_RT5640_DMIC1_MAP,
|
||||
BYT_RT5640_DMIC2_MAP,
|
||||
|
@ -1129,6 +1132,21 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||
BYT_RT5640_SSP0_AIF2 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Vexia Edu Atla 10 tablet */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
|
||||
/* Above strings are too generic, also match on BIOS date */
|
||||
DMI_MATCH(DMI_BIOS_DATE, "08/25/2014"),
|
||||
},
|
||||
.driver_data = (void *)(BYT_RT5640_IN1_MAP |
|
||||
BYT_RT5640_JD_SRC_JD2_IN4N |
|
||||
BYT_RT5640_OVCD_TH_2000UA |
|
||||
BYT_RT5640_OVCD_SF_0P75 |
|
||||
BYT_RT5640_DIFF_MIC |
|
||||
BYT_RT5640_SSP0_AIF2 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Voyo Winpad A15 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
|
@ -1698,9 +1716,33 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
|||
|
||||
codec_dev = acpi_get_first_physical_node(adev);
|
||||
acpi_dev_put(adev);
|
||||
if (!codec_dev)
|
||||
return -EPROBE_DEFER;
|
||||
priv->codec_dev = get_device(codec_dev);
|
||||
|
||||
if (codec_dev) {
|
||||
priv->codec_dev = get_device(codec_dev);
|
||||
} else {
|
||||
/*
|
||||
* Special case for Android tablets where the codec i2c_client
|
||||
* has been manually instantiated by x86_android_tablets.ko due
|
||||
* to a broken DSDT.
|
||||
*/
|
||||
codec_dev = bus_find_device_by_name(&i2c_bus_type, NULL,
|
||||
BYT_RT5640_FALLBACK_CODEC_DEV_NAME);
|
||||
if (!codec_dev)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
if (!i2c_verify_client(codec_dev)) {
|
||||
dev_err(dev, "Error '%s' is not an i2c_client\n",
|
||||
BYT_RT5640_FALLBACK_CODEC_DEV_NAME);
|
||||
put_device(codec_dev);
|
||||
}
|
||||
|
||||
/* fixup codec name */
|
||||
strscpy(byt_rt5640_codec_name, BYT_RT5640_FALLBACK_CODEC_DEV_NAME,
|
||||
sizeof(byt_rt5640_codec_name));
|
||||
|
||||
/* bus_find_device() returns a reference no need to get() */
|
||||
priv->codec_dev = codec_dev;
|
||||
}
|
||||
|
||||
/*
|
||||
* swap SSP0 if bytcr is detected
|
||||
|
|
|
@ -1147,6 +1147,8 @@ static int dapm_widget_list_create(struct snd_soc_dapm_widget_list **list,
|
|||
if (*list == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
(*list)->num_widgets = size;
|
||||
|
||||
list_for_each_entry(w, widgets, work_list)
|
||||
(*list)->widgets[i++] = w;
|
||||
|
||||
|
|
|
@ -4042,6 +4042,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
|
|||
break;
|
||||
err = dell_dock_mixer_init(mixer);
|
||||
break;
|
||||
case USB_ID(0x0bda, 0x402e): /* Dell WD19 dock */
|
||||
err = dell_dock_mixer_create(mixer);
|
||||
break;
|
||||
|
||||
case USB_ID(0x2a39, 0x3fd2): /* RME ADI-2 Pro */
|
||||
case USB_ID(0x2a39, 0x3fd3): /* RME ADI-2 DAC */
|
||||
|
|
Loading…
Reference in a new issue