diff options
Diffstat (limited to 'drivers/usb/musb/tusb6010_omap.c')
| -rw-r--r-- | drivers/usb/musb/tusb6010_omap.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index 5afa070d7dc9..c061a88f2b0f 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c | |||
| @@ -39,7 +39,7 @@ struct tusb_omap_dma_ch { | |||
| 39 | 39 | ||
| 40 | struct tusb_omap_dma *tusb_dma; | 40 | struct tusb_omap_dma *tusb_dma; |
| 41 | 41 | ||
| 42 | void __iomem *dma_addr; | 42 | dma_addr_t dma_addr; |
| 43 | 43 | ||
| 44 | u32 len; | 44 | u32 len; |
| 45 | u16 packet_sz; | 45 | u16 packet_sz; |
| @@ -126,6 +126,7 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 126 | struct tusb_omap_dma_ch *chdat = to_chdat(channel); | 126 | struct tusb_omap_dma_ch *chdat = to_chdat(channel); |
| 127 | struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; | 127 | struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; |
| 128 | struct musb *musb = chdat->musb; | 128 | struct musb *musb = chdat->musb; |
| 129 | struct device *dev = musb->controller; | ||
| 129 | struct musb_hw_ep *hw_ep = chdat->hw_ep; | 130 | struct musb_hw_ep *hw_ep = chdat->hw_ep; |
| 130 | void __iomem *ep_conf = hw_ep->conf; | 131 | void __iomem *ep_conf = hw_ep->conf; |
| 131 | void __iomem *mbase = musb->mregs; | 132 | void __iomem *mbase = musb->mregs; |
| @@ -173,13 +174,15 @@ static void tusb_omap_dma_cb(int lch, u16 ch_status, void *data) | |||
| 173 | DBG(3, "Using PIO for remaining %lu bytes\n", pio); | 174 | DBG(3, "Using PIO for remaining %lu bytes\n", pio); |
| 174 | buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len; | 175 | buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len; |
| 175 | if (chdat->tx) { | 176 | if (chdat->tx) { |
| 176 | dma_cache_maint(phys_to_virt((u32)chdat->dma_addr), | 177 | dma_unmap_single(dev, chdat->dma_addr, |
| 177 | chdat->transfer_len, DMA_TO_DEVICE); | 178 | chdat->transfer_len, |
| 179 | DMA_TO_DEVICE); | ||
| 178 | musb_write_fifo(hw_ep, pio, buf); | 180 | musb_write_fifo(hw_ep, pio, buf); |
| 179 | } else { | 181 | } else { |
| 182 | dma_unmap_single(dev, chdat->dma_addr, | ||
| 183 | chdat->transfer_len, | ||
| 184 | DMA_FROM_DEVICE); | ||
| 180 | musb_read_fifo(hw_ep, pio, buf); | 185 | musb_read_fifo(hw_ep, pio, buf); |
| 181 | dma_cache_maint(phys_to_virt((u32)chdat->dma_addr), | ||
| 182 | chdat->transfer_len, DMA_FROM_DEVICE); | ||
| 183 | } | 186 | } |
| 184 | channel->actual_len += pio; | 187 | channel->actual_len += pio; |
| 185 | } | 188 | } |
| @@ -224,6 +227,7 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 224 | struct tusb_omap_dma_ch *chdat = to_chdat(channel); | 227 | struct tusb_omap_dma_ch *chdat = to_chdat(channel); |
| 225 | struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; | 228 | struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; |
| 226 | struct musb *musb = chdat->musb; | 229 | struct musb *musb = chdat->musb; |
| 230 | struct device *dev = musb->controller; | ||
| 227 | struct musb_hw_ep *hw_ep = chdat->hw_ep; | 231 | struct musb_hw_ep *hw_ep = chdat->hw_ep; |
| 228 | void __iomem *mbase = musb->mregs; | 232 | void __iomem *mbase = musb->mregs; |
| 229 | void __iomem *ep_conf = hw_ep->conf; | 233 | void __iomem *ep_conf = hw_ep->conf; |
| @@ -299,14 +303,16 @@ static int tusb_omap_dma_program(struct dma_channel *channel, u16 packet_sz, | |||
| 299 | chdat->packet_sz = packet_sz; | 303 | chdat->packet_sz = packet_sz; |
| 300 | chdat->len = len; | 304 | chdat->len = len; |
| 301 | channel->actual_len = 0; | 305 | channel->actual_len = 0; |
| 302 | chdat->dma_addr = (void __iomem *)dma_addr; | 306 | chdat->dma_addr = dma_addr; |
| 303 | channel->status = MUSB_DMA_STATUS_BUSY; | 307 | channel->status = MUSB_DMA_STATUS_BUSY; |
| 304 | 308 | ||
| 305 | /* Since we're recycling dma areas, we need to clean or invalidate */ | 309 | /* Since we're recycling dma areas, we need to clean or invalidate */ |
| 306 | if (chdat->tx) | 310 | if (chdat->tx) |
| 307 | dma_cache_maint(phys_to_virt(dma_addr), len, DMA_TO_DEVICE); | 311 | dma_map_single(dev, phys_to_virt(dma_addr), len, |
| 312 | DMA_TO_DEVICE); | ||
| 308 | else | 313 | else |
| 309 | dma_cache_maint(phys_to_virt(dma_addr), len, DMA_FROM_DEVICE); | 314 | dma_map_single(dev, phys_to_virt(dma_addr), len, |
| 315 | DMA_FROM_DEVICE); | ||
| 310 | 316 | ||
| 311 | /* Use 16-bit transfer if dma_addr is not 32-bit aligned */ | 317 | /* Use 16-bit transfer if dma_addr is not 32-bit aligned */ |
| 312 | if ((dma_addr & 0x3) == 0) { | 318 | if ((dma_addr & 0x3) == 0) { |
