Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 903aa56f authored by Mark Brown's avatar Mark Brown
Browse files

extcon: arizona: Don't HPDET magic when headphones are enabled



The magic is already done as part of enabling the headphone output so
does not need to be done when the headphone outputs are enabled. We hold
the DAPM lock so the headphone status can't be changed underneath us.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 0e27bd31
Loading
Loading
Loading
Loading
+46 −12
Original line number Diff line number Diff line
@@ -489,6 +489,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
	struct arizona *arizona = info->arizona;
	int id_gpio = arizona->pdata.hpdet_id_gpio;
	int report = ARIZONA_CABLE_HEADPHONE;
	unsigned int val;
	int ret, reading;

	mutex_lock(&info->lock);
@@ -543,13 +544,28 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
		dev_err(arizona->dev, "Failed to report HP/line: %d\n",
			ret);

	mutex_lock(&arizona->dapm->card->dapm_mutex);

	ret = regmap_read(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, &val);
	if (ret != 0) {
		dev_err(arizona->dev, "Failed to read output enables: %d\n",
			ret);
		val = 0;
	}

	if (!(val & (ARIZONA_OUT1L_ENA | ARIZONA_OUT1R_ENA))) {
		ret = regmap_update_bits(arizona->regmap, 0x225, 0x4000, 0);
		if (ret != 0)
		dev_warn(arizona->dev, "Failed to undo magic: %d\n", ret);
			dev_warn(arizona->dev, "Failed to undo magic: %d\n",
				 ret);

		ret = regmap_update_bits(arizona->regmap, 0x226, 0x4000, 0);
		if (ret != 0)
		dev_warn(arizona->dev, "Failed to undo magic: %d\n", ret);
			dev_warn(arizona->dev, "Failed to undo magic: %d\n",
				 ret);
	}

	mutex_unlock(&arizona->dapm->card->dapm_mutex);

done:
	if (id_gpio)
@@ -637,6 +653,7 @@ static void arizona_identify_headphone(struct arizona_extcon_info *info)
static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)
{
	struct arizona *arizona = info->arizona;
	unsigned int val;
	int ret;

	dev_dbg(arizona->dev, "Starting identification via HPDET\n");
@@ -648,13 +665,30 @@ static void arizona_start_hpdet_acc_id(struct arizona_extcon_info *info)

	arizona_extcon_pulse_micbias(info);

	ret = regmap_update_bits(arizona->regmap, 0x225, 0x4000, 0x4000);
	mutex_lock(&arizona->dapm->card->dapm_mutex);

	ret = regmap_read(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, &val);
	if (ret != 0) {
		dev_err(arizona->dev, "Failed to read output enables: %d\n",
			ret);
		val = 0;
	}

	if (!(val & (ARIZONA_OUT1L_ENA | ARIZONA_OUT1R_ENA))) {
		ret = regmap_update_bits(arizona->regmap, 0x225, 0x4000,
					 0x4000);
		if (ret != 0)
		dev_warn(arizona->dev, "Failed to do magic: %d\n", ret);
			dev_warn(arizona->dev, "Failed to do magic: %d\n",
				 ret);

	ret = regmap_update_bits(arizona->regmap, 0x226, 0x4000, 0x4000);
		ret = regmap_update_bits(arizona->regmap, 0x226, 0x4000,
					 0x4000);
		if (ret != 0)
		dev_warn(arizona->dev, "Failed to do magic: %d\n", ret);
			dev_warn(arizona->dev, "Failed to do magic: %d\n",
				 ret);
	}

	mutex_unlock(&arizona->dapm->card->dapm_mutex);

	ret = regmap_update_bits(arizona->regmap,
				 ARIZONA_ACCESSORY_DETECT_MODE_1,