aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2013-02-26 07:47:44 -0500
committerFelipe Balbi <balbi@ti.com>2013-03-18 05:17:44 -0400
commit792bfcf7a1cd7913fa5d55f2b3a40e3275e98f6f (patch)
treeeae84b3c1688bf011ee15fb9487b39e84ee7259e
parent8707d5abbd96f7a124647357005511bee8d3ccdd (diff)
usb: gadget: udc-core: introduce usb_add_gadget_udc_release()
not all UDC drivers need a proper release function, for those which don't need it, we udc-core will provide a no-op release method so we can remove "redefinition" of such methods in almost every UDC driver. Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/gadget/udc-core.c39
-rw-r--r--include/linux/usb/gadget.h2
2 files changed, 36 insertions, 5 deletions
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 2423d024654f..a50811e35bdb 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -166,15 +166,23 @@ static void usb_udc_release(struct device *dev)
166} 166}
167 167
168static const struct attribute_group *usb_udc_attr_groups[]; 168static const struct attribute_group *usb_udc_attr_groups[];
169
170static void usb_udc_nop_release(struct device *dev)
171{
172 dev_vdbg(dev, "%s\n", __func__);
173}
174
169/** 175/**
170 * usb_add_gadget_udc - adds a new gadget to the udc class driver list 176 * usb_add_gadget_udc_release - adds a new gadget to the udc class driver list
171 * @parent: the parent device to this udc. Usually the controller 177 * @parent: the parent device to this udc. Usually the controller driver's
172 * driver's device. 178 * device.
173 * @gadget: the gadget to be added to the list 179 * @gadget: the gadget to be added to the list.
180 * @release: a gadget release function.
174 * 181 *
175 * Returns zero on success, negative errno otherwise. 182 * Returns zero on success, negative errno otherwise.
176 */ 183 */
177int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) 184int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
185 void (*release)(struct device *dev))
178{ 186{
179 struct usb_udc *udc; 187 struct usb_udc *udc;
180 int ret = -ENOMEM; 188 int ret = -ENOMEM;
@@ -190,6 +198,13 @@ int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
190 gadget->dev.dma_parms = parent->dma_parms; 198 gadget->dev.dma_parms = parent->dma_parms;
191 gadget->dev.dma_mask = parent->dma_mask; 199 gadget->dev.dma_mask = parent->dma_mask;
192 200
201 if (release) {
202 gadget->dev.release = release;
203 } else {
204 if (!gadget->dev.release)
205 gadget->dev.release = usb_udc_nop_release;
206 }
207
193 ret = device_register(&gadget->dev); 208 ret = device_register(&gadget->dev);
194 if (ret) 209 if (ret)
195 goto err2; 210 goto err2;
@@ -231,6 +246,20 @@ err2:
231err1: 246err1:
232 return ret; 247 return ret;
233} 248}
249EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);
250
251/**
252 * usb_add_gadget_udc - adds a new gadget to the udc class driver list
253 * @parent: the parent device to this udc. Usually the controller
254 * driver's device.
255 * @gadget: the gadget to be added to the list
256 *
257 * Returns zero on success, negative errno otherwise.
258 */
259int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
260{
261 return usb_add_gadget_udc_release(parent, gadget, NULL);
262}
234EXPORT_SYMBOL_GPL(usb_add_gadget_udc); 263EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
235 264
236static void usb_gadget_remove_driver(struct usb_udc *udc) 265static void usb_gadget_remove_driver(struct usb_udc *udc)
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 32b734d88d6b..c454a88abf2e 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -874,6 +874,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver);
874 */ 874 */
875int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); 875int usb_gadget_unregister_driver(struct usb_gadget_driver *driver);
876 876
877extern int usb_add_gadget_udc_release(struct device *parent,
878 struct usb_gadget *gadget, void (*release)(struct device *dev));
877extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget); 879extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);
878extern void usb_del_gadget_udc(struct usb_gadget *gadget); 880extern void usb_del_gadget_udc(struct usb_gadget *gadget);
879extern int udc_attach_driver(const char *name, 881extern int udc_attach_driver(const char *name,