diff options
author | Peter Chen <peter.chen@freescale.com> | 2015-03-05 21:36:02 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-03-19 12:25:46 -0400 |
commit | dfea9c94837d27e38c8cc85a3c1c7c268973c3c2 (patch) | |
tree | b4f76788c83c4a0a8ae8e01e349e02055eb01bf9 /drivers/usb/gadget | |
parent | 7252f1bfd4bc97ec4b5fa7adaf3a1a45c325635c (diff) |
usb: udc: store usb_udc pointer in struct usb_gadget
Instead of iterate to find usb_udc according to usb_gadget, this
way is easier.
Alan Stern suggests this way too:
http://marc.info/?l=linux-usb&m=142168496528894&w=2
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r-- | drivers/usb/gadget/udc/udc-core.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c index 5a81cb086b99..bf7ed777a87d 100644 --- a/drivers/usb/gadget/udc/udc-core.c +++ b/drivers/usb/gadget/udc/udc-core.c | |||
@@ -128,21 +128,11 @@ EXPORT_SYMBOL_GPL(usb_gadget_giveback_request); | |||
128 | 128 | ||
129 | static void usb_gadget_state_work(struct work_struct *work) | 129 | static void usb_gadget_state_work(struct work_struct *work) |
130 | { | 130 | { |
131 | struct usb_gadget *gadget = work_to_gadget(work); | 131 | struct usb_gadget *gadget = work_to_gadget(work); |
132 | struct usb_udc *udc = NULL; | 132 | struct usb_udc *udc = gadget->udc; |
133 | |||
134 | mutex_lock(&udc_lock); | ||
135 | list_for_each_entry(udc, &udc_list, list) | ||
136 | if (udc->gadget == gadget) | ||
137 | goto found; | ||
138 | mutex_unlock(&udc_lock); | ||
139 | 133 | ||
140 | return; | 134 | if (udc) |
141 | 135 | sysfs_notify(&udc->dev.kobj, NULL, "state"); | |
142 | found: | ||
143 | mutex_unlock(&udc_lock); | ||
144 | |||
145 | sysfs_notify(&udc->dev.kobj, NULL, "state"); | ||
146 | } | 136 | } |
147 | 137 | ||
148 | void usb_gadget_set_state(struct usb_gadget *gadget, | 138 | void usb_gadget_set_state(struct usb_gadget *gadget, |
@@ -278,6 +268,7 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, | |||
278 | goto err3; | 268 | goto err3; |
279 | 269 | ||
280 | udc->gadget = gadget; | 270 | udc->gadget = gadget; |
271 | gadget->udc = udc; | ||
281 | 272 | ||
282 | mutex_lock(&udc_lock); | 273 | mutex_lock(&udc_lock); |
283 | list_add_tail(&udc->list, &udc_list); | 274 | list_add_tail(&udc->list, &udc_list); |
@@ -348,21 +339,14 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) | |||
348 | */ | 339 | */ |
349 | void usb_del_gadget_udc(struct usb_gadget *gadget) | 340 | void usb_del_gadget_udc(struct usb_gadget *gadget) |
350 | { | 341 | { |
351 | struct usb_udc *udc = NULL; | 342 | struct usb_udc *udc = gadget->udc; |
352 | 343 | ||
353 | mutex_lock(&udc_lock); | 344 | if (!udc) |
354 | list_for_each_entry(udc, &udc_list, list) | 345 | return; |
355 | if (udc->gadget == gadget) | ||
356 | goto found; | ||
357 | |||
358 | dev_err(gadget->dev.parent, "gadget not registered.\n"); | ||
359 | mutex_unlock(&udc_lock); | ||
360 | |||
361 | return; | ||
362 | 346 | ||
363 | found: | ||
364 | dev_vdbg(gadget->dev.parent, "unregistering gadget\n"); | 347 | dev_vdbg(gadget->dev.parent, "unregistering gadget\n"); |
365 | 348 | ||
349 | mutex_lock(&udc_lock); | ||
366 | list_del(&udc->list); | 350 | list_del(&udc->list); |
367 | mutex_unlock(&udc_lock); | 351 | mutex_unlock(&udc_lock); |
368 | 352 | ||