rockchip_i2s_tdm.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // ALSA SoC Audio Layer - Rockchip I2S/TDM Controller driver
  3. // Copyright (c) 2018 Rockchip Electronics Co. Ltd.
  4. // Author: Sugar Zhang <[email protected]>
  5. // Author: Nicolas Frattaroli <[email protected]>
  6. #include <linux/clk.h>
  7. #include <linux/clk-provider.h>
  8. #include <linux/delay.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/module.h>
  11. #include <linux/of_address.h>
  12. #include <linux/of_device.h>
  13. #include <linux/of_gpio.h>
  14. #include <linux/pm_runtime.h>
  15. #include <linux/regmap.h>
  16. #include <linux/reset.h>
  17. #include <linux/spinlock.h>
  18. #include <sound/dmaengine_pcm.h>
  19. #include <sound/pcm_params.h>
  20. #include "rockchip_i2s_tdm.h"
  21. #define DRV_NAME "rockchip-i2s-tdm"
  22. #define DEFAULT_MCLK_FS 256
  23. #define CH_GRP_MAX 4 /* The max channel 8 / 2 */
  24. #define MULTIPLEX_CH_MAX 10
  25. #define CLK_PPM_MIN -1000
  26. #define CLK_PPM_MAX 1000
  27. #define TRCM_TXRX 0
  28. #define TRCM_TX 1
  29. #define TRCM_RX 2
  30. struct txrx_config {
  31. u32 addr;
  32. u32 reg;
  33. u32 txonly;
  34. u32 rxonly;
  35. };
  36. struct rk_i2s_soc_data {
  37. u32 softrst_offset;
  38. u32 grf_reg_offset;
  39. u32 grf_shift;
  40. int config_count;
  41. const struct txrx_config *configs;
  42. int (*init)(struct device *dev, u32 addr);
  43. };
  44. struct rk_i2s_tdm_dev {
  45. struct device *dev;
  46. struct clk *hclk;
  47. struct clk *mclk_tx;
  48. struct clk *mclk_rx;
  49. /* The mclk_tx_src is parent of mclk_tx */
  50. struct clk *mclk_tx_src;
  51. /* The mclk_rx_src is parent of mclk_rx */
  52. struct clk *mclk_rx_src;
  53. /*
  54. * The mclk_root0 and mclk_root1 are root parent and supplies for
  55. * the different FS.
  56. *
  57. * e.g:
  58. * mclk_root0 is VPLL0, used for FS=48000Hz
  59. * mclk_root1 is VPLL1, used for FS=44100Hz
  60. */
  61. struct clk *mclk_root0;
  62. struct clk *mclk_root1;
  63. struct regmap *regmap;
  64. struct regmap *grf;
  65. struct snd_dmaengine_dai_dma_data capture_dma_data;
  66. struct snd_dmaengine_dai_dma_data playback_dma_data;
  67. struct reset_control *tx_reset;
  68. struct reset_control *rx_reset;
  69. struct rk_i2s_soc_data *soc_data;
  70. bool is_master_mode;
  71. bool io_multiplex;
  72. bool mclk_calibrate;
  73. bool tdm_mode;
  74. unsigned int mclk_rx_freq;
  75. unsigned int mclk_tx_freq;
  76. unsigned int mclk_root0_freq;
  77. unsigned int mclk_root1_freq;
  78. unsigned int mclk_root0_initial_freq;
  79. unsigned int mclk_root1_initial_freq;
  80. unsigned int frame_width;
  81. unsigned int clk_trcm;
  82. unsigned int i2s_sdis[CH_GRP_MAX];
  83. unsigned int i2s_sdos[CH_GRP_MAX];
  84. int clk_ppm;
  85. int refcount;
  86. spinlock_t lock; /* xfer lock */
  87. bool has_playback;
  88. bool has_capture;
  89. struct snd_soc_dai_driver *dai;
  90. };
  91. static int to_ch_num(unsigned int val)
  92. {
  93. switch (val) {
  94. case I2S_CHN_4:
  95. return 4;
  96. case I2S_CHN_6:
  97. return 6;
  98. case I2S_CHN_8:
  99. return 8;
  100. default:
  101. return 2;
  102. }
  103. }
  104. static void i2s_tdm_disable_unprepare_mclk(struct rk_i2s_tdm_dev *i2s_tdm)
  105. {
  106. clk_disable_unprepare(i2s_tdm->mclk_tx);
  107. clk_disable_unprepare(i2s_tdm->mclk_rx);
  108. if (i2s_tdm->mclk_calibrate) {
  109. clk_disable_unprepare(i2s_tdm->mclk_tx_src);
  110. clk_disable_unprepare(i2s_tdm->mclk_rx_src);
  111. clk_disable_unprepare(i2s_tdm->mclk_root0);
  112. clk_disable_unprepare(i2s_tdm->mclk_root1);
  113. }
  114. }
  115. /**
  116. * i2s_tdm_prepare_enable_mclk - prepare to enable all mclks, disable them on
  117. * failure.
  118. * @i2s_tdm: rk_i2s_tdm_dev struct
  119. *
  120. * This function attempts to enable all mclk clocks, but cleans up after
  121. * itself on failure. Guarantees to balance its calls.
  122. *
  123. * Returns success (0) or negative errno.
  124. */
  125. static int i2s_tdm_prepare_enable_mclk(struct rk_i2s_tdm_dev *i2s_tdm)
  126. {
  127. int ret = 0;
  128. ret = clk_prepare_enable(i2s_tdm->mclk_tx);
  129. if (ret)
  130. goto err_mclk_tx;
  131. ret = clk_prepare_enable(i2s_tdm->mclk_rx);
  132. if (ret)
  133. goto err_mclk_rx;
  134. if (i2s_tdm->mclk_calibrate) {
  135. ret = clk_prepare_enable(i2s_tdm->mclk_tx_src);
  136. if (ret)
  137. goto err_mclk_rx;
  138. ret = clk_prepare_enable(i2s_tdm->mclk_rx_src);
  139. if (ret)
  140. goto err_mclk_rx_src;
  141. ret = clk_prepare_enable(i2s_tdm->mclk_root0);
  142. if (ret)
  143. goto err_mclk_root0;
  144. ret = clk_prepare_enable(i2s_tdm->mclk_root1);
  145. if (ret)
  146. goto err_mclk_root1;
  147. }
  148. return 0;
  149. err_mclk_root1:
  150. clk_disable_unprepare(i2s_tdm->mclk_root0);
  151. err_mclk_root0:
  152. clk_disable_unprepare(i2s_tdm->mclk_rx_src);
  153. err_mclk_rx_src:
  154. clk_disable_unprepare(i2s_tdm->mclk_tx_src);
  155. err_mclk_rx:
  156. clk_disable_unprepare(i2s_tdm->mclk_tx);
  157. err_mclk_tx:
  158. return ret;
  159. }
  160. static int __maybe_unused i2s_tdm_runtime_suspend(struct device *dev)
  161. {
  162. struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
  163. regcache_cache_only(i2s_tdm->regmap, true);
  164. i2s_tdm_disable_unprepare_mclk(i2s_tdm);
  165. clk_disable_unprepare(i2s_tdm->hclk);
  166. return 0;
  167. }
  168. static int __maybe_unused i2s_tdm_runtime_resume(struct device *dev)
  169. {
  170. struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
  171. int ret;
  172. ret = clk_prepare_enable(i2s_tdm->hclk);
  173. if (ret)
  174. goto err_hclk;
  175. ret = i2s_tdm_prepare_enable_mclk(i2s_tdm);
  176. if (ret)
  177. goto err_mclk;
  178. regcache_cache_only(i2s_tdm->regmap, false);
  179. regcache_mark_dirty(i2s_tdm->regmap);
  180. ret = regcache_sync(i2s_tdm->regmap);
  181. if (ret)
  182. goto err_regcache;
  183. return 0;
  184. err_regcache:
  185. i2s_tdm_disable_unprepare_mclk(i2s_tdm);
  186. err_mclk:
  187. clk_disable_unprepare(i2s_tdm->hclk);
  188. err_hclk:
  189. return ret;
  190. }
  191. static inline struct rk_i2s_tdm_dev *to_info(struct snd_soc_dai *dai)
  192. {
  193. return snd_soc_dai_get_drvdata(dai);
  194. }
  195. /*
  196. * Makes sure that both tx and rx are reset at the same time to sync lrck
  197. * when clk_trcm > 0.
  198. */
  199. static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
  200. {
  201. /* This is technically race-y.
  202. *
  203. * In an ideal world, we could atomically assert both resets at the
  204. * same time, through an atomic bulk reset API. This API however does
  205. * not exist, so what the downstream vendor code used to do was
  206. * implement half a reset controller here and require the CRU to be
  207. * passed to the driver as a device tree node. Violating abstractions
  208. * like that is bad, especially when it influences something like the
  209. * bindings which are supposed to describe the hardware, not whatever
  210. * workarounds the driver needs, so it was dropped.
  211. *
  212. * In practice, asserting the resets one by one appears to work just
  213. * fine for playback. During duplex (playback + capture) operation,
  214. * this might become an issue, but that should be solved by the
  215. * implementation of the aforementioned API, not by shoving a reset
  216. * controller into an audio driver.
  217. */
  218. reset_control_assert(i2s_tdm->tx_reset);
  219. reset_control_assert(i2s_tdm->rx_reset);
  220. udelay(10);
  221. reset_control_deassert(i2s_tdm->tx_reset);
  222. reset_control_deassert(i2s_tdm->rx_reset);
  223. udelay(10);
  224. }
  225. static void rockchip_snd_reset(struct reset_control *rc)
  226. {
  227. reset_control_assert(rc);
  228. udelay(10);
  229. reset_control_deassert(rc);
  230. udelay(10);
  231. }
  232. static void rockchip_snd_xfer_clear(struct rk_i2s_tdm_dev *i2s_tdm,
  233. unsigned int clr)
  234. {
  235. unsigned int xfer_mask = 0;
  236. unsigned int xfer_val = 0;
  237. unsigned int val;
  238. int retry = 10;
  239. bool tx = clr & I2S_CLR_TXC;
  240. bool rx = clr & I2S_CLR_RXC;
  241. if (!(rx || tx))
  242. return;
  243. if (tx) {
  244. xfer_mask = I2S_XFER_TXS_START;
  245. xfer_val = I2S_XFER_TXS_STOP;
  246. }
  247. if (rx) {
  248. xfer_mask |= I2S_XFER_RXS_START;
  249. xfer_val |= I2S_XFER_RXS_STOP;
  250. }
  251. regmap_update_bits(i2s_tdm->regmap, I2S_XFER, xfer_mask, xfer_val);
  252. udelay(150);
  253. regmap_update_bits(i2s_tdm->regmap, I2S_CLR, clr, clr);
  254. regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
  255. /* Wait on the clear operation to finish */
  256. while (val) {
  257. udelay(15);
  258. regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
  259. retry--;
  260. if (!retry) {
  261. dev_warn(i2s_tdm->dev, "clear failed, reset %s%s\n",
  262. tx ? "tx" : "", rx ? "rx" : "");
  263. if (rx && tx)
  264. rockchip_snd_xfer_sync_reset(i2s_tdm);
  265. else if (tx)
  266. rockchip_snd_reset(i2s_tdm->tx_reset);
  267. else if (rx)
  268. rockchip_snd_reset(i2s_tdm->rx_reset);
  269. break;
  270. }
  271. }
  272. }
  273. static inline void rockchip_enable_tde(struct regmap *regmap)
  274. {
  275. regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE,
  276. I2S_DMACR_TDE_ENABLE);
  277. }
  278. static inline void rockchip_disable_tde(struct regmap *regmap)
  279. {
  280. regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_TDE_ENABLE,
  281. I2S_DMACR_TDE_DISABLE);
  282. }
  283. static inline void rockchip_enable_rde(struct regmap *regmap)
  284. {
  285. regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE,
  286. I2S_DMACR_RDE_ENABLE);
  287. }
  288. static inline void rockchip_disable_rde(struct regmap *regmap)
  289. {
  290. regmap_update_bits(regmap, I2S_DMACR, I2S_DMACR_RDE_ENABLE,
  291. I2S_DMACR_RDE_DISABLE);
  292. }
  293. /* only used when clk_trcm > 0 */
  294. static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream,
  295. struct snd_soc_dai *dai, int on)
  296. {
  297. struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
  298. unsigned long flags;
  299. spin_lock_irqsave(&i2s_tdm->lock, flags);
  300. if (on) {
  301. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  302. rockchip_enable_tde(i2s_tdm->regmap);
  303. else
  304. rockchip_enable_rde(i2s_tdm->regmap);
  305. if (++i2s_tdm->refcount == 1) {
  306. rockchip_snd_xfer_sync_reset(i2s_tdm);
  307. regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
  308. I2S_XFER_TXS_START |
  309. I2S_XFER_RXS_START,
  310. I2S_XFER_TXS_START |
  311. I2S_XFER_RXS_START);
  312. }
  313. } else {
  314. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  315. rockchip_disable_tde(i2s_tdm->regmap);
  316. else
  317. rockchip_disable_rde(i2s_tdm->regmap);
  318. if (--i2s_tdm->refcount == 0) {
  319. rockchip_snd_xfer_clear(i2s_tdm,
  320. I2S_CLR_TXC | I2S_CLR_RXC);
  321. }
  322. }
  323. spin_unlock_irqrestore(&i2s_tdm->lock, flags);
  324. }
  325. static void rockchip_snd_txctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
  326. {
  327. if (on) {
  328. rockchip_enable_tde(i2s_tdm->regmap);
  329. regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
  330. I2S_XFER_TXS_START,
  331. I2S_XFER_TXS_START);
  332. } else {
  333. rockchip_disable_tde(i2s_tdm->regmap);
  334. rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_TXC);
  335. }
  336. }
  337. static void rockchip_snd_rxctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
  338. {
  339. if (on) {
  340. rockchip_enable_rde(i2s_tdm->regmap);
  341. regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
  342. I2S_XFER_RXS_START,
  343. I2S_XFER_RXS_START);
  344. } else {
  345. rockchip_disable_rde(i2s_tdm->regmap);
  346. rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_RXC);
  347. }
  348. }
  349. static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
  350. unsigned int fmt)
  351. {
  352. struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
  353. unsigned int mask, val, tdm_val, txcr_val, rxcr_val;
  354. int ret;
  355. bool is_tdm = i2s_tdm->tdm_mode;
  356. ret = pm_runtime_resume_and_get(cpu_dai->dev);
  357. if (ret < 0 && ret != -EACCES)
  358. return ret;
  359. mask = I2S_CKR_MSS_MASK;
  360. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  361. case SND_SOC_DAIFMT_BP_FP:
  362. val = I2S_CKR_MSS_MASTER;
  363. i2s_tdm->is_master_mode = true;
  364. break;
  365. case SND_SOC_DAIFMT_BC_FC:
  366. val = I2S_CKR_MSS_SLAVE;
  367. i2s_tdm->is_master_mode = false;
  368. break;
  369. default:
  370. ret = -EINVAL;
  371. goto err_pm_put;
  372. }
  373. regmap_update_bits(i2s_tdm->regmap, I2S_CKR, mask, val);
  374. mask = I2S_CKR_CKP_MASK | I2S_CKR_TLP_MASK | I2S_CKR_RLP_MASK;
  375. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  376. case SND_SOC_DAIFMT_NB_NF:
  377. val = I2S_CKR_CKP_NORMAL |
  378. I2S_CKR_TLP_NORMAL |
  379. I2S_CKR_RLP_NORMAL;
  380. break;
  381. case SND_SOC_DAIFMT_NB_IF:
  382. val = I2S_CKR_CKP_NORMAL |
  383. I2S_CKR_TLP_INVERTED |
  384. I2S_CKR_RLP_INVERTED;
  385. break;
  386. case SND_SOC_DAIFMT_IB_NF:
  387. val = I2S_CKR_CKP_INVERTED |
  388. I2S_CKR_TLP_NORMAL |
  389. I2S_CKR_RLP_NORMAL;
  390. break;
  391. case SND_SOC_DAIFMT_IB_IF:
  392. val = I2S_CKR_CKP_INVERTED |
  393. I2S_CKR_TLP_INVERTED |
  394. I2S_CKR_RLP_INVERTED;
  395. break;
  396. default:
  397. ret = -EINVAL;
  398. goto err_pm_put;
  399. }
  400. regmap_update_bits(i2s_tdm->regmap, I2S_CKR, mask, val);
  401. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  402. case SND_SOC_DAIFMT_RIGHT_J:
  403. txcr_val = I2S_TXCR_IBM_RSJM;
  404. rxcr_val = I2S_RXCR_IBM_RSJM;
  405. break;
  406. case SND_SOC_DAIFMT_LEFT_J:
  407. txcr_val = I2S_TXCR_IBM_LSJM;
  408. rxcr_val = I2S_RXCR_IBM_LSJM;
  409. break;
  410. case SND_SOC_DAIFMT_I2S:
  411. txcr_val = I2S_TXCR_IBM_NORMAL;
  412. rxcr_val = I2S_RXCR_IBM_NORMAL;
  413. break;
  414. case SND_SOC_DAIFMT_DSP_A: /* PCM delay 1 mode */
  415. txcr_val = I2S_TXCR_TFS_PCM | I2S_TXCR_PBM_MODE(1);
  416. rxcr_val = I2S_RXCR_TFS_PCM | I2S_RXCR_PBM_MODE(1);
  417. break;
  418. case SND_SOC_DAIFMT_DSP_B: /* PCM no delay mode */
  419. txcr_val = I2S_TXCR_TFS_PCM;
  420. rxcr_val = I2S_RXCR_TFS_PCM;
  421. break;
  422. default:
  423. ret = -EINVAL;
  424. goto err_pm_put;
  425. }
  426. mask = I2S_TXCR_IBM_MASK | I2S_TXCR_TFS_MASK | I2S_TXCR_PBM_MASK;
  427. regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, txcr_val);
  428. mask = I2S_RXCR_IBM_MASK | I2S_RXCR_TFS_MASK | I2S_RXCR_PBM_MASK;
  429. regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, rxcr_val);
  430. if (is_tdm) {
  431. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  432. case SND_SOC_DAIFMT_RIGHT_J:
  433. val = I2S_TXCR_TFS_TDM_I2S;
  434. tdm_val = TDM_SHIFT_CTRL(2);
  435. break;
  436. case SND_SOC_DAIFMT_LEFT_J:
  437. val = I2S_TXCR_TFS_TDM_I2S;
  438. tdm_val = TDM_SHIFT_CTRL(1);
  439. break;
  440. case SND_SOC_DAIFMT_I2S:
  441. val = I2S_TXCR_TFS_TDM_I2S;
  442. tdm_val = TDM_SHIFT_CTRL(0);
  443. break;
  444. case SND_SOC_DAIFMT_DSP_A:
  445. val = I2S_TXCR_TFS_TDM_PCM;
  446. tdm_val = TDM_SHIFT_CTRL(0);
  447. break;
  448. case SND_SOC_DAIFMT_DSP_B:
  449. val = I2S_TXCR_TFS_TDM_PCM;
  450. tdm_val = TDM_SHIFT_CTRL(2);
  451. break;
  452. default:
  453. ret = -EINVAL;
  454. goto err_pm_put;
  455. }
  456. tdm_val |= TDM_FSYNC_WIDTH_SEL1(1);
  457. tdm_val |= TDM_FSYNC_WIDTH_HALF_FRAME;
  458. mask = I2S_TXCR_TFS_MASK;
  459. regmap_update_bits(i2s_tdm->regmap, I2S_TXCR, mask, val);
  460. regmap_update_bits(i2s_tdm->regmap, I2S_RXCR, mask, val);
  461. mask = TDM_FSYNC_WIDTH_SEL1_MSK | TDM_FSYNC_WIDTH_SEL0_MSK |
  462. TDM_SHIFT_CTRL_MSK;
  463. regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR,
  464. mask, tdm_val);
  465. regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
  466. mask, tdm_val);
  467. }
  468. err_pm_put:
  469. pm_runtime_put(cpu_dai->dev);
  470. return ret;
  471. }
  472. static void rockchip_i2s_tdm_xfer_pause(struct snd_pcm_substream *substream,
  473. struct rk_i2s_tdm_dev *i2s_tdm)
  474. {
  475. int stream;
  476. stream = SNDRV_PCM_STREAM_LAST - substream->stream;
  477. if (stream == SNDRV_PCM_STREAM_PLAYBACK)
  478. rockchip_disable_tde(i2s_tdm->regmap);
  479. else
  480. rockchip_disable_rde(i2s_tdm->regmap);
  481. rockchip_snd_xfer_clear(i2s_tdm, I2S_CLR_TXC | I2S_CLR_RXC);
  482. }
  483. static void rockchip_i2s_tdm_xfer_resume(struct snd_pcm_substream *substream,
  484. struct rk_i2s_tdm_dev *i2s_tdm)
  485. {
  486. int stream;
  487. stream = SNDRV_PCM_STREAM_LAST - substream->stream;
  488. if (stream == SNDRV_PCM_STREAM_PLAYBACK)
  489. rockchip_enable_tde(i2s_tdm->regmap);
  490. else
  491. rockchip_enable_rde(i2s_tdm->regmap);
  492. regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
  493. I2S_XFER_TXS_START |
  494. I2S_XFER_RXS_START,
  495. I2S_XFER_TXS_START |
  496. I2S_XFER_RXS_START);
  497. }
  498. static int rockchip_i2s_tdm_clk_set_rate(struct rk_i2s_tdm_dev *i2s_tdm,
  499. struct clk *clk, unsigned long rate,
  500. int ppm)
  501. {
  502. unsigned long rate_target;
  503. int delta, ret;
  504. if (ppm == i2s_tdm->clk_ppm)
  505. return 0;
  506. if (ppm < 0)
  507. delta = -1;
  508. else
  509. delta = 1;
  510. delta *= (int)div64_u64((u64)rate * (u64)abs(ppm) + 500000,
  511. 1000000);
  512. rate_target = rate + delta;
  513. if (!rate_target)
  514. return -EINVAL;
  515. ret = clk_set_rate(clk, rate_target);
  516. if (ret)
  517. return ret;
  518. i2s_tdm->clk_ppm = ppm;
  519. return 0;
  520. }
  521. static int rockchip_i2s_tdm_calibrate_mclk(struct rk_i2s_tdm_dev *i2s_tdm,
  522. struct snd_pcm_substream *substream,
  523. unsigned int lrck_freq)
  524. {
  525. struct clk *mclk_root;
  526. struct clk *mclk_parent;
  527. unsigned int mclk_root_freq;
  528. unsigned int mclk_root_initial_freq;
  529. unsigned int mclk_parent_freq;
  530. unsigned int div, delta;
  531. u64 ppm;
  532. int ret;
  533. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  534. mclk_parent = i2s_tdm->mclk_tx_src;
  535. else
  536. mclk_parent = i2s_tdm->mclk_rx_src;
  537. switch (lrck_freq) {
  538. case 8000:
  539. case 16000:
  540. case 24000:
  541. case 32000:
  542. case 48000:
  543. case 64000:
  544. case 96000:
  545. case 192000:
  546. mclk_root = i2s_tdm->mclk_root0;
  547. mclk_root_freq = i2s_tdm->mclk_root0_freq;
  548. mclk_root_initial_freq = i2s_tdm->mclk_root0_initial_freq;
  549. mclk_parent_freq = DEFAULT_MCLK_FS * 192000;
  550. break;
  551. case 11025:
  552. case 22050:
  553. case 44100:
  554. case 88200:
  555. case 176400:
  556. mclk_root = i2s_tdm->mclk_root1;
  557. mclk_root_freq = i2s_tdm->mclk_root1_freq;
  558. mclk_root_initial_freq = i2s_tdm->mclk_root1_initial_freq;
  559. mclk_parent_freq = DEFAULT_MCLK_FS * 176400;
  560. break;
  561. default:
  562. dev_err(i2s_tdm->dev, "Invalid LRCK frequency: %u Hz\n",
  563. lrck_freq);
  564. return -EINVAL;
  565. }
  566. ret = clk_set_parent(mclk_parent, mclk_root);
  567. if (ret)
  568. return ret;
  569. ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, mclk_root,
  570. mclk_root_freq, 0);
  571. if (ret)
  572. return ret;
  573. delta = abs(mclk_root_freq % mclk_parent_freq - mclk_parent_freq);
  574. ppm = div64_u64((uint64_t)delta * 1000000, (uint64_t)mclk_root_freq);
  575. if (ppm) {
  576. div = DIV_ROUND_CLOSEST(mclk_root_initial_freq, mclk_parent_freq);
  577. if (!div)
  578. return -EINVAL;
  579. mclk_root_freq = mclk_parent_freq * round_up(div, 2);
  580. ret = clk_set_rate(mclk_root, mclk_root_freq);
  581. if (ret)
  582. return ret;
  583. i2s_tdm->mclk_root0_freq = clk_get_rate(i2s_tdm->mclk_root0);
  584. i2s_tdm->mclk_root1_freq = clk_get_rate(i2s_tdm->mclk_root1);
  585. }
  586. return clk_set_rate(mclk_parent, mclk_parent_freq);
  587. }
  588. static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm,
  589. struct snd_pcm_substream *substream,
  590. struct clk **mclk)
  591. {
  592. unsigned int mclk_freq;
  593. int ret;
  594. if (i2s_tdm->clk_trcm) {
  595. if (i2s_tdm->mclk_tx_freq != i2s_tdm->mclk_rx_freq) {
  596. dev_err(i2s_tdm->dev,
  597. "clk_trcm, tx: %d and rx: %d should be the same\n",
  598. i2s_tdm->mclk_tx_freq,
  599. i2s_tdm->mclk_rx_freq);
  600. return -EINVAL;
  601. }
  602. ret = clk_set_rate(i2s_tdm->mclk_tx, i2s_tdm->mclk_tx_freq);
  603. if (ret)
  604. return ret;
  605. ret = clk_set_rate(i2s_tdm->mclk_rx, i2s_tdm->mclk_rx_freq);
  606. if (ret)
  607. return ret;
  608. /* mclk_rx is also ok. */
  609. *mclk = i2s_tdm->mclk_tx;
  610. } else {
  611. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  612. *mclk = i2s_tdm->mclk_tx;
  613. mclk_freq = i2s_tdm->mclk_tx_freq;
  614. } else {
  615. *mclk = i2s_tdm->mclk_rx;
  616. mclk_freq = i2s_tdm->mclk_rx_freq;
  617. }
  618. ret = clk_set_rate(*mclk, mclk_freq);
  619. if (ret)
  620. return ret;
  621. }
  622. return 0;
  623. }
  624. static int rockchip_i2s_ch_to_io(unsigned int ch, bool substream_capture)
  625. {
  626. if (substream_capture) {
  627. switch (ch) {
  628. case I2S_CHN_4:
  629. return I2S_IO_6CH_OUT_4CH_IN;
  630. case I2S_CHN_6:
  631. return I2S_IO_4CH_OUT_6CH_IN;
  632. case I2S_CHN_8:
  633. return I2S_IO_2CH_OUT_8CH_IN;
  634. default:
  635. return I2S_IO_8CH_OUT_2CH_IN;
  636. }
  637. } else {
  638. switch (ch) {
  639. case I2S_CHN_4:
  640. return I2S_IO_4CH_OUT_6CH_IN;
  641. case I2S_CHN_6:
  642. return I2S_IO_6CH_OUT_4CH_IN;
  643. case I2S_CHN_8:
  644. return I2S_IO_8CH_OUT_2CH_IN;
  645. default:
  646. return I2S_IO_2CH_OUT_8CH_IN;
  647. }
  648. }
  649. }
  650. static int rockchip_i2s_io_multiplex(struct snd_pcm_substream *substream,
  651. struct snd_soc_dai *dai)
  652. {
  653. struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
  654. int usable_chs = MULTIPLEX_CH_MAX;
  655. unsigned int val = 0;
  656. if (!i2s_tdm->io_multiplex)
  657. return 0;
  658. if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
  659. struct snd_pcm_str *playback_str =
  660. &substream->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK];
  661. if (playback_str->substream_opened) {
  662. regmap_read(i2s_tdm->regmap, I2S_TXCR, &val);
  663. val &= I2S_TXCR_CSR_MASK;
  664. usable_chs = MULTIPLEX_CH_MAX - to_ch_num(val);
  665. }
  666. regmap_read(i2s_tdm->regmap, I2S_RXCR, &val);
  667. val &= I2S_RXCR_CSR_MASK;
  668. if (to_ch_num(val) > usable_chs) {
  669. dev_err(i2s_tdm->dev,
  670. "Capture channels (%d) > usable channels (%d)\n",
  671. to_ch_num(val), usable_chs);
  672. return -EINVAL;
  673. }
  674. rockchip_i2s_ch_to_io(val, true);
  675. } else {
  676. struct snd_pcm_str *capture_str =
  677. &substream->pcm->streams[SNDRV_PCM_STREAM_CAPTURE];
  678. if (capture_str->substream_opened) {
  679. regmap_read(i2s_tdm->regmap, I2S_RXCR, &val);
  680. val &= I2S_RXCR_CSR_MASK;
  681. usable_chs = MULTIPLEX_CH_MAX - to_ch_num(val);
  682. }
  683. regmap_read(i2s_tdm->regmap, I2S_TXCR, &val);
  684. val &= I2S_TXCR_CSR_MASK;
  685. if (to_ch_num(val) > usable_chs) {
  686. dev_err(i2s_tdm->dev,
  687. "Playback channels (%d) > usable channels (%d)\n",
  688. to_ch_num(val), usable_chs);
  689. return -EINVAL;
  690. }
  691. }
  692. val <<= i2s_tdm->soc_data->grf_shift;
  693. val |= (I2S_IO_DIRECTION_MASK << i2s_tdm->soc_data->grf_shift) << 16;
  694. regmap_write(i2s_tdm->grf, i2s_tdm->soc_data->grf_reg_offset, val);
  695. return 0;
  696. }
  697. static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
  698. struct snd_soc_dai *dai,
  699. unsigned int div_bclk,
  700. unsigned int div_lrck,
  701. unsigned int fmt)
  702. {
  703. struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
  704. unsigned long flags;
  705. if (!i2s_tdm->clk_trcm)
  706. return 0;
  707. spin_lock_irqsave(&i2s_tdm->lock, flags);
  708. if (i2s_tdm->refcount)
  709. rockchip_i2s_tdm_xfer_pause(substream, i2s_tdm);
  710. regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
  711. I2S_CLKDIV_TXM_MASK | I2S_CLKDIV_RXM_MASK,
  712. I2S_CLKDIV_TXM(div_bclk) | I2S_CLKDIV_RXM(div_bclk));
  713. regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
  714. I2S_CKR_TSD_MASK | I2S_CKR_RSD_MASK,
  715. I2S_CKR_TSD(div_lrck) | I2S_CKR_RSD(div_lrck));
  716. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
  717. regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
  718. I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
  719. fmt);
  720. else
  721. regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
  722. I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
  723. fmt);
  724. if (i2s_tdm->refcount)
  725. rockchip_i2s_tdm_xfer_resume(substream, i2s_tdm);
  726. spin_unlock_irqrestore(&i2s_tdm->lock, flags);
  727. return 0;
  728. }
  729. static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
  730. struct snd_pcm_hw_params *params,
  731. struct snd_soc_dai *dai)
  732. {
  733. struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
  734. struct clk *mclk;
  735. int ret = 0;
  736. unsigned int val = 0;
  737. unsigned int mclk_rate, bclk_rate, div_bclk = 4, div_lrck = 64;
  738. if (i2s_tdm->is_master_mode) {
  739. if (i2s_tdm->mclk_calibrate)
  740. rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream,
  741. params_rate(params));
  742. ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk);
  743. if (ret)
  744. return ret;
  745. mclk_rate = clk_get_rate(mclk);
  746. bclk_rate = i2s_tdm->frame_width * params_rate(params);
  747. if (!bclk_rate)
  748. return -EINVAL;
  749. div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate);
  750. div_lrck = bclk_rate / params_rate(params);
  751. }
  752. switch (params_format(params)) {
  753. case SNDRV_PCM_FORMAT_S8:
  754. val |= I2S_TXCR_VDW(8);
  755. break;
  756. case SNDRV_PCM_FORMAT_S16_LE:
  757. val |= I2S_TXCR_VDW(16);
  758. break;
  759. case SNDRV_PCM_FORMAT_S20_3LE:
  760. val |= I2S_TXCR_VDW(20);
  761. break;
  762. case SNDRV_PCM_FORMAT_S24_LE:
  763. val |= I2S_TXCR_VDW(24);
  764. break;
  765. case SNDRV_PCM_FORMAT_S32_LE:
  766. val |= I2S_TXCR_VDW(32);
  767. break;
  768. default:
  769. return -EINVAL;
  770. }
  771. switch (params_channels(params)) {
  772. case 8:
  773. val |= I2S_CHN_8;
  774. break;
  775. case 6:
  776. val |= I2S_CHN_6;
  777. break;
  778. case 4:
  779. val |= I2S_CHN_4;
  780. break;
  781. case 2:
  782. val |= I2S_CHN_2;
  783. break;
  784. default:
  785. return -EINVAL;
  786. }
  787. if (i2s_tdm->clk_trcm) {
  788. rockchip_i2s_trcm_mode(substream, dai, div_bclk, div_lrck, val);
  789. } else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  790. regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
  791. I2S_CLKDIV_TXM_MASK,
  792. I2S_CLKDIV_TXM(div_bclk));
  793. regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
  794. I2S_CKR_TSD_MASK,
  795. I2S_CKR_TSD(div_lrck));
  796. regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
  797. I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
  798. val);
  799. } else {
  800. regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
  801. I2S_CLKDIV_RXM_MASK,
  802. I2S_CLKDIV_RXM(div_bclk));
  803. regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
  804. I2S_CKR_RSD_MASK,
  805. I2S_CKR_RSD(div_lrck));
  806. regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
  807. I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
  808. val);
  809. }
  810. return rockchip_i2s_io_multiplex(substream, dai);
  811. }
  812. static int rockchip_i2s_tdm_trigger(struct snd_pcm_substream *substream,
  813. int cmd, struct snd_soc_dai *dai)
  814. {
  815. struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
  816. switch (cmd) {
  817. case SNDRV_PCM_TRIGGER_START:
  818. case SNDRV_PCM_TRIGGER_RESUME:
  819. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  820. if (i2s_tdm->clk_trcm)
  821. rockchip_snd_txrxctrl(substream, dai, 1);
  822. else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
  823. rockchip_snd_rxctrl(i2s_tdm, 1);
  824. else
  825. rockchip_snd_txctrl(i2s_tdm, 1);
  826. break;
  827. case SNDRV_PCM_TRIGGER_SUSPEND:
  828. case SNDRV_PCM_TRIGGER_STOP:
  829. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  830. if (i2s_tdm->clk_trcm)
  831. rockchip_snd_txrxctrl(substream, dai, 0);
  832. else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
  833. rockchip_snd_rxctrl(i2s_tdm, 0);
  834. else
  835. rockchip_snd_txctrl(i2s_tdm, 0);
  836. break;
  837. default:
  838. return -EINVAL;
  839. }
  840. return 0;
  841. }
  842. static int rockchip_i2s_tdm_set_sysclk(struct snd_soc_dai *cpu_dai, int stream,
  843. unsigned int freq, int dir)
  844. {
  845. struct rk_i2s_tdm_dev *i2s_tdm = to_info(cpu_dai);
  846. /* Put set mclk rate into rockchip_i2s_tdm_set_mclk() */
  847. if (i2s_tdm->clk_trcm) {
  848. i2s_tdm->mclk_tx_freq = freq;
  849. i2s_tdm->mclk_rx_freq = freq;
  850. } else {
  851. if (stream == SNDRV_PCM_STREAM_PLAYBACK)
  852. i2s_tdm->mclk_tx_freq = freq;
  853. else
  854. i2s_tdm->mclk_rx_freq = freq;
  855. }
  856. dev_dbg(i2s_tdm->dev, "The target mclk_%s freq is: %d\n",
  857. stream ? "rx" : "tx", freq);
  858. return 0;
  859. }
  860. static int rockchip_i2s_tdm_clk_compensation_info(struct snd_kcontrol *kcontrol,
  861. struct snd_ctl_elem_info *uinfo)
  862. {
  863. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  864. uinfo->count = 1;
  865. uinfo->value.integer.min = CLK_PPM_MIN;
  866. uinfo->value.integer.max = CLK_PPM_MAX;
  867. uinfo->value.integer.step = 1;
  868. return 0;
  869. }
  870. static int rockchip_i2s_tdm_clk_compensation_get(struct snd_kcontrol *kcontrol,
  871. struct snd_ctl_elem_value *ucontrol)
  872. {
  873. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  874. struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
  875. ucontrol->value.integer.value[0] = i2s_tdm->clk_ppm;
  876. return 0;
  877. }
  878. static int rockchip_i2s_tdm_clk_compensation_put(struct snd_kcontrol *kcontrol,
  879. struct snd_ctl_elem_value *ucontrol)
  880. {
  881. struct snd_soc_dai *dai = snd_kcontrol_chip(kcontrol);
  882. struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
  883. int ret = 0, ppm = 0;
  884. int changed = 0;
  885. unsigned long old_rate;
  886. if (ucontrol->value.integer.value[0] < CLK_PPM_MIN ||
  887. ucontrol->value.integer.value[0] > CLK_PPM_MAX)
  888. return -EINVAL;
  889. ppm = ucontrol->value.integer.value[0];
  890. old_rate = clk_get_rate(i2s_tdm->mclk_root0);
  891. ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root0,
  892. i2s_tdm->mclk_root0_freq, ppm);
  893. if (ret)
  894. return ret;
  895. if (old_rate != clk_get_rate(i2s_tdm->mclk_root0))
  896. changed = 1;
  897. if (clk_is_match(i2s_tdm->mclk_root0, i2s_tdm->mclk_root1))
  898. return changed;
  899. old_rate = clk_get_rate(i2s_tdm->mclk_root1);
  900. ret = rockchip_i2s_tdm_clk_set_rate(i2s_tdm, i2s_tdm->mclk_root1,
  901. i2s_tdm->mclk_root1_freq, ppm);
  902. if (ret)
  903. return ret;
  904. if (old_rate != clk_get_rate(i2s_tdm->mclk_root1))
  905. changed = 1;
  906. return changed;
  907. }
  908. static struct snd_kcontrol_new rockchip_i2s_tdm_compensation_control = {
  909. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  910. .name = "PCM Clock Compensation in PPM",
  911. .info = rockchip_i2s_tdm_clk_compensation_info,
  912. .get = rockchip_i2s_tdm_clk_compensation_get,
  913. .put = rockchip_i2s_tdm_clk_compensation_put,
  914. };
  915. static int rockchip_i2s_tdm_dai_probe(struct snd_soc_dai *dai)
  916. {
  917. struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
  918. if (i2s_tdm->has_capture)
  919. dai->capture_dma_data = &i2s_tdm->capture_dma_data;
  920. if (i2s_tdm->has_playback)
  921. dai->playback_dma_data = &i2s_tdm->playback_dma_data;
  922. if (i2s_tdm->mclk_calibrate)
  923. snd_soc_add_dai_controls(dai, &rockchip_i2s_tdm_compensation_control, 1);
  924. return 0;
  925. }
  926. static int rockchip_dai_tdm_slot(struct snd_soc_dai *dai,
  927. unsigned int tx_mask, unsigned int rx_mask,
  928. int slots, int slot_width)
  929. {
  930. struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
  931. unsigned int mask, val;
  932. i2s_tdm->tdm_mode = true;
  933. i2s_tdm->frame_width = slots * slot_width;
  934. mask = TDM_SLOT_BIT_WIDTH_MSK | TDM_FRAME_WIDTH_MSK;
  935. val = TDM_SLOT_BIT_WIDTH(slot_width) |
  936. TDM_FRAME_WIDTH(slots * slot_width);
  937. regmap_update_bits(i2s_tdm->regmap, I2S_TDM_TXCR,
  938. mask, val);
  939. regmap_update_bits(i2s_tdm->regmap, I2S_TDM_RXCR,
  940. mask, val);
  941. return 0;
  942. }
  943. static int rockchip_i2s_tdm_set_bclk_ratio(struct snd_soc_dai *dai,
  944. unsigned int ratio)
  945. {
  946. struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
  947. if (ratio < 32 || ratio > 512 || ratio % 2 == 1)
  948. return -EINVAL;
  949. i2s_tdm->frame_width = ratio;
  950. return 0;
  951. }
  952. static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
  953. .hw_params = rockchip_i2s_tdm_hw_params,
  954. .set_bclk_ratio = rockchip_i2s_tdm_set_bclk_ratio,
  955. .set_sysclk = rockchip_i2s_tdm_set_sysclk,
  956. .set_fmt = rockchip_i2s_tdm_set_fmt,
  957. .set_tdm_slot = rockchip_dai_tdm_slot,
  958. .trigger = rockchip_i2s_tdm_trigger,
  959. };
  960. static const struct snd_soc_component_driver rockchip_i2s_tdm_component = {
  961. .name = DRV_NAME,
  962. .legacy_dai_naming = 1,
  963. };
  964. static bool rockchip_i2s_tdm_wr_reg(struct device *dev, unsigned int reg)
  965. {
  966. switch (reg) {
  967. case I2S_TXCR:
  968. case I2S_RXCR:
  969. case I2S_CKR:
  970. case I2S_DMACR:
  971. case I2S_INTCR:
  972. case I2S_XFER:
  973. case I2S_CLR:
  974. case I2S_TXDR:
  975. case I2S_TDM_TXCR:
  976. case I2S_TDM_RXCR:
  977. case I2S_CLKDIV:
  978. return true;
  979. default:
  980. return false;
  981. }
  982. }
  983. static bool rockchip_i2s_tdm_rd_reg(struct device *dev, unsigned int reg)
  984. {
  985. switch (reg) {
  986. case I2S_TXCR:
  987. case I2S_RXCR:
  988. case I2S_CKR:
  989. case I2S_DMACR:
  990. case I2S_INTCR:
  991. case I2S_XFER:
  992. case I2S_CLR:
  993. case I2S_TXDR:
  994. case I2S_RXDR:
  995. case I2S_TXFIFOLR:
  996. case I2S_INTSR:
  997. case I2S_RXFIFOLR:
  998. case I2S_TDM_TXCR:
  999. case I2S_TDM_RXCR:
  1000. case I2S_CLKDIV:
  1001. return true;
  1002. default:
  1003. return false;
  1004. }
  1005. }
  1006. static bool rockchip_i2s_tdm_volatile_reg(struct device *dev, unsigned int reg)
  1007. {
  1008. switch (reg) {
  1009. case I2S_TXFIFOLR:
  1010. case I2S_INTSR:
  1011. case I2S_CLR:
  1012. case I2S_TXDR:
  1013. case I2S_RXDR:
  1014. case I2S_RXFIFOLR:
  1015. return true;
  1016. default:
  1017. return false;
  1018. }
  1019. }
  1020. static bool rockchip_i2s_tdm_precious_reg(struct device *dev, unsigned int reg)
  1021. {
  1022. if (reg == I2S_RXDR)
  1023. return true;
  1024. return false;
  1025. }
  1026. static const struct reg_default rockchip_i2s_tdm_reg_defaults[] = {
  1027. {0x00, 0x7200000f},
  1028. {0x04, 0x01c8000f},
  1029. {0x08, 0x00001f1f},
  1030. {0x10, 0x001f0000},
  1031. {0x14, 0x01f00000},
  1032. {0x30, 0x00003eff},
  1033. {0x34, 0x00003eff},
  1034. {0x38, 0x00000707},
  1035. };
  1036. static const struct regmap_config rockchip_i2s_tdm_regmap_config = {
  1037. .reg_bits = 32,
  1038. .reg_stride = 4,
  1039. .val_bits = 32,
  1040. .max_register = I2S_CLKDIV,
  1041. .reg_defaults = rockchip_i2s_tdm_reg_defaults,
  1042. .num_reg_defaults = ARRAY_SIZE(rockchip_i2s_tdm_reg_defaults),
  1043. .writeable_reg = rockchip_i2s_tdm_wr_reg,
  1044. .readable_reg = rockchip_i2s_tdm_rd_reg,
  1045. .volatile_reg = rockchip_i2s_tdm_volatile_reg,
  1046. .precious_reg = rockchip_i2s_tdm_precious_reg,
  1047. .cache_type = REGCACHE_FLAT,
  1048. };
  1049. static int common_soc_init(struct device *dev, u32 addr)
  1050. {
  1051. struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
  1052. const struct txrx_config *configs = i2s_tdm->soc_data->configs;
  1053. u32 reg = 0, val = 0, trcm = i2s_tdm->clk_trcm;
  1054. int i;
  1055. if (trcm == TRCM_TXRX)
  1056. return 0;
  1057. for (i = 0; i < i2s_tdm->soc_data->config_count; i++) {
  1058. if (addr != configs[i].addr)
  1059. continue;
  1060. reg = configs[i].reg;
  1061. if (trcm == TRCM_TX)
  1062. val = configs[i].txonly;
  1063. else
  1064. val = configs[i].rxonly;
  1065. if (reg)
  1066. regmap_write(i2s_tdm->grf, reg, val);
  1067. }
  1068. return 0;
  1069. }
  1070. static const struct txrx_config px30_txrx_config[] = {
  1071. { 0xff060000, 0x184, PX30_I2S0_CLK_TXONLY, PX30_I2S0_CLK_RXONLY },
  1072. };
  1073. static const struct txrx_config rk1808_txrx_config[] = {
  1074. { 0xff7e0000, 0x190, RK1808_I2S0_CLK_TXONLY, RK1808_I2S0_CLK_RXONLY },
  1075. };
  1076. static const struct txrx_config rk3308_txrx_config[] = {
  1077. { 0xff300000, 0x308, RK3308_I2S0_CLK_TXONLY, RK3308_I2S0_CLK_RXONLY },
  1078. { 0xff310000, 0x308, RK3308_I2S1_CLK_TXONLY, RK3308_I2S1_CLK_RXONLY },
  1079. };
  1080. static const struct txrx_config rk3568_txrx_config[] = {
  1081. { 0xfe410000, 0x504, RK3568_I2S1_CLK_TXONLY, RK3568_I2S1_CLK_RXONLY },
  1082. { 0xfe410000, 0x508, RK3568_I2S1_MCLK_TX_OE, RK3568_I2S1_MCLK_RX_OE },
  1083. { 0xfe420000, 0x508, RK3568_I2S2_MCLK_OE, RK3568_I2S2_MCLK_OE },
  1084. { 0xfe430000, 0x504, RK3568_I2S3_CLK_TXONLY, RK3568_I2S3_CLK_RXONLY },
  1085. { 0xfe430000, 0x508, RK3568_I2S3_MCLK_TXONLY, RK3568_I2S3_MCLK_RXONLY },
  1086. { 0xfe430000, 0x508, RK3568_I2S3_MCLK_OE, RK3568_I2S3_MCLK_OE },
  1087. };
  1088. static const struct txrx_config rv1126_txrx_config[] = {
  1089. { 0xff800000, 0x10260, RV1126_I2S0_CLK_TXONLY, RV1126_I2S0_CLK_RXONLY },
  1090. };
  1091. static struct rk_i2s_soc_data px30_i2s_soc_data = {
  1092. .softrst_offset = 0x0300,
  1093. .configs = px30_txrx_config,
  1094. .config_count = ARRAY_SIZE(px30_txrx_config),
  1095. .init = common_soc_init,
  1096. };
  1097. static struct rk_i2s_soc_data rk1808_i2s_soc_data = {
  1098. .softrst_offset = 0x0300,
  1099. .configs = rk1808_txrx_config,
  1100. .config_count = ARRAY_SIZE(rk1808_txrx_config),
  1101. .init = common_soc_init,
  1102. };
  1103. static struct rk_i2s_soc_data rk3308_i2s_soc_data = {
  1104. .softrst_offset = 0x0400,
  1105. .grf_reg_offset = 0x0308,
  1106. .grf_shift = 5,
  1107. .configs = rk3308_txrx_config,
  1108. .config_count = ARRAY_SIZE(rk3308_txrx_config),
  1109. .init = common_soc_init,
  1110. };
  1111. static struct rk_i2s_soc_data rk3568_i2s_soc_data = {
  1112. .softrst_offset = 0x0400,
  1113. .configs = rk3568_txrx_config,
  1114. .config_count = ARRAY_SIZE(rk3568_txrx_config),
  1115. .init = common_soc_init,
  1116. };
  1117. static struct rk_i2s_soc_data rv1126_i2s_soc_data = {
  1118. .softrst_offset = 0x0300,
  1119. .configs = rv1126_txrx_config,
  1120. .config_count = ARRAY_SIZE(rv1126_txrx_config),
  1121. .init = common_soc_init,
  1122. };
  1123. static const struct of_device_id rockchip_i2s_tdm_match[] = {
  1124. { .compatible = "rockchip,px30-i2s-tdm", .data = &px30_i2s_soc_data },
  1125. { .compatible = "rockchip,rk1808-i2s-tdm", .data = &rk1808_i2s_soc_data },
  1126. { .compatible = "rockchip,rk3308-i2s-tdm", .data = &rk3308_i2s_soc_data },
  1127. { .compatible = "rockchip,rk3568-i2s-tdm", .data = &rk3568_i2s_soc_data },
  1128. { .compatible = "rockchip,rv1126-i2s-tdm", .data = &rv1126_i2s_soc_data },
  1129. {},
  1130. };
  1131. static const struct snd_soc_dai_driver i2s_tdm_dai = {
  1132. .probe = rockchip_i2s_tdm_dai_probe,
  1133. .ops = &rockchip_i2s_tdm_dai_ops,
  1134. };
  1135. static int rockchip_i2s_tdm_init_dai(struct rk_i2s_tdm_dev *i2s_tdm)
  1136. {
  1137. struct snd_soc_dai_driver *dai;
  1138. struct property *dma_names;
  1139. const char *dma_name;
  1140. u64 formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |
  1141. SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |
  1142. SNDRV_PCM_FMTBIT_S32_LE);
  1143. struct device_node *node = i2s_tdm->dev->of_node;
  1144. of_property_for_each_string(node, "dma-names", dma_names, dma_name) {
  1145. if (!strcmp(dma_name, "tx"))
  1146. i2s_tdm->has_playback = true;
  1147. if (!strcmp(dma_name, "rx"))
  1148. i2s_tdm->has_capture = true;
  1149. }
  1150. dai = devm_kmemdup(i2s_tdm->dev, &i2s_tdm_dai,
  1151. sizeof(*dai), GFP_KERNEL);
  1152. if (!dai)
  1153. return -ENOMEM;
  1154. if (i2s_tdm->has_playback) {
  1155. dai->playback.stream_name = "Playback";
  1156. dai->playback.channels_min = 2;
  1157. dai->playback.channels_max = 8;
  1158. dai->playback.rates = SNDRV_PCM_RATE_8000_192000;
  1159. dai->playback.formats = formats;
  1160. }
  1161. if (i2s_tdm->has_capture) {
  1162. dai->capture.stream_name = "Capture";
  1163. dai->capture.channels_min = 2;
  1164. dai->capture.channels_max = 8;
  1165. dai->capture.rates = SNDRV_PCM_RATE_8000_192000;
  1166. dai->capture.formats = formats;
  1167. }
  1168. if (i2s_tdm->clk_trcm != TRCM_TXRX)
  1169. dai->symmetric_rate = 1;
  1170. i2s_tdm->dai = dai;
  1171. return 0;
  1172. }
  1173. static int rockchip_i2s_tdm_path_check(struct rk_i2s_tdm_dev *i2s_tdm,
  1174. int num,
  1175. bool is_rx_path)
  1176. {
  1177. unsigned int *i2s_data;
  1178. int i, j;
  1179. if (is_rx_path)
  1180. i2s_data = i2s_tdm->i2s_sdis;
  1181. else
  1182. i2s_data = i2s_tdm->i2s_sdos;
  1183. for (i = 0; i < num; i++) {
  1184. if (i2s_data[i] > CH_GRP_MAX - 1) {
  1185. dev_err(i2s_tdm->dev,
  1186. "%s path i2s_data[%d]: %d is too high, max is: %d\n",
  1187. is_rx_path ? "RX" : "TX",
  1188. i, i2s_data[i], CH_GRP_MAX);
  1189. return -EINVAL;
  1190. }
  1191. for (j = 0; j < num; j++) {
  1192. if (i == j)
  1193. continue;
  1194. if (i2s_data[i] == i2s_data[j]) {
  1195. dev_err(i2s_tdm->dev,
  1196. "%s path invalid routed i2s_data: [%d]%d == [%d]%d\n",
  1197. is_rx_path ? "RX" : "TX",
  1198. i, i2s_data[i],
  1199. j, i2s_data[j]);
  1200. return -EINVAL;
  1201. }
  1202. }
  1203. }
  1204. return 0;
  1205. }
  1206. static void rockchip_i2s_tdm_tx_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
  1207. int num)
  1208. {
  1209. int idx;
  1210. for (idx = 0; idx < num; idx++) {
  1211. regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
  1212. I2S_TXCR_PATH_MASK(idx),
  1213. I2S_TXCR_PATH(idx, i2s_tdm->i2s_sdos[idx]));
  1214. }
  1215. }
  1216. static void rockchip_i2s_tdm_rx_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
  1217. int num)
  1218. {
  1219. int idx;
  1220. for (idx = 0; idx < num; idx++) {
  1221. regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
  1222. I2S_RXCR_PATH_MASK(idx),
  1223. I2S_RXCR_PATH(idx, i2s_tdm->i2s_sdis[idx]));
  1224. }
  1225. }
  1226. static void rockchip_i2s_tdm_path_config(struct rk_i2s_tdm_dev *i2s_tdm,
  1227. int num, bool is_rx_path)
  1228. {
  1229. if (is_rx_path)
  1230. rockchip_i2s_tdm_rx_path_config(i2s_tdm, num);
  1231. else
  1232. rockchip_i2s_tdm_tx_path_config(i2s_tdm, num);
  1233. }
  1234. static int rockchip_i2s_tdm_get_calibrate_mclks(struct rk_i2s_tdm_dev *i2s_tdm)
  1235. {
  1236. int num_mclks = 0;
  1237. i2s_tdm->mclk_tx_src = devm_clk_get(i2s_tdm->dev, "mclk_tx_src");
  1238. if (!IS_ERR(i2s_tdm->mclk_tx_src))
  1239. num_mclks++;
  1240. i2s_tdm->mclk_rx_src = devm_clk_get(i2s_tdm->dev, "mclk_rx_src");
  1241. if (!IS_ERR(i2s_tdm->mclk_rx_src))
  1242. num_mclks++;
  1243. i2s_tdm->mclk_root0 = devm_clk_get(i2s_tdm->dev, "mclk_root0");
  1244. if (!IS_ERR(i2s_tdm->mclk_root0))
  1245. num_mclks++;
  1246. i2s_tdm->mclk_root1 = devm_clk_get(i2s_tdm->dev, "mclk_root1");
  1247. if (!IS_ERR(i2s_tdm->mclk_root1))
  1248. num_mclks++;
  1249. if (num_mclks < 4 && num_mclks != 0)
  1250. return -ENOENT;
  1251. if (num_mclks == 4)
  1252. i2s_tdm->mclk_calibrate = 1;
  1253. return 0;
  1254. }
  1255. static int rockchip_i2s_tdm_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
  1256. struct device_node *np,
  1257. bool is_rx_path)
  1258. {
  1259. char *i2s_tx_path_prop = "rockchip,i2s-tx-route";
  1260. char *i2s_rx_path_prop = "rockchip,i2s-rx-route";
  1261. char *i2s_path_prop;
  1262. unsigned int *i2s_data;
  1263. int num, ret = 0;
  1264. if (is_rx_path) {
  1265. i2s_path_prop = i2s_rx_path_prop;
  1266. i2s_data = i2s_tdm->i2s_sdis;
  1267. } else {
  1268. i2s_path_prop = i2s_tx_path_prop;
  1269. i2s_data = i2s_tdm->i2s_sdos;
  1270. }
  1271. num = of_count_phandle_with_args(np, i2s_path_prop, NULL);
  1272. if (num < 0) {
  1273. if (num != -ENOENT) {
  1274. dev_err(i2s_tdm->dev,
  1275. "Failed to read '%s' num: %d\n",
  1276. i2s_path_prop, num);
  1277. ret = num;
  1278. }
  1279. return ret;
  1280. } else if (num != CH_GRP_MAX) {
  1281. dev_err(i2s_tdm->dev,
  1282. "The num: %d should be: %d\n", num, CH_GRP_MAX);
  1283. return -EINVAL;
  1284. }
  1285. ret = of_property_read_u32_array(np, i2s_path_prop,
  1286. i2s_data, num);
  1287. if (ret < 0) {
  1288. dev_err(i2s_tdm->dev,
  1289. "Failed to read '%s': %d\n",
  1290. i2s_path_prop, ret);
  1291. return ret;
  1292. }
  1293. ret = rockchip_i2s_tdm_path_check(i2s_tdm, num, is_rx_path);
  1294. if (ret < 0) {
  1295. dev_err(i2s_tdm->dev,
  1296. "Failed to check i2s data bus: %d\n", ret);
  1297. return ret;
  1298. }
  1299. rockchip_i2s_tdm_path_config(i2s_tdm, num, is_rx_path);
  1300. return 0;
  1301. }
  1302. static int rockchip_i2s_tdm_tx_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
  1303. struct device_node *np)
  1304. {
  1305. return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 0);
  1306. }
  1307. static int rockchip_i2s_tdm_rx_path_prepare(struct rk_i2s_tdm_dev *i2s_tdm,
  1308. struct device_node *np)
  1309. {
  1310. return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 1);
  1311. }
  1312. static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
  1313. {
  1314. struct device_node *node = pdev->dev.of_node;
  1315. const struct of_device_id *of_id;
  1316. struct rk_i2s_tdm_dev *i2s_tdm;
  1317. struct resource *res;
  1318. void __iomem *regs;
  1319. int ret;
  1320. i2s_tdm = devm_kzalloc(&pdev->dev, sizeof(*i2s_tdm), GFP_KERNEL);
  1321. if (!i2s_tdm)
  1322. return -ENOMEM;
  1323. i2s_tdm->dev = &pdev->dev;
  1324. of_id = of_match_device(rockchip_i2s_tdm_match, &pdev->dev);
  1325. if (!of_id || !of_id->data)
  1326. return -EINVAL;
  1327. spin_lock_init(&i2s_tdm->lock);
  1328. i2s_tdm->soc_data = (struct rk_i2s_soc_data *)of_id->data;
  1329. i2s_tdm->frame_width = 64;
  1330. i2s_tdm->clk_trcm = TRCM_TXRX;
  1331. if (of_property_read_bool(node, "rockchip,trcm-sync-tx-only"))
  1332. i2s_tdm->clk_trcm = TRCM_TX;
  1333. if (of_property_read_bool(node, "rockchip,trcm-sync-rx-only")) {
  1334. if (i2s_tdm->clk_trcm) {
  1335. dev_err(i2s_tdm->dev, "invalid trcm-sync configuration\n");
  1336. return -EINVAL;
  1337. }
  1338. i2s_tdm->clk_trcm = TRCM_RX;
  1339. }
  1340. ret = rockchip_i2s_tdm_init_dai(i2s_tdm);
  1341. if (ret)
  1342. return ret;
  1343. i2s_tdm->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
  1344. if (IS_ERR(i2s_tdm->grf))
  1345. return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->grf),
  1346. "Error in rockchip,grf\n");
  1347. i2s_tdm->tx_reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
  1348. "tx-m");
  1349. if (IS_ERR(i2s_tdm->tx_reset)) {
  1350. ret = PTR_ERR(i2s_tdm->tx_reset);
  1351. return dev_err_probe(i2s_tdm->dev, ret,
  1352. "Error in tx-m reset control\n");
  1353. }
  1354. i2s_tdm->rx_reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
  1355. "rx-m");
  1356. if (IS_ERR(i2s_tdm->rx_reset)) {
  1357. ret = PTR_ERR(i2s_tdm->rx_reset);
  1358. return dev_err_probe(i2s_tdm->dev, ret,
  1359. "Error in rx-m reset control\n");
  1360. }
  1361. i2s_tdm->hclk = devm_clk_get(&pdev->dev, "hclk");
  1362. if (IS_ERR(i2s_tdm->hclk)) {
  1363. return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->hclk),
  1364. "Failed to get clock hclk\n");
  1365. }
  1366. i2s_tdm->mclk_tx = devm_clk_get(&pdev->dev, "mclk_tx");
  1367. if (IS_ERR(i2s_tdm->mclk_tx)) {
  1368. return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->mclk_tx),
  1369. "Failed to get clock mclk_tx\n");
  1370. }
  1371. i2s_tdm->mclk_rx = devm_clk_get(&pdev->dev, "mclk_rx");
  1372. if (IS_ERR(i2s_tdm->mclk_rx)) {
  1373. return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->mclk_rx),
  1374. "Failed to get clock mclk_rx\n");
  1375. }
  1376. i2s_tdm->io_multiplex =
  1377. of_property_read_bool(node, "rockchip,io-multiplex");
  1378. ret = rockchip_i2s_tdm_get_calibrate_mclks(i2s_tdm);
  1379. if (ret)
  1380. return dev_err_probe(i2s_tdm->dev, ret,
  1381. "mclk-calibrate clocks missing");
  1382. regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
  1383. if (IS_ERR(regs)) {
  1384. return dev_err_probe(i2s_tdm->dev, PTR_ERR(regs),
  1385. "Failed to get resource IORESOURCE_MEM\n");
  1386. }
  1387. i2s_tdm->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
  1388. &rockchip_i2s_tdm_regmap_config);
  1389. if (IS_ERR(i2s_tdm->regmap)) {
  1390. return dev_err_probe(i2s_tdm->dev, PTR_ERR(i2s_tdm->regmap),
  1391. "Failed to initialise regmap\n");
  1392. }
  1393. if (i2s_tdm->has_playback) {
  1394. i2s_tdm->playback_dma_data.addr = res->start + I2S_TXDR;
  1395. i2s_tdm->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
  1396. i2s_tdm->playback_dma_data.maxburst = 8;
  1397. }
  1398. if (i2s_tdm->has_capture) {
  1399. i2s_tdm->capture_dma_data.addr = res->start + I2S_RXDR;
  1400. i2s_tdm->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
  1401. i2s_tdm->capture_dma_data.maxburst = 8;
  1402. }
  1403. ret = rockchip_i2s_tdm_tx_path_prepare(i2s_tdm, node);
  1404. if (ret < 0) {
  1405. dev_err(&pdev->dev, "I2S TX path prepare failed: %d\n", ret);
  1406. return ret;
  1407. }
  1408. ret = rockchip_i2s_tdm_rx_path_prepare(i2s_tdm, node);
  1409. if (ret < 0) {
  1410. dev_err(&pdev->dev, "I2S RX path prepare failed: %d\n", ret);
  1411. return ret;
  1412. }
  1413. dev_set_drvdata(&pdev->dev, i2s_tdm);
  1414. ret = clk_prepare_enable(i2s_tdm->hclk);
  1415. if (ret) {
  1416. return dev_err_probe(i2s_tdm->dev, ret,
  1417. "Failed to enable clock hclk\n");
  1418. }
  1419. ret = i2s_tdm_prepare_enable_mclk(i2s_tdm);
  1420. if (ret) {
  1421. ret = dev_err_probe(i2s_tdm->dev, ret,
  1422. "Failed to enable one or more mclks\n");
  1423. goto err_disable_hclk;
  1424. }
  1425. if (i2s_tdm->mclk_calibrate) {
  1426. i2s_tdm->mclk_root0_initial_freq = clk_get_rate(i2s_tdm->mclk_root0);
  1427. i2s_tdm->mclk_root1_initial_freq = clk_get_rate(i2s_tdm->mclk_root1);
  1428. i2s_tdm->mclk_root0_freq = i2s_tdm->mclk_root0_initial_freq;
  1429. i2s_tdm->mclk_root1_freq = i2s_tdm->mclk_root1_initial_freq;
  1430. }
  1431. pm_runtime_enable(&pdev->dev);
  1432. regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK,
  1433. I2S_DMACR_TDL(16));
  1434. regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK,
  1435. I2S_DMACR_RDL(16));
  1436. regmap_update_bits(i2s_tdm->regmap, I2S_CKR, I2S_CKR_TRCM_MASK,
  1437. i2s_tdm->clk_trcm << I2S_CKR_TRCM_SHIFT);
  1438. if (i2s_tdm->soc_data && i2s_tdm->soc_data->init)
  1439. i2s_tdm->soc_data->init(&pdev->dev, res->start);
  1440. ret = devm_snd_soc_register_component(&pdev->dev,
  1441. &rockchip_i2s_tdm_component,
  1442. i2s_tdm->dai, 1);
  1443. if (ret) {
  1444. dev_err(&pdev->dev, "Could not register DAI\n");
  1445. goto err_suspend;
  1446. }
  1447. ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
  1448. if (ret) {
  1449. dev_err(&pdev->dev, "Could not register PCM\n");
  1450. goto err_suspend;
  1451. }
  1452. return 0;
  1453. err_suspend:
  1454. if (!pm_runtime_status_suspended(&pdev->dev))
  1455. i2s_tdm_runtime_suspend(&pdev->dev);
  1456. pm_runtime_disable(&pdev->dev);
  1457. err_disable_hclk:
  1458. clk_disable_unprepare(i2s_tdm->hclk);
  1459. return ret;
  1460. }
  1461. static int rockchip_i2s_tdm_remove(struct platform_device *pdev)
  1462. {
  1463. if (!pm_runtime_status_suspended(&pdev->dev))
  1464. i2s_tdm_runtime_suspend(&pdev->dev);
  1465. pm_runtime_disable(&pdev->dev);
  1466. return 0;
  1467. }
  1468. static int __maybe_unused rockchip_i2s_tdm_suspend(struct device *dev)
  1469. {
  1470. struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
  1471. regcache_mark_dirty(i2s_tdm->regmap);
  1472. return 0;
  1473. }
  1474. static int __maybe_unused rockchip_i2s_tdm_resume(struct device *dev)
  1475. {
  1476. struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
  1477. int ret;
  1478. ret = pm_runtime_resume_and_get(dev);
  1479. if (ret < 0)
  1480. return ret;
  1481. ret = regcache_sync(i2s_tdm->regmap);
  1482. pm_runtime_put(dev);
  1483. return ret;
  1484. }
  1485. static const struct dev_pm_ops rockchip_i2s_tdm_pm_ops = {
  1486. SET_RUNTIME_PM_OPS(i2s_tdm_runtime_suspend, i2s_tdm_runtime_resume,
  1487. NULL)
  1488. SET_SYSTEM_SLEEP_PM_OPS(rockchip_i2s_tdm_suspend,
  1489. rockchip_i2s_tdm_resume)
  1490. };
  1491. static struct platform_driver rockchip_i2s_tdm_driver = {
  1492. .probe = rockchip_i2s_tdm_probe,
  1493. .remove = rockchip_i2s_tdm_remove,
  1494. .driver = {
  1495. .name = DRV_NAME,
  1496. .of_match_table = of_match_ptr(rockchip_i2s_tdm_match),
  1497. .pm = &rockchip_i2s_tdm_pm_ops,
  1498. },
  1499. };
  1500. module_platform_driver(rockchip_i2s_tdm_driver);
  1501. MODULE_DESCRIPTION("ROCKCHIP I2S/TDM ASoC Interface");
  1502. MODULE_AUTHOR("Sugar Zhang <[email protected]>");
  1503. MODULE_LICENSE("GPL v2");
  1504. MODULE_ALIAS("platform:" DRV_NAME);
  1505. MODULE_DEVICE_TABLE(of, rockchip_i2s_tdm_match);