LOCAL / extcon: arizona: Add support for change headphone detection mode
authorInha Song <ideal.song@samsung.com>
Tue, 7 Apr 2015 10:53:11 +0000 (19:53 +0900)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:42:47 +0000 (13:42 +0900)
This patch add support for change headphone detection mode to HPDETL or HPDETR.
Depending on board design, headphone detect mode can change to HPDETR.

Signed-off-by: Inha Song <ideal.song@samsung.com>
drivers/extcon/extcon-arizona.c
include/linux/mfd/arizona/pdata.h

index abe757c..f1ea71a 100644 (file)
@@ -261,6 +261,16 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
        }
 }
 
+static int arizona_hpdet_get_mode(struct arizona_extcon_info *info)
+{
+       struct arizona *arizona = info->arizona;
+
+       if (arizona->pdata.hpdet_channel)
+               return ARIZONA_ACCDET_MODE_HPR;
+       else
+               return ARIZONA_ACCDET_MODE_HPL;
+}
+
 static void arizona_start_mic(struct arizona_extcon_info *info)
 {
        struct arizona *arizona = info->arizona;
@@ -650,6 +660,7 @@ out:
 static void arizona_identify_headphone(struct arizona_extcon_info *info)
 {
        struct arizona *arizona = info->arizona;
+       int mode;
        int ret;
 
        if (info->hpdet_done)
@@ -667,12 +678,12 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
 
        arizona_extcon_hp_clamp(info, true);
 
+       mode = arizona_hpdet_get_mode(info);
        ret = regmap_update_bits(arizona->regmap,
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,
-                                ARIZONA_ACCDET_MODE_MASK,
-                                ARIZONA_ACCDET_MODE_HPL);
+                                ARIZONA_ACCDET_MODE_MASK, mode);
        if (ret != 0) {
-               dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
+               dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
                goto err;
        }
 
@@ -707,6 +718,7 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
        struct arizona *arizona = info->arizona;
        int hp_reading = 32;
        bool mic;
+       int mode;
        int ret;
 
        dev_dbg(arizona->dev, "Starting identification via HPDET\n");
@@ -718,13 +730,13 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
 
        arizona_extcon_hp_clamp(info, true);
 
+       mode = arizona_hpdet_get_mode(info);
        ret = regmap_update_bits(arizona->regmap,
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,
                                 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
-                                info->micd_modes[0].src |
-                                ARIZONA_ACCDET_MODE_HPL);
+                                info->micd_modes[0].src | mode);
        if (ret != 0) {
-               dev_err(arizona->dev, "Failed to set HPDETL mode: %d\n", ret);
+               dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
                goto err;
        }
 
@@ -1148,6 +1160,9 @@ static int arizona_extcon_of_get_pdata(struct arizona *arizona)
                        of_property_read_bool(arizona->dev->of_node,
                                              "wlf,micd-force-micbias");
 
+       of_property_read_u32(arizona->dev->of_node, "wlf,hpdet-channel",
+                            &pdata->hpdet_channel);
+
        return 0;
 }
 
index cd66216..57ff96e 100644 (file)
@@ -121,6 +121,12 @@ struct arizona_pdata {
        /** GPIO used for mic isolation with HPDET */
        int hpdet_id_gpio;
 
+       /**
+        * Channel to use for headphone detection, valid values are 0 for
+        * left and 1 for right
+        */
+       int hpdet_channel;
+
        /** Extra debounce timeout used during initial mic detection (ms) */
        int micd_detect_debounce;