Lines Matching refs:chdat

71 static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat)  in tusb_omap_use_shared_dmareq()  argument
73 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); in tusb_omap_use_shared_dmareq()
76 dev_dbg(chdat->musb->controller, "ep%i dmareq0 is busy for ep%i\n", in tusb_omap_use_shared_dmareq()
77 chdat->epnum, reg & 0xf); in tusb_omap_use_shared_dmareq()
81 if (chdat->tx) in tusb_omap_use_shared_dmareq()
82 reg = (1 << 4) | chdat->epnum; in tusb_omap_use_shared_dmareq()
84 reg = chdat->epnum; in tusb_omap_use_shared_dmareq()
86 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg); in tusb_omap_use_shared_dmareq()
91 static inline void tusb_omap_free_shared_dmareq(struct tusb_omap_dma_ch *chdat) in tusb_omap_free_shared_dmareq() argument
93 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); in tusb_omap_free_shared_dmareq()
95 if ((reg & 0xf) != chdat->epnum) { in tusb_omap_free_shared_dmareq()
97 chdat->epnum, reg & 0xf); in tusb_omap_free_shared_dmareq()
100 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, 0); in tusb_omap_free_shared_dmareq()
110 struct tusb_omap_dma_ch *chdat = to_chdat(channel); in tusb_omap_dma_cb() local
111 struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; in tusb_omap_dma_cb()
112 struct musb *musb = chdat->musb; in tusb_omap_dma_cb()
114 struct musb_hw_ep *hw_ep = chdat->hw_ep; in tusb_omap_dma_cb()
123 ch = chdat->ch; in tusb_omap_dma_cb()
131 chdat->epnum, chdat->tx ? "tx" : "rx", in tusb_omap_dma_cb()
134 if (chdat->tx) in tusb_omap_dma_cb()
142 if (unlikely(remaining > chdat->transfer_len)) { in tusb_omap_dma_cb()
144 chdat->tx ? "tx" : "rx", chdat->ch, in tusb_omap_dma_cb()
149 channel->actual_len = chdat->transfer_len - remaining; in tusb_omap_dma_cb()
150 pio = chdat->len - channel->actual_len; in tusb_omap_dma_cb()
152 dev_dbg(musb->controller, "DMA remaining %lu/%u\n", remaining, chdat->transfer_len); in tusb_omap_dma_cb()
159 buf = phys_to_virt((u32)chdat->dma_addr) + chdat->transfer_len; in tusb_omap_dma_cb()
160 if (chdat->tx) { in tusb_omap_dma_cb()
161 dma_unmap_single(dev, chdat->dma_addr, in tusb_omap_dma_cb()
162 chdat->transfer_len, in tusb_omap_dma_cb()
166 dma_unmap_single(dev, chdat->dma_addr, in tusb_omap_dma_cb()
167 chdat->transfer_len, in tusb_omap_dma_cb()
175 tusb_omap_free_shared_dmareq(chdat); in tusb_omap_dma_cb()
184 if (!chdat->tx) in tusb_omap_dma_cb()
185 musb_dma_completion(musb, chdat->epnum, chdat->tx); in tusb_omap_dma_cb()
191 if ((chdat->transfer_len < chdat->packet_sz) in tusb_omap_dma_cb()
192 || (chdat->transfer_len % chdat->packet_sz != 0)) { in tusb_omap_dma_cb()
195 if (chdat->tx) { in tusb_omap_dma_cb()
197 musb_ep_select(mbase, chdat->epnum); in tusb_omap_dma_cb()
211 struct tusb_omap_dma_ch *chdat = to_chdat(channel); in tusb_omap_dma_program() local
212 struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; in tusb_omap_dma_program()
213 struct musb *musb = chdat->musb; in tusb_omap_dma_program()
215 struct musb_hw_ep *hw_ep = chdat->hw_ep; in tusb_omap_dma_program()
244 if (chdat->tx) in tusb_omap_dma_program()
252 chdat->tx ? "tx" : "rx", chdat->ch, in tusb_omap_dma_program()
257 chdat->transfer_len = len & ~0x1f; in tusb_omap_dma_program()
260 chdat->transfer_packet_sz = chdat->transfer_len; in tusb_omap_dma_program()
262 chdat->transfer_packet_sz = packet_sz; in tusb_omap_dma_program()
265 ch = chdat->ch; in tusb_omap_dma_program()
266 dmareq = chdat->dmareq; in tusb_omap_dma_program()
267 sync_dev = chdat->sync_dev; in tusb_omap_dma_program()
269 if (tusb_omap_use_shared_dmareq(chdat) != 0) { in tusb_omap_dma_program()
270 dev_dbg(musb->controller, "could not get dma for ep%i\n", chdat->epnum); in tusb_omap_dma_program()
287 chdat->packet_sz = packet_sz; in tusb_omap_dma_program()
288 chdat->len = len; in tusb_omap_dma_program()
290 chdat->dma_addr = dma_addr; in tusb_omap_dma_program()
294 if (chdat->tx) in tusb_omap_dma_program()
311 dma_params.frame_count = chdat->transfer_len / 32; /* Burst sz frame */ in tusb_omap_dma_program()
314 chdat->epnum, chdat->tx ? "tx" : "rx", in tusb_omap_dma_program()
315 ch, dma_addr, chdat->transfer_len, len, in tusb_omap_dma_program()
316 chdat->transfer_packet_sz, packet_sz); in tusb_omap_dma_program()
321 if (chdat->tx) { in tusb_omap_dma_program()
358 chdat->epnum, chdat->tx ? "tx" : "rx", in tusb_omap_dma_program()
371 if (chdat->tx) { in tusb_omap_dma_program()
372 musb_ep_select(mbase, chdat->epnum); in tusb_omap_dma_program()
379 musb_ep_select(mbase, chdat->epnum); in tusb_omap_dma_program()
392 if (chdat->tx) { in tusb_omap_dma_program()
395 chdat->transfer_packet_sz); in tusb_omap_dma_program()
398 TUSB_EP_CONFIG_XFR_SIZE(chdat->transfer_len)); in tusb_omap_dma_program()
402 chdat->transfer_packet_sz << 16); in tusb_omap_dma_program()
405 TUSB_EP_CONFIG_XFR_SIZE(chdat->transfer_len)); in tusb_omap_dma_program()
413 struct tusb_omap_dma_ch *chdat = to_chdat(channel); in tusb_omap_dma_abort() local
414 struct tusb_omap_dma *tusb_dma = chdat->tusb_dma; in tusb_omap_dma_abort()
432 static inline int tusb_omap_dma_allocate_dmareq(struct tusb_omap_dma_ch *chdat) in tusb_omap_dma_allocate_dmareq() argument
434 u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); in tusb_omap_dma_allocate_dmareq()
457 reg |= (chdat->epnum << (dmareq_nr * 5)); in tusb_omap_dma_allocate_dmareq()
458 if (chdat->tx) in tusb_omap_dma_allocate_dmareq()
460 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg); in tusb_omap_dma_allocate_dmareq()
462 chdat->dmareq = dmareq_nr; in tusb_omap_dma_allocate_dmareq()
463 chdat->sync_dev = sync_dev[chdat->dmareq]; in tusb_omap_dma_allocate_dmareq()
468 static inline void tusb_omap_dma_free_dmareq(struct tusb_omap_dma_ch *chdat) in tusb_omap_dma_free_dmareq() argument
472 if (!chdat || chdat->dmareq < 0) in tusb_omap_dma_free_dmareq()
475 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); in tusb_omap_dma_free_dmareq()
476 reg &= ~(0x1f << (chdat->dmareq * 5)); in tusb_omap_dma_free_dmareq()
477 musb_writel(chdat->tbase, TUSB_DMA_EP_MAP, reg); in tusb_omap_dma_free_dmareq()
479 chdat->dmareq = -1; in tusb_omap_dma_free_dmareq()
480 chdat->sync_dev = -1; in tusb_omap_dma_free_dmareq()
496 struct tusb_omap_dma_ch *chdat = NULL; in tusb_omap_dma_allocate() local
521 chdat = ch->private_data; in tusb_omap_dma_allocate()
530 chdat->tx = 1; in tusb_omap_dma_allocate()
533 chdat->tx = 0; in tusb_omap_dma_allocate()
537 chdat->musb = tusb_dma->musb; in tusb_omap_dma_allocate()
538 chdat->tbase = tusb_dma->tbase; in tusb_omap_dma_allocate()
539 chdat->hw_ep = hw_ep; in tusb_omap_dma_allocate()
540 chdat->epnum = hw_ep->epnum; in tusb_omap_dma_allocate()
541 chdat->dmareq = -1; in tusb_omap_dma_allocate()
542 chdat->completed_len = 0; in tusb_omap_dma_allocate()
543 chdat->tusb_dma = tusb_dma; in tusb_omap_dma_allocate()
550 ret = tusb_omap_dma_allocate_dmareq(chdat); in tusb_omap_dma_allocate()
554 ret = omap_request_dma(chdat->sync_dev, dev_name, in tusb_omap_dma_allocate()
555 tusb_omap_dma_cb, channel, &chdat->ch); in tusb_omap_dma_allocate()
568 chdat->dmareq = -1; in tusb_omap_dma_allocate()
569 chdat->ch = -1; in tusb_omap_dma_allocate()
573 chdat->epnum, in tusb_omap_dma_allocate()
574 chdat->tx ? "tx" : "rx", in tusb_omap_dma_allocate()
575 chdat->ch >= 0 ? "dedicated" : "shared", in tusb_omap_dma_allocate()
576 chdat->ch >= 0 ? chdat->ch : tusb_dma->ch, in tusb_omap_dma_allocate()
577 chdat->dmareq >= 0 ? chdat->dmareq : tusb_dma->dmareq, in tusb_omap_dma_allocate()
578 chdat->sync_dev >= 0 ? chdat->sync_dev : tusb_dma->sync_dev); in tusb_omap_dma_allocate()
583 tusb_omap_dma_free_dmareq(chdat); in tusb_omap_dma_allocate()
585 dev_dbg(musb->controller, "ep%i: Could not get a DMA channel\n", chdat->epnum); in tusb_omap_dma_allocate()
593 struct tusb_omap_dma_ch *chdat = to_chdat(channel); in tusb_omap_dma_release() local
594 struct musb *musb = chdat->musb; in tusb_omap_dma_release()
598 dev_dbg(musb->controller, "ep%i ch%i\n", chdat->epnum, chdat->ch); in tusb_omap_dma_release()
601 if (chdat->tx) in tusb_omap_dma_release()
602 reg |= (1 << chdat->epnum); in tusb_omap_dma_release()
604 reg |= (1 << (chdat->epnum + 15)); in tusb_omap_dma_release()
608 if (chdat->tx) in tusb_omap_dma_release()
609 reg |= (1 << chdat->epnum); in tusb_omap_dma_release()
611 reg |= (1 << (chdat->epnum + 15)); in tusb_omap_dma_release()
616 if (chdat->ch >= 0) { in tusb_omap_dma_release()
617 omap_stop_dma(chdat->ch); in tusb_omap_dma_release()
618 omap_free_dma(chdat->ch); in tusb_omap_dma_release()
619 chdat->ch = -1; in tusb_omap_dma_release()
622 if (chdat->dmareq >= 0) in tusb_omap_dma_release()
623 tusb_omap_dma_free_dmareq(chdat); in tusb_omap_dma_release()
687 struct tusb_omap_dma_ch *chdat; in tusb_dma_controller_create() local
695 chdat = kzalloc(sizeof(struct tusb_omap_dma_ch), GFP_KERNEL); in tusb_dma_controller_create()
696 if (!chdat) in tusb_dma_controller_create()
700 ch->private_data = chdat; in tusb_dma_controller_create()