Skip to content

Commit

Permalink
usb: typec: ucsi: glink: move GPIO reading into connector_status call…
Browse files Browse the repository at this point in the history
…back

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 <[email protected]>
Signed-off-by: Dmitry Baryshkov <[email protected]>
Reviewed-by: Heikki Krogerus <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
lumag authored and gregkh committed Apr 18, 2024
1 parent 24bce22 commit 76716fd
Showing 1 changed file with 20 additions and 28 deletions.
48 changes: 20 additions & 28 deletions drivers/usb/typec/ucsi/ucsi_glink.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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))) {
Expand All @@ -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);
}
Expand Down

0 comments on commit 76716fd

Please sign in to comment.