diff options
Diffstat (limited to 'drivers/usb/musb')
| -rw-r--r-- | drivers/usb/musb/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/usb/musb/Makefile | 2 | ||||
| -rw-r--r-- | drivers/usb/musb/blackfin.c | 9 | ||||
| -rw-r--r-- | drivers/usb/musb/cppi_dma.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/davinci.c | 5 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.c | 90 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.h | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_regs.h | 30 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_virthub.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/musbhsdma.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/omap2430.c | 4 | ||||
| -rw-r--r-- | drivers/usb/musb/tusb6010.c | 13 | ||||
| -rw-r--r-- | drivers/usb/musb/tusb6010_omap.c | 23 | 
15 files changed, 123 insertions, 68 deletions
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index b4c783c284b..07fe490b44d 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig @@ -42,7 +42,7 @@ config USB_MUSB_SOC  	default y if (BF52x && !BF522 && !BF523)  comment "DaVinci 35x and 644x USB support" -	depends on USB_MUSB_HDRC && ARCH_DAVINCI +	depends on USB_MUSB_HDRC && ARCH_DAVINCI_DMx  comment "OMAP 243x high speed USB support"  	depends on USB_MUSB_HDRC && ARCH_OMAP2430 diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index 85710ccc188..3a485dabebb 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -6,7 +6,7 @@ musb_hdrc-objs := musb_core.o  obj-$(CONFIG_USB_MUSB_HDRC)	+= musb_hdrc.o -ifeq ($(CONFIG_ARCH_DAVINCI),y) +ifeq ($(CONFIG_ARCH_DAVINCI_DMx),y)  	musb_hdrc-objs	+= davinci.o  endif diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index bcee1339d4f..ec8d324237f 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c @@ -11,7 +11,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/sched.h> -#include <linux/slab.h>  #include <linux/init.h>  #include <linux/list.h>  #include <linux/gpio.h> @@ -173,13 +172,7 @@ static irqreturn_t blackfin_interrupt(int irq, void *__hci)  	spin_unlock_irqrestore(&musb->lock, flags); -	/* REVISIT we sometimes get spurious IRQs on g_ep0 -	 * not clear why... fall in BF54x too. -	 */ -	if (retval != IRQ_HANDLED) -		DBG(5, "spurious?\n"); - -	return IRQ_HANDLED; +	return retval;  }  static void musb_conn_timer_handler(unsigned long _musb) diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index 3c69a76ec39..59dc3d351b6 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c @@ -7,6 +7,7 @@   */  #include <linux/platform_device.h> +#include <linux/slab.h>  #include <linux/usb.h>  #include "musb_core.h" diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 66913811af5..ce2e16fee0d 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c @@ -24,7 +24,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/sched.h> -#include <linux/slab.h>  #include <linux/init.h>  #include <linux/list.h>  #include <linux/delay.h> @@ -274,7 +273,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)  	/* NOTE: DaVinci shadows the Mentor IRQs.  Don't manage them through  	 * the Mentor registers (except for setup), use the TI ones and EOI.  	 * -	 * Docs describe irq "vector" registers asociated with the CPPI and +	 * Docs describe irq "vector" registers associated with the CPPI and  	 * USB EOI registers.  These hold a bitmask corresponding to the  	 * current IRQ, not an irq handler address.  Would using those bits  	 * resolve some of the races observed in this dispatch code?? @@ -445,6 +444,8 @@ int __init musb_platform_init(struct musb *musb)  	return 0;  fail: +	clk_disable(musb->clock); +  	usb_nop_xceiv_unregister();  	return -ENODEV;  } diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index b4bbf8f2c23..705cc4ad873 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -379,7 +379,6 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  				u8 devctl, u8 power)  {  	irqreturn_t handled = IRQ_NONE; -	void __iomem *mbase = musb->mregs;  	DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,  		int_usb); @@ -394,6 +393,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  		if (devctl & MUSB_DEVCTL_HM) {  #ifdef CONFIG_USB_MUSB_HDRC_HCD +			void __iomem *mbase = musb->mregs; +  			switch (musb->xceiv->state) {  			case OTG_STATE_A_SUSPEND:  				/* remote wakeup?  later, GetPortStatus @@ -471,6 +472,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  #ifdef CONFIG_USB_MUSB_HDRC_HCD  	/* see manual for the order of the tests */  	if (int_usb & MUSB_INTR_SESSREQ) { +		void __iomem *mbase = musb->mregs; +  		DBG(1, "SESSION_REQUEST (%s)\n", otg_state_string(musb));  		/* IRQ arrives from ID pin sense or (later, if VBUS power @@ -519,6 +522,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  		case OTG_STATE_A_WAIT_BCON:  		case OTG_STATE_A_WAIT_VRISE:  			if (musb->vbuserr_retry) { +				void __iomem *mbase = musb->mregs; +  				musb->vbuserr_retry--;  				ignore = 1;  				devctl |= MUSB_DEVCTL_SESSION; @@ -622,6 +627,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,  	if (int_usb & MUSB_INTR_CONNECT) {  		struct usb_hcd *hcd = musb_to_hcd(musb); +		void __iomem *mbase = musb->mregs;  		handled = IRQ_HANDLED;  		musb->is_active = 1; @@ -959,10 +965,8 @@ static void musb_shutdown(struct platform_device *pdev)  	spin_lock_irqsave(&musb->lock, flags);  	musb_platform_disable(musb);  	musb_generic_disable(musb); -	if (musb->clock) { +	if (musb->clock)  		clk_put(musb->clock); -		musb->clock = NULL; -	}  	spin_unlock_irqrestore(&musb->lock, flags);  	/* FIXME power down */ @@ -1847,15 +1851,6 @@ static void musb_free(struct musb *musb)  	put_device(musb->xceiv->dev);  #endif -	musb_writeb(musb->mregs, MUSB_DEVCTL, 0); -	musb_platform_exit(musb); -	musb_writeb(musb->mregs, MUSB_DEVCTL, 0); - -	if (musb->clock) { -		clk_disable(musb->clock); -		clk_put(musb->clock); -	} -  #ifdef CONFIG_USB_MUSB_HDRC_HCD  	usb_put_hcd(musb_to_hcd(musb));  #else @@ -1883,8 +1878,10 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)  	 */  	if (!plat) {  		dev_dbg(dev, "no platform_data?\n"); -		return -ENODEV; +		status = -ENODEV; +		goto fail0;  	} +  	switch (plat->mode) {  	case MUSB_HOST:  #ifdef CONFIG_USB_MUSB_HDRC_HCD @@ -1906,13 +1903,16 @@ bad_config:  #endif  	default:  		dev_err(dev, "incompatible Kconfig role setting\n"); -		return -EINVAL; +		status = -EINVAL; +		goto fail0;  	}  	/* allocate */  	musb = allocate_instance(dev, plat->config, ctrl); -	if (!musb) -		return -ENOMEM; +	if (!musb) { +		status = -ENOMEM; +		goto fail0; +	}  	spin_lock_init(&musb->lock);  	musb->board_mode = plat->mode; @@ -1930,7 +1930,7 @@ bad_config:  		if (IS_ERR(musb->clock)) {  			status = PTR_ERR(musb->clock);  			musb->clock = NULL; -			goto fail; +			goto fail1;  		}  	} @@ -1949,12 +1949,12 @@ bad_config:  	 */  	musb->isr = generic_interrupt;  	status = musb_platform_init(musb); -  	if (status < 0) -		goto fail; +		goto fail2; +  	if (!musb->isr) {  		status = -ENODEV; -		goto fail2; +		goto fail3;  	}  #ifndef CONFIG_MUSB_PIO_ONLY @@ -1980,7 +1980,7 @@ bad_config:  			? MUSB_CONTROLLER_MHDRC  			: MUSB_CONTROLLER_HDRC, musb);  	if (status < 0) -		goto fail2; +		goto fail3;  #ifdef CONFIG_USB_MUSB_OTG  	setup_timer(&musb->otg_timer, musb_otg_timer_func, (unsigned long) musb); @@ -1993,7 +1993,7 @@ bad_config:  	if (request_irq(nIrq, musb->isr, 0, dev_name(dev), musb)) {  		dev_err(dev, "request_irq %d failed!\n", nIrq);  		status = -ENODEV; -		goto fail2; +		goto fail3;  	}  	musb->nIrq = nIrq;  /* FIXME this handles wakeup irqs wrong */ @@ -2007,7 +2007,6 @@ bad_config:  	/* host side needs more setup */  	if (is_host_enabled(musb)) {  		struct usb_hcd	*hcd = musb_to_hcd(musb); -		u8 busctl;  		otg_set_host(musb->xceiv, &hcd->self); @@ -2018,9 +2017,9 @@ bad_config:  		/* program PHY to use external vBus if required */  		if (plat->extvbus) { -			busctl = musb_readb(musb->mregs, MUSB_ULPI_BUSCONTROL); +			u8 busctl = musb_read_ulpi_buscontrol(musb->mregs);  			busctl |= MUSB_ULPI_USE_EXTVBUS; -			musb_writeb(musb->mregs, MUSB_ULPI_BUSCONTROL, busctl); +			musb_write_ulpi_buscontrol(musb->mregs, busctl);  		}  	} @@ -2034,8 +2033,6 @@ bad_config:  		musb->xceiv->state = OTG_STATE_A_IDLE;  		status = usb_add_hcd(musb_to_hcd(musb), -1, 0); -		if (status) -			goto fail;  		DBG(1, "%s mode, status %d, devctl %02x %c\n",  			"HOST", status, @@ -2050,8 +2047,6 @@ bad_config:  		musb->xceiv->state = OTG_STATE_B_IDLE;  		status = musb_gadget_setup(musb); -		if (status) -			goto fail;  		DBG(1, "%s mode, status %d, dev%02x\n",  			is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", @@ -2059,12 +2054,14 @@ bad_config:  			musb_readb(musb->mregs, MUSB_DEVCTL));  	} +	if (status < 0) +		goto fail3;  #ifdef CONFIG_SYSFS  	status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group); -#endif  	if (status) -		goto fail2; +		goto fail4; +#endif  	dev_info(dev, "USB %s mode controller at %p using %s, IRQ %d\n",  			({char *s; @@ -2080,17 +2077,29 @@ bad_config:  	return 0; -fail2: +fail4: +	if (!is_otg_enabled(musb) && is_host_enabled(musb)) +		usb_remove_hcd(musb_to_hcd(musb)); +	else +		musb_gadget_cleanup(musb); + +fail3: +	if (musb->irq_wake) +		device_init_wakeup(dev, 0);  	musb_platform_exit(musb); -fail: -	dev_err(musb->controller, -		"musb_init_controller failed with status %d\n", status); +fail2:  	if (musb->clock)  		clk_put(musb->clock); -	device_init_wakeup(dev, 0); + +fail1: +	dev_err(musb->controller, +		"musb_init_controller failed with status %d\n", status); +  	musb_free(musb); +fail0: +  	return status;  } @@ -2127,7 +2136,6 @@ static int __init musb_probe(struct platform_device *pdev)  	/* clobbered by use_dma=n */  	orig_dma_mask = dev->dma_mask;  #endif -  	status = musb_init_controller(dev, irq, base);  	if (status < 0)  		iounmap(base); @@ -2150,6 +2158,10 @@ static int __exit musb_remove(struct platform_device *pdev)  	if (musb->board_mode == MUSB_HOST)  		usb_remove_hcd(musb_to_hcd(musb));  #endif +	musb_writeb(musb->mregs, MUSB_DEVCTL, 0); +	musb_platform_exit(musb); +	musb_writeb(musb->mregs, MUSB_DEVCTL, 0); +  	musb_free(musb);  	iounmap(ctrl_base);  	device_init_wakeup(&pdev->dev, 0); @@ -2171,6 +2183,7 @@ void musb_save_context(struct musb *musb)  	if (is_host_enabled(musb)) {  		musb_context.frame = musb_readw(musb_base, MUSB_FRAME);  		musb_context.testmode = musb_readb(musb_base, MUSB_TESTMODE); +		musb_context.busctl = musb_read_ulpi_buscontrol(musb->mregs);  	}  	musb_context.power = musb_readb(musb_base, MUSB_POWER);  	musb_context.intrtxe = musb_readw(musb_base, MUSB_INTRTXE); @@ -2242,6 +2255,7 @@ void musb_restore_context(struct musb *musb)  	if (is_host_enabled(musb)) {  		musb_writew(musb_base, MUSB_FRAME, musb_context.frame);  		musb_writeb(musb_base, MUSB_TESTMODE, musb_context.testmode); +		musb_write_ulpi_buscontrol(musb->mregs, musb_context.busctl);  	}  	musb_writeb(musb_base, MUSB_POWER, musb_context.power);  	musb_writew(musb_base, MUSB_INTRTXE, musb_context.intrtxe); diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index d849fb81c13..ac17b004909 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -469,7 +469,7 @@ struct musb_csr_regs {  struct musb_context_registers { -#if defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP2430) +#ifdef CONFIG_PM  	u32 otg_sysconfig, otg_forcestandby;  #endif  	u8 power; @@ -478,12 +478,12 @@ struct musb_context_registers {  	u16 frame;  	u8 index, testmode; -	u8 devctl, misc; +	u8 devctl, busctl, misc;  	struct musb_csr_regs index_regs[MUSB_C_NUM_EPS];  }; -#if defined(CONFIG_ARCH_OMAP34XX) || defined(CONFIG_ARCH_OMAP2430) +#ifdef CONFIG_PM  extern void musb_platform_save_context(struct musb *musb,  		struct musb_context_registers *musb_context);  extern void musb_platform_restore_context(struct musb *musb, diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index a9f288cd70e..6fca870e957 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -43,6 +43,7 @@  #include <linux/moduleparam.h>  #include <linux/stat.h>  #include <linux/dma-mapping.h> +#include <linux/slab.h>  #include "musb_core.h" diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 3421cf9858b..877d20b1dff 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -1689,7 +1689,7 @@ void musb_host_rx(struct musb *musb, u8 epnum)  				dma->desired_mode = 1;  			if (rx_count < hw_ep->max_packet_sz_rx) {  				length = rx_count; -				dma->bDesiredMode = 0; +				dma->desired_mode = 0;  			} else {  				length = urb->transfer_buffer_length;  			} @@ -2042,6 +2042,7 @@ static int musb_urb_enqueue(  		 * odd, rare, error prone, but legal.  		 */  		kfree(qh); +		qh = NULL;  		ret = 0;  	} else  		ret = musb_schedule(musb, qh, diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h index 292894a2c24..fa55aacc385 100644 --- a/drivers/usb/musb/musb_regs.h +++ b/drivers/usb/musb/musb_regs.h @@ -326,6 +326,11 @@ static inline void  musb_write_rxfifoadd(void __iomem *mbase, u16 c_off)  	musb_writew(mbase, MUSB_RXFIFOADD, c_off);  } +static inline void musb_write_ulpi_buscontrol(void __iomem *mbase, u8 val) +{ +	musb_writeb(mbase, MUSB_ULPI_BUSCONTROL, val); +} +  static inline u8 musb_read_txfifosz(void __iomem *mbase)  {  	return musb_readb(mbase, MUSB_TXFIFOSZ); @@ -346,6 +351,11 @@ static inline u16  musb_read_rxfifoadd(void __iomem *mbase)  	return musb_readw(mbase, MUSB_RXFIFOADD);  } +static inline u8 musb_read_ulpi_buscontrol(void __iomem *mbase) +{ +	return musb_readb(mbase, MUSB_ULPI_BUSCONTROL); +} +  static inline u8 musb_read_configdata(void __iomem *mbase)  {  	musb_writeb(mbase, MUSB_INDEX, 0); @@ -491,7 +501,7 @@ static inline u8  musb_read_txhubport(void __iomem *mbase, u8 epnum)  #define MUSB_FLAT_OFFSET(_epnum, _offset)	\  	(USB_OFFSET(USB_EP_NI0_TXMAXP) + (0x40 * (_epnum)) + (_offset)) -/* Not implemented - HW has seperate Tx/Rx FIFO */ +/* Not implemented - HW has separate Tx/Rx FIFO */  #define MUSB_TXCSR_MODE			0x0000  static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) @@ -510,20 +520,33 @@ static inline void  musb_write_rxfifoadd(void __iomem *mbase, u16 c_off)  {  } +static inline void musb_write_ulpi_buscontrol(void __iomem *mbase, u8 val) +{ +} +  static inline u8 musb_read_txfifosz(void __iomem *mbase)  { +	return 0;  }  static inline u16 musb_read_txfifoadd(void __iomem *mbase)  { +	return 0;  }  static inline u8 musb_read_rxfifosz(void __iomem *mbase)  { +	return 0;  }  static inline u16  musb_read_rxfifoadd(void __iomem *mbase)  { +	return 0; +} + +static inline u8 musb_read_ulpi_buscontrol(void __iomem *mbase) +{ +	return 0;  }  static inline u8 musb_read_configdata(void __iomem *mbase) @@ -577,22 +600,27 @@ static inline void  musb_write_txhubport(void __iomem *mbase, u8 epnum,  static inline u8 musb_read_rxfunaddr(void __iomem *mbase, u8 epnum)  { +	return 0;  }  static inline u8 musb_read_rxhubaddr(void __iomem *mbase, u8 epnum)  { +	return 0;  }  static inline u8 musb_read_rxhubport(void __iomem *mbase, u8 epnum)  { +	return 0;  }  static inline u8  musb_read_txfunaddr(void __iomem *mbase, u8 epnum)  { +	return 0;  }  static inline u8  musb_read_txhubaddr(void __iomem *mbase, u8 epnum)  { +	return 0;  }  static inline void  musb_read_txhubport(void __iomem *mbase, u8 epnum) diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index bfe5fe4ebfe..7775e1c0a21 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c @@ -35,7 +35,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/sched.h> -#include <linux/slab.h>  #include <linux/errno.h>  #include <linux/init.h>  #include <linux/time.h> diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 2fa7d5c00f3..1008044a3bb 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c @@ -33,6 +33,7 @@  #include <linux/device.h>  #include <linux/interrupt.h>  #include <linux/platform_device.h> +#include <linux/slab.h>  #include "musb_core.h"  #include "musbhsdma.h" diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 3fe16867b5a..82592633502 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c @@ -27,7 +27,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/sched.h> -#include <linux/slab.h>  #include <linux/init.h>  #include <linux/list.h>  #include <linux/clk.h> @@ -332,8 +331,5 @@ int musb_platform_exit(struct musb *musb)  	musb_platform_suspend(musb); -	clk_put(musb->clock); -	musb->clock = NULL; -  	return 0;  } diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index ab776a8d98c..60d3938cafc 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -29,6 +29,19 @@ static void tusb_source_power(struct musb *musb, int is_on);  #define TUSB_REV_MAJOR(reg_val)		((reg_val >> 4) & 0xf)  #define TUSB_REV_MINOR(reg_val)		(reg_val & 0xf) +#ifdef CONFIG_PM +/* REVISIT: These should be only needed if somebody implements off idle */ +void musb_platform_save_context(struct musb *musb, +			struct musb_context_registers *musb_context) +{ +} + +void musb_platform_restore_context(struct musb *musb, +			struct musb_context_registers *musb_context) +{ +} +#endif +  /*   * Checks the revision. We need to use the DMA register as 3.0 does not   * have correct versions for TUSB_PRCM_REV or TUSB_INT_CTRL_REV. diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index 1c868096bd6..c061a88f2b0 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c @@ -15,6 +15,7 @@  #include <linux/usb.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> +#include <linux/slab.h>  #include <plat/dma.h>  #include <plat/mux.h> @@ -38,7 +39,7 @@ struct tusb_omap_dma_ch {  	struct tusb_omap_dma	*tusb_dma; -	void __iomem		*dma_addr; +	dma_addr_t		dma_addr;  	u32			len;  	u16			packet_sz; @@ -125,6 +126,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)  	struct tusb_omap_dma_ch	*chdat = to_chdat(channel);  	struct tusb_omap_dma	*tusb_dma = chdat->tusb_dma;  	struct musb		*musb = chdat->musb; +	struct device		*dev = musb->controller;  	struct musb_hw_ep	*hw_ep = chdat->hw_ep;  	void __iomem		*ep_conf = hw_ep->conf;  	void __iomem		*mbase = musb->mregs; @@ -172,13 +174,15 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data)  		DBG(3, "Using PIO for remaining %lu bytes\n", pio);  		buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len;  		if (chdat->tx) { -			dma_cache_maint(phys_to_virt((u32)chdat->dma_addr), -					chdat->transfer_len, DMA_TO_DEVICE); +			dma_unmap_single(dev, chdat->dma_addr, +						chdat->transfer_len, +						DMA_TO_DEVICE);  			musb_write_fifo(hw_ep, pio, buf);  		} else { +			dma_unmap_single(dev, chdat->dma_addr, +						chdat->transfer_len, +						DMA_FROM_DEVICE);  			musb_read_fifo(hw_ep, pio, buf); -			dma_cache_maint(phys_to_virt((u32)chdat->dma_addr), -					chdat->transfer_len, DMA_FROM_DEVICE);  		}  		channel->actual_len += pio;  	} @@ -223,6 +227,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,  	struct tusb_omap_dma_ch		*chdat = to_chdat(channel);  	struct tusb_omap_dma		*tusb_dma = chdat->tusb_dma;  	struct musb			*musb = chdat->musb; +	struct device			*dev = musb->controller;  	struct musb_hw_ep		*hw_ep = chdat->hw_ep;  	void __iomem			*mbase = musb->mregs;  	void __iomem			*ep_conf = hw_ep->conf; @@ -298,14 +303,16 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz,  	chdat->packet_sz = packet_sz;  	chdat->len = len;  	channel->actual_len = 0; -	chdat->dma_addr = (void __iomem *)dma_addr; +	chdat->dma_addr = dma_addr;  	channel->status = MUSB_DMA_STATUS_BUSY;  	/* Since we're recycling dma areas, we need to clean or invalidate */  	if (chdat->tx) -		dma_cache_maint(phys_to_virt(dma_addr), len, DMA_TO_DEVICE); +		dma_map_single(dev, phys_to_virt(dma_addr), len, +				DMA_TO_DEVICE);  	else -		dma_cache_maint(phys_to_virt(dma_addr), len, DMA_FROM_DEVICE); +		dma_map_single(dev, phys_to_virt(dma_addr), len, +				DMA_FROM_DEVICE);  	/* Use 16-bit transfer if dma_addr is not 32-bit aligned */  	if ((dma_addr & 0x3) == 0) {  |