fgheorghe / Asus-ProArt-Studiobook-H7604JV-Linux-Sound

Asus ProArt Studiobook H7604JV Linux Sound
1 stars 0 forks source link

Kernel patch #1

Open flukejones opened 10 months ago

flukejones commented 10 months ago

FYI I've been working on kernel patches for this issue.

Requires https://lore.kernel.org/all/20230815161033.3519-1-sbinding@opensource.cirrus.com/

diff --git a/sound/pci/hda/cs35l41_hda_property.c b/sound/pci/hda/cs35l41_hda_property.c
index 673f23257a09..b39f9443e1d6 100644
--- a/sound/pci/hda/cs35l41_hda_property.c
+++ b/sound/pci/hda/cs35l41_hda_property.c
@@ -43,6 +43,41 @@ static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *phy
    return 0;
 }

+/*
+ * The CSC3551 is used in almost the entire ASUS ROG laptop range in 2023, this is likely to
+ * also include many non ROG labelled laptops. It is also used with either I2C connection or
+ * SPI connection. The SPI connected versions may be missing a chip select GPIO and require
+ * an DSD table patch.
+ */
+static int asus_rog_2023_spkr_id2(struct cs35l41_hda *cs35l41, struct device *physdev, int id,
+               const char *hid)
+{
+   struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg;
+
+   /* check SPI or I2C address to assign the index */
+   cs35l41->index = (id == 0 || id == 0x40) ? 0 : 1;
+   cs35l41->channel_index = 0;
+   cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2);
+   hw_cfg->spk_pos = cs35l41->index;
+   hw_cfg->bst_type = CS35L41_EXT_BOOST;
+   hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
+   hw_cfg->gpio1.valid = true;
+   hw_cfg->gpio2.func = CS35L41_INTERRUPT;
+   hw_cfg->gpio2.valid = true;
+
+   if (strcmp(cs35l41->acpi_subsystem_id, "10431473") == 0
+       || strcmp(cs35l41->acpi_subsystem_id, "10431483") == 0
+       || strcmp(cs35l41->acpi_subsystem_id, "10431493") == 0) {
+       cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 1, GPIOD_OUT_HIGH);
+   } else {
+       cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH);
+   }
+
+   hw_cfg->valid = true;
+
+   return 0;
+}
+
 struct cs35l41_prop_model {
    const char *hid;
    const char *ssid;
@@ -53,6 +88,18 @@ struct cs35l41_prop_model {
 const struct cs35l41_prop_model cs35l41_prop_model_table[] = {
    { "CLSA0100", NULL, lenovo_legion_no_acpi },
    { "CLSA0101", NULL, lenovo_legion_no_acpi },
+   { "CSC3551", "10431433", asus_rog_2023_spkr_id2 }, // ASUS GS650P - i2c
+   { "CSC3551", "10431463", asus_rog_2023_spkr_id2 }, // ASUS GA402X/N - i2c
+   { "CSC3551", "10431473", asus_rog_2023_spkr_id2 }, // ASUS GU604V - spi, reset gpio 1
+   { "CSC3551", "10431483", asus_rog_2023_spkr_id2 }, // ASUS GU603V - spi, reset gpio 1
+   { "CSC3551", "10431493", asus_rog_2023_spkr_id2 }, // ASUS GV601V - spi, reset gpio 1
+   { "CSC3551", "10431573", asus_rog_2023_spkr_id2 }, // ASUS GZ301V - spi, reset gpio 0
+   { "CSC3551", "104317F3", asus_rog_2023_spkr_id2 }, // ASUS ROG ALLY - i2c
+   { "CSC3551", "10431B93", asus_rog_2023_spkr_id2 }, // ASUS G614J - spi, reset gpio 0
+   { "CSC3551", "10431CAF", asus_rog_2023_spkr_id2 }, // ASUS G634J - spi, reset gpio 0
+   { "CSC3551", "10431C9F", asus_rog_2023_spkr_id2 }, // ASUS G614JI -spi, reset gpio 0
+   { "CSC3551", "10431D1F", asus_rog_2023_spkr_id2 }, // ASUS G713P - i2c
+   { "CSC3551", "10431F1F", asus_rog_2023_spkr_id2 }, // ASUS H7604JV - spi, reset gpio 0
    {}
 };

-- 
2.41.0
fgheorghe commented 10 months ago

Oh that's awesome! Thank you!

fgheorghe commented 7 months ago

@flukejones I installed windows on dual boot, and it unsurprisingly upgraded my BIOS without my consent (was never asked to). My "patch" no longer works, and can't figure out what changed in the BIOS as I can't hack my way through.