Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: rsnd: add multi Component support

Merge series from Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>:

These are part of "ASoC: add multi Component support" patch-set.
The patch-set supports below case as "2 Cards".

+-- basic board --------+
|+--------+ |
|| CPU ch0| <--> CodecA |
|| ch1| <-+ |
|+--------+ | |
+-------------|---------+
+-- expansion board ----+
| | |
| +-> CodecB|
+-----------------------+

Renesas sound driver and its Doc part were held for observation.
Rob mentioned that "definitions" vs "$defs". But I got error on "$defs",
no error on "definitions". I believe this change is not mandatory.

He also mentioned that "reg" is missing, but I also believe that "reg"
is automatically handled somehow/somewhere (I'm not sure detail, but other
reviewer indicated it before).

He also mentioned that "ports" and "port", but added new "ports" needs
special handling. Using "ports" vs "port" are different, not
compatible on this driver. This means we need both on Doc.

Thus, there is no update for these.

+133 -75
+31 -29
Documentation/devicetree/bindings/sound/renesas,rsnd.yaml
··· 9 9 maintainers: 10 10 - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 11 11 12 + definitions: 13 + port-def: 14 + $ref: audio-graph-port.yaml#/definitions/port-base 15 + unevaluatedProperties: false 16 + patternProperties: 17 + "^endpoint(@[0-9a-f]+)?": 18 + $ref: audio-graph-port.yaml#/definitions/endpoint-base 19 + properties: 20 + playback: 21 + $ref: /schemas/types.yaml#/definitions/phandle-array 22 + capture: 23 + $ref: /schemas/types.yaml#/definitions/phandle-array 24 + unevaluatedProperties: false 25 + 12 26 properties: 13 27 14 28 compatible: ··· 91 77 it must be 1 if your system has audio_clkout0/1/2/3 92 78 enum: [0, 1] 93 79 80 + "#address-cells": 81 + const: 1 82 + 83 + "#size-cells": 84 + const: 0 85 + 94 86 clock-frequency: 95 87 description: for audio_clkout0/1/2/3 96 88 ··· 123 103 description: List of necessary clock names. 124 104 # details are defined below 125 105 126 - ports: 127 - $ref: audio-graph-port.yaml#/definitions/port-base 128 - unevaluatedProperties: false 129 - patternProperties: 130 - '^port(@[0-9a-f]+)?$': 131 - $ref: audio-graph-port.yaml#/definitions/port-base 132 - unevaluatedProperties: false 133 - patternProperties: 134 - "^endpoint(@[0-9a-f]+)?": 135 - $ref: audio-graph-port.yaml#/definitions/endpoint-base 136 - properties: 137 - playback: 138 - $ref: /schemas/types.yaml#/definitions/phandle-array 139 - capture: 140 - $ref: /schemas/types.yaml#/definitions/phandle-array 141 - unevaluatedProperties: false 142 - 106 + # ports is below 143 107 port: 144 - $ref: audio-graph-port.yaml#/definitions/port-base 145 - unevaluatedProperties: false 146 - patternProperties: 147 - "^endpoint(@[0-9a-f]+)?": 148 - $ref: audio-graph-port.yaml#/definitions/endpoint-base 149 - properties: 150 - playback: 151 - $ref: /schemas/types.yaml#/definitions/phandle-array 152 - capture: 153 - $ref: /schemas/types.yaml#/definitions/phandle-array 154 - unevaluatedProperties: false 108 + $ref: "#/definitions/port-def" 155 109 156 110 rcar_sound,dvc: 157 111 description: DVC subnode. ··· 242 248 - interrupts 243 249 additionalProperties: false 244 250 251 + patternProperties: 245 252 # For DAI base 246 - rcar_sound,dai: 253 + 'rcar_sound,dai(@[0-9a-f]+)?$': 247 254 description: DAI subnode. 248 255 type: object 249 256 patternProperties: ··· 263 268 - required: 264 269 - capture 265 270 additionalProperties: false 271 + 272 + 'ports(@[0-9a-f]+)?$': 273 + $ref: audio-graph-port.yaml#/definitions/port-base 274 + unevaluatedProperties: false 275 + patternProperties: 276 + '^port(@[0-9a-f]+)?$': 277 + $ref: "#/definitions/port-def" 266 278 267 279 required: 268 280 - compatible
+98 -46
sound/soc/sh/rcar/core.c
··· 1260 1260 return i; 1261 1261 } 1262 1262 1263 - static struct device_node *rsnd_dai_of_node(struct rsnd_priv *priv, 1264 - int *is_graph) 1263 + static int rsnd_dai_of_node(struct rsnd_priv *priv, int *is_graph) 1265 1264 { 1266 1265 struct device *dev = rsnd_priv_to_dev(priv); 1267 1266 struct device_node *np = dev->of_node; 1268 - struct device_node *dai_node; 1269 - struct device_node *ret; 1267 + struct device_node *ports, *node; 1268 + int nr = 0; 1269 + int i = 0; 1270 1270 1271 1271 *is_graph = 0; 1272 1272 ··· 1274 1274 * parse both previous dai (= rcar_sound,dai), and 1275 1275 * graph dai (= ports/port) 1276 1276 */ 1277 - dai_node = of_get_child_by_name(np, RSND_NODE_DAI); 1278 - if (dai_node) { 1279 - ret = dai_node; 1280 - goto of_node_compatible; 1277 + 1278 + /* 1279 + * Simple-Card 1280 + */ 1281 + node = of_get_child_by_name(np, RSND_NODE_DAI); 1282 + if (!node) 1283 + goto audio_graph; 1284 + 1285 + of_node_put(node); 1286 + 1287 + for_each_child_of_node(np, node) { 1288 + if (!of_node_name_eq(node, RSND_NODE_DAI)) 1289 + continue; 1290 + 1291 + priv->component_dais[i] = of_get_child_count(node); 1292 + nr += priv->component_dais[i]; 1293 + i++; 1294 + if (i >= RSND_MAX_COMPONENT) { 1295 + dev_info(dev, "reach to max component\n"); 1296 + break; 1297 + } 1281 1298 } 1282 1299 1283 - ret = np; 1300 + return nr; 1284 1301 1285 - dai_node = of_graph_get_next_endpoint(np, NULL); 1286 - if (dai_node) 1287 - goto of_node_graph; 1302 + audio_graph: 1303 + /* 1304 + * Audio-Graph-Card 1305 + */ 1306 + for_each_child_of_node(np, ports) { 1307 + if (!of_node_name_eq(ports, "ports") && 1308 + !of_node_name_eq(ports, "port")) 1309 + continue; 1310 + priv->component_dais[i] = of_graph_get_endpoint_count(ports); 1311 + nr += priv->component_dais[i]; 1312 + i++; 1313 + if (i >= RSND_MAX_COMPONENT) { 1314 + dev_info(dev, "reach to max component\n"); 1315 + break; 1316 + } 1317 + } 1288 1318 1289 - return NULL; 1290 - 1291 - of_node_graph: 1292 1319 *is_graph = 1; 1293 - of_node_compatible: 1294 - of_node_put(dai_node); 1295 1320 1296 - return ret; 1321 + return nr; 1297 1322 } 1298 1323 1299 1324 ··· 1382 1357 1383 1358 static void __rsnd_dai_probe(struct rsnd_priv *priv, 1384 1359 struct device_node *dai_np, 1360 + struct device_node *node_np, 1361 + uint32_t node_arg, 1385 1362 int dai_i) 1386 1363 { 1387 1364 struct rsnd_dai_stream *io_playback; ··· 1401 1374 1402 1375 snprintf(rdai->name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", dai_i); 1403 1376 1377 + /* for multi Component */ 1378 + rdai->dai_args.np = node_np; 1379 + rdai->dai_args.args_count = 1; 1380 + rdai->dai_args.args[0] = node_arg; 1381 + 1404 1382 rdai->priv = priv; 1405 1383 drv->name = rdai->name; 1406 1384 drv->ops = &rsnd_soc_dai_ops; 1407 1385 drv->pcm_new = rsnd_pcm_new; 1386 + drv->id = dai_i; 1387 + drv->dai_args = &rdai->dai_args; 1408 1388 1409 1389 io_playback->rdai = rdai; 1410 1390 io_capture->rdai = rdai; ··· 1475 1441 1476 1442 static int rsnd_dai_probe(struct rsnd_priv *priv) 1477 1443 { 1478 - struct device_node *dai_node; 1479 - struct device_node *dai_np; 1480 1444 struct snd_soc_dai_driver *rdrv; 1481 1445 struct device *dev = rsnd_priv_to_dev(priv); 1446 + struct device_node *np = dev->of_node; 1482 1447 struct rsnd_dai *rdai; 1483 - int nr; 1448 + int nr = 0; 1484 1449 int is_graph; 1485 1450 int dai_i; 1486 1451 1487 - dai_node = rsnd_dai_of_node(priv, &is_graph); 1488 - if (is_graph) 1489 - nr = of_graph_get_endpoint_count(dai_node); 1490 - else 1491 - nr = of_get_child_count(dai_node); 1492 - 1452 + nr = rsnd_dai_of_node(priv, &is_graph); 1493 1453 if (!nr) 1494 1454 return -EINVAL; 1495 1455 ··· 1501 1473 */ 1502 1474 dai_i = 0; 1503 1475 if (is_graph) { 1504 - for_each_endpoint_of_node(dai_node, dai_np) { 1505 - __rsnd_dai_probe(priv, dai_np, dai_i); 1506 - if (rsnd_is_gen3(priv) || rsnd_is_gen4(priv)) { 1507 - rdai = rsnd_rdai_get(priv, dai_i); 1476 + struct device_node *ports; 1477 + struct device_node *dai_np; 1508 1478 1509 - rsnd_parse_connect_graph(priv, &rdai->playback, dai_np); 1510 - rsnd_parse_connect_graph(priv, &rdai->capture, dai_np); 1479 + for_each_child_of_node(np, ports) { 1480 + if (!of_node_name_eq(ports, "ports") && 1481 + !of_node_name_eq(ports, "port")) 1482 + continue; 1483 + for_each_endpoint_of_node(ports, dai_np) { 1484 + __rsnd_dai_probe(priv, dai_np, dai_np, 0, dai_i); 1485 + if (rsnd_is_gen3(priv) || rsnd_is_gen4(priv)) { 1486 + rdai = rsnd_rdai_get(priv, dai_i); 1487 + 1488 + rsnd_parse_connect_graph(priv, &rdai->playback, dai_np); 1489 + rsnd_parse_connect_graph(priv, &rdai->capture, dai_np); 1490 + } 1491 + dai_i++; 1511 1492 } 1512 - dai_i++; 1513 1493 } 1514 1494 } else { 1515 - for_each_child_of_node(dai_node, dai_np) { 1516 - __rsnd_dai_probe(priv, dai_np, dai_i); 1517 - if (rsnd_is_gen3(priv) || rsnd_is_gen4(priv)) { 1518 - rdai = rsnd_rdai_get(priv, dai_i); 1495 + struct device_node *node; 1496 + struct device_node *dai_np; 1519 1497 1520 - rsnd_parse_connect_simple(priv, &rdai->playback, dai_np); 1521 - rsnd_parse_connect_simple(priv, &rdai->capture, dai_np); 1498 + for_each_child_of_node(np, node) { 1499 + if (!of_node_name_eq(node, RSND_NODE_DAI)) 1500 + continue; 1501 + 1502 + for_each_child_of_node(node, dai_np) { 1503 + __rsnd_dai_probe(priv, dai_np, np, dai_i, dai_i); 1504 + if (rsnd_is_gen3(priv) || rsnd_is_gen4(priv)) { 1505 + rdai = rsnd_rdai_get(priv, dai_i); 1506 + 1507 + rsnd_parse_connect_simple(priv, &rdai->playback, dai_np); 1508 + rsnd_parse_connect_simple(priv, &rdai->capture, dai_np); 1509 + } 1510 + dai_i++; 1522 1511 } 1523 - dai_i++; 1524 1512 } 1525 1513 } 1526 1514 ··· 1966 1922 rsnd_dai_probe, 1967 1923 }; 1968 1924 int ret, i; 1925 + int ci; 1969 1926 1970 1927 /* 1971 1928 * init priv data ··· 2003 1958 /* 2004 1959 * asoc register 2005 1960 */ 2006 - ret = devm_snd_soc_register_component(dev, &rsnd_soc_component, 2007 - priv->daidrv, rsnd_rdai_nr(priv)); 2008 - if (ret < 0) { 2009 - dev_err(dev, "cannot snd dai register\n"); 2010 - goto exit_snd_probe; 1961 + ci = 0; 1962 + for (i = 0; priv->component_dais[i] > 0; i++) { 1963 + int nr = priv->component_dais[i]; 1964 + 1965 + ret = devm_snd_soc_register_component(dev, &rsnd_soc_component, 1966 + priv->daidrv + ci, nr); 1967 + if (ret < 0) { 1968 + dev_err(dev, "cannot snd component register\n"); 1969 + goto exit_snd_probe; 1970 + } 1971 + 1972 + ci += nr; 2011 1973 } 2012 1974 2013 1975 pm_runtime_enable(dev);
+4
sound/soc/sh/rcar/rsnd.h
··· 545 545 struct rsnd_dai_stream capture; 546 546 struct rsnd_priv *priv; 547 547 struct snd_pcm_hw_constraint_list constraint; 548 + struct of_phandle_args dai_args; 548 549 549 550 int max_channels; /* 2ch - 16ch */ 550 551 int ssi_lane; /* 1lane - 4lane */ ··· 703 702 struct snd_soc_dai_driver *daidrv; 704 703 struct rsnd_dai *rdai; 705 704 int rdai_nr; 705 + 706 + #define RSND_MAX_COMPONENT 3 707 + int component_dais[RSND_MAX_COMPONENT]; 706 708 }; 707 709 708 710 #define rsnd_priv_to_pdev(priv) ((priv)->pdev)