Lines Matching refs:pch

1559 	struct dma_pl330_chan *pch;
1565 pch = desc->pchan;
1568 if (!pch)
1571 spin_lock_irqsave(&pch->lock, flags);
1575 spin_unlock_irqrestore(&pch->lock, flags);
1577 tasklet_schedule(&pch->task);
2042 static inline void fill_queue(struct dma_pl330_chan *pch)
2047 list_for_each_entry(desc, &pch->work_list, node) {
2053 ret = pl330_submit_req(pch->thread, desc);
2062 dev_err(pch->dmac->ddma.dev, "%s:%d Bad Desc(%d)\n",
2064 tasklet_schedule(&pch->task);
2071 struct dma_pl330_chan *pch = from_tasklet(pch, t, task);
2076 spin_lock_irqsave(&pch->lock, flags);
2079 list_for_each_entry_safe(desc, _dt, &pch->work_list, node)
2081 if (!pch->cyclic)
2083 list_move_tail(&desc->node, &pch->completed_list);
2087 fill_queue(pch);
2089 if (list_empty(&pch->work_list)) {
2090 spin_lock(&pch->thread->dmac->lock);
2091 _stop(pch->thread);
2092 spin_unlock(&pch->thread->dmac->lock);
2094 pch->active = false;
2097 spin_lock(&pch->thread->dmac->lock);
2098 pl330_start_thread(pch->thread);
2099 spin_unlock(&pch->thread->dmac->lock);
2102 while (!list_empty(&pch->completed_list)) {
2105 desc = list_first_entry(&pch->completed_list,
2110 if (pch->cyclic) {
2112 list_move_tail(&desc->node, &pch->work_list);
2114 pch->active = true;
2115 spin_lock(&pch->thread->dmac->lock);
2116 pl330_start_thread(pch->thread);
2117 spin_unlock(&pch->thread->dmac->lock);
2122 list_move_tail(&desc->node, &pch->dmac->desc_pool);
2128 spin_unlock_irqrestore(&pch->lock, flags);
2130 spin_lock_irqsave(&pch->lock, flags);
2133 spin_unlock_irqrestore(&pch->lock, flags);
2137 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2138 pm_runtime_put_autosuspend(pch->dmac->ddma.dev);
2164 struct dma_pl330_chan *pch = to_pchan(chan);
2165 struct pl330_dmac *pl330 = pch->dmac;
2171 pch->cyclic = false;
2173 pch->thread = pl330_request_channel(pl330);
2174 if (!pch->thread) {
2179 tasklet_setup(&pch->task, pl330_tasklet);
2205 static void pl330_unprep_slave_fifo(struct dma_pl330_chan *pch)
2207 if (pch->dir != DMA_NONE)
2208 dma_unmap_resource(pch->chan.device->dev, pch->fifo_dma,
2209 1 << pch->burst_sz, pch->dir, 0);
2210 pch->dir = DMA_NONE;
2214 static bool pl330_prep_slave_fifo(struct dma_pl330_chan *pch,
2217 struct device *dev = pch->chan.device->dev;
2221 if (pch->dir == dma_dir)
2224 pl330_unprep_slave_fifo(pch);
2225 pch->fifo_dma = dma_map_resource(dev, pch->fifo_addr,
2226 1 << pch->burst_sz, dma_dir, 0);
2227 if (dma_mapping_error(dev, pch->fifo_dma))
2230 pch->dir = dma_dir;
2248 struct dma_pl330_chan *pch = to_pchan(chan);
2250 pl330_unprep_slave_fifo(pch);
2253 pch->fifo_addr = slave_config->dst_addr;
2255 pch->burst_sz = __ffs(slave_config->dst_addr_width);
2256 pch->burst_len = fixup_burst_len(slave_config->dst_maxburst,
2257 pch->dmac->quirks);
2260 pch->fifo_addr = slave_config->src_addr;
2262 pch->burst_sz = __ffs(slave_config->src_addr_width);
2263 pch->burst_len = fixup_burst_len(slave_config->src_maxburst,
2264 pch->dmac->quirks);
2273 struct dma_pl330_chan *pch = to_pchan(chan);
2275 memcpy(&pch->slave_config, slave_config, sizeof(*slave_config));
2282 struct dma_pl330_chan *pch = to_pchan(chan);
2285 struct pl330_dmac *pl330 = pch->dmac;
2289 spin_lock_irqsave(&pch->lock, flags);
2292 _stop(pch->thread);
2293 pch->thread->req[0].desc = NULL;
2294 pch->thread->req[1].desc = NULL;
2295 pch->thread->req_running = -1;
2298 power_down = pch->active;
2299 pch->active = false;
2302 list_for_each_entry(desc, &pch->submitted_list, node) {
2307 list_for_each_entry(desc, &pch->work_list , node) {
2312 list_splice_tail_init(&pch->submitted_list, &pl330->desc_pool);
2313 list_splice_tail_init(&pch->work_list, &pl330->desc_pool);
2314 list_splice_tail_init(&pch->completed_list, &pl330->desc_pool);
2315 spin_unlock_irqrestore(&pch->lock, flags);
2333 struct dma_pl330_chan *pch = to_pchan(chan);
2334 struct pl330_dmac *pl330 = pch->dmac;
2339 spin_lock_irqsave(&pch->lock, flags);
2342 _stop(pch->thread);
2345 list_for_each_entry(desc, &pch->work_list, node) {
2349 spin_unlock_irqrestore(&pch->lock, flags);
2358 struct dma_pl330_chan *pch = to_pchan(chan);
2359 struct pl330_dmac *pl330 = pch->dmac;
2362 tasklet_kill(&pch->task);
2364 pm_runtime_get_sync(pch->dmac->ddma.dev);
2367 pl330_release_channel(pch->thread);
2368 pch->thread = NULL;
2370 if (pch->cyclic)
2371 list_splice_tail_init(&pch->work_list, &pch->dmac->desc_pool);
2374 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2375 pm_runtime_put_autosuspend(pch->dmac->ddma.dev);
2376 pl330_unprep_slave_fifo(pch);
2379 static int pl330_get_current_xferred_count(struct dma_pl330_chan *pch,
2382 struct pl330_thread *thrd = pch->thread;
2383 struct pl330_dmac *pl330 = pch->dmac;
2396 pm_runtime_mark_last_busy(pch->dmac->ddma.dev);
2413 struct dma_pl330_chan *pch = to_pchan(chan);
2424 spin_lock_irqsave(&pch->lock, flags);
2425 spin_lock(&pch->thread->dmac->lock);
2427 if (pch->thread->req_running != -1)
2428 running = pch->thread->req[pch->thread->req_running].desc;
2430 last_enq = pch->thread->req[pch->thread->lstenq].desc;
2433 list_for_each_entry(desc, &pch->work_list, node) {
2438 pl330_get_current_xferred_count(pch, desc);
2471 spin_unlock(&pch->thread->dmac->lock);
2472 spin_unlock_irqrestore(&pch->lock, flags);
2482 struct dma_pl330_chan *pch = to_pchan(chan);
2485 spin_lock_irqsave(&pch->lock, flags);
2486 if (list_empty(&pch->work_list)) {
2492 WARN_ON(list_empty(&pch->submitted_list));
2493 pch->active = true;
2494 pm_runtime_get_sync(pch->dmac->ddma.dev);
2496 list_splice_tail_init(&pch->submitted_list, &pch->work_list);
2497 spin_unlock_irqrestore(&pch->lock, flags);
2499 pl330_tasklet(&pch->task);
2510 struct dma_pl330_chan *pch = to_pchan(tx->chan);
2514 spin_lock_irqsave(&pch->lock, flags);
2519 if (pch->cyclic) {
2527 list_move_tail(&desc->node, &pch->submitted_list);
2532 list_add_tail(&last->node, &pch->submitted_list);
2533 spin_unlock_irqrestore(&pch->lock, flags);
2596 static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
2598 struct pl330_dmac *pl330 = pch->dmac;
2599 u8 *peri_id = pch->chan.private;
2618 desc->pchan = pch;
2622 desc->peri = peri_id ? pch->chan.chan_id : 0;
2623 desc->rqcfg.pcfg = &pch->dmac->pcfg;
2625 dma_async_tx_descriptor_init(&desc->txd, &pch->chan);
2639 __pl330_prep_dma_memcpy(struct dma_pl330_chan *pch, dma_addr_t dst,
2642 struct dma_pl330_desc *desc = pl330_get_desc(pch);
2645 dev_err(pch->dmac->ddma.dev, "%s:%d Unable to fetch desc\n",
2668 struct dma_pl330_chan *pch = desc->pchan;
2669 struct pl330_dmac *pl330 = pch->dmac;
2689 struct dma_pl330_chan *pch = to_pchan(chan);
2690 struct pl330_dmac *pl330 = pch->dmac;
2699 dev_err(pch->dmac->ddma.dev, "%s:%d Invalid dma direction\n",
2704 pl330_config_write(chan, &pch->slave_config, direction);
2706 if (!pl330_prep_slave_fifo(pch, direction))
2710 desc = pl330_get_desc(pch);
2714 dev_err(pch->dmac->ddma.dev, "%s:%d Unable to fetch desc\n",
2740 dst = pch->fifo_dma;
2745 src = pch->fifo_dma;
2753 desc->rqcfg.brst_size = pch->burst_sz;
2754 desc->rqcfg.brst_len = pch->burst_len;
2769 pch->cyclic = true;
2779 struct dma_pl330_chan *pch = to_pchan(chan);
2783 if (unlikely(!pch || !len))
2786 pl330 = pch->dmac;
2788 desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
2852 struct dma_pl330_chan *pch = to_pchan(chan);
2856 if (unlikely(!pch || !sgl || !sg_len))
2859 pl330_config_write(chan, &pch->slave_config, direction);
2861 if (!pl330_prep_slave_fifo(pch, direction))
2868 desc = pl330_get_desc(pch);
2870 struct pl330_dmac *pl330 = pch->dmac;
2872 dev_err(pch->dmac->ddma.dev,
2888 fill_px(&desc->px, pch->fifo_dma, sg_dma_address(sg),
2893 fill_px(&desc->px, sg_dma_address(sg), pch->fifo_dma,
2897 desc->rqcfg.brst_size = pch->burst_sz;
2898 desc->rqcfg.brst_len = pch->burst_len;
2939 struct dma_pl330_chan *pch = &pl330->peripherals[pr];
2941 if (!pch->thread || thrd->id != pch->thread->id)
3010 struct dma_pl330_chan *pch, *_p;
3101 pl330->peripherals = kcalloc(num_chan, sizeof(*pch), GFP_KERNEL);
3108 pch = &pl330->peripherals[i];
3110 pch->chan.private = adev->dev.of_node;
3111 INIT_LIST_HEAD(&pch->submitted_list);
3112 INIT_LIST_HEAD(&pch->work_list);
3113 INIT_LIST_HEAD(&pch->completed_list);
3114 spin_lock_init(&pch->lock);
3115 pch->thread = NULL;
3116 pch->chan.device = pd;
3117 pch->dmac = pl330;
3118 pch->dir = DMA_NONE;
3121 list_add_tail(&pch->chan.device_node, &pd->channels);
3188 list_for_each_entry_safe(pch, _p, &pl330->ddma.channels,
3192 list_del(&pch->chan.device_node);
3195 if (pch->thread) {
3196 pl330_terminate_all(&pch->chan);
3197 pl330_free_chan_resources(&pch->chan);
3214 struct dma_pl330_chan *pch, *_p;
3231 list_for_each_entry_safe(pch, _p, &pl330->ddma.channels,
3235 list_del(&pch->chan.device_node);
3238 if (pch->thread) {
3239 pl330_terminate_all(&pch->chan);
3240 pl330_free_chan_resources(&pch->chan);