ASoC: rt5645: add inv_hp_det flag
[sfrench/cifs-2.6.git] / sound / soc / codecs / rt5645.c
index f830a463f9b9cd6665a01ff2fdd4270043ff1322..aaeb10c593349ffed30df8cc26dd476c94a7d0a2 100644 (file)
@@ -34,6 +34,7 @@
 #define QUIRK_INV_JD1_1(q)     ((q) & 1)
 #define QUIRK_LEVEL_IRQ(q)     (((q) >> 1) & 1)
 #define QUIRK_IN2_DIFF(q)      (((q) >> 2) & 1)
+#define QUIRK_INV_HP_POL(q)    (((q) >> 3) & 1)
 #define QUIRK_JD_MODE(q)       (((q) >> 4) & 7)
 #define QUIRK_DMIC1_DATA_PIN(q)        (((q) >> 8) & 3)
 #define QUIRK_DMIC2_DATA_PIN(q)        (((q) >> 12) & 3)
@@ -3246,6 +3247,8 @@ static void rt5645_jack_detect_work(struct work_struct *work)
        case 0: /* Not using rt5645 JD */
                if (rt5645->gpiod_hp_det) {
                        gpio_state = gpiod_get_value(rt5645->gpiod_hp_det);
+                       if (rt5645->pdata.inv_hp_pol)
+                               gpio_state ^= 1;
                        dev_dbg(rt5645->component->dev, "gpio_state = %d\n",
                                gpio_state);
                        report = rt5645_jack_detect(rt5645->component, gpio_state);
@@ -3855,6 +3858,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
                rt5645->pdata.in2_diff = QUIRK_IN2_DIFF(quirk);
                rt5645->pdata.level_trigger_irq = QUIRK_LEVEL_IRQ(quirk);
                rt5645->pdata.inv_jd1_1 = QUIRK_INV_JD1_1(quirk);
+               rt5645->pdata.inv_hp_pol = QUIRK_INV_HP_POL(quirk);
                rt5645->pdata.jd_mode = QUIRK_JD_MODE(quirk);
                rt5645->pdata.dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk);
                rt5645->pdata.dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk);