• Home
  • Raw
  • Download

Lines Matching refs:chan

257 int qmc_chan_get_info(struct qmc_chan *chan, struct qmc_chan_info *info)  in qmc_chan_get_info()  argument
263 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &tsa_info); in qmc_chan_get_info()
267 info->mode = chan->mode; in qmc_chan_get_info()
270 info->nb_tx_ts = hweight64(chan->tx_ts_mask); in qmc_chan_get_info()
273 info->nb_rx_ts = hweight64(chan->rx_ts_mask); in qmc_chan_get_info()
279 int qmc_chan_set_param(struct qmc_chan *chan, const struct qmc_chan_param *param) in qmc_chan_set_param() argument
281 if (param->mode != chan->mode) in qmc_chan_set_param()
290 qmc_write16(chan->qmc->scc_pram + QMC_GBL_MRBLR, in qmc_chan_set_param()
292 qmc_write16(chan->s_param + QMC_SPE_MFLR, in qmc_chan_set_param()
295 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, in qmc_chan_set_param()
298 qmc_clrbits16(chan->s_param + QMC_SPE_CHAMR, in qmc_chan_set_param()
304 qmc_write16(chan->s_param + QMC_SPE_TMRBLR, in qmc_chan_set_param()
316 int qmc_chan_write_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, in qmc_chan_write_submit() argument
333 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_write_submit()
334 bd = chan->txbd_free; in qmc_chan_write_submit()
346 xfer_desc = &chan->tx_desc[bd - chan->txbds]; in qmc_chan_write_submit()
355 if (!chan->is_tx_stopped) in qmc_chan_write_submit()
356 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_POL); in qmc_chan_write_submit()
359 chan->txbd_free = chan->txbds; in qmc_chan_write_submit()
361 chan->txbd_free++; in qmc_chan_write_submit()
366 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_write_submit()
371 static void qmc_chan_write_done(struct qmc_chan *chan) in qmc_chan_write_done() argument
388 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_write_done()
389 bd = chan->txbd_done; in qmc_chan_write_done()
396 xfer_desc = &chan->tx_desc[bd - chan->txbds]; in qmc_chan_write_done()
405 chan->txbd_done = chan->txbds; in qmc_chan_write_done()
407 chan->txbd_done++; in qmc_chan_write_done()
410 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_write_done()
412 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_write_done()
415 bd = chan->txbd_done; in qmc_chan_write_done()
420 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_write_done()
423 int qmc_chan_read_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, in qmc_chan_read_submit() argument
440 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_read_submit()
441 bd = chan->rxbd_free; in qmc_chan_read_submit()
453 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; in qmc_chan_read_submit()
463 if (chan->is_rx_halted && !chan->is_rx_stopped) { in qmc_chan_read_submit()
465 if (chan->mode == QMC_TRANSPARENT) in qmc_chan_read_submit()
466 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); in qmc_chan_read_submit()
468 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); in qmc_chan_read_submit()
469 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); in qmc_chan_read_submit()
470 chan->is_rx_halted = false; in qmc_chan_read_submit()
472 chan->rx_pending++; in qmc_chan_read_submit()
475 chan->rxbd_free = chan->rxbds; in qmc_chan_read_submit()
477 chan->rxbd_free++; in qmc_chan_read_submit()
481 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_read_submit()
486 static void qmc_chan_read_done(struct qmc_chan *chan) in qmc_chan_read_done() argument
504 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_read_done()
505 bd = chan->rxbd_done; in qmc_chan_read_done()
512 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; in qmc_chan_read_done()
522 chan->rxbd_done = chan->rxbds; in qmc_chan_read_done()
524 chan->rxbd_done++; in qmc_chan_read_done()
526 chan->rx_pending--; in qmc_chan_read_done()
529 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_read_done()
531 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_read_done()
534 bd = chan->rxbd_done; in qmc_chan_read_done()
539 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_read_done()
542 static int qmc_chan_command(struct qmc_chan *chan, u8 qmc_opcode) in qmc_chan_command() argument
544 return cpm_command(chan->id << 2, (qmc_opcode << 4) | 0x0E); in qmc_chan_command()
547 static int qmc_chan_stop_rx(struct qmc_chan *chan) in qmc_chan_stop_rx() argument
552 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_stop_rx()
555 ret = qmc_chan_command(chan, 0x0); in qmc_chan_stop_rx()
557 dev_err(chan->qmc->dev, "chan %u: Send STOP RECEIVE failed (%d)\n", in qmc_chan_stop_rx()
558 chan->id, ret); in qmc_chan_stop_rx()
562 chan->is_rx_stopped = true; in qmc_chan_stop_rx()
565 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_stop_rx()
569 static int qmc_chan_stop_tx(struct qmc_chan *chan) in qmc_chan_stop_tx() argument
574 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_stop_tx()
577 ret = qmc_chan_command(chan, 0x1); in qmc_chan_stop_tx()
579 dev_err(chan->qmc->dev, "chan %u: Send STOP TRANSMIT failed (%d)\n", in qmc_chan_stop_tx()
580 chan->id, ret); in qmc_chan_stop_tx()
584 chan->is_tx_stopped = true; in qmc_chan_stop_tx()
587 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_stop_tx()
591 int qmc_chan_stop(struct qmc_chan *chan, int direction) in qmc_chan_stop() argument
596 ret = qmc_chan_stop_rx(chan); in qmc_chan_stop()
602 ret = qmc_chan_stop_tx(chan); in qmc_chan_stop()
611 static void qmc_chan_start_rx(struct qmc_chan *chan) in qmc_chan_start_rx() argument
615 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_start_rx()
618 if (chan->mode == QMC_TRANSPARENT) in qmc_chan_start_rx()
619 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); in qmc_chan_start_rx()
621 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); in qmc_chan_start_rx()
622 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); in qmc_chan_start_rx()
623 chan->is_rx_halted = false; in qmc_chan_start_rx()
625 chan->is_rx_stopped = false; in qmc_chan_start_rx()
627 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_start_rx()
630 static void qmc_chan_start_tx(struct qmc_chan *chan) in qmc_chan_start_tx() argument
634 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_start_tx()
640 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_ENT); in qmc_chan_start_tx()
643 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_POL); in qmc_chan_start_tx()
645 chan->is_tx_stopped = false; in qmc_chan_start_tx()
647 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_start_tx()
650 int qmc_chan_start(struct qmc_chan *chan, int direction) in qmc_chan_start() argument
653 qmc_chan_start_rx(chan); in qmc_chan_start()
656 qmc_chan_start_tx(chan); in qmc_chan_start()
662 static void qmc_chan_reset_rx(struct qmc_chan *chan) in qmc_chan_reset_rx() argument
669 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_chan_reset_rx()
670 bd = chan->rxbds; in qmc_chan_reset_rx()
675 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; in qmc_chan_reset_rx()
682 chan->rxbd_free = chan->rxbds; in qmc_chan_reset_rx()
683 chan->rxbd_done = chan->rxbds; in qmc_chan_reset_rx()
684 qmc_write16(chan->s_param + QMC_SPE_RBPTR, in qmc_chan_reset_rx()
685 qmc_read16(chan->s_param + QMC_SPE_RBASE)); in qmc_chan_reset_rx()
687 chan->rx_pending = 0; in qmc_chan_reset_rx()
689 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_chan_reset_rx()
692 static void qmc_chan_reset_tx(struct qmc_chan *chan) in qmc_chan_reset_tx() argument
699 spin_lock_irqsave(&chan->tx_lock, flags); in qmc_chan_reset_tx()
702 qmc_clrbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_ENT); in qmc_chan_reset_tx()
704 bd = chan->txbds; in qmc_chan_reset_tx()
709 xfer_desc = &chan->tx_desc[bd - chan->txbds]; in qmc_chan_reset_tx()
716 chan->txbd_free = chan->txbds; in qmc_chan_reset_tx()
717 chan->txbd_done = chan->txbds; in qmc_chan_reset_tx()
718 qmc_write16(chan->s_param + QMC_SPE_TBPTR, in qmc_chan_reset_tx()
719 qmc_read16(chan->s_param + QMC_SPE_TBASE)); in qmc_chan_reset_tx()
722 qmc_write32(chan->s_param + QMC_SPE_TSTATE, 0x30000000); in qmc_chan_reset_tx()
723 qmc_write32(chan->s_param + QMC_SPE_ZISTATE, 0x00000100); in qmc_chan_reset_tx()
725 spin_unlock_irqrestore(&chan->tx_lock, flags); in qmc_chan_reset_tx()
728 int qmc_chan_reset(struct qmc_chan *chan, int direction) in qmc_chan_reset() argument
731 qmc_chan_reset_rx(chan); in qmc_chan_reset()
734 qmc_chan_reset_tx(chan); in qmc_chan_reset()
744 struct qmc_chan *chan; in qmc_check_chans() local
776 list_for_each_entry(chan, &qmc->chan_head, list) { in qmc_check_chans()
777 if (chan->tx_ts_mask > tx_ts_assigned_mask) { in qmc_check_chans()
778 dev_err(qmc->dev, "chan %u uses TSA unassigned Tx TS\n", chan->id); in qmc_check_chans()
781 if (tx_ts_mask & chan->tx_ts_mask) { in qmc_check_chans()
782 dev_err(qmc->dev, "chan %u uses an already used Tx TS\n", chan->id); in qmc_check_chans()
786 if (chan->rx_ts_mask > rx_ts_assigned_mask) { in qmc_check_chans()
787 dev_err(qmc->dev, "chan %u uses TSA unassigned Rx TS\n", chan->id); in qmc_check_chans()
790 if (rx_ts_mask & chan->rx_ts_mask) { in qmc_check_chans()
791 dev_err(qmc->dev, "chan %u uses an already used Rx TS\n", chan->id); in qmc_check_chans()
795 if (is_one_table && (chan->tx_ts_mask != chan->rx_ts_mask)) { in qmc_check_chans()
796 dev_err(qmc->dev, "chan %u uses different Rx and Tx TS\n", chan->id); in qmc_check_chans()
800 tx_ts_mask |= chan->tx_ts_mask; in qmc_check_chans()
801 rx_ts_mask |= chan->rx_ts_mask; in qmc_check_chans()
810 struct qmc_chan *chan; in qmc_nb_chans() local
812 list_for_each_entry(chan, &qmc->chan_head, list) in qmc_nb_chans()
821 struct qmc_chan *chan; in qmc_of_parse_chans() local
840 chan = devm_kzalloc(qmc->dev, sizeof(*chan), GFP_KERNEL); in qmc_of_parse_chans()
841 if (!chan) { in qmc_of_parse_chans()
846 chan->id = chan_id; in qmc_of_parse_chans()
847 spin_lock_init(&chan->rx_lock); in qmc_of_parse_chans()
848 spin_lock_init(&chan->tx_lock); in qmc_of_parse_chans()
857 chan->tx_ts_mask = ts_mask; in qmc_of_parse_chans()
866 chan->rx_ts_mask = ts_mask; in qmc_of_parse_chans()
877 chan->mode = QMC_TRANSPARENT; in qmc_of_parse_chans()
879 chan->mode = QMC_HDLC; in qmc_of_parse_chans()
887 chan->is_reverse_data = of_property_read_bool(chan_np, in qmc_of_parse_chans()
890 list_add_tail(&chan->list, &qmc->chan_head); in qmc_of_parse_chans()
891 qmc->chans[chan->id] = chan; in qmc_of_parse_chans()
899 struct qmc_chan *chan; in qmc_setup_tsa_64rxtx() local
914 list_for_each_entry(chan, &qmc->chan_head, list) { in qmc_setup_tsa_64rxtx()
916 if (!(chan->rx_ts_mask & (((u64)1) << i))) in qmc_setup_tsa_64rxtx()
920 QMC_TSA_CHANNEL(chan->id); in qmc_setup_tsa_64rxtx()
941 struct qmc_chan *chan; in qmc_setup_tsa_32rx_32tx() local
957 list_for_each_entry(chan, &qmc->chan_head, list) { in qmc_setup_tsa_32rx_32tx()
960 if (!(chan->rx_ts_mask & (((u64)1) << i))) in qmc_setup_tsa_32rx_32tx()
964 QMC_TSA_CHANNEL(chan->id); in qmc_setup_tsa_32rx_32tx()
969 if (!(chan->tx_ts_mask & (((u64)1) << i))) in qmc_setup_tsa_32rx_32tx()
973 QMC_TSA_CHANNEL(chan->id); in qmc_setup_tsa_32rx_32tx()
1016 static int qmc_setup_chan_trnsync(struct qmc *qmc, struct qmc_chan *chan) in qmc_setup_chan_trnsync() argument
1024 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &info); in qmc_setup_chan_trnsync()
1029 first_rx = chan->rx_ts_mask ? __ffs64(chan->rx_ts_mask) + 1 : 0; in qmc_setup_chan_trnsync()
1032 last_tx = fls64(chan->tx_ts_mask); in qmc_setup_chan_trnsync()
1040 qmc_write16(chan->s_param + QMC_SPE_TRNSYNC, trnsync); in qmc_setup_chan_trnsync()
1043 chan->id, trnsync, in qmc_setup_chan_trnsync()
1044 first_rx, info.nb_rx_ts, chan->rx_ts_mask, in qmc_setup_chan_trnsync()
1045 last_tx, info.nb_tx_ts, chan->tx_ts_mask); in qmc_setup_chan_trnsync()
1050 static int qmc_setup_chan(struct qmc *qmc, struct qmc_chan *chan) in qmc_setup_chan() argument
1057 chan->qmc = qmc; in qmc_setup_chan()
1060 chan->s_param = qmc->dpram + (chan->id * 64); in qmc_setup_chan()
1062 chan->txbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)); in qmc_setup_chan()
1063 chan->rxbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)) + QMC_NB_TXBDS; in qmc_setup_chan()
1065 chan->txbd_free = chan->txbds; in qmc_setup_chan()
1066 chan->txbd_done = chan->txbds; in qmc_setup_chan()
1067 chan->rxbd_free = chan->rxbds; in qmc_setup_chan()
1068 chan->rxbd_done = chan->rxbds; in qmc_setup_chan()
1071 val = chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS) * sizeof(cbd_t); in qmc_setup_chan()
1072 qmc_write16(chan->s_param + QMC_SPE_TBASE, val); in qmc_setup_chan()
1073 qmc_write16(chan->s_param + QMC_SPE_TBPTR, val); in qmc_setup_chan()
1076 val = ((chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)) + QMC_NB_TXBDS) * sizeof(cbd_t); in qmc_setup_chan()
1077 qmc_write16(chan->s_param + QMC_SPE_RBASE, val); in qmc_setup_chan()
1078 qmc_write16(chan->s_param + QMC_SPE_RBPTR, val); in qmc_setup_chan()
1079 qmc_write32(chan->s_param + QMC_SPE_TSTATE, 0x30000000); in qmc_setup_chan()
1080 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); in qmc_setup_chan()
1081 qmc_write32(chan->s_param + QMC_SPE_ZISTATE, 0x00000100); in qmc_setup_chan()
1082 if (chan->mode == QMC_TRANSPARENT) { in qmc_setup_chan()
1083 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); in qmc_setup_chan()
1084 qmc_write16(chan->s_param + QMC_SPE_TMRBLR, 60); in qmc_setup_chan()
1086 if (chan->is_reverse_data) in qmc_setup_chan()
1088 qmc_write16(chan->s_param + QMC_SPE_CHAMR, val); in qmc_setup_chan()
1089 ret = qmc_setup_chan_trnsync(qmc, chan); in qmc_setup_chan()
1093 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); in qmc_setup_chan()
1094 qmc_write16(chan->s_param + QMC_SPE_MFLR, 60); in qmc_setup_chan()
1095 qmc_write16(chan->s_param + QMC_SPE_CHAMR, in qmc_setup_chan()
1100 qmc_write16(chan->s_param + QMC_SPE_INTMSK, 0x0000); in qmc_setup_chan()
1106 bd = chan->rxbds + i; in qmc_setup_chan()
1109 bd = chan->rxbds + QMC_NB_RXBDS - 1; in qmc_setup_chan()
1115 if (chan->mode == QMC_HDLC) in qmc_setup_chan()
1118 bd = chan->txbds + i; in qmc_setup_chan()
1121 bd = chan->txbds + QMC_NB_TXBDS - 1; in qmc_setup_chan()
1129 struct qmc_chan *chan; in qmc_setup_chans() local
1132 list_for_each_entry(chan, &qmc->chan_head, list) { in qmc_setup_chans()
1133 ret = qmc_setup_chan(qmc, chan); in qmc_setup_chans()
1143 struct qmc_chan *chan; in qmc_finalize_chans() local
1146 list_for_each_entry(chan, &qmc->chan_head, list) { in qmc_finalize_chans()
1148 if (chan->mode == QMC_HDLC) { in qmc_finalize_chans()
1149 qmc_write16(chan->s_param + QMC_SPE_INTMSK, in qmc_finalize_chans()
1154 qmc_write16(chan->s_param + QMC_SPE_INTMSK, in qmc_finalize_chans()
1160 ret = qmc_chan_stop(chan, QMC_CHAN_ALL); in qmc_finalize_chans()
1188 struct qmc_chan *chan; in qmc_irq_gint() local
1199 chan = qmc->chans[chan_id]; in qmc_irq_gint()
1200 if (!chan) { in qmc_irq_gint()
1206 qmc_chan_write_done(chan); in qmc_irq_gint()
1211 chan->nb_tx_underrun++; in qmc_irq_gint()
1217 chan->nb_rx_busy++; in qmc_irq_gint()
1219 spin_lock_irqsave(&chan->rx_lock, flags); in qmc_irq_gint()
1220 if (chan->rx_pending && !chan->is_rx_stopped) { in qmc_irq_gint()
1221 if (chan->mode == QMC_TRANSPARENT) in qmc_irq_gint()
1222 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); in qmc_irq_gint()
1224 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); in qmc_irq_gint()
1225 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); in qmc_irq_gint()
1226 chan->is_rx_halted = false; in qmc_irq_gint()
1228 chan->is_rx_halted = true; in qmc_irq_gint()
1230 spin_unlock_irqrestore(&chan->rx_lock, flags); in qmc_irq_gint()
1234 qmc_chan_read_done(chan); in qmc_irq_gint()
1498 void qmc_chan_put(struct qmc_chan *chan) in qmc_chan_put() argument
1500 put_device(chan->qmc->dev); in qmc_chan_put()