irq: irq-keystone: Fix race in installing chained IRQ handler
[firefly-linux-kernel-4.4.55.git] / drivers / extcon / extcon-arizona.c
index 6b5e795f3fe201cc0c29542a7ef61399fc4cb658..a0ed35b336e499e4c9e22e2cba97fa80f01287dd 100644 (file)
@@ -136,18 +136,35 @@ static const char *arizona_cable[] = {
 
 static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info);
 
-static void arizona_extcon_do_magic(struct arizona_extcon_info *info,
-                                   unsigned int magic)
+static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
+                                   bool clamp)
 {
        struct arizona *arizona = info->arizona;
+       unsigned int mask = 0, val = 0;
        int ret;
 
+       switch (arizona->type) {
+       case WM5110:
+               mask = ARIZONA_HP1L_SHRTO | ARIZONA_HP1L_FLWR |
+                      ARIZONA_HP1L_SHRTI;
+               if (clamp)
+                       val = ARIZONA_HP1L_SHRTO;
+               else
+                       val = ARIZONA_HP1L_FLWR | ARIZONA_HP1L_SHRTI;
+               break;
+       default:
+               mask = ARIZONA_RMV_SHRT_HP1L;
+               if (clamp)
+                       val = ARIZONA_RMV_SHRT_HP1L;
+               break;
+       };
+
        mutex_lock(&arizona->dapm->card->dapm_mutex);
 
-       arizona->hpdet_magic = magic;
+       arizona->hpdet_clamp = clamp;
 
-       /* Keep the HP output stages disabled while doing the magic */
-       if (magic) {
+       /* Keep the HP output stages disabled while doing the clamp */
+       if (clamp) {
                ret = regmap_update_bits(arizona->regmap,
                                         ARIZONA_OUTPUT_ENABLES_1,
                                         ARIZONA_OUT1L_ENA |
@@ -158,20 +175,20 @@ static void arizona_extcon_do_magic(struct arizona_extcon_info *info,
                                 ret);
        }
 
-       ret = regmap_update_bits(arizona->regmap, 0x225, 0x4000,
-                                magic);
+       ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
+                                mask, val);
        if (ret != 0)
-               dev_warn(arizona->dev, "Failed to do magic: %d\n",
+               dev_warn(arizona->dev, "Failed to do clamp: %d\n",
                                 ret);
 
-       ret = regmap_update_bits(arizona->regmap, 0x226, 0x4000,
-                                magic);
+       ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
+                                mask, val);
        if (ret != 0)
-               dev_warn(arizona->dev, "Failed to do magic: %d\n",
+               dev_warn(arizona->dev, "Failed to do clamp: %d\n",
                         ret);
 
-       /* Restore the desired state while not doing the magic */
-       if (!magic) {
+       /* Restore the desired state while not doing the clamp */
+       if (!clamp) {
                ret = regmap_update_bits(arizona->regmap,
                                         ARIZONA_OUTPUT_ENABLES_1,
                                         ARIZONA_OUT1L_ENA |
@@ -603,7 +620,7 @@ done:
                           ARIZONA_HP_IMPEDANCE_RANGE_MASK | ARIZONA_HP_POLL,
                           0);
 
-       arizona_extcon_do_magic(info, 0);
+       arizona_extcon_hp_clamp(info, false);
 
        if (id_gpio)
                gpio_set_value_cansleep(id_gpio, 0);
@@ -648,7 +665,7 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
        if (info->mic)
                arizona_stop_mic(info);
 
-       arizona_extcon_do_magic(info, 0x4000);
+       arizona_extcon_hp_clamp(info, true);
 
        ret = regmap_update_bits(arizona->regmap,
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,
@@ -699,7 +716,7 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
 
        info->hpdet_active = true;
 
-       arizona_extcon_do_magic(info, 0x4000);
+       arizona_extcon_hp_clamp(info, true);
 
        ret = regmap_update_bits(arizona->regmap,
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,