adg.c 9.2 KB

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