diff options
author | Felipe Balbi <balbi@ti.com> | 2013-02-26 07:47:44 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-03-18 05:17:44 -0400 |
commit | 792bfcf7a1cd7913fa5d55f2b3a40e3275e98f6f (patch) | |
tree | eae84b3c1688bf011ee15fb9487b39e84ee7259e | |
parent | 8707d5abbd96f7a124647357005511bee8d3ccdd (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.c | 39 | ||||
-rw-r--r-- | include/linux/usb/gadget.h | 2 |
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 | ||
168 | static const struct attribute_group *usb_udc_attr_groups[]; | 168 | static const struct attribute_group *usb_udc_attr_groups[]; |
169 | |||
170 | static 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 | */ |
177 | int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | 184 | int 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: | |||
231 | err1: | 246 | err1: |
232 | return ret; | 247 | return ret; |
233 | } | 248 | } |
249 | EXPORT_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 | */ | ||
259 | int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) | ||
260 | { | ||
261 | return usb_add_gadget_udc_release(parent, gadget, NULL); | ||
262 | } | ||
234 | EXPORT_SYMBOL_GPL(usb_add_gadget_udc); | 263 | EXPORT_SYMBOL_GPL(usb_add_gadget_udc); |
235 | 264 | ||
236 | static void usb_gadget_remove_driver(struct usb_udc *udc) | 265 | static 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 | */ |
875 | int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); | 875 | int usb_gadget_unregister_driver(struct usb_gadget_driver *driver); |
876 | 876 | ||
877 | extern int usb_add_gadget_udc_release(struct device *parent, | ||
878 | struct usb_gadget *gadget, void (*release)(struct device *dev)); | ||
877 | extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget); | 879 | extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget); |
878 | extern void usb_del_gadget_udc(struct usb_gadget *gadget); | 880 | extern void usb_del_gadget_udc(struct usb_gadget *gadget); |
879 | extern int udc_attach_driver(const char *name, | 881 | extern int udc_attach_driver(const char *name, |