Lines Matching refs:chdat
61 static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat)
63 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
66 dev_dbg(chdat->musb->controller, "ep%i dmareq0 is busy for ep%i\n",
67 chdat->epnum, reg & 0xf);
71 if (chdat->tx)
72 reg = (1 << 4) | chdat->epnum;
74 reg = chdat->epnum;
76 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
81 static inline void tusb_omap_free_shared_dmareq(struct tusb_omap_dma_ch *chdat)
83 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
85 if ((reg & 0xf) != chdat->epnum) {
87 chdat->epnum, reg & 0xf);
90 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, 0);
100 struct tusb_omap_dma_ch *chdat = to_chdat(channel);
101 struct tusb_omap_dma *tusb_dma = chdat->tusb_dma;
102 struct musb *musb = chdat->musb;
104 struct musb_hw_ep *hw_ep = chdat->hw_ep;
112 chdat->epnum, chdat->tx ? "tx" : "rx");
114 if (chdat->tx)
122 if (unlikely(remaining > chdat->transfer_len)) {
124 chdat->tx ? "tx" : "rx", remaining);
128 channel->actual_len = chdat->transfer_len - remaining;
129 pio = chdat->len - channel->actual_len;
131 dev_dbg(musb->controller, "DMA remaining %lu/%u\n", remaining, chdat->transfer_len);
138 buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len;
139 if (chdat->tx) {
140 dma_unmap_single(dev, chdat->dma_addr,
141 chdat->transfer_len,
145 dma_unmap_single(dev, chdat->dma_addr,
146 chdat->transfer_len,
154 tusb_omap_free_shared_dmareq(chdat);
158 musb_dma_completion(musb, chdat->epnum, chdat->tx);
164 if ((chdat->transfer_len < chdat->packet_sz)
165 || (chdat->transfer_len % chdat->packet_sz != 0)) {
168 if (chdat->tx) {
170 musb_ep_select(mbase, chdat->epnum);
184 struct tusb_omap_dma_ch *chdat = to_chdat(channel);
185 struct tusb_omap_dma *tusb_dma = chdat->tusb_dma;
186 struct musb *musb = chdat->musb;
188 struct musb_hw_ep *hw_ep = chdat->hw_ep;
219 if (chdat->tx)
227 chdat->tx ? "tx" : "rx", dma_remaining);
231 chdat->transfer_len = len & ~0x1f;
234 chdat->transfer_packet_sz = chdat->transfer_len;
236 chdat->transfer_packet_sz = packet_sz;
238 dma_data = chdat->dma_data;
240 if (tusb_omap_use_shared_dmareq(chdat) != 0) {
241 dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum);
253 chdat->packet_sz = packet_sz;
254 chdat->len = len;
256 chdat->dma_addr = dma_addr;
260 if (chdat->tx) {
287 chdat->epnum, chdat->tx ? "tx" : "rx", &dma_addr,
288 chdat->transfer_len, len, chdat->transfer_packet_sz, packet_sz);
304 chdat->transfer_len, dma_dir,
317 chdat->epnum, chdat->tx ? "tx" : "rx",
326 musb_ep_select(mbase, chdat->epnum);
327 if (chdat->tx) {
344 if (chdat->tx) {
348 psize |= chdat->transfer_packet_sz;
352 TUSB_EP_CONFIG_XFR_SIZE(chdat->transfer_len));
357 psize |= (chdat->transfer_packet_sz << 16);
361 TUSB_EP_CONFIG_XFR_SIZE(chdat->transfer_len));
369 struct tusb_omap_dma_ch *chdat = to_chdat(channel);
371 if (chdat->dma_data)
372 dmaengine_terminate_all(chdat->dma_data->chan);
379 static inline int tusb_omap_dma_allocate_dmareq(struct tusb_omap_dma_ch *chdat)
381 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
395 reg |= (chdat->epnum << (dmareq_nr * 5));
396 if (chdat->tx)
398 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
400 chdat->dma_data = &chdat->tusb_dma->dma_pool[dmareq_nr];
405 static inline void tusb_omap_dma_free_dmareq(struct tusb_omap_dma_ch *chdat)
409 if (!chdat || !chdat->dma_data || chdat->dma_data->dmareq < 0)
412 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP);
413 reg &= ~(0x1f << (chdat->dma_data->dmareq * 5));
414 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg);
416 chdat->dma_data = NULL;
430 struct tusb_omap_dma_ch *chdat = NULL;
447 chdat = ch->private_data;
455 chdat->musb = tusb_dma->controller.musb;
456 chdat->tbase = tusb_dma->tbase;
457 chdat->hw_ep = hw_ep;
458 chdat->epnum = hw_ep->epnum;
459 chdat->completed_len = 0;
460 chdat->tusb_dma = tusb_dma;
462 chdat->tx = 1;
464 chdat->tx = 0;
470 if (!chdat->dma_data) {
472 ret = tusb_omap_dma_allocate_dmareq(chdat);
476 chdat->dma_data = &tusb_dma->dma_pool[0];
480 dma_data = chdat->dma_data;
483 chdat->epnum,
484 chdat->tx ? "tx" : "rx",
491 tusb_omap_dma_free_dmareq(chdat);
493 dev_dbg(musb->controller, "ep%i: Could not get a DMA channel\n", chdat->epnum);
501 struct tusb_omap_dma_ch *chdat = to_chdat(channel);
502 struct musb *musb = chdat->musb;
504 dev_dbg(musb->controller, "Release for ep%i\n", chdat->epnum);
508 dmaengine_terminate_sync(chdat->dma_data->chan);
509 tusb_omap_dma_free_dmareq(chdat);
616 struct tusb_omap_dma_ch *chdat;
624 chdat = kzalloc(sizeof(struct tusb_omap_dma_ch), GFP_KERNEL);
625 if (!chdat)
629 ch->private_data = chdat;