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

Commit a23f93ea authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: smb5-lib: Register typec partner only when partner is unregistered"

parents cd96342f a2fb4100
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2119,14 +2119,18 @@ static int smb5_configure_typec(struct smb_charger *chg)
		return rc;
	}

	val = EN_TRY_SNK_BIT;
	/* PMI632 doesn't support try snk */
	if (chg->chg_param.smb_version == PMI632_SUBTYPE)
		val = 0;

	/* enable try.snk and clear force sink for DRP mode */
	rc = smblib_masked_write(chg, TYPE_C_MODE_CFG_REG,
				EN_TRY_SNK_BIT | EN_SNK_ONLY_BIT,
				EN_TRY_SNK_BIT);
				val);
	if (rc < 0) {
		dev_err(chg->dev,
			"Couldn't configure TYPE_C_MODE_CFG_REG rc=%d\n",
				rc);
			"Couldn't configure TYPE_C_MODE_CFG_REG rc=%d\n", rc);
		return rc;
	}
	chg->typec_try_mode |= EN_TRY_SNK_BIT;
+27 −15
Original line number Diff line number Diff line
@@ -5877,23 +5877,26 @@ static int typec_partner_register(struct smb_charger *chg)
{
	int typec_mode, rc = 0;

	if (!chg->typec_port)
		return 0;
	mutex_lock(&chg->typec_lock);

	if (chg->typec_partner && chg->pr_swap_in_progress)
		return 0;
	if (!chg->typec_port || chg->pr_swap_in_progress)
		goto unlock;

	if (!chg->typec_partner) {
		if (chg->sink_src_mode == AUDIO_ACCESS_MODE)
		chg->typec_partner_desc.accessory = TYPEC_ACCESSORY_AUDIO;
			chg->typec_partner_desc.accessory =
					TYPEC_ACCESSORY_AUDIO;
		else
		chg->typec_partner_desc.accessory = TYPEC_ACCESSORY_NONE;
			chg->typec_partner_desc.accessory =
					TYPEC_ACCESSORY_NONE;

		chg->typec_partner = typec_register_partner(chg->typec_port,
				&chg->typec_partner_desc);
		if (IS_ERR(chg->typec_partner)) {
			rc = PTR_ERR(chg->typec_partner);
			pr_err("failed to register typec_partner rc=%d\n", rc);
		return rc;
			goto unlock;
		}
	}

	typec_mode = smblib_get_prop_typec_mode(chg);
@@ -5907,16 +5910,22 @@ static int typec_partner_register(struct smb_charger *chg)
		typec_set_pwr_role(chg->typec_port, TYPEC_SOURCE);
	}

unlock:
	mutex_unlock(&chg->typec_lock);
	return rc;
}

static void typec_partner_unregister(struct smb_charger *chg)
{
	mutex_lock(&chg->typec_lock);

	if (chg->typec_partner && !chg->pr_swap_in_progress) {
		smblib_dbg(chg, PR_MISC, "Un-registering typeC partner\n");
		typec_unregister_partner(chg->typec_partner);
		chg->typec_partner = NULL;
	}

	mutex_unlock(&chg->typec_lock);
}

static const char * const dr_mode_text[] = {
@@ -6455,10 +6464,13 @@ irqreturn_t typec_attach_detach_irq_handler(int irq, void *data)
		 * swap is not in progress, to ensure forced sink or src
		 * mode configuration is reset properly.
		 */
		mutex_lock(&chg->typec_lock);

		if (chg->typec_port && !chg->pr_swap_in_progress)
			smblib_force_dr_mode(chg, TYPEC_PORT_DRP);

		mutex_unlock(&chg->typec_lock);

		if (chg->lpd_stage == LPD_STAGE_FLOAT_CANCEL)
			schedule_delayed_work(&chg->lpd_detach_work,
					msecs_to_jiffies(1000));