Example #1
0
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
}
Example #2
0
/*
  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;
}
Example #4
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;
}
Example #6
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
}