Lines Matching defs:ichan

30 static int ipu_disable_channel(struct idmac *idmac, struct idmac_channel *ichan,
36 * struct ipu *ipu = to_ipu(to_idmac(ichan->dma_chan.device));
599 * @ichan: IDMAC channel.
602 static int ipu_enable_channel(struct idmac *idmac, struct idmac_channel *ichan)
605 enum ipu_channel channel = ichan->dma_chan.chan_id;
613 ichan->active_buffer = 0;
614 ichan->status = IPU_CHANNEL_ENABLED;
637 * @ichan: IDMAC channel.
650 static int ipu_init_channel_buffer(struct idmac_channel *ichan,
657 enum ipu_channel channel = ichan->dma_chan.chan_id;
658 struct idmac *idmac = to_idmac(ichan->dma_chan.device);
698 ichan->status = IPU_CHANNEL_READY;
723 * @ichan: IDMAC channel.
728 /* Called under spin_lock(_irqsave)(&ichan->lock) */
729 static void ipu_update_channel_buffer(struct idmac_channel *ichan,
732 enum ipu_channel channel = ichan->dma_chan.chan_id;
742 ichan->status = IPU_CHANNEL_READY;
753 ichan->status = IPU_CHANNEL_READY;
772 /* Called under spin_lock_irqsave(&ichan->lock) */
773 static int ipu_submit_buffer(struct idmac_channel *ichan,
776 unsigned int chan_id = ichan->dma_chan.chan_id;
777 struct device *dev = &ichan->dma_chan.dev->device;
788 ipu_update_channel_buffer(ichan, buf_idx, sg_dma_address(sg));
797 /* Called under spin_lock_irqsave(&ichan->lock) */
798 static int ipu_submit_channel_buffers(struct idmac_channel *ichan,
805 if (!ichan->sg[i]) {
806 ichan->sg[i] = sg;
808 ret = ipu_submit_buffer(ichan, desc, sg, i);
822 struct idmac_channel *ichan = to_idmac_chan(tx->chan);
825 struct device *dev = &ichan->dma_chan.dev->device;
837 mutex_lock(&ichan->chan_mutex);
841 if (ichan->status < IPU_CHANNEL_READY) {
842 struct idmac_video_param *video = &ichan->params.video;
850 WARN_ON(ichan->sg[0] || ichan->sg[1]);
852 cookie = ipu_init_channel_buffer(ichan,
868 /* ipu->lock can be taken under ichan->lock, but not v.v. */
869 spin_lock_irqsave(&ichan->lock, flags);
871 list_add_tail(&desc->list, &ichan->queue);
873 ret = ipu_submit_channel_buffers(ichan, desc);
875 spin_unlock_irqrestore(&ichan->lock, flags);
882 if (ichan->status < IPU_CHANNEL_ENABLED) {
883 ret = ipu_enable_channel(idmac, ichan);
894 spin_lock_irqsave(&ichan->lock, flags);
896 spin_unlock_irqrestore(&ichan->lock, flags);
898 ichan->dma_chan.cookie = cookie;
902 mutex_unlock(&ichan->chan_mutex);
907 /* Called with ichan->chan_mutex held */
908 static int idmac_desc_alloc(struct idmac_channel *ichan, int n)
912 struct idmac *idmac = to_idmac(ichan->dma_chan.device);
920 ichan->n_tx_desc = n;
921 ichan->desc = desc;
922 INIT_LIST_HEAD(&ichan->queue);
923 INIT_LIST_HEAD(&ichan->free_list);
929 dma_async_tx_descriptor_init(txd, &ichan->dma_chan);
932 list_add(&desc->list, &ichan->free_list);
945 * @ichan: pointer to the channel object.
948 static int ipu_init_channel(struct idmac *idmac, struct idmac_channel *ichan)
950 union ipu_channel_param *params = &ichan->params;
952 enum ipu_channel channel = ichan->dma_chan.chan_id;
994 if (n_desc && !ichan->desc)
995 ret = idmac_desc_alloc(ichan, n_desc);
1005 * @ichan: pointer to the channel object.
1007 static void ipu_uninit_channel(struct idmac *idmac, struct idmac_channel *ichan)
1009 enum ipu_channel channel = ichan->dma_chan.chan_id;
1029 ichan->sec_chan_en = false;
1056 ichan->n_tx_desc = 0;
1057 vfree(ichan->desc);
1058 ichan->desc = NULL;
1064 * @ichan: channel object pointer.
1069 static int ipu_disable_channel(struct idmac *idmac, struct idmac_channel *ichan,
1072 enum ipu_channel channel = ichan->dma_chan.chan_id;
1105 timeout && !ipu_irq_status(ichan->eof_irq); timeout--)
1123 static struct scatterlist *idmac_sg_next(struct idmac_channel *ichan,
1132 if ((*desc)->list.next == &ichan->queue)
1155 struct idmac_channel *ichan = dev_id;
1156 struct device *dev = &ichan->dma_chan.dev->device;
1157 unsigned int chan_id = ichan->dma_chan.chan_id;
1168 dev_dbg(dev, "IDMAC irq %d, buf %d\n", irq, ichan->active_buffer);
1182 * ichan->sg[0] = ichan->sg[1] = NULL;
1194 spin_lock(&ichan->lock);
1195 if (unlikely((ichan->active_buffer && (ready1 >> chan_id) & 1) ||
1196 (!ichan->active_buffer && (ready0 >> chan_id) & 1)
1198 spin_unlock(&ichan->lock);
1202 ichan->active_buffer, ready0, ready1);
1206 if (unlikely(list_empty(&ichan->queue))) {
1207 ichan->sg[ichan->active_buffer] = NULL;
1208 spin_unlock(&ichan->lock);
1212 ichan->active_buffer, ready0, ready1);
1221 sg = &ichan->sg[ichan->active_buffer];
1222 sgnext = ichan->sg[!ichan->active_buffer];
1225 spin_unlock(&ichan->lock);
1229 desc = list_entry(ichan->queue.next, struct idmac_tx_desc, list);
1235 ichan->active_buffer, curbuf);
1238 sgnew = idmac_sg_next(ichan, &descnew, *sg);
1249 ichan->sg[!ichan->active_buffer] = sgnew;
1252 ipu_submit_buffer(ichan, descnew, sgnew, !ichan->active_buffer);
1257 ichan->status = IPU_CHANNEL_READY;
1263 sgnew = idmac_sg_next(ichan, &descnew, sgnew);
1277 ipu_submit_buffer(ichan, descnew, sgnew, ichan->active_buffer) < 0) {
1281 spin_unlock(&ichan->lock);
1284 spin_lock(&ichan->lock);
1288 ichan->active_buffer = !ichan->active_buffer;
1294 spin_unlock(&ichan->lock);
1308 struct idmac_channel *ichan = ipu->channel + i;
1314 for (j = 0; j < ichan->n_tx_desc; j++) {
1315 desc = ichan->desc + j;
1316 spin_lock_irqsave(&ichan->lock, flags);
1318 list_move(&desc->list, &ichan->free_list);
1320 if (ichan->sg[0] == sg)
1321 ichan->sg[0] = NULL;
1322 else if (ichan->sg[1] == sg)
1323 ichan->sg[1] = NULL;
1327 spin_unlock_irqrestore(&ichan->lock, flags);
1338 struct idmac_channel *ichan = to_idmac_chan(chan);
1353 mutex_lock(&ichan->chan_mutex);
1355 spin_lock_irqsave(&ichan->lock, flags);
1356 if (!list_empty(&ichan->free_list)) {
1357 desc = list_entry(ichan->free_list.next,
1367 spin_unlock_irqrestore(&ichan->lock, flags);
1369 mutex_unlock(&ichan->chan_mutex);
1379 struct idmac_channel *ichan = to_idmac_chan(chan);
1386 ipu_select_buffer(chan->chan_id, ichan->active_buffer);
1399 struct idmac_channel *ichan = to_idmac_chan(chan);
1405 mutex_lock(&ichan->chan_mutex);
1411 list_for_each_safe(list, tmp, &ichan->queue)
1414 ichan->sg[0] = NULL;
1415 ichan->sg[1] = NULL;
1419 ichan->status = IPU_CHANNEL_INITIALIZED;
1421 mutex_unlock(&ichan->chan_mutex);
1428 struct idmac_channel *ichan = to_idmac_chan(chan);
1434 ipu_disable_channel(idmac, ichan,
1435 ichan->status >= IPU_CHANNEL_ENABLED);
1439 /* ichan->queue is modified in ISR, have to spinlock */
1440 spin_lock_irqsave(&ichan->lock, flags);
1441 list_splice_init(&ichan->queue, &ichan->free_list);
1443 if (ichan->desc)
1444 for (i = 0; i < ichan->n_tx_desc; i++) {
1445 struct idmac_tx_desc *desc = ichan->desc + i;
1448 list_add(&desc->list, &ichan->free_list);
1453 ichan->sg[0] = NULL;
1454 ichan->sg[1] = NULL;
1455 spin_unlock_irqrestore(&ichan->lock, flags);
1459 ichan->status = IPU_CHANNEL_INITIALIZED;
1466 struct idmac_channel *ichan = to_idmac_chan(chan);
1469 mutex_lock(&ichan->chan_mutex);
1473 mutex_unlock(&ichan->chan_mutex);
1481 struct idmac_channel *ichan = dev_id;
1483 irq, ichan->dma_chan.chan_id);
1490 struct idmac_channel *ichan = dev_id;
1492 irq, ichan->dma_chan.chan_id);
1502 struct idmac_channel *ichan = to_idmac_chan(chan);
1508 WARN_ON(ichan->status != IPU_CHANNEL_FREE);
1516 ichan->eof_irq = ret;
1522 ipu_disable_channel(idmac, ichan, true);
1524 ret = ipu_init_channel(idmac, ichan);
1528 ret = request_irq(ichan->eof_irq, idmac_interrupt, 0,
1529 ichan->eof_name, ichan);
1537 ret = request_irq(ic_sof, ic_sof_irq, 0, "IC SOF", ichan);
1543 ret = request_irq(ic_eof, ic_eof_irq, 0, "IC EOF", ichan);
1550 ichan->status = IPU_CHANNEL_INITIALIZED;
1553 chan->chan_id, ichan->eof_irq);
1558 ipu_uninit_channel(idmac, ichan);
1567 struct idmac_channel *ichan = to_idmac_chan(chan);
1570 mutex_lock(&ichan->chan_mutex);
1574 if (ichan->status > IPU_CHANNEL_FREE) {
1578 free_irq(ic_sof, ichan);
1583 free_irq(ic_eof, ichan);
1589 free_irq(ichan->eof_irq, ichan);
1593 ichan->status = IPU_CHANNEL_FREE;
1595 ipu_uninit_channel(idmac, ichan);
1597 mutex_unlock(&ichan->chan_mutex);
1631 struct idmac_channel *ichan = ipu->channel + i;
1632 struct dma_chan *dma_chan = &ichan->dma_chan;
1634 spin_lock_init(&ichan->lock);
1635 mutex_init(&ichan->chan_mutex);
1637 ichan->status = IPU_CHANNEL_FREE;
1638 ichan->sec_chan_en = false;
1639 snprintf(ichan->eof_name, sizeof(ichan->eof_name), "IDMAC EOF %d", i);
1658 struct idmac_channel *ichan = ipu->channel + i;
1660 idmac_terminate_all(&ichan->dma_chan);