adg.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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/sh_clk.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. struct rsnd_adg {
  18. struct clk *clk[CLKMAX];
  19. int rbga_rate_for_441khz_div_6; /* RBGA */
  20. int rbgb_rate_for_48khz_div_6; /* RBGB */
  21. u32 ckr;
  22. };
  23. #define for_each_rsnd_clk(pos, adg, i) \
  24. for (i = 0; \
  25. (i < CLKMAX) && \
  26. ((pos) = adg->clk[i]); \
  27. i++)
  28. #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg)
  29. static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)
  30. {
  31. struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
  32. struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
  33. int id = rsnd_mod_id(mod);
  34. int ws = id;
  35. if (rsnd_ssi_is_pin_sharing(rsnd_ssi_mod_get(priv, id))) {
  36. switch (id) {
  37. case 1:
  38. case 2:
  39. ws = 0;
  40. break;
  41. case 4:
  42. ws = 3;
  43. break;
  44. case 8:
  45. ws = 7;
  46. break;
  47. }
  48. }
  49. return (0x6 + ws) << 8;
  50. }
  51. int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_dai *rdai,
  52. struct rsnd_mod *mod,
  53. struct rsnd_dai_stream *io)
  54. {
  55. int id = rsnd_mod_id(mod);
  56. int shift = (id % 2) ? 16 : 0;
  57. u32 mask, val;
  58. val = rsnd_adg_ssi_ws_timing_gen2(io);
  59. val = val << shift;
  60. mask = 0xffff << shift;
  61. rsnd_mod_bset(mod, CMDOUT_TIMSEL, mask, val);
  62. return 0;
  63. }
  64. static int rsnd_adg_set_src_timsel_gen2(struct rsnd_dai *rdai,
  65. struct rsnd_mod *mod,
  66. struct rsnd_dai_stream *io,
  67. u32 timsel)
  68. {
  69. int is_play = rsnd_dai_is_play(rdai, io);
  70. int id = rsnd_mod_id(mod);
  71. int shift = (id % 2) ? 16 : 0;
  72. u32 mask, ws;
  73. u32 in, out;
  74. ws = rsnd_adg_ssi_ws_timing_gen2(io);
  75. in = (is_play) ? timsel : ws;
  76. out = (is_play) ? ws : timsel;
  77. in = in << shift;
  78. out = out << shift;
  79. mask = 0xffff << shift;
  80. switch (id / 2) {
  81. case 0:
  82. rsnd_mod_bset(mod, SRCIN_TIMSEL0, mask, in);
  83. rsnd_mod_bset(mod, SRCOUT_TIMSEL0, mask, out);
  84. break;
  85. case 1:
  86. rsnd_mod_bset(mod, SRCIN_TIMSEL1, mask, in);
  87. rsnd_mod_bset(mod, SRCOUT_TIMSEL1, mask, out);
  88. break;
  89. case 2:
  90. rsnd_mod_bset(mod, SRCIN_TIMSEL2, mask, in);
  91. rsnd_mod_bset(mod, SRCOUT_TIMSEL2, mask, out);
  92. break;
  93. case 3:
  94. rsnd_mod_bset(mod, SRCIN_TIMSEL3, mask, in);
  95. rsnd_mod_bset(mod, SRCOUT_TIMSEL3, mask, out);
  96. break;
  97. case 4:
  98. rsnd_mod_bset(mod, SRCIN_TIMSEL4, mask, in);
  99. rsnd_mod_bset(mod, SRCOUT_TIMSEL4, mask, out);
  100. break;
  101. }
  102. return 0;
  103. }
  104. int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod,
  105. struct rsnd_dai *rdai,
  106. struct rsnd_dai_stream *io,
  107. unsigned int src_rate,
  108. unsigned int dst_rate)
  109. {
  110. struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
  111. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  112. struct device *dev = rsnd_priv_to_dev(priv);
  113. int idx, sel, div, step, ret;
  114. u32 val, en;
  115. unsigned int min, diff;
  116. unsigned int sel_rate [] = {
  117. clk_get_rate(adg->clk[CLKA]), /* 0000: CLKA */
  118. clk_get_rate(adg->clk[CLKB]), /* 0001: CLKB */
  119. clk_get_rate(adg->clk[CLKC]), /* 0010: CLKC */
  120. adg->rbga_rate_for_441khz_div_6,/* 0011: RBGA */
  121. adg->rbgb_rate_for_48khz_div_6, /* 0100: RBGB */
  122. };
  123. min = ~0;
  124. val = 0;
  125. en = 0;
  126. for (sel = 0; sel < ARRAY_SIZE(sel_rate); sel++) {
  127. idx = 0;
  128. step = 2;
  129. if (!sel_rate[sel])
  130. continue;
  131. for (div = 2; div <= 98304; div += step) {
  132. diff = abs(src_rate - sel_rate[sel] / div);
  133. if (min > diff) {
  134. val = (sel << 8) | idx;
  135. min = diff;
  136. en = 1 << (sel + 1); /* fixme */
  137. }
  138. /*
  139. * step of 0_0000 / 0_0001 / 0_1101
  140. * are out of order
  141. */
  142. if ((idx > 2) && (idx % 2))
  143. step *= 2;
  144. if (idx == 0x1c) {
  145. div += step;
  146. step *= 2;
  147. }
  148. idx++;
  149. }
  150. }
  151. if (min == ~0) {
  152. dev_err(dev, "no Input clock\n");
  153. return -EIO;
  154. }
  155. ret = rsnd_adg_set_src_timsel_gen2(rdai, mod, io, val);
  156. if (ret < 0) {
  157. dev_err(dev, "timsel error\n");
  158. return ret;
  159. }
  160. rsnd_mod_bset(mod, DIV_EN, en, en);
  161. return 0;
  162. }
  163. int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
  164. struct rsnd_dai *rdai,
  165. struct rsnd_dai_stream *io)
  166. {
  167. u32 val = rsnd_adg_ssi_ws_timing_gen2(io);
  168. return rsnd_adg_set_src_timsel_gen2(rdai, mod, io, val);
  169. }
  170. int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
  171. struct rsnd_mod *mod,
  172. unsigned int src_rate,
  173. unsigned int dst_rate)
  174. {
  175. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  176. struct device *dev = rsnd_priv_to_dev(priv);
  177. int idx, sel, div, shift;
  178. u32 mask, val;
  179. int id = rsnd_mod_id(mod);
  180. unsigned int sel_rate [] = {
  181. clk_get_rate(adg->clk[CLKA]), /* 000: CLKA */
  182. clk_get_rate(adg->clk[CLKB]), /* 001: CLKB */
  183. clk_get_rate(adg->clk[CLKC]), /* 010: CLKC */
  184. 0, /* 011: MLBCLK (not used) */
  185. adg->rbga_rate_for_441khz_div_6,/* 100: RBGA */
  186. adg->rbgb_rate_for_48khz_div_6, /* 101: RBGB */
  187. };
  188. /* find div (= 1/128, 1/256, 1/512, 1/1024, 1/2048 */
  189. for (sel = 0; sel < ARRAY_SIZE(sel_rate); sel++) {
  190. for (div = 128, idx = 0;
  191. div <= 2048;
  192. div *= 2, idx++) {
  193. if (src_rate == sel_rate[sel] / div) {
  194. val = (idx << 4) | sel;
  195. goto find_rate;
  196. }
  197. }
  198. }
  199. dev_err(dev, "can't find convert src clk\n");
  200. return -EINVAL;
  201. find_rate:
  202. shift = (id % 4) * 8;
  203. mask = 0xFF << shift;
  204. val = val << shift;
  205. dev_dbg(dev, "adg convert src clk = %02x\n", val);
  206. switch (id / 4) {
  207. case 0:
  208. rsnd_mod_bset(mod, AUDIO_CLK_SEL3, mask, val);
  209. break;
  210. case 1:
  211. rsnd_mod_bset(mod, AUDIO_CLK_SEL4, mask, val);
  212. break;
  213. case 2:
  214. rsnd_mod_bset(mod, AUDIO_CLK_SEL5, mask, val);
  215. break;
  216. }
  217. /*
  218. * Gen1 doesn't need dst_rate settings,
  219. * since it uses SSI WS pin.
  220. * see also rsnd_src_set_route_if_gen1()
  221. */
  222. return 0;
  223. }
  224. static void rsnd_adg_set_ssi_clk(struct rsnd_mod *mod, u32 val)
  225. {
  226. int id = rsnd_mod_id(mod);
  227. int shift = (id % 4) * 8;
  228. u32 mask = 0xFF << shift;
  229. val = val << shift;
  230. /*
  231. * SSI 8 is not connected to ADG.
  232. * it works with SSI 7
  233. */
  234. if (id == 8)
  235. return;
  236. switch (id / 4) {
  237. case 0:
  238. rsnd_mod_bset(mod, AUDIO_CLK_SEL0, mask, val);
  239. break;
  240. case 1:
  241. rsnd_mod_bset(mod, AUDIO_CLK_SEL1, mask, val);
  242. break;
  243. case 2:
  244. rsnd_mod_bset(mod, AUDIO_CLK_SEL2, mask, val);
  245. break;
  246. }
  247. }
  248. int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod)
  249. {
  250. /*
  251. * "mod" = "ssi" here.
  252. * we can get "ssi id" from mod
  253. */
  254. rsnd_adg_set_ssi_clk(mod, 0);
  255. return 0;
  256. }
  257. int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate)
  258. {
  259. struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
  260. struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
  261. struct device *dev = rsnd_priv_to_dev(priv);
  262. struct clk *clk;
  263. int i;
  264. u32 data;
  265. int sel_table[] = {
  266. [CLKA] = 0x1,
  267. [CLKB] = 0x2,
  268. [CLKC] = 0x3,
  269. [CLKI] = 0x0,
  270. };
  271. dev_dbg(dev, "request clock = %d\n", rate);
  272. /*
  273. * find suitable clock from
  274. * AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI.
  275. */
  276. data = 0;
  277. for_each_rsnd_clk(clk, adg, i) {
  278. if (rate == clk_get_rate(clk)) {
  279. data = sel_table[i];
  280. goto found_clock;
  281. }
  282. }
  283. /*
  284. * find 1/6 clock from BRGA/BRGB
  285. */
  286. if (rate == adg->rbga_rate_for_441khz_div_6) {
  287. data = 0x10;
  288. goto found_clock;
  289. }
  290. if (rate == adg->rbgb_rate_for_48khz_div_6) {
  291. data = 0x20;
  292. goto found_clock;
  293. }
  294. return -EIO;
  295. found_clock:
  296. /* see rsnd_adg_ssi_clk_init() */
  297. rsnd_mod_bset(mod, SSICKR, 0x00FF0000, adg->ckr);
  298. rsnd_mod_write(mod, BRRA, 0x00000002); /* 1/6 */
  299. rsnd_mod_write(mod, BRRB, 0x00000002); /* 1/6 */
  300. /*
  301. * This "mod" = "ssi" here.
  302. * we can get "ssi id" from mod
  303. */
  304. rsnd_adg_set_ssi_clk(mod, data);
  305. dev_dbg(dev, "ADG: ssi%d selects clk%d = %d",
  306. rsnd_mod_id(mod), i, rate);
  307. return 0;
  308. }
  309. static void rsnd_adg_ssi_clk_init(struct rsnd_priv *priv, struct rsnd_adg *adg)
  310. {
  311. struct clk *clk;
  312. unsigned long rate;
  313. u32 ckr;
  314. int i;
  315. int brg_table[] = {
  316. [CLKA] = 0x0,
  317. [CLKB] = 0x1,
  318. [CLKC] = 0x4,
  319. [CLKI] = 0x2,
  320. };
  321. /*
  322. * This driver is assuming that AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC
  323. * have 44.1kHz or 48kHz base clocks for now.
  324. *
  325. * SSI itself can divide parent clock by 1/1 - 1/16
  326. * So, BRGA outputs 44.1kHz base parent clock 1/32,
  327. * and, BRGB outputs 48.0kHz base parent clock 1/32 here.
  328. * see
  329. * rsnd_adg_ssi_clk_try_start()
  330. */
  331. ckr = 0;
  332. adg->rbga_rate_for_441khz_div_6 = 0;
  333. adg->rbgb_rate_for_48khz_div_6 = 0;
  334. for_each_rsnd_clk(clk, adg, i) {
  335. rate = clk_get_rate(clk);
  336. if (0 == rate) /* not used */
  337. continue;
  338. /* RBGA */
  339. if (!adg->rbga_rate_for_441khz_div_6 && (0 == rate % 44100)) {
  340. adg->rbga_rate_for_441khz_div_6 = rate / 6;
  341. ckr |= brg_table[i] << 20;
  342. }
  343. /* RBGB */
  344. if (!adg->rbgb_rate_for_48khz_div_6 && (0 == rate % 48000)) {
  345. adg->rbgb_rate_for_48khz_div_6 = rate / 6;
  346. ckr |= brg_table[i] << 16;
  347. }
  348. }
  349. adg->ckr = ckr;
  350. }
  351. int rsnd_adg_probe(struct platform_device *pdev,
  352. const struct rsnd_of_data *of_data,
  353. struct rsnd_priv *priv)
  354. {
  355. struct rsnd_adg *adg;
  356. struct device *dev = rsnd_priv_to_dev(priv);
  357. struct clk *clk;
  358. int i;
  359. adg = devm_kzalloc(dev, sizeof(*adg), GFP_KERNEL);
  360. if (!adg) {
  361. dev_err(dev, "ADG allocate failed\n");
  362. return -ENOMEM;
  363. }
  364. adg->clk[CLKA] = devm_clk_get(dev, "clk_a");
  365. adg->clk[CLKB] = devm_clk_get(dev, "clk_b");
  366. adg->clk[CLKC] = devm_clk_get(dev, "clk_c");
  367. adg->clk[CLKI] = devm_clk_get(dev, "clk_i");
  368. for_each_rsnd_clk(clk, adg, i)
  369. dev_dbg(dev, "clk %d : %p\n", i, clk);
  370. rsnd_adg_ssi_clk_init(priv, adg);
  371. priv->adg = adg;
  372. dev_dbg(dev, "adg probed\n");
  373. return 0;
  374. }