Merge remote-tracking branches 'asoc/topic/pxa', 'asoc/topic/rcar' and 'asoc/topic...
[firefly-linux-kernel-4.4.55.git] / sound / soc / codecs / rt286.c
index d0698891b69e3fe7f7b7974a13040fa0b563461d..f374840a5a7ce376272d8f7e3290f91c099cb19f 100644 (file)
@@ -34,6 +34,7 @@
 #include "rt286.h"
 
 #define RT286_VENDOR_ID 0x10ec0286
+#define RT288_VENDOR_ID 0x10ec0288
 
 struct rt286_priv {
        struct regmap *regmap;
@@ -1171,6 +1172,7 @@ static const struct regmap_config rt286_regmap = {
 
 static const struct i2c_device_id rt286_i2c_id[] = {
        {"rt286", 0},
+       {"rt288", 0},
        {}
 };
 MODULE_DEVICE_TABLE(i2c, rt286_i2c_id);
@@ -1191,6 +1193,17 @@ static struct dmi_system_id force_combo_jack_table[] = {
        { }
 };
 
+static struct dmi_system_id dmi_dell_dino[] = {
+       {
+               .ident = "Dell Dino",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_BOARD_NAME, "0144P8")
+               }
+       },
+       { }
+};
+
 static int rt286_i2c_probe(struct i2c_client *i2c,
                           const struct i2c_device_id *id)
 {
@@ -1213,7 +1226,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 
        regmap_read(rt286->regmap,
                RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &ret);
-       if (ret != RT286_VENDOR_ID) {
+       if (ret != RT286_VENDOR_ID && ret != RT288_VENDOR_ID) {
                dev_err(&i2c->dev,
                        "Device with ID register %x is not rt286\n", ret);
                return -ENODEV;
@@ -1226,7 +1239,8 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        if (pdata)
                rt286->pdata = *pdata;
 
-       if (dmi_check_system(force_combo_jack_table))
+       if (dmi_check_system(force_combo_jack_table) ||
+               dmi_check_system(dmi_dell_dino))
                rt286->pdata.cbj_en = true;
 
        regmap_write(rt286->regmap, RT286_SET_AUDIO_POWER, AC_PWRST_D3);
@@ -1265,6 +1279,17 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL3, 0xf777, 0x4737);
        regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL4, 0x00ff, 0x003f);
 
+       if (dmi_check_system(dmi_dell_dino)) {
+               regmap_update_bits(rt286->regmap,
+                       RT286_SET_GPIO_MASK, 0x40, 0x40);
+               regmap_update_bits(rt286->regmap,
+                       RT286_SET_GPIO_DIRECTION, 0x40, 0x40);
+               regmap_update_bits(rt286->regmap,
+                       RT286_SET_GPIO_DATA, 0x40, 0x40);
+               regmap_update_bits(rt286->regmap,
+                       RT286_GPIO_CTRL, 0xc, 0x8);
+       }
+
        if (rt286->i2c->irq) {
                ret = request_threaded_irq(rt286->i2c->irq, NULL, rt286_irq,
                        IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "rt286", rt286);