diff options
Diffstat (limited to 'drivers/usb/musb')
| -rw-r--r-- | drivers/usb/musb/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/blackfin.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/cppi_dma.c | 26 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.h | 12 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 9 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_regs.h | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/tusb6010.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/tusb6010_omap.c | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/ux500_dma.c | 38 | 
9 files changed, 62 insertions, 37 deletions
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 6192b45959f..fc34b8b1191 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig @@ -3,9 +3,6 @@  # for silicon based on Mentor Graphics INVENTRA designs  # -comment "Enable Host or Gadget support to see Inventra options" -	depends on !USB && USB_GADGET=n -  # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller  config USB_MUSB_HDRC  	depends on USB && USB_GADGET diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index ae8c3961774..5e7cfba5b07 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c @@ -17,6 +17,7 @@  #include <linux/io.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> +#include <linux/prefetch.h>  #include <asm/cacheflush.h> diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index 149f3f310a0..318fb4e8a88 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c @@ -226,8 +226,10 @@ static int cppi_controller_stop(struct dma_controller *c)  	struct cppi		*controller;  	void __iomem		*tibase;  	int			i; +	struct musb		*musb;  	controller = container_of(c, struct cppi, controller); +	musb = controller->musb;  	tibase = controller->tibase;  	/* DISABLE INDIVIDUAL CHANNEL Interrupts */ @@ -289,9 +291,11 @@ cppi_channel_allocate(struct dma_controller *c,  	u8			index;  	struct cppi_channel	*cppi_ch;  	void __iomem		*tibase; +	struct musb		*musb;  	controller = container_of(c, struct cppi, controller);  	tibase = controller->tibase; +	musb = controller->musb;  	/* ep0 doesn't use DMA; remember cppi indices are 0..N-1 */  	index = ep->epnum - 1; @@ -339,7 +343,8 @@ static void cppi_channel_release(struct dma_channel *channel)  	c = container_of(channel, struct cppi_channel, channel);  	tibase = c->controller->tibase;  	if (!c->hw_ep) -		dev_dbg(musb->controller, "releasing idle DMA channel %p\n", c); +		dev_dbg(c->controller->musb->controller, +			"releasing idle DMA channel %p\n", c);  	else if (!c->transmit)  		core_rxirq_enable(tibase, c->index + 1); @@ -357,10 +362,11 @@ cppi_dump_rx(int level, struct cppi_channel *c, const char *tag)  	musb_ep_select(base, c->index + 1); -	DBG(level, "RX DMA%d%s: %d left, csr %04x, " -			"%08x H%08x S%08x C%08x, " -			"B%08x L%08x %08x .. %08x" -			"\n", +	dev_dbg(c->controller->musb->controller, +		"RX DMA%d%s: %d left, csr %04x, " +		"%08x H%08x S%08x C%08x, " +		"B%08x L%08x %08x .. %08x" +		"\n",  		c->index, tag,  		musb_readl(c->controller->tibase,  			DAVINCI_RXCPPI_BUFCNT0_REG + 4 * c->index), @@ -387,10 +393,11 @@ cppi_dump_tx(int level, struct cppi_channel *c, const char *tag)  	musb_ep_select(base, c->index + 1); -	DBG(level, "TX DMA%d%s: csr %04x, " -			"H%08x S%08x C%08x %08x, " -			"F%08x L%08x .. %08x" -			"\n", +	dev_dbg(c->controller->musb->controller, +		"TX DMA%d%s: csr %04x, " +		"H%08x S%08x C%08x %08x, " +		"F%08x L%08x .. %08x" +		"\n",  		c->index, tag,  		musb_readw(c->hw_ep->regs, MUSB_TXCSR), @@ -1022,6 +1029,7 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch)  	int				i;  	dma_addr_t			safe2ack;  	void __iomem			*regs = rx->hw_ep->regs; +	struct musb			*musb = cppi->musb;  	cppi_dump_rx(6, rx, "/K"); diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 668eeef601a..b3c065ab9db 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -172,7 +172,8 @@ enum musb_g_ep0_state {  #endif  /* TUSB mapping: "flat" plus ep0 special cases */ -#if	defined(CONFIG_USB_MUSB_TUSB6010) +#if defined(CONFIG_USB_MUSB_TUSB6010) || \ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  #define musb_ep_select(_mbase, _epnum) \  	musb_writeb((_mbase), MUSB_INDEX, (_epnum))  #define	MUSB_EP_OFFSET			MUSB_TUSB_OFFSET @@ -241,7 +242,8 @@ struct musb_hw_ep {  	void __iomem		*fifo;  	void __iomem		*regs; -#ifdef CONFIG_USB_MUSB_TUSB6010 +#if defined(CONFIG_USB_MUSB_TUSB6010) || \ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  	void __iomem		*conf;  #endif @@ -258,7 +260,8 @@ struct musb_hw_ep {  	struct dma_channel	*tx_channel;  	struct dma_channel	*rx_channel; -#ifdef CONFIG_USB_MUSB_TUSB6010 +#if defined(CONFIG_USB_MUSB_TUSB6010) || \ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  	/* TUSB has "asynchronous" and "synchronous" dma modes */  	dma_addr_t		fifo_async;  	dma_addr_t		fifo_sync; @@ -356,7 +359,8 @@ struct musb {  	void __iomem		*ctrl_base;  	void __iomem		*mregs; -#ifdef CONFIG_USB_MUSB_TUSB6010 +#if defined(CONFIG_USB_MUSB_TUSB6010) || \ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  	dma_addr_t		async;  	dma_addr_t		sync;  	void __iomem		*sync_va; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 95a67fea393..fe8d14cac43 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -1698,6 +1698,8 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)  	is_on = !!is_on; +	pm_runtime_get_sync(musb->controller); +  	/* NOTE: this assumes we are sensing vbus; we'd rather  	 * not pullup unless the B-session is active.  	 */ @@ -1707,6 +1709,9 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)  		musb_pullup(musb, is_on);  	}  	spin_unlock_irqrestore(&musb->lock, flags); + +	pm_runtime_put(musb->controller); +  	return 0;  } @@ -1851,6 +1856,7 @@ int __init musb_gadget_setup(struct musb *musb)  	return 0;  err: +	musb->g.dev.parent = NULL;  	device_unregister(&musb->g.dev);  	return status;  } @@ -1858,7 +1864,8 @@ err:  void musb_gadget_cleanup(struct musb *musb)  {  	usb_del_gadget_udc(&musb->g); -	device_unregister(&musb->g.dev); +	if (musb->g.dev.parent) +		device_unregister(&musb->g.dev);  }  /* diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h index 82410703dcd..03f2655af29 100644 --- a/drivers/usb/musb/musb_regs.h +++ b/drivers/usb/musb/musb_regs.h @@ -234,7 +234,8 @@  #define MUSB_TESTMODE		0x0F	/* 8 bit */  /* Get offset for a given FIFO from musb->mregs */ -#ifdef	CONFIG_USB_MUSB_TUSB6010 +#if defined(CONFIG_USB_MUSB_TUSB6010) ||	\ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  #define MUSB_FIFO_OFFSET(epnum)	(0x200 + ((epnum) * 0x20))  #else  #define MUSB_FIFO_OFFSET(epnum)	(0x20 + ((epnum) * 4)) @@ -295,7 +296,8 @@  #define MUSB_FLAT_OFFSET(_epnum, _offset)	\  	(0x100 + (0x10*(_epnum)) + (_offset)) -#ifdef CONFIG_USB_MUSB_TUSB6010 +#if defined(CONFIG_USB_MUSB_TUSB6010) ||	\ +	defined(CONFIG_USB_MUSB_TUSB6010_MODULE)  /* TUSB6010 EP0 configuration register is special */  #define MUSB_TUSB_OFFSET(_epnum, _offset)	\  	(0x10 + _offset) diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 9eec41fbf3a..ec1480191f7 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -18,6 +18,7 @@  #include <linux/kernel.h>  #include <linux/errno.h>  #include <linux/init.h> +#include <linux/prefetch.h>  #include <linux/usb.h>  #include <linux/irq.h>  #include <linux/platform_device.h> diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index c784e6c03aa..b67b4bc596c 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c @@ -20,6 +20,7 @@  #include <plat/mux.h>  #include "musb_core.h" +#include "tusb6010.h"  #define to_chdat(c)		((struct tusb_omap_dma_ch *)(c)->private_data) @@ -89,7 +90,7 @@ static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat)  	u32		reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);  	if (reg != 0) { -		dev_dbg(musb->controller, "ep%i dmareq0 is busy for ep%i\n", +		dev_dbg(chdat->musb->controller, "ep%i dmareq0 is busy for ep%i\n",  			chdat->epnum, reg & 0xf);  		return -EAGAIN;  	} diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index cecace41183..ef4333f4bbe 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c @@ -65,7 +65,8 @@ static void ux500_tx_work(struct work_struct *data)  	struct musb *musb = hw_ep->musb;  	unsigned long flags; -	DBG(4, "DMA tx transfer done on hw_ep=%d\n", hw_ep->epnum); +	dev_dbg(musb->controller, "DMA tx transfer done on hw_ep=%d\n", +		hw_ep->epnum);  	spin_lock_irqsave(&musb->lock, flags);  	ux500_channel->channel.actual_len = ux500_channel->cur_len; @@ -84,7 +85,8 @@ static void ux500_rx_work(struct work_struct *data)  	struct musb *musb = hw_ep->musb;  	unsigned long flags; -	DBG(4, "DMA rx transfer done on hw_ep=%d\n", hw_ep->epnum); +	dev_dbg(musb->controller, "DMA rx transfer done on hw_ep=%d\n", +		hw_ep->epnum);  	spin_lock_irqsave(&musb->lock, flags);  	ux500_channel->channel.actual_len = ux500_channel->cur_len; @@ -116,9 +118,11 @@ static bool ux500_configure_channel(struct dma_channel *channel,  	enum dma_slave_buswidth addr_width;  	dma_addr_t usb_fifo_addr = (MUSB_FIFO_OFFSET(hw_ep->epnum) +  					ux500_channel->controller->phy_base); +	struct musb *musb = ux500_channel->controller->private_data; -	DBG(4, "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); +	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);  	ux500_channel->cur_len = len; @@ -133,15 +137,13 @@ static bool ux500_configure_channel(struct dma_channel *channel,  					DMA_SLAVE_BUSWIDTH_4_BYTES;  	slave_conf.direction = direction; -	if (direction == DMA_FROM_DEVICE) { -		slave_conf.src_addr = usb_fifo_addr; -		slave_conf.src_addr_width = addr_width; -		slave_conf.src_maxburst = 16; -	} else { -		slave_conf.dst_addr = usb_fifo_addr; -		slave_conf.dst_addr_width = addr_width; -		slave_conf.dst_maxburst = 16; -	} +	slave_conf.src_addr = usb_fifo_addr; +	slave_conf.src_addr_width = addr_width; +	slave_conf.src_maxburst = 16; +	slave_conf.dst_addr = usb_fifo_addr; +	slave_conf.dst_addr_width = addr_width; +	slave_conf.dst_maxburst = 16; +  	dma_chan->device->device_control(dma_chan, DMA_SLAVE_CONFIG,  					     (unsigned long) &slave_conf); @@ -166,6 +168,7 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c,  	struct ux500_dma_controller *controller = container_of(c,  			struct ux500_dma_controller, controller);  	struct ux500_dma_channel *ux500_channel = NULL; +	struct musb *musb = controller->private_data;  	u8 ch_num = hw_ep->epnum - 1;  	u32 max_ch; @@ -192,7 +195,7 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c,  	ux500_channel->hw_ep = hw_ep;  	ux500_channel->is_allocated = 1; -	DBG(7, "hw_ep=%d, is_tx=0x%x, channel=%d\n", +	dev_dbg(musb->controller, "hw_ep=%d, is_tx=0x%x, channel=%d\n",  		hw_ep->epnum, is_tx, ch_num);  	return &(ux500_channel->channel); @@ -201,8 +204,9 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c,  static void ux500_dma_channel_release(struct dma_channel *channel)  {  	struct ux500_dma_channel *ux500_channel = channel->private_data; +	struct musb *musb = ux500_channel->controller->private_data; -	DBG(7, "channel=%d\n", ux500_channel->ch_num); +	dev_dbg(musb->controller, "channel=%d\n", ux500_channel->ch_num);  	if (ux500_channel->is_allocated) {  		ux500_channel->is_allocated = 0; @@ -252,8 +256,8 @@ static int ux500_dma_channel_abort(struct dma_channel *channel)  	void __iomem *epio = musb->endpoints[ux500_channel->hw_ep->epnum].regs;  	u16 csr; -	DBG(4, "channel=%d, is_tx=%d\n", ux500_channel->ch_num, -						ux500_channel->is_tx); +	dev_dbg(musb->controller, "channel=%d, is_tx=%d\n", +		ux500_channel->ch_num, ux500_channel->is_tx);  	if (channel->status == MUSB_DMA_STATUS_BUSY) {  		if (ux500_channel->is_tx) {  |