Lines Matching +full:ep +full:- +full:side
1 // SPDX-License-Identifier: GPL-2.0+
3 * f_serial.c - generic USB serial function driver
24 * if you can arrange appropriate host side drivers.
38 /*-------------------------------------------------------------------------*/
135 .language = 0x0409, /* en-us */
144 /*-------------------------------------------------------------------------*/
149 struct usb_composite_dev *cdev = f->config->cdev; in gser_set_alt()
153 if (gser->port.in->enabled) { in gser_set_alt()
154 dev_dbg(&cdev->gadget->dev, in gser_set_alt()
155 "reset generic ttyGS%d\n", gser->port_num); in gser_set_alt()
156 gserial_disconnect(&gser->port); in gser_set_alt()
158 if (!gser->port.in->desc || !gser->port.out->desc) { in gser_set_alt()
159 dev_dbg(&cdev->gadget->dev, in gser_set_alt()
160 "activate generic ttyGS%d\n", gser->port_num); in gser_set_alt()
161 if (config_ep_by_speed(cdev->gadget, f, gser->port.in) || in gser_set_alt()
162 config_ep_by_speed(cdev->gadget, f, gser->port.out)) { in gser_set_alt()
163 gser->port.in->desc = NULL; in gser_set_alt()
164 gser->port.out->desc = NULL; in gser_set_alt()
165 return -EINVAL; in gser_set_alt()
168 gserial_connect(&gser->port, gser->port_num); in gser_set_alt()
175 struct usb_composite_dev *cdev = f->config->cdev; in gser_disable()
177 dev_dbg(&cdev->gadget->dev, in gser_disable()
178 "generic ttyGS%d deactivated\n", gser->port_num); in gser_disable()
179 gserial_disconnect(&gser->port); in gser_disable()
182 /*-------------------------------------------------------------------------*/
188 struct usb_composite_dev *cdev = c->cdev; in gser_bind()
191 struct usb_ep *ep; in gser_bind() local
193 /* REVISIT might want instance-specific strings to help in gser_bind()
197 /* maybe allocate device-global string ID */ in gser_bind()
199 status = usb_string_id(c->cdev); in gser_bind()
205 /* allocate instance-specific interface IDs */ in gser_bind()
209 gser->data_id = status; in gser_bind()
212 status = -ENODEV; in gser_bind()
214 /* allocate instance-specific endpoints */ in gser_bind()
215 ep = usb_ep_autoconfig(cdev->gadget, &gser_fs_in_desc); in gser_bind()
216 if (!ep) in gser_bind()
218 gser->port.in = ep; in gser_bind()
220 ep = usb_ep_autoconfig(cdev->gadget, &gser_fs_out_desc); in gser_bind()
221 if (!ep) in gser_bind()
223 gser->port.out = ep; in gser_bind()
226 * hardware is dual speed, all bulk-capable endpoints work at in gser_bind()
239 dev_dbg(&cdev->gadget->dev, "generic ttyGS%d: IN/%s OUT/%s\n", in gser_bind()
240 gser->port_num, in gser_bind()
241 gser->port.in->name, gser->port.out->name); in gser_bind()
245 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); in gser_bind()
260 usb_put_function_instance(&opts->func_inst); in serial_attr_release()
272 return gserial_set_console(to_f_serial_opts(item)->port_num, in f_serial_console_store()
278 return gserial_get_console(to_f_serial_opts(item)->port_num, page); in f_serial_console_show()
287 return sprintf(page, "%u\n", to_f_serial_opts(item)->port_num); in f_serial_port_num_show()
311 gserial_free_line(opts->port_num); in gser_free_inst()
322 return ERR_PTR(-ENOMEM); in gser_alloc_inst()
324 opts->func_inst.free_func_inst = gser_free_inst; in gser_alloc_inst()
325 ret = gserial_alloc_line(&opts->port_num); in gser_alloc_inst()
330 config_group_init_type_name(&opts->func_inst.group, "", in gser_alloc_inst()
333 return &opts->func_inst; in gser_alloc_inst()
349 gserial_disconnect(&gser->port); in gser_unbind()
357 gserial_resume(&gser->port); in gser_resume()
364 gserial_suspend(&gser->port); in gser_suspend()
369 return (f->func_wakeup_armed ? USB_INTRF_STAT_FUNC_RW : 0) | in gser_get_status()
381 return ERR_PTR(-ENOMEM); in gser_alloc()
385 gser->port_num = opts->port_num; in gser_alloc()
387 gser->port.func.name = "gser"; in gser_alloc()
388 gser->port.func.strings = gser_strings; in gser_alloc()
389 gser->port.func.bind = gser_bind; in gser_alloc()
390 gser->port.func.unbind = gser_unbind; in gser_alloc()
391 gser->port.func.set_alt = gser_set_alt; in gser_alloc()
392 gser->port.func.disable = gser_disable; in gser_alloc()
393 gser->port.func.free_func = gser_free; in gser_alloc()
394 gser->port.func.resume = gser_resume; in gser_alloc()
395 gser->port.func.suspend = gser_suspend; in gser_alloc()
396 gser->port.func.get_status = gser_get_status; in gser_alloc()
398 return &gser->port.func; in gser_alloc()