Merge tag 'sound-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[sfrench/cifs-2.6.git] / sound / soc / codecs / rt286.c
index 8abe232ca4a4c03795318c33f4678a2b1826d38a..802f4851c3df34a430b9f943931bc836ea429b60 100644 (file)
@@ -171,6 +171,9 @@ static bool rt286_readable_register(struct device *dev, unsigned int reg)
        case RT286_PROC_COEF:
        case RT286_SET_AMP_GAIN_ADC_IN1:
        case RT286_SET_AMP_GAIN_ADC_IN2:
+       case RT286_SET_GPIO_MASK:
+       case RT286_SET_GPIO_DIRECTION:
+       case RT286_SET_GPIO_DATA:
        case RT286_SET_POWER(RT286_DAC_OUT1):
        case RT286_SET_POWER(RT286_DAC_OUT2):
        case RT286_SET_POWER(RT286_ADC_IN1):
@@ -252,11 +255,16 @@ static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic)
                                msleep(300);
                                regmap_read(rt286->regmap,
                                        RT286_CBJ_CTRL2, &val);
-                               if (0x0070 == (val & 0x0070))
+                               if (0x0070 == (val & 0x0070)) {
                                        *mic = true;
-                               else
+                               } else {
                                        *mic = false;
+                                       regmap_update_bits(rt286->regmap,
+                                               RT286_CBJ_CTRL1,
+                                               0xfcc0, 0xc400);
+                               }
                        }
+
                        regmap_update_bits(rt286->regmap,
                                RT286_DC_GAIN, 0x200, 0x0);
 
@@ -1117,12 +1125,11 @@ static const struct dmi_system_id force_combo_jack_table[] = {
        { }
 };
 
-static const struct dmi_system_id dmi_dell_dino[] = {
+static const struct dmi_system_id dmi_dell[] = {
        {
-               .ident = "Dell Dino",
+               .ident = "Dell",
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343")
                }
        },
        { }
@@ -1133,7 +1140,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
 {
        struct rt286_platform_data *pdata = dev_get_platdata(&i2c->dev);
        struct rt286_priv *rt286;
-       int i, ret, val;
+       int i, ret, vendor_id;
 
        rt286 = devm_kzalloc(&i2c->dev, sizeof(*rt286),
                                GFP_KERNEL);
@@ -1149,14 +1156,15 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        }
 
        ret = regmap_read(rt286->regmap,
-               RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &val);
+               RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &vendor_id);
        if (ret != 0) {
                dev_err(&i2c->dev, "I2C error %d\n", ret);
                return ret;
        }
-       if (val != RT286_VENDOR_ID && val != RT288_VENDOR_ID) {
+       if (vendor_id != RT286_VENDOR_ID && vendor_id != RT288_VENDOR_ID) {
                dev_err(&i2c->dev,
-                       "Device with ID register %#x is not rt286\n", val);
+                       "Device with ID register %#x is not rt286\n",
+                       vendor_id);
                return -ENODEV;
        }
 
@@ -1180,8 +1188,8 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        if (pdata)
                rt286->pdata = *pdata;
 
-       if (dmi_check_system(force_combo_jack_table) ||
-               dmi_check_system(dmi_dell_dino))
+       if ((vendor_id == RT288_VENDOR_ID && dmi_check_system(dmi_dell)) ||
+               dmi_check_system(force_combo_jack_table))
                rt286->pdata.cbj_en = true;
 
        regmap_write(rt286->regmap, RT286_SET_AUDIO_POWER, AC_PWRST_D3);
@@ -1204,7 +1212,7 @@ static int rt286_i2c_probe(struct i2c_client *i2c,
        mdelay(10);
 
        if (!rt286->pdata.gpio2_en)
-               regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x4000);
+               regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x40);
        else
                regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0);
 
@@ -1220,7 +1228,7 @@ 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)) {
+       if (vendor_id == RT288_VENDOR_ID && dmi_check_system(dmi_dell)) {
                regmap_update_bits(rt286->regmap,
                        RT286_SET_GPIO_MASK, 0x40, 0x40);
                regmap_update_bits(rt286->regmap,