audio-graph-card2.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // ASoC Audio Graph Card2 support
  4. //
  5. // Copyright (C) 2020 Renesas Electronics Corp.
  6. // Copyright (C) 2020 Kuninori Morimoto <[email protected]>
  7. //
  8. // based on ${LINUX}/sound/soc/generic/audio-graph-card.c
  9. #include <linux/clk.h>
  10. #include <linux/device.h>
  11. #include <linux/gpio.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/module.h>
  14. #include <linux/of.h>
  15. #include <linux/of_device.h>
  16. #include <linux/of_gpio.h>
  17. #include <linux/of_graph.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/string.h>
  20. #include <sound/graph_card.h>
  21. /************************************
  22. daifmt
  23. ************************************
  24. ports {
  25. format = "left_j";
  26. port@0 {
  27. bitclock-master;
  28. sample0: endpoint@0 {
  29. frame-master;
  30. };
  31. sample1: endpoint@1 {
  32. format = "i2s";
  33. };
  34. };
  35. ...
  36. };
  37. You can set daifmt at ports/port/endpoint.
  38. It uses *latest* format, and *share* master settings.
  39. In above case,
  40. sample0: left_j, bitclock-master, frame-master
  41. sample1: i2s, bitclock-master
  42. If there was no settings, *Codec* will be
  43. bitclock/frame provider as default.
  44. see
  45. graph_parse_daifmt().
  46. ************************************
  47. Normal Audio-Graph
  48. ************************************
  49. CPU <---> Codec
  50. sound {
  51. compatible = "audio-graph-card2";
  52. links = <&cpu>;
  53. };
  54. CPU {
  55. cpu: port {
  56. bitclock-master;
  57. frame-master;
  58. cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
  59. };
  60. Codec {
  61. port { codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
  62. };
  63. ************************************
  64. Multi-CPU/Codec
  65. ************************************
  66. It has connection part (= X) and list part (= y).
  67. links indicates connection part of CPU side (= A).
  68. +-+ (A) +-+
  69. CPU1 --(y) | | <-(X)--(X)-> | | (y)-- Codec1
  70. CPU2 --(y) | | | | (y)-- Codec2
  71. +-+ +-+
  72. sound {
  73. compatible = "audio-graph-card2";
  74. (A) links = <&mcpu>;
  75. multi {
  76. ports@0 {
  77. (X) (A) mcpu: port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
  78. (y) port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
  79. (y) port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>; }; };
  80. };
  81. ports@1 {
  82. (X) port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>; }; };
  83. (y) port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
  84. (y) port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
  85. };
  86. };
  87. };
  88. CPU {
  89. ports {
  90. bitclock-master;
  91. frame-master;
  92. port@0 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
  93. port@1 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
  94. };
  95. };
  96. Codec {
  97. ports {
  98. port@0 { codec1_ep: endpoint { remote-endpoint = <&mcodec1_ep>; }; };
  99. port@1 { codec2_ep: endpoint { remote-endpoint = <&mcodec2_ep>; }; };
  100. };
  101. };
  102. ************************************
  103. DPCM
  104. ************************************
  105. DSP
  106. ************
  107. PCM0 <--> * fe0 be0 * <--> DAI0: Codec Headset
  108. PCM1 <--> * fe1 be1 * <--> DAI1: Codec Speakers
  109. PCM2 <--> * fe2 be2 * <--> DAI2: MODEM
  110. PCM3 <--> * fe3 be3 * <--> DAI3: BT
  111. * be4 * <--> DAI4: DMIC
  112. * be5 * <--> DAI5: FM
  113. ************
  114. sound {
  115. compatible = "audio-graph-card2";
  116. // indicate routing
  117. routing = "xxx Playback", "xxx Playback",
  118. "xxx Playback", "xxx Playback",
  119. "xxx Playback", "xxx Playback";
  120. // indicate all Front-End, Back-End
  121. links = <&fe0, &fe1, ...,
  122. &be0, &be1, ...>;
  123. dpcm {
  124. // Front-End
  125. ports@0 {
  126. fe0: port@0 { fe0_ep: endpoint { remote-endpoint = <&pcm0_ep>; }; };
  127. fe1: port@1 { fe1_ep: endpoint { remote-endpoint = <&pcm1_ep>; }; };
  128. ...
  129. };
  130. // Back-End
  131. ports@1 {
  132. be0: port@0 { be0_ep: endpoint { remote-endpoint = <&dai0_ep>; }; };
  133. be1: port@1 { be1_ep: endpoint { remote-endpoint = <&dai1_ep>; }; };
  134. ...
  135. };
  136. };
  137. };
  138. CPU {
  139. ports {
  140. bitclock-master;
  141. frame-master;
  142. port@0 { pcm0_ep: endpoint { remote-endpoint = <&fe0_ep>; }; };
  143. port@1 { pcm1_ep: endpoint { remote-endpoint = <&fe1_ep>; }; };
  144. ...
  145. };
  146. };
  147. Codec {
  148. ports {
  149. port@0 { dai0_ep: endpoint { remote-endpoint = <&be0_ep>; }; };
  150. port@1 { dai1_ep: endpoint { remote-endpoint = <&be1_ep>; }; };
  151. ...
  152. };
  153. };
  154. ************************************
  155. Codec to Codec
  156. ************************************
  157. +--+
  158. | |<-- Codec0 <- IN
  159. | |--> Codec1 -> OUT
  160. +--+
  161. sound {
  162. compatible = "audio-graph-card2";
  163. routing = "OUT" ,"DAI1 Playback",
  164. "DAI0 Capture", "IN";
  165. links = <&c2c>;
  166. codec2codec {
  167. ports {
  168. rate = <48000>;
  169. c2c: port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
  170. port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
  171. };
  172. };
  173. Codec {
  174. ports {
  175. port@0 {
  176. bitclock-master;
  177. frame-master;
  178. codec0_ep: endpoint { remote-endpoint = <&c2cf_ep>; }; };
  179. port@1 { codec1_ep: endpoint { remote-endpoint = <&c2cb_ep>; }; };
  180. };
  181. };
  182. */
  183. enum graph_type {
  184. GRAPH_NORMAL,
  185. GRAPH_DPCM,
  186. GRAPH_C2C,
  187. GRAPH_MULTI, /* don't use ! Use this only in __graph_get_type() */
  188. };
  189. #define GRAPH_NODENAME_MULTI "multi"
  190. #define GRAPH_NODENAME_DPCM "dpcm"
  191. #define GRAPH_NODENAME_C2C "codec2codec"
  192. #define port_to_endpoint(port) of_get_child_by_name(port, "endpoint")
  193. static enum graph_type __graph_get_type(struct device_node *lnk)
  194. {
  195. struct device_node *np, *parent_np;
  196. enum graph_type ret;
  197. /*
  198. * target {
  199. * ports {
  200. * => lnk: port@0 { ... };
  201. * port@1 { ... };
  202. * };
  203. * };
  204. */
  205. np = of_get_parent(lnk);
  206. if (of_node_name_eq(np, "ports")) {
  207. parent_np = of_get_parent(np);
  208. of_node_put(np);
  209. np = parent_np;
  210. }
  211. if (of_node_name_eq(np, GRAPH_NODENAME_MULTI)) {
  212. ret = GRAPH_MULTI;
  213. goto out_put;
  214. }
  215. if (of_node_name_eq(np, GRAPH_NODENAME_DPCM)) {
  216. ret = GRAPH_DPCM;
  217. goto out_put;
  218. }
  219. if (of_node_name_eq(np, GRAPH_NODENAME_C2C)) {
  220. ret = GRAPH_C2C;
  221. goto out_put;
  222. }
  223. ret = GRAPH_NORMAL;
  224. out_put:
  225. of_node_put(np);
  226. return ret;
  227. }
  228. static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
  229. struct device_node *lnk)
  230. {
  231. enum graph_type type = __graph_get_type(lnk);
  232. /* GRAPH_MULTI here means GRAPH_NORMAL */
  233. if (type == GRAPH_MULTI)
  234. type = GRAPH_NORMAL;
  235. #ifdef DEBUG
  236. {
  237. struct device *dev = simple_priv_to_dev(priv);
  238. const char *str = "Normal";
  239. switch (type) {
  240. case GRAPH_DPCM:
  241. if (asoc_graph_is_ports0(lnk))
  242. str = "DPCM Front-End";
  243. else
  244. str = "DPCM Back-End";
  245. break;
  246. case GRAPH_C2C:
  247. str = "Codec2Codec";
  248. break;
  249. default:
  250. break;
  251. }
  252. dev_dbg(dev, "%pOF (%s)", lnk, str);
  253. }
  254. #endif
  255. return type;
  256. }
  257. static int graph_lnk_is_multi(struct device_node *lnk)
  258. {
  259. return __graph_get_type(lnk) == GRAPH_MULTI;
  260. }
  261. static struct device_node *graph_get_next_multi_ep(struct device_node **port)
  262. {
  263. struct device_node *ports = of_get_parent(*port);
  264. struct device_node *ep = NULL;
  265. struct device_node *rep = NULL;
  266. /*
  267. * multi {
  268. * ports {
  269. * => lnk: port@0 { ... };
  270. * port@1 { ep { ... = rep0 } };
  271. * port@2 { ep { ... = rep1 } };
  272. * ...
  273. * };
  274. * };
  275. *
  276. * xxx {
  277. * port@0 { rep0 };
  278. * port@1 { rep1 };
  279. * };
  280. */
  281. do {
  282. *port = of_get_next_child(ports, *port);
  283. if (!*port)
  284. break;
  285. } while (!of_node_name_eq(*port, "port"));
  286. if (*port) {
  287. ep = port_to_endpoint(*port);
  288. rep = of_graph_get_remote_endpoint(ep);
  289. }
  290. of_node_put(ep);
  291. of_node_put(ports);
  292. return rep;
  293. }
  294. static const struct snd_soc_ops graph_ops = {
  295. .startup = asoc_simple_startup,
  296. .shutdown = asoc_simple_shutdown,
  297. .hw_params = asoc_simple_hw_params,
  298. };
  299. static int graph_get_dai_id(struct device_node *ep)
  300. {
  301. struct device_node *node;
  302. struct device_node *endpoint;
  303. struct of_endpoint info;
  304. int i, id;
  305. const u32 *reg;
  306. int ret;
  307. /* use driver specified DAI ID if exist */
  308. ret = snd_soc_get_dai_id(ep);
  309. if (ret != -ENOTSUPP)
  310. return ret;
  311. /* use endpoint/port reg if exist */
  312. ret = of_graph_parse_endpoint(ep, &info);
  313. if (ret == 0) {
  314. /*
  315. * Because it will count port/endpoint if it doesn't have "reg".
  316. * But, we can't judge whether it has "no reg", or "reg = <0>"
  317. * only of_graph_parse_endpoint().
  318. * We need to check "reg" property
  319. */
  320. if (of_get_property(ep, "reg", NULL))
  321. return info.id;
  322. node = of_get_parent(ep);
  323. reg = of_get_property(node, "reg", NULL);
  324. of_node_put(node);
  325. if (reg)
  326. return info.port;
  327. }
  328. node = of_graph_get_port_parent(ep);
  329. /*
  330. * Non HDMI sound case, counting port/endpoint on its DT
  331. * is enough. Let's count it.
  332. */
  333. i = 0;
  334. id = -1;
  335. for_each_endpoint_of_node(node, endpoint) {
  336. if (endpoint == ep)
  337. id = i;
  338. i++;
  339. }
  340. of_node_put(node);
  341. if (id < 0)
  342. return -ENODEV;
  343. return id;
  344. }
  345. static int asoc_simple_parse_dai(struct device_node *ep,
  346. struct snd_soc_dai_link_component *dlc,
  347. int *is_single_link)
  348. {
  349. struct device_node *node;
  350. struct of_phandle_args args;
  351. int ret;
  352. if (!ep)
  353. return 0;
  354. node = of_graph_get_port_parent(ep);
  355. /* Get dai->name */
  356. args.np = node;
  357. args.args[0] = graph_get_dai_id(ep);
  358. args.args_count = (of_graph_get_endpoint_count(node) > 1);
  359. /*
  360. * FIXME
  361. *
  362. * Here, dlc->dai_name is pointer to CPU/Codec DAI name.
  363. * If user unbinded CPU or Codec driver, but not for Sound Card,
  364. * dlc->dai_name is keeping unbinded CPU or Codec
  365. * driver's pointer.
  366. *
  367. * If user re-bind CPU or Codec driver again, ALSA SoC will try
  368. * to rebind Card via snd_soc_try_rebind_card(), but because of
  369. * above reason, it might can't bind Sound Card.
  370. * Because Sound Card is pointing to released dai_name pointer.
  371. *
  372. * To avoid this rebind Card issue,
  373. * 1) It needs to alloc memory to keep dai_name eventhough
  374. * CPU or Codec driver was unbinded, or
  375. * 2) user need to rebind Sound Card everytime
  376. * if he unbinded CPU or Codec.
  377. */
  378. ret = snd_soc_get_dai_name(&args, &dlc->dai_name);
  379. if (ret < 0) {
  380. of_node_put(node);
  381. return ret;
  382. }
  383. dlc->of_node = node;
  384. if (is_single_link)
  385. *is_single_link = of_graph_get_endpoint_count(node) == 1;
  386. return 0;
  387. }
  388. static void graph_parse_convert(struct device_node *ep,
  389. struct simple_dai_props *props)
  390. {
  391. struct device_node *port = of_get_parent(ep);
  392. struct device_node *ports = of_get_parent(port);
  393. struct asoc_simple_data *adata = &props->adata;
  394. if (of_node_name_eq(ports, "ports"))
  395. asoc_simple_parse_convert(ports, NULL, adata);
  396. asoc_simple_parse_convert(port, NULL, adata);
  397. asoc_simple_parse_convert(ep, NULL, adata);
  398. of_node_put(port);
  399. of_node_put(ports);
  400. }
  401. static void graph_parse_mclk_fs(struct device_node *ep,
  402. struct simple_dai_props *props)
  403. {
  404. struct device_node *port = of_get_parent(ep);
  405. struct device_node *ports = of_get_parent(port);
  406. if (of_node_name_eq(ports, "ports"))
  407. of_property_read_u32(ports, "mclk-fs", &props->mclk_fs);
  408. of_property_read_u32(port, "mclk-fs", &props->mclk_fs);
  409. of_property_read_u32(ep, "mclk-fs", &props->mclk_fs);
  410. of_node_put(port);
  411. of_node_put(ports);
  412. }
  413. static int __graph_parse_node(struct asoc_simple_priv *priv,
  414. enum graph_type gtype,
  415. struct device_node *ep,
  416. struct link_info *li,
  417. int is_cpu, int idx)
  418. {
  419. struct device *dev = simple_priv_to_dev(priv);
  420. struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
  421. struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
  422. struct snd_soc_dai_link_component *dlc;
  423. struct asoc_simple_dai *dai;
  424. int ret, is_single_links = 0;
  425. if (is_cpu) {
  426. dlc = asoc_link_to_cpu(dai_link, idx);
  427. dai = simple_props_to_dai_cpu(dai_props, idx);
  428. } else {
  429. dlc = asoc_link_to_codec(dai_link, idx);
  430. dai = simple_props_to_dai_codec(dai_props, idx);
  431. }
  432. graph_parse_mclk_fs(ep, dai_props);
  433. ret = asoc_simple_parse_dai(ep, dlc, &is_single_links);
  434. if (ret < 0)
  435. return ret;
  436. ret = asoc_simple_parse_tdm(ep, dai);
  437. if (ret < 0)
  438. return ret;
  439. ret = asoc_simple_parse_tdm_width_map(dev, ep, dai);
  440. if (ret < 0)
  441. return ret;
  442. ret = asoc_simple_parse_clk(dev, ep, dai, dlc);
  443. if (ret < 0)
  444. return ret;
  445. /*
  446. * set DAI Name
  447. */
  448. if (!dai_link->name) {
  449. struct snd_soc_dai_link_component *cpus = dlc;
  450. struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, idx);
  451. char *cpu_multi = "";
  452. char *codec_multi = "";
  453. if (dai_link->num_cpus > 1)
  454. cpu_multi = "_multi";
  455. if (dai_link->num_codecs > 1)
  456. codec_multi = "_multi";
  457. switch (gtype) {
  458. case GRAPH_NORMAL:
  459. /* run is_cpu only. see audio_graph2_link_normal() */
  460. if (is_cpu)
  461. asoc_simple_set_dailink_name(dev, dai_link, "%s%s-%s%s",
  462. cpus->dai_name, cpu_multi,
  463. codecs->dai_name, codec_multi);
  464. break;
  465. case GRAPH_DPCM:
  466. if (is_cpu)
  467. asoc_simple_set_dailink_name(dev, dai_link, "fe.%pOFP.%s%s",
  468. cpus->of_node, cpus->dai_name, cpu_multi);
  469. else
  470. asoc_simple_set_dailink_name(dev, dai_link, "be.%pOFP.%s%s",
  471. codecs->of_node, codecs->dai_name, codec_multi);
  472. break;
  473. case GRAPH_C2C:
  474. /* run is_cpu only. see audio_graph2_link_c2c() */
  475. if (is_cpu)
  476. asoc_simple_set_dailink_name(dev, dai_link, "c2c.%s%s-%s%s",
  477. cpus->dai_name, cpu_multi,
  478. codecs->dai_name, codec_multi);
  479. break;
  480. default:
  481. break;
  482. }
  483. }
  484. /*
  485. * Check "prefix" from top node
  486. * if DPCM-BE case
  487. */
  488. if (!is_cpu && gtype == GRAPH_DPCM) {
  489. struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, idx);
  490. struct snd_soc_codec_conf *cconf = simple_props_to_codec_conf(dai_props, idx);
  491. struct device_node *rport = of_get_parent(ep);
  492. struct device_node *rports = of_get_parent(rport);
  493. if (of_node_name_eq(rports, "ports"))
  494. snd_soc_of_parse_node_prefix(rports, cconf, codecs->of_node, "prefix");
  495. snd_soc_of_parse_node_prefix(rport, cconf, codecs->of_node, "prefix");
  496. of_node_put(rport);
  497. of_node_put(rports);
  498. }
  499. if (is_cpu) {
  500. struct snd_soc_dai_link_component *cpus = dlc;
  501. struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, idx);
  502. asoc_simple_canonicalize_cpu(cpus, is_single_links);
  503. asoc_simple_canonicalize_platform(platforms, cpus);
  504. }
  505. return 0;
  506. }
  507. static int graph_parse_node(struct asoc_simple_priv *priv,
  508. enum graph_type gtype,
  509. struct device_node *port,
  510. struct link_info *li, int is_cpu)
  511. {
  512. struct device_node *ep;
  513. int ret = 0;
  514. if (graph_lnk_is_multi(port)) {
  515. int idx;
  516. of_node_get(port);
  517. for (idx = 0;; idx++) {
  518. ep = graph_get_next_multi_ep(&port);
  519. if (!ep)
  520. break;
  521. ret = __graph_parse_node(priv, gtype, ep,
  522. li, is_cpu, idx);
  523. of_node_put(ep);
  524. if (ret < 0)
  525. break;
  526. }
  527. } else {
  528. /* Single CPU / Codec */
  529. ep = port_to_endpoint(port);
  530. ret = __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
  531. of_node_put(ep);
  532. }
  533. return ret;
  534. }
  535. static void graph_parse_daifmt(struct device_node *node,
  536. unsigned int *daifmt, unsigned int *bit_frame)
  537. {
  538. unsigned int fmt;
  539. /*
  540. * see also above "daifmt" explanation
  541. * and samples.
  542. */
  543. /*
  544. * ports {
  545. * (A)
  546. * port {
  547. * (B)
  548. * endpoint {
  549. * (C)
  550. * };
  551. * };
  552. * };
  553. * };
  554. */
  555. /*
  556. * clock_provider:
  557. *
  558. * It can be judged it is provider
  559. * if (A) or (B) or (C) has bitclock-master / frame-master flag.
  560. *
  561. * use "or"
  562. */
  563. *bit_frame |= snd_soc_daifmt_parse_clock_provider_as_bitmap(node, NULL);
  564. #define update_daifmt(name) \
  565. if (!(*daifmt & SND_SOC_DAIFMT_##name##_MASK) && \
  566. (fmt & SND_SOC_DAIFMT_##name##_MASK)) \
  567. *daifmt |= fmt & SND_SOC_DAIFMT_##name##_MASK
  568. /*
  569. * format
  570. *
  571. * This function is called by (C) -> (B) -> (A) order.
  572. * Set if applicable part was not yet set.
  573. */
  574. fmt = snd_soc_daifmt_parse_format(node, NULL);
  575. update_daifmt(FORMAT);
  576. update_daifmt(CLOCK);
  577. update_daifmt(INV);
  578. }
  579. static void graph_link_init(struct asoc_simple_priv *priv,
  580. struct device_node *port,
  581. struct link_info *li,
  582. int is_cpu_node)
  583. {
  584. struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
  585. struct device_node *ep;
  586. struct device_node *ports;
  587. unsigned int daifmt = 0, daiclk = 0;
  588. unsigned int bit_frame = 0;
  589. if (graph_lnk_is_multi(port)) {
  590. of_node_get(port);
  591. ep = graph_get_next_multi_ep(&port);
  592. port = of_get_parent(ep);
  593. } else {
  594. ep = port_to_endpoint(port);
  595. }
  596. ports = of_get_parent(port);
  597. /*
  598. * ports {
  599. * (A)
  600. * port {
  601. * (B)
  602. * endpoint {
  603. * (C)
  604. * };
  605. * };
  606. * };
  607. * };
  608. */
  609. graph_parse_daifmt(ep, &daifmt, &bit_frame); /* (C) */
  610. graph_parse_daifmt(port, &daifmt, &bit_frame); /* (B) */
  611. if (of_node_name_eq(ports, "ports"))
  612. graph_parse_daifmt(ports, &daifmt, &bit_frame); /* (A) */
  613. /*
  614. * convert bit_frame
  615. * We need to flip clock_provider if it was CPU node,
  616. * because it is Codec base.
  617. */
  618. daiclk = snd_soc_daifmt_clock_provider_from_bitmap(bit_frame);
  619. if (is_cpu_node)
  620. daiclk = snd_soc_daifmt_clock_provider_flipped(daiclk);
  621. dai_link->dai_fmt = daifmt | daiclk;
  622. dai_link->init = asoc_simple_dai_init;
  623. dai_link->ops = &graph_ops;
  624. if (priv->ops)
  625. dai_link->ops = priv->ops;
  626. }
  627. int audio_graph2_link_normal(struct asoc_simple_priv *priv,
  628. struct device_node *lnk,
  629. struct link_info *li)
  630. {
  631. struct device_node *cpu_port = lnk;
  632. struct device_node *cpu_ep = port_to_endpoint(cpu_port);
  633. struct device_node *codec_port = of_graph_get_remote_port(cpu_ep);
  634. int ret;
  635. /*
  636. * call Codec first.
  637. * see
  638. * __graph_parse_node() :: DAI Naming
  639. */
  640. ret = graph_parse_node(priv, GRAPH_NORMAL, codec_port, li, 0);
  641. if (ret < 0)
  642. goto err;
  643. /*
  644. * call CPU, and set DAI Name
  645. */
  646. ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_port, li, 1);
  647. if (ret < 0)
  648. goto err;
  649. graph_link_init(priv, cpu_port, li, 1);
  650. err:
  651. of_node_put(codec_port);
  652. of_node_put(cpu_ep);
  653. return ret;
  654. }
  655. EXPORT_SYMBOL_GPL(audio_graph2_link_normal);
  656. int audio_graph2_link_dpcm(struct asoc_simple_priv *priv,
  657. struct device_node *lnk,
  658. struct link_info *li)
  659. {
  660. struct device_node *ep = port_to_endpoint(lnk);
  661. struct device_node *rep = of_graph_get_remote_endpoint(ep);
  662. struct device_node *rport = of_graph_get_remote_port(ep);
  663. struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
  664. struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
  665. int is_cpu = asoc_graph_is_ports0(lnk);
  666. int ret;
  667. if (is_cpu) {
  668. /*
  669. * dpcm {
  670. * // Front-End
  671. * ports@0 {
  672. * => lnk: port@0 { ep: { ... = rep }; };
  673. * ...
  674. * };
  675. * // Back-End
  676. * ports@0 {
  677. * ...
  678. * };
  679. * };
  680. *
  681. * CPU {
  682. * rports: ports {
  683. * rport: port@0 { rep: { ... = ep } };
  684. * }
  685. * }
  686. */
  687. /*
  688. * setup CPU here, Codec is already set as dummy.
  689. * see
  690. * asoc_simple_init_priv()
  691. */
  692. dai_link->dynamic = 1;
  693. dai_link->dpcm_merged_format = 1;
  694. ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 1);
  695. if (ret)
  696. goto err;
  697. } else {
  698. /*
  699. * dpcm {
  700. * // Front-End
  701. * ports@0 {
  702. * ...
  703. * };
  704. * // Back-End
  705. * ports@0 {
  706. * => lnk: port@0 { ep: { ... = rep; }; };
  707. * ...
  708. * };
  709. * };
  710. *
  711. * Codec {
  712. * rports: ports {
  713. * rport: port@0 { rep: { ... = ep; }; };
  714. * }
  715. * }
  716. */
  717. /*
  718. * setup Codec here, CPU is already set as dummy.
  719. * see
  720. * asoc_simple_init_priv()
  721. */
  722. /* BE settings */
  723. dai_link->no_pcm = 1;
  724. dai_link->be_hw_params_fixup = asoc_simple_be_hw_params_fixup;
  725. ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 0);
  726. if (ret < 0)
  727. goto err;
  728. }
  729. graph_parse_convert(rep, dai_props);
  730. snd_soc_dai_link_set_capabilities(dai_link);
  731. graph_link_init(priv, rport, li, is_cpu);
  732. err:
  733. of_node_put(ep);
  734. of_node_put(rep);
  735. of_node_put(rport);
  736. return ret;
  737. }
  738. EXPORT_SYMBOL_GPL(audio_graph2_link_dpcm);
  739. int audio_graph2_link_c2c(struct asoc_simple_priv *priv,
  740. struct device_node *lnk,
  741. struct link_info *li)
  742. {
  743. struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
  744. struct device_node *port0, *port1, *ports;
  745. struct device_node *codec0_port, *codec1_port;
  746. struct device_node *ep0, *ep1;
  747. u32 val = 0;
  748. int ret = -EINVAL;
  749. /*
  750. * codec2codec {
  751. * ports {
  752. * rate = <48000>;
  753. * => lnk: port@0 { c2c0_ep: { ... = codec0_ep; }; };
  754. * port@1 { c2c1_ep: { ... = codec1_ep; }; };
  755. * };
  756. * };
  757. *
  758. * Codec {
  759. * ports {
  760. * port@0 { codec0_ep: ... }; };
  761. * port@1 { codec1_ep: ... }; };
  762. * };
  763. * };
  764. */
  765. of_node_get(lnk);
  766. port0 = lnk;
  767. ports = of_get_parent(port0);
  768. port1 = of_get_next_child(ports, lnk);
  769. /*
  770. * Card2 can use original Codec2Codec settings if DT has.
  771. * It will use default settings if no settings on DT.
  772. * see
  773. * asoc_simple_init_for_codec2codec()
  774. *
  775. * Add more settings here if needed
  776. */
  777. of_property_read_u32(ports, "rate", &val);
  778. if (val) {
  779. struct device *dev = simple_priv_to_dev(priv);
  780. struct snd_soc_pcm_stream *c2c_conf;
  781. c2c_conf = devm_kzalloc(dev, sizeof(*c2c_conf), GFP_KERNEL);
  782. if (!c2c_conf)
  783. goto err1;
  784. c2c_conf->formats = SNDRV_PCM_FMTBIT_S32_LE; /* update ME */
  785. c2c_conf->rates = SNDRV_PCM_RATE_8000_384000;
  786. c2c_conf->rate_min =
  787. c2c_conf->rate_max = val;
  788. c2c_conf->channels_min =
  789. c2c_conf->channels_max = 2; /* update ME */
  790. dai_link->params = c2c_conf;
  791. dai_link->num_params = 1;
  792. }
  793. ep0 = port_to_endpoint(port0);
  794. ep1 = port_to_endpoint(port1);
  795. codec0_port = of_graph_get_remote_port(ep0);
  796. codec1_port = of_graph_get_remote_port(ep1);
  797. /*
  798. * call Codec first.
  799. * see
  800. * __graph_parse_node() :: DAI Naming
  801. */
  802. ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0);
  803. if (ret < 0)
  804. goto err2;
  805. /*
  806. * call CPU, and set DAI Name
  807. */
  808. ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1);
  809. if (ret < 0)
  810. goto err2;
  811. graph_link_init(priv, codec0_port, li, 1);
  812. err2:
  813. of_node_put(ep0);
  814. of_node_put(ep1);
  815. of_node_put(codec0_port);
  816. of_node_put(codec1_port);
  817. err1:
  818. of_node_put(ports);
  819. of_node_put(port0);
  820. of_node_put(port1);
  821. return ret;
  822. }
  823. EXPORT_SYMBOL_GPL(audio_graph2_link_c2c);
  824. static int graph_link(struct asoc_simple_priv *priv,
  825. struct graph2_custom_hooks *hooks,
  826. enum graph_type gtype,
  827. struct device_node *lnk,
  828. struct link_info *li)
  829. {
  830. struct device *dev = simple_priv_to_dev(priv);
  831. GRAPH2_CUSTOM func = NULL;
  832. int ret = -EINVAL;
  833. switch (gtype) {
  834. case GRAPH_NORMAL:
  835. if (hooks && hooks->custom_normal)
  836. func = hooks->custom_normal;
  837. else
  838. func = audio_graph2_link_normal;
  839. break;
  840. case GRAPH_DPCM:
  841. if (hooks && hooks->custom_dpcm)
  842. func = hooks->custom_dpcm;
  843. else
  844. func = audio_graph2_link_dpcm;
  845. break;
  846. case GRAPH_C2C:
  847. if (hooks && hooks->custom_c2c)
  848. func = hooks->custom_c2c;
  849. else
  850. func = audio_graph2_link_c2c;
  851. break;
  852. default:
  853. break;
  854. }
  855. if (!func) {
  856. dev_err(dev, "non supported gtype (%d)\n", gtype);
  857. goto err;
  858. }
  859. ret = func(priv, lnk, li);
  860. if (ret < 0)
  861. goto err;
  862. li->link++;
  863. err:
  864. return ret;
  865. }
  866. static int graph_counter(struct device_node *lnk)
  867. {
  868. /*
  869. * Multi CPU / Codec
  870. *
  871. * multi {
  872. * ports {
  873. * => lnk: port@0 { ... };
  874. * port@1 { ... };
  875. * port@2 { ... };
  876. * ...
  877. * };
  878. * };
  879. *
  880. * ignore first lnk part
  881. */
  882. if (graph_lnk_is_multi(lnk))
  883. return of_graph_get_endpoint_count(of_get_parent(lnk)) - 1;
  884. /*
  885. * Single CPU / Codec
  886. */
  887. else
  888. return 1;
  889. }
  890. static int graph_count_normal(struct asoc_simple_priv *priv,
  891. struct device_node *lnk,
  892. struct link_info *li)
  893. {
  894. struct device_node *cpu_port = lnk;
  895. struct device_node *cpu_ep = port_to_endpoint(cpu_port);
  896. struct device_node *codec_port = of_graph_get_remote_port(cpu_ep);
  897. /*
  898. * CPU {
  899. * => lnk: port { endpoint { .. }; };
  900. * };
  901. */
  902. li->num[li->link].cpus =
  903. li->num[li->link].platforms = graph_counter(cpu_port);
  904. li->num[li->link].codecs = graph_counter(codec_port);
  905. of_node_put(cpu_ep);
  906. of_node_put(codec_port);
  907. return 0;
  908. }
  909. static int graph_count_dpcm(struct asoc_simple_priv *priv,
  910. struct device_node *lnk,
  911. struct link_info *li)
  912. {
  913. struct device_node *ep = port_to_endpoint(lnk);
  914. struct device_node *rport = of_graph_get_remote_port(ep);
  915. /*
  916. * dpcm {
  917. * // Front-End
  918. * ports@0 {
  919. * => lnk: port@0 { endpoint { ... }; };
  920. * ...
  921. * };
  922. * // Back-End
  923. * ports@1 {
  924. * => lnk: port@0 { endpoint { ... }; };
  925. * ...
  926. * };
  927. * };
  928. */
  929. if (asoc_graph_is_ports0(lnk)) {
  930. li->num[li->link].cpus = graph_counter(rport); /* FE */
  931. li->num[li->link].platforms = graph_counter(rport);
  932. } else {
  933. li->num[li->link].codecs = graph_counter(rport); /* BE */
  934. }
  935. of_node_put(ep);
  936. of_node_put(rport);
  937. return 0;
  938. }
  939. static int graph_count_c2c(struct asoc_simple_priv *priv,
  940. struct device_node *lnk,
  941. struct link_info *li)
  942. {
  943. struct device_node *ports = of_get_parent(lnk);
  944. struct device_node *port0 = lnk;
  945. struct device_node *port1 = of_get_next_child(ports, lnk);
  946. struct device_node *ep0 = port_to_endpoint(port0);
  947. struct device_node *ep1 = port_to_endpoint(port1);
  948. struct device_node *codec0 = of_graph_get_remote_port(ep0);
  949. struct device_node *codec1 = of_graph_get_remote_port(ep1);
  950. of_node_get(lnk);
  951. /*
  952. * codec2codec {
  953. * ports {
  954. * => lnk: port@0 { endpoint { ... }; };
  955. * port@1 { endpoint { ... }; };
  956. * };
  957. * };
  958. */
  959. li->num[li->link].cpus =
  960. li->num[li->link].platforms = graph_counter(codec0);
  961. li->num[li->link].codecs = graph_counter(codec1);
  962. of_node_put(ports);
  963. of_node_put(port1);
  964. of_node_put(ep0);
  965. of_node_put(ep1);
  966. of_node_put(codec0);
  967. of_node_put(codec1);
  968. return 0;
  969. }
  970. static int graph_count(struct asoc_simple_priv *priv,
  971. struct graph2_custom_hooks *hooks,
  972. enum graph_type gtype,
  973. struct device_node *lnk,
  974. struct link_info *li)
  975. {
  976. struct device *dev = simple_priv_to_dev(priv);
  977. GRAPH2_CUSTOM func = NULL;
  978. int ret = -EINVAL;
  979. if (li->link >= SNDRV_MAX_LINKS) {
  980. dev_err(dev, "too many links\n");
  981. return ret;
  982. }
  983. switch (gtype) {
  984. case GRAPH_NORMAL:
  985. func = graph_count_normal;
  986. break;
  987. case GRAPH_DPCM:
  988. func = graph_count_dpcm;
  989. break;
  990. case GRAPH_C2C:
  991. func = graph_count_c2c;
  992. break;
  993. default:
  994. break;
  995. }
  996. if (!func) {
  997. dev_err(dev, "non supported gtype (%d)\n", gtype);
  998. goto err;
  999. }
  1000. ret = func(priv, lnk, li);
  1001. if (ret < 0)
  1002. goto err;
  1003. li->link++;
  1004. err:
  1005. return ret;
  1006. }
  1007. static int graph_for_each_link(struct asoc_simple_priv *priv,
  1008. struct graph2_custom_hooks *hooks,
  1009. struct link_info *li,
  1010. int (*func)(struct asoc_simple_priv *priv,
  1011. struct graph2_custom_hooks *hooks,
  1012. enum graph_type gtype,
  1013. struct device_node *lnk,
  1014. struct link_info *li))
  1015. {
  1016. struct of_phandle_iterator it;
  1017. struct device *dev = simple_priv_to_dev(priv);
  1018. struct device_node *node = dev->of_node;
  1019. struct device_node *lnk;
  1020. enum graph_type gtype;
  1021. int rc, ret;
  1022. /* loop for all listed CPU port */
  1023. of_for_each_phandle(&it, rc, node, "links", NULL, 0) {
  1024. lnk = it.node;
  1025. gtype = graph_get_type(priv, lnk);
  1026. ret = func(priv, hooks, gtype, lnk, li);
  1027. if (ret < 0)
  1028. return ret;
  1029. }
  1030. return 0;
  1031. }
  1032. int audio_graph2_parse_of(struct asoc_simple_priv *priv, struct device *dev,
  1033. struct graph2_custom_hooks *hooks)
  1034. {
  1035. struct snd_soc_card *card = simple_priv_to_card(priv);
  1036. struct link_info *li;
  1037. int ret;
  1038. li = devm_kzalloc(dev, sizeof(*li), GFP_KERNEL);
  1039. if (!li)
  1040. return -ENOMEM;
  1041. card->probe = asoc_graph_card_probe;
  1042. card->owner = THIS_MODULE;
  1043. card->dev = dev;
  1044. if ((hooks) && (hooks)->hook_pre) {
  1045. ret = (hooks)->hook_pre(priv);
  1046. if (ret < 0)
  1047. goto err;
  1048. }
  1049. ret = graph_for_each_link(priv, hooks, li, graph_count);
  1050. if (!li->link)
  1051. ret = -EINVAL;
  1052. if (ret < 0)
  1053. goto err;
  1054. ret = asoc_simple_init_priv(priv, li);
  1055. if (ret < 0)
  1056. goto err;
  1057. priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
  1058. if (IS_ERR(priv->pa_gpio)) {
  1059. ret = PTR_ERR(priv->pa_gpio);
  1060. dev_err(dev, "failed to get amplifier gpio: %d\n", ret);
  1061. goto err;
  1062. }
  1063. ret = asoc_simple_parse_widgets(card, NULL);
  1064. if (ret < 0)
  1065. goto err;
  1066. ret = asoc_simple_parse_routing(card, NULL);
  1067. if (ret < 0)
  1068. goto err;
  1069. memset(li, 0, sizeof(*li));
  1070. ret = graph_for_each_link(priv, hooks, li, graph_link);
  1071. if (ret < 0)
  1072. goto err;
  1073. ret = asoc_simple_parse_card_name(card, NULL);
  1074. if (ret < 0)
  1075. goto err;
  1076. snd_soc_card_set_drvdata(card, priv);
  1077. if ((hooks) && (hooks)->hook_post) {
  1078. ret = (hooks)->hook_post(priv);
  1079. if (ret < 0)
  1080. goto err;
  1081. }
  1082. asoc_simple_debug_info(priv);
  1083. ret = devm_snd_soc_register_card(dev, card);
  1084. err:
  1085. devm_kfree(dev, li);
  1086. if (ret < 0)
  1087. dev_err_probe(dev, ret, "parse error\n");
  1088. if (ret == 0)
  1089. dev_warn(dev, "Audio Graph Card2 is still under Experimental stage\n");
  1090. return ret;
  1091. }
  1092. EXPORT_SYMBOL_GPL(audio_graph2_parse_of);
  1093. static int graph_probe(struct platform_device *pdev)
  1094. {
  1095. struct asoc_simple_priv *priv;
  1096. struct device *dev = &pdev->dev;
  1097. /* Allocate the private data and the DAI link array */
  1098. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  1099. if (!priv)
  1100. return -ENOMEM;
  1101. return audio_graph2_parse_of(priv, dev, NULL);
  1102. }
  1103. static const struct of_device_id graph_of_match[] = {
  1104. { .compatible = "audio-graph-card2", },
  1105. {},
  1106. };
  1107. MODULE_DEVICE_TABLE(of, graph_of_match);
  1108. static struct platform_driver graph_card = {
  1109. .driver = {
  1110. .name = "asoc-audio-graph-card2",
  1111. .pm = &snd_soc_pm_ops,
  1112. .of_match_table = graph_of_match,
  1113. },
  1114. .probe = graph_probe,
  1115. .remove = asoc_simple_remove,
  1116. };
  1117. module_platform_driver(graph_card);
  1118. MODULE_ALIAS("platform:asoc-audio-graph-card2");
  1119. MODULE_LICENSE("GPL v2");
  1120. MODULE_DESCRIPTION("ASoC Audio Graph Card2");
  1121. MODULE_AUTHOR("Kuninori Morimoto <[email protected]>");