#include <linux/mfd/arizona/core.h>
 #include <linux/mfd/arizona/pdata.h>
 #include <linux/mfd/arizona/registers.h>
+#include <dt-bindings/mfd/arizona.h>
 
 #define ARIZONA_MAX_MICD_RANGE 8
 
-#define ARIZONA_ACCDET_MODE_MIC 0
-#define ARIZONA_ACCDET_MODE_HPL 1
-#define ARIZONA_ACCDET_MODE_HPR 2
-
 #define ARIZONA_MICD_CLAMP_MODE_JDL      0x4
 #define ARIZONA_MICD_CLAMP_MODE_JDH      0x5
 #define ARIZONA_MICD_CLAMP_MODE_JDL_GP5H 0x9
        ret = regmap_update_bits(arizona->regmap,
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,
                                 ARIZONA_ACCDET_MODE_MASK,
-                                ARIZONA_ACCDET_MODE_HPL);
+                                arizona->pdata.hpdet_channel);
        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;
        }
 
                                 ARIZONA_ACCESSORY_DETECT_MODE_1,
                                 ARIZONA_ACCDET_SRC | ARIZONA_ACCDET_MODE_MASK,
                                 info->micd_modes[0].src |
-                                ARIZONA_ACCDET_MODE_HPL);
+                                arizona->pdata.hpdet_channel);
        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;
        }
 
        regmap_update_bits(arizona->regmap, reg, mask, level);
 }
 
+static int arizona_extcon_of_get_pdata(struct arizona *arizona)
+{
+       struct arizona_pdata *pdata = &arizona->pdata;
+       unsigned int val = ARIZONA_ACCDET_MODE_HPL;
+
+       of_property_read_u32(arizona->dev->of_node, "wlf,hpdet-channel", &val);
+       switch (val) {
+       case ARIZONA_ACCDET_MODE_HPL:
+       case ARIZONA_ACCDET_MODE_HPR:
+               pdata->hpdet_channel = val;
+               break;
+       default:
+               dev_err(arizona->dev,
+                       "Wrong wlf,hpdet-channel DT value %d\n", val);
+               pdata->hpdet_channel = ARIZONA_ACCDET_MODE_HPL;
+       }
+
+       return 0;
+}
+
 static int arizona_extcon_probe(struct platform_device *pdev)
 {
        struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
        if (!info)
                return -ENOMEM;
 
+       if (IS_ENABLED(CONFIG_OF)) {
+               if (!dev_get_platdata(arizona->dev))
+                       arizona_extcon_of_get_pdata(arizona);
+       }
+
        info->micvdd = devm_regulator_get(&pdev->dev, "MICVDD");
        if (IS_ERR(info->micvdd)) {
                ret = PTR_ERR(info->micvdd);