static int etnaviv_pdev_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct component_match *match = NULL; dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); if (node) { struct device_node *core_node; int i; for (i = 0; ; i++) { core_node = of_parse_phandle(node, "cores", i); if (!core_node) break; drm_of_component_match_add(&pdev->dev, &match, compare_of, core_node); of_node_put(core_node); } } else if (dev->platform_data) { char **names = dev->platform_data; unsigned i; for (i = 0; names[i]; i++) component_match_add(dev, &match, compare_str, names[i]); } return component_master_add_with_match(dev, &etnaviv_master_ops, match); }
static int hdlcd_probe(struct platform_device *pdev) { struct device_node *port, *ep; struct component_match *match = NULL; if (!pdev->dev.of_node) return -ENODEV; /* there is only one output port inside each device, find it */ ep = of_graph_get_next_endpoint(pdev->dev.of_node, NULL); if (!ep) return -ENODEV; if (!of_device_is_available(ep)) { of_node_put(ep); return -ENODEV; } /* add the remote encoder port as component */ port = of_graph_get_remote_port_parent(ep); of_node_put(ep); if (!port || !of_device_is_available(port)) { of_node_put(port); return -EAGAIN; } drm_of_component_match_add(&pdev->dev, &match, compare_dev, port); of_node_put(port); return component_master_add_with_match(&pdev->dev, &hdlcd_master_ops, match); }
static int hdlcd_probe(struct platform_device *pdev) { struct device_node *port; struct component_match *match = NULL; /* there is only one output port inside each device, find it */ port = of_graph_get_remote_node(pdev->dev.of_node, 0, 0); if (!port) return -ENODEV; drm_of_component_match_add(&pdev->dev, &match, compare_dev, port); of_node_put(port); return component_master_add_with_match(&pdev->dev, &hdlcd_master_ops, match); }
int tilcdc_get_external_components(struct device *dev, struct component_match **match) { struct device_node *node; struct device_node *ep = NULL; int count = 0; int ret = 0; if (!tilcdc_node_has_port(dev->of_node)) return 0; while ((ep = of_graph_get_next_endpoint(dev->of_node, ep))) { node = of_graph_get_remote_port_parent(ep); if (!node || !of_device_is_available(node)) { of_node_put(node); continue; } dev_dbg(dev, "Subdevice node '%s' found\n", node->name); if (of_device_is_compatible(node, "nxp,tda998x")) { if (match) drm_of_component_match_add(dev, match, dev_match_of, node); ret = 1; } of_node_put(node); if (count++ > 1) { dev_err(dev, "Only one port is supported\n"); return -EINVAL; } } return ret; }
static int kirin_drm_platform_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct component_match *match = NULL; struct device_node *remote; dc_ops = (struct kirin_dc_ops *)of_device_get_match_data(dev); if (!dc_ops) { DRM_ERROR("failed to get dt id data\n"); return -EINVAL; } remote = kirin_get_remote_node(np); if (IS_ERR(remote)) return PTR_ERR(remote); drm_of_component_match_add(dev, &match, compare_of, remote); of_node_put(remote); return component_master_add_with_match(dev, &kirin_drm_ops, match); return 0; }
static int sun4i_drv_add_endpoints(struct device *dev, struct component_match **match, struct device_node *node) { struct device_node *port, *ep, *remote; int count = 0; /* * We don't support the frontend for now, so we will never * have a device bound. Just skip over it, but we still want * the rest our pipeline to be added. */ if (!sun4i_drv_node_is_frontend(node) && !of_device_is_available(node)) return 0; if (!sun4i_drv_node_is_frontend(node)) { /* Add current component */ DRM_DEBUG_DRIVER("Adding component %s\n", of_node_full_name(node)); drm_of_component_match_add(dev, match, compare_of, node); count++; } /* Inputs are listed first, then outputs */ port = of_graph_get_port_by_id(node, 1); if (!port) { DRM_DEBUG_DRIVER("No output to bind\n"); return count; } for_each_available_child_of_node(port, ep) { remote = of_graph_get_remote_port_parent(ep); if (!remote) { DRM_DEBUG_DRIVER("Error retrieving the output node\n"); of_node_put(remote); continue; } /* * If the node is our TCON, the first port is used for * panel or bridges, and will not be part of the * component framework. */ if (sun4i_drv_node_is_tcon(node)) { struct of_endpoint endpoint; if (of_graph_parse_endpoint(ep, &endpoint)) { DRM_DEBUG_DRIVER("Couldn't parse endpoint\n"); continue; } if (!endpoint.id) { DRM_DEBUG_DRIVER("Endpoint is our panel... skipping\n"); continue; } } /* Walk down our tree */ count += sun4i_drv_add_endpoints(dev, match, remote); of_node_put(remote); }