Lines Matching refs:chan
155 struct ipu_image_convert_chan *chan;
228 struct ipu_image_convert_chan chan[IC_NUM_TASKS];
343 struct ipu_image_convert_chan *chan = ctx->chan;
344 struct ipu_image_convert_priv *priv = chan->priv;
348 chan->ic_task, ctx,
461 dev_dbg(ctx->chan->priv->ipu->dev,
514 struct device *dev = ctx->chan->priv->ipu->dev;
734 struct device *dev = ctx->chan->priv->ipu->dev;
857 struct ipu_image_convert_chan *chan = ctx->chan;
858 struct ipu_image_convert_priv *priv = chan->priv;
894 chan->ic_task, ctx,
920 struct ipu_image_convert_chan *chan = ctx->chan;
921 struct ipu_image_convert_priv *priv = chan->priv;
953 chan->ic_task, ctx, src_col, src_row, dst_col, dst_row);
987 struct ipu_image_convert_chan *chan = ctx->chan;
988 struct ipu_image_convert_priv *priv = chan->priv;
1034 chan->ic_task, ctx,
1049 struct ipu_image_convert_chan *chan = ctx->chan;
1050 struct ipu_image_convert_priv *priv = chan->priv;
1076 chan->ic_task, ctx,
1125 struct ipu_image_convert_chan *chan = ctx->chan;
1126 struct ipu_image_convert_priv *priv = chan->priv;
1256 lockdep_assert_held(&ctx->chan->irqlock);
1269 struct ipu_image_convert_chan *chan = ctx->chan;
1270 struct ipu_image_convert_priv *priv = chan->priv;
1273 __func__, chan->ic_task, ctx, run);
1276 ipu_ic_task_disable(chan->ic);
1277 ipu_idmac_disable_channel(chan->in_chan);
1278 ipu_idmac_disable_channel(chan->out_chan);
1281 ipu_idmac_disable_channel(chan->rotation_in_chan);
1282 ipu_idmac_disable_channel(chan->rotation_out_chan);
1283 ipu_idmac_unlink(chan->out_chan, chan->rotation_in_chan);
1286 ipu_ic_disable(chan->ic);
1296 struct ipu_image_convert_chan *chan = ctx->chan;
1352 if ((channel == chan->out_chan ||
1353 channel == chan->rotation_out_chan) &&
1357 if (channel == chan->rotation_in_chan ||
1358 channel == chan->rotation_out_chan) {
1366 ipu_ic_task_idma_init(chan->ic, channel, width, height,
1382 struct ipu_image_convert_chan *chan = ctx->chan;
1383 struct ipu_image_convert_priv *priv = chan->priv;
1393 __func__, chan->ic_task, ctx, run, tile, dst_tile);
1420 ret = ipu_ic_task_init_rsc(chan->ic, &ctx->csc,
1432 init_idmac_channel(ctx, chan->in_chan, s_image,
1437 init_idmac_channel(ctx, chan->out_chan, d_image,
1441 init_idmac_channel(ctx, chan->rotation_in_chan, d_image,
1445 init_idmac_channel(ctx, chan->rotation_out_chan, d_image,
1449 ipu_idmac_link(chan->out_chan, chan->rotation_in_chan);
1452 init_idmac_channel(ctx, chan->out_chan, d_image,
1457 ipu_ic_enable(chan->ic);
1460 ipu_idmac_select_buffer(chan->in_chan, 0);
1461 ipu_idmac_select_buffer(chan->out_chan, 0);
1463 ipu_idmac_select_buffer(chan->rotation_out_chan, 0);
1465 ipu_idmac_select_buffer(chan->in_chan, 1);
1466 ipu_idmac_select_buffer(chan->out_chan, 1);
1468 ipu_idmac_select_buffer(chan->rotation_out_chan, 1);
1472 ipu_idmac_enable_channel(chan->in_chan);
1473 ipu_idmac_enable_channel(chan->out_chan);
1475 ipu_idmac_enable_channel(chan->rotation_in_chan);
1476 ipu_idmac_enable_channel(chan->rotation_out_chan);
1479 ipu_ic_task_enable(chan->ic);
1481 ipu_cpmem_dump(chan->in_chan);
1482 ipu_cpmem_dump(chan->out_chan);
1484 ipu_cpmem_dump(chan->rotation_in_chan);
1485 ipu_cpmem_dump(chan->rotation_out_chan);
1497 struct ipu_image_convert_chan *chan = ctx->chan;
1499 lockdep_assert_held(&chan->irqlock);
1509 chan->current_run = run;
1515 static void run_next(struct ipu_image_convert_chan *chan)
1517 struct ipu_image_convert_priv *priv = chan->priv;
1521 lockdep_assert_held(&chan->irqlock);
1523 list_for_each_entry_safe(run, tmp, &chan->pending_q, list) {
1528 __func__, chan->ic_task, run->ctx, run);
1542 list_add_tail(&run->list, &chan->done_q);
1543 chan->current_run = NULL;
1547 static void empty_done_q(struct ipu_image_convert_chan *chan)
1549 struct ipu_image_convert_priv *priv = chan->priv;
1553 spin_lock_irqsave(&chan->irqlock, flags);
1555 while (!list_empty(&chan->done_q)) {
1556 run = list_entry(chan->done_q.next,
1564 __func__, chan->ic_task, run->ctx, run, run->status);
1567 spin_unlock_irqrestore(&chan->irqlock, flags);
1569 spin_lock_irqsave(&chan->irqlock, flags);
1572 spin_unlock_irqrestore(&chan->irqlock, flags);
1581 struct ipu_image_convert_chan *chan = dev_id;
1582 struct ipu_image_convert_priv *priv = chan->priv;
1587 chan->ic_task);
1589 empty_done_q(chan);
1591 spin_lock_irqsave(&chan->irqlock, flags);
1597 list_for_each_entry(ctx, &chan->ctx_list, list) {
1601 __func__, chan->ic_task, ctx);
1606 spin_unlock_irqrestore(&chan->irqlock, flags);
1609 chan->ic_task);
1636 struct ipu_image_convert_chan *chan = ctx->chan;
1643 lockdep_assert_held(&chan->irqlock);
1646 chan->rotation_out_chan : chan->out_chan;
1683 ipu_cpmem_set_buffer(chan->in_chan, 0,
1690 ipu_cpmem_set_uv_offset(chan->in_chan,
1698 ipu_idmac_select_buffer(chan->in_chan, 0);
1707 ipu_cpmem_set_buffer(chan->in_chan, ctx->cur_buf_num,
1712 ipu_idmac_select_buffer(chan->in_chan, ctx->cur_buf_num);
1722 list_add_tail(&run->list, &chan->done_q);
1723 chan->current_run = NULL;
1724 run_next(chan);
1730 struct ipu_image_convert_chan *chan = data;
1731 struct ipu_image_convert_priv *priv = chan->priv;
1738 spin_lock_irqsave(&chan->irqlock, flags);
1741 run = chan->current_run;
1749 if (irq == chan->in_eof_irq) {
1751 } else if (irq == chan->out_eof_irq) {
1753 } else if (irq == chan->rot_in_eof_irq ||
1754 irq == chan->rot_out_eof_irq) {
1761 ctx->eof_mask |= (irq == chan->rot_in_eof_irq) ?
1777 spin_unlock_irqrestore(&chan->irqlock, flags);
1787 struct ipu_image_convert_chan *chan = ctx->chan;
1791 spin_lock_irqsave(&chan->irqlock, flags);
1793 run = chan->current_run;
1797 list_add_tail(&run->list, &chan->done_q);
1798 chan->current_run = NULL;
1799 run_next(chan);
1802 spin_unlock_irqrestore(&chan->irqlock, flags);
1804 empty_done_q(chan);
1807 static void release_ipu_resources(struct ipu_image_convert_chan *chan)
1809 if (chan->in_eof_irq >= 0)
1810 free_irq(chan->in_eof_irq, chan);
1811 if (chan->rot_in_eof_irq >= 0)
1812 free_irq(chan->rot_in_eof_irq, chan);
1813 if (chan->out_eof_irq >= 0)
1814 free_irq(chan->out_eof_irq, chan);
1815 if (chan->rot_out_eof_irq >= 0)
1816 free_irq(chan->rot_out_eof_irq, chan);
1818 if (!IS_ERR_OR_NULL(chan->in_chan))
1819 ipu_idmac_put(chan->in_chan);
1820 if (!IS_ERR_OR_NULL(chan->out_chan))
1821 ipu_idmac_put(chan->out_chan);
1822 if (!IS_ERR_OR_NULL(chan->rotation_in_chan))
1823 ipu_idmac_put(chan->rotation_in_chan);
1824 if (!IS_ERR_OR_NULL(chan->rotation_out_chan))
1825 ipu_idmac_put(chan->rotation_out_chan);
1826 if (!IS_ERR_OR_NULL(chan->ic))
1827 ipu_ic_put(chan->ic);
1829 chan->in_chan = chan->out_chan = chan->rotation_in_chan =
1830 chan->rotation_out_chan = NULL;
1831 chan->in_eof_irq = -1;
1832 chan->rot_in_eof_irq = -1;
1833 chan->out_eof_irq = -1;
1834 chan->rot_out_eof_irq = -1;
1837 static int get_eof_irq(struct ipu_image_convert_chan *chan,
1840 struct ipu_image_convert_priv *priv = chan->priv;
1845 ret = request_threaded_irq(irq, eof_irq, do_bh, 0, "ipu-ic", chan);
1854 static int get_ipu_resources(struct ipu_image_convert_chan *chan)
1856 const struct ipu_image_convert_dma_chan *dma = chan->dma_ch;
1857 struct ipu_image_convert_priv *priv = chan->priv;
1861 chan->ic = ipu_ic_get(priv->ipu, chan->ic_task);
1862 if (IS_ERR(chan->ic)) {
1864 ret = PTR_ERR(chan->ic);
1869 chan->in_chan = ipu_idmac_get(priv->ipu, dma->in);
1870 chan->out_chan = ipu_idmac_get(priv->ipu, dma->out);
1871 if (IS_ERR(chan->in_chan) || IS_ERR(chan->out_chan)) {
1877 chan->rotation_in_chan = ipu_idmac_get(priv->ipu, dma->rot_in);
1878 chan->rotation_out_chan = ipu_idmac_get(priv->ipu, dma->rot_out);
1879 if (IS_ERR(chan->rotation_in_chan) || IS_ERR(chan->rotation_out_chan)) {
1887 ret = get_eof_irq(chan, chan->in_chan);
1889 chan->in_eof_irq = -1;
1892 chan->in_eof_irq = ret;
1894 ret = get_eof_irq(chan, chan->rotation_in_chan);
1896 chan->rot_in_eof_irq = -1;
1899 chan->rot_in_eof_irq = ret;
1901 ret = get_eof_irq(chan, chan->out_chan);
1903 chan->out_eof_irq = -1;
1906 chan->out_eof_irq = ret;
1908 ret = get_eof_irq(chan, chan->rotation_out_chan);
1910 chan->rot_out_eof_irq = -1;
1913 chan->rot_out_eof_irq = ret;
1917 release_ipu_resources(chan);
1926 struct ipu_image_convert_priv *priv = ctx->chan->priv;
2077 struct ipu_image_convert_chan *chan;
2097 chan = &priv->chan[ic_task];
2104 chan->ic_task, ctx);
2106 ctx->chan = chan;
2231 spin_lock_irqsave(&chan->irqlock, flags);
2233 get_res = list_empty(&chan->ctx_list);
2235 list_add_tail(&ctx->list, &chan->ctx_list);
2237 spin_unlock_irqrestore(&chan->irqlock, flags);
2240 ret = get_ipu_resources(chan);
2249 spin_lock_irqsave(&chan->irqlock, flags);
2251 spin_unlock_irqrestore(&chan->irqlock, flags);
2267 struct ipu_image_convert_chan *chan;
2277 chan = ctx->chan;
2278 priv = chan->priv;
2281 chan->ic_task, ctx, run);
2285 spin_lock_irqsave(&chan->irqlock, flags);
2292 list_add_tail(&run->list, &chan->pending_q);
2294 if (!chan->current_run) {
2297 chan->current_run = NULL;
2300 spin_unlock_irqrestore(&chan->irqlock, flags);
2308 struct ipu_image_convert_chan *chan = ctx->chan;
2309 struct ipu_image_convert_priv *priv = chan->priv;
2314 spin_lock_irqsave(&chan->irqlock, flags);
2317 list_for_each_entry_safe(run, tmp, &chan->pending_q, list) {
2321 list_move_tail(&run->list, &chan->done_q);
2324 run_count = get_run_count(ctx, &chan->done_q);
2325 active_run = (chan->current_run && chan->current_run->ctx == ctx) ?
2326 chan->current_run : NULL;
2333 spin_unlock_irqrestore(&chan->irqlock, flags);
2338 __func__, chan->ic_task, ctx);
2343 empty_done_q(chan);
2349 __func__, chan->ic_task, run_count);
2369 struct ipu_image_convert_chan *chan = ctx->chan;
2370 struct ipu_image_convert_priv *priv = chan->priv;
2378 chan->ic_task, ctx);
2380 spin_lock_irqsave(&chan->irqlock, flags);
2384 put_res = list_empty(&chan->ctx_list);
2386 spin_unlock_irqrestore(&chan->irqlock, flags);
2389 release_ipu_resources(chan);
2487 struct ipu_image_convert_chan *chan = &priv->chan[i];
2489 chan->ic_task = i;
2490 chan->priv = priv;
2491 chan->dma_ch = &image_convert_dma_chan[i];
2492 chan->in_eof_irq = -1;
2493 chan->rot_in_eof_irq = -1;
2494 chan->out_eof_irq = -1;
2495 chan->rot_out_eof_irq = -1;
2497 spin_lock_init(&chan->irqlock);
2498 INIT_LIST_HEAD(&chan->ctx_list);
2499 INIT_LIST_HEAD(&chan->pending_q);
2500 INIT_LIST_HEAD(&chan->done_q);