Skip to content

Commit 86418f9

Browse files
robherringatseanpaul
authored andcommitted
drm: convert drivers to use of_graph_get_remote_node
Convert drivers to use the new of_graph_get_remote_node() helper instead of parsing the endpoint node and then getting the remote device node. Now drivers can just specify the device node and which port/endpoint and get back the connected remote device node. The details of the graph binding are nicely abstracted into the core OF graph code. This changes some error messages to debug messages (in the graph core). Graph connections are often "no connects" depending on the particular board, so we want to avoid spurious messages. Plus the kernel is not a DT validator. Signed-off-by: Rob Herring <[email protected]> Acked-by: Neil Armstrong <[email protected]> Tested-by: Liviu Dudau <[email protected]> Tested-by: Eric Anholt <[email protected]> Tested-by: Jyri Sarha <[email protected]> Tested by: Archit Taneja <[email protected]> Signed-off-by: Sean Paul <[email protected]>
1 parent 1f2db30 commit 86418f9

File tree

17 files changed

+48
-310
lines changed

17 files changed

+48
-310
lines changed

drivers/gpu/drm/arm/hdlcd_drv.c

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -392,29 +392,13 @@ static int compare_dev(struct device *dev, void *data)
392392

393393
static int hdlcd_probe(struct platform_device *pdev)
394394
{
395-
struct device_node *port, *ep;
395+
struct device_node *port;
396396
struct component_match *match = NULL;
397397

398-
if (!pdev->dev.of_node)
399-
return -ENODEV;
400-
401398
/* there is only one output port inside each device, find it */
402-
ep = of_graph_get_next_endpoint(pdev->dev.of_node, NULL);
403-
if (!ep)
404-
return -ENODEV;
405-
406-
if (!of_device_is_available(ep)) {
407-
of_node_put(ep);
399+
port = of_graph_get_remote_node(pdev->dev.of_node, 0, 0);
400+
if (!port)
408401
return -ENODEV;
409-
}
410-
411-
/* add the remote encoder port as component */
412-
port = of_graph_get_remote_port_parent(ep);
413-
of_node_put(ep);
414-
if (!port || !of_device_is_available(port)) {
415-
of_node_put(port);
416-
return -EAGAIN;
417-
}
418402

419403
drm_of_component_match_add(&pdev->dev, &match, compare_dev, port);
420404
of_node_put(port);

drivers/gpu/drm/arm/malidp_drv.c

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ static int malidp_bind(struct device *dev)
283283
{
284284
struct resource *res;
285285
struct drm_device *drm;
286-
struct device_node *ep;
287286
struct malidp_drm *malidp;
288287
struct malidp_hw_device *hwdev;
289288
struct platform_device *pdev = to_platform_device(dev);
@@ -398,12 +397,7 @@ static int malidp_bind(struct device *dev)
398397
goto init_fail;
399398

400399
/* Set the CRTC's port so that the encoder component can find it */
401-
ep = of_graph_get_next_endpoint(dev->of_node, NULL);
402-
if (!ep) {
403-
ret = -EINVAL;
404-
goto port_fail;
405-
}
406-
malidp->crtc.port = of_get_next_parent(ep);
400+
malidp->crtc.port = of_graph_get_port_by_id(dev->of_node, 0);
407401

408402
ret = component_bind_all(dev, drm);
409403
if (ret) {
@@ -458,7 +452,6 @@ static int malidp_bind(struct device *dev)
458452
bind_fail:
459453
of_node_put(malidp->crtc.port);
460454
malidp->crtc.port = NULL;
461-
port_fail:
462455
malidp_fini(drm);
463456
init_fail:
464457
drm->dev_private = NULL;
@@ -516,29 +509,16 @@ static int malidp_compare_dev(struct device *dev, void *data)
516509

517510
static int malidp_platform_probe(struct platform_device *pdev)
518511
{
519-
struct device_node *port, *ep;
512+
struct device_node *port;
520513
struct component_match *match = NULL;
521514

522515
if (!pdev->dev.of_node)
523516
return -ENODEV;
524517

525518
/* there is only one output port inside each device, find it */
526-
ep = of_graph_get_next_endpoint(pdev->dev.of_node, NULL);
527-
if (!ep)
528-
return -ENODEV;
529-
530-
if (!of_device_is_available(ep)) {
531-
of_node_put(ep);
519+
port = of_graph_get_remote_node(pdev->dev.of_node, 0, 0);
520+
if (!port)
532521
return -ENODEV;
533-
}
534-
535-
/* add the remote encoder port as component */
536-
port = of_graph_get_remote_port_parent(ep);
537-
of_node_put(ep);
538-
if (!port || !of_device_is_available(port)) {
539-
of_node_put(port);
540-
return -EAGAIN;
541-
}
542522

543523
drm_of_component_match_add(&pdev->dev, &match, malidp_compare_dev,
544524
port);

drivers/gpu/drm/bridge/adv7511/adv7533.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ void adv7533_detach_dsi(struct adv7511 *adv)
232232
int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
233233
{
234234
u32 num_lanes;
235-
struct device_node *endpoint;
236235

237236
of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
238237

@@ -241,17 +240,10 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
241240

242241
adv->num_dsi_lanes = num_lanes;
243242

244-
endpoint = of_graph_get_next_endpoint(np, NULL);
245-
if (!endpoint)
243+
adv->host_node = of_graph_get_remote_node(np, 0, 0);
244+
if (!adv->host_node)
246245
return -ENODEV;
247246

248-
adv->host_node = of_graph_get_remote_port_parent(endpoint);
249-
if (!adv->host_node) {
250-
of_node_put(endpoint);
251-
return -ENODEV;
252-
}
253-
254-
of_node_put(endpoint);
255247
of_node_put(adv->host_node);
256248

257249
adv->use_timing_gen = !of_property_read_bool(np,

drivers/gpu/drm/bridge/dumb-vga-dac.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,21 +154,12 @@ static const struct drm_bridge_funcs dumb_vga_bridge_funcs = {
154154

155155
static struct i2c_adapter *dumb_vga_retrieve_ddc(struct device *dev)
156156
{
157-
struct device_node *end_node, *phandle, *remote;
157+
struct device_node *phandle, *remote;
158158
struct i2c_adapter *ddc;
159159

160-
end_node = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1);
161-
if (!end_node) {
162-
dev_err(dev, "Missing connector endpoint\n");
163-
return ERR_PTR(-ENODEV);
164-
}
165-
166-
remote = of_graph_get_remote_port_parent(end_node);
167-
of_node_put(end_node);
168-
if (!remote) {
169-
dev_err(dev, "Enable to parse remote node\n");
160+
remote = of_graph_get_remote_node(dev->of_node, 1, -1);
161+
if (!remote)
170162
return ERR_PTR(-EINVAL);
171-
}
172163

173164
phandle = of_parse_phandle(remote, "ddc-i2c-bus", 0);
174165
of_node_put(remote);

drivers/gpu/drm/bridge/ti-tfp410.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -165,18 +165,13 @@ static irqreturn_t tfp410_hpd_irq_thread(int irq, void *arg)
165165

166166
static int tfp410_get_connector_properties(struct tfp410 *dvi)
167167
{
168-
struct device_node *ep = NULL, *connector_node = NULL;
169-
struct device_node *ddc_phandle = NULL;
168+
struct device_node *connector_node, *ddc_phandle;
170169
int ret = 0;
171170

172171
/* port@1 is the connector node */
173-
ep = of_graph_get_endpoint_by_regs(dvi->dev->of_node, 1, -1);
174-
if (!ep)
175-
goto fail;
176-
177-
connector_node = of_graph_get_remote_port_parent(ep);
172+
connector_node = of_graph_get_remote_node(dvi->dev->of_node, 1, -1);
178173
if (!connector_node)
179-
goto fail;
174+
return -ENODEV;
180175

181176
dvi->hpd = fwnode_get_named_gpiod(&connector_node->fwnode,
182177
"hpd-gpios", 0, GPIOD_IN, "hpd");
@@ -199,10 +194,10 @@ static int tfp410_get_connector_properties(struct tfp410 *dvi)
199194
else
200195
ret = -EPROBE_DEFER;
201196

197+
of_node_put(ddc_phandle);
198+
202199
fail:
203-
of_node_put(ep);
204200
of_node_put(connector_node);
205-
of_node_put(ddc_phandle);
206201
return ret;
207202
}
208203

drivers/gpu/drm/exynos/exynos_drm_dpi.c

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -163,27 +163,13 @@ enum {
163163
FIMD_PORT_WRB,
164164
};
165165

166-
static struct device_node *exynos_dpi_of_find_panel_node(struct device *dev)
167-
{
168-
struct device_node *np, *ep;
169-
170-
ep = of_graph_get_endpoint_by_regs(dev->of_node, FIMD_PORT_RGB, 0);
171-
if (!ep)
172-
return NULL;
173-
174-
np = of_graph_get_remote_port_parent(ep);
175-
of_node_put(ep);
176-
177-
return np;
178-
}
179-
180166
static int exynos_dpi_parse_dt(struct exynos_dpi *ctx)
181167
{
182168
struct device *dev = ctx->dev;
183169
struct device_node *dn = dev->of_node;
184170
struct device_node *np;
185171

186-
ctx->panel_node = exynos_dpi_of_find_panel_node(dev);
172+
ctx->panel_node = of_graph_get_remote_node(dn, FIMD_PORT_RGB, 0);
187173

188174
np = of_get_child_by_name(dn, "display-timings");
189175
if (np) {

drivers/gpu/drm/exynos/exynos_drm_dsi.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,17 +1659,10 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
16591659

16601660
of_node_put(ep);
16611661

1662-
ep = of_graph_get_next_endpoint(node, NULL);
1663-
if (!ep) {
1664-
ret = -EINVAL;
1665-
goto end;
1666-
}
1662+
dsi->bridge_node = of_graph_get_remote_node(node, DSI_PORT_OUT, 0);
1663+
if (!dsi->bridge_node)
1664+
return -EINVAL;
16671665

1668-
dsi->bridge_node = of_graph_get_remote_port_parent(ep);
1669-
if (!dsi->bridge_node) {
1670-
ret = -EINVAL;
1671-
goto end;
1672-
}
16731666
end:
16741667
of_node_put(ep);
16751668

drivers/gpu/drm/exynos/exynos_drm_mic.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -229,29 +229,6 @@ static void mic_set_reg_on(struct exynos_mic *mic, bool enable)
229229
writel(reg, mic->reg + MIC_OP);
230230
}
231231

232-
static struct device_node *get_remote_node(struct device_node *from, int reg)
233-
{
234-
struct device_node *endpoint = NULL, *remote_node = NULL;
235-
236-
endpoint = of_graph_get_endpoint_by_regs(from, reg, -1);
237-
if (!endpoint) {
238-
DRM_ERROR("mic: Failed to find remote port from %s",
239-
from->full_name);
240-
goto exit;
241-
}
242-
243-
remote_node = of_graph_get_remote_port_parent(endpoint);
244-
if (!remote_node) {
245-
DRM_ERROR("mic: Failed to find remote port parent from %s",
246-
from->full_name);
247-
goto exit;
248-
}
249-
250-
exit:
251-
of_node_put(endpoint);
252-
return remote_node;
253-
}
254-
255232
static int parse_dt(struct exynos_mic *mic)
256233
{
257234
int ret = 0, i, j;
@@ -263,7 +240,7 @@ static int parse_dt(struct exynos_mic *mic)
263240
* The first node must be for decon and the second one must be for dsi.
264241
*/
265242
for (i = 0, j = 0; i < NUM_ENDPOINTS; i++) {
266-
remote_node = get_remote_node(mic->dev->of_node, i);
243+
remote_node = of_graph_get_remote_node(mic->dev->of_node, i, 0);
267244
if (!remote_node) {
268245
ret = -EPIPE;
269246
goto exit;

drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -230,34 +230,6 @@ static const struct component_master_ops kirin_drm_ops = {
230230
.unbind = kirin_drm_unbind,
231231
};
232232

233-
static struct device_node *kirin_get_remote_node(struct device_node *np)
234-
{
235-
struct device_node *endpoint, *remote;
236-
237-
/* get the first endpoint, in our case only one remote node
238-
* is connected to display controller.
239-
*/
240-
endpoint = of_graph_get_next_endpoint(np, NULL);
241-
if (!endpoint) {
242-
DRM_ERROR("no valid endpoint node\n");
243-
return ERR_PTR(-ENODEV);
244-
}
245-
246-
remote = of_graph_get_remote_port_parent(endpoint);
247-
of_node_put(endpoint);
248-
if (!remote) {
249-
DRM_ERROR("no valid remote node\n");
250-
return ERR_PTR(-ENODEV);
251-
}
252-
253-
if (!of_device_is_available(remote)) {
254-
DRM_ERROR("not available for remote node\n");
255-
return ERR_PTR(-ENODEV);
256-
}
257-
258-
return remote;
259-
}
260-
261233
static int kirin_drm_platform_probe(struct platform_device *pdev)
262234
{
263235
struct device *dev = &pdev->dev;
@@ -271,7 +243,7 @@ static int kirin_drm_platform_probe(struct platform_device *pdev)
271243
return -EINVAL;
272244
}
273245

274-
remote = kirin_get_remote_node(np);
246+
remote = of_graph_get_remote_node(np, 0, 0);
275247
if (IS_ERR(remote))
276248
return PTR_ERR(remote);
277249

drivers/gpu/drm/mediatek/mtk_dpi.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ static int mtk_dpi_probe(struct platform_device *pdev)
661661
struct device *dev = &pdev->dev;
662662
struct mtk_dpi *dpi;
663663
struct resource *mem;
664-
struct device_node *ep, *bridge_node = NULL;
664+
struct device_node *bridge_node;
665665
int comp_id;
666666
int ret;
667667

@@ -706,15 +706,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
706706
return -EINVAL;
707707
}
708708

709-
ep = of_graph_get_next_endpoint(dev->of_node, NULL);
710-
if (ep) {
711-
bridge_node = of_graph_get_remote_port_parent(ep);
712-
of_node_put(ep);
713-
}
714-
if (!bridge_node) {
715-
dev_err(dev, "Failed to find bridge node\n");
709+
bridge_node = of_graph_get_remote_node(dev->of_node, 0, 0);
710+
if (!bridge_node)
716711
return -ENODEV;
717-
}
718712

719713
dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
720714

drivers/gpu/drm/mediatek/mtk_hdmi.c

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,7 +1434,7 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
14341434
{
14351435
struct device *dev = &pdev->dev;
14361436
struct device_node *np = dev->of_node;
1437-
struct device_node *cec_np, *port, *ep, *remote, *i2c_np;
1437+
struct device_node *cec_np, *remote, *i2c_np;
14381438
struct platform_device *cec_pdev;
14391439
struct regmap *regmap;
14401440
struct resource *mem;
@@ -1486,29 +1486,9 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
14861486
if (IS_ERR(hdmi->regs))
14871487
return PTR_ERR(hdmi->regs);
14881488

1489-
port = of_graph_get_port_by_id(np, 1);
1490-
if (!port) {
1491-
dev_err(dev, "Missing output port node\n");
1489+
remote = of_graph_get_remote_node(np, 1, 0);
1490+
if (!remote)
14921491
return -EINVAL;
1493-
}
1494-
1495-
ep = of_get_child_by_name(port, "endpoint");
1496-
if (!ep) {
1497-
dev_err(dev, "Missing endpoint node in port %s\n",
1498-
port->full_name);
1499-
of_node_put(port);
1500-
return -EINVAL;
1501-
}
1502-
of_node_put(port);
1503-
1504-
remote = of_graph_get_remote_port_parent(ep);
1505-
if (!remote) {
1506-
dev_err(dev, "Missing connector/bridge node for endpoint %s\n",
1507-
ep->full_name);
1508-
of_node_put(ep);
1509-
return -EINVAL;
1510-
}
1511-
of_node_put(ep);
15121492

15131493
if (!of_device_is_compatible(remote, "hdmi-connector")) {
15141494
hdmi->next_bridge = of_drm_find_bridge(remote);

0 commit comments

Comments
 (0)