static int asoc_simple_card_get_dai_id(struct device_node *ep) { struct device_node *node; struct device_node *endpoint; int i, id; int ret; ret = snd_soc_get_dai_id(ep); if (ret != -ENOTSUPP) return ret; node = of_graph_get_port_parent(ep); /* * Non HDMI sound case, counting port/endpoint on its DT * is enough. Let's count it. */ i = 0; id = -1; for_each_endpoint_of_node(node, endpoint) { if (endpoint == ep) id = i; i++; } of_node_put(node); if (id < 0) return -ENODEV; return id; }
int asoc_simple_card_parse_graph_dai(struct device_node *ep, struct device_node **dai_of_node, const char **dai_name) { struct device_node *node; struct of_phandle_args args; int ret; if (!ep) return 0; if (!dai_name) return 0; node = of_graph_get_port_parent(ep); /* Get dai->name */ args.np = node; args.args[0] = asoc_simple_card_get_dai_id(ep); args.args_count = (of_graph_get_endpoint_count(node) > 1); ret = snd_soc_get_dai_name(&args, dai_name); if (ret < 0) return ret; *dai_of_node = node; return 0; }
static struct device_node *of_coresight_get_port_parent(struct device_node *ep) { struct device_node *parent = of_graph_get_port_parent(ep); /* * Skip one-level up to the real device node, if we * are using the new bindings. */ if (of_node_name_eq(parent, "in-ports") || of_node_name_eq(parent, "out-ports")) parent = of_get_next_parent(parent); return parent; }