xref: /rk3399_rockchip-uboot/drivers/usb/gadget/composite.c (revision 7010f5b94fa3c8e5daf95d4fab002eddbfa4e9b2)
1*7010f5b9SLukasz Majewski /*
2*7010f5b9SLukasz Majewski  * composite.c - infrastructure for Composite USB Gadgets
3*7010f5b9SLukasz Majewski  *
4*7010f5b9SLukasz Majewski  * Copyright (C) 2006-2008 David Brownell
5*7010f5b9SLukasz Majewski  * U-boot porting: Lukasz Majewski <l.majewski@samsung.com>
6*7010f5b9SLukasz Majewski  *
7*7010f5b9SLukasz Majewski  * This program is free software; you can redistribute it and/or modify
8*7010f5b9SLukasz Majewski  * it under the terms of the GNU General Public License as published by
9*7010f5b9SLukasz Majewski  * the Free Software Foundation; either version 2 of the License, or
10*7010f5b9SLukasz Majewski  * (at your option) any later version.
11*7010f5b9SLukasz Majewski  *
12*7010f5b9SLukasz Majewski  * This program is distributed in the hope that it will be useful,
13*7010f5b9SLukasz Majewski  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*7010f5b9SLukasz Majewski  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*7010f5b9SLukasz Majewski  * GNU General Public License for more details.
16*7010f5b9SLukasz Majewski  *
17*7010f5b9SLukasz Majewski  * You should have received a copy of the GNU General Public License
18*7010f5b9SLukasz Majewski  * along with this program; if not, write to the Free Software
19*7010f5b9SLukasz Majewski  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20*7010f5b9SLukasz Majewski  */
21*7010f5b9SLukasz Majewski #undef DEBUG
22*7010f5b9SLukasz Majewski 
23*7010f5b9SLukasz Majewski #include <linux/bitops.h>
24*7010f5b9SLukasz Majewski #include <linux/usb/composite.h>
25*7010f5b9SLukasz Majewski 
26*7010f5b9SLukasz Majewski #define USB_BUFSIZ	4096
27*7010f5b9SLukasz Majewski 
28*7010f5b9SLukasz Majewski static struct usb_composite_driver *composite;
29*7010f5b9SLukasz Majewski 
30*7010f5b9SLukasz Majewski /**
31*7010f5b9SLukasz Majewski  * usb_add_function() - add a function to a configuration
32*7010f5b9SLukasz Majewski  * @config: the configuration
33*7010f5b9SLukasz Majewski  * @function: the function being added
34*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
35*7010f5b9SLukasz Majewski  *
36*7010f5b9SLukasz Majewski  * After initialization, each configuration must have one or more
37*7010f5b9SLukasz Majewski  * functions added to it.  Adding a function involves calling its @bind()
38*7010f5b9SLukasz Majewski  * method to allocate resources such as interface and string identifiers
39*7010f5b9SLukasz Majewski  * and endpoints.
40*7010f5b9SLukasz Majewski  *
41*7010f5b9SLukasz Majewski  * This function returns the value of the function's bind(), which is
42*7010f5b9SLukasz Majewski  * zero for success else a negative errno value.
43*7010f5b9SLukasz Majewski  */
44*7010f5b9SLukasz Majewski int usb_add_function(struct usb_configuration *config,
45*7010f5b9SLukasz Majewski 		struct usb_function *function)
46*7010f5b9SLukasz Majewski {
47*7010f5b9SLukasz Majewski 	int	value = -EINVAL;
48*7010f5b9SLukasz Majewski 
49*7010f5b9SLukasz Majewski 	debug("adding '%s'/%p to config '%s'/%p\n",
50*7010f5b9SLukasz Majewski 			function->name, function,
51*7010f5b9SLukasz Majewski 			config->label, config);
52*7010f5b9SLukasz Majewski 
53*7010f5b9SLukasz Majewski 	if (!function->set_alt || !function->disable)
54*7010f5b9SLukasz Majewski 		goto done;
55*7010f5b9SLukasz Majewski 
56*7010f5b9SLukasz Majewski 	function->config = config;
57*7010f5b9SLukasz Majewski 	list_add_tail(&function->list, &config->functions);
58*7010f5b9SLukasz Majewski 
59*7010f5b9SLukasz Majewski 	if (function->bind) {
60*7010f5b9SLukasz Majewski 		value = function->bind(config, function);
61*7010f5b9SLukasz Majewski 		if (value < 0) {
62*7010f5b9SLukasz Majewski 			list_del(&function->list);
63*7010f5b9SLukasz Majewski 			function->config = NULL;
64*7010f5b9SLukasz Majewski 		}
65*7010f5b9SLukasz Majewski 	} else
66*7010f5b9SLukasz Majewski 		value = 0;
67*7010f5b9SLukasz Majewski 
68*7010f5b9SLukasz Majewski 	if (!config->fullspeed && function->descriptors)
69*7010f5b9SLukasz Majewski 		config->fullspeed = 1;
70*7010f5b9SLukasz Majewski 	if (!config->highspeed && function->hs_descriptors)
71*7010f5b9SLukasz Majewski 		config->highspeed = 1;
72*7010f5b9SLukasz Majewski 
73*7010f5b9SLukasz Majewski done:
74*7010f5b9SLukasz Majewski 	if (value)
75*7010f5b9SLukasz Majewski 		debug("adding '%s'/%p --> %d\n",
76*7010f5b9SLukasz Majewski 				function->name, function, value);
77*7010f5b9SLukasz Majewski 	return value;
78*7010f5b9SLukasz Majewski }
79*7010f5b9SLukasz Majewski 
80*7010f5b9SLukasz Majewski /**
81*7010f5b9SLukasz Majewski  * usb_function_deactivate - prevent function and gadget enumeration
82*7010f5b9SLukasz Majewski  * @function: the function that isn't yet ready to respond
83*7010f5b9SLukasz Majewski  *
84*7010f5b9SLukasz Majewski  * Blocks response of the gadget driver to host enumeration by
85*7010f5b9SLukasz Majewski  * preventing the data line pullup from being activated.  This is
86*7010f5b9SLukasz Majewski  * normally called during @bind() processing to change from the
87*7010f5b9SLukasz Majewski  * initial "ready to respond" state, or when a required resource
88*7010f5b9SLukasz Majewski  * becomes available.
89*7010f5b9SLukasz Majewski  *
90*7010f5b9SLukasz Majewski  * For example, drivers that serve as a passthrough to a userspace
91*7010f5b9SLukasz Majewski  * daemon can block enumeration unless that daemon (such as an OBEX,
92*7010f5b9SLukasz Majewski  * MTP, or print server) is ready to handle host requests.
93*7010f5b9SLukasz Majewski  *
94*7010f5b9SLukasz Majewski  * Not all systems support software control of their USB peripheral
95*7010f5b9SLukasz Majewski  * data pullups.
96*7010f5b9SLukasz Majewski  *
97*7010f5b9SLukasz Majewski  * Returns zero on success, else negative errno.
98*7010f5b9SLukasz Majewski  */
99*7010f5b9SLukasz Majewski int usb_function_deactivate(struct usb_function *function)
100*7010f5b9SLukasz Majewski {
101*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = function->config->cdev;
102*7010f5b9SLukasz Majewski 	int				status = 0;
103*7010f5b9SLukasz Majewski 
104*7010f5b9SLukasz Majewski 	if (cdev->deactivations == 0)
105*7010f5b9SLukasz Majewski 		status = usb_gadget_disconnect(cdev->gadget);
106*7010f5b9SLukasz Majewski 	if (status == 0)
107*7010f5b9SLukasz Majewski 		cdev->deactivations++;
108*7010f5b9SLukasz Majewski 
109*7010f5b9SLukasz Majewski 	return status;
110*7010f5b9SLukasz Majewski }
111*7010f5b9SLukasz Majewski 
112*7010f5b9SLukasz Majewski /**
113*7010f5b9SLukasz Majewski  * usb_function_activate - allow function and gadget enumeration
114*7010f5b9SLukasz Majewski  * @function: function on which usb_function_activate() was called
115*7010f5b9SLukasz Majewski  *
116*7010f5b9SLukasz Majewski  * Reverses effect of usb_function_deactivate().  If no more functions
117*7010f5b9SLukasz Majewski  * are delaying their activation, the gadget driver will respond to
118*7010f5b9SLukasz Majewski  * host enumeration procedures.
119*7010f5b9SLukasz Majewski  *
120*7010f5b9SLukasz Majewski  * Returns zero on success, else negative errno.
121*7010f5b9SLukasz Majewski  */
122*7010f5b9SLukasz Majewski int usb_function_activate(struct usb_function *function)
123*7010f5b9SLukasz Majewski {
124*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = function->config->cdev;
125*7010f5b9SLukasz Majewski 	int				status = 0;
126*7010f5b9SLukasz Majewski 
127*7010f5b9SLukasz Majewski 	if (cdev->deactivations == 0)
128*7010f5b9SLukasz Majewski 		status = -EINVAL;
129*7010f5b9SLukasz Majewski 	else {
130*7010f5b9SLukasz Majewski 		cdev->deactivations--;
131*7010f5b9SLukasz Majewski 		if (cdev->deactivations == 0)
132*7010f5b9SLukasz Majewski 			status = usb_gadget_connect(cdev->gadget);
133*7010f5b9SLukasz Majewski 	}
134*7010f5b9SLukasz Majewski 
135*7010f5b9SLukasz Majewski 	return status;
136*7010f5b9SLukasz Majewski }
137*7010f5b9SLukasz Majewski 
138*7010f5b9SLukasz Majewski /**
139*7010f5b9SLukasz Majewski  * usb_interface_id() - allocate an unused interface ID
140*7010f5b9SLukasz Majewski  * @config: configuration associated with the interface
141*7010f5b9SLukasz Majewski  * @function: function handling the interface
142*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
143*7010f5b9SLukasz Majewski  *
144*7010f5b9SLukasz Majewski  * usb_interface_id() is called from usb_function.bind() callbacks to
145*7010f5b9SLukasz Majewski  * allocate new interface IDs.  The function driver will then store that
146*7010f5b9SLukasz Majewski  * ID in interface, association, CDC union, and other descriptors.  It
147*7010f5b9SLukasz Majewski  * will also handle any control requests targetted at that interface,
148*7010f5b9SLukasz Majewski  * particularly changing its altsetting via set_alt().  There may
149*7010f5b9SLukasz Majewski  * also be class-specific or vendor-specific requests to handle.
150*7010f5b9SLukasz Majewski  *
151*7010f5b9SLukasz Majewski  * All interface identifier should be allocated using this routine, to
152*7010f5b9SLukasz Majewski  * ensure that for example different functions don't wrongly assign
153*7010f5b9SLukasz Majewski  * different meanings to the same identifier.  Note that since interface
154*7010f5b9SLukasz Majewski  * identifers are configuration-specific, functions used in more than
155*7010f5b9SLukasz Majewski  * one configuration (or more than once in a given configuration) need
156*7010f5b9SLukasz Majewski  * multiple versions of the relevant descriptors.
157*7010f5b9SLukasz Majewski  *
158*7010f5b9SLukasz Majewski  * Returns the interface ID which was allocated; or -ENODEV if no
159*7010f5b9SLukasz Majewski  * more interface IDs can be allocated.
160*7010f5b9SLukasz Majewski  */
161*7010f5b9SLukasz Majewski int usb_interface_id(struct usb_configuration *config,
162*7010f5b9SLukasz Majewski 		struct usb_function *function)
163*7010f5b9SLukasz Majewski {
164*7010f5b9SLukasz Majewski 	unsigned char id = config->next_interface_id;
165*7010f5b9SLukasz Majewski 
166*7010f5b9SLukasz Majewski 	if (id < MAX_CONFIG_INTERFACES) {
167*7010f5b9SLukasz Majewski 		config->interface[id] = function;
168*7010f5b9SLukasz Majewski 		config->next_interface_id = id + 1;
169*7010f5b9SLukasz Majewski 		return id;
170*7010f5b9SLukasz Majewski 	}
171*7010f5b9SLukasz Majewski 	return -ENODEV;
172*7010f5b9SLukasz Majewski }
173*7010f5b9SLukasz Majewski 
174*7010f5b9SLukasz Majewski static int config_buf(struct usb_configuration *config,
175*7010f5b9SLukasz Majewski 		enum usb_device_speed speed, void *buf, u8 type)
176*7010f5b9SLukasz Majewski {
177*7010f5b9SLukasz Majewski 	int				len = USB_BUFSIZ - USB_DT_CONFIG_SIZE;
178*7010f5b9SLukasz Majewski 	void				*next = buf + USB_DT_CONFIG_SIZE;
179*7010f5b9SLukasz Majewski 	struct usb_descriptor_header    **descriptors;
180*7010f5b9SLukasz Majewski 	struct usb_config_descriptor	*c = buf;
181*7010f5b9SLukasz Majewski 	int				status;
182*7010f5b9SLukasz Majewski 	struct usb_function		*f;
183*7010f5b9SLukasz Majewski 
184*7010f5b9SLukasz Majewski 	/* write the config descriptor */
185*7010f5b9SLukasz Majewski 	c = buf;
186*7010f5b9SLukasz Majewski 	c->bLength = USB_DT_CONFIG_SIZE;
187*7010f5b9SLukasz Majewski 	c->bDescriptorType = type;
188*7010f5b9SLukasz Majewski 
189*7010f5b9SLukasz Majewski 	c->bNumInterfaces = config->next_interface_id;
190*7010f5b9SLukasz Majewski 	c->bConfigurationValue = config->bConfigurationValue;
191*7010f5b9SLukasz Majewski 	c->iConfiguration = config->iConfiguration;
192*7010f5b9SLukasz Majewski 	c->bmAttributes = USB_CONFIG_ATT_ONE | config->bmAttributes;
193*7010f5b9SLukasz Majewski 	c->bMaxPower = config->bMaxPower ? : (CONFIG_USB_GADGET_VBUS_DRAW / 2);
194*7010f5b9SLukasz Majewski 
195*7010f5b9SLukasz Majewski 	/* There may be e.g. OTG descriptors */
196*7010f5b9SLukasz Majewski 	if (config->descriptors) {
197*7010f5b9SLukasz Majewski 		status = usb_descriptor_fillbuf(next, len,
198*7010f5b9SLukasz Majewski 				config->descriptors);
199*7010f5b9SLukasz Majewski 		if (status < 0)
200*7010f5b9SLukasz Majewski 			return status;
201*7010f5b9SLukasz Majewski 		len -= status;
202*7010f5b9SLukasz Majewski 		next += status;
203*7010f5b9SLukasz Majewski 	}
204*7010f5b9SLukasz Majewski 
205*7010f5b9SLukasz Majewski 	/* add each function's descriptors */
206*7010f5b9SLukasz Majewski 	list_for_each_entry(f, &config->functions, list) {
207*7010f5b9SLukasz Majewski 		if (speed == USB_SPEED_HIGH)
208*7010f5b9SLukasz Majewski 			descriptors = f->hs_descriptors;
209*7010f5b9SLukasz Majewski 		else
210*7010f5b9SLukasz Majewski 			descriptors = f->descriptors;
211*7010f5b9SLukasz Majewski 		if (!descriptors)
212*7010f5b9SLukasz Majewski 			continue;
213*7010f5b9SLukasz Majewski 		status = usb_descriptor_fillbuf(next, len,
214*7010f5b9SLukasz Majewski 			(const struct usb_descriptor_header **) descriptors);
215*7010f5b9SLukasz Majewski 		if (status < 0)
216*7010f5b9SLukasz Majewski 			return status;
217*7010f5b9SLukasz Majewski 		len -= status;
218*7010f5b9SLukasz Majewski 		next += status;
219*7010f5b9SLukasz Majewski 	}
220*7010f5b9SLukasz Majewski 
221*7010f5b9SLukasz Majewski 	len = next - buf;
222*7010f5b9SLukasz Majewski 	c->wTotalLength = cpu_to_le16(len);
223*7010f5b9SLukasz Majewski 	return len;
224*7010f5b9SLukasz Majewski }
225*7010f5b9SLukasz Majewski 
226*7010f5b9SLukasz Majewski static int config_desc(struct usb_composite_dev *cdev, unsigned w_value)
227*7010f5b9SLukasz Majewski {
228*7010f5b9SLukasz Majewski 	enum usb_device_speed		speed = USB_SPEED_UNKNOWN;
229*7010f5b9SLukasz Majewski 	struct usb_gadget		*gadget = cdev->gadget;
230*7010f5b9SLukasz Majewski 	u8				type = w_value >> 8;
231*7010f5b9SLukasz Majewski 	int                             hs = 0;
232*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
233*7010f5b9SLukasz Majewski 
234*7010f5b9SLukasz Majewski 	if (gadget_is_dualspeed(gadget)) {
235*7010f5b9SLukasz Majewski 		if (gadget->speed == USB_SPEED_HIGH)
236*7010f5b9SLukasz Majewski 			hs = 1;
237*7010f5b9SLukasz Majewski 		if (type == USB_DT_OTHER_SPEED_CONFIG)
238*7010f5b9SLukasz Majewski 			hs = !hs;
239*7010f5b9SLukasz Majewski 		if (hs)
240*7010f5b9SLukasz Majewski 			speed = USB_SPEED_HIGH;
241*7010f5b9SLukasz Majewski 	}
242*7010f5b9SLukasz Majewski 
243*7010f5b9SLukasz Majewski 	w_value &= 0xff;
244*7010f5b9SLukasz Majewski 	list_for_each_entry(c, &cdev->configs, list) {
245*7010f5b9SLukasz Majewski 		if (speed == USB_SPEED_HIGH) {
246*7010f5b9SLukasz Majewski 			if (!c->highspeed)
247*7010f5b9SLukasz Majewski 				continue;
248*7010f5b9SLukasz Majewski 		} else {
249*7010f5b9SLukasz Majewski 			if (!c->fullspeed)
250*7010f5b9SLukasz Majewski 				continue;
251*7010f5b9SLukasz Majewski 		}
252*7010f5b9SLukasz Majewski 		if (w_value == 0)
253*7010f5b9SLukasz Majewski 			return config_buf(c, speed, cdev->req->buf, type);
254*7010f5b9SLukasz Majewski 		w_value--;
255*7010f5b9SLukasz Majewski 	}
256*7010f5b9SLukasz Majewski 	return -EINVAL;
257*7010f5b9SLukasz Majewski }
258*7010f5b9SLukasz Majewski 
259*7010f5b9SLukasz Majewski static int count_configs(struct usb_composite_dev *cdev, unsigned type)
260*7010f5b9SLukasz Majewski {
261*7010f5b9SLukasz Majewski 	struct usb_gadget		*gadget = cdev->gadget;
262*7010f5b9SLukasz Majewski 	unsigned			count = 0;
263*7010f5b9SLukasz Majewski 	int				hs = 0;
264*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
265*7010f5b9SLukasz Majewski 
266*7010f5b9SLukasz Majewski 	if (gadget_is_dualspeed(gadget)) {
267*7010f5b9SLukasz Majewski 		if (gadget->speed == USB_SPEED_HIGH)
268*7010f5b9SLukasz Majewski 			hs = 1;
269*7010f5b9SLukasz Majewski 		if (type == USB_DT_DEVICE_QUALIFIER)
270*7010f5b9SLukasz Majewski 			hs = !hs;
271*7010f5b9SLukasz Majewski 	}
272*7010f5b9SLukasz Majewski 	list_for_each_entry(c, &cdev->configs, list) {
273*7010f5b9SLukasz Majewski 		/* ignore configs that won't work at this speed */
274*7010f5b9SLukasz Majewski 		if (hs) {
275*7010f5b9SLukasz Majewski 			if (!c->highspeed)
276*7010f5b9SLukasz Majewski 				continue;
277*7010f5b9SLukasz Majewski 		} else {
278*7010f5b9SLukasz Majewski 			if (!c->fullspeed)
279*7010f5b9SLukasz Majewski 				continue;
280*7010f5b9SLukasz Majewski 		}
281*7010f5b9SLukasz Majewski 		count++;
282*7010f5b9SLukasz Majewski 	}
283*7010f5b9SLukasz Majewski 	return count;
284*7010f5b9SLukasz Majewski }
285*7010f5b9SLukasz Majewski 
286*7010f5b9SLukasz Majewski static void device_qual(struct usb_composite_dev *cdev)
287*7010f5b9SLukasz Majewski {
288*7010f5b9SLukasz Majewski 	struct usb_qualifier_descriptor	*qual = cdev->req->buf;
289*7010f5b9SLukasz Majewski 
290*7010f5b9SLukasz Majewski 	qual->bLength = sizeof(*qual);
291*7010f5b9SLukasz Majewski 	qual->bDescriptorType = USB_DT_DEVICE_QUALIFIER;
292*7010f5b9SLukasz Majewski 	/* POLICY: same bcdUSB and device type info at both speeds */
293*7010f5b9SLukasz Majewski 	qual->bcdUSB = cdev->desc.bcdUSB;
294*7010f5b9SLukasz Majewski 	qual->bDeviceClass = cdev->desc.bDeviceClass;
295*7010f5b9SLukasz Majewski 	qual->bDeviceSubClass = cdev->desc.bDeviceSubClass;
296*7010f5b9SLukasz Majewski 	qual->bDeviceProtocol = cdev->desc.bDeviceProtocol;
297*7010f5b9SLukasz Majewski 	/* ASSUME same EP0 fifo size at both speeds */
298*7010f5b9SLukasz Majewski 	qual->bMaxPacketSize0 = cdev->desc.bMaxPacketSize0;
299*7010f5b9SLukasz Majewski 	qual->bNumConfigurations = count_configs(cdev, USB_DT_DEVICE_QUALIFIER);
300*7010f5b9SLukasz Majewski 	qual->bRESERVED = 0;
301*7010f5b9SLukasz Majewski }
302*7010f5b9SLukasz Majewski 
303*7010f5b9SLukasz Majewski static void reset_config(struct usb_composite_dev *cdev)
304*7010f5b9SLukasz Majewski {
305*7010f5b9SLukasz Majewski 	struct usb_function		*f;
306*7010f5b9SLukasz Majewski 
307*7010f5b9SLukasz Majewski 	debug("%s:\n", __func__);
308*7010f5b9SLukasz Majewski 
309*7010f5b9SLukasz Majewski 	list_for_each_entry(f, &cdev->config->functions, list) {
310*7010f5b9SLukasz Majewski 		if (f->disable)
311*7010f5b9SLukasz Majewski 			f->disable(f);
312*7010f5b9SLukasz Majewski 
313*7010f5b9SLukasz Majewski 		bitmap_zero(f->endpoints, 32);
314*7010f5b9SLukasz Majewski 	}
315*7010f5b9SLukasz Majewski 	cdev->config = NULL;
316*7010f5b9SLukasz Majewski }
317*7010f5b9SLukasz Majewski 
318*7010f5b9SLukasz Majewski static int set_config(struct usb_composite_dev *cdev,
319*7010f5b9SLukasz Majewski 		const struct usb_ctrlrequest *ctrl, unsigned number)
320*7010f5b9SLukasz Majewski {
321*7010f5b9SLukasz Majewski 	struct usb_gadget	*gadget = cdev->gadget;
322*7010f5b9SLukasz Majewski 	unsigned		power = gadget_is_otg(gadget) ? 8 : 100;
323*7010f5b9SLukasz Majewski 	struct usb_descriptor_header **descriptors;
324*7010f5b9SLukasz Majewski 	int			result = -EINVAL;
325*7010f5b9SLukasz Majewski 	struct usb_endpoint_descriptor *ep;
326*7010f5b9SLukasz Majewski 	struct usb_configuration *c = NULL;
327*7010f5b9SLukasz Majewski 	int                     addr;
328*7010f5b9SLukasz Majewski 	int			tmp;
329*7010f5b9SLukasz Majewski 	struct usb_function	*f;
330*7010f5b9SLukasz Majewski 
331*7010f5b9SLukasz Majewski 	if (cdev->config)
332*7010f5b9SLukasz Majewski 		reset_config(cdev);
333*7010f5b9SLukasz Majewski 
334*7010f5b9SLukasz Majewski 	if (number) {
335*7010f5b9SLukasz Majewski 		list_for_each_entry(c, &cdev->configs, list) {
336*7010f5b9SLukasz Majewski 			if (c->bConfigurationValue == number) {
337*7010f5b9SLukasz Majewski 				result = 0;
338*7010f5b9SLukasz Majewski 				break;
339*7010f5b9SLukasz Majewski 			}
340*7010f5b9SLukasz Majewski 		}
341*7010f5b9SLukasz Majewski 		if (result < 0)
342*7010f5b9SLukasz Majewski 			goto done;
343*7010f5b9SLukasz Majewski 	} else
344*7010f5b9SLukasz Majewski 		result = 0;
345*7010f5b9SLukasz Majewski 
346*7010f5b9SLukasz Majewski 	debug("%s: %s speed config #%d: %s\n", __func__,
347*7010f5b9SLukasz Majewski 	     ({ char *speed;
348*7010f5b9SLukasz Majewski 		     switch (gadget->speed) {
349*7010f5b9SLukasz Majewski 		     case USB_SPEED_LOW:
350*7010f5b9SLukasz Majewski 			     speed = "low";
351*7010f5b9SLukasz Majewski 			     break;
352*7010f5b9SLukasz Majewski 		     case USB_SPEED_FULL:
353*7010f5b9SLukasz Majewski 			     speed = "full";
354*7010f5b9SLukasz Majewski 			     break;
355*7010f5b9SLukasz Majewski 		     case USB_SPEED_HIGH:
356*7010f5b9SLukasz Majewski 			     speed = "high";
357*7010f5b9SLukasz Majewski 			     break;
358*7010f5b9SLukasz Majewski 		     default:
359*7010f5b9SLukasz Majewski 			     speed = "?";
360*7010f5b9SLukasz Majewski 			     break;
361*7010f5b9SLukasz Majewski 		     };
362*7010f5b9SLukasz Majewski 		     speed;
363*7010f5b9SLukasz Majewski 	     }), number, c ? c->label : "unconfigured");
364*7010f5b9SLukasz Majewski 
365*7010f5b9SLukasz Majewski 	if (!c)
366*7010f5b9SLukasz Majewski 		goto done;
367*7010f5b9SLukasz Majewski 
368*7010f5b9SLukasz Majewski 	cdev->config = c;
369*7010f5b9SLukasz Majewski 
370*7010f5b9SLukasz Majewski 	/* Initialize all interfaces by setting them to altsetting zero. */
371*7010f5b9SLukasz Majewski 	for (tmp = 0; tmp < MAX_CONFIG_INTERFACES; tmp++) {
372*7010f5b9SLukasz Majewski 		f = c->interface[tmp];
373*7010f5b9SLukasz Majewski 		if (!f)
374*7010f5b9SLukasz Majewski 			break;
375*7010f5b9SLukasz Majewski 
376*7010f5b9SLukasz Majewski 		/*
377*7010f5b9SLukasz Majewski 		 * Record which endpoints are used by the function. This is used
378*7010f5b9SLukasz Majewski 		 * to dispatch control requests targeted at that endpoint to the
379*7010f5b9SLukasz Majewski 		 * function's setup callback instead of the current
380*7010f5b9SLukasz Majewski 		 * configuration's setup callback.
381*7010f5b9SLukasz Majewski 		 */
382*7010f5b9SLukasz Majewski 		if (gadget->speed == USB_SPEED_HIGH)
383*7010f5b9SLukasz Majewski 			descriptors = f->hs_descriptors;
384*7010f5b9SLukasz Majewski 		else
385*7010f5b9SLukasz Majewski 			descriptors = f->descriptors;
386*7010f5b9SLukasz Majewski 
387*7010f5b9SLukasz Majewski 		for (; *descriptors; ++descriptors) {
388*7010f5b9SLukasz Majewski 			if ((*descriptors)->bDescriptorType != USB_DT_ENDPOINT)
389*7010f5b9SLukasz Majewski 				continue;
390*7010f5b9SLukasz Majewski 
391*7010f5b9SLukasz Majewski 			ep = (struct usb_endpoint_descriptor *)*descriptors;
392*7010f5b9SLukasz Majewski 			addr = ((ep->bEndpointAddress & 0x80) >> 3)
393*7010f5b9SLukasz Majewski 			     |	(ep->bEndpointAddress & 0x0f);
394*7010f5b9SLukasz Majewski 			__set_bit(addr, f->endpoints);
395*7010f5b9SLukasz Majewski 		}
396*7010f5b9SLukasz Majewski 
397*7010f5b9SLukasz Majewski 		result = f->set_alt(f, tmp, 0);
398*7010f5b9SLukasz Majewski 		if (result < 0) {
399*7010f5b9SLukasz Majewski 			debug("interface %d (%s/%p) alt 0 --> %d\n",
400*7010f5b9SLukasz Majewski 					tmp, f->name, f, result);
401*7010f5b9SLukasz Majewski 
402*7010f5b9SLukasz Majewski 			reset_config(cdev);
403*7010f5b9SLukasz Majewski 			goto done;
404*7010f5b9SLukasz Majewski 		}
405*7010f5b9SLukasz Majewski 	}
406*7010f5b9SLukasz Majewski 
407*7010f5b9SLukasz Majewski 	/* when we return, be sure our power usage is valid */
408*7010f5b9SLukasz Majewski 	power = c->bMaxPower ? (2 * c->bMaxPower) : CONFIG_USB_GADGET_VBUS_DRAW;
409*7010f5b9SLukasz Majewski done:
410*7010f5b9SLukasz Majewski 	usb_gadget_vbus_draw(gadget, power);
411*7010f5b9SLukasz Majewski 	return result;
412*7010f5b9SLukasz Majewski }
413*7010f5b9SLukasz Majewski 
414*7010f5b9SLukasz Majewski /**
415*7010f5b9SLukasz Majewski  * usb_add_config() - add a configuration to a device.
416*7010f5b9SLukasz Majewski  * @cdev: wraps the USB gadget
417*7010f5b9SLukasz Majewski  * @config: the configuration, with bConfigurationValue assigned
418*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
419*7010f5b9SLukasz Majewski  *
420*7010f5b9SLukasz Majewski  * One of the main tasks of a composite driver's bind() routine is to
421*7010f5b9SLukasz Majewski  * add each of the configurations it supports, using this routine.
422*7010f5b9SLukasz Majewski  *
423*7010f5b9SLukasz Majewski  * This function returns the value of the configuration's bind(), which
424*7010f5b9SLukasz Majewski  * is zero for success else a negative errno value.  Binding configurations
425*7010f5b9SLukasz Majewski  * assigns global resources including string IDs, and per-configuration
426*7010f5b9SLukasz Majewski  * resources such as interface IDs and endpoints.
427*7010f5b9SLukasz Majewski  */
428*7010f5b9SLukasz Majewski int usb_add_config(struct usb_composite_dev *cdev,
429*7010f5b9SLukasz Majewski 		struct usb_configuration *config)
430*7010f5b9SLukasz Majewski {
431*7010f5b9SLukasz Majewski 	int				status = -EINVAL;
432*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
433*7010f5b9SLukasz Majewski 	struct usb_function		*f;
434*7010f5b9SLukasz Majewski 	unsigned int			i;
435*7010f5b9SLukasz Majewski 
436*7010f5b9SLukasz Majewski 	debug("%s: adding config #%u '%s'/%p\n", __func__,
437*7010f5b9SLukasz Majewski 			config->bConfigurationValue,
438*7010f5b9SLukasz Majewski 			config->label, config);
439*7010f5b9SLukasz Majewski 
440*7010f5b9SLukasz Majewski 	if (!config->bConfigurationValue || !config->bind)
441*7010f5b9SLukasz Majewski 		goto done;
442*7010f5b9SLukasz Majewski 
443*7010f5b9SLukasz Majewski 	/* Prevent duplicate configuration identifiers */
444*7010f5b9SLukasz Majewski 	list_for_each_entry(c, &cdev->configs, list) {
445*7010f5b9SLukasz Majewski 		if (c->bConfigurationValue == config->bConfigurationValue) {
446*7010f5b9SLukasz Majewski 			status = -EBUSY;
447*7010f5b9SLukasz Majewski 			goto done;
448*7010f5b9SLukasz Majewski 		}
449*7010f5b9SLukasz Majewski 	}
450*7010f5b9SLukasz Majewski 
451*7010f5b9SLukasz Majewski 	config->cdev = cdev;
452*7010f5b9SLukasz Majewski 	list_add_tail(&config->list, &cdev->configs);
453*7010f5b9SLukasz Majewski 
454*7010f5b9SLukasz Majewski 	INIT_LIST_HEAD(&config->functions);
455*7010f5b9SLukasz Majewski 	config->next_interface_id = 0;
456*7010f5b9SLukasz Majewski 
457*7010f5b9SLukasz Majewski 	status = config->bind(config);
458*7010f5b9SLukasz Majewski 	if (status < 0) {
459*7010f5b9SLukasz Majewski 		list_del(&config->list);
460*7010f5b9SLukasz Majewski 		config->cdev = NULL;
461*7010f5b9SLukasz Majewski 	} else {
462*7010f5b9SLukasz Majewski 		debug("cfg %d/%p speeds:%s%s\n",
463*7010f5b9SLukasz Majewski 			config->bConfigurationValue, config,
464*7010f5b9SLukasz Majewski 			config->highspeed ? " high" : "",
465*7010f5b9SLukasz Majewski 			config->fullspeed
466*7010f5b9SLukasz Majewski 				? (gadget_is_dualspeed(cdev->gadget)
467*7010f5b9SLukasz Majewski 					? " full"
468*7010f5b9SLukasz Majewski 					: " full/low")
469*7010f5b9SLukasz Majewski 				: "");
470*7010f5b9SLukasz Majewski 
471*7010f5b9SLukasz Majewski 		for (i = 0; i < MAX_CONFIG_INTERFACES; i++) {
472*7010f5b9SLukasz Majewski 			f = config->interface[i];
473*7010f5b9SLukasz Majewski 			if (!f)
474*7010f5b9SLukasz Majewski 				continue;
475*7010f5b9SLukasz Majewski 			debug("%s: interface %d = %s/%p\n",
476*7010f5b9SLukasz Majewski 			      __func__, i, f->name, f);
477*7010f5b9SLukasz Majewski 		}
478*7010f5b9SLukasz Majewski 	}
479*7010f5b9SLukasz Majewski 
480*7010f5b9SLukasz Majewski 	usb_ep_autoconfig_reset(cdev->gadget);
481*7010f5b9SLukasz Majewski 
482*7010f5b9SLukasz Majewski done:
483*7010f5b9SLukasz Majewski 	if (status)
484*7010f5b9SLukasz Majewski 		debug("added config '%s'/%u --> %d\n", config->label,
485*7010f5b9SLukasz Majewski 				config->bConfigurationValue, status);
486*7010f5b9SLukasz Majewski 	return status;
487*7010f5b9SLukasz Majewski }
488*7010f5b9SLukasz Majewski 
489*7010f5b9SLukasz Majewski /*
490*7010f5b9SLukasz Majewski  * We support strings in multiple languages ... string descriptor zero
491*7010f5b9SLukasz Majewski  * says which languages are supported.	The typical case will be that
492*7010f5b9SLukasz Majewski  * only one language (probably English) is used, with I18N handled on
493*7010f5b9SLukasz Majewski  * the host side.
494*7010f5b9SLukasz Majewski  */
495*7010f5b9SLukasz Majewski 
496*7010f5b9SLukasz Majewski static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf)
497*7010f5b9SLukasz Majewski {
498*7010f5b9SLukasz Majewski 	const struct usb_gadget_strings	*s;
499*7010f5b9SLukasz Majewski 	u16				language;
500*7010f5b9SLukasz Majewski 	__le16				*tmp;
501*7010f5b9SLukasz Majewski 
502*7010f5b9SLukasz Majewski 	while (*sp) {
503*7010f5b9SLukasz Majewski 		s = *sp;
504*7010f5b9SLukasz Majewski 		language = cpu_to_le16(s->language);
505*7010f5b9SLukasz Majewski 		for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
506*7010f5b9SLukasz Majewski 			if (*tmp == language)
507*7010f5b9SLukasz Majewski 				goto repeat;
508*7010f5b9SLukasz Majewski 		}
509*7010f5b9SLukasz Majewski 		*tmp++ = language;
510*7010f5b9SLukasz Majewski repeat:
511*7010f5b9SLukasz Majewski 		sp++;
512*7010f5b9SLukasz Majewski 	}
513*7010f5b9SLukasz Majewski }
514*7010f5b9SLukasz Majewski 
515*7010f5b9SLukasz Majewski static int lookup_string(
516*7010f5b9SLukasz Majewski 	struct usb_gadget_strings	**sp,
517*7010f5b9SLukasz Majewski 	void				*buf,
518*7010f5b9SLukasz Majewski 	u16				language,
519*7010f5b9SLukasz Majewski 	int				id
520*7010f5b9SLukasz Majewski )
521*7010f5b9SLukasz Majewski {
522*7010f5b9SLukasz Majewski 	int				value;
523*7010f5b9SLukasz Majewski 	struct usb_gadget_strings	*s;
524*7010f5b9SLukasz Majewski 
525*7010f5b9SLukasz Majewski 	while (*sp) {
526*7010f5b9SLukasz Majewski 		s = *sp++;
527*7010f5b9SLukasz Majewski 		if (s->language != language)
528*7010f5b9SLukasz Majewski 			continue;
529*7010f5b9SLukasz Majewski 		value = usb_gadget_get_string(s, id, buf);
530*7010f5b9SLukasz Majewski 		if (value > 0)
531*7010f5b9SLukasz Majewski 			return value;
532*7010f5b9SLukasz Majewski 	}
533*7010f5b9SLukasz Majewski 	return -EINVAL;
534*7010f5b9SLukasz Majewski }
535*7010f5b9SLukasz Majewski 
536*7010f5b9SLukasz Majewski static int get_string(struct usb_composite_dev *cdev,
537*7010f5b9SLukasz Majewski 		void *buf, u16 language, int id)
538*7010f5b9SLukasz Majewski {
539*7010f5b9SLukasz Majewski 	struct usb_string_descriptor	*s = buf;
540*7010f5b9SLukasz Majewski 	struct usb_gadget_strings	**sp;
541*7010f5b9SLukasz Majewski 	int				len;
542*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
543*7010f5b9SLukasz Majewski 	struct usb_function		*f;
544*7010f5b9SLukasz Majewski 
545*7010f5b9SLukasz Majewski 	/*
546*7010f5b9SLukasz Majewski 	 * Yes, not only is USB's I18N support probably more than most
547*7010f5b9SLukasz Majewski 	 * folk will ever care about ... also, it's all supported here.
548*7010f5b9SLukasz Majewski 	 * (Except for UTF8 support for Unicode's "Astral Planes".)
549*7010f5b9SLukasz Majewski 	 */
550*7010f5b9SLukasz Majewski 
551*7010f5b9SLukasz Majewski 	/* 0 == report all available language codes */
552*7010f5b9SLukasz Majewski 	if (id == 0) {
553*7010f5b9SLukasz Majewski 		memset(s, 0, 256);
554*7010f5b9SLukasz Majewski 		s->bDescriptorType = USB_DT_STRING;
555*7010f5b9SLukasz Majewski 
556*7010f5b9SLukasz Majewski 		sp = composite->strings;
557*7010f5b9SLukasz Majewski 		if (sp)
558*7010f5b9SLukasz Majewski 			collect_langs(sp, s->wData);
559*7010f5b9SLukasz Majewski 
560*7010f5b9SLukasz Majewski 		list_for_each_entry(c, &cdev->configs, list) {
561*7010f5b9SLukasz Majewski 			sp = c->strings;
562*7010f5b9SLukasz Majewski 			if (sp)
563*7010f5b9SLukasz Majewski 				collect_langs(sp, s->wData);
564*7010f5b9SLukasz Majewski 
565*7010f5b9SLukasz Majewski 			list_for_each_entry(f, &c->functions, list) {
566*7010f5b9SLukasz Majewski 				sp = f->strings;
567*7010f5b9SLukasz Majewski 				if (sp)
568*7010f5b9SLukasz Majewski 					collect_langs(sp, s->wData);
569*7010f5b9SLukasz Majewski 			}
570*7010f5b9SLukasz Majewski 		}
571*7010f5b9SLukasz Majewski 
572*7010f5b9SLukasz Majewski 		for (len = 0; len <= 126 && s->wData[len]; len++)
573*7010f5b9SLukasz Majewski 			continue;
574*7010f5b9SLukasz Majewski 		if (!len)
575*7010f5b9SLukasz Majewski 			return -EINVAL;
576*7010f5b9SLukasz Majewski 
577*7010f5b9SLukasz Majewski 		s->bLength = 2 * (len + 1);
578*7010f5b9SLukasz Majewski 		return s->bLength;
579*7010f5b9SLukasz Majewski 	}
580*7010f5b9SLukasz Majewski 
581*7010f5b9SLukasz Majewski 	/*
582*7010f5b9SLukasz Majewski 	 * Otherwise, look up and return a specified string.  String IDs
583*7010f5b9SLukasz Majewski 	 * are device-scoped, so we look up each string table we're told
584*7010f5b9SLukasz Majewski 	 * about.  These lookups are infrequent; simpler-is-better here.
585*7010f5b9SLukasz Majewski 	 */
586*7010f5b9SLukasz Majewski 	if (composite->strings) {
587*7010f5b9SLukasz Majewski 		len = lookup_string(composite->strings, buf, language, id);
588*7010f5b9SLukasz Majewski 		if (len > 0)
589*7010f5b9SLukasz Majewski 			return len;
590*7010f5b9SLukasz Majewski 	}
591*7010f5b9SLukasz Majewski 	list_for_each_entry(c, &cdev->configs, list) {
592*7010f5b9SLukasz Majewski 		if (c->strings) {
593*7010f5b9SLukasz Majewski 			len = lookup_string(c->strings, buf, language, id);
594*7010f5b9SLukasz Majewski 			if (len > 0)
595*7010f5b9SLukasz Majewski 				return len;
596*7010f5b9SLukasz Majewski 		}
597*7010f5b9SLukasz Majewski 		list_for_each_entry(f, &c->functions, list) {
598*7010f5b9SLukasz Majewski 			if (!f->strings)
599*7010f5b9SLukasz Majewski 				continue;
600*7010f5b9SLukasz Majewski 			len = lookup_string(f->strings, buf, language, id);
601*7010f5b9SLukasz Majewski 			if (len > 0)
602*7010f5b9SLukasz Majewski 				return len;
603*7010f5b9SLukasz Majewski 		}
604*7010f5b9SLukasz Majewski 	}
605*7010f5b9SLukasz Majewski 	return -EINVAL;
606*7010f5b9SLukasz Majewski }
607*7010f5b9SLukasz Majewski 
608*7010f5b9SLukasz Majewski /**
609*7010f5b9SLukasz Majewski  * usb_string_id() - allocate an unused string ID
610*7010f5b9SLukasz Majewski  * @cdev: the device whose string descriptor IDs are being allocated
611*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
612*7010f5b9SLukasz Majewski  *
613*7010f5b9SLukasz Majewski  * @usb_string_id() is called from bind() callbacks to allocate
614*7010f5b9SLukasz Majewski  * string IDs.	Drivers for functions, configurations, or gadgets will
615*7010f5b9SLukasz Majewski  * then store that ID in the appropriate descriptors and string table.
616*7010f5b9SLukasz Majewski  *
617*7010f5b9SLukasz Majewski  * All string identifier should be allocated using this,
618*7010f5b9SLukasz Majewski  * @usb_string_ids_tab() or @usb_string_ids_n() routine, to ensure
619*7010f5b9SLukasz Majewski  * that for example different functions don't wrongly assign different
620*7010f5b9SLukasz Majewski  * meanings to the same identifier.
621*7010f5b9SLukasz Majewski  */
622*7010f5b9SLukasz Majewski int usb_string_id(struct usb_composite_dev *cdev)
623*7010f5b9SLukasz Majewski {
624*7010f5b9SLukasz Majewski 	if (cdev->next_string_id < 254) {
625*7010f5b9SLukasz Majewski 		/*
626*7010f5b9SLukasz Majewski 		 * string id 0 is reserved by USB spec for list of
627*7010f5b9SLukasz Majewski 		 * supported languages
628*7010f5b9SLukasz Majewski 		 * 255 reserved as well? -- mina86
629*7010f5b9SLukasz Majewski 		 */
630*7010f5b9SLukasz Majewski 		cdev->next_string_id++;
631*7010f5b9SLukasz Majewski 		return cdev->next_string_id;
632*7010f5b9SLukasz Majewski 	}
633*7010f5b9SLukasz Majewski 	return -ENODEV;
634*7010f5b9SLukasz Majewski }
635*7010f5b9SLukasz Majewski 
636*7010f5b9SLukasz Majewski /**
637*7010f5b9SLukasz Majewski  * usb_string_ids() - allocate unused string IDs in batch
638*7010f5b9SLukasz Majewski  * @cdev: the device whose string descriptor IDs are being allocated
639*7010f5b9SLukasz Majewski  * @str: an array of usb_string objects to assign numbers to
640*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
641*7010f5b9SLukasz Majewski  *
642*7010f5b9SLukasz Majewski  * @usb_string_ids() is called from bind() callbacks to allocate
643*7010f5b9SLukasz Majewski  * string IDs.	Drivers for functions, configurations, or gadgets will
644*7010f5b9SLukasz Majewski  * then copy IDs from the string table to the appropriate descriptors
645*7010f5b9SLukasz Majewski  * and string table for other languages.
646*7010f5b9SLukasz Majewski  *
647*7010f5b9SLukasz Majewski  * All string identifier should be allocated using this,
648*7010f5b9SLukasz Majewski  * @usb_string_id() or @usb_string_ids_n() routine, to ensure that for
649*7010f5b9SLukasz Majewski  * example different functions don't wrongly assign different meanings
650*7010f5b9SLukasz Majewski  * to the same identifier.
651*7010f5b9SLukasz Majewski  */
652*7010f5b9SLukasz Majewski int usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str)
653*7010f5b9SLukasz Majewski {
654*7010f5b9SLukasz Majewski 	u8 next = cdev->next_string_id;
655*7010f5b9SLukasz Majewski 
656*7010f5b9SLukasz Majewski 	for (; str->s; ++str) {
657*7010f5b9SLukasz Majewski 		if (next >= 254)
658*7010f5b9SLukasz Majewski 			return -ENODEV;
659*7010f5b9SLukasz Majewski 		str->id = ++next;
660*7010f5b9SLukasz Majewski 	}
661*7010f5b9SLukasz Majewski 
662*7010f5b9SLukasz Majewski 	cdev->next_string_id = next;
663*7010f5b9SLukasz Majewski 
664*7010f5b9SLukasz Majewski 	return 0;
665*7010f5b9SLukasz Majewski }
666*7010f5b9SLukasz Majewski 
667*7010f5b9SLukasz Majewski /**
668*7010f5b9SLukasz Majewski  * usb_string_ids_n() - allocate unused string IDs in batch
669*7010f5b9SLukasz Majewski  * @c: the device whose string descriptor IDs are being allocated
670*7010f5b9SLukasz Majewski  * @n: number of string IDs to allocate
671*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
672*7010f5b9SLukasz Majewski  *
673*7010f5b9SLukasz Majewski  * Returns the first requested ID.  This ID and next @n-1 IDs are now
674*7010f5b9SLukasz Majewski  * valid IDs.  At least provided that @n is non-zero because if it
675*7010f5b9SLukasz Majewski  * is, returns last requested ID which is now very useful information.
676*7010f5b9SLukasz Majewski  *
677*7010f5b9SLukasz Majewski  * @usb_string_ids_n() is called from bind() callbacks to allocate
678*7010f5b9SLukasz Majewski  * string IDs.	Drivers for functions, configurations, or gadgets will
679*7010f5b9SLukasz Majewski  * then store that ID in the appropriate descriptors and string table.
680*7010f5b9SLukasz Majewski  *
681*7010f5b9SLukasz Majewski  * All string identifier should be allocated using this,
682*7010f5b9SLukasz Majewski  * @usb_string_id() or @usb_string_ids_n() routine, to ensure that for
683*7010f5b9SLukasz Majewski  * example different functions don't wrongly assign different meanings
684*7010f5b9SLukasz Majewski  * to the same identifier.
685*7010f5b9SLukasz Majewski  */
686*7010f5b9SLukasz Majewski int usb_string_ids_n(struct usb_composite_dev *c, unsigned n)
687*7010f5b9SLukasz Majewski {
688*7010f5b9SLukasz Majewski 	u8 next = c->next_string_id;
689*7010f5b9SLukasz Majewski 
690*7010f5b9SLukasz Majewski 	if (n > 254 || next + n > 254)
691*7010f5b9SLukasz Majewski 		return -ENODEV;
692*7010f5b9SLukasz Majewski 
693*7010f5b9SLukasz Majewski 	c->next_string_id += n;
694*7010f5b9SLukasz Majewski 	return next + 1;
695*7010f5b9SLukasz Majewski }
696*7010f5b9SLukasz Majewski 
697*7010f5b9SLukasz Majewski static void composite_setup_complete(struct usb_ep *ep, struct usb_request *req)
698*7010f5b9SLukasz Majewski {
699*7010f5b9SLukasz Majewski 	if (req->status || req->actual != req->length)
700*7010f5b9SLukasz Majewski 		debug("%s: setup complete --> %d, %d/%d\n", __func__,
701*7010f5b9SLukasz Majewski 				req->status, req->actual, req->length);
702*7010f5b9SLukasz Majewski }
703*7010f5b9SLukasz Majewski 
704*7010f5b9SLukasz Majewski /*
705*7010f5b9SLukasz Majewski  * The setup() callback implements all the ep0 functionality that's
706*7010f5b9SLukasz Majewski  * not handled lower down, in hardware or the hardware driver(like
707*7010f5b9SLukasz Majewski  * device and endpoint feature flags, and their status).  It's all
708*7010f5b9SLukasz Majewski  * housekeeping for the gadget function we're implementing.  Most of
709*7010f5b9SLukasz Majewski  * the work is in config and function specific setup.
710*7010f5b9SLukasz Majewski  */
711*7010f5b9SLukasz Majewski static int
712*7010f5b9SLukasz Majewski composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
713*7010f5b9SLukasz Majewski {
714*7010f5b9SLukasz Majewski 	u16				w_length = le16_to_cpu(ctrl->wLength);
715*7010f5b9SLukasz Majewski 	u16				w_index = le16_to_cpu(ctrl->wIndex);
716*7010f5b9SLukasz Majewski 	u16				w_value = le16_to_cpu(ctrl->wValue);
717*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = get_gadget_data(gadget);
718*7010f5b9SLukasz Majewski 	u8				intf = w_index & 0xFF;
719*7010f5b9SLukasz Majewski 	int				value = -EOPNOTSUPP;
720*7010f5b9SLukasz Majewski 	struct usb_request		*req = cdev->req;
721*7010f5b9SLukasz Majewski 	struct usb_function		*f = NULL;
722*7010f5b9SLukasz Majewski 	int				standard;
723*7010f5b9SLukasz Majewski 	u8				endp;
724*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
725*7010f5b9SLukasz Majewski 
726*7010f5b9SLukasz Majewski 	/*
727*7010f5b9SLukasz Majewski 	 * partial re-init of the response message; the function or the
728*7010f5b9SLukasz Majewski 	 * gadget might need to intercept e.g. a control-OUT completion
729*7010f5b9SLukasz Majewski 	 * when we delegate to it.
730*7010f5b9SLukasz Majewski 	 */
731*7010f5b9SLukasz Majewski 	req->zero = 0;
732*7010f5b9SLukasz Majewski 	req->complete = composite_setup_complete;
733*7010f5b9SLukasz Majewski 	req->length = USB_BUFSIZ;
734*7010f5b9SLukasz Majewski 	gadget->ep0->driver_data = cdev;
735*7010f5b9SLukasz Majewski 	standard = (ctrl->bRequestType & USB_TYPE_MASK)
736*7010f5b9SLukasz Majewski 						== USB_TYPE_STANDARD;
737*7010f5b9SLukasz Majewski 	if (!standard)
738*7010f5b9SLukasz Majewski 		goto unknown;
739*7010f5b9SLukasz Majewski 
740*7010f5b9SLukasz Majewski 	switch (ctrl->bRequest) {
741*7010f5b9SLukasz Majewski 
742*7010f5b9SLukasz Majewski 	/* we handle all standard USB descriptors */
743*7010f5b9SLukasz Majewski 	case USB_REQ_GET_DESCRIPTOR:
744*7010f5b9SLukasz Majewski 		if (ctrl->bRequestType != USB_DIR_IN)
745*7010f5b9SLukasz Majewski 			goto unknown;
746*7010f5b9SLukasz Majewski 		switch (w_value >> 8) {
747*7010f5b9SLukasz Majewski 
748*7010f5b9SLukasz Majewski 		case USB_DT_DEVICE:
749*7010f5b9SLukasz Majewski 			cdev->desc.bNumConfigurations =
750*7010f5b9SLukasz Majewski 				count_configs(cdev, USB_DT_DEVICE);
751*7010f5b9SLukasz Majewski 			value = min(w_length, (u16) sizeof cdev->desc);
752*7010f5b9SLukasz Majewski 			memcpy(req->buf, &cdev->desc, value);
753*7010f5b9SLukasz Majewski 			break;
754*7010f5b9SLukasz Majewski 		case USB_DT_DEVICE_QUALIFIER:
755*7010f5b9SLukasz Majewski 			if (!gadget_is_dualspeed(gadget))
756*7010f5b9SLukasz Majewski 				break;
757*7010f5b9SLukasz Majewski 			device_qual(cdev);
758*7010f5b9SLukasz Majewski 			value = min(w_length,
759*7010f5b9SLukasz Majewski 				sizeof(struct usb_qualifier_descriptor));
760*7010f5b9SLukasz Majewski 			break;
761*7010f5b9SLukasz Majewski 		case USB_DT_OTHER_SPEED_CONFIG:
762*7010f5b9SLukasz Majewski 			if (!gadget_is_dualspeed(gadget))
763*7010f5b9SLukasz Majewski 				break;
764*7010f5b9SLukasz Majewski 
765*7010f5b9SLukasz Majewski 		case USB_DT_CONFIG:
766*7010f5b9SLukasz Majewski 			value = config_desc(cdev, w_value);
767*7010f5b9SLukasz Majewski 			if (value >= 0)
768*7010f5b9SLukasz Majewski 				value = min(w_length, (u16) value);
769*7010f5b9SLukasz Majewski 			break;
770*7010f5b9SLukasz Majewski 		case USB_DT_STRING:
771*7010f5b9SLukasz Majewski 			value = get_string(cdev, req->buf,
772*7010f5b9SLukasz Majewski 					w_index, w_value & 0xff);
773*7010f5b9SLukasz Majewski 			if (value >= 0)
774*7010f5b9SLukasz Majewski 				value = min(w_length, (u16) value);
775*7010f5b9SLukasz Majewski 			break;
776*7010f5b9SLukasz Majewski 		default:
777*7010f5b9SLukasz Majewski 			goto unknown;
778*7010f5b9SLukasz Majewski 		}
779*7010f5b9SLukasz Majewski 		break;
780*7010f5b9SLukasz Majewski 
781*7010f5b9SLukasz Majewski 	/* any number of configs can work */
782*7010f5b9SLukasz Majewski 	case USB_REQ_SET_CONFIGURATION:
783*7010f5b9SLukasz Majewski 		if (ctrl->bRequestType != 0)
784*7010f5b9SLukasz Majewski 			goto unknown;
785*7010f5b9SLukasz Majewski 		if (gadget_is_otg(gadget)) {
786*7010f5b9SLukasz Majewski 			if (gadget->a_hnp_support)
787*7010f5b9SLukasz Majewski 				debug("HNP available\n");
788*7010f5b9SLukasz Majewski 			else if (gadget->a_alt_hnp_support)
789*7010f5b9SLukasz Majewski 				debug("HNP on another port\n");
790*7010f5b9SLukasz Majewski 			else
791*7010f5b9SLukasz Majewski 				debug("HNP inactive\n");
792*7010f5b9SLukasz Majewski 		}
793*7010f5b9SLukasz Majewski 
794*7010f5b9SLukasz Majewski 		value = set_config(cdev, ctrl, w_value);
795*7010f5b9SLukasz Majewski 		break;
796*7010f5b9SLukasz Majewski 	case USB_REQ_GET_CONFIGURATION:
797*7010f5b9SLukasz Majewski 		if (ctrl->bRequestType != USB_DIR_IN)
798*7010f5b9SLukasz Majewski 			goto unknown;
799*7010f5b9SLukasz Majewski 		if (cdev->config)
800*7010f5b9SLukasz Majewski 			*(u8 *)req->buf = cdev->config->bConfigurationValue;
801*7010f5b9SLukasz Majewski 		else
802*7010f5b9SLukasz Majewski 			*(u8 *)req->buf = 0;
803*7010f5b9SLukasz Majewski 		value = min(w_length, (u16) 1);
804*7010f5b9SLukasz Majewski 		break;
805*7010f5b9SLukasz Majewski 
806*7010f5b9SLukasz Majewski 	/*
807*7010f5b9SLukasz Majewski 	 * function drivers must handle get/set altsetting; if there's
808*7010f5b9SLukasz Majewski 	 * no get() method, we know only altsetting zero works.
809*7010f5b9SLukasz Majewski 	 */
810*7010f5b9SLukasz Majewski 	case USB_REQ_SET_INTERFACE:
811*7010f5b9SLukasz Majewski 		if (ctrl->bRequestType != USB_RECIP_INTERFACE)
812*7010f5b9SLukasz Majewski 			goto unknown;
813*7010f5b9SLukasz Majewski 		if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
814*7010f5b9SLukasz Majewski 			break;
815*7010f5b9SLukasz Majewski 		f = cdev->config->interface[intf];
816*7010f5b9SLukasz Majewski 		if (!f)
817*7010f5b9SLukasz Majewski 			break;
818*7010f5b9SLukasz Majewski 		if (w_value && !f->set_alt)
819*7010f5b9SLukasz Majewski 			break;
820*7010f5b9SLukasz Majewski 		value = f->set_alt(f, w_index, w_value);
821*7010f5b9SLukasz Majewski 		break;
822*7010f5b9SLukasz Majewski 	case USB_REQ_GET_INTERFACE:
823*7010f5b9SLukasz Majewski 		if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE))
824*7010f5b9SLukasz Majewski 			goto unknown;
825*7010f5b9SLukasz Majewski 		if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES)
826*7010f5b9SLukasz Majewski 			break;
827*7010f5b9SLukasz Majewski 		f = cdev->config->interface[intf];
828*7010f5b9SLukasz Majewski 		if (!f)
829*7010f5b9SLukasz Majewski 			break;
830*7010f5b9SLukasz Majewski 		/* lots of interfaces only need altsetting zero... */
831*7010f5b9SLukasz Majewski 		value = f->get_alt ? f->get_alt(f, w_index) : 0;
832*7010f5b9SLukasz Majewski 		if (value < 0)
833*7010f5b9SLukasz Majewski 			break;
834*7010f5b9SLukasz Majewski 		*((u8 *)req->buf) = value;
835*7010f5b9SLukasz Majewski 		value = min(w_length, (u16) 1);
836*7010f5b9SLukasz Majewski 		break;
837*7010f5b9SLukasz Majewski 	default:
838*7010f5b9SLukasz Majewski unknown:
839*7010f5b9SLukasz Majewski 		debug("non-core control req%02x.%02x v%04x i%04x l%d\n",
840*7010f5b9SLukasz Majewski 			ctrl->bRequestType, ctrl->bRequest,
841*7010f5b9SLukasz Majewski 			w_value, w_index, w_length);
842*7010f5b9SLukasz Majewski 
843*7010f5b9SLukasz Majewski 		/*
844*7010f5b9SLukasz Majewski 		 * functions always handle their interfaces and endpoints...
845*7010f5b9SLukasz Majewski 		 * punt other recipients (other, WUSB, ...) to the current
846*7010f5b9SLukasz Majewski 		 * configuration code.
847*7010f5b9SLukasz Majewski 		 */
848*7010f5b9SLukasz Majewski 		switch (ctrl->bRequestType & USB_RECIP_MASK) {
849*7010f5b9SLukasz Majewski 		case USB_RECIP_INTERFACE:
850*7010f5b9SLukasz Majewski 			f = cdev->config->interface[intf];
851*7010f5b9SLukasz Majewski 			break;
852*7010f5b9SLukasz Majewski 
853*7010f5b9SLukasz Majewski 		case USB_RECIP_ENDPOINT:
854*7010f5b9SLukasz Majewski 			endp = ((w_index & 0x80) >> 3) | (w_index & 0x0f);
855*7010f5b9SLukasz Majewski 			list_for_each_entry(f, &cdev->config->functions, list) {
856*7010f5b9SLukasz Majewski 				if (test_bit(endp, f->endpoints))
857*7010f5b9SLukasz Majewski 					break;
858*7010f5b9SLukasz Majewski 			}
859*7010f5b9SLukasz Majewski 			if (&f->list == &cdev->config->functions)
860*7010f5b9SLukasz Majewski 				f = NULL;
861*7010f5b9SLukasz Majewski 			break;
862*7010f5b9SLukasz Majewski 		}
863*7010f5b9SLukasz Majewski 
864*7010f5b9SLukasz Majewski 		if (f && f->setup)
865*7010f5b9SLukasz Majewski 			value = f->setup(f, ctrl);
866*7010f5b9SLukasz Majewski 		else {
867*7010f5b9SLukasz Majewski 			c = cdev->config;
868*7010f5b9SLukasz Majewski 			if (c && c->setup)
869*7010f5b9SLukasz Majewski 				value = c->setup(c, ctrl);
870*7010f5b9SLukasz Majewski 		}
871*7010f5b9SLukasz Majewski 
872*7010f5b9SLukasz Majewski 		goto done;
873*7010f5b9SLukasz Majewski 	}
874*7010f5b9SLukasz Majewski 
875*7010f5b9SLukasz Majewski 	/* respond with data transfer before status phase? */
876*7010f5b9SLukasz Majewski 	if (value >= 0) {
877*7010f5b9SLukasz Majewski 		req->length = value;
878*7010f5b9SLukasz Majewski 		req->zero = value < w_length;
879*7010f5b9SLukasz Majewski 		value = usb_ep_queue(gadget->ep0, req, GFP_KERNEL);
880*7010f5b9SLukasz Majewski 		if (value < 0) {
881*7010f5b9SLukasz Majewski 			debug("ep_queue --> %d\n", value);
882*7010f5b9SLukasz Majewski 			req->status = 0;
883*7010f5b9SLukasz Majewski 			composite_setup_complete(gadget->ep0, req);
884*7010f5b9SLukasz Majewski 		}
885*7010f5b9SLukasz Majewski 	}
886*7010f5b9SLukasz Majewski 
887*7010f5b9SLukasz Majewski done:
888*7010f5b9SLukasz Majewski 	/* device either stalls (value < 0) or reports success */
889*7010f5b9SLukasz Majewski 	return value;
890*7010f5b9SLukasz Majewski }
891*7010f5b9SLukasz Majewski 
892*7010f5b9SLukasz Majewski static void composite_disconnect(struct usb_gadget *gadget)
893*7010f5b9SLukasz Majewski {
894*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = get_gadget_data(gadget);
895*7010f5b9SLukasz Majewski 
896*7010f5b9SLukasz Majewski 	if (cdev->config)
897*7010f5b9SLukasz Majewski 		reset_config(cdev);
898*7010f5b9SLukasz Majewski 	if (composite->disconnect)
899*7010f5b9SLukasz Majewski 		composite->disconnect(cdev);
900*7010f5b9SLukasz Majewski }
901*7010f5b9SLukasz Majewski 
902*7010f5b9SLukasz Majewski static void composite_unbind(struct usb_gadget *gadget)
903*7010f5b9SLukasz Majewski {
904*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = get_gadget_data(gadget);
905*7010f5b9SLukasz Majewski 	struct usb_configuration	*c;
906*7010f5b9SLukasz Majewski 	struct usb_function		*f;
907*7010f5b9SLukasz Majewski 
908*7010f5b9SLukasz Majewski 	/*
909*7010f5b9SLukasz Majewski 	 * composite_disconnect() must already have been called
910*7010f5b9SLukasz Majewski 	 * by the underlying peripheral controller driver!
911*7010f5b9SLukasz Majewski 	 * so there's no i/o concurrency that could affect the
912*7010f5b9SLukasz Majewski 	 * state protected by cdev->lock.
913*7010f5b9SLukasz Majewski 	 */
914*7010f5b9SLukasz Majewski 	BUG_ON(cdev->config);
915*7010f5b9SLukasz Majewski 
916*7010f5b9SLukasz Majewski 	while (!list_empty(&cdev->configs)) {
917*7010f5b9SLukasz Majewski 		c = list_first_entry(&cdev->configs,
918*7010f5b9SLukasz Majewski 				struct usb_configuration, list);
919*7010f5b9SLukasz Majewski 		while (!list_empty(&c->functions)) {
920*7010f5b9SLukasz Majewski 			f = list_first_entry(&c->functions,
921*7010f5b9SLukasz Majewski 					struct usb_function, list);
922*7010f5b9SLukasz Majewski 			list_del(&f->list);
923*7010f5b9SLukasz Majewski 			if (f->unbind) {
924*7010f5b9SLukasz Majewski 				debug("unbind function '%s'/%p\n",
925*7010f5b9SLukasz Majewski 						f->name, f);
926*7010f5b9SLukasz Majewski 				f->unbind(c, f);
927*7010f5b9SLukasz Majewski 			}
928*7010f5b9SLukasz Majewski 		}
929*7010f5b9SLukasz Majewski 		list_del(&c->list);
930*7010f5b9SLukasz Majewski 		if (c->unbind) {
931*7010f5b9SLukasz Majewski 			debug("unbind config '%s'/%p\n", c->label, c);
932*7010f5b9SLukasz Majewski 			c->unbind(c);
933*7010f5b9SLukasz Majewski 		}
934*7010f5b9SLukasz Majewski 	}
935*7010f5b9SLukasz Majewski 	if (composite->unbind)
936*7010f5b9SLukasz Majewski 		composite->unbind(cdev);
937*7010f5b9SLukasz Majewski 
938*7010f5b9SLukasz Majewski 	if (cdev->req) {
939*7010f5b9SLukasz Majewski 		kfree(cdev->req->buf);
940*7010f5b9SLukasz Majewski 		usb_ep_free_request(gadget->ep0, cdev->req);
941*7010f5b9SLukasz Majewski 	}
942*7010f5b9SLukasz Majewski 	kfree(cdev);
943*7010f5b9SLukasz Majewski 	set_gadget_data(gadget, NULL);
944*7010f5b9SLukasz Majewski 
945*7010f5b9SLukasz Majewski 	composite = NULL;
946*7010f5b9SLukasz Majewski }
947*7010f5b9SLukasz Majewski 
948*7010f5b9SLukasz Majewski static int composite_bind(struct usb_gadget *gadget)
949*7010f5b9SLukasz Majewski {
950*7010f5b9SLukasz Majewski 	int				status = -ENOMEM;
951*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev;
952*7010f5b9SLukasz Majewski 
953*7010f5b9SLukasz Majewski 	cdev = calloc(sizeof *cdev, 1);
954*7010f5b9SLukasz Majewski 	if (!cdev)
955*7010f5b9SLukasz Majewski 		return status;
956*7010f5b9SLukasz Majewski 
957*7010f5b9SLukasz Majewski 	cdev->gadget = gadget;
958*7010f5b9SLukasz Majewski 	set_gadget_data(gadget, cdev);
959*7010f5b9SLukasz Majewski 	INIT_LIST_HEAD(&cdev->configs);
960*7010f5b9SLukasz Majewski 
961*7010f5b9SLukasz Majewski 	/* preallocate control response and buffer */
962*7010f5b9SLukasz Majewski 	cdev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL);
963*7010f5b9SLukasz Majewski 	if (!cdev->req)
964*7010f5b9SLukasz Majewski 		goto fail;
965*7010f5b9SLukasz Majewski 	cdev->req->buf = memalign(CONFIG_SYS_CACHELINE_SIZE, USB_BUFSIZ);
966*7010f5b9SLukasz Majewski 	if (!cdev->req->buf)
967*7010f5b9SLukasz Majewski 		goto fail;
968*7010f5b9SLukasz Majewski 	cdev->req->complete = composite_setup_complete;
969*7010f5b9SLukasz Majewski 	gadget->ep0->driver_data = cdev;
970*7010f5b9SLukasz Majewski 
971*7010f5b9SLukasz Majewski 	cdev->bufsiz = USB_BUFSIZ;
972*7010f5b9SLukasz Majewski 	cdev->driver = composite;
973*7010f5b9SLukasz Majewski 
974*7010f5b9SLukasz Majewski 	usb_gadget_set_selfpowered(gadget);
975*7010f5b9SLukasz Majewski 	usb_ep_autoconfig_reset(cdev->gadget);
976*7010f5b9SLukasz Majewski 
977*7010f5b9SLukasz Majewski 	status = composite->bind(cdev);
978*7010f5b9SLukasz Majewski 	if (status < 0)
979*7010f5b9SLukasz Majewski 		goto fail;
980*7010f5b9SLukasz Majewski 
981*7010f5b9SLukasz Majewski 	cdev->desc = *composite->dev;
982*7010f5b9SLukasz Majewski 	cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
983*7010f5b9SLukasz Majewski 
984*7010f5b9SLukasz Majewski 	debug("%s: ready\n", composite->name);
985*7010f5b9SLukasz Majewski 	return 0;
986*7010f5b9SLukasz Majewski 
987*7010f5b9SLukasz Majewski fail:
988*7010f5b9SLukasz Majewski 	composite_unbind(gadget);
989*7010f5b9SLukasz Majewski 	return status;
990*7010f5b9SLukasz Majewski }
991*7010f5b9SLukasz Majewski 
992*7010f5b9SLukasz Majewski static void
993*7010f5b9SLukasz Majewski composite_suspend(struct usb_gadget *gadget)
994*7010f5b9SLukasz Majewski {
995*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = get_gadget_data(gadget);
996*7010f5b9SLukasz Majewski 	struct usb_function		*f;
997*7010f5b9SLukasz Majewski 
998*7010f5b9SLukasz Majewski 	debug("%s: suspend\n", __func__);
999*7010f5b9SLukasz Majewski 	if (cdev->config) {
1000*7010f5b9SLukasz Majewski 		list_for_each_entry(f, &cdev->config->functions, list) {
1001*7010f5b9SLukasz Majewski 			if (f->suspend)
1002*7010f5b9SLukasz Majewski 				f->suspend(f);
1003*7010f5b9SLukasz Majewski 		}
1004*7010f5b9SLukasz Majewski 	}
1005*7010f5b9SLukasz Majewski 	if (composite->suspend)
1006*7010f5b9SLukasz Majewski 		composite->suspend(cdev);
1007*7010f5b9SLukasz Majewski 
1008*7010f5b9SLukasz Majewski 	cdev->suspended = 1;
1009*7010f5b9SLukasz Majewski }
1010*7010f5b9SLukasz Majewski 
1011*7010f5b9SLukasz Majewski static void
1012*7010f5b9SLukasz Majewski composite_resume(struct usb_gadget *gadget)
1013*7010f5b9SLukasz Majewski {
1014*7010f5b9SLukasz Majewski 	struct usb_composite_dev	*cdev = get_gadget_data(gadget);
1015*7010f5b9SLukasz Majewski 	struct usb_function		*f;
1016*7010f5b9SLukasz Majewski 
1017*7010f5b9SLukasz Majewski 	debug("%s: resume\n", __func__);
1018*7010f5b9SLukasz Majewski 	if (composite->resume)
1019*7010f5b9SLukasz Majewski 		composite->resume(cdev);
1020*7010f5b9SLukasz Majewski 	if (cdev->config) {
1021*7010f5b9SLukasz Majewski 		list_for_each_entry(f, &cdev->config->functions, list) {
1022*7010f5b9SLukasz Majewski 			if (f->resume)
1023*7010f5b9SLukasz Majewski 				f->resume(f);
1024*7010f5b9SLukasz Majewski 		}
1025*7010f5b9SLukasz Majewski 	}
1026*7010f5b9SLukasz Majewski 
1027*7010f5b9SLukasz Majewski 	cdev->suspended = 0;
1028*7010f5b9SLukasz Majewski }
1029*7010f5b9SLukasz Majewski 
1030*7010f5b9SLukasz Majewski static struct usb_gadget_driver composite_driver = {
1031*7010f5b9SLukasz Majewski 	.speed		= USB_SPEED_HIGH,
1032*7010f5b9SLukasz Majewski 
1033*7010f5b9SLukasz Majewski 	.bind		= composite_bind,
1034*7010f5b9SLukasz Majewski 	.unbind         = composite_unbind,
1035*7010f5b9SLukasz Majewski 
1036*7010f5b9SLukasz Majewski 	.setup		= composite_setup,
1037*7010f5b9SLukasz Majewski 	.disconnect	= composite_disconnect,
1038*7010f5b9SLukasz Majewski 
1039*7010f5b9SLukasz Majewski 	.suspend        = composite_suspend,
1040*7010f5b9SLukasz Majewski 	.resume         = composite_resume,
1041*7010f5b9SLukasz Majewski };
1042*7010f5b9SLukasz Majewski 
1043*7010f5b9SLukasz Majewski /**
1044*7010f5b9SLukasz Majewski  * usb_composite_register() - register a composite driver
1045*7010f5b9SLukasz Majewski  * @driver: the driver to register
1046*7010f5b9SLukasz Majewski  * Context: single threaded during gadget setup
1047*7010f5b9SLukasz Majewski  *
1048*7010f5b9SLukasz Majewski  * This function is used to register drivers using the composite driver
1049*7010f5b9SLukasz Majewski  * framework.  The return value is zero, or a negative errno value.
1050*7010f5b9SLukasz Majewski  * Those values normally come from the driver's @bind method, which does
1051*7010f5b9SLukasz Majewski  * all the work of setting up the driver to match the hardware.
1052*7010f5b9SLukasz Majewski  *
1053*7010f5b9SLukasz Majewski  * On successful return, the gadget is ready to respond to requests from
1054*7010f5b9SLukasz Majewski  * the host, unless one of its components invokes usb_gadget_disconnect()
1055*7010f5b9SLukasz Majewski  * while it was binding.  That would usually be done in order to wait for
1056*7010f5b9SLukasz Majewski  * some userspace participation.
1057*7010f5b9SLukasz Majewski  */
1058*7010f5b9SLukasz Majewski int usb_composite_register(struct usb_composite_driver *driver)
1059*7010f5b9SLukasz Majewski {
1060*7010f5b9SLukasz Majewski 	if (!driver || !driver->dev || !driver->bind || composite)
1061*7010f5b9SLukasz Majewski 		return -EINVAL;
1062*7010f5b9SLukasz Majewski 
1063*7010f5b9SLukasz Majewski 	if (!driver->name)
1064*7010f5b9SLukasz Majewski 		driver->name = "composite";
1065*7010f5b9SLukasz Majewski 	composite = driver;
1066*7010f5b9SLukasz Majewski 
1067*7010f5b9SLukasz Majewski 	return usb_gadget_register_driver(&composite_driver);
1068*7010f5b9SLukasz Majewski }
1069*7010f5b9SLukasz Majewski 
1070*7010f5b9SLukasz Majewski /**
1071*7010f5b9SLukasz Majewski  * usb_composite_unregister() - unregister a composite driver
1072*7010f5b9SLukasz Majewski  * @driver: the driver to unregister
1073*7010f5b9SLukasz Majewski  *
1074*7010f5b9SLukasz Majewski  * This function is used to unregister drivers using the composite
1075*7010f5b9SLukasz Majewski  * driver framework.
1076*7010f5b9SLukasz Majewski  */
1077*7010f5b9SLukasz Majewski void usb_composite_unregister(struct usb_composite_driver *driver)
1078*7010f5b9SLukasz Majewski {
1079*7010f5b9SLukasz Majewski 	if (composite != driver)
1080*7010f5b9SLukasz Majewski 		return;
1081*7010f5b9SLukasz Majewski 	usb_gadget_unregister_driver(&composite_driver);
1082*7010f5b9SLukasz Majewski }
1083