static int sun8i_mixer_of_get_id(struct device_node *node) { struct device_node *port, *ep; int ret = -EINVAL; /* output is port 1 */ port = of_graph_get_port_by_id(node, 1); if (!port) return -EINVAL; /* try to find downstream endpoint */ for_each_available_child_of_node(port, ep) { struct device_node *remote; u32 reg; remote = of_graph_get_remote_endpoint(ep); if (!remote) continue; ret = of_property_read_u32(remote, "reg", ®); if (!ret) { of_node_put(remote); of_node_put(ep); of_node_put(port); return reg; } of_node_put(remote); } of_node_put(port); return ret; }
/* * of_coresight_parse_endpoint : Parse the given output endpoint @ep * and fill the connection information in @conn * * Parses the local port, remote device name and the remote port. * * Returns : * 1 - If the parsing is successful and a connection record * was created for an output connection. * 0 - If the parsing completed without any fatal errors. * -Errno - Fatal error, abort the scanning. */ static int of_coresight_parse_endpoint(struct device *dev, struct device_node *ep, struct coresight_connection *conn) { int ret = 0; struct of_endpoint endpoint, rendpoint; struct device_node *rparent = NULL; struct device_node *rep = NULL; struct device *rdev = NULL; do { /* Parse the local port details */ if (of_graph_parse_endpoint(ep, &endpoint)) break; /* * Get a handle on the remote endpoint and the device it is * attached to. */ rep = of_graph_get_remote_endpoint(ep); if (!rep) break; rparent = of_coresight_get_port_parent(rep); if (!rparent) break; if (of_graph_parse_endpoint(rep, &rendpoint)) break; /* If the remote device is not available, defer probing */ rdev = of_coresight_get_endpoint_device(rparent); if (!rdev) { ret = -EPROBE_DEFER; break; } conn->outport = endpoint.port; conn->child_name = devm_kstrdup(dev, dev_name(rdev), GFP_KERNEL); conn->child_port = rendpoint.port; /* Connection record updated */ ret = 1; } while (0); of_node_put(rparent); of_node_put(rep); put_device(rdev); return ret; }
static int rcar_lvds_parse_dt(struct rcar_lvds *lvds) { struct device_node *local_output = NULL; struct device_node *remote_input = NULL; struct device_node *remote = NULL; struct device_node *node; bool is_bridge = false; int ret = 0; local_output = of_graph_get_endpoint_by_regs(lvds->dev->of_node, 1, 0); if (!local_output) { dev_dbg(lvds->dev, "unconnected port@1\n"); return -ENODEV; } /* * Locate the connected entity and infer its type from the number of * endpoints. */ remote = of_graph_get_remote_port_parent(local_output); if (!remote) { dev_dbg(lvds->dev, "unconnected endpoint %pOF\n", local_output); ret = -ENODEV; goto done; } if (!of_device_is_available(remote)) { dev_dbg(lvds->dev, "connected entity %pOF is disabled\n", remote); ret = -ENODEV; goto done; } remote_input = of_graph_get_remote_endpoint(local_output); for_each_endpoint_of_node(remote, node) { if (node != remote_input) { /* * We've found one endpoint other than the input, this * must be a bridge. */ is_bridge = true; of_node_put(node); break; } } if (is_bridge) { lvds->next_bridge = of_drm_find_bridge(remote); if (!lvds->next_bridge) ret = -EPROBE_DEFER; } else { lvds->panel = of_drm_find_panel(remote); if (!lvds->panel) ret = -EPROBE_DEFER; } done: of_node_put(local_output); of_node_put(remote_input); of_node_put(remote); return ret; }