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:
parent
24bce22d09
commit
76716fd5bf
1 changed files with 20 additions and 28 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue