[PATCH 0/2] Add support for CLSA0101
Add Support for the CLSA0101 laptop, an Intel version of CLSA0100. This patch has been tested using the CLSA0100, ensuring it doesn't break the sound for it. We appreciate it if someone with CLSA0101 could verify that this the patch works for them.
Lucas Tanure (2): ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ALSA: hda: cs35l41: Support CLSA0101
sound/pci/hda/cs35l41_hda.c | 67 +++++++++++++++++++++-------------- sound/pci/hda/patch_realtek.c | 12 +++++++ 2 files changed, 53 insertions(+), 26 deletions(-)
Follow GPIO1 pattern, use cs35l41 HDA internal define for IRQ and then translate to ASoC cs35l41 define.
Signed-off-by: Lucas Tanure tanureal@opensource.cirrus.com --- sound/pci/hda/cs35l41_hda.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c index 28798d5c1cf1..48d94c683b75 100644 --- a/sound/pci/hda/cs35l41_hda.c +++ b/sound/pci/hda/cs35l41_hda.c @@ -1014,6 +1014,7 @@ static int cs35l41_hda_apply_properties(struct cs35l41_hda *cs35l41) break; case CS35L41_INTERRUPT: using_irq = true; + hw_cfg->gpio2.func = CS35L41_GPIO2_INT_OPEN_DRAIN; break; default: dev_err(cs35l41->dev, "Invalid GPIO2 function %d\n", hw_cfg->gpio2.func); @@ -1273,7 +1274,7 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); cs35l41->hw_cfg.bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH; cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); - hw_cfg->gpio2.func = CS35L41_GPIO2_INT_OPEN_DRAIN; + hw_cfg->gpio2.func = CS35L41_INTERRUPT; hw_cfg->gpio2.valid = true; cs35l41->hw_cfg.valid = true; put_device(physdev);
Add support for Intel version of Legion 7 laptop.
Signed-off-by: Lucas Tanure tanureal@opensource.cirrus.com --- sound/pci/hda/cs35l41_hda.c | 66 +++++++++++++++++++++-------------- sound/pci/hda/patch_realtek.c | 12 +++++++ 2 files changed, 52 insertions(+), 26 deletions(-)
diff --git a/sound/pci/hda/cs35l41_hda.c b/sound/pci/hda/cs35l41_hda.c index 48d94c683b75..6edf95553745 100644 --- a/sound/pci/hda/cs35l41_hda.c +++ b/sound/pci/hda/cs35l41_hda.c @@ -1133,6 +1133,45 @@ static int cs35l41_get_speaker_id(struct device *dev, int amp_index, return speaker_id; }
+/* + * Device CLSA010(0/1) doesn't have _DSD so a gpiod_get by the label reset won't work. + * And devices created by serial-multi-instantiate don't have their device struct + * pointing to the correct fwnode, so acpi_dev must be used here. + * And devm functions expect that the device requesting the resource has the correct + * fwnode. + */ +static int cs35l41_no_acpi_dsd(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid) +{ + struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; + + /* check I2C address to assign the index */ + cs35l41->index = id == 0x40 ? 0 : 1; + cs35l41->channel_index = 0; + cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); + cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); + hw_cfg->spk_pos = cs35l41->index; + hw_cfg->gpio2.func = CS35L41_INTERRUPT; + hw_cfg->gpio2.valid = true; + hw_cfg->valid = true; + put_device(physdev); + + if (strncmp(hid, "CLSA0100", 8) == 0) { + hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH; + } else if (strncmp(hid, "CLSA0101", 8) == 0) { + hw_cfg->bst_type = CS35L41_EXT_BOOST; + hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH; + hw_cfg->gpio1.valid = true; + } else { + hw_cfg->valid = false; + hw_cfg->gpio1.valid = false; + hw_cfg->gpio2.valid = false; + return -EINVAL; + } + + return 0; +} + static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, int id) { struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; @@ -1161,7 +1200,7 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i property = "cirrus,dev-index"; ret = device_property_count_u32(physdev, property); if (ret <= 0) - goto no_acpi_dsd; + return cs35l41_no_acpi_dsd(cs35l41, physdev, id, hid);
if (ret > ARRAY_SIZE(values)) { ret = -EINVAL; @@ -1255,31 +1294,6 @@ static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, i dev_err(cs35l41->dev, "Failed property %s: %d\n", property, ret);
return ret; - -no_acpi_dsd: - /* - * Device CLSA0100 doesn't have _DSD so a gpiod_get by the label reset won't work. - * And devices created by serial-multi-instantiate don't have their device struct - * pointing to the correct fwnode, so acpi_dev must be used here. - * And devm functions expect that the device requesting the resource has the correct - * fwnode. - */ - if (strncmp(hid, "CLSA0100", 8) != 0) - return -EINVAL; - - /* check I2C address to assign the index */ - cs35l41->index = id == 0x40 ? 0 : 1; - cs35l41->hw_cfg.spk_pos = cs35l41->index; - cs35l41->channel_index = 0; - cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); - cs35l41->hw_cfg.bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH; - cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); - hw_cfg->gpio2.func = CS35L41_INTERRUPT; - hw_cfg->gpio2.valid = true; - cs35l41->hw_cfg.valid = true; - put_device(physdev); - - return 0; }
int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq, diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0e340c0934db..65fd3e599a83 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -6710,6 +6710,12 @@ static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const st cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2); }
+static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix, + int action) +{ + cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2); +} + /* for alc295_fixup_hp_top_speakers */ #include "hp_x360_helper.c"
@@ -7047,6 +7053,7 @@ enum { ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED, ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED, ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE, + ALC287_FIXUP_LEGION_16ITHG6, };
/* A special fixup for Lenovo C940 and Yoga Duet 7; @@ -8889,6 +8896,10 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC }, + [ALC287_FIXUP_LEGION_16ITHG6] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc287_fixup_legion_16ithg6_speakers, + }, };
static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -9353,6 +9364,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), + SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6), SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
On Tue, 26 Jul 2022 12:11:29 +0200, Lucas Tanure wrote:
Add Support for the CLSA0101 laptop, an Intel version of CLSA0100. This patch has been tested using the CLSA0100, ensuring it doesn't break the sound for it. We appreciate it if someone with CLSA0101 could verify that this the patch works for them.
Lucas Tanure (2): ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ALSA: hda: cs35l41: Support CLSA0101
Applied both patches. Thanks.
Takashi
Hello,
I can confirm this does _not_ work.
More specifically, with these patches, the original behavior still occurs: 1. You get left channel audio from the right speaker only. 2. No sound at all after resuming from sleep. 3. You get sound after resuming from hibernate, but only as described in #1.
If you apply a patch like this: https://paste-bin.xyz/71355
You get properly working audio until you put the laptop to sleep or hibernate. Upon resuming from either state, you get no audio at all.
On 7/26/22 03:11, Lucas Tanure wrote:
Add Support for the CLSA0101 laptop, an Intel version of CLSA0100. This patch has been tested using the CLSA0100, ensuring it doesn't break the sound for it. We appreciate it if someone with CLSA0101 could verify that this the patch works for them.
Lucas Tanure (2): ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ALSA: hda: cs35l41: Support CLSA0101
sound/pci/hda/cs35l41_hda.c | 67 +++++++++++++++++++++-------------- sound/pci/hda/patch_realtek.c | 12 +++++++ 2 files changed, 53 insertions(+), 26 deletions(-)
On Tue, 26 Jul 2022 17:35:49 +0200, Cameron Berkenpas wrote:
Hello,
I can confirm this does _not_ work.
More specifically, with these patches, the original behavior still occurs:
- You get left channel audio from the right speaker only.
- No sound at all after resuming from sleep.
- You get sound after resuming from hibernate, but only as described in #1.
If you apply a patch like this: https://paste-bin.xyz/71355
You get properly working audio until you put the laptop to sleep or hibernate. Upon resuming from either state, you get no audio at all.
OK, then let's drop them for now. Thanks for quick heads up.
Takashi
On 7/26/22 03:11, Lucas Tanure wrote:
Add Support for the CLSA0101 laptop, an Intel version of CLSA0100. This patch has been tested using the CLSA0100, ensuring it doesn't break the sound for it. We appreciate it if someone with CLSA0101 could verify that this the patch works for them.
Lucas Tanure (2): ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ALSA: hda: cs35l41: Support CLSA0101
sound/pci/hda/cs35l41_hda.c | 67 +++++++++++++++++++++-------------- sound/pci/hda/patch_realtek.c | 12 +++++++ 2 files changed, 53 insertions(+), 26 deletions(-)
On 7/26/22 16:35, Cameron Berkenpas wrote:
Hello,
I can confirm this does _not_ work.
More specifically, with these patches, the original behavior still occurs:
- You get left channel audio from the right speaker only.
Hi, yes, I did forgot the scan and multi instantiate part. I will send V2 with the fix.
- No sound at all after resuming from sleep.
- You get sound after resuming from hibernate, but only as described in
#1.
This is a different issue, that will be fixed in the future.
If you apply a patch like this: https://paste-bin.xyz/71355
You get properly working audio until you put the laptop to sleep or hibernate. Upon resuming from either state, you get no audio at all.
On 7/26/22 03:11, Lucas Tanure wrote:
Add Support for the CLSA0101 laptop, an Intel version of CLSA0100. This patch has been tested using the CLSA0100, ensuring it doesn't break the sound for it. We appreciate it if someone with CLSA0101 could verify that this the patch works for them.
Lucas Tanure (2): ALSA: hda: cs35l41: Use the CS35L41 HDA internal define ALSA: hda: cs35l41: Support CLSA0101
sound/pci/hda/cs35l41_hda.c | 67 +++++++++++++++++++++-------------- sound/pci/hda/patch_realtek.c | 12 +++++++ 2 files changed, 53 insertions(+), 26 deletions(-)
participants (3)
-
Cameron Berkenpas
-
Lucas Tanure
-
Takashi Iwai