aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2013-01-24 07:52:24 -0500
committerFelipe Balbi <balbi@ti.com>2013-03-18 05:16:39 -0400
commitf07bd56bbdaa2340ebf46af9a37e7b2d1b4578e3 (patch)
tree00e341ad9d37d01667a82462b76365ca353cfe37
parent7eaf8f2a7da6506df0e6edc4fdb22678f0eb3602 (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.c23
-rw-r--r--include/linux/usb/gadget.h4
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;
197err3: 205
206err4:
198 list_del(&udc->list); 207 list_del(&udc->list);
199 mutex_unlock(&udc_lock); 208 mutex_unlock(&udc_lock);
200 209
201err2: 210err3:
202 put_device(&udc->dev); 211 put_device(&udc->dev);
203 212
213err2:
214 if (gadget->register_my_device)
215 put_device(&gadget->dev);
204err1: 216err1:
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}
258EXPORT_SYMBOL_GPL(usb_del_gadget_udc); 273EXPORT_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;