Lines Matching refs:lpbfifo
47 } lpbfifo; variable
71 spin_lock_irqsave(&lpbfifo.lock, flags); in mpc512x_lpbfifo_irq()
73 if (!lpbfifo.regs) in mpc512x_lpbfifo_irq()
76 req = lpbfifo.req; in mpc512x_lpbfifo_irq()
82 status = in_be32(&lpbfifo.regs->status); in mpc512x_lpbfifo_irq()
85 out_be32(&lpbfifo.regs->enable, in mpc512x_lpbfifo_irq()
90 out_be32(&lpbfifo.regs->status, MPC512X_SCLPC_SUCCESS); in mpc512x_lpbfifo_irq()
92 lpbfifo.wait_lpbfifo_irq = false; in mpc512x_lpbfifo_irq()
94 if (lpbfifo.wait_lpbfifo_callback) in mpc512x_lpbfifo_irq()
98 lpbfifo.req = NULL; in mpc512x_lpbfifo_irq()
100 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_irq()
108 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_irq()
122 spin_lock_irqsave(&lpbfifo.lock, flags); in mpc512x_lpbfifo_callback()
124 if (!lpbfifo.regs) { in mpc512x_lpbfifo_callback()
125 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_callback()
129 req = lpbfifo.req; in mpc512x_lpbfifo_callback()
132 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_callback()
141 dma_unmap_single(lpbfifo.chan->device->dev, in mpc512x_lpbfifo_callback()
142 lpbfifo.ram_bus_addr, req->size, dir); in mpc512x_lpbfifo_callback()
144 lpbfifo.wait_lpbfifo_callback = false; in mpc512x_lpbfifo_callback()
146 if (!lpbfifo.wait_lpbfifo_irq) { in mpc512x_lpbfifo_callback()
148 lpbfifo.req = NULL; in mpc512x_lpbfifo_callback()
150 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_callback()
155 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_callback()
190 if (lpbfifo.req->size == 0 || !IS_ALIGNED(lpbfifo.req->size, 4)) in mpc512x_lpbfifo_kick()
193 if (lpbfifo.req->portsize != LPB_DEV_PORTSIZE_UNDEFINED) { in mpc512x_lpbfifo_kick()
194 bpt = lpbfifo.req->portsize; in mpc512x_lpbfifo_kick()
199 if (IS_ALIGNED(lpbfifo.req->dev_phys_addr, min(bpt, 0x8u)) && in mpc512x_lpbfifo_kick()
200 IS_ALIGNED(lpbfifo.req->size, bpt)) { in mpc512x_lpbfifo_kick()
212 for (i = 0; i < lpbfifo.cs_n; i++) { in mpc512x_lpbfifo_kick()
213 phys_addr_t cs_start = lpbfifo.cs_ranges[i].addr; in mpc512x_lpbfifo_kick()
214 phys_addr_t cs_end = cs_start + lpbfifo.cs_ranges[i].size; in mpc512x_lpbfifo_kick()
215 phys_addr_t access_start = lpbfifo.req->dev_phys_addr; in mpc512x_lpbfifo_kick()
216 phys_addr_t access_end = access_start + lpbfifo.req->size; in mpc512x_lpbfifo_kick()
219 cs = lpbfifo.cs_ranges[i].csnum; in mpc512x_lpbfifo_kick()
223 if (i == lpbfifo.cs_n) in mpc512x_lpbfifo_kick()
227 dma_dev = lpbfifo.chan->device; in mpc512x_lpbfifo_kick()
229 if (lpbfifo.req->dir == MPC512X_LPBFIFO_REQ_DIR_WRITE) { in mpc512x_lpbfifo_kick()
232 dma_conf.dst_addr = lpbfifo.regs_phys + in mpc512x_lpbfifo_kick()
237 dma_conf.src_addr = lpbfifo.regs_phys + in mpc512x_lpbfifo_kick()
244 if (dma_dev->device_config(lpbfifo.chan, &dma_conf)) { in mpc512x_lpbfifo_kick()
252 lpbfifo.req->ram_virt_addr, lpbfifo.req->size, dir); in mpc512x_lpbfifo_kick()
256 lpbfifo.ram_bus_addr = sg_dma_address(&sg); /* For freeing later */ in mpc512x_lpbfifo_kick()
258 sg_dma_len(&sg) = lpbfifo.req->size; in mpc512x_lpbfifo_kick()
260 dma_tx = dmaengine_prep_slave_sg(lpbfifo.chan, &sg, in mpc512x_lpbfifo_kick()
270 out_be32(&lpbfifo.regs->enable, in mpc512x_lpbfifo_kick()
272 out_be32(&lpbfifo.regs->enable, 0x0); in mpc512x_lpbfifo_kick()
281 out_be32(&lpbfifo.regs->fifo_ctrl, MPC512X_SCLPC_FIFO_CTRL(0x7)); in mpc512x_lpbfifo_kick()
282 out_be32(&lpbfifo.regs->fifo_alarm, MPC512X_SCLPC_FIFO_ALARM(0x200)); in mpc512x_lpbfifo_kick()
288 out_be32(&lpbfifo.regs->start_addr, lpbfifo.req->dev_phys_addr); in mpc512x_lpbfifo_kick()
295 if (lpbfifo.req->dir == MPC512X_LPBFIFO_REQ_DIR_READ) in mpc512x_lpbfifo_kick()
300 out_be32(&lpbfifo.regs->ctrl, bits); in mpc512x_lpbfifo_kick()
304 if (lpbfifo.req->dir == MPC512X_LPBFIFO_REQ_DIR_WRITE) in mpc512x_lpbfifo_kick()
307 lpbfifo.wait_lpbfifo_irq = false; in mpc512x_lpbfifo_kick()
309 out_be32(&lpbfifo.regs->enable, bits); in mpc512x_lpbfifo_kick()
312 bits = lpbfifo.req->size | MPC512X_SCLPC_START; in mpc512x_lpbfifo_kick()
313 out_be32(&lpbfifo.regs->pkt_size, bits); in mpc512x_lpbfifo_kick()
325 out_be32(&lpbfifo.regs->enable, in mpc512x_lpbfifo_kick()
329 lpbfifo.req->size, dir); in mpc512x_lpbfifo_kick()
337 if (!lpbfifo.regs) in mpc512x_lpbfifo_submit_locked()
341 if (lpbfifo.req) in mpc512x_lpbfifo_submit_locked()
344 lpbfifo.wait_lpbfifo_irq = true; in mpc512x_lpbfifo_submit_locked()
345 lpbfifo.wait_lpbfifo_callback = true; in mpc512x_lpbfifo_submit_locked()
346 lpbfifo.req = req; in mpc512x_lpbfifo_submit_locked()
350 lpbfifo.req = NULL; /* Set the FIFO as idle */ in mpc512x_lpbfifo_submit_locked()
360 spin_lock_irqsave(&lpbfifo.lock, flags); in mpc512x_lpbfifo_submit()
362 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_submit()
407 lpbfifo.cs_n = proplen / 4; in get_cs_ranges()
408 lpbfifo.cs_ranges = devm_kcalloc(dev, lpbfifo.cs_n, in get_cs_ranges()
410 if (!lpbfifo.cs_ranges) in get_cs_ranges()
414 (u32 *)lpbfifo.cs_ranges, proplen) != 0) { in get_cs_ranges()
418 for (i = 0; i < lpbfifo.cs_n; i++) { in get_cs_ranges()
419 if (lpbfifo.cs_ranges[i].base != 0) in get_cs_ranges()
435 memset(&lpbfifo, 0, sizeof(struct lpbfifo_data)); in mpc512x_lpbfifo_probe()
436 spin_lock_init(&lpbfifo.lock); in mpc512x_lpbfifo_probe()
438 lpbfifo.chan = dma_request_slave_channel(&pdev->dev, "rx-tx"); in mpc512x_lpbfifo_probe()
439 if (lpbfifo.chan == NULL) in mpc512x_lpbfifo_probe()
448 lpbfifo.regs_phys = r.start; in mpc512x_lpbfifo_probe()
449 lpbfifo.regs_size = resource_size(&r); in mpc512x_lpbfifo_probe()
451 if (!devm_request_mem_region(&pdev->dev, lpbfifo.regs_phys, in mpc512x_lpbfifo_probe()
452 lpbfifo.regs_size, DRV_NAME)) { in mpc512x_lpbfifo_probe()
458 lpbfifo.regs = devm_ioremap(&pdev->dev, in mpc512x_lpbfifo_probe()
459 lpbfifo.regs_phys, lpbfifo.regs_size); in mpc512x_lpbfifo_probe()
460 if (!lpbfifo.regs) { in mpc512x_lpbfifo_probe()
466 out_be32(&lpbfifo.regs->enable, in mpc512x_lpbfifo_probe()
475 lpbfifo.irq = irq_of_parse_and_map(pdev->dev.of_node, 0); in mpc512x_lpbfifo_probe()
476 if (lpbfifo.irq == NO_IRQ) { in mpc512x_lpbfifo_probe()
482 if (request_irq(lpbfifo.irq, mpc512x_lpbfifo_irq, 0, in mpc512x_lpbfifo_probe()
493 irq_dispose_mapping(lpbfifo.irq); in mpc512x_lpbfifo_probe()
495 dma_release_channel(lpbfifo.chan); in mpc512x_lpbfifo_probe()
502 struct dma_device *dma_dev = lpbfifo.chan->device; in mpc512x_lpbfifo_remove()
505 spin_lock_irqsave(&lpbfifo.lock, flags); in mpc512x_lpbfifo_remove()
506 regs = lpbfifo.regs; in mpc512x_lpbfifo_remove()
507 lpbfifo.regs = NULL; in mpc512x_lpbfifo_remove()
508 spin_unlock_irqrestore(&lpbfifo.lock, flags); in mpc512x_lpbfifo_remove()
510 dma_dev->device_terminate_all(lpbfifo.chan); in mpc512x_lpbfifo_remove()
513 free_irq(lpbfifo.irq, &pdev->dev); in mpc512x_lpbfifo_remove()
514 irq_dispose_mapping(lpbfifo.irq); in mpc512x_lpbfifo_remove()
515 dma_release_channel(lpbfifo.chan); in mpc512x_lpbfifo_remove()