diff options
| author | Mayank Rana <mrana@codeaurora.org> | 2016-05-24 18:32:24 -0700 |
|---|---|---|
| committer | Kyle Yan <kyan@codeaurora.org> | 2016-06-16 15:23:09 -0700 |
| commit | 4b0289c5824056486bb13dfb9e5435fac99724cd (patch) | |
| tree | 87909484ecd6d4b65fdad7e1226950d51d0b1dac /drivers/usb | |
| parent | d44fbf353e415e6c6bdaef56764a6e028b00b81c (diff) | |
usb: gadget: gsi: Fix reporting of USB device's usage count
Currently driver is reading and logging usage count of gadget
device but it is required to use usage count of gadget's parent
device which is used to prevent USB controller's low power mode.
Hence fix reporting of USB devices' usage count.
Also mark sm_state to initialized and remove queueing of
ipa_usb_wq as ipa_work_handler() is running without USB gadget
is initialized i.e. gadget is NULL.
CRs-Fixed: 1021499
Change-Id: Ia64afa3adb769674f6a9a60fde2c7397b7e4fe49
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/gadget/function/f_gsi.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 461db2ef5e22..6964933e5077 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -532,19 +532,30 @@ static void ipa_work_handler(struct work_struct *w) usb_ipa_w); u8 event; int ret = 0; - struct device *gad_dev = &d_port->gadget->dev; + struct usb_gadget *gadget = d_port->gadget; + struct device *dev; + struct device *gad_dev; event = read_event(d_port); log_event_dbg("%s: event = %x sm_state %x", __func__, event, d_port->sm_state); + if (gadget) { + dev = &gadget->dev; + if (!dev || !dev->parent) { + log_event_err("%s(): dev or dev->parent is NULL.\n", + __func__); + return; + } + gad_dev = dev->parent; + } else { + log_event_err("%s(): gadget is NULL.\n", __func__); + return; + } + switch (d_port->sm_state) { case STATE_UNINITIALIZED: - if (event == EVT_INITIALIZED) { - d_port->sm_state = STATE_INITIALIZED; - log_event_dbg("%s: ST_INIT_EVT_INIT", __func__); - } break; case STATE_INITIALIZED: if (event == EVT_CONNECT_IN_PROGRESS) { @@ -2522,8 +2533,7 @@ static int gsi_bind(struct usb_configuration *c, struct usb_function *f) goto dereg_rndis; } - post_event(&gsi->d_port, EVT_INITIALIZED); - queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w); + gsi->d_port.sm_state = STATE_INITIALIZED; DBG(cdev, "%s: %s speed IN/%s OUT/%s NOTIFY/%s\n", f->name, |
