static int gport_disconnect(struct f_gser *gser) { unsigned port_num; pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); port_num = gserial_ports[gser->port_num].client_port_num; switch (gser->transport) { case USB_GADGET_XPORT_TTY: gserial_disconnect(&gser->port); break; case USB_GADGET_XPORT_SDIO: gsdio_disconnect(&gser->port, port_num); break; case USB_GADGET_XPORT_SMD: gsmd_disconnect(&gser->port, port_num); break; case USB_GADGET_XPORT_HSIC: ghsic_ctrl_disconnect(&gser->port, port_num); ghsic_data_disconnect(&gser->port, port_num); break; case USB_GADGET_XPORT_HSUART: ghsuart_data_disconnect(&gser->port, port_num); break; default: pr_err("%s: Un-supported transport:%s\n", __func__, xport_to_str(gser->transport)); return -ENODEV; } return 0; }
static int gport_disconnect(struct f_gser *gser) { unsigned port_num; pr_debug("daniel.kang %s: transport:%s f_gser:%p gserial:%p port_num:%d\n", __func__, transport_to_str(gser->transport), gser, &gser->port, gser->port_num); port_num = gserial_ports[gser->port_num].client_port_num; switch (gser->transport) { case USB_GADGET_FSERIAL_TRANSPORT_TTY: gserial_disconnect(&gser->port); break; case USB_GADGET_FSERIAL_TRANSPORT_SDIO: gsdio_disconnect(&gser->port, port_num); break; case USB_GADGET_FSERIAL_TRANSPORT_SMD: gsmd_disconnect(&gser->port, port_num); break; default: pr_err("%s: Un-supported transport:%s\n", __func__, transport_to_str(gser->transport)); return -ENODEV; } return 0; }
static void acm_disable(struct usb_function *f) { struct f_acm *acm = func_to_acm(f); struct usb_composite_dev *cdev = f->config->cdev; DBG(cdev, "acm ttyGS%d deactivated\n", acm->port_num); gserial_disconnect(&acm->port); usb_ep_disable(acm->notify); acm->notify->driver_data = NULL; }
static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) { struct f_acm *acm = func_to_acm(f); struct usb_composite_dev *cdev = f->config->cdev; /* we know alt == 0, so this is an activation or a reset */ if (intf == acm->ctrl_id) { if (acm->notify->driver_data) { VDBG(cdev, "reset acm control interface %d\n", intf); usb_ep_disable(acm->notify); } if (!acm->notify->desc) if (config_ep_by_speed(cdev->gadget, f, acm->notify)) return -EINVAL; usb_ep_enable(acm->notify); acm->notify->driver_data = acm; } else if (intf == acm->data_id) { if (acm->port.in->driver_data) { DBG(cdev, "reset acm ttyGS%d\n", acm->port_num); gserial_disconnect(&acm->port); } if (!acm->port.in->desc || !acm->port.out->desc) { DBG(cdev, "activate acm ttyGS%d\n", acm->port_num); if (config_ep_by_speed(cdev->gadget, f, acm->port.in) || config_ep_by_speed(cdev->gadget, f, acm->port.out)) { acm->port.in->desc = NULL; acm->port.out->desc = NULL; return -EINVAL; } } gserial_connect(&acm->port, acm->port_num); } else return -EINVAL; return 0; }