tsa.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * TSA driver
  4. *
  5. * Copyright 2022 CS GROUP France
  6. *
  7. * Author: Herve Codina <herve.codina@bootlin.com>
  8. */
  9. #include "tsa.h"
  10. #include <dt-bindings/soc/cpm1-fsl,tsa.h>
  11. #include <dt-bindings/soc/qe-fsl,tsa.h>
  12. #include <linux/bitfield.h>
  13. #include <linux/clk.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/qe/ucc.h>
  21. /* TSA SI RAM routing tables entry (CPM1) */
  22. #define TSA_CPM1_SIRAM_ENTRY_LAST BIT(16)
  23. #define TSA_CPM1_SIRAM_ENTRY_BYTE BIT(17)
  24. #define TSA_CPM1_SIRAM_ENTRY_CNT_MASK GENMASK(21, 18)
  25. #define TSA_CPM1_SIRAM_ENTRY_CNT(x) FIELD_PREP(TSA_CPM1_SIRAM_ENTRY_CNT_MASK, x)
  26. #define TSA_CPM1_SIRAM_ENTRY_CSEL_MASK GENMASK(24, 22)
  27. #define TSA_CPM1_SIRAM_ENTRY_CSEL_NU FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x0)
  28. #define TSA_CPM1_SIRAM_ENTRY_CSEL_SCC2 FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x2)
  29. #define TSA_CPM1_SIRAM_ENTRY_CSEL_SCC3 FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x3)
  30. #define TSA_CPM1_SIRAM_ENTRY_CSEL_SCC4 FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x4)
  31. #define TSA_CPM1_SIRAM_ENTRY_CSEL_SMC1 FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x5)
  32. #define TSA_CPM1_SIRAM_ENTRY_CSEL_SMC2 FIELD_PREP_CONST(TSA_CPM1_SIRAM_ENTRY_CSEL_MASK, 0x6)
  33. /* TSA SI RAM routing tables entry (QE) */
  34. #define TSA_QE_SIRAM_ENTRY_LAST BIT(0)
  35. #define TSA_QE_SIRAM_ENTRY_BYTE BIT(1)
  36. #define TSA_QE_SIRAM_ENTRY_CNT_MASK GENMASK(4, 2)
  37. #define TSA_QE_SIRAM_ENTRY_CNT(x) FIELD_PREP(TSA_QE_SIRAM_ENTRY_CNT_MASK, x)
  38. #define TSA_QE_SIRAM_ENTRY_CSEL_MASK GENMASK(8, 5)
  39. #define TSA_QE_SIRAM_ENTRY_CSEL_NU FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0x0)
  40. #define TSA_QE_SIRAM_ENTRY_CSEL_UCC5 FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0x1)
  41. #define TSA_QE_SIRAM_ENTRY_CSEL_UCC1 FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0x9)
  42. #define TSA_QE_SIRAM_ENTRY_CSEL_UCC2 FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0xa)
  43. #define TSA_QE_SIRAM_ENTRY_CSEL_UCC3 FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0xb)
  44. #define TSA_QE_SIRAM_ENTRY_CSEL_UCC4 FIELD_PREP_CONST(TSA_QE_SIRAM_ENTRY_CSEL_MASK, 0xc)
  45. /*
  46. * SI mode register :
  47. * - CPM1: 32bit register split in 2*16bit (16bit TDM)
  48. * - QE: 4x16bit registers, one per TDM
  49. */
  50. #define TSA_CPM1_SIMODE 0x00
  51. #define TSA_QE_SIAMR 0x00
  52. #define TSA_QE_SIBMR 0x02
  53. #define TSA_QE_SICMR 0x04
  54. #define TSA_QE_SIDMR 0x06
  55. #define TSA_CPM1_SIMODE_SMC2 BIT(31)
  56. #define TSA_CPM1_SIMODE_SMC1 BIT(15)
  57. #define TSA_CPM1_SIMODE_TDMA_MASK GENMASK(11, 0)
  58. #define TSA_CPM1_SIMODE_TDMA(x) FIELD_PREP(TSA_CPM1_SIMODE_TDMA_MASK, x)
  59. #define TSA_CPM1_SIMODE_TDMB_MASK GENMASK(27, 16)
  60. #define TSA_CPM1_SIMODE_TDMB(x) FIELD_PREP(TSA_CPM1_SIMODE_TDMB_MASK, x)
  61. #define TSA_QE_SIMODE_TDM_SAD_MASK GENMASK(15, 12)
  62. #define TSA_QE_SIMODE_TDM_SAD(x) FIELD_PREP(TSA_QE_SIMODE_TDM_SAD_MASK, x)
  63. #define TSA_CPM1_SIMODE_TDM_MASK GENMASK(11, 0)
  64. #define TSA_SIMODE_TDM_SDM_MASK GENMASK(11, 10)
  65. #define TSA_SIMODE_TDM_SDM_NORM FIELD_PREP_CONST(TSA_SIMODE_TDM_SDM_MASK, 0x0)
  66. #define TSA_SIMODE_TDM_SDM_ECHO FIELD_PREP_CONST(TSA_SIMODE_TDM_SDM_MASK, 0x1)
  67. #define TSA_SIMODE_TDM_SDM_INTL_LOOP FIELD_PREP_CONST(TSA_SIMODE_TDM_SDM_MASK, 0x2)
  68. #define TSA_SIMODE_TDM_SDM_LOOP_CTRL FIELD_PREP_CONST(TSA_SIMODE_TDM_SDM_MASK, 0x3)
  69. #define TSA_SIMODE_TDM_RFSD_MASK GENMASK(9, 8)
  70. #define TSA_SIMODE_TDM_RFSD(x) FIELD_PREP(TSA_SIMODE_TDM_RFSD_MASK, x)
  71. #define TSA_SIMODE_TDM_DSC BIT(7)
  72. #define TSA_SIMODE_TDM_CRT BIT(6)
  73. #define TSA_CPM1_SIMODE_TDM_STZ BIT(5) /* bit 5: STZ in CPM1 */
  74. #define TSA_QE_SIMODE_TDM_SL BIT(5) /* bit 5: SL in QE */
  75. #define TSA_SIMODE_TDM_CE BIT(4)
  76. #define TSA_SIMODE_TDM_FE BIT(3)
  77. #define TSA_SIMODE_TDM_GM BIT(2)
  78. #define TSA_SIMODE_TDM_TFSD_MASK GENMASK(1, 0)
  79. #define TSA_SIMODE_TDM_TFSD(x) FIELD_PREP(TSA_SIMODE_TDM_TFSD_MASK, x)
  80. /* CPM SI global mode register (8 bits) */
  81. #define TSA_CPM1_SIGMR 0x04
  82. #define TSA_CPM1_SIGMR_ENB BIT(3)
  83. #define TSA_CPM1_SIGMR_ENA BIT(2)
  84. #define TSA_CPM1_SIGMR_RDM_MASK GENMASK(1, 0)
  85. #define TSA_CPM1_SIGMR_RDM_STATIC_TDMA FIELD_PREP_CONST(TSA_CPM1_SIGMR_RDM_MASK, 0x0)
  86. #define TSA_CPM1_SIGMR_RDM_DYN_TDMA FIELD_PREP_CONST(TSA_CPM1_SIGMR_RDM_MASK, 0x1)
  87. #define TSA_CPM1_SIGMR_RDM_STATIC_TDMAB FIELD_PREP_CONST(TSA_CPM1_SIGMR_RDM_MASK, 0x2)
  88. #define TSA_CPM1_SIGMR_RDM_DYN_TDMAB FIELD_PREP_CONST(TSA_CPM1_SIGMR_RDM_MASK, 0x3)
  89. /* QE SI global mode register high (8 bits) */
  90. #define TSA_QE_SIGLMRH 0x08
  91. #define TSA_QE_SIGLMRH_END BIT(3)
  92. #define TSA_QE_SIGLMRH_ENC BIT(2)
  93. #define TSA_QE_SIGLMRH_ENB BIT(1)
  94. #define TSA_QE_SIGLMRH_ENA BIT(0)
  95. /* SI clock route register (32 bits) */
  96. #define TSA_CPM1_SICR 0x0C
  97. #define TSA_CPM1_SICR_SCC2_MASK GENMASK(15, 8)
  98. #define TSA_CPM1_SICR_SCC2(x) FIELD_PREP(TSA_CPM1_SICR_SCC2_MASK, x)
  99. #define TSA_CPM1_SICR_SCC3_MASK GENMASK(23, 16)
  100. #define TSA_CPM1_SICR_SCC3(x) FIELD_PREP(TSA_CPM1_SICR_SCC3_MASK, x)
  101. #define TSA_CPM1_SICR_SCC4_MASK GENMASK(31, 24)
  102. #define TSA_CPM1_SICR_SCC4(x) FIELD_PREP(TSA_CPM1_SICR_SCC4_MASK, x)
  103. #define TSA_CPM1_SICR_SCC_MASK GENMASK(7, 0)
  104. #define TSA_CPM1_SICR_SCC_GRX BIT(7)
  105. #define TSA_CPM1_SICR_SCC_SCX_TSA BIT(6)
  106. #define TSA_CPM1_SICR_SCC_RXCS_MASK GENMASK(5, 3)
  107. #define TSA_CPM1_SICR_SCC_RXCS_BRG1 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x0)
  108. #define TSA_CPM1_SICR_SCC_RXCS_BRG2 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x1)
  109. #define TSA_CPM1_SICR_SCC_RXCS_BRG3 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x2)
  110. #define TSA_CPM1_SICR_SCC_RXCS_BRG4 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x3)
  111. #define TSA_CPM1_SICR_SCC_RXCS_CLK15 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x4)
  112. #define TSA_CPM1_SICR_SCC_RXCS_CLK26 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x5)
  113. #define TSA_CPM1_SICR_SCC_RXCS_CLK37 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x6)
  114. #define TSA_CPM1_SICR_SCC_RXCS_CLK48 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_RXCS_MASK, 0x7)
  115. #define TSA_CPM1_SICR_SCC_TXCS_MASK GENMASK(2, 0)
  116. #define TSA_CPM1_SICR_SCC_TXCS_BRG1 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x0)
  117. #define TSA_CPM1_SICR_SCC_TXCS_BRG2 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x1)
  118. #define TSA_CPM1_SICR_SCC_TXCS_BRG3 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x2)
  119. #define TSA_CPM1_SICR_SCC_TXCS_BRG4 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x3)
  120. #define TSA_CPM1_SICR_SCC_TXCS_CLK15 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x4)
  121. #define TSA_CPM1_SICR_SCC_TXCS_CLK26 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x5)
  122. #define TSA_CPM1_SICR_SCC_TXCS_CLK37 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x6)
  123. #define TSA_CPM1_SICR_SCC_TXCS_CLK48 FIELD_PREP_CONST(TSA_CPM1_SICR_SCC_TXCS_MASK, 0x7)
  124. struct tsa_entries_area {
  125. void __iomem *entries_start;
  126. void __iomem *entries_next;
  127. void __iomem *last_entry;
  128. };
  129. struct tsa_tdm {
  130. bool is_enable;
  131. struct clk *l1rclk_clk;
  132. struct clk *l1rsync_clk;
  133. struct clk *l1tclk_clk;
  134. struct clk *l1tsync_clk;
  135. u32 simode_tdm;
  136. };
  137. #define TSA_TDMA 0
  138. #define TSA_TDMB 1
  139. #define TSA_TDMC 2 /* QE implementation only */
  140. #define TSA_TDMD 3 /* QE implementation only */
  141. enum tsa_version {
  142. TSA_CPM1 = 1, /* Avoid 0 value */
  143. TSA_QE,
  144. };
  145. struct tsa {
  146. struct device *dev;
  147. void __iomem *si_regs;
  148. void __iomem *si_ram;
  149. resource_size_t si_ram_sz;
  150. spinlock_t lock; /* Lock for read/modify/write sequence */
  151. enum tsa_version version;
  152. int tdms; /* TSA_TDMx ORed */
  153. #if IS_ENABLED(CONFIG_QUICC_ENGINE)
  154. struct tsa_tdm tdm[4]; /* TDMa, TDMb, TDMc and TDMd */
  155. #else
  156. struct tsa_tdm tdm[2]; /* TDMa and TDMb */
  157. #endif
  158. /* Same number of serials for CPM1 and QE:
  159. * CPM1: NU, 3 SCCs and 2 SMCs
  160. * QE: NU and 5 UCCs
  161. */
  162. struct tsa_serial {
  163. unsigned int id;
  164. struct tsa_serial_info info;
  165. } serials[6];
  166. };
  167. static inline struct tsa *tsa_serial_get_tsa(struct tsa_serial *tsa_serial)
  168. {
  169. /* The serials table is indexed by the serial id */
  170. return container_of(tsa_serial, struct tsa, serials[tsa_serial->id]);
  171. }
  172. static inline void tsa_write32(void __iomem *addr, u32 val)
  173. {
  174. iowrite32be(val, addr);
  175. }
  176. static inline void tsa_write16(void __iomem *addr, u16 val)
  177. {
  178. iowrite16be(val, addr);
  179. }
  180. static inline void tsa_write8(void __iomem *addr, u8 val)
  181. {
  182. iowrite8(val, addr);
  183. }
  184. static inline u32 tsa_read32(void __iomem *addr)
  185. {
  186. return ioread32be(addr);
  187. }
  188. static inline u16 tsa_read16(void __iomem *addr)
  189. {
  190. return ioread16be(addr);
  191. }
  192. static inline void tsa_clrbits32(void __iomem *addr, u32 clr)
  193. {
  194. tsa_write32(addr, tsa_read32(addr) & ~clr);
  195. }
  196. static inline void tsa_clrbits16(void __iomem *addr, u16 clr)
  197. {
  198. tsa_write16(addr, tsa_read16(addr) & ~clr);
  199. }
  200. static inline void tsa_clrsetbits32(void __iomem *addr, u32 clr, u32 set)
  201. {
  202. tsa_write32(addr, (tsa_read32(addr) & ~clr) | set);
  203. }
  204. static bool tsa_is_qe(const struct tsa *tsa)
  205. {
  206. if (IS_ENABLED(CONFIG_QUICC_ENGINE) && IS_ENABLED(CONFIG_CPM))
  207. return tsa->version == TSA_QE;
  208. return IS_ENABLED(CONFIG_QUICC_ENGINE);
  209. }
  210. static int tsa_qe_serial_get_num(struct tsa_serial *tsa_serial)
  211. {
  212. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  213. switch (tsa_serial->id) {
  214. case FSL_QE_TSA_UCC1: return 0;
  215. case FSL_QE_TSA_UCC2: return 1;
  216. case FSL_QE_TSA_UCC3: return 2;
  217. case FSL_QE_TSA_UCC4: return 3;
  218. case FSL_QE_TSA_UCC5: return 4;
  219. default:
  220. break;
  221. }
  222. dev_err(tsa->dev, "Unsupported serial id %u\n", tsa_serial->id);
  223. return -EINVAL;
  224. }
  225. int tsa_serial_get_num(struct tsa_serial *tsa_serial)
  226. {
  227. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  228. /*
  229. * There is no need to get the serial num out of the TSA driver in the
  230. * CPM case.
  231. * Further more, in CPM, we can have 2 types of serial SCCs and FCCs.
  232. * What kind of numbering to use that can be global to both SCCs and
  233. * FCCs ?
  234. */
  235. return tsa_is_qe(tsa) ? tsa_qe_serial_get_num(tsa_serial) : -EOPNOTSUPP;
  236. }
  237. EXPORT_SYMBOL(tsa_serial_get_num);
  238. static int tsa_cpm1_serial_connect(struct tsa_serial *tsa_serial, bool connect)
  239. {
  240. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  241. unsigned long flags;
  242. u32 clear;
  243. u32 set;
  244. switch (tsa_serial->id) {
  245. case FSL_CPM_TSA_SCC2:
  246. clear = TSA_CPM1_SICR_SCC2(TSA_CPM1_SICR_SCC_MASK);
  247. set = TSA_CPM1_SICR_SCC2(TSA_CPM1_SICR_SCC_SCX_TSA);
  248. break;
  249. case FSL_CPM_TSA_SCC3:
  250. clear = TSA_CPM1_SICR_SCC3(TSA_CPM1_SICR_SCC_MASK);
  251. set = TSA_CPM1_SICR_SCC3(TSA_CPM1_SICR_SCC_SCX_TSA);
  252. break;
  253. case FSL_CPM_TSA_SCC4:
  254. clear = TSA_CPM1_SICR_SCC4(TSA_CPM1_SICR_SCC_MASK);
  255. set = TSA_CPM1_SICR_SCC4(TSA_CPM1_SICR_SCC_SCX_TSA);
  256. break;
  257. default:
  258. dev_err(tsa->dev, "Unsupported serial id %u\n", tsa_serial->id);
  259. return -EINVAL;
  260. }
  261. spin_lock_irqsave(&tsa->lock, flags);
  262. tsa_clrsetbits32(tsa->si_regs + TSA_CPM1_SICR, clear,
  263. connect ? set : 0);
  264. spin_unlock_irqrestore(&tsa->lock, flags);
  265. return 0;
  266. }
  267. static int tsa_qe_serial_connect(struct tsa_serial *tsa_serial, bool connect)
  268. {
  269. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  270. unsigned long flags;
  271. int ucc_num;
  272. int ret;
  273. ucc_num = tsa_qe_serial_get_num(tsa_serial);
  274. if (ucc_num < 0)
  275. return ucc_num;
  276. spin_lock_irqsave(&tsa->lock, flags);
  277. ret = ucc_set_qe_mux_tsa(ucc_num, connect);
  278. spin_unlock_irqrestore(&tsa->lock, flags);
  279. if (ret) {
  280. dev_err(tsa->dev, "Connect serial id %u to TSA failed (%d)\n",
  281. tsa_serial->id, ret);
  282. return ret;
  283. }
  284. return 0;
  285. }
  286. int tsa_serial_connect(struct tsa_serial *tsa_serial)
  287. {
  288. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  289. return tsa_is_qe(tsa) ?
  290. tsa_qe_serial_connect(tsa_serial, true) :
  291. tsa_cpm1_serial_connect(tsa_serial, true);
  292. }
  293. EXPORT_SYMBOL(tsa_serial_connect);
  294. int tsa_serial_disconnect(struct tsa_serial *tsa_serial)
  295. {
  296. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  297. return tsa_is_qe(tsa) ?
  298. tsa_qe_serial_connect(tsa_serial, false) :
  299. tsa_cpm1_serial_connect(tsa_serial, false);
  300. }
  301. EXPORT_SYMBOL(tsa_serial_disconnect);
  302. int tsa_serial_get_info(struct tsa_serial *tsa_serial, struct tsa_serial_info *info)
  303. {
  304. memcpy(info, &tsa_serial->info, sizeof(*info));
  305. return 0;
  306. }
  307. EXPORT_SYMBOL(tsa_serial_get_info);
  308. static void tsa_cpm1_init_entries_area(struct tsa *tsa, struct tsa_entries_area *area,
  309. u32 tdms, u32 tdm_id, bool is_rx)
  310. {
  311. resource_size_t quarter;
  312. resource_size_t half;
  313. quarter = tsa->si_ram_sz / 4;
  314. half = tsa->si_ram_sz / 2;
  315. if (tdms == BIT(TSA_TDMA)) {
  316. /* Only TDMA */
  317. if (is_rx) {
  318. /* First half of si_ram */
  319. area->entries_start = tsa->si_ram;
  320. area->entries_next = area->entries_start + half;
  321. area->last_entry = NULL;
  322. } else {
  323. /* Second half of si_ram */
  324. area->entries_start = tsa->si_ram + half;
  325. area->entries_next = area->entries_start + half;
  326. area->last_entry = NULL;
  327. }
  328. } else {
  329. /* Only TDMB or both TDMs */
  330. if (tdm_id == TSA_TDMA) {
  331. if (is_rx) {
  332. /* First half of first half of si_ram */
  333. area->entries_start = tsa->si_ram;
  334. area->entries_next = area->entries_start + quarter;
  335. area->last_entry = NULL;
  336. } else {
  337. /* First half of second half of si_ram */
  338. area->entries_start = tsa->si_ram + (2 * quarter);
  339. area->entries_next = area->entries_start + quarter;
  340. area->last_entry = NULL;
  341. }
  342. } else {
  343. if (is_rx) {
  344. /* Second half of first half of si_ram */
  345. area->entries_start = tsa->si_ram + quarter;
  346. area->entries_next = area->entries_start + quarter;
  347. area->last_entry = NULL;
  348. } else {
  349. /* Second half of second half of si_ram */
  350. area->entries_start = tsa->si_ram + (3 * quarter);
  351. area->entries_next = area->entries_start + quarter;
  352. area->last_entry = NULL;
  353. }
  354. }
  355. }
  356. }
  357. static void tsa_qe_init_entries_area(struct tsa *tsa, struct tsa_entries_area *area,
  358. u32 tdms, u32 tdm_id, bool is_rx)
  359. {
  360. resource_size_t eighth;
  361. resource_size_t half;
  362. eighth = tsa->si_ram_sz / 8;
  363. half = tsa->si_ram_sz / 2;
  364. /*
  365. * One half of the SI RAM used for Tx, the other one for Rx.
  366. * In each half, 1/4 of the area is assigned to each TDM.
  367. */
  368. if (is_rx) {
  369. /* Rx: Second half of si_ram */
  370. area->entries_start = tsa->si_ram + half + (eighth * tdm_id);
  371. area->entries_next = area->entries_start + eighth;
  372. area->last_entry = NULL;
  373. } else {
  374. /* Tx: First half of si_ram */
  375. area->entries_start = tsa->si_ram + (eighth * tdm_id);
  376. area->entries_next = area->entries_start + eighth;
  377. area->last_entry = NULL;
  378. }
  379. }
  380. static void tsa_init_entries_area(struct tsa *tsa, struct tsa_entries_area *area,
  381. u32 tdms, u32 tdm_id, bool is_rx)
  382. {
  383. if (tsa_is_qe(tsa))
  384. tsa_qe_init_entries_area(tsa, area, tdms, tdm_id, is_rx);
  385. else
  386. tsa_cpm1_init_entries_area(tsa, area, tdms, tdm_id, is_rx);
  387. }
  388. static const char *tsa_cpm1_serial_id2name(struct tsa *tsa, u32 serial_id)
  389. {
  390. switch (serial_id) {
  391. case FSL_CPM_TSA_NU: return "Not used";
  392. case FSL_CPM_TSA_SCC2: return "SCC2";
  393. case FSL_CPM_TSA_SCC3: return "SCC3";
  394. case FSL_CPM_TSA_SCC4: return "SCC4";
  395. case FSL_CPM_TSA_SMC1: return "SMC1";
  396. case FSL_CPM_TSA_SMC2: return "SMC2";
  397. default:
  398. break;
  399. }
  400. return NULL;
  401. }
  402. static const char *tsa_qe_serial_id2name(struct tsa *tsa, u32 serial_id)
  403. {
  404. switch (serial_id) {
  405. case FSL_QE_TSA_NU: return "Not used";
  406. case FSL_QE_TSA_UCC1: return "UCC1";
  407. case FSL_QE_TSA_UCC2: return "UCC2";
  408. case FSL_QE_TSA_UCC3: return "UCC3";
  409. case FSL_QE_TSA_UCC4: return "UCC4";
  410. case FSL_QE_TSA_UCC5: return "UCC5";
  411. default:
  412. break;
  413. }
  414. return NULL;
  415. }
  416. static const char *tsa_serial_id2name(struct tsa *tsa, u32 serial_id)
  417. {
  418. return tsa_is_qe(tsa) ?
  419. tsa_qe_serial_id2name(tsa, serial_id) :
  420. tsa_cpm1_serial_id2name(tsa, serial_id);
  421. }
  422. static u32 tsa_cpm1_serial_id2csel(struct tsa *tsa, u32 serial_id)
  423. {
  424. switch (serial_id) {
  425. case FSL_CPM_TSA_SCC2: return TSA_CPM1_SIRAM_ENTRY_CSEL_SCC2;
  426. case FSL_CPM_TSA_SCC3: return TSA_CPM1_SIRAM_ENTRY_CSEL_SCC3;
  427. case FSL_CPM_TSA_SCC4: return TSA_CPM1_SIRAM_ENTRY_CSEL_SCC4;
  428. case FSL_CPM_TSA_SMC1: return TSA_CPM1_SIRAM_ENTRY_CSEL_SMC1;
  429. case FSL_CPM_TSA_SMC2: return TSA_CPM1_SIRAM_ENTRY_CSEL_SMC2;
  430. default:
  431. break;
  432. }
  433. return TSA_CPM1_SIRAM_ENTRY_CSEL_NU;
  434. }
  435. static int tsa_cpm1_add_entry(struct tsa *tsa, struct tsa_entries_area *area,
  436. u32 count, u32 serial_id)
  437. {
  438. void __iomem *addr;
  439. u32 left;
  440. u32 val;
  441. u32 cnt;
  442. u32 nb;
  443. addr = area->last_entry ? area->last_entry + 4 : area->entries_start;
  444. nb = DIV_ROUND_UP(count, 8);
  445. if ((addr + (nb * 4)) > area->entries_next) {
  446. dev_err(tsa->dev, "si ram area full\n");
  447. return -ENOSPC;
  448. }
  449. if (area->last_entry) {
  450. /* Clear last flag */
  451. tsa_clrbits32(area->last_entry, TSA_CPM1_SIRAM_ENTRY_LAST);
  452. }
  453. left = count;
  454. while (left) {
  455. val = TSA_CPM1_SIRAM_ENTRY_BYTE | tsa_cpm1_serial_id2csel(tsa, serial_id);
  456. if (left > 16) {
  457. cnt = 16;
  458. } else {
  459. cnt = left;
  460. val |= TSA_CPM1_SIRAM_ENTRY_LAST;
  461. area->last_entry = addr;
  462. }
  463. val |= TSA_CPM1_SIRAM_ENTRY_CNT(cnt - 1);
  464. tsa_write32(addr, val);
  465. addr += 4;
  466. left -= cnt;
  467. }
  468. return 0;
  469. }
  470. static u32 tsa_qe_serial_id2csel(struct tsa *tsa, u32 serial_id)
  471. {
  472. switch (serial_id) {
  473. case FSL_QE_TSA_UCC1: return TSA_QE_SIRAM_ENTRY_CSEL_UCC1;
  474. case FSL_QE_TSA_UCC2: return TSA_QE_SIRAM_ENTRY_CSEL_UCC2;
  475. case FSL_QE_TSA_UCC3: return TSA_QE_SIRAM_ENTRY_CSEL_UCC3;
  476. case FSL_QE_TSA_UCC4: return TSA_QE_SIRAM_ENTRY_CSEL_UCC4;
  477. case FSL_QE_TSA_UCC5: return TSA_QE_SIRAM_ENTRY_CSEL_UCC5;
  478. default:
  479. break;
  480. }
  481. return TSA_QE_SIRAM_ENTRY_CSEL_NU;
  482. }
  483. static int tsa_qe_add_entry(struct tsa *tsa, struct tsa_entries_area *area,
  484. u32 count, u32 serial_id)
  485. {
  486. void __iomem *addr;
  487. u32 left;
  488. u32 val;
  489. u32 cnt;
  490. u32 nb;
  491. addr = area->last_entry ? area->last_entry + 2 : area->entries_start;
  492. nb = DIV_ROUND_UP(count, 8);
  493. if ((addr + (nb * 2)) > area->entries_next) {
  494. dev_err(tsa->dev, "si ram area full\n");
  495. return -ENOSPC;
  496. }
  497. if (area->last_entry) {
  498. /* Clear last flag */
  499. tsa_clrbits16(area->last_entry, TSA_QE_SIRAM_ENTRY_LAST);
  500. }
  501. left = count;
  502. while (left) {
  503. val = TSA_QE_SIRAM_ENTRY_BYTE | tsa_qe_serial_id2csel(tsa, serial_id);
  504. if (left > 8) {
  505. cnt = 8;
  506. } else {
  507. cnt = left;
  508. val |= TSA_QE_SIRAM_ENTRY_LAST;
  509. area->last_entry = addr;
  510. }
  511. val |= TSA_QE_SIRAM_ENTRY_CNT(cnt - 1);
  512. tsa_write16(addr, val);
  513. addr += 2;
  514. left -= cnt;
  515. }
  516. return 0;
  517. }
  518. static int tsa_add_entry(struct tsa *tsa, struct tsa_entries_area *area,
  519. u32 count, u32 serial_id)
  520. {
  521. return tsa_is_qe(tsa) ?
  522. tsa_qe_add_entry(tsa, area, count, serial_id) :
  523. tsa_cpm1_add_entry(tsa, area, count, serial_id);
  524. }
  525. static int tsa_of_parse_tdm_route(struct tsa *tsa, struct device_node *tdm_np,
  526. u32 tdms, u32 tdm_id, bool is_rx)
  527. {
  528. struct tsa_entries_area area;
  529. const char *route_name;
  530. u32 serial_id;
  531. int len, i;
  532. u32 count;
  533. const char *serial_name;
  534. struct tsa_serial_info *serial_info;
  535. struct tsa_tdm *tdm;
  536. int ret;
  537. u32 ts;
  538. route_name = is_rx ? "fsl,rx-ts-routes" : "fsl,tx-ts-routes";
  539. len = of_property_count_u32_elems(tdm_np, route_name);
  540. if (len < 0) {
  541. dev_err(tsa->dev, "%pOF: failed to read %s\n", tdm_np, route_name);
  542. return len;
  543. }
  544. if (len % 2 != 0) {
  545. dev_err(tsa->dev, "%pOF: wrong %s format\n", tdm_np, route_name);
  546. return -EINVAL;
  547. }
  548. tsa_init_entries_area(tsa, &area, tdms, tdm_id, is_rx);
  549. ts = 0;
  550. for (i = 0; i < len; i += 2) {
  551. of_property_read_u32_index(tdm_np, route_name, i, &count);
  552. of_property_read_u32_index(tdm_np, route_name, i + 1, &serial_id);
  553. if (serial_id >= ARRAY_SIZE(tsa->serials)) {
  554. dev_err(tsa->dev, "%pOF: invalid serial id (%u)\n",
  555. tdm_np, serial_id);
  556. return -EINVAL;
  557. }
  558. serial_name = tsa_serial_id2name(tsa, serial_id);
  559. if (!serial_name) {
  560. dev_err(tsa->dev, "%pOF: unsupported serial id (%u)\n",
  561. tdm_np, serial_id);
  562. return -EINVAL;
  563. }
  564. dev_dbg(tsa->dev, "tdm_id=%u, %s ts %u..%u -> %s\n",
  565. tdm_id, route_name, ts, ts + count - 1, serial_name);
  566. ts += count;
  567. ret = tsa_add_entry(tsa, &area, count, serial_id);
  568. if (ret)
  569. return ret;
  570. serial_info = &tsa->serials[serial_id].info;
  571. tdm = &tsa->tdm[tdm_id];
  572. if (is_rx) {
  573. serial_info->rx_fs_rate = clk_get_rate(tdm->l1rsync_clk);
  574. serial_info->rx_bit_rate = clk_get_rate(tdm->l1rclk_clk);
  575. serial_info->nb_rx_ts += count;
  576. } else {
  577. serial_info->tx_fs_rate = tdm->l1tsync_clk ?
  578. clk_get_rate(tdm->l1tsync_clk) :
  579. clk_get_rate(tdm->l1rsync_clk);
  580. serial_info->tx_bit_rate = tdm->l1tclk_clk ?
  581. clk_get_rate(tdm->l1tclk_clk) :
  582. clk_get_rate(tdm->l1rclk_clk);
  583. serial_info->nb_tx_ts += count;
  584. }
  585. }
  586. return 0;
  587. }
  588. static inline int tsa_of_parse_tdm_rx_route(struct tsa *tsa,
  589. struct device_node *tdm_np,
  590. u32 tdms, u32 tdm_id)
  591. {
  592. return tsa_of_parse_tdm_route(tsa, tdm_np, tdms, tdm_id, true);
  593. }
  594. static inline int tsa_of_parse_tdm_tx_route(struct tsa *tsa,
  595. struct device_node *tdm_np,
  596. u32 tdms, u32 tdm_id)
  597. {
  598. return tsa_of_parse_tdm_route(tsa, tdm_np, tdms, tdm_id, false);
  599. }
  600. static int tsa_of_parse_tdms(struct tsa *tsa, struct device_node *np)
  601. {
  602. struct device_node *tdm_np;
  603. struct tsa_tdm *tdm;
  604. struct clk *clk;
  605. u32 tdm_id, val;
  606. int ret;
  607. int i;
  608. tsa->tdms = 0;
  609. for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++)
  610. tsa->tdm[i].is_enable = false;
  611. for_each_available_child_of_node(np, tdm_np) {
  612. ret = of_property_read_u32(tdm_np, "reg", &tdm_id);
  613. if (ret) {
  614. dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
  615. of_node_put(tdm_np);
  616. return ret;
  617. }
  618. switch (tdm_id) {
  619. case 0:
  620. tsa->tdms |= BIT(TSA_TDMA);
  621. break;
  622. case 1:
  623. tsa->tdms |= BIT(TSA_TDMB);
  624. break;
  625. case 2:
  626. if (!tsa_is_qe(tsa))
  627. goto invalid_tdm; /* Not available on CPM1 */
  628. tsa->tdms |= BIT(TSA_TDMC);
  629. break;
  630. case 3:
  631. if (!tsa_is_qe(tsa))
  632. goto invalid_tdm; /* Not available on CPM1 */
  633. tsa->tdms |= BIT(TSA_TDMD);
  634. break;
  635. default:
  636. invalid_tdm:
  637. dev_err(tsa->dev, "%pOF: Invalid tdm_id (%u)\n", tdm_np,
  638. tdm_id);
  639. of_node_put(tdm_np);
  640. return -EINVAL;
  641. }
  642. }
  643. for_each_available_child_of_node(np, tdm_np) {
  644. ret = of_property_read_u32(tdm_np, "reg", &tdm_id);
  645. if (ret) {
  646. dev_err(tsa->dev, "%pOF: failed to read reg\n", tdm_np);
  647. of_node_put(tdm_np);
  648. return ret;
  649. }
  650. tdm = &tsa->tdm[tdm_id];
  651. tdm->simode_tdm = TSA_SIMODE_TDM_SDM_NORM;
  652. val = 0;
  653. ret = of_property_read_u32(tdm_np, "fsl,rx-frame-sync-delay-bits",
  654. &val);
  655. if (ret && ret != -EINVAL) {
  656. dev_err(tsa->dev,
  657. "%pOF: failed to read fsl,rx-frame-sync-delay-bits\n",
  658. tdm_np);
  659. of_node_put(tdm_np);
  660. return ret;
  661. }
  662. if (val > 3) {
  663. dev_err(tsa->dev,
  664. "%pOF: Invalid fsl,rx-frame-sync-delay-bits (%u)\n",
  665. tdm_np, val);
  666. of_node_put(tdm_np);
  667. return -EINVAL;
  668. }
  669. tdm->simode_tdm |= TSA_SIMODE_TDM_RFSD(val);
  670. val = 0;
  671. ret = of_property_read_u32(tdm_np, "fsl,tx-frame-sync-delay-bits",
  672. &val);
  673. if (ret && ret != -EINVAL) {
  674. dev_err(tsa->dev,
  675. "%pOF: failed to read fsl,tx-frame-sync-delay-bits\n",
  676. tdm_np);
  677. of_node_put(tdm_np);
  678. return ret;
  679. }
  680. if (val > 3) {
  681. dev_err(tsa->dev,
  682. "%pOF: Invalid fsl,tx-frame-sync-delay-bits (%u)\n",
  683. tdm_np, val);
  684. of_node_put(tdm_np);
  685. return -EINVAL;
  686. }
  687. tdm->simode_tdm |= TSA_SIMODE_TDM_TFSD(val);
  688. if (of_property_read_bool(tdm_np, "fsl,common-rxtx-pins"))
  689. tdm->simode_tdm |= TSA_SIMODE_TDM_CRT;
  690. if (of_property_read_bool(tdm_np, "fsl,clock-falling-edge"))
  691. tdm->simode_tdm |= TSA_SIMODE_TDM_CE;
  692. if (of_property_read_bool(tdm_np, "fsl,fsync-rising-edge"))
  693. tdm->simode_tdm |= TSA_SIMODE_TDM_FE;
  694. if (tsa_is_qe(tsa) &&
  695. of_property_read_bool(tdm_np, "fsl,fsync-active-low"))
  696. tdm->simode_tdm |= TSA_QE_SIMODE_TDM_SL;
  697. if (of_property_read_bool(tdm_np, "fsl,double-speed-clock"))
  698. tdm->simode_tdm |= TSA_SIMODE_TDM_DSC;
  699. clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rsync" : "l1rsync");
  700. if (IS_ERR(clk)) {
  701. ret = PTR_ERR(clk);
  702. of_node_put(tdm_np);
  703. goto err;
  704. }
  705. ret = clk_prepare_enable(clk);
  706. if (ret) {
  707. clk_put(clk);
  708. of_node_put(tdm_np);
  709. goto err;
  710. }
  711. tdm->l1rsync_clk = clk;
  712. clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "rclk" : "l1rclk");
  713. if (IS_ERR(clk)) {
  714. ret = PTR_ERR(clk);
  715. of_node_put(tdm_np);
  716. goto err;
  717. }
  718. ret = clk_prepare_enable(clk);
  719. if (ret) {
  720. clk_put(clk);
  721. of_node_put(tdm_np);
  722. goto err;
  723. }
  724. tdm->l1rclk_clk = clk;
  725. if (!(tdm->simode_tdm & TSA_SIMODE_TDM_CRT)) {
  726. clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tsync" : "l1tsync");
  727. if (IS_ERR(clk)) {
  728. ret = PTR_ERR(clk);
  729. of_node_put(tdm_np);
  730. goto err;
  731. }
  732. ret = clk_prepare_enable(clk);
  733. if (ret) {
  734. clk_put(clk);
  735. of_node_put(tdm_np);
  736. goto err;
  737. }
  738. tdm->l1tsync_clk = clk;
  739. clk = of_clk_get_by_name(tdm_np, tsa_is_qe(tsa) ? "tclk" : "l1tclk");
  740. if (IS_ERR(clk)) {
  741. ret = PTR_ERR(clk);
  742. of_node_put(tdm_np);
  743. goto err;
  744. }
  745. ret = clk_prepare_enable(clk);
  746. if (ret) {
  747. clk_put(clk);
  748. of_node_put(tdm_np);
  749. goto err;
  750. }
  751. tdm->l1tclk_clk = clk;
  752. }
  753. if (tsa_is_qe(tsa)) {
  754. /*
  755. * The starting address for TSA table must be set.
  756. * 512 entries for Tx and 512 entries for Rx are
  757. * available for 4 TDMs.
  758. * We assign entries equally -> 128 Rx/Tx entries per
  759. * TDM. In other words, 4 blocks of 32 entries per TDM.
  760. */
  761. tdm->simode_tdm |= TSA_QE_SIMODE_TDM_SAD(4 * tdm_id);
  762. }
  763. ret = tsa_of_parse_tdm_rx_route(tsa, tdm_np, tsa->tdms, tdm_id);
  764. if (ret) {
  765. of_node_put(tdm_np);
  766. goto err;
  767. }
  768. ret = tsa_of_parse_tdm_tx_route(tsa, tdm_np, tsa->tdms, tdm_id);
  769. if (ret) {
  770. of_node_put(tdm_np);
  771. goto err;
  772. }
  773. tdm->is_enable = true;
  774. }
  775. return 0;
  776. err:
  777. for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++) {
  778. if (tsa->tdm[i].l1rsync_clk) {
  779. clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
  780. clk_put(tsa->tdm[i].l1rsync_clk);
  781. }
  782. if (tsa->tdm[i].l1rclk_clk) {
  783. clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
  784. clk_put(tsa->tdm[i].l1rclk_clk);
  785. }
  786. if (tsa->tdm[i].l1tsync_clk) {
  787. clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
  788. clk_put(tsa->tdm[i].l1rsync_clk);
  789. }
  790. if (tsa->tdm[i].l1tclk_clk) {
  791. clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
  792. clk_put(tsa->tdm[i].l1rclk_clk);
  793. }
  794. }
  795. return ret;
  796. }
  797. static void tsa_init_si_ram(struct tsa *tsa)
  798. {
  799. resource_size_t i;
  800. /* Fill all entries as the last one */
  801. if (tsa_is_qe(tsa)) {
  802. for (i = 0; i < tsa->si_ram_sz; i += 2)
  803. tsa_write16(tsa->si_ram + i, TSA_QE_SIRAM_ENTRY_LAST);
  804. } else {
  805. for (i = 0; i < tsa->si_ram_sz; i += 4)
  806. tsa_write32(tsa->si_ram + i, TSA_CPM1_SIRAM_ENTRY_LAST);
  807. }
  808. }
  809. static int tsa_cpm1_setup(struct tsa *tsa)
  810. {
  811. u32 val;
  812. /* Set SIMODE */
  813. val = 0;
  814. if (tsa->tdm[0].is_enable)
  815. val |= TSA_CPM1_SIMODE_TDMA(tsa->tdm[0].simode_tdm);
  816. if (tsa->tdm[1].is_enable)
  817. val |= TSA_CPM1_SIMODE_TDMB(tsa->tdm[1].simode_tdm);
  818. tsa_clrsetbits32(tsa->si_regs + TSA_CPM1_SIMODE,
  819. TSA_CPM1_SIMODE_TDMA(TSA_CPM1_SIMODE_TDM_MASK) |
  820. TSA_CPM1_SIMODE_TDMB(TSA_CPM1_SIMODE_TDM_MASK),
  821. val);
  822. /* Set SIGMR */
  823. val = (tsa->tdms == BIT(TSA_TDMA)) ?
  824. TSA_CPM1_SIGMR_RDM_STATIC_TDMA : TSA_CPM1_SIGMR_RDM_STATIC_TDMAB;
  825. if (tsa->tdms & BIT(TSA_TDMA))
  826. val |= TSA_CPM1_SIGMR_ENA;
  827. if (tsa->tdms & BIT(TSA_TDMB))
  828. val |= TSA_CPM1_SIGMR_ENB;
  829. tsa_write8(tsa->si_regs + TSA_CPM1_SIGMR, val);
  830. return 0;
  831. }
  832. static int tsa_qe_setup(struct tsa *tsa)
  833. {
  834. unsigned int sixmr;
  835. u8 siglmrh = 0;
  836. unsigned int i;
  837. for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++) {
  838. if (!tsa->tdm[i].is_enable)
  839. continue;
  840. switch (i) {
  841. case 0:
  842. sixmr = TSA_QE_SIAMR;
  843. siglmrh |= TSA_QE_SIGLMRH_ENA;
  844. break;
  845. case 1:
  846. sixmr = TSA_QE_SIBMR;
  847. siglmrh |= TSA_QE_SIGLMRH_ENB;
  848. break;
  849. case 2:
  850. sixmr = TSA_QE_SICMR;
  851. siglmrh |= TSA_QE_SIGLMRH_ENC;
  852. break;
  853. case 3:
  854. sixmr = TSA_QE_SIDMR;
  855. siglmrh |= TSA_QE_SIGLMRH_END;
  856. break;
  857. default:
  858. return -EINVAL;
  859. }
  860. /* Set SI mode register */
  861. tsa_write16(tsa->si_regs + sixmr, tsa->tdm[i].simode_tdm);
  862. }
  863. /* Enable TDMs */
  864. tsa_write8(tsa->si_regs + TSA_QE_SIGLMRH, siglmrh);
  865. return 0;
  866. }
  867. static int tsa_setup(struct tsa *tsa)
  868. {
  869. return tsa_is_qe(tsa) ? tsa_qe_setup(tsa) : tsa_cpm1_setup(tsa);
  870. }
  871. static int tsa_probe(struct platform_device *pdev)
  872. {
  873. struct device_node *np = pdev->dev.of_node;
  874. struct resource *res;
  875. struct tsa *tsa;
  876. unsigned int i;
  877. int ret;
  878. tsa = devm_kzalloc(&pdev->dev, sizeof(*tsa), GFP_KERNEL);
  879. if (!tsa)
  880. return -ENOMEM;
  881. tsa->dev = &pdev->dev;
  882. tsa->version = (enum tsa_version)(uintptr_t)of_device_get_match_data(&pdev->dev);
  883. switch (tsa->version) {
  884. case TSA_CPM1:
  885. dev_info(tsa->dev, "CPM1 version\n");
  886. break;
  887. case TSA_QE:
  888. dev_info(tsa->dev, "QE version\n");
  889. break;
  890. default:
  891. dev_err(tsa->dev, "Unknown version (%d)\n", tsa->version);
  892. return -EINVAL;
  893. }
  894. for (i = 0; i < ARRAY_SIZE(tsa->serials); i++)
  895. tsa->serials[i].id = i;
  896. spin_lock_init(&tsa->lock);
  897. tsa->si_regs = devm_platform_ioremap_resource_byname(pdev, "si_regs");
  898. if (IS_ERR(tsa->si_regs))
  899. return PTR_ERR(tsa->si_regs);
  900. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "si_ram");
  901. if (!res) {
  902. dev_err(tsa->dev, "si_ram resource missing\n");
  903. return -EINVAL;
  904. }
  905. tsa->si_ram_sz = resource_size(res);
  906. tsa->si_ram = devm_ioremap_resource(&pdev->dev, res);
  907. if (IS_ERR(tsa->si_ram))
  908. return PTR_ERR(tsa->si_ram);
  909. tsa_init_si_ram(tsa);
  910. ret = tsa_of_parse_tdms(tsa, np);
  911. if (ret)
  912. return ret;
  913. ret = tsa_setup(tsa);
  914. if (ret)
  915. return ret;
  916. platform_set_drvdata(pdev, tsa);
  917. return 0;
  918. }
  919. static void tsa_remove(struct platform_device *pdev)
  920. {
  921. struct tsa *tsa = platform_get_drvdata(pdev);
  922. int i;
  923. for (i = 0; i < ARRAY_SIZE(tsa->tdm); i++) {
  924. if (tsa->tdm[i].l1rsync_clk) {
  925. clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
  926. clk_put(tsa->tdm[i].l1rsync_clk);
  927. }
  928. if (tsa->tdm[i].l1rclk_clk) {
  929. clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
  930. clk_put(tsa->tdm[i].l1rclk_clk);
  931. }
  932. if (tsa->tdm[i].l1tsync_clk) {
  933. clk_disable_unprepare(tsa->tdm[i].l1rsync_clk);
  934. clk_put(tsa->tdm[i].l1rsync_clk);
  935. }
  936. if (tsa->tdm[i].l1tclk_clk) {
  937. clk_disable_unprepare(tsa->tdm[i].l1rclk_clk);
  938. clk_put(tsa->tdm[i].l1rclk_clk);
  939. }
  940. }
  941. }
  942. static const struct of_device_id tsa_id_table[] = {
  943. #if IS_ENABLED(CONFIG_CPM1)
  944. { .compatible = "fsl,cpm1-tsa", .data = (void *)TSA_CPM1 },
  945. #endif
  946. #if IS_ENABLED(CONFIG_QUICC_ENGINE)
  947. { .compatible = "fsl,qe-tsa", .data = (void *)TSA_QE },
  948. #endif
  949. {} /* sentinel */
  950. };
  951. MODULE_DEVICE_TABLE(of, tsa_id_table);
  952. static struct platform_driver tsa_driver = {
  953. .driver = {
  954. .name = "fsl-tsa",
  955. .of_match_table = of_match_ptr(tsa_id_table),
  956. },
  957. .probe = tsa_probe,
  958. .remove_new = tsa_remove,
  959. };
  960. module_platform_driver(tsa_driver);
  961. struct tsa_serial *tsa_serial_get_byphandle(struct device_node *np,
  962. const char *phandle_name)
  963. {
  964. struct of_phandle_args out_args;
  965. struct platform_device *pdev;
  966. struct tsa_serial *tsa_serial;
  967. struct tsa *tsa;
  968. int ret;
  969. ret = of_parse_phandle_with_fixed_args(np, phandle_name, 1, 0, &out_args);
  970. if (ret < 0)
  971. return ERR_PTR(ret);
  972. if (!of_match_node(tsa_driver.driver.of_match_table, out_args.np)) {
  973. of_node_put(out_args.np);
  974. return ERR_PTR(-EINVAL);
  975. }
  976. pdev = of_find_device_by_node(out_args.np);
  977. of_node_put(out_args.np);
  978. if (!pdev)
  979. return ERR_PTR(-ENODEV);
  980. tsa = platform_get_drvdata(pdev);
  981. if (!tsa) {
  982. platform_device_put(pdev);
  983. return ERR_PTR(-EPROBE_DEFER);
  984. }
  985. if (out_args.args_count != 1) {
  986. platform_device_put(pdev);
  987. return ERR_PTR(-EINVAL);
  988. }
  989. if (out_args.args[0] >= ARRAY_SIZE(tsa->serials)) {
  990. platform_device_put(pdev);
  991. return ERR_PTR(-EINVAL);
  992. }
  993. tsa_serial = &tsa->serials[out_args.args[0]];
  994. /*
  995. * Be sure that the serial id matches the phandle arg.
  996. * The tsa_serials table is indexed by serial ids. The serial id is set
  997. * during the probe() call and needs to be coherent.
  998. */
  999. if (WARN_ON(tsa_serial->id != out_args.args[0])) {
  1000. platform_device_put(pdev);
  1001. return ERR_PTR(-EINVAL);
  1002. }
  1003. return tsa_serial;
  1004. }
  1005. EXPORT_SYMBOL(tsa_serial_get_byphandle);
  1006. void tsa_serial_put(struct tsa_serial *tsa_serial)
  1007. {
  1008. struct tsa *tsa = tsa_serial_get_tsa(tsa_serial);
  1009. put_device(tsa->dev);
  1010. }
  1011. EXPORT_SYMBOL(tsa_serial_put);
  1012. static void devm_tsa_serial_release(struct device *dev, void *res)
  1013. {
  1014. struct tsa_serial **tsa_serial = res;
  1015. tsa_serial_put(*tsa_serial);
  1016. }
  1017. struct tsa_serial *devm_tsa_serial_get_byphandle(struct device *dev,
  1018. struct device_node *np,
  1019. const char *phandle_name)
  1020. {
  1021. struct tsa_serial *tsa_serial;
  1022. struct tsa_serial **dr;
  1023. dr = devres_alloc(devm_tsa_serial_release, sizeof(*dr), GFP_KERNEL);
  1024. if (!dr)
  1025. return ERR_PTR(-ENOMEM);
  1026. tsa_serial = tsa_serial_get_byphandle(np, phandle_name);
  1027. if (!IS_ERR(tsa_serial)) {
  1028. *dr = tsa_serial;
  1029. devres_add(dev, dr);
  1030. } else {
  1031. devres_free(dr);
  1032. }
  1033. return tsa_serial;
  1034. }
  1035. EXPORT_SYMBOL(devm_tsa_serial_get_byphandle);
  1036. MODULE_AUTHOR("Herve Codina <herve.codina@bootlin.com>");
  1037. MODULE_DESCRIPTION("CPM/QE TSA driver");
  1038. MODULE_LICENSE("GPL");