}
}
+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;
static void arizona_identify_headphone(struct arizona_extcon_info *info)
{
struct arizona *arizona = info->arizona;
+ int mode;
int ret;
if (info->hpdet_done)
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;
}
struct arizona *arizona = info->arizona;
int hp_reading = 32;
bool mic;
+ int mode;
int ret;
dev_dbg(arizona->dev, "Starting identification via HPDET\n");
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;
}
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;
}