diff options
author | Felipe Balbi <balbi@ti.com> | 2013-01-24 07:52:24 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-03-18 05:16:39 -0400 |
commit | f07bd56bbdaa2340ebf46af9a37e7b2d1b4578e3 (patch) | |
tree | 00e341ad9d37d01667a82462b76365ca353cfe37 | |
parent | 7eaf8f2a7da6506df0e6edc4fdb22678f0eb3602 (diff) |
usb: gadget: udc-core: allow udc class register gadget device
Currently all UDC drivers are calling
device_register() before calling
usb_add_gadget_udc(). In order to avoid
code duplication, we can allow udc-core.c
register that device.
However that would become a really large patch,
so to cope with the meanwhile and allow us
to write bite-sized patches, we're adding
a flag which will be set by UDC driver once
it removes the code for registering the
gadget device.
Once all are converted, the new flag will
be removed.
Reviewed-by: Tomasz Figa <tomasz.figa@gmail.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r-- | drivers/usb/gadget/udc-core.c | 23 | ||||
-rw-r--r-- | include/linux/usb/gadget.h | 4 |
2 files changed, 23 insertions, 4 deletions
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 2a9cd369f71c..919505426ec1 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c | |||
@@ -173,6 +173,14 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
173 | if (!udc) | 173 | if (!udc) |
174 | goto err1; | 174 | goto err1; |
175 | 175 | ||
176 | if (gadget->register_my_device) { | ||
177 | dev_set_name(&gadget->dev, "gadget"); | ||
178 | |||
179 | ret = device_register(&gadget->dev); | ||
180 | if (ret) | ||
181 | goto err2; | ||
182 | } | ||
183 | |||
176 | device_initialize(&udc->dev); | 184 | device_initialize(&udc->dev); |
177 | udc->dev.release = usb_udc_release; | 185 | udc->dev.release = usb_udc_release; |
178 | udc->dev.class = udc_class; | 186 | udc->dev.class = udc_class; |
@@ -180,7 +188,7 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
180 | udc->dev.parent = parent; | 188 | udc->dev.parent = parent; |
181 | ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj)); | 189 | ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj)); |
182 | if (ret) | 190 | if (ret) |
183 | goto err2; | 191 | goto err3; |
184 | 192 | ||
185 | udc->gadget = gadget; | 193 | udc->gadget = gadget; |
186 | 194 | ||
@@ -189,18 +197,22 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | |||
189 | 197 | ||
190 | ret = device_add(&udc->dev); | 198 | ret = device_add(&udc->dev); |
191 | if (ret) | 199 | if (ret) |
192 | goto err3; | 200 | goto err4; |
193 | 201 | ||
194 | mutex_unlock(&udc_lock); | 202 | mutex_unlock(&udc_lock); |
195 | 203 | ||
196 | return 0; | 204 | return 0; |
197 | err3: | 205 | |
206 | err4: | ||
198 | list_del(&udc->list); | 207 | list_del(&udc->list); |
199 | mutex_unlock(&udc_lock); | 208 | mutex_unlock(&udc_lock); |
200 | 209 | ||
201 | err2: | 210 | err3: |
202 | put_device(&udc->dev); | 211 | put_device(&udc->dev); |
203 | 212 | ||
213 | err2: | ||
214 | if (gadget->register_my_device) | ||
215 | put_device(&gadget->dev); | ||
204 | err1: | 216 | err1: |
205 | return ret; | 217 | return ret; |
206 | } | 218 | } |
@@ -254,6 +266,9 @@ found: | |||
254 | 266 | ||
255 | kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE); | 267 | kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE); |
256 | device_unregister(&udc->dev); | 268 | device_unregister(&udc->dev); |
269 | |||
270 | if (gadget->register_my_device) | ||
271 | device_unregister(&gadget->dev); | ||
257 | } | 272 | } |
258 | EXPORT_SYMBOL_GPL(usb_del_gadget_udc); | 273 | EXPORT_SYMBOL_GPL(usb_del_gadget_udc); |
259 | 274 | ||
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 2e297e80d59a..fcd9ef8d3f70 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
@@ -494,6 +494,9 @@ struct usb_gadget_ops { | |||
494 | * only supports HNP on a different root port. | 494 | * only supports HNP on a different root port. |
495 | * @b_hnp_enable: OTG device feature flag, indicating that the A-Host | 495 | * @b_hnp_enable: OTG device feature flag, indicating that the A-Host |
496 | * enabled HNP support. | 496 | * enabled HNP support. |
497 | * @register_my_device: Flag telling udc-core that UDC driver didn't | ||
498 | * register the gadget device to the driver model. Temporary until | ||
499 | * all UDC drivers are fixed up properly. | ||
497 | * @name: Identifies the controller hardware type. Used in diagnostics | 500 | * @name: Identifies the controller hardware type. Used in diagnostics |
498 | * and sometimes configuration. | 501 | * and sometimes configuration. |
499 | * @dev: Driver model state for this abstract device. | 502 | * @dev: Driver model state for this abstract device. |
@@ -531,6 +534,7 @@ struct usb_gadget { | |||
531 | unsigned b_hnp_enable:1; | 534 | unsigned b_hnp_enable:1; |
532 | unsigned a_hnp_support:1; | 535 | unsigned a_hnp_support:1; |
533 | unsigned a_alt_hnp_support:1; | 536 | unsigned a_alt_hnp_support:1; |
537 | unsigned register_my_device:1; | ||
534 | const char *name; | 538 | const char *name; |
535 | struct device dev; | 539 | struct device dev; |
536 | unsigned out_epnum; | 540 | unsigned out_epnum; |