Lines Matching refs:qmc

10 #include <soc/fsl/qe/qmc.h>
177 struct qmc *qmc;
203 struct qmc {
263 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &tsa_info);
290 qmc_write16(chan->qmc->scc_pram + QMC_GBL_MRBLR,
557 dev_err(chan->qmc->dev, "chan %u: Send STOP RECEIVE failed (%d)\n",
579 dev_err(chan->qmc->dev, "chan %u: Send STOP TRANSMIT failed (%d)\n",
740 static int qmc_check_chans(struct qmc *qmc)
752 ret = tsa_serial_get_info(qmc->tsa_serial, &info);
757 dev_err(qmc->dev, "Number of TSA Tx/Rx TS assigned not supported\n");
767 dev_err(qmc->dev, "Number of TSA Tx/Rx TS assigned are not equal\n");
776 list_for_each_entry(chan, &qmc->chan_head, list) {
778 dev_err(qmc->dev, "chan %u uses TSA unassigned Tx TS\n", chan->id);
782 dev_err(qmc->dev, "chan %u uses an already used Tx TS\n", chan->id);
787 dev_err(qmc->dev, "chan %u uses TSA unassigned Rx TS\n", chan->id);
791 dev_err(qmc->dev, "chan %u uses an already used Rx TS\n", chan->id);
796 dev_err(qmc->dev, "chan %u uses different Rx and Tx TS\n", chan->id);
807 static unsigned int qmc_nb_chans(struct qmc *qmc)
812 list_for_each_entry(chan, &qmc->chan_head, list)
818 static int qmc_of_parse_chans(struct qmc *qmc, struct device_node *np)
830 dev_err(qmc->dev, "%pOF: failed to read reg\n", chan_np);
835 dev_err(qmc->dev, "%pOF: Invalid chan_id\n", chan_np);
840 chan = devm_kzalloc(qmc->dev, sizeof(*chan), GFP_KERNEL);
852 dev_err(qmc->dev, "%pOF: failed to read fsl,tx-ts-mask\n",
861 dev_err(qmc->dev, "%pOF: failed to read fsl,rx-ts-mask\n",
871 dev_err(qmc->dev, "%pOF: failed to read fsl,operational-mode\n",
881 dev_err(qmc->dev, "%pOF: Invalid fsl,operational-mode (%s)\n",
890 list_add_tail(&chan->list, &qmc->chan_head);
891 qmc->chans[chan->id] = chan;
894 return qmc_check_chans(qmc);
897 static int qmc_setup_tsa_64rxtx(struct qmc *qmc, const struct tsa_serial_info *info)
911 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 0x0000);
914 list_for_each_entry(chan, &qmc->chan_head, list) {
921 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), val);
926 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATRX + ((info->nb_rx_ts - 1) * 2),
930 val = qmc->scc_pram_offset + QMC_GBL_TSATRX;
931 qmc_write16(qmc->scc_pram + QMC_GBL_RX_S_PTR, val);
932 qmc_write16(qmc->scc_pram + QMC_GBL_RXPTR, val);
933 qmc_write16(qmc->scc_pram + QMC_GBL_TX_S_PTR, val);
934 qmc_write16(qmc->scc_pram + QMC_GBL_TXPTR, val);
939 static int qmc_setup_tsa_32rx_32tx(struct qmc *qmc, const struct tsa_serial_info *info)
952 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 0x0000);
953 qmc_write16(qmc->scc_pram + QMC_GBL_TSATTX + (i * 2), 0x0000);
957 list_for_each_entry(chan, &qmc->chan_head, list) {
965 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), val);
974 qmc_write16(qmc->scc_pram + QMC_GBL_TSATTX + (i * 2), val);
979 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATRX + ((info->nb_rx_ts - 1) * 2),
981 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATTX + ((info->nb_tx_ts - 1) * 2),
985 val = qmc->scc_pram_offset + QMC_GBL_TSATRX;
986 qmc_write16(qmc->scc_pram + QMC_GBL_RX_S_PTR, val);
987 qmc_write16(qmc->scc_pram + QMC_GBL_RXPTR, val);
990 val = qmc->scc_pram_offset + QMC_GBL_TSATTX;
991 qmc_write16(qmc->scc_pram + QMC_GBL_TX_S_PTR, val);
992 qmc_write16(qmc->scc_pram + QMC_GBL_TXPTR, val);
997 static int qmc_setup_tsa(struct qmc *qmc)
1003 ret = tsa_serial_get_info(qmc->tsa_serial, &info);
1012 qmc_setup_tsa_64rxtx(qmc, &info) :
1013 qmc_setup_tsa_32rx_32tx(qmc, &info);
1016 static int qmc_setup_chan_trnsync(struct qmc *qmc, struct qmc_chan *chan)
1024 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &info);
1042 dev_dbg(qmc->dev, "chan %u: trnsync=0x%04x, rx %u/%u 0x%llx, tx %u/%u 0x%llx\n",
1050 static int qmc_setup_chan(struct qmc *qmc, struct qmc_chan *chan)
1057 chan->qmc = qmc;
1060 chan->s_param = qmc->dpram + (chan->id * 64);
1062 chan->txbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS));
1063 chan->rxbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)) + QMC_NB_TXBDS;
1089 ret = qmc_setup_chan_trnsync(qmc, chan);
1127 static int qmc_setup_chans(struct qmc *qmc)
1132 list_for_each_entry(chan, &qmc->chan_head, list) {
1133 ret = qmc_setup_chan(qmc, chan);
1141 static int qmc_finalize_chans(struct qmc *qmc)
1146 list_for_each_entry(chan, &qmc->chan_head, list) {
1168 static int qmc_setup_ints(struct qmc *qmc)
1174 for (i = 0; i < (qmc->int_size / sizeof(u16)); i++)
1175 qmc_write16(qmc->int_table + i, 0x0000);
1178 if (qmc->int_size >= sizeof(u16)) {
1179 last = qmc->int_table + (qmc->int_size / sizeof(u16)) - 1;
1186 static void qmc_irq_gint(struct qmc *qmc)
1193 int_entry = qmc_read16(qmc->int_curr);
1196 qmc_write16(qmc->int_curr, int_entry & QMC_INT_W);
1199 chan = qmc->chans[chan_id];
1201 dev_err(qmc->dev, "interrupt on invalid chan %u\n", chan_id);
1209 dev_info(qmc->dev, "intr chan %u, 0x%04x (UN)\n", chan_id,
1215 dev_info(qmc->dev, "intr chan %u, 0x%04x (BSY)\n", chan_id,
1238 qmc->int_curr = qmc->int_table;
1240 qmc->int_curr++;
1241 int_entry = qmc_read16(qmc->int_curr);
1247 struct qmc *qmc = (struct qmc *)priv;
1250 scce = qmc_read16(qmc->scc_regs + SCC_SCCE);
1251 qmc_write16(qmc->scc_regs + SCC_SCCE, scce);
1254 dev_info(qmc->dev, "IRQ queue overflow\n");
1257 dev_err(qmc->dev, "Global transmitter underrun\n");
1260 dev_err(qmc->dev, "Global receiver overrun\n");
1264 qmc_irq_gint(qmc);
1274 struct qmc *qmc;
1278 qmc = devm_kzalloc(&pdev->dev, sizeof(*qmc), GFP_KERNEL);
1279 if (!qmc)
1282 qmc->dev = &pdev->dev;
1283 INIT_LIST_HEAD(&qmc->chan_head);
1285 qmc->scc_regs = devm_platform_ioremap_resource_byname(pdev, "scc_regs");
1286 if (IS_ERR(qmc->scc_regs))
1287 return PTR_ERR(qmc->scc_regs);
1293 qmc->scc_pram_offset = res->start - get_immrbase();
1294 qmc->scc_pram = devm_ioremap_resource(qmc->dev, res);
1295 if (IS_ERR(qmc->scc_pram))
1296 return PTR_ERR(qmc->scc_pram);
1298 qmc->dpram = devm_platform_ioremap_resource_byname(pdev, "dpram");
1299 if (IS_ERR(qmc->dpram))
1300 return PTR_ERR(qmc->dpram);
1302 qmc->tsa_serial = devm_tsa_serial_get_byphandle(qmc->dev, np, "fsl,tsa-serial");
1303 if (IS_ERR(qmc->tsa_serial)) {
1304 return dev_err_probe(qmc->dev, PTR_ERR(qmc->tsa_serial),
1309 ret = tsa_serial_connect(qmc->tsa_serial);
1311 dev_err(qmc->dev, "Failed to connect TSA serial\n");
1316 ret = qmc_of_parse_chans(qmc, np);
1320 nb_chans = qmc_nb_chans(qmc);
1323 qmc_write32(qmc->scc_regs + SCC_GSMRH,
1327 qmc_write32(qmc->scc_regs + SCC_GSMRL, SCC_GSMRL_MODE_QMC);
1333 qmc->bd_size = (nb_chans * (QMC_NB_TXBDS + QMC_NB_RXBDS)) * sizeof(cbd_t);
1334 qmc->bd_table = dmam_alloc_coherent(qmc->dev, qmc->bd_size,
1335 &qmc->bd_dma_addr, GFP_KERNEL);
1336 if (!qmc->bd_table) {
1337 dev_err(qmc->dev, "Failed to allocate bd table\n");
1341 memset(qmc->bd_table, 0, qmc->bd_size);
1343 qmc_write32(qmc->scc_pram + QMC_GBL_MCBASE, qmc->bd_dma_addr);
1346 qmc->int_size = QMC_NB_INTS * sizeof(u16);
1347 qmc->int_table = dmam_alloc_coherent(qmc->dev, qmc->int_size,
1348 &qmc->int_dma_addr, GFP_KERNEL);
1349 if (!qmc->int_table) {
1350 dev_err(qmc->dev, "Failed to allocate interrupt table\n");
1354 memset(qmc->int_table, 0, qmc->int_size);
1356 qmc->int_curr = qmc->int_table;
1357 qmc_write32(qmc->scc_pram + QMC_GBL_INTBASE, qmc->int_dma_addr);
1358 qmc_write32(qmc->scc_pram + QMC_GBL_INTPTR, qmc->int_dma_addr);
1361 qmc_write16(qmc->scc_pram + QMC_GBL_MRBLR, HDLC_MAX_MRU + 4);
1363 qmc_write16(qmc->scc_pram + QMC_GBL_GRFTHR, 1);
1364 qmc_write16(qmc->scc_pram + QMC_GBL_GRFCNT, 1);
1366 qmc_write32(qmc->scc_pram + QMC_GBL_C_MASK32, 0xDEBB20E3);
1367 qmc_write16(qmc->scc_pram + QMC_GBL_C_MASK16, 0xF0B8);
1369 ret = qmc_setup_tsa(qmc);
1373 qmc_write16(qmc->scc_pram + QMC_GBL_QMCSTATE, 0x8000);
1375 ret = qmc_setup_chans(qmc);
1380 ret = qmc_setup_ints(qmc);
1385 qmc_write16(qmc->scc_regs + SCC_SCCM, 0x0000);
1386 qmc_write16(qmc->scc_regs + SCC_SCCE, 0x000F);
1390 ret = devm_request_irq(qmc->dev, irq, qmc_irq_handler, 0, "qmc", qmc);
1395 qmc_write16(qmc->scc_regs + SCC_SCCM,
1398 ret = qmc_finalize_chans(qmc);
1403 qmc_setbits32(qmc->scc_regs + SCC_GSMRL, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
1405 platform_set_drvdata(pdev, qmc);
1410 qmc_write16(qmc->scc_regs + SCC_SCCM, 0);
1413 tsa_serial_disconnect(qmc->tsa_serial);
1419 struct qmc *qmc = platform_get_drvdata(pdev);
1422 qmc_setbits32(qmc->scc_regs + SCC_GSMRL, 0);
1425 qmc_write16(qmc->scc_regs + SCC_SCCM, 0);
1428 tsa_serial_disconnect(qmc->tsa_serial);
1434 { .compatible = "fsl,cpm1-scc-qmc" },
1441 .name = "fsl-qmc",
1454 struct qmc *qmc;
1472 qmc = platform_get_drvdata(pdev);
1473 if (!qmc) {
1483 if (out_args.args[0] >= ARRAY_SIZE(qmc->chans)) {
1488 qmc_chan = qmc->chans[out_args.args[0]];
1500 put_device(chan->qmc->dev);