Lines Matching defs:pch

1561 	struct dma_pl330_chan *pch;
1567 pch = desc->pchan;
1570 if (!pch)
1573 spin_lock_irqsave(&pch->lock, flags);
1577 spin_unlock_irqrestore(&pch->lock, flags);
1579 tasklet_schedule(&pch->task);
2044 static inline void fill_queue(struct dma_pl330_chan *pch)
2049 list_for_each_entry(desc, &pch->work_list, node) {
2055 ret = pl330_submit_req(pch->thread, desc);
2064 dev_err(pch->dmac->ddma.dev, "%s:%d Bad Desc(%d)\n",
2066 tasklet_schedule(&pch->task);
2073 struct dma_pl330_chan *pch = from_tasklet(pch, t, task);
2078 spin_lock_irqsave(&pch->lock, flags);
2081 list_for_each_entry_safe(desc, _dt, &pch->work_list, node)
2083 if (!pch->cyclic)
2085 list_move_tail(&desc->node, &pch->completed_list);
2089 fill_queue(pch);
2091 if (list_empty(&pch->work_list)) {
2092 spin_lock(&pch->thread->dmac->lock);
2093 _stop(pch->thread);
2094 spin_unlock(&pch->thread->dmac->lock);
2096 pch->active = false;
2099 spin_lock(&pch->thread->dmac->lock);
2100 pl330_start_thread(pch->thread);
2101 spin_unlock(&pch->thread->dmac->lock);
2104 while (!list_empty(&pch->completed_list)) {
2107 desc = list_first_entry(&pch->completed_list,
2112 if (pch->cyclic) {
2114 list_move_tail(&desc->node, &pch->work_list);
2116 pch->active = true;
2117 spin_lock(&pch->thread->dmac->lock);
2118 pl330_start_thread(pch->thread);
2119 spin_unlock(&pch->thread->dmac->lock);
2124 list_move_tail(&desc->node, &pch->dmac->desc_pool);
2130 spin_unlock_irqrestore(&pch->lock, flags);
2132 spin_lock_irqsave(&pch->lock, flags);
2135 spin_unlock_irqrestore(&pch->lock, flags);
2139 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2140 pm_runtime_put_autosuspend(pch->dmac->ddma.dev);
2166 struct dma_pl330_chan *pch = to_pchan(chan);
2167 struct pl330_dmac *pl330 = pch->dmac;
2173 pch->cyclic = false;
2175 pch->thread = pl330_request_channel(pl330);
2176 if (!pch->thread) {
2181 tasklet_setup(&pch->task, pl330_tasklet);
2207 static void pl330_unprep_slave_fifo(struct dma_pl330_chan *pch)
2209 if (pch->dir != DMA_NONE)
2210 dma_unmap_resource(pch->chan.device->dev, pch->fifo_dma,
2211 1 << pch->burst_sz, pch->dir, 0);
2212 pch->dir = DMA_NONE;
2216 static bool pl330_prep_slave_fifo(struct dma_pl330_chan *pch,
2219 struct device *dev = pch->chan.device->dev;
2223 if (pch->dir == dma_dir)
2226 pl330_unprep_slave_fifo(pch);
2227 pch->fifo_dma = dma_map_resource(dev, pch->fifo_addr,
2228 1 << pch->burst_sz, dma_dir, 0);
2229 if (dma_mapping_error(dev, pch->fifo_dma))
2232 pch->dir = dma_dir;
2250 struct dma_pl330_chan *pch = to_pchan(chan);
2252 pl330_unprep_slave_fifo(pch);
2255 pch->fifo_addr = slave_config->dst_addr;
2257 pch->burst_sz = __ffs(slave_config->dst_addr_width);
2258 pch->burst_len = fixup_burst_len(slave_config->dst_maxburst,
2259 pch->dmac->quirks);
2262 pch->fifo_addr = slave_config->src_addr;
2264 pch->burst_sz = __ffs(slave_config->src_addr_width);
2265 pch->burst_len = fixup_burst_len(slave_config->src_maxburst,
2266 pch->dmac->quirks);
2275 struct dma_pl330_chan *pch = to_pchan(chan);
2277 memcpy(&pch->slave_config, slave_config, sizeof(*slave_config));
2284 struct dma_pl330_chan *pch = to_pchan(chan);
2287 struct pl330_dmac *pl330 = pch->dmac;
2291 spin_lock_irqsave(&pch->lock, flags);
2294 _stop(pch->thread);
2295 pch->thread->req[0].desc = NULL;
2296 pch->thread->req[1].desc = NULL;
2297 pch->thread->req_running = -1;
2300 power_down = pch->active;
2301 pch->active = false;
2304 list_for_each_entry(desc, &pch->submitted_list, node) {
2309 list_for_each_entry(desc, &pch->work_list , node) {
2314 list_splice_tail_init(&pch->submitted_list, &pl330->desc_pool);
2315 list_splice_tail_init(&pch->work_list, &pl330->desc_pool);
2316 list_splice_tail_init(&pch->completed_list, &pl330->desc_pool);
2317 spin_unlock_irqrestore(&pch->lock, flags);
2335 struct dma_pl330_chan *pch = to_pchan(chan);
2336 struct pl330_dmac *pl330 = pch->dmac;
2341 spin_lock_irqsave(&pch->lock, flags);
2344 _stop(pch->thread);
2347 list_for_each_entry(desc, &pch->work_list, node) {
2351 spin_unlock_irqrestore(&pch->lock, flags);
2360 struct dma_pl330_chan *pch = to_pchan(chan);
2361 struct pl330_dmac *pl330 = pch->dmac;
2364 tasklet_kill(&pch->task);
2366 pm_runtime_get_sync(pch->dmac->ddma.dev);
2369 pl330_release_channel(pch->thread);
2370 pch->thread = NULL;
2372 if (pch->cyclic)
2373 list_splice_tail_init(&pch->work_list, &pch->dmac->desc_pool);
2376 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2377 pm_runtime_put_autosuspend(pch->dmac->ddma.dev);
2378 pl330_unprep_slave_fifo(pch);
2381 static int pl330_get_current_xferred_count(struct dma_pl330_chan *pch,
2384 struct pl330_thread *thrd = pch->thread;
2385 struct pl330_dmac *pl330 = pch->dmac;
2398 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2415 struct dma_pl330_chan *pch = to_pchan(chan);
2426 spin_lock_irqsave(&pch->lock, flags);
2427 spin_lock(&pch->thread->dmac->lock);
2429 if (pch->thread->req_running != -1)
2430 running = pch->thread->req[pch->thread->req_running].desc;
2432 last_enq = pch->thread->req[pch->thread->lstenq].desc;
2435 list_for_each_entry(desc, &pch->work_list, node) {
2440 pl330_get_current_xferred_count(pch, desc);
2473 spin_unlock(&pch->thread->dmac->lock);
2474 spin_unlock_irqrestore(&pch->lock, flags);
2484 struct dma_pl330_chan *pch = to_pchan(chan);
2487 spin_lock_irqsave(&pch->lock, flags);
2488 if (list_empty(&pch->work_list)) {
2494 WARN_ON(list_empty(&pch->submitted_list));
2495 pch->active = true;
2496 pm_runtime_get_sync(pch->dmac->ddma.dev);
2498 list_splice_tail_init(&pch->submitted_list, &pch->work_list);
2499 spin_unlock_irqrestore(&pch->lock, flags);
2501 pl330_tasklet(&pch->task);
2512 struct dma_pl330_chan *pch = to_pchan(tx->chan);
2516 spin_lock_irqsave(&pch->lock, flags);
2521 if (pch->cyclic) {
2529 list_move_tail(&desc->node, &pch->submitted_list);
2534 list_add_tail(&last->node, &pch->submitted_list);
2535 spin_unlock_irqrestore(&pch->lock, flags);
2597 static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
2599 struct pl330_dmac *pl330 = pch->dmac;
2600 u8 *peri_id = pch->chan.private;
2619 desc->pchan = pch;
2623 desc->peri = peri_id ? pch->chan.chan_id : 0;
2624 desc->rqcfg.pcfg = &pch->dmac->pcfg;
2626 dma_async_tx_descriptor_init(&desc->txd, &pch->chan);
2640 __pl330_prep_dma_memcpy(struct dma_pl330_chan *pch, dma_addr_t dst,
2643 struct dma_pl330_desc *desc = pl330_get_desc(pch);
2646 dev_err(pch->dmac->ddma.dev, "%s:%d Unable to fetch desc\n",
2669 struct dma_pl330_chan *pch = desc->pchan;
2670 struct pl330_dmac *pl330 = pch->dmac;
2690 struct dma_pl330_chan *pch = to_pchan(chan);
2691 struct pl330_dmac *pl330 = pch->dmac;
2700 dev_err(pch->dmac->ddma.dev, "%s:%d Invalid dma direction\n",
2705 pl330_config_write(chan, &pch->slave_config, direction);
2707 if (!pl330_prep_slave_fifo(pch, direction))
2711 desc = pl330_get_desc(pch);
2715 dev_err(pch->dmac->ddma.dev, "%s:%d Unable to fetch desc\n",
2741 dst = pch->fifo_dma;
2746 src = pch->fifo_dma;
2754 desc->rqcfg.brst_size = pch->burst_sz;
2755 desc->rqcfg.brst_len = pch->burst_len;
2770 pch->cyclic = true;
2781 struct dma_pl330_chan *pch = to_pchan(chan);
2785 if (unlikely(!pch || !len))
2788 pl330 = pch->dmac;
2790 desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
2856 struct dma_pl330_chan *pch = to_pchan(chan);
2860 if (unlikely(!pch || !sgl || !sg_len))
2863 pl330_config_write(chan, &pch->slave_config, direction);
2865 if (!pl330_prep_slave_fifo(pch, direction))
2872 desc = pl330_get_desc(pch);
2874 struct pl330_dmac *pl330 = pch->dmac;
2876 dev_err(pch->dmac->ddma.dev,
2892 fill_px(&desc->px, pch->fifo_dma, sg_dma_address(sg),
2897 fill_px(&desc->px, sg_dma_address(sg), pch->fifo_dma,
2901 desc->rqcfg.brst_size = pch->burst_sz;
2902 desc->rqcfg.brst_len = pch->burst_len;
2944 struct dma_pl330_chan *pch = &pl330->peripherals[pr];
2946 if (!pch->thread || thrd->id != pch->thread->id)
3015 struct dma_pl330_chan *pch, *_p;
3106 pl330->peripherals = kcalloc(num_chan, sizeof(*pch), GFP_KERNEL);
3113 pch = &pl330->peripherals[i];
3115 pch->chan.private = adev->dev.of_node;
3116 INIT_LIST_HEAD(&pch->submitted_list);
3117 INIT_LIST_HEAD(&pch->work_list);
3118 INIT_LIST_HEAD(&pch->completed_list);
3119 spin_lock_init(&pch->lock);
3120 pch->thread = NULL;
3121 pch->chan.device = pd;
3122 pch->dmac = pl330;
3123 pch->dir = DMA_NONE;
3126 list_add_tail(&pch->chan.device_node, &pd->channels);
3193 list_for_each_entry_safe(pch, _p, &pl330->ddma.channels,
3197 list_del(&pch->chan.device_node);
3200 if (pch->thread) {
3201 pl330_terminate_all(&pch->chan);
3202 pl330_free_chan_resources(&pch->chan);
3219 struct dma_pl330_chan *pch, *_p;
3236 list_for_each_entry_safe(pch, _p, &pl330->ddma.channels,
3240 list_del(&pch->chan.device_node);
3243 if (pch->thread) {
3244 pl330_terminate_all(&pch->chan);
3245 pl330_free_chan_resources(&pch->chan);