void stop_gadget(struct pxa3xx_comp *dev, struct usb_gadget *gadget, struct usb_gadget_driver *driver) { #ifndef CONFIG_USB_COMPOSITE stop_activity(gadget, driver); #else struct gadget_driver_info *pInfo = dev->first_gadget; while (pInfo) { set_gadget_data(gadget, pInfo->driver_data); stop_activity(gadget, pInfo); pInfo = pInfo->next; } #endif }
/* Unregister entry point for the peripheral controller driver. */ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) { struct elfin_udc *dev = the_controller; unsigned long flags; GPIO_DISABLE; if (!dev) return -ENODEV; if (!driver || driver != dev->driver) return -EINVAL; spin_lock_irqsave(&dev->lock, flags); dev->driver = 0; stop_activity(dev, driver); spin_unlock_irqrestore(&dev->lock, flags); driver->unbind(&dev->gadget); device_del(&dev->gadget.dev); disable_irq(IRQ_USBD); printk("Unregistered gadget driver '%s'\n", driver->driver.name); return 0; }
/* * Unregister entry point for the peripheral controller driver. */ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) { struct s3c_udc *dev = the_controller; unsigned long flags; if (!dev) return -ENODEV; if (!driver || driver != dev->driver) return -EINVAL; disable_irq(IRQ_OTG); spin_lock_irqsave(&dev->lock, flags); stop_activity(dev, driver); spin_unlock_irqrestore(&dev->lock, flags); driver->unbind(&dev->gadget); device_del(&dev->gadget.dev); printk("Unregistered gadget driver '%s'\n", driver->driver.name); udc_disable(dev); dev->gadget.dev.driver = NULL; dev->driver = NULL; dev->config_gadget_driver = NO_GADGET_DRIVER; return 0; }
/* Unregister entry point for the peripheral controller driver. */ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) { struct lh7a40x_udc *dev = the_controller; unsigned long flags; if (!dev) return -ENODEV; if (!driver || driver != dev->driver || !driver->unbind) return -EINVAL; spin_lock_irqsave(&dev->lock, flags); dev->driver = 0; stop_activity(dev, driver); spin_unlock_irqrestore(&dev->lock, flags); driver->unbind(&dev->gadget); device_del(&dev->gadget.dev); udc_disable(dev); DEBUG("unregistered gadget driver '%s'\n", driver->driver.name); return 0; }
static int s3c_udc_suspend(struct platform_device *pdev, pm_message_t state) { struct s3c_udc *dev = platform_get_drvdata(pdev); DEBUG_PM("[%s]: System Suspend \n", __FUNCTION__); //save the state of connection to udc_resume_state if (dev->gadget.speed != USB_SPEED_UNKNOWN) { dev->udc_resume_state = dev->udc_state; DEBUG_PM("[%s]: USB connected at suspend\n", __FUNCTION__); } else { dev->udc_resume_state = dev->udc_state; DEBUG_PM("[%s]: USB not connected at suspend\n", __FUNCTION__); } switch(pm_policy) { case ALL_POWER_DOWN: s3c_udc_soft_disconnect(); stop_activity(dev, dev->driver); //confirm clk disable s3c_udc_power_down(); break; case CLOCK_GATING: s3c_udc_suspend_clock_gating(); break; case OPHYPWR_FORCE_SUSPEND: writel((readl(S3C_USBOTG_PHYPWR)|1), S3C_USBOTG_PHYPWR); break; default: printk("[%s]: not proper pm_policy\n", __FUNCTION__); } return 0; }
static void #ifndef CONFIG_USB_COMPOSITE stop_activity(struct usb_gadget *gadget, struct usb_gadget_driver *driver) { #else stop_activity(struct usb_gadget *gadget, struct gadget_driver_info *p_info) { struct usb_gadget_driver *driver=NULL; #endif DMSG("Trace path 1\n"); driver = (struct usb_gadget_driver *)stop_udc(driver); /* report disconnect; the driver is already quiesced */ #ifndef CONFIG_USB_COMPOSITE if (driver) driver->disconnect(gadget); #else if (!p_info->stopped) p_info->driver->disconnect(gadget); p_info->stopped = 1; #endif /* re-init driver-visible data structures */ udc_reinit(); } #ifdef CONFIG_USB_COMPOSITE struct gadget_driver_info *get_driver_info(struct pxa3xx_comp *dev, struct usb_gadget_driver *driver) { struct gadget_driver_info *p_info = dev->first_gadget; while (p_info && (p_info->driver != driver)) p_info = p_info->next; return p_info; } #endif int comp_check_driver(struct pxa3xx_comp *dev, struct usb_gadget_driver *slf_drver, struct usb_gadget_driver *driver) { struct gadget_driver_info *p_info = get_driver_info(dev, driver); #ifdef CONFIG_USB_OTG if (dev->transceiver && dev->transceiver->default_a) { printk(KERN_ERR "Mini-A connected! " "This operation may cause unexpected error!!!\n"); } #endif #ifdef CONFIG_USB_COMPOSITE if (!driver || NULL == p_info) { printk(KERN_ERR "%s, can't find driver!\n", __FUNCTION__); return 0; } return 1; #else if (!driver || driver != slf_drver) { printk(KERN_ERR "%s, can't find driver!\n", __FUNCTION__); return 0; } return 1; #endif } int comp_is_dev_busy(struct pxa3xx_comp *dev, struct usb_gadget_driver *driver) { #ifndef CONFIG_USB_COMPOSITE if (driver) return 1; #else /* FIXME remove all modules before insert again */ if ((dev->rm_flag) && dev->first_gadget) { printk(KERN_ERR "left modules may not work! " "please remove all and insert again!!!\n"); return 1; } #ifdef CONFIG_USB_OTG if(dev->transceiver && dev->transceiver->default_a) { printk(KERN_ERR "Mini-A connected! " "please unplug it and insert module again!!!\n"); return 1; } #endif #endif return 0; } int stop_cur_gadget(struct pxa3xx_comp *dev, struct usb_gadget *gadget, struct usb_gadget_driver *driver) { #ifdef CONFIG_USB_COMPOSITE struct gadget_driver_info *p_info = get_driver_info(dev, driver); set_gadget_data(gadget, p_info->driver_data); stop_activity(gadget, p_info); return 0; #else stop_activity(gadget, driver); return 0; #endif } void comp_register_driver(struct pxa3xx_comp *dev, struct usb_gadget *gadget, struct usb_gadget_driver *driver) { #ifdef CONFIG_USB_COMPOSITE /* allocate gadget_driver_info and attach it to controller */ gadget_info_init(dev, gadget, driver); dev->active_gadget->driver_data = get_gadget_data(gadget); #ifdef MULTI_P3 gadget_get_device_desc(dev, gadget, driver); #endif /* MULTI_P3 */ #endif /* After driver is bound, send a fake get configuration command to * gadget driver to get the configuration information */ gadget_get_config_desc(dev, gadget, driver); #if defined(CONFIG_USB_COMPOSITE) && (defined(CONFIG_USB_PXA3XX_U2D) \ || defined(CONFIG_USB_PXA_U2O)) gadget_get_config_desc_hs(dev, gadget, driver); #endif }