]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: nau8824: Add a nau8824_components() helper
authorHans de Goede <hdegoede@redhat.com>
Sat, 2 Oct 2021 21:14:58 +0000 (23:14 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 4 Oct 2021 14:55:29 +0000 (15:55 +0100)
Some devices using the NAU8824 have only one speaker. To still have things
working properly this requires the left + right channels to both be mixed
to the left speaker output.

This mixer setup is done by userspace based on UCM profiles. But this
requires userspace to know that there is a mono-speaker. Add a helper
function (for the machine driver) to get a components string providing
this info.

This is done inside the codec driver because the codec driver already
has a DMI quirk table.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20211002211459.110124-3-hdegoede@redhat.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/nau8824.c
sound/soc/codecs/nau8824.h

index 761c59ff3851eb07d5c3f1c0aa1df6e7903f1ac9..ffb3881aa40f65c199ebf5724135da7f0f7bca4d 100644 (file)
@@ -29,6 +29,7 @@
 #include "nau8824.h"
 
 #define NAU8824_JD_ACTIVE_HIGH                 BIT(0)
+#define NAU8824_MONO_SPEAKER                   BIT(1)
 
 static int nau8824_quirk;
 static int quirk_override = -1;
@@ -1861,7 +1862,25 @@ static const struct dmi_system_id nau8824_quirk_table[] = {
                        DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
                        DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "20170531"),
                },
-               .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH),
+               .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH |
+                                       NAU8824_MONO_SPEAKER),
+       },
+       {
+               /* CUBE iwork8 Air */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "cube"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "i1-TF"),
+                       DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
+               },
+               .driver_data = (void *)(NAU8824_MONO_SPEAKER),
+       },
+       {
+               /* Pipo W2S */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "PIPO"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "W2S"),
+               },
+               .driver_data = (void *)(NAU8824_MONO_SPEAKER),
        },
        {}
 };
@@ -1880,6 +1899,17 @@ static void nau8824_check_quirks(void)
                nau8824_quirk = (unsigned long)dmi_id->driver_data;
 }
 
+const char *nau8824_components(void)
+{
+       nau8824_check_quirks();
+
+       if (nau8824_quirk & NAU8824_MONO_SPEAKER)
+               return "cfg-spk:1";
+       else
+               return "cfg-spk:2";
+}
+EXPORT_SYMBOL_GPL(nau8824_components);
+
 static int nau8824_i2c_probe(struct i2c_client *i2c,
        const struct i2c_device_id *id)
 {
index 6e61405f623ba9ee181b84175fb85a1e6bad4254..de4bae8281d01d6bb030e247315bd5dcf48a00ef 100644 (file)
@@ -470,6 +470,7 @@ struct nau8824_osr_attr {
 
 int nau8824_enable_jack_detect(struct snd_soc_component *component,
        struct snd_soc_jack *jack);
+const char *nau8824_components(void);
 
 #endif                         /* _NAU8824_H */