예제 #1
0
static int twl4030_set_host(struct otg_transceiver *x, struct usb_bus *host)
{
	struct twl4030_usb *twl;

	if (!x)
		return -ENODEV;

	twl = xceiv_to_twl(x);

	if (!host) {
		omap_writew(0, OTG_IRQ_EN);
		twl4030_phy_suspend(twl, 1);
		twl->otg.host = NULL;

		return -ENODEV;
	}

	twl->otg.host = host;
	twl4030_phy_resume(twl);

	twl4030_usb_set_bits(twl, TWL4030_OTG_CTRL,
			TWL4030_OTG_CTRL_DMPULLDOWN
				| TWL4030_OTG_CTRL_DPPULLDOWN);

	twl4030_usb_set_bits(twl, FUNC_CTRL, FUNC_CTRL_SUSPENDM);
	twl4030_usb_set_bits(twl, TWL4030_OTG_CTRL, TWL4030_OTG_CTRL_DRVVBUS);

	return 0;
}
예제 #2
0
static int twl4030_set_host(struct otg_transceiver *xceiv, struct usb_bus *host)
{
	struct twl4030_usb *twl = xceiv_to_twl(xceiv);

	if (!xceiv)
		return -ENODEV;

	if (!host) {
		OTG_IRQ_EN_REG = 0;
		twl4030_phy_suspend(1);
		twl->otg.host = NULL;

		return -ENODEV;
	}

	twl->otg.host = host;
	twl4030_phy_resume();

	twl4030_usb_set_bits(twl, OTG_CTRL,
			OTG_CTRL_DMPULLDOWN | OTG_CTRL_DPPULLDOWN);
	twl4030_usb_set_bits(twl, USB_INT_EN_RISE, USB_INT_IDGND);
	twl4030_usb_set_bits(twl, USB_INT_EN_FALL, USB_INT_IDGND);
	twl4030_usb_set_bits(twl, FUNC_CTRL, FUNC_CTRL_SUSPENDM);
	twl4030_usb_set_bits(twl, OTG_CTRL, OTG_CTRL_DRVVBUS);

	return 0;
}
예제 #3
0
static int twl4030_set_peripheral(struct otg_transceiver *x,
		struct usb_gadget *gadget)
{
	struct twl4030_usb *twl;
	u32 l;

	if (!x)
		return -ENODEV;

	twl = xceiv_to_twl(x);

	if (!gadget) {
		omap_writew(0, OTG_IRQ_EN);
		twl4030_phy_suspend(twl, 1);
		twl->otg.gadget = NULL;

		return -ENODEV;
	}

	twl->otg.gadget = gadget;
	twl4030_phy_resume(twl);

	l = omap_readl(OTG_CTRL) & OTG_CTRL_MASK;
	l &= ~(OTG_XCEIV_OUTPUTS|OTG_CTRL_BITS);
	l |= OTG_ID;
	omap_writel(l, OTG_CTRL);

	twl->otg.state = OTG_STATE_B_IDLE;

	return 0;
}
예제 #4
0
static int twl4030_set_peripheral(struct otg_transceiver *xceiv,
		struct usb_gadget *gadget)
{
	struct twl4030_usb *twl = xceiv_to_twl(xceiv);

	if (!xceiv)
		return -ENODEV;

	if (!gadget) {
		OTG_IRQ_EN_REG = 0;
		twl4030_phy_suspend(1);
		twl->otg.gadget = NULL;

		return -ENODEV;
	}

	twl->otg.gadget = gadget;
	twl4030_phy_resume();

	OTG_CTRL_REG = (OTG_CTRL_REG & OTG_CTRL_MASK
			& ~(OTG_XCEIV_OUTPUTS|OTG_CTRL_BITS))
			| OTG_ID;

	twl->otg.state = OTG_STATE_B_IDLE;

	twl4030_usb_set_bits(twl, USB_INT_EN_RISE,
			USB_INT_SESSVALID | USB_INT_VBUSVALID);
	twl4030_usb_set_bits(twl, USB_INT_EN_FALL,
			USB_INT_SESSVALID | USB_INT_VBUSVALID);

	return 0;
}
예제 #5
0
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	struct twl4030_usb *twl = _twl;
	int status;

#ifdef CONFIG_LOCKDEP
	
	local_irq_enable();
#endif

	status = twl4030_usb_linkstat(twl);
	if (status != USB_LINK_UNKNOWN) {

		
		twl4030charger_usb_en(status == USB_LINK_VBUS);

		if (status == USB_LINK_NONE)
			twl4030_phy_suspend(twl, 0);
		else
			twl4030_phy_resume(twl);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");

	return IRQ_HANDLED;
}
예제 #6
0
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	struct twl4030_usb *twl = _twl;
	int status;

	status = twl4030_usb_linkstat(twl);
	if (status >= 0) {
		/* FIXME add a set_power() method so that B-devices can
		 * configure the charger appropriately.  It's not always
		 * correct to consume VBUS power, and how much current to
		 * consume is a function of the USB configuration chosen
		 * by the host.
		 *
		 * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
		 * its disconnect() sibling, when changing to/from the
		 * USB_LINK_VBUS state.  musb_hdrc won't care until it
		 * starts to handle softconnect right.
		 */
		if (status == USB_EVENT_NONE)
			twl4030_phy_suspend(twl, 0);
		else
			twl4030_phy_resume(twl);

		blocking_notifier_call_chain(&twl->otg.notifier, status,
				twl->otg.gadget);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");

	return IRQ_HANDLED;
}
예제 #7
0
static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
{
	if (suspend)
		twl4030_phy_suspend(1);
	else
		twl4030_phy_resume();

	return 0;
}
예제 #8
0
static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
{
	struct twl4030_usb *twl = xceiv_to_twl(x);

	if (suspend)
		twl4030_phy_suspend(twl, 1);
	else
		twl4030_phy_resume(twl);

	return 0;
}
static int twl4030_set_suspend(struct usb_phy *x, int suspend)
{
	struct twl4030_usb *twl = phy_to_twl(x);

	if (suspend)
		twl4030_phy_suspend(twl, 1);
	else
		twl4030_phy_resume(twl);

	return 0;
}
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	struct twl4030_usb *twl = _twl;
	int status;

	status = twl4030_usb_linkstat(twl);
	if (status >= 0) {
		if (status == USB_EVENT_NONE)
			twl4030_phy_suspend(twl, 0);
		else
			twl4030_phy_resume(twl);

		atomic_notifier_call_chain(&twl->phy.notifier, status,
				twl->phy.otg->gadget);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");

	return IRQ_HANDLED;
}
예제 #11
0
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	int ret = IRQ_NONE;
	u8 val;

	/* action based on cable attach or detach */
	if (twl4030_i2c_read_u8(TWL4030_MODULE_INT, &val, REG_PWR_EDR1) < 0) {
		printk(KERN_ERR "twl4030_usb: i2c read failed,"
				" line %d\n", __LINE__);
		goto done;
	}

	if (val & USB_PRES_RISING)
		twl4030_phy_resume();
	else
		twl4030_phy_suspend(0);

	ret = IRQ_HANDLED;

done:
	return ret;
}
예제 #12
0
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	struct twl4030_usb *twl = _twl;
	int status;

#ifdef CONFIG_LOCKDEP
	/* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
	 * we don't want and can't tolerate.  Although it might be
	 * friendlier not to borrow this thread context...
	 */
	local_irq_enable();
#endif

	status = twl4030_usb_linkstat(twl);
	if (status != USB_LINK_UNKNOWN) {

		/* FIXME add a set_power() method so that B-devices can
		 * configure the charger appropriately.  It's not always
		 * correct to consume VBUS power, and how much current to
		 * consume is a function of the USB configuration chosen
		 * by the host.
		 *
		 * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
		 * its disconnect() sibling, when changing to/from the
		 * USB_LINK_VBUS state.  musb_hdrc won't care until it
		 * starts to handle softconnect right.
		 */
		twl4030charger_usb_en(status == USB_LINK_VBUS);

		if (status == USB_LINK_NONE)
			twl4030_phy_suspend(twl, 0);
		else
			twl4030_phy_resume(twl);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");

	return IRQ_HANDLED;
}
예제 #13
0
파일: twl4030-usb.c 프로젝트: UAVXP/A10
//&*&*&*SJ1_20110701, fix adb connect issue.
static void  do_softint_usb_irq(struct work_struct *work)
{	
	struct twl4030_usb *twl = container_of(work, struct twl4030_usb, usb_irq_delay_work.work);
	static int last_state=USB_EVENT_NONE;
	int status;
	static  int run_flag=0;
	
	mdelay(200);
	last_state = twl->linkstat;
	status = twl4030_usb_linkstat(twl);
	if (status >= 0) {
		/* FIXME add a set_power() method so that B-devices can
		 * configure the charger appropriately.  It's not always
		 * correct to consume VBUS power, and how much current to
		 * consume is a function of the USB configuration chosen
		 * by the host.
		 *
		 * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
		 * its disconnect() sibling, when changing to/from the
		 * USB_LINK_VBUS state.  musb_hdrc won't care until it
		 * starts to handle softconnect right.
		 */

		if (status == USB_EVENT_NONE) 
		{
			//&*&*&*QY_20110706, don't send USB_EVENT_NONE again 
			if(last_state==USB_EVENT_NONE)
			{
			   return ;
			}
			//&*&*&*QY_20110706
			twl4030_phy_suspend(twl, 0);
			if(twl->enter_early_suspend == 1)
			{
				SendPowerbuttonEvent();
				printk("[twl4030-usb]Enter %s, send power suspend event.\n", __FUNCTION__);
			}
			if(wake_lock_active(&usb_lock))
				wake_unlock(&usb_lock);
		} else {
			if(!wake_lock_active(&usb_lock))
				wake_lock(&usb_lock);
			
			twl4030_phy_resume(twl);
		}
		
		//&*&*&*QY_20110706, don't send USB_EVENT_NONE if last status is USB_EVENT_ID 			
		if(status != USB_EVENT_ID)
		{
			twl4030_otg_enable(0); //Simon			
			if( (status==USB_EVENT_VBUS) || (status==USB_EVENT_NONE && last_state!=USB_EVENT_ID))
			{
		      blocking_notifier_call_chain(&twl->otg.notifier, status,	twl->otg.gadget);
		   }
		   
		}
		//&*&*&*QY_20110706
			
		//&*&*&*QY_20110706, enable 5V when OTG-cable plug-in	
      else //(status == USB_EVENT_ID)
		{
			gpio_direction_output(OTG_EN_1V8, 0);
		   gpio_direction_output(CHG_OFFMODE, 1); 
			if(!run_flag)
			{ 
				//msleep(500);
				mdelay(3000);
			}
			blocking_notifier_call_chain(&twl->otg.notifier, USB_EVENT_ID,	twl->otg.gadget);
			if(run_flag)
			{ 
				//msleep(500);
				mdelay(1000);
			}
			else
			{
			   msleep(1000);
			}
			
			twl4030_otg_enable(1); //Simon
		} 
		//&*&*&*QY_20110706
		
	}
	run_flag=1;
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");
}
예제 #14
0
static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
	struct twl4030_usb *twl = _twl;
	int status;

#ifdef CONFIG_LGE_OMAP3_EXT_PWR
	twl4030_usb_irq_occured = 1;
#endif
	status = twl4030_usb_linkstat(twl);
	if (status >= 0) {
		/* FIXME add a set_power() method so that B-devices can
		 * configure the charger appropriately.  It's not always
		 * correct to consume VBUS power, and how much current to
		 * consume is a function of the USB configuration chosen
		 * by the host.
		 *
		 * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
		 * its disconnect() sibling, when changing to/from the
		 * USB_LINK_VBUS state.  musb_hdrc won't care until it
		 * starts to handle softconnect right.
		 */
		if (status == USB_EVENT_NONE)
		{
			twl_detect_usb_irq = 0;
			
#if defined(CONFIG_MACH_LGE_OMAP3)
			musb_link_force_active(0);
#endif // defined(CONFIG_MACH_LGE_OMAP3)
			twl4030_phy_suspend(twl, 0);
		}
		else // usb connnect
		{
			twl_detect_usb_irq = 1;

#if defined(CONFIG_MACH_LGE_OMAP3)
				musb_link_force_active(1);
#endif // defined(CONFIG_MACH_LGE_OMAP3)
			twl4030_phy_resume(twl);
		}

		blocking_notifier_call_chain(&twl->otg.notifier, status,
				twl->otg.gadget);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");

#if 1 /* mbk_temp */ 
	// LGE_CHANGE work queue &  wake lock for usb connection
	printk(KERN_INFO "[charging_msg] %s: status %x\n", __FUNCTION__, status);
	//lge_twl4030charger_presence_evt(1);
	if( status == USB_EVENT_NONE) {
		if(1==the_wlock.wake_lock_on){
			schedule_delayed_work(&twl4030_usb_wq, msecs_to_jiffies(500));	/* 500 msec */ // to delay unlock wake_lock
		}
	}
	else if( status == USB_EVENT_VBUS) {
		if(0==the_wlock.wake_lock_on){
			wake_lock(&the_wlock.wake_lock);
			the_wlock.wake_lock_on=1;
			printk(KERN_WARNING "[twl4030-usb] wake_lock_on=1 (locked)\n");
		}
	}
	// LGE_CHANGE work queue &  wake lock for usb connection
#endif 

	return IRQ_HANDLED;
}