ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect
authorHans de Goede <hdegoede@redhat.com>
Sat, 2 Oct 2021 21:14:57 +0000 (23:14 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 4 Oct 2021 14:55:28 +0000 (15:55 +0100)
Add a quirk mechanism to allow specifying that active-high jack-detection
should be used on platforms where this info is not available in devicetree.

And add an entry for the Cyberbook T116 tablet to the DMI table, so that
jack-detection will work properly on this tablet.

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

index db88be4..761c59f 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/module.h>
 #include <linux/delay.h>
+#include <linux/dmi.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 
 #include "nau8824.h"
 
+#define NAU8824_JD_ACTIVE_HIGH                 BIT(0)
+
+static int nau8824_quirk;
+static int quirk_override = -1;
+module_param_named(quirk, quirk_override, uint, 0444);
+MODULE_PARM_DESC(quirk, "Board-specific quirk override");
 
 static int nau8824_config_sysclk(struct nau8824 *nau8824,
        int clk_id, unsigned int freq);
@@ -1845,6 +1852,34 @@ static int nau8824_read_device_properties(struct device *dev,
        return 0;
 }
 
+/* Please keep this list alphabetically sorted */
+static const struct dmi_system_id nau8824_quirk_table[] = {
+       {
+               /* Cyberbook T116 rugged tablet */
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
+                       DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "20170531"),
+               },
+               .driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH),
+       },
+       {}
+};
+
+static void nau8824_check_quirks(void)
+{
+       const struct dmi_system_id *dmi_id;
+
+       if (quirk_override != -1) {
+               nau8824_quirk = quirk_override;
+               return;
+       }
+
+       dmi_id = dmi_first_match(nau8824_quirk_table);
+       if (dmi_id)
+               nau8824_quirk = (unsigned long)dmi_id->driver_data;
+}
+
 static int nau8824_i2c_probe(struct i2c_client *i2c,
        const struct i2c_device_id *id)
 {
@@ -1869,6 +1904,11 @@ static int nau8824_i2c_probe(struct i2c_client *i2c,
        nau8824->irq = i2c->irq;
        sema_init(&nau8824->jd_sem, 1);
 
+       nau8824_check_quirks();
+
+       if (nau8824_quirk & NAU8824_JD_ACTIVE_HIGH)
+               nau8824->jkdet_polarity = 0;
+
        nau8824_print_device_properties(nau8824);
 
        ret = regmap_read(nau8824->regmap, NAU8824_REG_I2C_DEVICE_ID, &value);