Skip to content

Commit

Permalink
platform/chrome: cros_ec_typec: Use workqueue for port update
Browse files Browse the repository at this point in the history
Use a work queue to call the port update routines, instead of doing it
directly in the PD notifier callback. This will prevent other drivers
with PD notifier callbacks from being blocked on the port update routine
completing.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
Reviewed-by: Guenter Roeck <groeck@chromium.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
  • Loading branch information
Prashant Malani authored and Enric Balletbo i Serra committed Jun 30, 2020
1 parent bdc4094 commit 83cbc69
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions drivers/platform/chrome/cros_ec_typec.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ struct cros_typec_data {
/* Array of ports, indexed by port number. */
struct cros_typec_port *ports[EC_USB_PD_MAX_PORTS];
struct notifier_block nb;
struct work_struct port_work;
};

static int cros_typec_parse_port_props(struct typec_capability *cap,
Expand Down Expand Up @@ -619,18 +620,24 @@ static int cros_typec_get_cmd_version(struct cros_typec_data *typec)
return 0;
}

static int cros_ec_typec_event(struct notifier_block *nb,
unsigned long host_event, void *_notify)
static void cros_typec_port_work(struct work_struct *work)
{
struct cros_typec_data *typec = container_of(nb, struct cros_typec_data,
nb);
struct cros_typec_data *typec = container_of(work, struct cros_typec_data, port_work);
int ret, i;

for (i = 0; i < typec->num_ports; i++) {
ret = cros_typec_port_update(typec, i);
if (ret < 0)
dev_warn(typec->dev, "Update failed for port: %d\n", i);
}
}

static int cros_ec_typec_event(struct notifier_block *nb,
unsigned long host_event, void *_notify)
{
struct cros_typec_data *typec = container_of(nb, struct cros_typec_data, nb);

schedule_work(&typec->port_work);

return NOTIFY_OK;
}
Expand Down Expand Up @@ -689,6 +696,12 @@ static int cros_typec_probe(struct platform_device *pdev)
if (ret < 0)
return ret;

INIT_WORK(&typec->port_work, cros_typec_port_work);

/*
* Safe to call port update here, since we haven't registered the
* PD notifier yet.
*/
for (i = 0; i < typec->num_ports; i++) {
ret = cros_typec_port_update(typec, i);
if (ret < 0)
Expand Down

0 comments on commit 83cbc69

Please sign in to comment.