1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * QMC driver 4 * 5 * Copyright 2022 CS GROUP France 6 * 7 * Author: Herve Codina <herve.codina@bootlin.com> 8 */ 9 10 #include <soc/fsl/qe/qmc.h> 11 #include <linux/dma-mapping.h> 12 #include <linux/hdlc.h> 13 #include <linux/interrupt.h> 14 #include <linux/io.h> 15 #include <linux/module.h> 16 #include <linux/of.h> 17 #include <linux/of_platform.h> 18 #include <linux/platform_device.h> 19 #include <linux/slab.h> 20 #include <soc/fsl/cpm.h> 21 #include <sysdev/fsl_soc.h> 22 #include "tsa.h" 23 24 /* SCC general mode register high (32 bits) */ 25 #define SCC_GSMRL 0x00 26 #define SCC_GSMRL_ENR (1 << 5) 27 #define SCC_GSMRL_ENT (1 << 4) 28 #define SCC_GSMRL_MODE_QMC (0x0A << 0) 29 30 /* SCC general mode register low (32 bits) */ 31 #define SCC_GSMRH 0x04 32 #define SCC_GSMRH_CTSS (1 << 7) 33 #define SCC_GSMRH_CDS (1 << 8) 34 #define SCC_GSMRH_CTSP (1 << 9) 35 #define SCC_GSMRH_CDP (1 << 10) 36 37 /* SCC event register (16 bits) */ 38 #define SCC_SCCE 0x10 39 #define SCC_SCCE_IQOV (1 << 3) 40 #define SCC_SCCE_GINT (1 << 2) 41 #define SCC_SCCE_GUN (1 << 1) 42 #define SCC_SCCE_GOV (1 << 0) 43 44 /* SCC mask register (16 bits) */ 45 #define SCC_SCCM 0x14 46 /* Multichannel base pointer (32 bits) */ 47 #define QMC_GBL_MCBASE 0x00 48 /* Multichannel controller state (16 bits) */ 49 #define QMC_GBL_QMCSTATE 0x04 50 /* Maximum receive buffer length (16 bits) */ 51 #define QMC_GBL_MRBLR 0x06 52 /* Tx time-slot assignment table pointer (16 bits) */ 53 #define QMC_GBL_TX_S_PTR 0x08 54 /* Rx pointer (16 bits) */ 55 #define QMC_GBL_RXPTR 0x0A 56 /* Global receive frame threshold (16 bits) */ 57 #define QMC_GBL_GRFTHR 0x0C 58 /* Global receive frame count (16 bits) */ 59 #define QMC_GBL_GRFCNT 0x0E 60 /* Multichannel interrupt base address (32 bits) */ 61 #define QMC_GBL_INTBASE 0x10 62 /* Multichannel interrupt pointer (32 bits) */ 63 #define QMC_GBL_INTPTR 0x14 64 /* Rx time-slot assignment table pointer (16 bits) */ 65 #define QMC_GBL_RX_S_PTR 0x18 66 /* Tx pointer (16 bits) */ 67 #define QMC_GBL_TXPTR 0x1A 68 /* CRC constant (32 bits) */ 69 #define QMC_GBL_C_MASK32 0x1C 70 /* Time slot assignment table Rx (32 x 16 bits) */ 71 #define QMC_GBL_TSATRX 0x20 72 /* Time slot assignment table Tx (32 x 16 bits) */ 73 #define QMC_GBL_TSATTX 0x60 74 /* CRC constant (16 bits) */ 75 #define QMC_GBL_C_MASK16 0xA0 76 77 /* TSA entry (16bit entry in TSATRX and TSATTX) */ 78 #define QMC_TSA_VALID (1 << 15) 79 #define QMC_TSA_WRAP (1 << 14) 80 #define QMC_TSA_MASK (0x303F) 81 #define QMC_TSA_CHANNEL(x) ((x) << 6) 82 83 /* Tx buffer descriptor base address (16 bits, offset from MCBASE) */ 84 #define QMC_SPE_TBASE 0x00 85 86 /* Channel mode register (16 bits) */ 87 #define QMC_SPE_CHAMR 0x02 88 #define QMC_SPE_CHAMR_MODE_HDLC (1 << 15) 89 #define QMC_SPE_CHAMR_MODE_TRANSP ((0 << 15) | (1 << 13)) 90 #define QMC_SPE_CHAMR_ENT (1 << 12) 91 #define QMC_SPE_CHAMR_POL (1 << 8) 92 #define QMC_SPE_CHAMR_HDLC_IDLM (1 << 13) 93 #define QMC_SPE_CHAMR_HDLC_CRC (1 << 7) 94 #define QMC_SPE_CHAMR_HDLC_NOF (0x0f << 0) 95 #define QMC_SPE_CHAMR_TRANSP_RD (1 << 14) 96 #define QMC_SPE_CHAMR_TRANSP_SYNC (1 << 10) 97 98 /* Tx internal state (32 bits) */ 99 #define QMC_SPE_TSTATE 0x04 100 /* Tx buffer descriptor pointer (16 bits) */ 101 #define QMC_SPE_TBPTR 0x0C 102 /* Zero-insertion state (32 bits) */ 103 #define QMC_SPE_ZISTATE 0x14 104 /* Channel’s interrupt mask flags (16 bits) */ 105 #define QMC_SPE_INTMSK 0x1C 106 /* Rx buffer descriptor base address (16 bits, offset from MCBASE) */ 107 #define QMC_SPE_RBASE 0x20 108 /* HDLC: Maximum frame length register (16 bits) */ 109 #define QMC_SPE_MFLR 0x22 110 /* TRANSPARENT: Transparent maximum receive length (16 bits) */ 111 #define QMC_SPE_TMRBLR 0x22 112 /* Rx internal state (32 bits) */ 113 #define QMC_SPE_RSTATE 0x24 114 /* Rx buffer descriptor pointer (16 bits) */ 115 #define QMC_SPE_RBPTR 0x2C 116 /* Packs 4 bytes to 1 long word before writing to buffer (32 bits) */ 117 #define QMC_SPE_RPACK 0x30 118 /* Zero deletion state (32 bits) */ 119 #define QMC_SPE_ZDSTATE 0x34 120 121 /* Transparent synchronization (16 bits) */ 122 #define QMC_SPE_TRNSYNC 0x3C 123 #define QMC_SPE_TRNSYNC_RX(x) ((x) << 8) 124 #define QMC_SPE_TRNSYNC_TX(x) ((x) << 0) 125 126 /* Interrupt related registers bits */ 127 #define QMC_INT_V (1 << 15) 128 #define QMC_INT_W (1 << 14) 129 #define QMC_INT_NID (1 << 13) 130 #define QMC_INT_IDL (1 << 12) 131 #define QMC_INT_GET_CHANNEL(x) (((x) & 0x0FC0) >> 6) 132 #define QMC_INT_MRF (1 << 5) 133 #define QMC_INT_UN (1 << 4) 134 #define QMC_INT_RXF (1 << 3) 135 #define QMC_INT_BSY (1 << 2) 136 #define QMC_INT_TXB (1 << 1) 137 #define QMC_INT_RXB (1 << 0) 138 139 /* BD related registers bits */ 140 #define QMC_BD_RX_E (1 << 15) 141 #define QMC_BD_RX_W (1 << 13) 142 #define QMC_BD_RX_I (1 << 12) 143 #define QMC_BD_RX_L (1 << 11) 144 #define QMC_BD_RX_F (1 << 10) 145 #define QMC_BD_RX_CM (1 << 9) 146 #define QMC_BD_RX_UB (1 << 7) 147 #define QMC_BD_RX_LG (1 << 5) 148 #define QMC_BD_RX_NO (1 << 4) 149 #define QMC_BD_RX_AB (1 << 3) 150 #define QMC_BD_RX_CR (1 << 2) 151 152 #define QMC_BD_TX_R (1 << 15) 153 #define QMC_BD_TX_W (1 << 13) 154 #define QMC_BD_TX_I (1 << 12) 155 #define QMC_BD_TX_L (1 << 11) 156 #define QMC_BD_TX_TC (1 << 10) 157 #define QMC_BD_TX_CM (1 << 9) 158 #define QMC_BD_TX_UB (1 << 7) 159 #define QMC_BD_TX_PAD (0x0f << 0) 160 161 /* Numbers of BDs and interrupt items */ 162 #define QMC_NB_TXBDS 8 163 #define QMC_NB_RXBDS 8 164 #define QMC_NB_INTS 128 165 166 struct qmc_xfer_desc { 167 union { 168 void (*tx_complete)(void *context); 169 void (*rx_complete)(void *context, size_t length, unsigned int flags); 170 }; 171 void *context; 172 }; 173 174 struct qmc_chan { 175 struct list_head list; 176 unsigned int id; 177 struct qmc *qmc; 178 void __iomem *s_param; 179 enum qmc_mode mode; 180 spinlock_t ts_lock; /* Protect timeslots */ 181 u64 tx_ts_mask_avail; 182 u64 tx_ts_mask; 183 u64 rx_ts_mask_avail; 184 u64 rx_ts_mask; 185 bool is_reverse_data; 186 187 spinlock_t tx_lock; 188 cbd_t __iomem *txbds; 189 cbd_t __iomem *txbd_free; 190 cbd_t __iomem *txbd_done; 191 struct qmc_xfer_desc tx_desc[QMC_NB_TXBDS]; 192 u64 nb_tx_underrun; 193 bool is_tx_stopped; 194 195 spinlock_t rx_lock; 196 cbd_t __iomem *rxbds; 197 cbd_t __iomem *rxbd_free; 198 cbd_t __iomem *rxbd_done; 199 struct qmc_xfer_desc rx_desc[QMC_NB_RXBDS]; 200 u64 nb_rx_busy; 201 int rx_pending; 202 bool is_rx_halted; 203 bool is_rx_stopped; 204 }; 205 206 struct qmc { 207 struct device *dev; 208 struct tsa_serial *tsa_serial; 209 void __iomem *scc_regs; 210 void __iomem *scc_pram; 211 void __iomem *dpram; 212 u16 scc_pram_offset; 213 cbd_t __iomem *bd_table; 214 dma_addr_t bd_dma_addr; 215 size_t bd_size; 216 u16 __iomem *int_table; 217 u16 __iomem *int_curr; 218 dma_addr_t int_dma_addr; 219 size_t int_size; 220 bool is_tsa_64rxtx; 221 struct list_head chan_head; 222 struct qmc_chan *chans[64]; 223 }; 224 225 static void qmc_write16(void __iomem *addr, u16 val) 226 { 227 iowrite16be(val, addr); 228 } 229 230 static u16 qmc_read16(void __iomem *addr) 231 { 232 return ioread16be(addr); 233 } 234 235 static void qmc_setbits16(void __iomem *addr, u16 set) 236 { 237 qmc_write16(addr, qmc_read16(addr) | set); 238 } 239 240 static void qmc_clrbits16(void __iomem *addr, u16 clr) 241 { 242 qmc_write16(addr, qmc_read16(addr) & ~clr); 243 } 244 245 static void qmc_clrsetbits16(void __iomem *addr, u16 clr, u16 set) 246 { 247 qmc_write16(addr, (qmc_read16(addr) & ~clr) | set); 248 } 249 250 static void qmc_write32(void __iomem *addr, u32 val) 251 { 252 iowrite32be(val, addr); 253 } 254 255 static u32 qmc_read32(void __iomem *addr) 256 { 257 return ioread32be(addr); 258 } 259 260 static void qmc_setbits32(void __iomem *addr, u32 set) 261 { 262 qmc_write32(addr, qmc_read32(addr) | set); 263 } 264 265 266 int qmc_chan_get_info(struct qmc_chan *chan, struct qmc_chan_info *info) 267 { 268 struct tsa_serial_info tsa_info; 269 unsigned long flags; 270 int ret; 271 272 /* Retrieve info from the TSA related serial */ 273 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &tsa_info); 274 if (ret) 275 return ret; 276 277 spin_lock_irqsave(&chan->ts_lock, flags); 278 279 info->mode = chan->mode; 280 info->rx_fs_rate = tsa_info.rx_fs_rate; 281 info->rx_bit_rate = tsa_info.rx_bit_rate; 282 info->nb_tx_ts = hweight64(chan->tx_ts_mask); 283 info->tx_fs_rate = tsa_info.tx_fs_rate; 284 info->tx_bit_rate = tsa_info.tx_bit_rate; 285 info->nb_rx_ts = hweight64(chan->rx_ts_mask); 286 287 spin_unlock_irqrestore(&chan->ts_lock, flags); 288 289 return 0; 290 } 291 EXPORT_SYMBOL(qmc_chan_get_info); 292 293 int qmc_chan_get_ts_info(struct qmc_chan *chan, struct qmc_chan_ts_info *ts_info) 294 { 295 unsigned long flags; 296 297 spin_lock_irqsave(&chan->ts_lock, flags); 298 299 ts_info->rx_ts_mask_avail = chan->rx_ts_mask_avail; 300 ts_info->tx_ts_mask_avail = chan->tx_ts_mask_avail; 301 ts_info->rx_ts_mask = chan->rx_ts_mask; 302 ts_info->tx_ts_mask = chan->tx_ts_mask; 303 304 spin_unlock_irqrestore(&chan->ts_lock, flags); 305 306 return 0; 307 } 308 EXPORT_SYMBOL(qmc_chan_get_ts_info); 309 310 int qmc_chan_set_ts_info(struct qmc_chan *chan, const struct qmc_chan_ts_info *ts_info) 311 { 312 unsigned long flags; 313 int ret; 314 315 /* Only a subset of available timeslots is allowed */ 316 if ((ts_info->rx_ts_mask & chan->rx_ts_mask_avail) != ts_info->rx_ts_mask) 317 return -EINVAL; 318 if ((ts_info->tx_ts_mask & chan->tx_ts_mask_avail) != ts_info->tx_ts_mask) 319 return -EINVAL; 320 321 /* In case of common rx/tx table, rx/tx masks must be identical */ 322 if (chan->qmc->is_tsa_64rxtx) { 323 if (ts_info->rx_ts_mask != ts_info->tx_ts_mask) 324 return -EINVAL; 325 } 326 327 spin_lock_irqsave(&chan->ts_lock, flags); 328 329 if ((chan->tx_ts_mask != ts_info->tx_ts_mask && !chan->is_tx_stopped) || 330 (chan->rx_ts_mask != ts_info->rx_ts_mask && !chan->is_rx_stopped)) { 331 dev_err(chan->qmc->dev, "Channel rx and/or tx not stopped\n"); 332 ret = -EBUSY; 333 } else { 334 chan->tx_ts_mask = ts_info->tx_ts_mask; 335 chan->rx_ts_mask = ts_info->rx_ts_mask; 336 ret = 0; 337 } 338 spin_unlock_irqrestore(&chan->ts_lock, flags); 339 340 return ret; 341 } 342 EXPORT_SYMBOL(qmc_chan_set_ts_info); 343 344 int qmc_chan_set_param(struct qmc_chan *chan, const struct qmc_chan_param *param) 345 { 346 if (param->mode != chan->mode) 347 return -EINVAL; 348 349 switch (param->mode) { 350 case QMC_HDLC: 351 if ((param->hdlc.max_rx_buf_size % 4) || 352 (param->hdlc.max_rx_buf_size < 8)) 353 return -EINVAL; 354 355 qmc_write16(chan->qmc->scc_pram + QMC_GBL_MRBLR, 356 param->hdlc.max_rx_buf_size - 8); 357 qmc_write16(chan->s_param + QMC_SPE_MFLR, 358 param->hdlc.max_rx_frame_size); 359 if (param->hdlc.is_crc32) { 360 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, 361 QMC_SPE_CHAMR_HDLC_CRC); 362 } else { 363 qmc_clrbits16(chan->s_param + QMC_SPE_CHAMR, 364 QMC_SPE_CHAMR_HDLC_CRC); 365 } 366 break; 367 368 case QMC_TRANSPARENT: 369 qmc_write16(chan->s_param + QMC_SPE_TMRBLR, 370 param->transp.max_rx_buf_size); 371 break; 372 373 default: 374 return -EINVAL; 375 } 376 377 return 0; 378 } 379 EXPORT_SYMBOL(qmc_chan_set_param); 380 381 int qmc_chan_write_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, 382 void (*complete)(void *context), void *context) 383 { 384 struct qmc_xfer_desc *xfer_desc; 385 unsigned long flags; 386 cbd_t __iomem *bd; 387 u16 ctrl; 388 int ret; 389 390 /* 391 * R bit UB bit 392 * 0 0 : The BD is free 393 * 1 1 : The BD is in used, waiting for transfer 394 * 0 1 : The BD is in used, waiting for completion 395 * 1 0 : Should not append 396 */ 397 398 spin_lock_irqsave(&chan->tx_lock, flags); 399 bd = chan->txbd_free; 400 401 ctrl = qmc_read16(&bd->cbd_sc); 402 if (ctrl & (QMC_BD_TX_R | QMC_BD_TX_UB)) { 403 /* We are full ... */ 404 ret = -EBUSY; 405 goto end; 406 } 407 408 qmc_write16(&bd->cbd_datlen, length); 409 qmc_write32(&bd->cbd_bufaddr, addr); 410 411 xfer_desc = &chan->tx_desc[bd - chan->txbds]; 412 xfer_desc->tx_complete = complete; 413 xfer_desc->context = context; 414 415 /* Activate the descriptor */ 416 ctrl |= (QMC_BD_TX_R | QMC_BD_TX_UB); 417 wmb(); /* Be sure to flush the descriptor before control update */ 418 qmc_write16(&bd->cbd_sc, ctrl); 419 420 if (!chan->is_tx_stopped) 421 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_POL); 422 423 if (ctrl & QMC_BD_TX_W) 424 chan->txbd_free = chan->txbds; 425 else 426 chan->txbd_free++; 427 428 ret = 0; 429 430 end: 431 spin_unlock_irqrestore(&chan->tx_lock, flags); 432 return ret; 433 } 434 EXPORT_SYMBOL(qmc_chan_write_submit); 435 436 static void qmc_chan_write_done(struct qmc_chan *chan) 437 { 438 struct qmc_xfer_desc *xfer_desc; 439 void (*complete)(void *context); 440 unsigned long flags; 441 void *context; 442 cbd_t __iomem *bd; 443 u16 ctrl; 444 445 /* 446 * R bit UB bit 447 * 0 0 : The BD is free 448 * 1 1 : The BD is in used, waiting for transfer 449 * 0 1 : The BD is in used, waiting for completion 450 * 1 0 : Should not append 451 */ 452 453 spin_lock_irqsave(&chan->tx_lock, flags); 454 bd = chan->txbd_done; 455 456 ctrl = qmc_read16(&bd->cbd_sc); 457 while (!(ctrl & QMC_BD_TX_R)) { 458 if (!(ctrl & QMC_BD_TX_UB)) 459 goto end; 460 461 xfer_desc = &chan->tx_desc[bd - chan->txbds]; 462 complete = xfer_desc->tx_complete; 463 context = xfer_desc->context; 464 xfer_desc->tx_complete = NULL; 465 xfer_desc->context = NULL; 466 467 qmc_write16(&bd->cbd_sc, ctrl & ~QMC_BD_TX_UB); 468 469 if (ctrl & QMC_BD_TX_W) 470 chan->txbd_done = chan->txbds; 471 else 472 chan->txbd_done++; 473 474 if (complete) { 475 spin_unlock_irqrestore(&chan->tx_lock, flags); 476 complete(context); 477 spin_lock_irqsave(&chan->tx_lock, flags); 478 } 479 480 bd = chan->txbd_done; 481 ctrl = qmc_read16(&bd->cbd_sc); 482 } 483 484 end: 485 spin_unlock_irqrestore(&chan->tx_lock, flags); 486 } 487 488 int qmc_chan_read_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, 489 void (*complete)(void *context, size_t length, unsigned int flags), 490 void *context) 491 { 492 struct qmc_xfer_desc *xfer_desc; 493 unsigned long flags; 494 cbd_t __iomem *bd; 495 u16 ctrl; 496 int ret; 497 498 /* 499 * E bit UB bit 500 * 0 0 : The BD is free 501 * 1 1 : The BD is in used, waiting for transfer 502 * 0 1 : The BD is in used, waiting for completion 503 * 1 0 : Should not append 504 */ 505 506 spin_lock_irqsave(&chan->rx_lock, flags); 507 bd = chan->rxbd_free; 508 509 ctrl = qmc_read16(&bd->cbd_sc); 510 if (ctrl & (QMC_BD_RX_E | QMC_BD_RX_UB)) { 511 /* We are full ... */ 512 ret = -EBUSY; 513 goto end; 514 } 515 516 qmc_write16(&bd->cbd_datlen, 0); /* data length is updated by the QMC */ 517 qmc_write32(&bd->cbd_bufaddr, addr); 518 519 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; 520 xfer_desc->rx_complete = complete; 521 xfer_desc->context = context; 522 523 /* Clear previous status flags */ 524 ctrl &= ~(QMC_BD_RX_L | QMC_BD_RX_F | QMC_BD_RX_LG | QMC_BD_RX_NO | 525 QMC_BD_RX_AB | QMC_BD_RX_CR); 526 527 /* Activate the descriptor */ 528 ctrl |= (QMC_BD_RX_E | QMC_BD_RX_UB); 529 wmb(); /* Be sure to flush data before descriptor activation */ 530 qmc_write16(&bd->cbd_sc, ctrl); 531 532 /* Restart receiver if needed */ 533 if (chan->is_rx_halted && !chan->is_rx_stopped) { 534 /* Restart receiver */ 535 if (chan->mode == QMC_TRANSPARENT) 536 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); 537 else 538 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); 539 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); 540 chan->is_rx_halted = false; 541 } 542 chan->rx_pending++; 543 544 if (ctrl & QMC_BD_RX_W) 545 chan->rxbd_free = chan->rxbds; 546 else 547 chan->rxbd_free++; 548 549 ret = 0; 550 end: 551 spin_unlock_irqrestore(&chan->rx_lock, flags); 552 return ret; 553 } 554 EXPORT_SYMBOL(qmc_chan_read_submit); 555 556 static void qmc_chan_read_done(struct qmc_chan *chan) 557 { 558 void (*complete)(void *context, size_t size, unsigned int flags); 559 struct qmc_xfer_desc *xfer_desc; 560 unsigned long flags; 561 cbd_t __iomem *bd; 562 void *context; 563 u16 datalen; 564 u16 ctrl; 565 566 /* 567 * E bit UB bit 568 * 0 0 : The BD is free 569 * 1 1 : The BD is in used, waiting for transfer 570 * 0 1 : The BD is in used, waiting for completion 571 * 1 0 : Should not append 572 */ 573 574 spin_lock_irqsave(&chan->rx_lock, flags); 575 bd = chan->rxbd_done; 576 577 ctrl = qmc_read16(&bd->cbd_sc); 578 while (!(ctrl & QMC_BD_RX_E)) { 579 if (!(ctrl & QMC_BD_RX_UB)) 580 goto end; 581 582 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; 583 complete = xfer_desc->rx_complete; 584 context = xfer_desc->context; 585 xfer_desc->rx_complete = NULL; 586 xfer_desc->context = NULL; 587 588 datalen = qmc_read16(&bd->cbd_datlen); 589 qmc_write16(&bd->cbd_sc, ctrl & ~QMC_BD_RX_UB); 590 591 if (ctrl & QMC_BD_RX_W) 592 chan->rxbd_done = chan->rxbds; 593 else 594 chan->rxbd_done++; 595 596 chan->rx_pending--; 597 598 if (complete) { 599 spin_unlock_irqrestore(&chan->rx_lock, flags); 600 601 /* 602 * Avoid conversion between internal hardware flags and 603 * the software API flags. 604 * -> Be sure that the software API flags are consistent 605 * with the hardware flags 606 */ 607 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_LAST != QMC_BD_RX_L); 608 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_FIRST != QMC_BD_RX_F); 609 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_OVF != QMC_BD_RX_LG); 610 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_UNA != QMC_BD_RX_NO); 611 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_ABORT != QMC_BD_RX_AB); 612 BUILD_BUG_ON(QMC_RX_FLAG_HDLC_CRC != QMC_BD_RX_CR); 613 614 complete(context, datalen, 615 ctrl & (QMC_BD_RX_L | QMC_BD_RX_F | QMC_BD_RX_LG | 616 QMC_BD_RX_NO | QMC_BD_RX_AB | QMC_BD_RX_CR)); 617 spin_lock_irqsave(&chan->rx_lock, flags); 618 } 619 620 bd = chan->rxbd_done; 621 ctrl = qmc_read16(&bd->cbd_sc); 622 } 623 624 end: 625 spin_unlock_irqrestore(&chan->rx_lock, flags); 626 } 627 628 static int qmc_chan_setup_tsa_64rxtx(struct qmc_chan *chan, const struct tsa_serial_info *info, 629 bool enable) 630 { 631 unsigned int i; 632 u16 curr; 633 u16 val; 634 635 /* 636 * Use a common Tx/Rx 64 entries table. 637 * Tx and Rx related stuffs must be identical 638 */ 639 if (chan->tx_ts_mask != chan->rx_ts_mask) { 640 dev_err(chan->qmc->dev, "chan %u uses different Rx and Tx TS\n", chan->id); 641 return -EINVAL; 642 } 643 644 val = QMC_TSA_VALID | QMC_TSA_MASK | QMC_TSA_CHANNEL(chan->id); 645 646 /* Check entries based on Rx stuff*/ 647 for (i = 0; i < info->nb_rx_ts; i++) { 648 if (!(chan->rx_ts_mask & (((u64)1) << i))) 649 continue; 650 651 curr = qmc_read16(chan->qmc->scc_pram + QMC_GBL_TSATRX + (i * 2)); 652 if (curr & QMC_TSA_VALID && (curr & ~QMC_TSA_WRAP) != val) { 653 dev_err(chan->qmc->dev, "chan %u TxRx entry %d already used\n", 654 chan->id, i); 655 return -EBUSY; 656 } 657 } 658 659 /* Set entries based on Rx stuff*/ 660 for (i = 0; i < info->nb_rx_ts; i++) { 661 if (!(chan->rx_ts_mask & (((u64)1) << i))) 662 continue; 663 664 qmc_clrsetbits16(chan->qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 665 ~QMC_TSA_WRAP, enable ? val : 0x0000); 666 } 667 668 return 0; 669 } 670 671 static int qmc_chan_setup_tsa_32rx(struct qmc_chan *chan, const struct tsa_serial_info *info, 672 bool enable) 673 { 674 unsigned int i; 675 u16 curr; 676 u16 val; 677 678 /* Use a Rx 32 entries table */ 679 680 val = QMC_TSA_VALID | QMC_TSA_MASK | QMC_TSA_CHANNEL(chan->id); 681 682 /* Check entries based on Rx stuff */ 683 for (i = 0; i < info->nb_rx_ts; i++) { 684 if (!(chan->rx_ts_mask & (((u64)1) << i))) 685 continue; 686 687 curr = qmc_read16(chan->qmc->scc_pram + QMC_GBL_TSATRX + (i * 2)); 688 if (curr & QMC_TSA_VALID && (curr & ~QMC_TSA_WRAP) != val) { 689 dev_err(chan->qmc->dev, "chan %u Rx entry %d already used\n", 690 chan->id, i); 691 return -EBUSY; 692 } 693 } 694 695 /* Set entries based on Rx stuff */ 696 for (i = 0; i < info->nb_rx_ts; i++) { 697 if (!(chan->rx_ts_mask & (((u64)1) << i))) 698 continue; 699 700 qmc_clrsetbits16(chan->qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 701 ~QMC_TSA_WRAP, enable ? val : 0x0000); 702 } 703 704 return 0; 705 } 706 707 static int qmc_chan_setup_tsa_32tx(struct qmc_chan *chan, const struct tsa_serial_info *info, 708 bool enable) 709 { 710 unsigned int i; 711 u16 curr; 712 u16 val; 713 714 /* Use a Tx 32 entries table */ 715 716 val = QMC_TSA_VALID | QMC_TSA_MASK | QMC_TSA_CHANNEL(chan->id); 717 718 /* Check entries based on Tx stuff */ 719 for (i = 0; i < info->nb_tx_ts; i++) { 720 if (!(chan->tx_ts_mask & (((u64)1) << i))) 721 continue; 722 723 curr = qmc_read16(chan->qmc->scc_pram + QMC_GBL_TSATTX + (i * 2)); 724 if (curr & QMC_TSA_VALID && (curr & ~QMC_TSA_WRAP) != val) { 725 dev_err(chan->qmc->dev, "chan %u Tx entry %d already used\n", 726 chan->id, i); 727 return -EBUSY; 728 } 729 } 730 731 /* Set entries based on Tx stuff */ 732 for (i = 0; i < info->nb_tx_ts; i++) { 733 if (!(chan->tx_ts_mask & (((u64)1) << i))) 734 continue; 735 736 qmc_clrsetbits16(chan->qmc->scc_pram + QMC_GBL_TSATTX + (i * 2), 737 ~QMC_TSA_WRAP, enable ? val : 0x0000); 738 } 739 740 return 0; 741 } 742 743 static int qmc_chan_setup_tsa_tx(struct qmc_chan *chan, bool enable) 744 { 745 struct tsa_serial_info info; 746 int ret; 747 748 /* Retrieve info from the TSA related serial */ 749 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &info); 750 if (ret) 751 return ret; 752 753 /* Setup entries */ 754 if (chan->qmc->is_tsa_64rxtx) 755 return qmc_chan_setup_tsa_64rxtx(chan, &info, enable); 756 757 return qmc_chan_setup_tsa_32tx(chan, &info, enable); 758 } 759 760 static int qmc_chan_setup_tsa_rx(struct qmc_chan *chan, bool enable) 761 { 762 struct tsa_serial_info info; 763 int ret; 764 765 /* Retrieve info from the TSA related serial */ 766 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &info); 767 if (ret) 768 return ret; 769 770 /* Setup entries */ 771 if (chan->qmc->is_tsa_64rxtx) 772 return qmc_chan_setup_tsa_64rxtx(chan, &info, enable); 773 774 return qmc_chan_setup_tsa_32rx(chan, &info, enable); 775 } 776 777 static int qmc_chan_command(struct qmc_chan *chan, u8 qmc_opcode) 778 { 779 return cpm_command(chan->id << 2, (qmc_opcode << 4) | 0x0E); 780 } 781 782 static int qmc_chan_stop_rx(struct qmc_chan *chan) 783 { 784 unsigned long flags; 785 int ret; 786 787 spin_lock_irqsave(&chan->rx_lock, flags); 788 789 if (chan->is_rx_stopped) { 790 /* The channel is already stopped -> simply return ok */ 791 ret = 0; 792 goto end; 793 } 794 795 /* Send STOP RECEIVE command */ 796 ret = qmc_chan_command(chan, 0x0); 797 if (ret) { 798 dev_err(chan->qmc->dev, "chan %u: Send STOP RECEIVE failed (%d)\n", 799 chan->id, ret); 800 goto end; 801 } 802 803 chan->is_rx_stopped = true; 804 805 if (!chan->qmc->is_tsa_64rxtx || chan->is_tx_stopped) { 806 ret = qmc_chan_setup_tsa_rx(chan, false); 807 if (ret) { 808 dev_err(chan->qmc->dev, "chan %u: Disable tsa entries failed (%d)\n", 809 chan->id, ret); 810 goto end; 811 } 812 } 813 814 end: 815 spin_unlock_irqrestore(&chan->rx_lock, flags); 816 return ret; 817 } 818 819 static int qmc_chan_stop_tx(struct qmc_chan *chan) 820 { 821 unsigned long flags; 822 int ret; 823 824 spin_lock_irqsave(&chan->tx_lock, flags); 825 826 if (chan->is_tx_stopped) { 827 /* The channel is already stopped -> simply return ok */ 828 ret = 0; 829 goto end; 830 } 831 832 /* Send STOP TRANSMIT command */ 833 ret = qmc_chan_command(chan, 0x1); 834 if (ret) { 835 dev_err(chan->qmc->dev, "chan %u: Send STOP TRANSMIT failed (%d)\n", 836 chan->id, ret); 837 goto end; 838 } 839 840 chan->is_tx_stopped = true; 841 842 if (!chan->qmc->is_tsa_64rxtx || chan->is_rx_stopped) { 843 ret = qmc_chan_setup_tsa_tx(chan, false); 844 if (ret) { 845 dev_err(chan->qmc->dev, "chan %u: Disable tsa entries failed (%d)\n", 846 chan->id, ret); 847 goto end; 848 } 849 } 850 851 end: 852 spin_unlock_irqrestore(&chan->tx_lock, flags); 853 return ret; 854 } 855 856 static int qmc_chan_start_rx(struct qmc_chan *chan); 857 858 int qmc_chan_stop(struct qmc_chan *chan, int direction) 859 { 860 bool is_rx_rollback_needed = false; 861 unsigned long flags; 862 int ret = 0; 863 864 spin_lock_irqsave(&chan->ts_lock, flags); 865 866 if (direction & QMC_CHAN_READ) { 867 is_rx_rollback_needed = !chan->is_rx_stopped; 868 ret = qmc_chan_stop_rx(chan); 869 if (ret) 870 goto end; 871 } 872 873 if (direction & QMC_CHAN_WRITE) { 874 ret = qmc_chan_stop_tx(chan); 875 if (ret) { 876 /* Restart rx if needed */ 877 if (is_rx_rollback_needed) 878 qmc_chan_start_rx(chan); 879 goto end; 880 } 881 } 882 883 end: 884 spin_unlock_irqrestore(&chan->ts_lock, flags); 885 return ret; 886 } 887 EXPORT_SYMBOL(qmc_chan_stop); 888 889 static int qmc_setup_chan_trnsync(struct qmc *qmc, struct qmc_chan *chan) 890 { 891 struct tsa_serial_info info; 892 u16 first_rx, last_tx; 893 u16 trnsync; 894 int ret; 895 896 /* Retrieve info from the TSA related serial */ 897 ret = tsa_serial_get_info(chan->qmc->tsa_serial, &info); 898 if (ret) 899 return ret; 900 901 /* Find the first Rx TS allocated to the channel */ 902 first_rx = chan->rx_ts_mask ? __ffs64(chan->rx_ts_mask) + 1 : 0; 903 904 /* Find the last Tx TS allocated to the channel */ 905 last_tx = fls64(chan->tx_ts_mask); 906 907 trnsync = 0; 908 if (info.nb_rx_ts) 909 trnsync |= QMC_SPE_TRNSYNC_RX((first_rx % info.nb_rx_ts) * 2); 910 if (info.nb_tx_ts) 911 trnsync |= QMC_SPE_TRNSYNC_TX((last_tx % info.nb_tx_ts) * 2); 912 913 qmc_write16(chan->s_param + QMC_SPE_TRNSYNC, trnsync); 914 915 dev_dbg(qmc->dev, "chan %u: trnsync=0x%04x, rx %u/%u 0x%llx, tx %u/%u 0x%llx\n", 916 chan->id, trnsync, 917 first_rx, info.nb_rx_ts, chan->rx_ts_mask, 918 last_tx, info.nb_tx_ts, chan->tx_ts_mask); 919 920 return 0; 921 } 922 923 static int qmc_chan_start_rx(struct qmc_chan *chan) 924 { 925 unsigned long flags; 926 int ret; 927 928 spin_lock_irqsave(&chan->rx_lock, flags); 929 930 if (!chan->is_rx_stopped) { 931 /* The channel is already started -> simply return ok */ 932 ret = 0; 933 goto end; 934 } 935 936 ret = qmc_chan_setup_tsa_rx(chan, true); 937 if (ret) { 938 dev_err(chan->qmc->dev, "chan %u: Enable tsa entries failed (%d)\n", 939 chan->id, ret); 940 goto end; 941 } 942 943 ret = qmc_setup_chan_trnsync(chan->qmc, chan); 944 if (ret) { 945 dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n", 946 chan->id, ret); 947 goto end; 948 } 949 950 /* Restart the receiver */ 951 if (chan->mode == QMC_TRANSPARENT) 952 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); 953 else 954 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); 955 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); 956 chan->is_rx_halted = false; 957 958 chan->is_rx_stopped = false; 959 960 end: 961 spin_unlock_irqrestore(&chan->rx_lock, flags); 962 return ret; 963 } 964 965 static int qmc_chan_start_tx(struct qmc_chan *chan) 966 { 967 unsigned long flags; 968 int ret; 969 970 spin_lock_irqsave(&chan->tx_lock, flags); 971 972 if (!chan->is_tx_stopped) { 973 /* The channel is already started -> simply return ok */ 974 ret = 0; 975 goto end; 976 } 977 978 ret = qmc_chan_setup_tsa_tx(chan, true); 979 if (ret) { 980 dev_err(chan->qmc->dev, "chan %u: Enable tsa entries failed (%d)\n", 981 chan->id, ret); 982 goto end; 983 } 984 985 ret = qmc_setup_chan_trnsync(chan->qmc, chan); 986 if (ret) { 987 dev_err(chan->qmc->dev, "chan %u: setup TRNSYNC failed (%d)\n", 988 chan->id, ret); 989 goto end; 990 } 991 992 /* 993 * Enable channel transmitter as it could be disabled if 994 * qmc_chan_reset() was called. 995 */ 996 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_ENT); 997 998 /* Set the POL bit in the channel mode register */ 999 qmc_setbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_POL); 1000 1001 chan->is_tx_stopped = false; 1002 1003 end: 1004 spin_unlock_irqrestore(&chan->tx_lock, flags); 1005 return ret; 1006 } 1007 1008 int qmc_chan_start(struct qmc_chan *chan, int direction) 1009 { 1010 bool is_rx_rollback_needed = false; 1011 unsigned long flags; 1012 int ret = 0; 1013 1014 spin_lock_irqsave(&chan->ts_lock, flags); 1015 1016 if (direction & QMC_CHAN_READ) { 1017 is_rx_rollback_needed = chan->is_rx_stopped; 1018 ret = qmc_chan_start_rx(chan); 1019 if (ret) 1020 goto end; 1021 } 1022 1023 if (direction & QMC_CHAN_WRITE) { 1024 ret = qmc_chan_start_tx(chan); 1025 if (ret) { 1026 /* Restop rx if needed */ 1027 if (is_rx_rollback_needed) 1028 qmc_chan_stop_rx(chan); 1029 goto end; 1030 } 1031 } 1032 1033 end: 1034 spin_unlock_irqrestore(&chan->ts_lock, flags); 1035 return ret; 1036 } 1037 EXPORT_SYMBOL(qmc_chan_start); 1038 1039 static void qmc_chan_reset_rx(struct qmc_chan *chan) 1040 { 1041 struct qmc_xfer_desc *xfer_desc; 1042 unsigned long flags; 1043 cbd_t __iomem *bd; 1044 u16 ctrl; 1045 1046 spin_lock_irqsave(&chan->rx_lock, flags); 1047 bd = chan->rxbds; 1048 do { 1049 ctrl = qmc_read16(&bd->cbd_sc); 1050 qmc_write16(&bd->cbd_sc, ctrl & ~(QMC_BD_RX_UB | QMC_BD_RX_E)); 1051 1052 xfer_desc = &chan->rx_desc[bd - chan->rxbds]; 1053 xfer_desc->rx_complete = NULL; 1054 xfer_desc->context = NULL; 1055 1056 bd++; 1057 } while (!(ctrl & QMC_BD_RX_W)); 1058 1059 chan->rxbd_free = chan->rxbds; 1060 chan->rxbd_done = chan->rxbds; 1061 qmc_write16(chan->s_param + QMC_SPE_RBPTR, 1062 qmc_read16(chan->s_param + QMC_SPE_RBASE)); 1063 1064 chan->rx_pending = 0; 1065 1066 spin_unlock_irqrestore(&chan->rx_lock, flags); 1067 } 1068 1069 static void qmc_chan_reset_tx(struct qmc_chan *chan) 1070 { 1071 struct qmc_xfer_desc *xfer_desc; 1072 unsigned long flags; 1073 cbd_t __iomem *bd; 1074 u16 ctrl; 1075 1076 spin_lock_irqsave(&chan->tx_lock, flags); 1077 1078 /* Disable transmitter. It will be re-enable on qmc_chan_start() */ 1079 qmc_clrbits16(chan->s_param + QMC_SPE_CHAMR, QMC_SPE_CHAMR_ENT); 1080 1081 bd = chan->txbds; 1082 do { 1083 ctrl = qmc_read16(&bd->cbd_sc); 1084 qmc_write16(&bd->cbd_sc, ctrl & ~(QMC_BD_TX_UB | QMC_BD_TX_R)); 1085 1086 xfer_desc = &chan->tx_desc[bd - chan->txbds]; 1087 xfer_desc->tx_complete = NULL; 1088 xfer_desc->context = NULL; 1089 1090 bd++; 1091 } while (!(ctrl & QMC_BD_TX_W)); 1092 1093 chan->txbd_free = chan->txbds; 1094 chan->txbd_done = chan->txbds; 1095 qmc_write16(chan->s_param + QMC_SPE_TBPTR, 1096 qmc_read16(chan->s_param + QMC_SPE_TBASE)); 1097 1098 /* Reset TSTATE and ZISTATE to their initial value */ 1099 qmc_write32(chan->s_param + QMC_SPE_TSTATE, 0x30000000); 1100 qmc_write32(chan->s_param + QMC_SPE_ZISTATE, 0x00000100); 1101 1102 spin_unlock_irqrestore(&chan->tx_lock, flags); 1103 } 1104 1105 int qmc_chan_reset(struct qmc_chan *chan, int direction) 1106 { 1107 if (direction & QMC_CHAN_READ) 1108 qmc_chan_reset_rx(chan); 1109 1110 if (direction & QMC_CHAN_WRITE) 1111 qmc_chan_reset_tx(chan); 1112 1113 return 0; 1114 } 1115 EXPORT_SYMBOL(qmc_chan_reset); 1116 1117 static int qmc_check_chans(struct qmc *qmc) 1118 { 1119 struct tsa_serial_info info; 1120 struct qmc_chan *chan; 1121 u64 tx_ts_assigned_mask; 1122 u64 rx_ts_assigned_mask; 1123 int ret; 1124 1125 /* Retrieve info from the TSA related serial */ 1126 ret = tsa_serial_get_info(qmc->tsa_serial, &info); 1127 if (ret) 1128 return ret; 1129 1130 if ((info.nb_tx_ts > 64) || (info.nb_rx_ts > 64)) { 1131 dev_err(qmc->dev, "Number of TSA Tx/Rx TS assigned not supported\n"); 1132 return -EINVAL; 1133 } 1134 1135 /* 1136 * If more than 32 TS are assigned to this serial, one common table is 1137 * used for Tx and Rx and so masks must be equal for all channels. 1138 */ 1139 if ((info.nb_tx_ts > 32) || (info.nb_rx_ts > 32)) { 1140 if (info.nb_tx_ts != info.nb_rx_ts) { 1141 dev_err(qmc->dev, "Number of TSA Tx/Rx TS assigned are not equal\n"); 1142 return -EINVAL; 1143 } 1144 } 1145 1146 tx_ts_assigned_mask = info.nb_tx_ts == 64 ? U64_MAX : (((u64)1) << info.nb_tx_ts) - 1; 1147 rx_ts_assigned_mask = info.nb_rx_ts == 64 ? U64_MAX : (((u64)1) << info.nb_rx_ts) - 1; 1148 1149 list_for_each_entry(chan, &qmc->chan_head, list) { 1150 if (chan->tx_ts_mask_avail > tx_ts_assigned_mask) { 1151 dev_err(qmc->dev, "chan %u can use TSA unassigned Tx TS\n", chan->id); 1152 return -EINVAL; 1153 } 1154 1155 if (chan->rx_ts_mask_avail > rx_ts_assigned_mask) { 1156 dev_err(qmc->dev, "chan %u can use TSA unassigned Rx TS\n", chan->id); 1157 return -EINVAL; 1158 } 1159 } 1160 1161 return 0; 1162 } 1163 1164 static unsigned int qmc_nb_chans(struct qmc *qmc) 1165 { 1166 unsigned int count = 0; 1167 struct qmc_chan *chan; 1168 1169 list_for_each_entry(chan, &qmc->chan_head, list) 1170 count++; 1171 1172 return count; 1173 } 1174 1175 static int qmc_of_parse_chans(struct qmc *qmc, struct device_node *np) 1176 { 1177 struct device_node *chan_np; 1178 struct qmc_chan *chan; 1179 const char *mode; 1180 u32 chan_id; 1181 u64 ts_mask; 1182 int ret; 1183 1184 for_each_available_child_of_node(np, chan_np) { 1185 ret = of_property_read_u32(chan_np, "reg", &chan_id); 1186 if (ret) { 1187 dev_err(qmc->dev, "%pOF: failed to read reg\n", chan_np); 1188 of_node_put(chan_np); 1189 return ret; 1190 } 1191 if (chan_id > 63) { 1192 dev_err(qmc->dev, "%pOF: Invalid chan_id\n", chan_np); 1193 of_node_put(chan_np); 1194 return -EINVAL; 1195 } 1196 1197 chan = devm_kzalloc(qmc->dev, sizeof(*chan), GFP_KERNEL); 1198 if (!chan) { 1199 of_node_put(chan_np); 1200 return -ENOMEM; 1201 } 1202 1203 chan->id = chan_id; 1204 spin_lock_init(&chan->ts_lock); 1205 spin_lock_init(&chan->rx_lock); 1206 spin_lock_init(&chan->tx_lock); 1207 1208 ret = of_property_read_u64(chan_np, "fsl,tx-ts-mask", &ts_mask); 1209 if (ret) { 1210 dev_err(qmc->dev, "%pOF: failed to read fsl,tx-ts-mask\n", 1211 chan_np); 1212 of_node_put(chan_np); 1213 return ret; 1214 } 1215 chan->tx_ts_mask_avail = ts_mask; 1216 chan->tx_ts_mask = chan->tx_ts_mask_avail; 1217 1218 ret = of_property_read_u64(chan_np, "fsl,rx-ts-mask", &ts_mask); 1219 if (ret) { 1220 dev_err(qmc->dev, "%pOF: failed to read fsl,rx-ts-mask\n", 1221 chan_np); 1222 of_node_put(chan_np); 1223 return ret; 1224 } 1225 chan->rx_ts_mask_avail = ts_mask; 1226 chan->rx_ts_mask = chan->rx_ts_mask_avail; 1227 1228 mode = "transparent"; 1229 ret = of_property_read_string(chan_np, "fsl,operational-mode", &mode); 1230 if (ret && ret != -EINVAL) { 1231 dev_err(qmc->dev, "%pOF: failed to read fsl,operational-mode\n", 1232 chan_np); 1233 of_node_put(chan_np); 1234 return ret; 1235 } 1236 if (!strcmp(mode, "transparent")) { 1237 chan->mode = QMC_TRANSPARENT; 1238 } else if (!strcmp(mode, "hdlc")) { 1239 chan->mode = QMC_HDLC; 1240 } else { 1241 dev_err(qmc->dev, "%pOF: Invalid fsl,operational-mode (%s)\n", 1242 chan_np, mode); 1243 of_node_put(chan_np); 1244 return -EINVAL; 1245 } 1246 1247 chan->is_reverse_data = of_property_read_bool(chan_np, 1248 "fsl,reverse-data"); 1249 1250 list_add_tail(&chan->list, &qmc->chan_head); 1251 qmc->chans[chan->id] = chan; 1252 } 1253 1254 return qmc_check_chans(qmc); 1255 } 1256 1257 static int qmc_init_tsa_64rxtx(struct qmc *qmc, const struct tsa_serial_info *info) 1258 { 1259 unsigned int i; 1260 u16 val; 1261 1262 /* 1263 * Use a common Tx/Rx 64 entries table. 1264 * Everything was previously checked, Tx and Rx related stuffs are 1265 * identical -> Used Rx related stuff to build the table 1266 */ 1267 qmc->is_tsa_64rxtx = true; 1268 1269 /* Invalidate all entries */ 1270 for (i = 0; i < 64; i++) 1271 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 0x0000); 1272 1273 /* Set Wrap bit on last entry */ 1274 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATRX + ((info->nb_rx_ts - 1) * 2), 1275 QMC_TSA_WRAP); 1276 1277 /* Init pointers to the table */ 1278 val = qmc->scc_pram_offset + QMC_GBL_TSATRX; 1279 qmc_write16(qmc->scc_pram + QMC_GBL_RX_S_PTR, val); 1280 qmc_write16(qmc->scc_pram + QMC_GBL_RXPTR, val); 1281 qmc_write16(qmc->scc_pram + QMC_GBL_TX_S_PTR, val); 1282 qmc_write16(qmc->scc_pram + QMC_GBL_TXPTR, val); 1283 1284 return 0; 1285 } 1286 1287 static int qmc_init_tsa_32rx_32tx(struct qmc *qmc, const struct tsa_serial_info *info) 1288 { 1289 unsigned int i; 1290 u16 val; 1291 1292 /* 1293 * Use a Tx 32 entries table and a Rx 32 entries table. 1294 * Everything was previously checked. 1295 */ 1296 qmc->is_tsa_64rxtx = false; 1297 1298 /* Invalidate all entries */ 1299 for (i = 0; i < 32; i++) { 1300 qmc_write16(qmc->scc_pram + QMC_GBL_TSATRX + (i * 2), 0x0000); 1301 qmc_write16(qmc->scc_pram + QMC_GBL_TSATTX + (i * 2), 0x0000); 1302 } 1303 1304 /* Set Wrap bit on last entries */ 1305 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATRX + ((info->nb_rx_ts - 1) * 2), 1306 QMC_TSA_WRAP); 1307 qmc_setbits16(qmc->scc_pram + QMC_GBL_TSATTX + ((info->nb_tx_ts - 1) * 2), 1308 QMC_TSA_WRAP); 1309 1310 /* Init Rx pointers ...*/ 1311 val = qmc->scc_pram_offset + QMC_GBL_TSATRX; 1312 qmc_write16(qmc->scc_pram + QMC_GBL_RX_S_PTR, val); 1313 qmc_write16(qmc->scc_pram + QMC_GBL_RXPTR, val); 1314 1315 /* ... and Tx pointers */ 1316 val = qmc->scc_pram_offset + QMC_GBL_TSATTX; 1317 qmc_write16(qmc->scc_pram + QMC_GBL_TX_S_PTR, val); 1318 qmc_write16(qmc->scc_pram + QMC_GBL_TXPTR, val); 1319 1320 return 0; 1321 } 1322 1323 static int qmc_init_tsa(struct qmc *qmc) 1324 { 1325 struct tsa_serial_info info; 1326 int ret; 1327 1328 /* Retrieve info from the TSA related serial */ 1329 ret = tsa_serial_get_info(qmc->tsa_serial, &info); 1330 if (ret) 1331 return ret; 1332 1333 /* 1334 * Initialize one common 64 entries table or two 32 entries (one for Tx 1335 * and one for Tx) according to assigned TS numbers. 1336 */ 1337 return ((info.nb_tx_ts > 32) || (info.nb_rx_ts > 32)) ? 1338 qmc_init_tsa_64rxtx(qmc, &info) : 1339 qmc_init_tsa_32rx_32tx(qmc, &info); 1340 } 1341 1342 static int qmc_setup_chan(struct qmc *qmc, struct qmc_chan *chan) 1343 { 1344 unsigned int i; 1345 cbd_t __iomem *bd; 1346 int ret; 1347 u16 val; 1348 1349 chan->qmc = qmc; 1350 1351 /* Set channel specific parameter base address */ 1352 chan->s_param = qmc->dpram + (chan->id * 64); 1353 /* 16 bd per channel (8 rx and 8 tx) */ 1354 chan->txbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)); 1355 chan->rxbds = qmc->bd_table + (chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)) + QMC_NB_TXBDS; 1356 1357 chan->txbd_free = chan->txbds; 1358 chan->txbd_done = chan->txbds; 1359 chan->rxbd_free = chan->rxbds; 1360 chan->rxbd_done = chan->rxbds; 1361 1362 /* TBASE and TBPTR*/ 1363 val = chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS) * sizeof(cbd_t); 1364 qmc_write16(chan->s_param + QMC_SPE_TBASE, val); 1365 qmc_write16(chan->s_param + QMC_SPE_TBPTR, val); 1366 1367 /* RBASE and RBPTR*/ 1368 val = ((chan->id * (QMC_NB_TXBDS + QMC_NB_RXBDS)) + QMC_NB_TXBDS) * sizeof(cbd_t); 1369 qmc_write16(chan->s_param + QMC_SPE_RBASE, val); 1370 qmc_write16(chan->s_param + QMC_SPE_RBPTR, val); 1371 qmc_write32(chan->s_param + QMC_SPE_TSTATE, 0x30000000); 1372 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); 1373 qmc_write32(chan->s_param + QMC_SPE_ZISTATE, 0x00000100); 1374 if (chan->mode == QMC_TRANSPARENT) { 1375 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); 1376 qmc_write16(chan->s_param + QMC_SPE_TMRBLR, 60); 1377 val = QMC_SPE_CHAMR_MODE_TRANSP | QMC_SPE_CHAMR_TRANSP_SYNC; 1378 if (chan->is_reverse_data) 1379 val |= QMC_SPE_CHAMR_TRANSP_RD; 1380 qmc_write16(chan->s_param + QMC_SPE_CHAMR, val); 1381 ret = qmc_setup_chan_trnsync(qmc, chan); 1382 if (ret) 1383 return ret; 1384 } else { 1385 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); 1386 qmc_write16(chan->s_param + QMC_SPE_MFLR, 60); 1387 qmc_write16(chan->s_param + QMC_SPE_CHAMR, 1388 QMC_SPE_CHAMR_MODE_HDLC | QMC_SPE_CHAMR_HDLC_IDLM); 1389 } 1390 1391 /* Do not enable interrupts now. They will be enabled later */ 1392 qmc_write16(chan->s_param + QMC_SPE_INTMSK, 0x0000); 1393 1394 /* Init Rx BDs and set Wrap bit on last descriptor */ 1395 BUILD_BUG_ON(QMC_NB_RXBDS == 0); 1396 val = QMC_BD_RX_I; 1397 for (i = 0; i < QMC_NB_RXBDS; i++) { 1398 bd = chan->rxbds + i; 1399 qmc_write16(&bd->cbd_sc, val); 1400 } 1401 bd = chan->rxbds + QMC_NB_RXBDS - 1; 1402 qmc_write16(&bd->cbd_sc, val | QMC_BD_RX_W); 1403 1404 /* Init Tx BDs and set Wrap bit on last descriptor */ 1405 BUILD_BUG_ON(QMC_NB_TXBDS == 0); 1406 val = QMC_BD_TX_I; 1407 if (chan->mode == QMC_HDLC) 1408 val |= QMC_BD_TX_L | QMC_BD_TX_TC; 1409 for (i = 0; i < QMC_NB_TXBDS; i++) { 1410 bd = chan->txbds + i; 1411 qmc_write16(&bd->cbd_sc, val); 1412 } 1413 bd = chan->txbds + QMC_NB_TXBDS - 1; 1414 qmc_write16(&bd->cbd_sc, val | QMC_BD_TX_W); 1415 1416 return 0; 1417 } 1418 1419 static int qmc_setup_chans(struct qmc *qmc) 1420 { 1421 struct qmc_chan *chan; 1422 int ret; 1423 1424 list_for_each_entry(chan, &qmc->chan_head, list) { 1425 ret = qmc_setup_chan(qmc, chan); 1426 if (ret) 1427 return ret; 1428 } 1429 1430 return 0; 1431 } 1432 1433 static int qmc_finalize_chans(struct qmc *qmc) 1434 { 1435 struct qmc_chan *chan; 1436 int ret; 1437 1438 list_for_each_entry(chan, &qmc->chan_head, list) { 1439 /* Unmask channel interrupts */ 1440 if (chan->mode == QMC_HDLC) { 1441 qmc_write16(chan->s_param + QMC_SPE_INTMSK, 1442 QMC_INT_NID | QMC_INT_IDL | QMC_INT_MRF | 1443 QMC_INT_UN | QMC_INT_RXF | QMC_INT_BSY | 1444 QMC_INT_TXB | QMC_INT_RXB); 1445 } else { 1446 qmc_write16(chan->s_param + QMC_SPE_INTMSK, 1447 QMC_INT_UN | QMC_INT_BSY | 1448 QMC_INT_TXB | QMC_INT_RXB); 1449 } 1450 1451 /* Forced stop the channel */ 1452 ret = qmc_chan_stop(chan, QMC_CHAN_ALL); 1453 if (ret) 1454 return ret; 1455 } 1456 1457 return 0; 1458 } 1459 1460 static int qmc_setup_ints(struct qmc *qmc) 1461 { 1462 unsigned int i; 1463 u16 __iomem *last; 1464 1465 /* Raz all entries */ 1466 for (i = 0; i < (qmc->int_size / sizeof(u16)); i++) 1467 qmc_write16(qmc->int_table + i, 0x0000); 1468 1469 /* Set Wrap bit on last entry */ 1470 if (qmc->int_size >= sizeof(u16)) { 1471 last = qmc->int_table + (qmc->int_size / sizeof(u16)) - 1; 1472 qmc_write16(last, QMC_INT_W); 1473 } 1474 1475 return 0; 1476 } 1477 1478 static void qmc_irq_gint(struct qmc *qmc) 1479 { 1480 struct qmc_chan *chan; 1481 unsigned int chan_id; 1482 unsigned long flags; 1483 u16 int_entry; 1484 1485 int_entry = qmc_read16(qmc->int_curr); 1486 while (int_entry & QMC_INT_V) { 1487 /* Clear all but the Wrap bit */ 1488 qmc_write16(qmc->int_curr, int_entry & QMC_INT_W); 1489 1490 chan_id = QMC_INT_GET_CHANNEL(int_entry); 1491 chan = qmc->chans[chan_id]; 1492 if (!chan) { 1493 dev_err(qmc->dev, "interrupt on invalid chan %u\n", chan_id); 1494 goto int_next; 1495 } 1496 1497 if (int_entry & QMC_INT_TXB) 1498 qmc_chan_write_done(chan); 1499 1500 if (int_entry & QMC_INT_UN) { 1501 dev_info(qmc->dev, "intr chan %u, 0x%04x (UN)\n", chan_id, 1502 int_entry); 1503 chan->nb_tx_underrun++; 1504 } 1505 1506 if (int_entry & QMC_INT_BSY) { 1507 dev_info(qmc->dev, "intr chan %u, 0x%04x (BSY)\n", chan_id, 1508 int_entry); 1509 chan->nb_rx_busy++; 1510 /* Restart the receiver if needed */ 1511 spin_lock_irqsave(&chan->rx_lock, flags); 1512 if (chan->rx_pending && !chan->is_rx_stopped) { 1513 if (chan->mode == QMC_TRANSPARENT) 1514 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x18000080); 1515 else 1516 qmc_write32(chan->s_param + QMC_SPE_ZDSTATE, 0x00000080); 1517 qmc_write32(chan->s_param + QMC_SPE_RSTATE, 0x31000000); 1518 chan->is_rx_halted = false; 1519 } else { 1520 chan->is_rx_halted = true; 1521 } 1522 spin_unlock_irqrestore(&chan->rx_lock, flags); 1523 } 1524 1525 if (int_entry & QMC_INT_RXB) 1526 qmc_chan_read_done(chan); 1527 1528 int_next: 1529 if (int_entry & QMC_INT_W) 1530 qmc->int_curr = qmc->int_table; 1531 else 1532 qmc->int_curr++; 1533 int_entry = qmc_read16(qmc->int_curr); 1534 } 1535 } 1536 1537 static irqreturn_t qmc_irq_handler(int irq, void *priv) 1538 { 1539 struct qmc *qmc = (struct qmc *)priv; 1540 u16 scce; 1541 1542 scce = qmc_read16(qmc->scc_regs + SCC_SCCE); 1543 qmc_write16(qmc->scc_regs + SCC_SCCE, scce); 1544 1545 if (unlikely(scce & SCC_SCCE_IQOV)) 1546 dev_info(qmc->dev, "IRQ queue overflow\n"); 1547 1548 if (unlikely(scce & SCC_SCCE_GUN)) 1549 dev_err(qmc->dev, "Global transmitter underrun\n"); 1550 1551 if (unlikely(scce & SCC_SCCE_GOV)) 1552 dev_err(qmc->dev, "Global receiver overrun\n"); 1553 1554 /* normal interrupt */ 1555 if (likely(scce & SCC_SCCE_GINT)) 1556 qmc_irq_gint(qmc); 1557 1558 return IRQ_HANDLED; 1559 } 1560 1561 static int qmc_probe(struct platform_device *pdev) 1562 { 1563 struct device_node *np = pdev->dev.of_node; 1564 unsigned int nb_chans; 1565 struct resource *res; 1566 struct qmc *qmc; 1567 int irq; 1568 int ret; 1569 1570 qmc = devm_kzalloc(&pdev->dev, sizeof(*qmc), GFP_KERNEL); 1571 if (!qmc) 1572 return -ENOMEM; 1573 1574 qmc->dev = &pdev->dev; 1575 INIT_LIST_HEAD(&qmc->chan_head); 1576 1577 qmc->scc_regs = devm_platform_ioremap_resource_byname(pdev, "scc_regs"); 1578 if (IS_ERR(qmc->scc_regs)) 1579 return PTR_ERR(qmc->scc_regs); 1580 1581 1582 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "scc_pram"); 1583 if (!res) 1584 return -EINVAL; 1585 qmc->scc_pram_offset = res->start - get_immrbase(); 1586 qmc->scc_pram = devm_ioremap_resource(qmc->dev, res); 1587 if (IS_ERR(qmc->scc_pram)) 1588 return PTR_ERR(qmc->scc_pram); 1589 1590 qmc->dpram = devm_platform_ioremap_resource_byname(pdev, "dpram"); 1591 if (IS_ERR(qmc->dpram)) 1592 return PTR_ERR(qmc->dpram); 1593 1594 qmc->tsa_serial = devm_tsa_serial_get_byphandle(qmc->dev, np, "fsl,tsa-serial"); 1595 if (IS_ERR(qmc->tsa_serial)) { 1596 return dev_err_probe(qmc->dev, PTR_ERR(qmc->tsa_serial), 1597 "Failed to get TSA serial\n"); 1598 } 1599 1600 /* Connect the serial (SCC) to TSA */ 1601 ret = tsa_serial_connect(qmc->tsa_serial); 1602 if (ret) { 1603 dev_err(qmc->dev, "Failed to connect TSA serial\n"); 1604 return ret; 1605 } 1606 1607 /* Parse channels informationss */ 1608 ret = qmc_of_parse_chans(qmc, np); 1609 if (ret) 1610 goto err_tsa_serial_disconnect; 1611 1612 nb_chans = qmc_nb_chans(qmc); 1613 1614 /* Init GMSR_H and GMSR_L registers */ 1615 qmc_write32(qmc->scc_regs + SCC_GSMRH, 1616 SCC_GSMRH_CDS | SCC_GSMRH_CTSS | SCC_GSMRH_CDP | SCC_GSMRH_CTSP); 1617 1618 /* enable QMC mode */ 1619 qmc_write32(qmc->scc_regs + SCC_GSMRL, SCC_GSMRL_MODE_QMC); 1620 1621 /* 1622 * Allocate the buffer descriptor table 1623 * 8 rx and 8 tx descriptors per channel 1624 */ 1625 qmc->bd_size = (nb_chans * (QMC_NB_TXBDS + QMC_NB_RXBDS)) * sizeof(cbd_t); 1626 qmc->bd_table = dmam_alloc_coherent(qmc->dev, qmc->bd_size, 1627 &qmc->bd_dma_addr, GFP_KERNEL); 1628 if (!qmc->bd_table) { 1629 dev_err(qmc->dev, "Failed to allocate bd table\n"); 1630 ret = -ENOMEM; 1631 goto err_tsa_serial_disconnect; 1632 } 1633 memset(qmc->bd_table, 0, qmc->bd_size); 1634 1635 qmc_write32(qmc->scc_pram + QMC_GBL_MCBASE, qmc->bd_dma_addr); 1636 1637 /* Allocate the interrupt table */ 1638 qmc->int_size = QMC_NB_INTS * sizeof(u16); 1639 qmc->int_table = dmam_alloc_coherent(qmc->dev, qmc->int_size, 1640 &qmc->int_dma_addr, GFP_KERNEL); 1641 if (!qmc->int_table) { 1642 dev_err(qmc->dev, "Failed to allocate interrupt table\n"); 1643 ret = -ENOMEM; 1644 goto err_tsa_serial_disconnect; 1645 } 1646 memset(qmc->int_table, 0, qmc->int_size); 1647 1648 qmc->int_curr = qmc->int_table; 1649 qmc_write32(qmc->scc_pram + QMC_GBL_INTBASE, qmc->int_dma_addr); 1650 qmc_write32(qmc->scc_pram + QMC_GBL_INTPTR, qmc->int_dma_addr); 1651 1652 /* Set MRBLR (valid for HDLC only) max MRU + max CRC */ 1653 qmc_write16(qmc->scc_pram + QMC_GBL_MRBLR, HDLC_MAX_MRU + 4); 1654 1655 qmc_write16(qmc->scc_pram + QMC_GBL_GRFTHR, 1); 1656 qmc_write16(qmc->scc_pram + QMC_GBL_GRFCNT, 1); 1657 1658 qmc_write32(qmc->scc_pram + QMC_GBL_C_MASK32, 0xDEBB20E3); 1659 qmc_write16(qmc->scc_pram + QMC_GBL_C_MASK16, 0xF0B8); 1660 1661 ret = qmc_init_tsa(qmc); 1662 if (ret) 1663 goto err_tsa_serial_disconnect; 1664 1665 qmc_write16(qmc->scc_pram + QMC_GBL_QMCSTATE, 0x8000); 1666 1667 ret = qmc_setup_chans(qmc); 1668 if (ret) 1669 goto err_tsa_serial_disconnect; 1670 1671 /* Init interrupts table */ 1672 ret = qmc_setup_ints(qmc); 1673 if (ret) 1674 goto err_tsa_serial_disconnect; 1675 1676 /* Disable and clear interrupts, set the irq handler */ 1677 qmc_write16(qmc->scc_regs + SCC_SCCM, 0x0000); 1678 qmc_write16(qmc->scc_regs + SCC_SCCE, 0x000F); 1679 irq = platform_get_irq(pdev, 0); 1680 if (irq < 0) 1681 goto err_tsa_serial_disconnect; 1682 ret = devm_request_irq(qmc->dev, irq, qmc_irq_handler, 0, "qmc", qmc); 1683 if (ret < 0) 1684 goto err_tsa_serial_disconnect; 1685 1686 /* Enable interrupts */ 1687 qmc_write16(qmc->scc_regs + SCC_SCCM, 1688 SCC_SCCE_IQOV | SCC_SCCE_GINT | SCC_SCCE_GUN | SCC_SCCE_GOV); 1689 1690 ret = qmc_finalize_chans(qmc); 1691 if (ret < 0) 1692 goto err_disable_intr; 1693 1694 /* Enable transmiter and receiver */ 1695 qmc_setbits32(qmc->scc_regs + SCC_GSMRL, SCC_GSMRL_ENR | SCC_GSMRL_ENT); 1696 1697 platform_set_drvdata(pdev, qmc); 1698 1699 /* Populate channel related devices */ 1700 ret = devm_of_platform_populate(qmc->dev); 1701 if (ret) 1702 goto err_disable_txrx; 1703 1704 return 0; 1705 1706 err_disable_txrx: 1707 qmc_setbits32(qmc->scc_regs + SCC_GSMRL, 0); 1708 1709 err_disable_intr: 1710 qmc_write16(qmc->scc_regs + SCC_SCCM, 0); 1711 1712 err_tsa_serial_disconnect: 1713 tsa_serial_disconnect(qmc->tsa_serial); 1714 return ret; 1715 } 1716 1717 static void qmc_remove(struct platform_device *pdev) 1718 { 1719 struct qmc *qmc = platform_get_drvdata(pdev); 1720 1721 /* Disable transmiter and receiver */ 1722 qmc_setbits32(qmc->scc_regs + SCC_GSMRL, 0); 1723 1724 /* Disable interrupts */ 1725 qmc_write16(qmc->scc_regs + SCC_SCCM, 0); 1726 1727 /* Disconnect the serial from TSA */ 1728 tsa_serial_disconnect(qmc->tsa_serial); 1729 } 1730 1731 static const struct of_device_id qmc_id_table[] = { 1732 { .compatible = "fsl,cpm1-scc-qmc" }, 1733 {} /* sentinel */ 1734 }; 1735 MODULE_DEVICE_TABLE(of, qmc_id_table); 1736 1737 static struct platform_driver qmc_driver = { 1738 .driver = { 1739 .name = "fsl-qmc", 1740 .of_match_table = of_match_ptr(qmc_id_table), 1741 }, 1742 .probe = qmc_probe, 1743 .remove_new = qmc_remove, 1744 }; 1745 module_platform_driver(qmc_driver); 1746 1747 static struct qmc_chan *qmc_chan_get_from_qmc(struct device_node *qmc_np, unsigned int chan_index) 1748 { 1749 struct platform_device *pdev; 1750 struct qmc_chan *qmc_chan; 1751 struct qmc *qmc; 1752 1753 if (!of_match_node(qmc_driver.driver.of_match_table, qmc_np)) 1754 return ERR_PTR(-EINVAL); 1755 1756 pdev = of_find_device_by_node(qmc_np); 1757 if (!pdev) 1758 return ERR_PTR(-ENODEV); 1759 1760 qmc = platform_get_drvdata(pdev); 1761 if (!qmc) { 1762 platform_device_put(pdev); 1763 return ERR_PTR(-EPROBE_DEFER); 1764 } 1765 1766 if (chan_index >= ARRAY_SIZE(qmc->chans)) { 1767 platform_device_put(pdev); 1768 return ERR_PTR(-EINVAL); 1769 } 1770 1771 qmc_chan = qmc->chans[chan_index]; 1772 if (!qmc_chan) { 1773 platform_device_put(pdev); 1774 return ERR_PTR(-ENOENT); 1775 } 1776 1777 return qmc_chan; 1778 } 1779 1780 int qmc_chan_count_phandles(struct device_node *np, const char *phandles_name) 1781 { 1782 int count; 1783 1784 /* phandles are fixed args phandles with one arg */ 1785 count = of_count_phandle_with_args(np, phandles_name, NULL); 1786 if (count < 0) 1787 return count; 1788 1789 return count / 2; 1790 } 1791 EXPORT_SYMBOL(qmc_chan_count_phandles); 1792 1793 struct qmc_chan *qmc_chan_get_byphandles_index(struct device_node *np, 1794 const char *phandles_name, 1795 int index) 1796 { 1797 struct of_phandle_args out_args; 1798 struct qmc_chan *qmc_chan; 1799 int ret; 1800 1801 ret = of_parse_phandle_with_fixed_args(np, phandles_name, 1, index, 1802 &out_args); 1803 if (ret < 0) 1804 return ERR_PTR(ret); 1805 1806 if (out_args.args_count != 1) { 1807 of_node_put(out_args.np); 1808 return ERR_PTR(-EINVAL); 1809 } 1810 1811 qmc_chan = qmc_chan_get_from_qmc(out_args.np, out_args.args[0]); 1812 of_node_put(out_args.np); 1813 return qmc_chan; 1814 } 1815 EXPORT_SYMBOL(qmc_chan_get_byphandles_index); 1816 1817 struct qmc_chan *qmc_chan_get_bychild(struct device_node *np) 1818 { 1819 struct device_node *qmc_np; 1820 u32 chan_index; 1821 int ret; 1822 1823 qmc_np = np->parent; 1824 ret = of_property_read_u32(np, "reg", &chan_index); 1825 if (ret) 1826 return ERR_PTR(-EINVAL); 1827 1828 return qmc_chan_get_from_qmc(qmc_np, chan_index); 1829 } 1830 EXPORT_SYMBOL(qmc_chan_get_bychild); 1831 1832 void qmc_chan_put(struct qmc_chan *chan) 1833 { 1834 put_device(chan->qmc->dev); 1835 } 1836 EXPORT_SYMBOL(qmc_chan_put); 1837 1838 static void devm_qmc_chan_release(struct device *dev, void *res) 1839 { 1840 struct qmc_chan **qmc_chan = res; 1841 1842 qmc_chan_put(*qmc_chan); 1843 } 1844 1845 struct qmc_chan *devm_qmc_chan_get_byphandles_index(struct device *dev, 1846 struct device_node *np, 1847 const char *phandles_name, 1848 int index) 1849 { 1850 struct qmc_chan *qmc_chan; 1851 struct qmc_chan **dr; 1852 1853 dr = devres_alloc(devm_qmc_chan_release, sizeof(*dr), GFP_KERNEL); 1854 if (!dr) 1855 return ERR_PTR(-ENOMEM); 1856 1857 qmc_chan = qmc_chan_get_byphandles_index(np, phandles_name, index); 1858 if (!IS_ERR(qmc_chan)) { 1859 *dr = qmc_chan; 1860 devres_add(dev, dr); 1861 } else { 1862 devres_free(dr); 1863 } 1864 1865 return qmc_chan; 1866 } 1867 EXPORT_SYMBOL(devm_qmc_chan_get_byphandles_index); 1868 1869 struct qmc_chan *devm_qmc_chan_get_bychild(struct device *dev, 1870 struct device_node *np) 1871 { 1872 struct qmc_chan *qmc_chan; 1873 struct qmc_chan **dr; 1874 1875 dr = devres_alloc(devm_qmc_chan_release, sizeof(*dr), GFP_KERNEL); 1876 if (!dr) 1877 return ERR_PTR(-ENOMEM); 1878 1879 qmc_chan = qmc_chan_get_bychild(np); 1880 if (!IS_ERR(qmc_chan)) { 1881 *dr = qmc_chan; 1882 devres_add(dev, dr); 1883 } else { 1884 devres_free(dr); 1885 } 1886 1887 return qmc_chan; 1888 } 1889 EXPORT_SYMBOL(devm_qmc_chan_get_bychild); 1890 1891 MODULE_AUTHOR("Herve Codina <herve.codina@bootlin.com>"); 1892 MODULE_DESCRIPTION("CPM QMC driver"); 1893 MODULE_LICENSE("GPL"); 1894