Skip to content

Commit 76716fd

Browse files
lumaggregkh
authored andcommitted
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>
1 parent 24bce22 commit 76716fd

File tree

1 file changed

+20
-28
lines changed

1 file changed

+20
-28
lines changed

drivers/usb/typec/ucsi/ucsi_glink.c

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,28 @@ static int pmic_glink_ucsi_sync_write(struct ucsi *__ucsi, unsigned int offset,
187187
return ret;
188188
}
189189

190+
static void pmic_glink_ucsi_connector_status(struct ucsi_connector *con)
191+
{
192+
struct pmic_glink_ucsi *ucsi = ucsi_get_drvdata(con->ucsi);
193+
int orientation;
194+
195+
if (con->num >= PMIC_GLINK_MAX_PORTS ||
196+
!ucsi->port_orientation[con->num - 1])
197+
return;
198+
199+
orientation = gpiod_get_value(ucsi->port_orientation[con->num - 1]);
200+
if (orientation >= 0) {
201+
typec_switch_set(ucsi->port_switch[con->num - 1],
202+
orientation ? TYPEC_ORIENTATION_REVERSE
203+
: TYPEC_ORIENTATION_NORMAL);
204+
}
205+
}
206+
190207
static const struct ucsi_operations pmic_glink_ucsi_ops = {
191208
.read = pmic_glink_ucsi_read,
192209
.sync_write = pmic_glink_ucsi_sync_write,
193-
.async_write = pmic_glink_ucsi_async_write
210+
.async_write = pmic_glink_ucsi_async_write,
211+
.connector_status = pmic_glink_ucsi_connector_status,
194212
};
195213

196214
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)
229247
}
230248

231249
con_num = UCSI_CCI_CONNECTOR(cci);
232-
if (con_num) {
233-
if (con_num <= PMIC_GLINK_MAX_PORTS &&
234-
ucsi->port_orientation[con_num - 1]) {
235-
int orientation = gpiod_get_value(ucsi->port_orientation[con_num - 1]);
236-
237-
if (orientation >= 0) {
238-
typec_switch_set(ucsi->port_switch[con_num - 1],
239-
orientation ? TYPEC_ORIENTATION_REVERSE
240-
: TYPEC_ORIENTATION_NORMAL);
241-
}
242-
}
243-
250+
if (con_num)
244251
ucsi_connector_change(ucsi->ucsi, con_num);
245-
}
246252

247253
if (ucsi->sync_pending &&
248254
(cci & (UCSI_CCI_ACK_COMPLETE | UCSI_CCI_COMMAND_COMPLETE))) {
@@ -253,20 +259,6 @@ static void pmic_glink_ucsi_notify(struct work_struct *work)
253259
static void pmic_glink_ucsi_register(struct work_struct *work)
254260
{
255261
struct pmic_glink_ucsi *ucsi = container_of(work, struct pmic_glink_ucsi, register_work);
256-
int orientation;
257-
int i;
258-
259-
for (i = 0; i < PMIC_GLINK_MAX_PORTS; i++) {
260-
if (!ucsi->port_orientation[i])
261-
continue;
262-
orientation = gpiod_get_value(ucsi->port_orientation[i]);
263-
264-
if (orientation >= 0) {
265-
typec_switch_set(ucsi->port_switch[i],
266-
orientation ? TYPEC_ORIENTATION_REVERSE
267-
: TYPEC_ORIENTATION_NORMAL);
268-
}
269-
}
270262

271263
ucsi_register(ucsi->ucsi);
272264
}

0 commit comments

Comments
 (0)