1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

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: Krishna Kurapati <quic_kriskura@quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Heikki Krogerus <heikki.krogeurs@linux.intel.com>
Link: https://lore.kernel.org/r/20240411-ucsi-orient-aware-v2-2-d4b1cb22a33f@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Dmitry Baryshkov 2024-04-11 07:49:54 +03:00 committed by Greg Kroah-Hartman
parent 24bce22d09
commit 76716fd5bf

View file

@ -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);
}