aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-05-09 09:00:39 -0400
committerThierry Reding <treding@nvidia.com>2018-07-10 11:59:05 -0400
commit5fa8e4a22182df8ea39adeba4bd518506e26a96d (patch)
tree4b9a3df577632f7c2165ea86d4d98f2cb5018266
parent0ca0c827efdf248dfb4bbd4b9066acb6337e07ac (diff)
drm/panel: Make of_drm_find_panel() return an ERR_PTR() instead of NULL
Right now, the DRM panel logic returns NULL when a panel pointing to the passed OF node is not present in the list of registered panels. Most drivers interpret this NULL value as -EPROBE_DEFER, but we are about to modify the semantic of of_drm_find_panel() and let the framework return -ENODEV when the device node we're pointing to has a status property that is not equal to "okay" or "ok". Let's first patch the of_drm_find_panel() implementation to return ERR_PTR(-EPROBE_DEFER) instead of NULL and patch all callers to replace the '!panel' check by an 'IS_ERR(panel)' one. Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180509130042.9435-2-boris.brezillon@bootlin.com
-rw-r--r--drivers/gpu/drm/bridge/cdns-dsi.c2
-rw-r--r--drivers/gpu/drm/bridge/lvds-encoder.c4
-rw-r--r--drivers/gpu/drm/drm_of.c4
-rw-r--r--drivers/gpu/drm/drm_panel.c6
-rw-r--r--drivers/gpu/drm/exynos/exynos_dp.c6
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dpi.c4
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dsi.c3
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c5
-rw-r--r--drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c4
-rw-r--r--drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c5
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi_host.c2
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_lvds.c4
-rw-r--r--drivers/gpu/drm/rockchip/dw-mipi-dsi.c2
-rw-r--r--drivers/gpu/drm/sti/sti_dvo.c4
-rw-r--r--drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c4
-rw-r--r--drivers/gpu/drm/tegra/dsi.c3
-rw-r--r--drivers/gpu/drm/tegra/output.c4
-rw-r--r--include/drm/drm_panel.h2
18 files changed, 43 insertions, 25 deletions
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c b/drivers/gpu/drm/bridge/cdns-dsi.c
index f2d43f24acfb..ce9496d13986 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -1152,7 +1152,7 @@ static int cdns_dsi_attach(struct mipi_dsi_host *host,
1152 np = of_node_get(dev->dev.of_node); 1152 np = of_node_get(dev->dev.of_node);
1153 1153
1154 panel = of_drm_find_panel(np); 1154 panel = of_drm_find_panel(np);
1155 if (panel) { 1155 if (!IS_ERR(panel)) {
1156 bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI); 1156 bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DSI);
1157 } else { 1157 } else {
1158 bridge = of_drm_find_bridge(dev->dev.of_node); 1158 bridge = of_drm_find_bridge(dev->dev.of_node);
diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c b/drivers/gpu/drm/bridge/lvds-encoder.c
index 75b0d3f6e4de..f56c92f7af7c 100644
--- a/drivers/gpu/drm/bridge/lvds-encoder.c
+++ b/drivers/gpu/drm/bridge/lvds-encoder.c
@@ -68,9 +68,9 @@ static int lvds_encoder_probe(struct platform_device *pdev)
68 68
69 panel = of_drm_find_panel(panel_node); 69 panel = of_drm_find_panel(panel_node);
70 of_node_put(panel_node); 70 of_node_put(panel_node);
71 if (!panel) { 71 if (IS_ERR(panel)) {
72 dev_dbg(&pdev->dev, "panel not found, deferring probe\n"); 72 dev_dbg(&pdev->dev, "panel not found, deferring probe\n");
73 return -EPROBE_DEFER; 73 return PTR_ERR(panel);
74 } 74 }
75 75
76 lvds_encoder->panel_bridge = 76 lvds_encoder->panel_bridge =
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 3b8c7a6a5720..1f4a16772583 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -241,8 +241,10 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
241 241
242 if (panel) { 242 if (panel) {
243 *panel = of_drm_find_panel(remote); 243 *panel = of_drm_find_panel(remote);
244 if (*panel) 244 if (!IS_ERR(*panel))
245 ret = 0; 245 ret = 0;
246 else
247 *panel = NULL;
246 } 248 }
247 249
248 /* No panel found yet, check for a bridge next. */ 250 /* No panel found yet, check for a bridge next. */
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index 965530a6f4cd..7e5530a04846 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -151,7 +151,9 @@ EXPORT_SYMBOL(drm_panel_detach);
151 * tree node. If a matching panel is found, return a pointer to it. 151 * tree node. If a matching panel is found, return a pointer to it.
152 * 152 *
153 * Return: A pointer to the panel registered for the specified device tree 153 * Return: A pointer to the panel registered for the specified device tree
154 * node or NULL if no panel matching the device tree node can be found. 154 * node or an ERR_PTR() if no panel matching the device tree node can be found.
155 * The only error that can be reported is -EPROBE_DEFER, meaning that the panel
156 * device has not been probed yet, and the caller should retry later.
155 */ 157 */
156struct drm_panel *of_drm_find_panel(const struct device_node *np) 158struct drm_panel *of_drm_find_panel(const struct device_node *np)
157{ 159{
@@ -167,7 +169,7 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np)
167 } 169 }
168 170
169 mutex_unlock(&panel_lock); 171 mutex_unlock(&panel_lock);
170 return NULL; 172 return ERR_PTR(-EPROBE_DEFER);
171} 173}
172EXPORT_SYMBOL(of_drm_find_panel); 174EXPORT_SYMBOL(of_drm_find_panel);
173#endif 175#endif
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index 86330f396784..af7ab1ceb50f 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -232,9 +232,11 @@ static int exynos_dp_probe(struct platform_device *pdev)
232 np = of_parse_phandle(dev->of_node, "panel", 0); 232 np = of_parse_phandle(dev->of_node, "panel", 0);
233 if (np) { 233 if (np) {
234 dp->plat_data.panel = of_drm_find_panel(np); 234 dp->plat_data.panel = of_drm_find_panel(np);
235
235 of_node_put(np); 236 of_node_put(np);
236 if (!dp->plat_data.panel) 237 if (IS_ERR(dp->plat_data.panel))
237 return -EPROBE_DEFER; 238 return PTR_ERR(dp->plat_data.panel);
239
238 goto out; 240 goto out;
239 } 241 }
240 242
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index 66945e0dc57f..5887e8522b70 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -240,8 +240,8 @@ struct drm_encoder *exynos_dpi_probe(struct device *dev)
240 240
241 if (ctx->panel_node) { 241 if (ctx->panel_node) {
242 ctx->panel = of_drm_find_panel(ctx->panel_node); 242 ctx->panel = of_drm_find_panel(ctx->panel_node);
243 if (!ctx->panel) 243 if (IS_ERR(ctx->panel))
244 return ERR_PTR(-EPROBE_DEFER); 244 return ERR_CAST(ctx->panel);
245 } 245 }
246 246
247 return &ctx->encoder; 247 return &ctx->encoder;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 6d29777884f9..809e1e0447df 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -1519,6 +1519,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
1519 dsi->format = device->format; 1519 dsi->format = device->format;
1520 dsi->mode_flags = device->mode_flags; 1520 dsi->mode_flags = device->mode_flags;
1521 dsi->panel = of_drm_find_panel(device->dev.of_node); 1521 dsi->panel = of_drm_find_panel(device->dev.of_node);
1522 if (IS_ERR(dsi->panel))
1523 dsi->panel = NULL;
1524
1522 if (dsi->panel) { 1525 if (dsi->panel) {
1523 drm_panel_attach(dsi->panel, &dsi->connector); 1526 drm_panel_attach(dsi->panel, &dsi->connector);
1524 dsi->connector.status = connector_status_connected; 1527 dsi->connector.status = connector_status_connected;
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
index c54806d08dd7..681e2a07d03b 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
@@ -148,8 +148,9 @@ int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
148 if (panel_node) { 148 if (panel_node) {
149 fsl_dev->connector.panel = of_drm_find_panel(panel_node); 149 fsl_dev->connector.panel = of_drm_find_panel(panel_node);
150 of_node_put(panel_node); 150 of_node_put(panel_node);
151 if (!fsl_dev->connector.panel) 151 if (IS_ERR(fsl_dev->connector.panel))
152 return -EPROBE_DEFER; 152 return PTR_ERR(fsl_dev->connector.panel);
153
153 return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel); 154 return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel);
154 } 155 }
155 156
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
index 4a645926edb7..2bfb39082f54 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
@@ -341,7 +341,7 @@ static void mdp4_lcdc_encoder_disable(struct drm_encoder *encoder)
341 mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 0); 341 mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 0);
342 342
343 panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node); 343 panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
344 if (panel) { 344 if (!IS_ERR(panel)) {
345 drm_panel_disable(panel); 345 drm_panel_disable(panel);
346 drm_panel_unprepare(panel); 346 drm_panel_unprepare(panel);
347 } 347 }
@@ -410,7 +410,7 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
410 dev_err(dev->dev, "failed to enable lcdc_clk: %d\n", ret); 410 dev_err(dev->dev, "failed to enable lcdc_clk: %d\n", ret);
411 411
412 panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node); 412 panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
413 if (panel) { 413 if (!IS_ERR(panel)) {
414 drm_panel_prepare(panel); 414 drm_panel_prepare(panel);
415 drm_panel_enable(panel); 415 drm_panel_enable(panel);
416 } 416 }
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
index e3b1c86b7aae..32fba5664b0e 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
@@ -34,9 +34,12 @@ static enum drm_connector_status mdp4_lvds_connector_detect(
34 struct mdp4_lvds_connector *mdp4_lvds_connector = 34 struct mdp4_lvds_connector *mdp4_lvds_connector =
35 to_mdp4_lvds_connector(connector); 35 to_mdp4_lvds_connector(connector);
36 36
37 if (!mdp4_lvds_connector->panel) 37 if (!mdp4_lvds_connector->panel) {
38 mdp4_lvds_connector->panel = 38 mdp4_lvds_connector->panel =
39 of_drm_find_panel(mdp4_lvds_connector->panel_node); 39 of_drm_find_panel(mdp4_lvds_connector->panel_node);
40 if (IS_ERR(mdp4_lvds_connector->panel))
41 mdp4_lvds_connector->panel = NULL;
42 }
40 43
41 return mdp4_lvds_connector->panel ? 44 return mdp4_lvds_connector->panel ?
42 connector_status_connected : 45 connector_status_connected :
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index 2f1a2780658a..29841f440111 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -1898,7 +1898,7 @@ int msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer)
1898 * output 1898 * output
1899 */ 1899 */
1900 if (check_defer && msm_host->device_node) { 1900 if (check_defer && msm_host->device_node) {
1901 if (!of_drm_find_panel(msm_host->device_node)) 1901 if (IS_ERR(of_drm_find_panel(msm_host->device_node)))
1902 if (!of_drm_find_bridge(msm_host->device_node)) 1902 if (!of_drm_find_bridge(msm_host->device_node))
1903 return -EPROBE_DEFER; 1903 return -EPROBE_DEFER;
1904 } 1904 }
diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index 155ad840f3c5..5d8e391e75f4 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -434,8 +434,8 @@ static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
434 ret = -EPROBE_DEFER; 434 ret = -EPROBE_DEFER;
435 } else { 435 } else {
436 lvds->panel = of_drm_find_panel(remote); 436 lvds->panel = of_drm_find_panel(remote);
437 if (!lvds->panel) 437 if (IS_ERR(lvds->panel))
438 ret = -EPROBE_DEFER; 438 ret = PTR_ERR(lvds->panel);
439 } 439 }
440 440
441done: 441done:
diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
index d53d5a09547f..01642aaf6127 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
@@ -595,7 +595,7 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
595 dsi->format = device->format; 595 dsi->format = device->format;
596 dsi->mode_flags = device->mode_flags; 596 dsi->mode_flags = device->mode_flags;
597 dsi->panel = of_drm_find_panel(device->dev.of_node); 597 dsi->panel = of_drm_find_panel(device->dev.of_node);
598 if (dsi->panel) 598 if (!IS_ERR(dsi->panel))
599 return drm_panel_attach(dsi->panel, &dsi->connector); 599 return drm_panel_attach(dsi->panel, &dsi->connector);
600 600
601 return -EINVAL; 601 return -EINVAL;
diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index a5979cd25cc7..030da55a8d30 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -387,7 +387,9 @@ sti_dvo_connector_detect(struct drm_connector *connector, bool force)
387 387
388 if (!dvo->panel) { 388 if (!dvo->panel) {
389 dvo->panel = of_drm_find_panel(dvo->panel_node); 389 dvo->panel = of_drm_find_panel(dvo->panel_node);
390 if (dvo->panel) 390 if (IS_ERR(dvo->panel))
391 dvo->panel = NULL;
392 else
391 drm_panel_attach(dvo->panel, connector); 393 drm_panel_attach(dvo->panel, connector);
392 } 394 }
393 395
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
index da9814f94d00..2b40d1f6aee8 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
@@ -833,8 +833,8 @@ static int sun6i_dsi_attach(struct mipi_dsi_host *host,
833 833
834 dsi->device = device; 834 dsi->device = device;
835 dsi->panel = of_drm_find_panel(device->dev.of_node); 835 dsi->panel = of_drm_find_panel(device->dev.of_node);
836 if (!dsi->panel) 836 if (IS_ERR(dsi->panel))
837 return -EINVAL; 837 return PTR_ERR(dsi->panel);
838 838
839 dev_info(host->dev, "Attached device %s\n", device->name); 839 dev_info(host->dev, "Attached device %s\n", device->name);
840 840
diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c
index 87c5d89bc9ba..ad88ec230329 100644
--- a/drivers/gpu/drm/tegra/dsi.c
+++ b/drivers/gpu/drm/tegra/dsi.c
@@ -1411,6 +1411,9 @@ static int tegra_dsi_host_attach(struct mipi_dsi_host *host,
1411 struct tegra_output *output = &dsi->output; 1411 struct tegra_output *output = &dsi->output;
1412 1412
1413 output->panel = of_drm_find_panel(device->dev.of_node); 1413 output->panel = of_drm_find_panel(device->dev.of_node);
1414 if (IS_ERR(output->panel))
1415 output->panel = NULL;
1416
1414 if (output->panel && output->connector.dev) { 1417 if (output->panel && output->connector.dev) {
1415 drm_panel_attach(output->panel, &output->connector); 1418 drm_panel_attach(output->panel, &output->connector);
1416 drm_helper_hpd_irq_event(output->connector.dev); 1419 drm_helper_hpd_irq_event(output->connector.dev);
diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index ffe34bd0bb9d..0c0936511bb4 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -110,8 +110,8 @@ int tegra_output_probe(struct tegra_output *output)
110 panel = of_parse_phandle(output->of_node, "nvidia,panel", 0); 110 panel = of_parse_phandle(output->of_node, "nvidia,panel", 0);
111 if (panel) { 111 if (panel) {
112 output->panel = of_drm_find_panel(panel); 112 output->panel = of_drm_find_panel(panel);
113 if (!output->panel) 113 if (IS_ERR(output->panel))
114 return -EPROBE_DEFER; 114 return PTR_ERR(output->panel);
115 115
116 of_node_put(panel); 116 of_node_put(panel);
117 } 117 }
diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
index 26a1b5fd8796..582a0ec0aa70 100644
--- a/include/drm/drm_panel.h
+++ b/include/drm/drm_panel.h
@@ -200,7 +200,7 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np);
200#else 200#else
201static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) 201static inline struct drm_panel *of_drm_find_panel(const struct device_node *np)
202{ 202{
203 return NULL; 203 return ERR_PTR(-ENODEV);
204} 204}
205#endif 205#endif
206 206