Просмотр исходного кода

extcon: arizona: Fix headphone clamping on wm5110

wm5110 requires slightly different configuration of the headphone
clamps to other Arizona devices. Otherwise headphone detection accuracy
will be way off. This patch adds the needed clamping.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Charles Keepax 11 лет назад
Родитель
Сommit
43f0acd961
1 измененных файлов с 18 добавлено и 5 удалено
  1. 18 5
      drivers/extcon/extcon-arizona.c

+ 18 - 5
drivers/extcon/extcon-arizona.c

@@ -140,11 +140,24 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
 				    bool clamp)
 				    bool clamp)
 {
 {
 	struct arizona *arizona = info->arizona;
 	struct arizona *arizona = info->arizona;
-	unsigned int val = 0;
+	unsigned int mask = 0, val = 0;
 	int ret;
 	int ret;
 
 
-	if (clamp)
-		val = ARIZONA_RMV_SHRT_HP1L;
+	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);
 	mutex_lock(&arizona->dapm->card->dapm_mutex);
 
 
@@ -163,13 +176,13 @@ static void arizona_extcon_hp_clamp(struct arizona_extcon_info *info,
 	}
 	}
 
 
 	ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
 	ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
-				 ARIZONA_RMV_SHRT_HP1L, val);
+				 mask, val);
 	if (ret != 0)
 	if (ret != 0)
 		dev_warn(arizona->dev, "Failed to do clamp: %d\n",
 		dev_warn(arizona->dev, "Failed to do clamp: %d\n",
 				 ret);
 				 ret);
 
 
 	ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
 	ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
-				 ARIZONA_RMV_SHRT_HP1R, val);
+				 mask, val);
 	if (ret != 0)
 	if (ret != 0)
 		dev_warn(arizona->dev, "Failed to do clamp: %d\n",
 		dev_warn(arizona->dev, "Failed to do clamp: %d\n",
 			 ret);
 			 ret);