diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-05 15:18:00 -0700 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-05 15:18:00 -0700 | 
| commit | 64dc9e2e7320f079b97c46b106133b58b8e18d40 (patch) | |
| tree | ab010dc1337d44e29c2b32b7f11788620a91fe4f /drivers/usb/musb | |
| parent | 01a60e76b6392547ad3dca3ac05b9c886fa5da45 (diff) | |
| parent | 9b192de60b5a584ee4ed967fb6758773c75e4643 (diff) | |
| download | olio-linux-3.10-64dc9e2e7320f079b97c46b106133b58b8e18d40.tar.xz olio-linux-3.10-64dc9e2e7320f079b97c46b106133b58b8e18d40.zip  | |
Merge tag 'usb-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next
Felipe writes:
usb: patches for v3.10 merge window
Here is the big Gadget & PHY pull request. Many of us have
been really busy lately getting multiple drivers to a better
position.
Since this pull request is so large, I will divide it in sections
so it's easier to grasp what's included.
- cleanups:
	. UDC drivers no longer touch gadget->dev, that's now udc-core
		responsibility
	. Many more UDC drivers converted to usb_gadget_map/unmap_request()
	. UDC drivers no longer initialize DMA-related fields from gadget's
		device structure
	. UDC drivers don't touch gadget.dev.driver directly
	. UDC drivers don't assign gadget.dev.release directly
	. Removal of some unused DMA_ADDR_INVALID
	. Introduction of CONFIG_USB_PHY
	. All phy drivers have been moved to drivers/usb/phy and renamed to
		a common naming scheme
	. Fix PHY layer so it never returns a NULL pointer, also fix all
		callers to avoid using IS_ERR_OR_NULL()
	. Sparse fixes all over the place
	. drivers/usb/otg/ has been deleted
	. Marvel drivers (mv_udc, ehci-mv, mv_otg and mv_u3d) improved clock
		usage
- new features:
	. UDC core now provides a generic way for tracking and reporting
		UDC's state (not attached, resuming, suspended, addressed,
		default, etc)
	. twl4030-usb learned that it shouldn't be enabled during init
	. Full DT support for DWC3 has been implemented
	. ab8500-usb learned about pinctrl framework
	. nop PHY learned about DeviceTree and regulators
	. DWC3 learned about suspend/resume
	. DWC3 can now be compiled in host-only and gadget-only (as well as
		DRD) configurations
	. UVC now enables streaming endpoint based on negotiated speed
	. isp1301 now implements the PHY API properly
	. configfs-based interface for gadget drivers which will lead to
		the removal of all code which just combines functions together
		to build functional gadget drivers.
	. f_serial and f_obex were converted to new configfs interface while
		maintaining old interface around.
- non-critical fixes:
	. UVC gadget driver got fixes for Endpoint usage and stream calculation
	. ab8500-usb fixed unbalanced clock and regulator API usage
	. twl4030-usb got a fix for when OMAP3 is booted with cable connected
	. fusb300_udc got a fix for DMA usage
	. UVC got fixes for two assertions of the USB Video Class Compliance
		specification revision 1.1
	. build warning issues caused by recent addition of __must_check to
		regulator API
These are all changes which deserve a mention, all other changes are related
to these one or minor spelling fixes and other similar tasks.
Signed-of-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/musb')
| -rw-r--r-- | drivers/usb/musb/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/am35x.c | 8 | ||||
| -rw-r--r-- | drivers/usb/musb/blackfin.c | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/cppi_dma.c | 17 | ||||
| -rw-r--r-- | drivers/usb/musb/da8xx.c | 8 | ||||
| -rw-r--r-- | drivers/usb/musb/davinci.c | 4 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.c | 71 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_dsps.c | 14 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 156 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget_ep0.c | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 119 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_virthub.c | 4 | ||||
| -rw-r--r-- | drivers/usb/musb/omap2430.c | 32 | ||||
| -rw-r--r-- | drivers/usb/musb/tusb6010.c | 14 | ||||
| -rw-r--r-- | drivers/usb/musb/ux500.c | 106 | ||||
| -rw-r--r-- | drivers/usb/musb/ux500_dma.c | 24 | 
16 files changed, 349 insertions, 246 deletions
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 05e51432dd2..47442d35b6f 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig @@ -7,7 +7,6 @@  config USB_MUSB_HDRC  	tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)'  	depends on USB && USB_GADGET -	select USB_OTG_UTILS  	help  	  Say Y here if your system has a dual role high speed USB  	  controller based on the Mentor Graphics silicon IP.  Then @@ -34,10 +33,12 @@ choice  config USB_MUSB_DAVINCI  	tristate "DaVinci"  	depends on ARCH_DAVINCI_DMx +	depends on BROKEN  config USB_MUSB_DA8XX  	tristate "DA8xx/OMAP-L1x"  	depends on ARCH_DAVINCI_DA8XX +	depends on BROKEN  config USB_MUSB_TUSB6010  	tristate "TUSB6010" @@ -53,7 +54,6 @@ config USB_MUSB_AM35X  config USB_MUSB_DSPS  	tristate "TI DSPS platforms" -	depends on SOC_TI81XX || SOC_AM33XX  config USB_MUSB_BLACKFIN  	tristate "Blackfin" @@ -61,12 +61,12 @@ config USB_MUSB_BLACKFIN  config USB_MUSB_UX500  	tristate "U8500 and U5500" -	depends on (ARCH_U8500 && AB8500_USB)  endchoice  choice  	prompt 'MUSB DMA mode' +	default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM  	default USB_UX500_DMA if USB_MUSB_UX500  	default USB_INVENTRA_DMA if USB_MUSB_OMAP2PLUS || USB_MUSB_BLACKFIN  	default USB_TI_CPPI_DMA if USB_MUSB_DAVINCI diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index 59eea219034..2231850c062 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c @@ -149,7 +149,7 @@ static void otg_timer(unsigned long _musb)  	 */  	devctl = musb_readb(mregs, MUSB_DEVCTL);  	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, -		otg_state_string(musb->xceiv->state)); +		usb_otg_state_string(musb->xceiv->state));  	spin_lock_irqsave(&musb->lock, flags);  	switch (musb->xceiv->state) { @@ -195,7 +195,7 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)  	if (musb->is_active || (musb->a_wait_bcon == 0 &&  				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {  		dev_dbg(musb->controller, "%s active, deleting timer\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		del_timer(&otg_workaround);  		last_timer = jiffies;  		return; @@ -208,7 +208,7 @@ static void am35x_musb_try_idle(struct musb *musb, unsigned long timeout)  	last_timer = timeout;  	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		jiffies_to_msecs(timeout - jiffies));  	mod_timer(&otg_workaround, timeout);  } @@ -298,7 +298,7 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci)  		/* NOTE: this must complete power-on within 100 ms. */  		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",  				drvvbus ? "on" : "off", -				otg_state_string(musb->xceiv->state), +				usb_otg_state_string(musb->xceiv->state),  				err ? " ERROR" : "",  				devctl);  		ret = IRQ_HANDLED; diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index dbb31b30c7f..5e63b160db0 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c @@ -280,13 +280,13 @@ static void musb_conn_timer_handler(unsigned long _musb)  		break;  	default:  		dev_dbg(musb->controller, "%s state not handled\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		break;  	}  	spin_unlock_irqrestore(&musb->lock, flags);  	dev_dbg(musb->controller, "state is %s\n", -		otg_state_string(musb->xceiv->state)); +		usb_otg_state_string(musb->xceiv->state));  }  static void bfin_musb_enable(struct musb *musb) @@ -307,7 +307,7 @@ static void bfin_musb_set_vbus(struct musb *musb, int is_on)  	dev_dbg(musb->controller, "VBUS %s, devctl %02x "  		/* otg %3x conf %08x prcm %08x */ "\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		musb_readb(musb->mregs, MUSB_DEVCTL));  } diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index f522000e8f0..9db211ee15b 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c @@ -435,7 +435,6 @@ cppi_rndis_update(struct cppi_channel *c, int is_rx,  	}  } -#ifdef CONFIG_USB_MUSB_DEBUG  static void cppi_dump_rxbd(const char *tag, struct cppi_descriptor *bd)  {  	pr_debug("RXBD/%s %08x: " @@ -444,21 +443,16 @@ static void cppi_dump_rxbd(const char *tag, struct cppi_descriptor *bd)  			bd->hw_next, bd->hw_bufp, bd->hw_off_len,  			bd->hw_options);  } -#endif  static void cppi_dump_rxq(int level, const char *tag, struct cppi_channel *rx)  { -#ifdef CONFIG_USB_MUSB_DEBUG  	struct cppi_descriptor	*bd; -	if (!_dbg_level(level)) -		return;  	cppi_dump_rx(level, rx, tag);  	if (rx->last_processed)  		cppi_dump_rxbd("last", rx->last_processed);  	for (bd = rx->head; bd; bd = bd->next)  		cppi_dump_rxbd("active", bd); -#endif  } @@ -784,6 +778,7 @@ cppi_next_rx_segment(struct musb *musb, struct cppi_channel *rx, int onepacket)  	void __iomem		*tibase = musb->ctrl_base;  	int			is_rndis = 0;  	struct cppi_rx_stateram	__iomem *rx_ram = rx->state_ram; +	struct cppi_descriptor	*d;  	if (onepacket) {  		/* almost every USB driver, host or peripheral side */ @@ -897,14 +892,8 @@ cppi_next_rx_segment(struct musb *musb, struct cppi_channel *rx, int onepacket)  	bd->hw_options |= CPPI_SOP_SET;  	tail->hw_options |= CPPI_EOP_SET; -#ifdef CONFIG_USB_MUSB_DEBUG -	if (_dbg_level(5)) { -		struct cppi_descriptor	*d; - -		for (d = rx->head; d; d = d->next) -			cppi_dump_rxbd("S", d); -	} -#endif +	for (d = rx->head; d; d = d->next) +		cppi_dump_rxbd("S", d);  	/* in case the preceding transfer left some state... */  	tail = rx->last_processed; diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 41613a2b35e..b903b744a22 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c @@ -198,7 +198,7 @@ static void otg_timer(unsigned long _musb)  	 */  	devctl = musb_readb(mregs, MUSB_DEVCTL);  	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, -		otg_state_string(musb->xceiv->state)); +		usb_otg_state_string(musb->xceiv->state));  	spin_lock_irqsave(&musb->lock, flags);  	switch (musb->xceiv->state) { @@ -267,7 +267,7 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)  	if (musb->is_active || (musb->a_wait_bcon == 0 &&  				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {  		dev_dbg(musb->controller, "%s active, deleting timer\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		del_timer(&otg_workaround);  		last_timer = jiffies;  		return; @@ -280,7 +280,7 @@ static void da8xx_musb_try_idle(struct musb *musb, unsigned long timeout)  	last_timer = timeout;  	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		jiffies_to_msecs(timeout - jiffies));  	mod_timer(&otg_workaround, timeout);  } @@ -360,7 +360,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci)  		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",  				drvvbus ? "on" : "off", -				otg_state_string(musb->xceiv->state), +				usb_otg_state_string(musb->xceiv->state),  				err ? " ERROR" : "",  				devctl);  		ret = IRQ_HANDLED; diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index e040d910373..bea6cc35471 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c @@ -215,7 +215,7 @@ static void otg_timer(unsigned long _musb)  	 */  	devctl = musb_readb(mregs, MUSB_DEVCTL);  	dev_dbg(musb->controller, "poll devctl %02x (%s)\n", devctl, -		otg_state_string(musb->xceiv->state)); +		usb_otg_state_string(musb->xceiv->state));  	spin_lock_irqsave(&musb->lock, flags);  	switch (musb->xceiv->state) { @@ -349,7 +349,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)  		davinci_musb_source_power(musb, drvvbus, 0);  		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",  				drvvbus ? "on" : "off", -				otg_state_string(musb->xceiv->state), +				usb_otg_state_string(musb->xceiv->state),  				err ? " ERROR" : "",  				devctl);  		retval = IRQ_HANDLED; diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index daec6e0f7e3..37a261a6bb6 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -372,13 +372,13 @@ static void musb_otg_timer_func(unsigned long data)  	case OTG_STATE_A_SUSPEND:  	case OTG_STATE_A_WAIT_BCON:  		dev_dbg(musb->controller, "HNP: %s timeout\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		musb_platform_set_vbus(musb, 0);  		musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;  		break;  	default:  		dev_dbg(musb->controller, "HNP: Unhandled mode %s\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  	}  	musb->ignore_disconnect = 0;  	spin_unlock_irqrestore(&musb->lock, flags); @@ -393,13 +393,14 @@ void musb_hnp_stop(struct musb *musb)  	void __iomem	*mbase = musb->mregs;  	u8	reg; -	dev_dbg(musb->controller, "HNP: stop from %s\n", otg_state_string(musb->xceiv->state)); +	dev_dbg(musb->controller, "HNP: stop from %s\n", +			usb_otg_state_string(musb->xceiv->state));  	switch (musb->xceiv->state) {  	case OTG_STATE_A_PERIPHERAL:  		musb_g_disconnect(musb);  		dev_dbg(musb->controller, "HNP: back to %s\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		break;  	case OTG_STATE_B_HOST:  		dev_dbg(musb->controller, "HNP: Disabling HR\n"); @@ -413,7 +414,7 @@ void musb_hnp_stop(struct musb *musb)  		break;  	default:  		dev_dbg(musb->controller, "HNP: Stopping in unknown state %s\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  	}  	/* @@ -451,7 +452,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  	 */  	if (int_usb & MUSB_INTR_RESUME) {  		handled = IRQ_HANDLED; -		dev_dbg(musb->controller, "RESUME (%s)\n", otg_state_string(musb->xceiv->state)); +		dev_dbg(musb->controller, "RESUME (%s)\n", usb_otg_state_string(musb->xceiv->state));  		if (devctl & MUSB_DEVCTL_HM) {  			void __iomem *mbase = musb->mregs; @@ -493,7 +494,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  			default:  				WARNING("bogus %s RESUME (%s)\n",  					"host", -					otg_state_string(musb->xceiv->state)); +					usb_otg_state_string(musb->xceiv->state));  			}  		} else {  			switch (musb->xceiv->state) { @@ -522,7 +523,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  			default:  				WARNING("bogus %s RESUME (%s)\n",  					"peripheral", -					otg_state_string(musb->xceiv->state)); +					usb_otg_state_string(musb->xceiv->state));  			}  		}  	} @@ -538,7 +539,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  		}  		dev_dbg(musb->controller, "SESSION_REQUEST (%s)\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		/* IRQ arrives from ID pin sense or (later, if VBUS power  		 * is removed) SRP.  responses are time critical: @@ -602,8 +603,9 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  			break;  		} -		dev_dbg(musb->controller, "VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n", -				otg_state_string(musb->xceiv->state), +		dev_printk(ignore ? KERN_DEBUG : KERN_ERR, musb->controller, +				"VBUS_ERROR in %s (%02x, %s), retry #%d, port1 %08x\n", +				usb_otg_state_string(musb->xceiv->state),  				devctl,  				({ char *s;  				switch (devctl & MUSB_DEVCTL_VBUS) { @@ -628,7 +630,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  	if (int_usb & MUSB_INTR_SUSPEND) {  		dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n", -			otg_state_string(musb->xceiv->state), devctl); +			usb_otg_state_string(musb->xceiv->state), devctl);  		handled = IRQ_HANDLED;  		switch (musb->xceiv->state) { @@ -745,12 +747,12 @@ b_host:  			usb_hcd_resume_root_hub(hcd);  		dev_dbg(musb->controller, "CONNECT (%s) devctl %02x\n", -				otg_state_string(musb->xceiv->state), devctl); +				usb_otg_state_string(musb->xceiv->state), devctl);  	}  	if ((int_usb & MUSB_INTR_DISCONNECT) && !musb->ignore_disconnect) {  		dev_dbg(musb->controller, "DISCONNECT (%s) as %s, devctl %02x\n", -				otg_state_string(musb->xceiv->state), +				usb_otg_state_string(musb->xceiv->state),  				MUSB_MODE(musb), devctl);  		handled = IRQ_HANDLED; @@ -787,7 +789,7 @@ b_host:  			break;  		default:  			WARNING("unhandled DISCONNECT transition (%s)\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  			break;  		}  	} @@ -813,7 +815,7 @@ b_host:  			}  		} else {  			dev_dbg(musb->controller, "BUS RESET as %s\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  			switch (musb->xceiv->state) {  			case OTG_STATE_A_SUSPEND:  				/* We need to ignore disconnect on suspend @@ -826,7 +828,7 @@ b_host:  			case OTG_STATE_A_WAIT_BCON:	/* OPT TD.4.7-900ms */  				/* never use invalid T(a_wait_bcon) */  				dev_dbg(musb->controller, "HNP: in %s, %d msec timeout\n", -					otg_state_string(musb->xceiv->state), +					usb_otg_state_string(musb->xceiv->state),  					TA_WAIT_BCON(musb));  				mod_timer(&musb->otg_timer, jiffies  					+ msecs_to_jiffies(TA_WAIT_BCON(musb))); @@ -838,7 +840,7 @@ b_host:  				break;  			case OTG_STATE_B_WAIT_ACON:  				dev_dbg(musb->controller, "HNP: RESET (%s), to b_peripheral\n", -					otg_state_string(musb->xceiv->state)); +					usb_otg_state_string(musb->xceiv->state));  				musb->xceiv->state = OTG_STATE_B_PERIPHERAL;  				musb_g_reset(musb);  				break; @@ -850,7 +852,7 @@ b_host:  				break;  			default:  				dev_dbg(musb->controller, "Unhandled BUS RESET as %s\n", -					otg_state_string(musb->xceiv->state)); +					usb_otg_state_string(musb->xceiv->state));  			}  		}  	} @@ -1632,7 +1634,7 @@ musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf)  	int ret = -EINVAL;  	spin_lock_irqsave(&musb->lock, flags); -	ret = sprintf(buf, "%s\n", otg_state_string(musb->xceiv->state)); +	ret = sprintf(buf, "%s\n", usb_otg_state_string(musb->xceiv->state));  	spin_unlock_irqrestore(&musb->lock, flags);  	return ret; @@ -1951,9 +1953,13 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)  		musb_write_ulpi_buscontrol(musb->mregs, busctl);  	} -	MUSB_DEV_MODE(musb); -	musb->xceiv->otg->default_a = 0; -	musb->xceiv->state = OTG_STATE_B_IDLE; +	if (musb->xceiv->otg->default_a) { +		MUSB_HST_MODE(musb); +		musb->xceiv->state = OTG_STATE_A_IDLE; +	} else { +		MUSB_DEV_MODE(musb); +		musb->xceiv->state = OTG_STATE_B_IDLE; +	}  	status = musb_gadget_setup(musb); @@ -2008,7 +2014,6 @@ static int musb_probe(struct platform_device *pdev)  {  	struct device	*dev = &pdev->dev;  	int		irq = platform_get_irq_byname(pdev, "mc"); -	int		status;  	struct resource	*iomem;  	void __iomem	*base; @@ -2016,24 +2021,17 @@ static int musb_probe(struct platform_device *pdev)  	if (!iomem || irq <= 0)  		return -ENODEV; -	base = ioremap(iomem->start, resource_size(iomem)); -	if (!base) { -		dev_err(dev, "ioremap failed\n"); -		return -ENOMEM; -	} +	base = devm_ioremap_resource(dev, iomem); +	if (IS_ERR(base)) +		return PTR_ERR(base); -	status = musb_init_controller(dev, irq, base); -	if (status < 0) -		iounmap(base); - -	return status; +	return musb_init_controller(dev, irq, base);  }  static int musb_remove(struct platform_device *pdev)  {  	struct device	*dev = &pdev->dev;  	struct musb	*musb = dev_to_musb(dev); -	void __iomem	*ctrl_base = musb->ctrl_base;  	/* this gets called on rmmod.  	 *  - Host mode: host may still be active @@ -2044,7 +2042,6 @@ static int musb_remove(struct platform_device *pdev)  	musb_shutdown(pdev);  	musb_free(musb); -	iounmap(ctrl_base);  	device_init_wakeup(dev, 0);  #ifndef CONFIG_MUSB_PIO_ONLY  	dma_set_mask(dev, *dev->parent->dma_mask); @@ -2293,8 +2290,6 @@ static int __init musb_init(void)  	if (usb_disabled())  		return 0; -	pr_info("%s: version " MUSB_VERSION ", ?dma?, otg (peripheral+host)\n", -		musb_driver_name);  	return platform_driver_register(&musb_driver);  }  module_init(musb_init); diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 6bb89715b63..3a18e44e939 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c @@ -38,6 +38,7 @@  #include <linux/module.h>  #include <linux/usb/nop-usb-xceiv.h>  #include <linux/platform_data/usb-omap.h> +#include <linux/sizes.h>  #include <linux/of.h>  #include <linux/of_device.h> @@ -224,7 +225,7 @@ static void otg_timer(unsigned long _musb)  	 */  	devctl = dsps_readb(mregs, MUSB_DEVCTL);  	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  	spin_lock_irqsave(&musb->lock, flags);  	switch (musb->xceiv->state) { @@ -273,7 +274,7 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)  	if (musb->is_active || (musb->a_wait_bcon == 0 &&  				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {  		dev_dbg(musb->controller, "%s active, deleting timer\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  		del_timer(&glue->timer[pdev->id]);  		glue->last_timer[pdev->id] = jiffies;  		return; @@ -288,7 +289,7 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)  	glue->last_timer[pdev->id] = timeout;  	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  			jiffies_to_msecs(timeout - jiffies));  	mod_timer(&glue->timer[pdev->id], timeout);  } @@ -334,7 +335,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)  	 * value but DEVCTL.BDEVICE is invalid without DEVCTL.SESSION set.  	 * Also, DRVVBUS pulses for SRP (but not at 5V) ...  	 */ -	if (usbintr & MUSB_INTR_BABBLE) +	if (is_host_active(musb) && usbintr & MUSB_INTR_BABBLE)  		pr_info("CAUTION: musb: Babble Interrupt Occurred\n");  	if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) { @@ -377,7 +378,7 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)  		/* NOTE: this must complete power-on within 100 ms. */  		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",  				drvvbus ? "on" : "off", -				otg_state_string(musb->xceiv->state), +				usb_otg_state_string(musb->xceiv->state),  				err ? " ERROR" : "",  				devctl);  		ret = IRQ_HANDLED; @@ -596,14 +597,13 @@ err0:  static int dsps_probe(struct platform_device *pdev)  { -	struct device_node *np = pdev->dev.of_node;  	const struct of_device_id *match;  	const struct dsps_musb_wrapper *wrp;  	struct dsps_glue *glue;  	struct resource *iomem;  	int ret, i; -	match = of_match_node(musb_dsps_of_match, np); +	match = of_match_node(musb_dsps_of_match, pdev->dev.of_node);  	if (!match) {  		dev_err(&pdev->dev, "fail to get matching of_match struct\n");  		ret = -EINVAL; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 83eddedcd9b..ba7092349fa 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -46,48 +46,6 @@  #include "musb_core.h" -/* MUSB PERIPHERAL status 3-mar-2006: - * - * - EP0 seems solid.  It passes both USBCV and usbtest control cases. - *   Minor glitches: - * - *     + remote wakeup to Linux hosts work, but saw USBCV failures; - *       in one test run (operator error?) - *     + endpoint halt tests -- in both usbtest and usbcv -- seem - *       to break when dma is enabled ... is something wrongly - *       clearing SENDSTALL? - * - * - Mass storage behaved ok when last tested.  Network traffic patterns - *   (with lots of short transfers etc) need retesting; they turn up the - *   worst cases of the DMA, since short packets are typical but are not - *   required. - * - * - TX/IN - *     + both pio and dma behave in with network and g_zero tests - *     + no cppi throughput issues other than no-hw-queueing - *     + failed with FLAT_REG (DaVinci) - *     + seems to behave with double buffering, PIO -and- CPPI - *     + with gadgetfs + AIO, requests got lost? - * - * - RX/OUT - *     + both pio and dma behave in with network and g_zero tests - *     + dma is slow in typical case (short_not_ok is clear) - *     + double buffering ok with PIO - *     + double buffering *FAILS* with CPPI, wrong data bytes sometimes - *     + request lossage observed with gadgetfs - * - * - ISO not tested ... might work, but only weakly isochronous - * - * - Gadget driver disabling of softconnect during bind() is ignored; so - *   drivers can't hold off host requests until userspace is ready. - *   (Workaround:  they can turn it off later.) - * - * - PORTABILITY (assumes PIO works): - *     + DaVinci, basically works with cppi dma - *     + OMAP 2430, ditto with mentor dma - *     + TUSB 6010, platform-specific dma in the works - */ -  /* ----------------------------------------------------------------------- */  #define is_buffer_mapped(req) (is_dma_capable() && \ @@ -280,41 +238,6 @@ static inline int max_ep_writesize(struct musb *musb, struct musb_ep *ep)  		return ep->packet_sz;  } - -#ifdef CONFIG_USB_INVENTRA_DMA - -/* Peripheral tx (IN) using Mentor DMA works as follows: -	Only mode 0 is used for transfers <= wPktSize, -	mode 1 is used for larger transfers, - -	One of the following happens: -	- Host sends IN token which causes an endpoint interrupt -		-> TxAvail -			-> if DMA is currently busy, exit. -			-> if queue is non-empty, txstate(). - -	- Request is queued by the gadget driver. -		-> if queue was previously empty, txstate() - -	txstate() -		-> start -		  /\	-> setup DMA -		  |     (data is transferred to the FIFO, then sent out when -		  |	IN token(s) are recd from Host. -		  |		-> DMA interrupt on completion -		  |		   calls TxAvail. -		  |		      -> stop DMA, ~DMAENAB, -		  |		      -> set TxPktRdy for last short pkt or zlp -		  |		      -> Complete Request -		  |		      -> Continue next request (call txstate) -		  |___________________________________| - - * Non-Mentor DMA engines can of course work differently, such as by - * upleveling from irq-per-packet to irq-per-buffer. - */ - -#endif -  /*   * An endpoint is transmitting data. This can be called either from   * the IRQ routine or from ep.queue() to kickstart a request on an @@ -621,37 +544,6 @@ void musb_g_tx(struct musb *musb, u8 epnum)  /* ------------------------------------------------------------ */ -#ifdef CONFIG_USB_INVENTRA_DMA - -/* Peripheral rx (OUT) using Mentor DMA works as follows: -	- Only mode 0 is used. - -	- Request is queued by the gadget class driver. -		-> if queue was previously empty, rxstate() - -	- Host sends OUT token which causes an endpoint interrupt -	  /\      -> RxReady -	  |	      -> if request queued, call rxstate -	  |		/\	-> setup DMA -	  |		|	     -> DMA interrupt on completion -	  |		|		-> RxReady -	  |		|		      -> stop DMA -	  |		|		      -> ack the read -	  |		|		      -> if data recd = max expected -	  |		|				by the request, or host -	  |		|				sent a short packet, -	  |		|				complete the request, -	  |		|				and start the next one. -	  |		|_____________________________________| -	  |					 else just wait for the host -	  |					    to send the next OUT token. -	  |__________________________________________________| - - * Non-Mentor DMA engines can of course work differently. - */ - -#endif -  /*   * Context: controller locked, IRQs blocked, endpoint selected   */ @@ -740,7 +632,7 @@ static void rxstate(struct musb *musb, struct musb_request *req)  				struct dma_controller	*c;  				struct dma_channel	*channel;  				int			use_dma = 0; -				int transfer_size; +				unsigned int transfer_size;  				c = musb->dma_controller;  				channel = musb_ep->dma; @@ -782,10 +674,11 @@ static void rxstate(struct musb *musb, struct musb_request *req)  						csr | MUSB_RXCSR_DMAMODE);  					musb_writew(epio, MUSB_RXCSR, csr); -					transfer_size = min(request->length - request->actual, +					transfer_size = min_t(unsigned int, +							request->length - +							request->actual,  							channel->max_len);  					musb_ep->dma->desired_mode = 1; -  				} else {  					if (!musb_ep->hb_mult &&  						musb_ep->hw_ep->rx_double_buffered) @@ -815,7 +708,7 @@ static void rxstate(struct musb *musb, struct musb_request *req)  				struct dma_controller *c;  				struct dma_channel *channel; -				int transfer_size = 0; +				unsigned int transfer_size = 0;  				c = musb->dma_controller;  				channel = musb_ep->dma; @@ -824,11 +717,13 @@ static void rxstate(struct musb *musb, struct musb_request *req)  				if (fifo_count < musb_ep->packet_sz)  					transfer_size = fifo_count;  				else if (request->short_not_ok) -					transfer_size =	min(request->length - +					transfer_size =	min_t(unsigned int, +							request->length -  							request->actual,  							channel->max_len);  				else -					transfer_size = min(request->length - +					transfer_size = min_t(unsigned int, +							request->length -  							request->actual,  							(unsigned)fifo_count); @@ -1681,7 +1576,7 @@ static int musb_gadget_wakeup(struct usb_gadget *gadget)  		goto done;  	default:  		dev_dbg(musb->controller, "Unhandled wake: %s\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		goto done;  	} @@ -1801,13 +1696,6 @@ static const struct usb_gadget_ops musb_gadget_operations = {   * all peripheral ports are external...   */ -static void musb_gadget_release(struct device *dev) -{ -	/* kref_put(WHAT) */ -	dev_dbg(dev, "%s\n", __func__); -} - -  static void  init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in)  { @@ -1892,12 +1780,7 @@ int musb_gadget_setup(struct musb *musb)  	musb->g.speed = USB_SPEED_UNKNOWN;  	/* this "gadget" abstracts/virtualizes the controller */ -	dev_set_name(&musb->g.dev, "gadget"); -	musb->g.dev.parent = musb->controller; -	musb->g.dev.dma_mask = musb->controller->dma_mask; -	musb->g.dev.release = musb_gadget_release;  	musb->g.name = musb_driver_name; -  	musb->g.is_otg = 1;  	musb_g_init_endpoints(musb); @@ -1905,11 +1788,6 @@ int musb_gadget_setup(struct musb *musb)  	musb->is_active = 0;  	musb_platform_try_idle(musb, 0); -	status = device_register(&musb->g.dev); -	if (status != 0) { -		put_device(&musb->g.dev); -		return status; -	}  	status = usb_add_gadget_udc(musb->controller, &musb->g);  	if (status)  		goto err; @@ -1924,8 +1802,6 @@ err:  void musb_gadget_cleanup(struct musb *musb)  {  	usb_del_gadget_udc(&musb->g); -	if (musb->g.dev.parent) -		device_unregister(&musb->g.dev);  }  /* @@ -1977,9 +1853,8 @@ static int musb_gadget_start(struct usb_gadget *g,  		goto err;  	} -	if ((musb->xceiv->last_event == USB_EVENT_ID) -				&& otg->set_vbus) -		otg_set_vbus(otg, 1); +	if (musb->xceiv->last_event == USB_EVENT_ID) +		musb_platform_set_vbus(musb, 1);  	hcd->self.uses_pio_for_control = 1; @@ -2063,6 +1938,7 @@ static int musb_gadget_stop(struct usb_gadget *g,  	dev_dbg(musb->controller, "unregistering driver %s\n", driver->function);  	musb->is_active = 0; +	musb->gadget_driver = NULL;  	musb_platform_try_idle(musb, 0);  	spin_unlock_irqrestore(&musb->lock, flags); @@ -2099,7 +1975,7 @@ void musb_g_resume(struct musb *musb)  		break;  	default:  		WARNING("unhandled RESUME transition (%s)\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  	}  } @@ -2129,7 +2005,7 @@ void musb_g_suspend(struct musb *musb)  		 * A_PERIPHERAL may need care too  		 */  		WARNING("unhandled SUSPEND transition (%s)\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  	}  } @@ -2163,7 +2039,7 @@ void musb_g_disconnect(struct musb *musb)  	switch (musb->xceiv->state) {  	default:  		dev_dbg(musb->controller, "Unhandled disconnect %s, setting a_idle\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		musb->xceiv->state = OTG_STATE_A_IDLE;  		MUSB_HST_MODE(musb);  		break; diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index c9c1ac4e075..2af45a0c893 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c @@ -505,8 +505,10 @@ static void ep0_rxstate(struct musb *musb)  			req->status = -EOVERFLOW;  			count = len;  		} -		musb_read_fifo(&musb->endpoints[0], count, buf); -		req->actual += count; +		if (count > 0) { +			musb_read_fifo(&musb->endpoints[0], count, buf); +			req->actual += count; +		}  		csr = MUSB_CSR0_P_SVDRXPKTRDY;  		if (count < 64 || req->actual == req->length) {  			musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 1ce1fcf3f3e..8914dec49f0 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -2453,7 +2453,7 @@ static int musb_bus_suspend(struct usb_hcd *hcd)  	if (musb->is_active) {  		WARNING("trying to suspend as %s while active\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  		return -EBUSY;  	} else  		return 0; @@ -2465,6 +2465,118 @@ static int musb_bus_resume(struct usb_hcd *hcd)  	return 0;  } + +#ifndef CONFIG_MUSB_PIO_ONLY + +#define MUSB_USB_DMA_ALIGN 4 + +struct musb_temp_buffer { +	void *kmalloc_ptr; +	void *old_xfer_buffer; +	u8 data[0]; +}; + +static void musb_free_temp_buffer(struct urb *urb) +{ +	enum dma_data_direction dir; +	struct musb_temp_buffer *temp; + +	if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER)) +		return; + +	dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + +	temp = container_of(urb->transfer_buffer, struct musb_temp_buffer, +			    data); + +	if (dir == DMA_FROM_DEVICE) { +		memcpy(temp->old_xfer_buffer, temp->data, +		       urb->transfer_buffer_length); +	} +	urb->transfer_buffer = temp->old_xfer_buffer; +	kfree(temp->kmalloc_ptr); + +	urb->transfer_flags &= ~URB_ALIGNED_TEMP_BUFFER; +} + +static int musb_alloc_temp_buffer(struct urb *urb, gfp_t mem_flags) +{ +	enum dma_data_direction dir; +	struct musb_temp_buffer *temp; +	void *kmalloc_ptr; +	size_t kmalloc_size; + +	if (urb->num_sgs || urb->sg || +	    urb->transfer_buffer_length == 0 || +	    !((uintptr_t)urb->transfer_buffer & (MUSB_USB_DMA_ALIGN - 1))) +		return 0; + +	dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + +	/* Allocate a buffer with enough padding for alignment */ +	kmalloc_size = urb->transfer_buffer_length + +		sizeof(struct musb_temp_buffer) + MUSB_USB_DMA_ALIGN - 1; + +	kmalloc_ptr = kmalloc(kmalloc_size, mem_flags); +	if (!kmalloc_ptr) +		return -ENOMEM; + +	/* Position our struct temp_buffer such that data is aligned */ +	temp = PTR_ALIGN(kmalloc_ptr, MUSB_USB_DMA_ALIGN); + + +	temp->kmalloc_ptr = kmalloc_ptr; +	temp->old_xfer_buffer = urb->transfer_buffer; +	if (dir == DMA_TO_DEVICE) +		memcpy(temp->data, urb->transfer_buffer, +		       urb->transfer_buffer_length); +	urb->transfer_buffer = temp->data; + +	urb->transfer_flags |= URB_ALIGNED_TEMP_BUFFER; + +	return 0; +} + +static int musb_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb, +				      gfp_t mem_flags) +{ +	struct musb	*musb = hcd_to_musb(hcd); +	int ret; + +	/* +	 * The DMA engine in RTL1.8 and above cannot handle +	 * DMA addresses that are not aligned to a 4 byte boundary. +	 * For such engine implemented (un)map_urb_for_dma hooks. +	 * Do not use these hooks for RTL<1.8 +	 */ +	if (musb->hwvers < MUSB_HWVERS_1800) +		return usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); + +	ret = musb_alloc_temp_buffer(urb, mem_flags); +	if (ret) +		return ret; + +	ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags); +	if (ret) +		musb_free_temp_buffer(urb); + +	return ret; +} + +static void musb_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb) +{ +	struct musb	*musb = hcd_to_musb(hcd); + +	usb_hcd_unmap_urb_for_dma(hcd, urb); + +	/* Do not use this hook for RTL<1.8 (see description above) */ +	if (musb->hwvers < MUSB_HWVERS_1800) +		return; + +	musb_free_temp_buffer(urb); +} +#endif /* !CONFIG_MUSB_PIO_ONLY */ +  const struct hc_driver musb_hc_driver = {  	.description		= "musb-hcd",  	.product_desc		= "MUSB HDRC host driver", @@ -2484,6 +2596,11 @@ const struct hc_driver musb_hc_driver = {  	.urb_dequeue		= musb_urb_dequeue,  	.endpoint_disable	= musb_h_disable, +#ifndef CONFIG_MUSB_PIO_ONLY +	.map_urb_for_dma	= musb_map_urb_for_dma, +	.unmap_urb_for_dma	= musb_unmap_urb_for_dma, +#endif +  	.hub_status_data	= musb_hub_status_data,  	.hub_control		= musb_hub_control,  	.bus_suspend		= musb_bus_suspend, diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index f70579154de..ef7d11045f5 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c @@ -95,7 +95,7 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend)  			break;  		default:  			dev_dbg(musb->controller, "bogus rh suspend? %s\n", -				otg_state_string(musb->xceiv->state)); +				usb_otg_state_string(musb->xceiv->state));  		}  	} else if (power & MUSB_POWER_SUSPENDM) {  		power &= ~MUSB_POWER_SUSPENDM; @@ -203,7 +203,7 @@ void musb_root_disconnect(struct musb *musb)  		break;  	default:  		dev_dbg(musb->controller, "host disconnect (%s)\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  	}  } diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 1a42a458f2c..3551f1a30c6 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c @@ -117,7 +117,7 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)  	if (musb->is_active || ((musb->a_wait_bcon == 0)  			&& (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {  		dev_dbg(musb->controller, "%s active, deleting timer\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		del_timer(&musb_idle_timer);  		last_timer = jiffies;  		return; @@ -134,7 +134,7 @@ static void omap2430_musb_try_idle(struct musb *musb, unsigned long timeout)  	last_timer = timeout;  	dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		(unsigned long)jiffies_to_msecs(timeout - jiffies));  	mod_timer(&musb_idle_timer, timeout);  } @@ -174,8 +174,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)  				}  			} -			if (otg->set_vbus) -				otg_set_vbus(otg, 1); +			otg_set_vbus(otg, 1);  		} else {  			musb->is_active = 1;  			otg->default_a = 1; @@ -200,7 +199,7 @@ static void omap2430_musb_set_vbus(struct musb *musb, int is_on)  	dev_dbg(musb->controller, "VBUS %s, devctl %02x "  		/* otg %3x conf %08x prcm %08x */ "\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		musb_readb(musb->mregs, MUSB_DEVCTL));  } @@ -292,14 +291,14 @@ static void omap_musb_set_mailbox(struct omap2430_glue *glue)  		musb->xceiv->last_event = USB_EVENT_NONE;  		if (musb->gadget_driver) { +			omap2430_musb_set_vbus(musb, 0);  			pm_runtime_mark_last_busy(dev);  			pm_runtime_put_autosuspend(dev);  		} -		if (data->interface_type == MUSB_INTERFACE_UTMI) { -			if (musb->xceiv->otg->set_vbus) -				otg_set_vbus(musb->xceiv->otg, 0); -		} +		if (data->interface_type == MUSB_INTERFACE_UTMI) +			otg_set_vbus(musb->xceiv->otg, 0); +  		omap_control_usb_set_mode(glue->control_otghs,  			USB_MODE_DISCONNECT);  		break; @@ -355,7 +354,12 @@ static int omap2430_musb_init(struct musb *musb)  	else  		musb->xceiv = devm_usb_get_phy_dev(dev, 0); -	if (IS_ERR_OR_NULL(musb->xceiv)) { +	if (IS_ERR(musb->xceiv)) { +		status = PTR_ERR(musb->xceiv); + +		if (status == -ENXIO) +			return status; +  		pr_err("HS USB OTG: no transceiver configured\n");  		return -EPROBE_DEFER;  	} @@ -393,6 +397,8 @@ static int omap2430_musb_init(struct musb *musb)  	if (glue->status != OMAP_MUSB_UNKNOWN)  		omap_musb_set_mailbox(glue); +	usb_phy_init(musb->xceiv); +  	pm_runtime_put_noidle(musb->controller);  	return 0; @@ -526,10 +532,10 @@ static int omap2430_probe(struct platform_device *pdev)  		}  		of_property_read_u32(np, "mode", (u32 *)&pdata->mode); -		of_property_read_u32(np, "interface_type", +		of_property_read_u32(np, "interface-type",  						(u32 *)&data->interface_type); -		of_property_read_u32(np, "num_eps", (u32 *)&config->num_eps); -		of_property_read_u32(np, "ram_bits", (u32 *)&config->ram_bits); +		of_property_read_u32(np, "num-eps", (u32 *)&config->num_eps); +		of_property_read_u32(np, "ram-bits", (u32 *)&config->ram_bits);  		of_property_read_u32(np, "power", (u32 *)&pdata->power);  		config->multipoint = of_property_read_bool(np, "multipoint");  		pdata->has_mailbox = of_property_read_bool(np, diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 464bd23cccd..7369ba33c94 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -423,7 +423,7 @@ static void musb_do_idle(unsigned long _musb)  			&& (musb->idle_timeout == 0  				|| time_after(jiffies, musb->idle_timeout))) {  			dev_dbg(musb->controller, "Nothing connected %s, turning off VBUS\n", -					otg_state_string(musb->xceiv->state)); +					usb_otg_state_string(musb->xceiv->state));  		}  		/* FALLTHROUGH */  	case OTG_STATE_A_IDLE: @@ -478,7 +478,7 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)  	if (musb->is_active || ((musb->a_wait_bcon == 0)  			&& (musb->xceiv->state == OTG_STATE_A_WAIT_BCON))) {  		dev_dbg(musb->controller, "%s active, deleting timer\n", -			otg_state_string(musb->xceiv->state)); +			usb_otg_state_string(musb->xceiv->state));  		del_timer(&musb_idle_timer);  		last_timer = jiffies;  		return; @@ -495,7 +495,7 @@ static void tusb_musb_try_idle(struct musb *musb, unsigned long timeout)  	last_timer = timeout;  	dev_dbg(musb->controller, "%s inactive, for idle timer for %lu ms\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		(unsigned long)jiffies_to_msecs(timeout - jiffies));  	mod_timer(&musb_idle_timer, timeout);  } @@ -571,7 +571,7 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)  	musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);  	dev_dbg(musb->controller, "VBUS %s, devctl %02x otg %3x conf %08x prcm %08x\n", -		otg_state_string(musb->xceiv->state), +		usb_otg_state_string(musb->xceiv->state),  		musb_readb(musb->mregs, MUSB_DEVCTL),  		musb_readl(tbase, TUSB_DEV_OTG_STAT),  		conf, prcm); @@ -678,13 +678,13 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)  				musb->is_active = 0;  			}  			dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", -				otg_state_string(musb->xceiv->state), otg_stat); +				usb_otg_state_string(musb->xceiv->state), otg_stat);  			idle_timeout = jiffies + (1 * HZ);  			schedule_work(&musb->irq_work);  		} else /* A-dev state machine */ {  			dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", -				otg_state_string(musb->xceiv->state), otg_stat); +				usb_otg_state_string(musb->xceiv->state), otg_stat);  			switch (musb->xceiv->state) {  			case OTG_STATE_A_IDLE: @@ -733,7 +733,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)  		u8	devctl;  		dev_dbg(musb->controller, "%s timer, %03x\n", -			otg_state_string(musb->xceiv->state), otg_stat); +			usb_otg_state_string(musb->xceiv->state), otg_stat);  		switch (musb->xceiv->state) {  		case OTG_STATE_A_WAIT_VRISE: diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index 13a39291376..2c80004e0a8 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c @@ -26,6 +26,7 @@  #include <linux/err.h>  #include <linux/io.h>  #include <linux/platform_device.h> +#include <linux/usb/musb-ux500.h>  #include "musb_core.h" @@ -36,6 +37,98 @@ struct ux500_glue {  };  #define glue_to_musb(g)	platform_get_drvdata(g->musb) +static void ux500_musb_set_vbus(struct musb *musb, int is_on) +{ +	u8            devctl; +	unsigned long timeout = jiffies + msecs_to_jiffies(1000); +	/* HDRC controls CPEN, but beware current surges during device +	 * connect.  They can trigger transient overcurrent conditions +	 * that must be ignored. +	 */ + +	devctl = musb_readb(musb->mregs, MUSB_DEVCTL); + +	if (is_on) { +		if (musb->xceiv->state == OTG_STATE_A_IDLE) { +			/* start the session */ +			devctl |= MUSB_DEVCTL_SESSION; +			musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); +			/* +			 * Wait for the musb to set as A device to enable the +			 * VBUS +			 */ +			while (musb_readb(musb->mregs, MUSB_DEVCTL) & 0x80) { + +				if (time_after(jiffies, timeout)) { +					dev_err(musb->controller, +					"configured as A device timeout"); +					break; +				} +			} + +		} else { +			musb->is_active = 1; +			musb->xceiv->otg->default_a = 1; +			musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; +			devctl |= MUSB_DEVCTL_SESSION; +			MUSB_HST_MODE(musb); +		} +	} else { +		musb->is_active = 0; + +		/* NOTE: we're skipping A_WAIT_VFALL -> A_IDLE and jumping +		 * right to B_IDLE... +		 */ +		musb->xceiv->otg->default_a = 0; +		devctl &= ~MUSB_DEVCTL_SESSION; +		MUSB_DEV_MODE(musb); +	} +	musb_writeb(musb->mregs, MUSB_DEVCTL, devctl); + +	/* +	 * Devctl values will be updated after vbus goes below +	 * session_valid. The time taken depends on the capacitance +	 * on VBUS line. The max discharge time can be upto 1 sec +	 * as per the spec. Typically on our platform, it is 200ms +	 */ +	if (!is_on) +		mdelay(200); + +	dev_dbg(musb->controller, "VBUS %s, devctl %02x\n", +		usb_otg_state_string(musb->xceiv->state), +		musb_readb(musb->mregs, MUSB_DEVCTL)); +} + +static int musb_otg_notifications(struct notifier_block *nb, +		unsigned long event, void *unused) +{ +	struct musb *musb = container_of(nb, struct musb, nb); + +	dev_dbg(musb->controller, "musb_otg_notifications %ld %s\n", +			event, usb_otg_state_string(musb->xceiv->state)); + +	switch (event) { +	case UX500_MUSB_ID: +		dev_dbg(musb->controller, "ID GND\n"); +		ux500_musb_set_vbus(musb, 1); +		break; +	case UX500_MUSB_VBUS: +		dev_dbg(musb->controller, "VBUS Connect\n"); +		break; +	case UX500_MUSB_NONE: +		dev_dbg(musb->controller, "VBUS Disconnect\n"); +		if (is_host_active(musb)) +			ux500_musb_set_vbus(musb, 0); +		else +			musb->xceiv->state = OTG_STATE_B_IDLE; +		break; +	default: +		dev_dbg(musb->controller, "ID float\n"); +		return NOTIFY_DONE; +	} +	return NOTIFY_OK; +} +  static irqreturn_t ux500_musb_interrupt(int irq, void *__hci)  {  	unsigned long   flags; @@ -58,12 +151,21 @@ static irqreturn_t ux500_musb_interrupt(int irq, void *__hci)  static int ux500_musb_init(struct musb *musb)  { +	int status; +  	musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);  	if (IS_ERR_OR_NULL(musb->xceiv)) {  		pr_err("HS USB OTG: no transceiver configured\n");  		return -EPROBE_DEFER;  	} +	musb->nb.notifier_call = musb_otg_notifications; +	status = usb_register_notifier(musb->xceiv, &musb->nb); +	if (status < 0) { +		dev_dbg(musb->controller, "notification register failed\n"); +		return status; +	} +  	musb->isr = ux500_musb_interrupt;  	return 0; @@ -71,6 +173,8 @@ static int ux500_musb_init(struct musb *musb)  static int ux500_musb_exit(struct musb *musb)  { +	usb_unregister_notifier(musb->xceiv, &musb->nb); +  	usb_put_phy(musb->xceiv);  	return 0; @@ -79,6 +183,8 @@ static int ux500_musb_exit(struct musb *musb)  static const struct musb_platform_ops ux500_ops = {  	.init		= ux500_musb_init,  	.exit		= ux500_musb_exit, + +	.set_vbus	= ux500_musb_set_vbus,  };  static int ux500_probe(struct platform_device *pdev) diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index 039e567dd3b..33812064114 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c @@ -1,7 +1,7 @@  /*   * drivers/usb/musb/ux500_dma.c   * - * U8500 and U5500 DMA support code + * U8500 DMA support code   *   * Copyright (C) 2009 STMicroelectronics   * Copyright (C) 2011 ST-Ericsson SA @@ -30,6 +30,7 @@  #include <linux/dma-mapping.h>  #include <linux/dmaengine.h>  #include <linux/pfn.h> +#include <linux/sizes.h>  #include <linux/platform_data/usb-musb-ux500.h>  #include "musb_core.h" @@ -56,7 +57,7 @@ struct ux500_dma_controller {  };  /* Work function invoked from DMA callback to handle rx transfers. */ -void ux500_dma_callback(void *private_data) +static void ux500_dma_callback(void *private_data)  {  	struct dma_channel *channel = private_data;  	struct ux500_dma_channel *ux500_channel = channel->private_data; @@ -93,8 +94,9 @@ static bool ux500_configure_channel(struct dma_channel *channel,  	struct musb *musb = ux500_channel->controller->private_data;  	dev_dbg(musb->controller, -		"packet_sz=%d, mode=%d, dma_addr=0x%x, len=%d is_tx=%d\n", -		packet_sz, mode, dma_addr, len, ux500_channel->is_tx); +		"packet_sz=%d, mode=%d, dma_addr=0x%llu, len=%d is_tx=%d\n", +		packet_sz, mode, (unsigned long long) dma_addr, +		len, ux500_channel->is_tx);  	ux500_channel->cur_len = len; @@ -191,7 +193,7 @@ static int ux500_dma_is_compatible(struct dma_channel *channel,  		u16 maxpacket, void *buf, u32 length)  {  	if ((maxpacket & 0x3)		|| -		((int)buf & 0x3)	|| +		((unsigned long int) buf & 0x3)	||  		(length < 512)		||  		(length & 0x3))  		return false; @@ -372,12 +374,17 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *ba  	controller = kzalloc(sizeof(*controller), GFP_KERNEL);  	if (!controller) -		return NULL; +		goto kzalloc_fail;  	controller->private_data = musb;  	/* Save physical address for DMA controller. */  	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!iomem) { +		dev_err(musb->controller, "no memory resource defined\n"); +		goto plat_get_fail; +	} +  	controller->phy_base = (dma_addr_t) iomem->start;  	controller->controller.start = ux500_dma_controller_start; @@ -389,4 +396,9 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *ba  	controller->controller.is_compatible = ux500_dma_is_compatible;  	return &controller->controller; + +plat_get_fail: +	kfree(controller); +kzalloc_fail: +	return NULL;  }  |