adg.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /*
  2. * Helper routines for R-Car sound ADG.
  3. *
  4. * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License. See the file "COPYING" in the main directory of this archive
  8. * for more details.
  9. */
  10. #include <linux/clk-provider.h>
  11. #include "rsnd.h"
  12. #define CLKA 0
  13. #define CLKB 1
  14. #define CLKC 2
  15. #define CLKI 3
  16. #define CLKMAX 4
  17. #define CLKOUT 0
  18. #define CLKOUT1 1
  19. #define CLKOUT2 2
  20. #define CLKOUT3 3
  21. #define CLKOUTMAX 4
  22. #define BRRx_MASK(x) (0x3FF & x)
  23. static struct rsnd_mod_ops adg_ops = {
  24. .name = "adg",
  25. };
  26. struct rsnd_adg {
  27. struct clk *clk[CLKMAX];
  28. struct clk *clkout[CLKOUTMAX];
  29. struct clk_onecell_data onecell;
  30. struct rsnd_mod mod;
  31. u32 flags;
  32. u32 ckr;
  33. u32 rbga;
  34. u32 rbgb;
  35. int rbga_rate_for_441khz; /* RBGA */
  36. int rbgb_rate_for_48khz; /* RBGB */
  37. };
  38. #define LRCLK_ASYNC (1 << 0)
  39. #define adg_mode_flags(adg) (adg->flags)
  40. #define for_each_rsnd_clk(pos, adg, i) \
  41. for (i = 0; \
  42. (i < CLKMAX) && \
  43. ((pos) = adg->clk[i]); \
  44. i++)
  45. #define for_each_rsnd_clkout(pos, adg, i) \
  46. for (i = 0; \
  47. (i < CLKOUTMAX) && \
  48. ((pos) = adg->clkout[i]); \
  49. i++)
  50. #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg)
  51. static u32 rsnd_adg_calculate_rbgx(unsigned long div)
  52. {
  53. int i, ratio;
  54. if (!div)
  55. return 0;
  56. for (i = 3; i >= 0; i--) {
  57. ratio = 2 << (i * 2);
  58. if (0 == (div % ratio))
  59. return (u32)((i << 8) | ((div / ratio) - 1));
  60. }
  61. return ~0;
  62. }
  63. static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)
  64. {
  65. struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
  66. int id = rsnd_mod_id(ssi_mod);
  67. int ws = id;
  68. if (rsnd_ssi_is_pin_sharing(io)) {
  69. switch (id) {
  70. case 1:
  71. case 2:
  72. ws = 0;
  73. break;
  74. case 4:
  75. ws = 3;
  76. break;
  77. case 8:
  78. ws = 7;
  79. break;
  80. }
  81. }
  82. return (0x6 + ws) << 8;
  83. }
  84. static void __rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv,
  85. struct rsnd_dai_stream *io,
  86. unsigned int target_rate,
  87. unsigned int *target_val,
  88. unsigned int *target_en)
  89. {
  90. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  91. struct device *dev = rsnd_priv_to_dev(priv);
  92. int idx, sel, div, step;
  93. unsigned int val, en;
  94. unsigned int min, diff;
  95. unsigned int sel_rate[] = {
  96. clk_get_rate(adg->clk[CLKA]), /* 0000: CLKA */
  97. clk_get_rate(adg->clk[CLKB]), /* 0001: CLKB */
  98. clk_get_rate(adg->clk[CLKC]), /* 0010: CLKC */
  99. adg->rbga_rate_for_441khz, /* 0011: RBGA */
  100. adg->rbgb_rate_for_48khz, /* 0100: RBGB */
  101. };
  102. min = ~0;
  103. val = 0;
  104. en = 0;
  105. for (sel = 0; sel < ARRAY_SIZE(sel_rate); sel++) {
  106. idx = 0;
  107. step = 2;
  108. if (!sel_rate[sel])
  109. continue;
  110. for (div = 2; div <= 98304; div += step) {
  111. diff = abs(target_rate - sel_rate[sel] / div);
  112. if (min > diff) {
  113. val = (sel << 8) | idx;
  114. min = diff;
  115. en = 1 << (sel + 1); /* fixme */
  116. }
  117. /*
  118. * step of 0_0000 / 0_0001 / 0_1101
  119. * are out of order
  120. */
  121. if ((idx > 2) && (idx % 2))
  122. step *= 2;
  123. if (idx == 0x1c) {
  124. div += step;
  125. step *= 2;
  126. }
  127. idx++;
  128. }
  129. }
  130. if (min == ~0) {
  131. dev_err(dev, "no Input clock\n");
  132. return;
  133. }
  134. *target_val = val;
  135. if (target_en)
  136. *target_en = en;
  137. }
  138. static void rsnd_adg_get_timesel_ratio(struct rsnd_priv *priv,
  139. struct rsnd_dai_stream *io,
  140. unsigned int in_rate,
  141. unsigned int out_rate,
  142. u32 *in, u32 *out, u32 *en)
  143. {
  144. struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
  145. unsigned int target_rate;
  146. u32 *target_val;
  147. u32 _in;
  148. u32 _out;
  149. u32 _en;
  150. /* default = SSI WS */
  151. _in =
  152. _out = rsnd_adg_ssi_ws_timing_gen2(io);
  153. target_rate = 0;
  154. target_val = NULL;
  155. _en = 0;
  156. if (runtime->rate != in_rate) {
  157. target_rate = out_rate;
  158. target_val = &_out;
  159. } else if (runtime->rate != out_rate) {
  160. target_rate = in_rate;
  161. target_val = &_in;
  162. }
  163. if (target_rate)
  164. __rsnd_adg_get_timesel_ratio(priv, io,
  165. target_rate,
  166. target_val, &_en);
  167. if (in)
  168. *in = _in;
  169. if (out)
  170. *out = _out;
  171. if (en)
  172. *en = _en;
  173. }
  174. int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod,
  175. struct rsnd_dai_stream *io)
  176. {
  177. struct rsnd_priv *priv = rsnd_mod_to_priv(cmd_mod);
  178. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  179. struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
  180. int id = rsnd_mod_id(cmd_mod);
  181. int shift = (id % 2) ? 16 : 0;
  182. u32 mask, val;
  183. rsnd_adg_get_timesel_ratio(priv, io,
  184. rsnd_src_get_in_rate(priv, io),
  185. rsnd_src_get_out_rate(priv, io),
  186. NULL, &val, NULL);
  187. val = val << shift;
  188. mask = 0xffff << shift;
  189. rsnd_mod_bset(adg_mod, CMDOUT_TIMSEL, mask, val);
  190. return 0;
  191. }
  192. int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod,
  193. struct rsnd_dai_stream *io,
  194. unsigned int in_rate,
  195. unsigned int out_rate)
  196. {
  197. struct rsnd_priv *priv = rsnd_mod_to_priv(src_mod);
  198. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  199. struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
  200. u32 in, out;
  201. u32 mask, en;
  202. int id = rsnd_mod_id(src_mod);
  203. int shift = (id % 2) ? 16 : 0;
  204. rsnd_mod_confirm_src(src_mod);
  205. rsnd_adg_get_timesel_ratio(priv, io,
  206. in_rate, out_rate,
  207. &in, &out, &en);
  208. in = in << shift;
  209. out = out << shift;
  210. mask = 0xffff << shift;
  211. switch (id / 2) {
  212. case 0:
  213. rsnd_mod_bset(adg_mod, SRCIN_TIMSEL0, mask, in);
  214. rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL0, mask, out);
  215. break;
  216. case 1:
  217. rsnd_mod_bset(adg_mod, SRCIN_TIMSEL1, mask, in);
  218. rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL1, mask, out);
  219. break;
  220. case 2:
  221. rsnd_mod_bset(adg_mod, SRCIN_TIMSEL2, mask, in);
  222. rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL2, mask, out);
  223. break;
  224. case 3:
  225. rsnd_mod_bset(adg_mod, SRCIN_TIMSEL3, mask, in);
  226. rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL3, mask, out);
  227. break;
  228. case 4:
  229. rsnd_mod_bset(adg_mod, SRCIN_TIMSEL4, mask, in);
  230. rsnd_mod_bset(adg_mod, SRCOUT_TIMSEL4, mask, out);
  231. break;
  232. }
  233. if (en)
  234. rsnd_mod_bset(adg_mod, DIV_EN, en, en);
  235. return 0;
  236. }
  237. static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
  238. {
  239. struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
  240. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  241. struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
  242. int id = rsnd_mod_id(ssi_mod);
  243. int shift = (id % 4) * 8;
  244. u32 mask = 0xFF << shift;
  245. rsnd_mod_confirm_ssi(ssi_mod);
  246. val = val << shift;
  247. /*
  248. * SSI 8 is not connected to ADG.
  249. * it works with SSI 7
  250. */
  251. if (id == 8)
  252. return;
  253. switch (id / 4) {
  254. case 0:
  255. rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL0, mask, val);
  256. break;
  257. case 1:
  258. rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL1, mask, val);
  259. break;
  260. case 2:
  261. rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL2, mask, val);
  262. break;
  263. }
  264. }
  265. int rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod)
  266. {
  267. rsnd_adg_set_ssi_clk(ssi_mod, 0);
  268. return 0;
  269. }
  270. int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
  271. {
  272. struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
  273. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  274. struct device *dev = rsnd_priv_to_dev(priv);
  275. struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
  276. struct clk *clk;
  277. int i;
  278. u32 data;
  279. u32 ckr = 0;
  280. int sel_table[] = {
  281. [CLKA] = 0x1,
  282. [CLKB] = 0x2,
  283. [CLKC] = 0x3,
  284. [CLKI] = 0x0,
  285. };
  286. dev_dbg(dev, "request clock = %d\n", rate);
  287. /*
  288. * find suitable clock from
  289. * AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI.
  290. */
  291. data = 0;
  292. for_each_rsnd_clk(clk, adg, i) {
  293. if (rate == clk_get_rate(clk)) {
  294. data = sel_table[i];
  295. goto found_clock;
  296. }
  297. }
  298. /*
  299. * find divided clock from BRGA/BRGB
  300. */
  301. if (rate == adg->rbga_rate_for_441khz) {
  302. data = 0x10;
  303. goto found_clock;
  304. }
  305. if (rate == adg->rbgb_rate_for_48khz) {
  306. data = 0x20;
  307. goto found_clock;
  308. }
  309. return -EIO;
  310. found_clock:
  311. rsnd_adg_set_ssi_clk(ssi_mod, data);
  312. if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) {
  313. if (0 == (rate % 8000))
  314. ckr = 0x80000000;
  315. }
  316. rsnd_mod_bset(adg_mod, BRGCKR, 0x80FF0000, adg->ckr | ckr);
  317. rsnd_mod_write(adg_mod, BRRA, adg->rbga);
  318. rsnd_mod_write(adg_mod, BRRB, adg->rbgb);
  319. dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n",
  320. rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod),
  321. data, rate);
  322. return 0;
  323. }
  324. void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable)
  325. {
  326. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  327. struct device *dev = rsnd_priv_to_dev(priv);
  328. struct clk *clk;
  329. int i, ret;
  330. for_each_rsnd_clk(clk, adg, i) {
  331. ret = 0;
  332. if (enable)
  333. ret = clk_prepare_enable(clk);
  334. else
  335. clk_disable_unprepare(clk);
  336. if (ret < 0)
  337. dev_warn(dev, "can't use clk %d\n", i);
  338. }
  339. }
  340. static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
  341. struct rsnd_adg *adg)
  342. {
  343. struct device *dev = rsnd_priv_to_dev(priv);
  344. struct clk *clk;
  345. static const char * const clk_name[] = {
  346. [CLKA] = "clk_a",
  347. [CLKB] = "clk_b",
  348. [CLKC] = "clk_c",
  349. [CLKI] = "clk_i",
  350. };
  351. int i;
  352. for (i = 0; i < CLKMAX; i++) {
  353. clk = devm_clk_get(dev, clk_name[i]);
  354. adg->clk[i] = IS_ERR(clk) ? NULL : clk;
  355. }
  356. for_each_rsnd_clk(clk, adg, i)
  357. dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk));
  358. }
  359. static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
  360. struct rsnd_adg *adg)
  361. {
  362. struct clk *clk;
  363. struct device *dev = rsnd_priv_to_dev(priv);
  364. struct device_node *np = dev->of_node;
  365. u32 ckr, rbgx, rbga, rbgb;
  366. u32 rate, req_rate = 0, div;
  367. uint32_t count = 0;
  368. unsigned long req_48kHz_rate, req_441kHz_rate;
  369. int i;
  370. const char *parent_clk_name = NULL;
  371. static const char * const clkout_name[] = {
  372. [CLKOUT] = "audio_clkout",
  373. [CLKOUT1] = "audio_clkout1",
  374. [CLKOUT2] = "audio_clkout2",
  375. [CLKOUT3] = "audio_clkout3",
  376. };
  377. int brg_table[] = {
  378. [CLKA] = 0x0,
  379. [CLKB] = 0x1,
  380. [CLKC] = 0x4,
  381. [CLKI] = 0x2,
  382. };
  383. of_property_read_u32(np, "#clock-cells", &count);
  384. /*
  385. * ADG supports BRRA/BRRB output only
  386. * this means all clkout0/1/2/3 will be same rate
  387. */
  388. of_property_read_u32(np, "clock-frequency", &req_rate);
  389. req_48kHz_rate = 0;
  390. req_441kHz_rate = 0;
  391. if (0 == (req_rate % 44100))
  392. req_441kHz_rate = req_rate;
  393. if (0 == (req_rate % 48000))
  394. req_48kHz_rate = req_rate;
  395. /*
  396. * This driver is assuming that AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC
  397. * have 44.1kHz or 48kHz base clocks for now.
  398. *
  399. * SSI itself can divide parent clock by 1/1 - 1/16
  400. * see
  401. * rsnd_adg_ssi_clk_try_start()
  402. * rsnd_ssi_master_clk_start()
  403. */
  404. ckr = 0;
  405. rbga = 2; /* default 1/6 */
  406. rbgb = 2; /* default 1/6 */
  407. adg->rbga_rate_for_441khz = 0;
  408. adg->rbgb_rate_for_48khz = 0;
  409. for_each_rsnd_clk(clk, adg, i) {
  410. rate = clk_get_rate(clk);
  411. if (0 == rate) /* not used */
  412. continue;
  413. /* RBGA */
  414. if (!adg->rbga_rate_for_441khz && (0 == rate % 44100)) {
  415. div = 6;
  416. if (req_441kHz_rate)
  417. div = rate / req_441kHz_rate;
  418. rbgx = rsnd_adg_calculate_rbgx(div);
  419. if (BRRx_MASK(rbgx) == rbgx) {
  420. rbga = rbgx;
  421. adg->rbga_rate_for_441khz = rate / div;
  422. ckr |= brg_table[i] << 20;
  423. if (req_441kHz_rate)
  424. parent_clk_name = __clk_get_name(clk);
  425. }
  426. }
  427. /* RBGB */
  428. if (!adg->rbgb_rate_for_48khz && (0 == rate % 48000)) {
  429. div = 6;
  430. if (req_48kHz_rate)
  431. div = rate / req_48kHz_rate;
  432. rbgx = rsnd_adg_calculate_rbgx(div);
  433. if (BRRx_MASK(rbgx) == rbgx) {
  434. rbgb = rbgx;
  435. adg->rbgb_rate_for_48khz = rate / div;
  436. ckr |= brg_table[i] << 16;
  437. if (req_48kHz_rate) {
  438. parent_clk_name = __clk_get_name(clk);
  439. ckr |= 0x80000000;
  440. }
  441. }
  442. }
  443. }
  444. /*
  445. * ADG supports BRRA/BRRB output only.
  446. * this means all clkout0/1/2/3 will be * same rate
  447. */
  448. /*
  449. * for clkout
  450. */
  451. if (!count) {
  452. clk = clk_register_fixed_rate(dev, clkout_name[CLKOUT],
  453. parent_clk_name, 0, req_rate);
  454. if (!IS_ERR(clk)) {
  455. adg->clkout[CLKOUT] = clk;
  456. of_clk_add_provider(np, of_clk_src_simple_get, clk);
  457. }
  458. }
  459. /*
  460. * for clkout0/1/2/3
  461. */
  462. else {
  463. for (i = 0; i < CLKOUTMAX; i++) {
  464. clk = clk_register_fixed_rate(dev, clkout_name[i],
  465. parent_clk_name, 0,
  466. req_rate);
  467. if (!IS_ERR(clk)) {
  468. adg->onecell.clks = adg->clkout;
  469. adg->onecell.clk_num = CLKOUTMAX;
  470. adg->clkout[i] = clk;
  471. of_clk_add_provider(np, of_clk_src_onecell_get,
  472. &adg->onecell);
  473. }
  474. }
  475. }
  476. adg->ckr = ckr;
  477. adg->rbga = rbga;
  478. adg->rbgb = rbgb;
  479. for_each_rsnd_clkout(clk, adg, i)
  480. dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk));
  481. dev_dbg(dev, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n",
  482. ckr, rbga, rbgb);
  483. }
  484. int rsnd_adg_probe(struct rsnd_priv *priv)
  485. {
  486. struct rsnd_adg *adg;
  487. struct device *dev = rsnd_priv_to_dev(priv);
  488. struct device_node *np = dev->of_node;
  489. adg = devm_kzalloc(dev, sizeof(*adg), GFP_KERNEL);
  490. if (!adg) {
  491. dev_err(dev, "ADG allocate failed\n");
  492. return -ENOMEM;
  493. }
  494. rsnd_mod_init(priv, &adg->mod, &adg_ops,
  495. NULL, NULL, 0, 0);
  496. rsnd_adg_get_clkin(priv, adg);
  497. rsnd_adg_get_clkout(priv, adg);
  498. if (of_get_property(np, "clkout-lr-asynchronous", NULL))
  499. adg->flags = LRCLK_ASYNC;
  500. priv->adg = adg;
  501. rsnd_adg_clk_enable(priv);
  502. return 0;
  503. }
  504. void rsnd_adg_remove(struct rsnd_priv *priv)
  505. {
  506. rsnd_adg_clk_disable(priv);
  507. }