static int rvin_digital_graph_parse(struct rvin_dev *vin) { struct device_node *ep, *np; int ret; vin->digital.asd.match.fwnode.fwnode = NULL; vin->digital.subdev = NULL; /* * Port 0 id 0 is local digital input, try to get it. * Not all instances can or will have this, that is OK */ ep = of_graph_get_endpoint_by_regs(vin->dev->of_node, 0, 0); if (!ep) return 0; np = of_graph_get_remote_port_parent(ep); if (!np) { vin_err(vin, "No remote parent for digital input\n"); of_node_put(ep); return -EINVAL; } of_node_put(np); ret = rvin_digitial_parse_v4l2(vin, ep, &vin->digital.mbus_cfg); of_node_put(ep); if (ret) return ret; vin->digital.asd.match.fwnode.fwnode = of_fwnode_handle(np); vin->digital.asd.match_type = V4L2_ASYNC_MATCH_FWNODE; return 0; }
static bool meson_hdmi_connector_is_available(struct device *dev) { struct device_node *ep, *remote; /* HDMI Connector is on the second port, first endpoint */ ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, 0); if (!ep) return false; /* If the endpoint node exists, consider it enabled */ remote = of_graph_get_remote_port(ep); if (remote) { of_node_put(ep); return true; } of_node_put(ep); of_node_put(remote); return false; }
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; }