ALSA: hda: cs35l56: Add support for CS35L54 and CS35L57
authorSimon Trimmer <simont@opensource.cirrus.com>
Fri, 8 Mar 2024 13:58:59 +0000 (13:58 +0000)
committerTakashi Iwai <tiwai@suse.de>
Fri, 8 Mar 2024 16:59:19 +0000 (17:59 +0100)
Add the HID for the CS35L54 and CS35L57 Boosted Smart Amplifiers. These
have the same control interface as the CS35L56 so are handled by the
cs35l56-hda driver.

Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com>
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Message-ID: <20240308135900.603192-3-rf@opensource.cirrus.com>

sound/pci/hda/cs35l56_hda.c
sound/pci/hda/cs35l56_hda.h
sound/pci/hda/cs35l56_hda_i2c.c
sound/pci/hda/cs35l56_hda_spi.c

index 75a14ba..1fae241 100644 (file)
@@ -458,13 +458,15 @@ static void cs35l56_hda_request_firmware_files(struct cs35l56_hda *cs35l56,
 
        if (preloaded_fw_ver) {
                snprintf(base_name, sizeof(base_name),
-                        "cirrus/cs35l56-%02x%s-%06x-dsp1-misc",
+                        "cirrus/cs35l%02x-%02x%s-%06x-dsp1-misc",
+                        cs35l56->base.type,
                         cs35l56->base.rev,
                         cs35l56->base.secured ? "-s" : "",
                         preloaded_fw_ver & 0xffffff);
        } else {
                snprintf(base_name, sizeof(base_name),
-                        "cirrus/cs35l56-%02x%s-dsp1-misc",
+                        "cirrus/cs35l%02x-%02x%s-dsp1-misc",
+                        cs35l56->base.type,
                         cs35l56->base.rev,
                         cs35l56->base.secured ? "-s" : "");
        }
@@ -834,9 +836,10 @@ static int cs35l56_hda_system_resume(struct device *dev)
        return 0;
 }
 
-static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int id)
+static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int hid, int id)
 {
        u32 values[HDA_MAX_COMPONENTS];
+       char hid_string[8];
        struct acpi_device *adev;
        const char *property, *sub;
        size_t nval;
@@ -847,7 +850,8 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int id)
         * the serial-multi-instantiate driver, so lookup the node by HID
         */
        if (!ACPI_COMPANION(cs35l56->base.dev)) {
-               adev = acpi_dev_get_first_match_dev("CSC3556", NULL, -1);
+               snprintf(hid_string, sizeof(hid_string), "CSC%04X", hid);
+               adev = acpi_dev_get_first_match_dev(hid_string, NULL, -1);
                if (!adev) {
                        dev_err(cs35l56->base.dev, "Failed to find an ACPI device for %s\n",
                                dev_name(cs35l56->base.dev));
@@ -935,14 +939,14 @@ err:
        return ret;
 }
 
-int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int id)
+int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int hid, int id)
 {
        int ret;
 
        mutex_init(&cs35l56->base.irq_lock);
        dev_set_drvdata(cs35l56->base.dev, cs35l56);
 
-       ret = cs35l56_hda_read_acpi(cs35l56, id);
+       ret = cs35l56_hda_read_acpi(cs35l56, hid, id);
        if (ret)
                goto err;
 
index 6e5bc53..464e4aa 100644 (file)
@@ -42,7 +42,7 @@ struct cs35l56_hda {
 
 extern const struct dev_pm_ops cs35l56_hda_pm_ops;
 
-int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int id);
+int cs35l56_hda_common_probe(struct cs35l56_hda *cs35l56, int hid, int id);
 void cs35l56_hda_remove(struct device *dev);
 
 #endif /*__CS35L56_HDA_H__*/
index a9ef6d8..13beee8 100644 (file)
@@ -13,6 +13,7 @@
 
 static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
 {
+       const struct i2c_device_id *id = i2c_client_get_device_id(clt);
        struct cs35l56_hda *cs35l56;
        int ret;
 
@@ -33,7 +34,7 @@ static int cs35l56_hda_i2c_probe(struct i2c_client *clt)
                return ret;
        }
 
-       ret = cs35l56_hda_common_probe(cs35l56, clt->addr);
+       ret = cs35l56_hda_common_probe(cs35l56, id->driver_data, clt->addr);
        if (ret)
                return ret;
        ret = cs35l56_irq_request(&cs35l56->base, clt->irq);
@@ -49,7 +50,9 @@ static void cs35l56_hda_i2c_remove(struct i2c_client *clt)
 }
 
 static const struct i2c_device_id cs35l56_hda_i2c_id[] = {
-       { "cs35l56-hda", 0 },
+       { "cs35l54-hda", 0x3554 },
+       { "cs35l56-hda", 0x3556 },
+       { "cs35l57-hda", 0x3557 },
        {}
 };
 
index 080426d..a3b2fa7 100644 (file)
@@ -13,6 +13,7 @@
 
 static int cs35l56_hda_spi_probe(struct spi_device *spi)
 {
+       const struct spi_device_id *id = spi_get_device_id(spi);
        struct cs35l56_hda *cs35l56;
        int ret;
 
@@ -33,7 +34,7 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
                return ret;
        }
 
-       ret = cs35l56_hda_common_probe(cs35l56, spi_get_chipselect(spi, 0));
+       ret = cs35l56_hda_common_probe(cs35l56, id->driver_data, spi_get_chipselect(spi, 0));
        if (ret)
                return ret;
        ret = cs35l56_irq_request(&cs35l56->base, spi->irq);
@@ -49,7 +50,9 @@ static void cs35l56_hda_spi_remove(struct spi_device *spi)
 }
 
 static const struct spi_device_id cs35l56_hda_spi_id[] = {
-       { "cs35l56-hda", 0 },
+       { "cs35l54-hda", 0x3554 },
+       { "cs35l56-hda", 0x3556 },
+       { "cs35l57-hda", 0x3557 },
        {}
 };