Commit 76716fd5 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov Committed by Greg Kroah-Hartman
Browse files

usb: typec: ucsi: glink: move GPIO reading into connector_status callback



To simplify the platform code move Type-C orientation handling into the
connector_status callback. As it is called both during connector
registration and on connector change events, duplicated code from
pmic_glink_ucsi_register() can be dropped.

Also this moves operations that can sleep into a worker thread,
removing the only sleeping operation from pmic_glink_ucsi_notify().

Tested-by: default avatarKrishna Kurapati <quic_kriskura@quicinc.com>
Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarHeikki Krogerus <heikki.krogeurs@linux.intel.com>
Link: https://lore.kernel.org/r/20240411-ucsi-orient-aware-v2-2-d4b1cb22a33f@linaro.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 24bce22d
Loading
Loading
Loading
Loading
+20 −28
Original line number Diff line number Diff line
@@ -187,10 +187,28 @@ static int pmic_glink_ucsi_sync_write(struct ucsi *__ucsi, unsigned int offset,
	return ret;
}

static void pmic_glink_ucsi_connector_status(struct ucsi_connector *con)
{
	struct pmic_glink_ucsi *ucsi = ucsi_get_drvdata(con->ucsi);
	int orientation;

	if (con->num >= PMIC_GLINK_MAX_PORTS ||
	    !ucsi->port_orientation[con->num - 1])
		return;

	orientation = gpiod_get_value(ucsi->port_orientation[con->num - 1]);
	if (orientation >= 0) {
		typec_switch_set(ucsi->port_switch[con->num - 1],
				 orientation ? TYPEC_ORIENTATION_REVERSE
				 : TYPEC_ORIENTATION_NORMAL);
	}
}

static const struct ucsi_operations pmic_glink_ucsi_ops = {
	.read = pmic_glink_ucsi_read,
	.sync_write = pmic_glink_ucsi_sync_write,
	.async_write = pmic_glink_ucsi_async_write
	.async_write = pmic_glink_ucsi_async_write,
	.connector_status = pmic_glink_ucsi_connector_status,
};

static void pmic_glink_ucsi_read_ack(struct pmic_glink_ucsi *ucsi, const void *data, int len)
@@ -229,20 +247,8 @@ static void pmic_glink_ucsi_notify(struct work_struct *work)
	}

	con_num = UCSI_CCI_CONNECTOR(cci);
	if (con_num) {
		if (con_num <= PMIC_GLINK_MAX_PORTS &&
		    ucsi->port_orientation[con_num - 1]) {
			int orientation = gpiod_get_value(ucsi->port_orientation[con_num - 1]);

			if (orientation >= 0) {
				typec_switch_set(ucsi->port_switch[con_num - 1],
						 orientation ? TYPEC_ORIENTATION_REVERSE
							     : TYPEC_ORIENTATION_NORMAL);
			}
		}

	if (con_num)
		ucsi_connector_change(ucsi->ucsi, con_num);
	}

	if (ucsi->sync_pending &&
		   (cci & (UCSI_CCI_ACK_COMPLETE | UCSI_CCI_COMMAND_COMPLETE))) {
@@ -253,20 +259,6 @@ static void pmic_glink_ucsi_notify(struct work_struct *work)
static void pmic_glink_ucsi_register(struct work_struct *work)
{
	struct pmic_glink_ucsi *ucsi = container_of(work, struct pmic_glink_ucsi, register_work);
	int orientation;
	int i;

	for (i = 0; i < PMIC_GLINK_MAX_PORTS; i++) {
		if (!ucsi->port_orientation[i])
			continue;
		orientation = gpiod_get_value(ucsi->port_orientation[i]);

		if (orientation >= 0) {
			typec_switch_set(ucsi->port_switch[i],
					 orientation ? TYPEC_ORIENTATION_REVERSE
					     : TYPEC_ORIENTATION_NORMAL);
		}
	}

	ucsi_register(ucsi->ucsi);
}