qmc.c 57 KB

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