[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1b459142-9aca-4af4-70ee-ddec98ce1307@codeaurora.org>
Date: Mon, 13 Feb 2017 10:27:22 +0530
From: Archit Taneja <architt@...eaurora.org>
To: Rob Herring <robh@...nel.org>, David Airlie <airlied@...ux.ie>,
Daniel Vetter <daniel.vetter@...el.com>,
Sean Paul <seanpaul@...omium.org>
Cc: dri-devel@...ts.freedesktop.org, devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org,
Frank Rowand <frowand.list@...il.com>,
Boris Brezillon <boris.brezillon@...e-electrons.com>,
Jingoo Han <jingoohan1@...il.com>,
Inki Dae <inki.dae@...sung.com>,
Joonyoung Shim <jy0922.shim@...sung.com>,
Seung-Woo Kim <sw0312.kim@...sung.com>,
Kyungmin Park <kyungmin.park@...sung.com>,
Kukjin Kim <kgene@...nel.org>,
Krzysztof Kozlowski <krzk@...nel.org>,
Javier Martinez Canillas <javier@....samsung.com>,
Stefan Agner <stefan@...er.ch>,
Alison Wang <alison.wang@...escale.com>,
Xinliang Liu <z.liuxinliang@...ilicon.com>,
Rongrong Zou <zourongrong@...il.com>,
Xinwei Kong <kong.kongxinwei@...ilicon.com>,
Chen Feng <puck.chen@...ilicon.com>,
Philipp Zabel <p.zabel@...gutronix.de>,
CK Hu <ck.hu@...iatek.com>,
Matthias Brugger <matthias.bgg@...il.com>,
Marek Vasut <marex@...x.de>,
Mark Yao <mark.yao@...k-chips.com>,
Heiko Stuebner <heiko@...ech.de>,
Maxime Ripard <maxime.ripard@...e-electrons.com>,
Chen-Yu Tsai <wens@...e.org>,
Liviu Dudau <liviu.dudau@....com>,
Mali DP Maintainers <malidp@...s.arm.com>,
Neil Armstrong <narmstrong@...libre.com>,
Carlo Caione <carlo@...one.org>,
Kevin Hilman <khilman@...libre.com>,
Rob Clark <robdclark@...il.com>, Jyri Sarha <jsarha@...com>,
Tomi Valkeinen <tomi.valkeinen@...com>,
Eric Anholt <eric@...olt.net>,
Russell King <rmk+kernel@...linux.org.uk>
Subject: Re: [PATCH v2 5/6] drm: convert drivers to use
drm_of_find_panel_or_bridge
On 02/10/2017 12:35 AM, Rob Herring wrote:
> Similar to the previous commit, convert drivers open coding OF graph
> parsing to use drm_of_find_panel_or_bridge instead.
>
> 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.
For the bridge drivers:
Reviewed-by: Archit Taneja <architt@...eaurora.org>
Thanks,
Archit
>
> Signed-off-by: Rob Herring <robh@...nel.org>
> ---
> v2:
> - fix wrong node ptr in imx-ldb
> - build fixes in kirin and imx drivers
>
> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 64 ++++-------------
> drivers/gpu/drm/bridge/nxp-ptn3460.c | 16 ++---
> drivers/gpu/drm/bridge/parade-ps8622.c | 16 ++---
> drivers/gpu/drm/bridge/tc358767.c | 27 +------
> drivers/gpu/drm/exynos/exynos_dp.c | 35 ++++-----
> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 49 ++++---------
> drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 27 ++-----
> drivers/gpu/drm/imx/imx-ldb.c | 27 ++-----
> drivers/gpu/drm/imx/parallel-display.c | 36 ++--------
> drivers/gpu/drm/mediatek/mtk_dsi.c | 23 ++----
> drivers/gpu/drm/mxsfb/mxsfb_out.c | 36 ++--------
> drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 26 ++-----
> drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 ++--
> drivers/gpu/drm/sun4i/sun4i_tcon.c | 90 ++----------------------
> 14 files changed, 88 insertions(+), 397 deletions(-)
>
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> index 6119b5085501..4614048a4935 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
> @@ -22,7 +22,7 @@
> #include <linux/of_graph.h>
>
> #include <drm/drmP.h>
> -#include <drm/drm_panel.h>
> +#include <drm/drm_of.h>
>
> #include "atmel_hlcdc_dc.h"
>
> @@ -152,29 +152,11 @@ static const struct drm_connector_funcs atmel_hlcdc_panel_connector_funcs = {
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> -static int atmel_hlcdc_check_endpoint(struct drm_device *dev,
> - const struct of_endpoint *ep)
> -{
> - struct device_node *np;
> - void *obj;
> -
> - np = of_graph_get_remote_port_parent(ep->local_node);
> -
> - obj = of_drm_find_panel(np);
> - if (!obj)
> - obj = of_drm_find_bridge(np);
> -
> - of_node_put(np);
> -
> - return obj ? 0 : -EPROBE_DEFER;
> -}
> -
> static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
> - const struct of_endpoint *ep)
> + const struct device_node *np)
> {
> struct atmel_hlcdc_dc *dc = dev->dev_private;
> struct atmel_hlcdc_rgb_output *output;
> - struct device_node *np;
> struct drm_panel *panel;
> struct drm_bridge *bridge;
> int ret;
> @@ -195,13 +177,11 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
>
> output->encoder.possible_crtcs = 0x1;
>
> - np = of_graph_get_remote_port_parent(ep->local_node);
> -
> - ret = -EPROBE_DEFER;
> + ret = drm_of_find_panel_or_bridge(np, 0, 0, &panel, &bridge);
> + if (ret)
> + return ret;
>
> - panel = of_drm_find_panel(np);
> if (panel) {
> - of_node_put(np);
> output->connector.dpms = DRM_MODE_DPMS_OFF;
> output->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
> drm_connector_helper_add(&output->connector,
> @@ -226,9 +206,6 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
> return 0;
> }
>
> - bridge = of_drm_find_bridge(np);
> - of_node_put(np);
> -
> if (bridge) {
> output->encoder.bridge = bridge;
> bridge->encoder = &output->encoder;
> @@ -245,31 +222,14 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
>
> int atmel_hlcdc_create_outputs(struct drm_device *dev)
> {
> - struct device_node *ep_np = NULL;
> - struct of_endpoint ep;
> + struct device_node *remote;
> int ret;
>
> - for_each_endpoint_of_node(dev->dev->of_node, ep_np) {
> - ret = of_graph_parse_endpoint(ep_np, &ep);
> - if (!ret)
> - ret = atmel_hlcdc_check_endpoint(dev, &ep);
> -
> - if (ret) {
> - of_node_put(ep_np);
> - return ret;
> - }
> - }
> -
> - for_each_endpoint_of_node(dev->dev->of_node, ep_np) {
> - ret = of_graph_parse_endpoint(ep_np, &ep);
> - if (!ret)
> - ret = atmel_hlcdc_attach_endpoint(dev, &ep);
> -
> - if (ret) {
> - of_node_put(ep_np);
> - return ret;
> - }
> - }
> + remote = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
> + if (!remote)
> + return -ENODEV;
>
> - return 0;
> + ret = atmel_hlcdc_attach_endpoint(dev, remote);
> + of_node_put(remote);
> + return ret;
> }
> diff --git a/drivers/gpu/drm/bridge/nxp-ptn3460.c b/drivers/gpu/drm/bridge/nxp-ptn3460.c
> index 27f98c518dde..351704390d02 100644
> --- a/drivers/gpu/drm/bridge/nxp-ptn3460.c
> +++ b/drivers/gpu/drm/bridge/nxp-ptn3460.c
> @@ -20,8 +20,8 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_gpio.h>
> -#include <linux/of_graph.h>
>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
>
> #include "drm_crtc.h"
> @@ -292,7 +292,6 @@ static int ptn3460_probe(struct i2c_client *client,
> {
> struct device *dev = &client->dev;
> struct ptn3460_bridge *ptn_bridge;
> - struct device_node *endpoint, *panel_node;
> int ret;
>
> ptn_bridge = devm_kzalloc(dev, sizeof(*ptn_bridge), GFP_KERNEL);
> @@ -300,16 +299,9 @@ static int ptn3460_probe(struct i2c_client *client,
> return -ENOMEM;
> }
>
> - endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
> - if (endpoint) {
> - panel_node = of_graph_get_remote_port_parent(endpoint);
> - if (panel_node) {
> - ptn_bridge->panel = of_drm_find_panel(panel_node);
> - of_node_put(panel_node);
> - if (!ptn_bridge->panel)
> - return -EPROBE_DEFER;
> - }
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &ptn_bridge->panel, NULL);
> + if (ret)
> + return ret;
>
> ptn_bridge->client = client;
>
> diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c b/drivers/gpu/drm/bridge/parade-ps8622.c
> index ac8cc5b50d9f..1dcec3b97e67 100644
> --- a/drivers/gpu/drm/bridge/parade-ps8622.c
> +++ b/drivers/gpu/drm/bridge/parade-ps8622.c
> @@ -22,10 +22,10 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_device.h>
> -#include <linux/of_graph.h>
> #include <linux/pm.h>
> #include <linux/regulator/consumer.h>
>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
>
> #include "drmP.h"
> @@ -536,7 +536,6 @@ static int ps8622_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> struct device *dev = &client->dev;
> - struct device_node *endpoint, *panel_node;
> struct ps8622_bridge *ps8622;
> int ret;
>
> @@ -544,16 +543,9 @@ static int ps8622_probe(struct i2c_client *client,
> if (!ps8622)
> return -ENOMEM;
>
> - endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
> - if (endpoint) {
> - panel_node = of_graph_get_remote_port_parent(endpoint);
> - if (panel_node) {
> - ps8622->panel = of_drm_find_panel(panel_node);
> - of_node_put(panel_node);
> - if (!ps8622->panel)
> - return -EPROBE_DEFER;
> - }
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &ps8622->panel, NULL);
> + if (ret)
> + return ret;
>
> ps8622->client = client;
>
> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> index de9ffb49e9f6..5c26488e7a2d 100644
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
> @@ -1244,7 +1244,6 @@ static const struct regmap_config tc_regmap_config = {
> static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
> {
> struct device *dev = &client->dev;
> - struct device_node *ep;
> struct tc_data *tc;
> int ret;
>
> @@ -1255,29 +1254,9 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
> tc->dev = dev;
>
> /* port@2 is the output port */
> - ep = of_graph_get_endpoint_by_regs(dev->of_node, 2, -1);
> - if (ep) {
> - struct device_node *remote;
> -
> - remote = of_graph_get_remote_port_parent(ep);
> - if (!remote) {
> - dev_warn(dev, "endpoint %s not connected\n",
> - ep->full_name);
> - of_node_put(ep);
> - return -ENODEV;
> - }
> - of_node_put(ep);
> - tc->panel = of_drm_find_panel(remote);
> - if (tc->panel) {
> - dev_dbg(dev, "found panel %s\n", remote->full_name);
> - } else {
> - dev_dbg(dev, "waiting for panel %s\n",
> - remote->full_name);
> - of_node_put(remote);
> - return -EPROBE_DEFER;
> - }
> - of_node_put(remote);
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &tc->panel, NULL);
> + if (ret)
> + return ret;
>
> /* Shut down GPIO is optional */
> tc->sd_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH);
> diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
> index 528229faffe4..376c941c5189 100644
> --- a/drivers/gpu/drm/exynos/exynos_dp.c
> +++ b/drivers/gpu/drm/exynos/exynos_dp.c
> @@ -23,6 +23,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
>
> #include <drm/bridge/analogix_dp.h>
> @@ -215,8 +216,11 @@ static const struct component_ops exynos_dp_ops = {
> static int exynos_dp_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> - struct device_node *np = NULL, *endpoint = NULL;
> + struct device_node *np;
> struct exynos_dp_device *dp;
> + struct drm_panel *panel;
> + struct drm_bridge *bridge;
> + int ret;
>
> dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
> GFP_KERNEL);
> @@ -240,28 +244,13 @@ static int exynos_dp_probe(struct platform_device *pdev)
> goto out;
> }
>
> - endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
> - if (endpoint) {
> - np = of_graph_get_remote_port_parent(endpoint);
> - if (np) {
> - /* The remote port can be either a panel or a bridge */
> - dp->plat_data.panel = of_drm_find_panel(np);
> - if (!dp->plat_data.panel) {
> - dp->ptn_bridge = of_drm_find_bridge(np);
> - if (!dp->ptn_bridge) {
> - of_node_put(np);
> - return -EPROBE_DEFER;
> - }
> - }
> - of_node_put(np);
> - } else {
> - DRM_ERROR("no remote endpoint device node found.\n");
> - return -EINVAL;
> - }
> - } else {
> - DRM_ERROR("no port endpoint subnode found.\n");
> - return -EINVAL;
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, &bridge);
> + if (ret)
> + return ret;
> +
> + /* The remote port can be either a panel or a bridge */
> + dp->plat_data.panel = panel;
> + dp->ptn_bridge = bridge;
>
> out:
> return component_add(&pdev->dev, &exynos_dp_ops);
> 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 05a8ee106879..3cae7dd75834 100644
> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
> @@ -15,6 +15,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
>
> #include "fsl_dcu_drm_drv.h"
> @@ -141,35 +142,11 @@ static int fsl_dcu_attach_panel(struct fsl_dcu_drm_device *fsl_dev,
> return ret;
> }
>
> -static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
> - const struct of_endpoint *ep)
> -{
> - struct drm_bridge *bridge;
> - struct device_node *np;
> -
> - np = of_graph_get_remote_port_parent(ep->local_node);
> -
> - fsl_dev->connector.panel = of_drm_find_panel(np);
> - if (fsl_dev->connector.panel) {
> - of_node_put(np);
> - return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel);
> - }
> -
> - bridge = of_drm_find_bridge(np);
> - of_node_put(np);
> - if (!bridge)
> - return -ENODEV;
> -
> - fsl_dev->encoder.bridge = bridge;
> - bridge->encoder = &fsl_dev->encoder;
> -
> - return drm_bridge_attach(fsl_dev->drm, bridge);
> -}
> -
> int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> {
> - struct of_endpoint ep;
> - struct device_node *ep_node, *panel_node;
> + struct device_node *panel_node;
> + struct drm_bridge *bridge;
> + struct drm_panel *panel;
> int ret;
>
> /* This is for backward compatibility */
> @@ -182,14 +159,16 @@ int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
> return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel);
> }
>
> - ep_node = of_graph_get_next_endpoint(fsl_dev->np, NULL);
> - if (!ep_node)
> - return -ENODEV;
> -
> - ret = of_graph_parse_endpoint(ep_node, &ep);
> - of_node_put(ep_node);
> + ret = drm_of_find_panel_or_bridge(fsl_dev->np, 0, 0, &panel, &bridge);
> if (ret)
> - return -ENODEV;
> + return ret;
>
> - return fsl_dcu_attach_endpoint(fsl_dev, &ep);
> + if (panel) {
> + fsl_dev->connector.panel = panel;
> + return fsl_dcu_attach_panel(fsl_dev, panel);
> + }
> +
> + fsl_dev->encoder.bridge = bridge;
> + bridge->encoder = &fsl_dev->encoder;
> + return drm_bridge_attach(fsl_dev->drm, bridge);
> }
> diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> index 998452ad0fcb..0f23e2c55862 100644
> --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> @@ -17,7 +17,6 @@
>
> #include <linux/clk.h>
> #include <linux/component.h>
> -#include <linux/of_graph.h>
>
> #include <drm/drm_of.h>
> #include <drm/drm_crtc_helper.h>
> @@ -757,34 +756,16 @@ static int dsi_parse_dt(struct platform_device *pdev, struct dw_dsi *dsi)
> {
> struct dsi_hw_ctx *ctx = dsi->ctx;
> struct device_node *np = pdev->dev.of_node;
> - struct device_node *endpoint, *bridge_node;
> - struct drm_bridge *bridge;
> struct resource *res;
> + int ret;
>
> /*
> * Get the endpoint node. In our case, dsi has one output port1
> * to which the external HDMI bridge is connected.
> */
> - endpoint = of_graph_get_endpoint_by_regs(np, 1, -1);
> - if (!endpoint) {
> - DRM_ERROR("no valid endpoint node\n");
> - return -ENODEV;
> - }
> - of_node_put(endpoint);
> -
> - bridge_node = of_graph_get_remote_port_parent(endpoint);
> - if (!bridge_node) {
> - DRM_ERROR("no valid bridge node\n");
> - return -ENODEV;
> - }
> - of_node_put(bridge_node);
> -
> - bridge = of_drm_find_bridge(bridge_node);
> - if (!bridge) {
> - DRM_INFO("wait for external HDMI bridge driver.\n");
> - return -EPROBE_DEFER;
> - }
> - dsi->bridge = bridge;
> + ret = drm_of_find_panel_or_bridge(np, 0, 0, NULL, &dsi->bridge);
> + if (ret)
> + return ret;
>
> ctx->pclk = devm_clk_get(&pdev->dev, "pclk");
> if (IS_ERR(ctx->pclk)) {
> diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> index 516d06490465..506d5c1d1263 100644
> --- a/drivers/gpu/drm/imx/imx-ldb.c
> +++ b/drivers/gpu/drm/imx/imx-ldb.c
> @@ -649,7 +649,6 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
>
> for_each_child_of_node(np, child) {
> struct imx_ldb_channel *channel;
> - struct device_node *ep;
> int bus_format;
>
> ret = of_property_read_u32(child, "reg", &i);
> @@ -673,27 +672,11 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
> * The output port is port@4 with an external 4-port mux or
> * port@2 with the internal 2-port mux.
> */
> - ep = of_graph_get_endpoint_by_regs(child,
> - imx_ldb->lvds_mux ? 4 : 2,
> - -1);
> - if (ep) {
> - struct device_node *remote;
> -
> - remote = of_graph_get_remote_port_parent(ep);
> - of_node_put(ep);
> - if (remote) {
> - channel->panel = of_drm_find_panel(remote);
> - channel->bridge = of_drm_find_bridge(remote);
> - } else
> - return -EPROBE_DEFER;
> - of_node_put(remote);
> -
> - if (!channel->panel && !channel->bridge) {
> - dev_err(dev, "panel/bridge not found: %s\n",
> - remote->full_name);
> - return -EPROBE_DEFER;
> - }
> - }
> + ret = drm_of_find_panel_or_bridge(child,
> + imx_ldb->lvds_mux ? 4 : 2, 0,
> + &channel->panel, &channel->bridge);
> + if (ret)
> + return ret;
>
> /* panel ddc only if there is no bridge */
> if (!channel->bridge) {
> diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
> index 8582a83c0d9b..92336f38c55e 100644
> --- a/drivers/gpu/drm/imx/parallel-display.c
> +++ b/drivers/gpu/drm/imx/parallel-display.c
> @@ -19,10 +19,10 @@
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_fb_helper.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
> #include <linux/videodev2.h>
> #include <video/of_display_timing.h>
> -#include <linux/of_graph.h>
>
> #include "imx-drm.h"
>
> @@ -210,7 +210,6 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
> {
> struct drm_device *drm = data;
> struct device_node *np = dev->of_node;
> - struct device_node *ep;
> const u8 *edidp;
> struct imx_parallel_display *imxpd;
> int ret;
> @@ -239,36 +238,9 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
> imxpd->bus_format = bus_format;
>
> /* port@1 is the output port */
> - ep = of_graph_get_endpoint_by_regs(np, 1, -1);
> - if (ep) {
> - struct device_node *remote;
> -
> - remote = of_graph_get_remote_port_parent(ep);
> - if (!remote) {
> - dev_warn(dev, "endpoint %s not connected\n",
> - ep->full_name);
> - of_node_put(ep);
> - return -ENODEV;
> - }
> - of_node_put(ep);
> -
> - imxpd->panel = of_drm_find_panel(remote);
> - if (imxpd->panel) {
> - dev_dbg(dev, "found panel %s\n", remote->full_name);
> - } else {
> - imxpd->bridge = of_drm_find_bridge(remote);
> - if (imxpd->bridge)
> - dev_dbg(dev, "found bridge %s\n",
> - remote->full_name);
> - }
> - if (!imxpd->panel && !imxpd->bridge) {
> - dev_dbg(dev, "waiting for panel or bridge %s\n",
> - remote->full_name);
> - of_node_put(remote);
> - return -EPROBE_DEFER;
> - }
> - of_node_put(remote);
> - }
> + ret = drm_of_find_panel_or_bridge(np, 1, 0, &imxpd->panel, &imxpd->bridge);
> + if (ret)
> + return ret;
>
> imxpd->dev = dev;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
> index 2c42f90809d8..14140579f8d4 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
> @@ -16,11 +16,11 @@
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_mipi_dsi.h>
> #include <drm/drm_panel.h>
> +#include <drm/drm_of.h>
> #include <linux/clk.h>
> #include <linux/component.h>
> #include <linux/of.h>
> #include <linux/of_platform.h>
> -#include <linux/of_graph.h>
> #include <linux/phy/phy.h>
> #include <linux/platform_device.h>
> #include <video/videomode.h>
> @@ -819,7 +819,6 @@ static int mtk_dsi_probe(struct platform_device *pdev)
> {
> struct mtk_dsi *dsi;
> struct device *dev = &pdev->dev;
> - struct device_node *remote_node, *endpoint;
> struct resource *regs;
> int comp_id;
> int ret;
> @@ -831,22 +830,10 @@ static int mtk_dsi_probe(struct platform_device *pdev)
> dsi->host.ops = &mtk_dsi_ops;
> dsi->host.dev = dev;
>
> - endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
> - if (endpoint) {
> - remote_node = of_graph_get_remote_port_parent(endpoint);
> - if (!remote_node) {
> - dev_err(dev, "No panel connected\n");
> - return -ENODEV;
> - }
> -
> - dsi->bridge = of_drm_find_bridge(remote_node);
> - dsi->panel = of_drm_find_panel(remote_node);
> - of_node_put(remote_node);
> - if (!dsi->bridge && !dsi->panel) {
> - dev_info(dev, "Waiting for bridge or panel driver\n");
> - return -EPROBE_DEFER;
> - }
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0,
> + &dsi->panel, &dsi->bridge);
> + if (ret)
> + return ret;
>
> dsi->engine_clk = devm_clk_get(dev, "engine");
> if (IS_ERR(dsi->engine_clk)) {
> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_out.c b/drivers/gpu/drm/mxsfb/mxsfb_out.c
> index fa8d17399407..f7d729aa09bd 100644
> --- a/drivers/gpu/drm/mxsfb/mxsfb_out.c
> +++ b/drivers/gpu/drm/mxsfb/mxsfb_out.c
> @@ -19,6 +19,7 @@
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_fb_cma_helper.h>
> #include <drm/drm_gem_cma_helper.h>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
> #include <drm/drm_plane_helper.h>
> #include <drm/drm_simple_kms_helper.h>
> @@ -82,20 +83,15 @@ static const struct drm_connector_funcs mxsfb_panel_connector_funcs = {
> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> };
>
> -static int mxsfb_attach_endpoint(struct drm_device *drm,
> - const struct of_endpoint *ep)
> +int mxsfb_create_output(struct drm_device *drm)
> {
> struct mxsfb_drm_private *mxsfb = drm->dev_private;
> - struct device_node *np;
> struct drm_panel *panel;
> - int ret = -EPROBE_DEFER;
> -
> - np = of_graph_get_remote_port_parent(ep->local_node);
> - panel = of_drm_find_panel(np);
> - of_node_put(np);
> + int ret;
>
> - if (!panel)
> - return -EPROBE_DEFER;
> + ret = drm_of_find_panel_or_bridge(drm->dev->of_node, 0, 0, &panel, NULL);
> + if (ret)
> + return ret;
>
> mxsfb->connector.dpms = DRM_MODE_DPMS_OFF;
> mxsfb->connector.polled = 0;
> @@ -109,23 +105,3 @@ static int mxsfb_attach_endpoint(struct drm_device *drm,
>
> return ret;
> }
> -
> -int mxsfb_create_output(struct drm_device *drm)
> -{
> - struct device_node *ep_np = NULL;
> - struct of_endpoint ep;
> - int ret;
> -
> - for_each_endpoint_of_node(drm->dev->of_node, ep_np) {
> - ret = of_graph_parse_endpoint(ep_np, &ep);
> - if (!ret)
> - ret = mxsfb_attach_endpoint(drm, &ep);
> -
> - if (ret) {
> - of_node_put(ep_np);
> - return ret;
> - }
> - }
> -
> - return 0;
> -}
> diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
> index 8548e8271639..615afad280a8 100644
> --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
> +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
> @@ -428,31 +428,13 @@ static const struct component_ops rockchip_dp_component_ops = {
> static int rockchip_dp_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> - struct device_node *panel_node, *port, *endpoint;
> struct drm_panel *panel = NULL;
> struct rockchip_dp_device *dp;
> + int ret;
>
> - port = of_graph_get_port_by_id(dev->of_node, 1);
> - if (port) {
> - endpoint = of_get_child_by_name(port, "endpoint");
> - of_node_put(port);
> - if (!endpoint) {
> - dev_err(dev, "no output endpoint found\n");
> - return -EINVAL;
> - }
> -
> - panel_node = of_graph_get_remote_port_parent(endpoint);
> - of_node_put(endpoint);
> - if (!panel_node) {
> - dev_err(dev, "no output node found\n");
> - return -EINVAL;
> - }
> -
> - panel = of_drm_find_panel(panel_node);
> - of_node_put(panel_node);
> - if (!panel)
> - return -EPROBE_DEFER;
> - }
> + ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL);
> + if (ret)
> + return ret;
>
> dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
> if (!dp)
> diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> index f5e86fe7750e..49daea05d325 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> @@ -15,6 +15,7 @@
> #include <drm/drmP.h>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_crtc_helper.h>
> +#include <drm/drm_of.h>
> #include <drm/drm_panel.h>
>
> #include "sun4i_drv.h"
> @@ -217,9 +218,9 @@ int sun4i_rgb_init(struct drm_device *drm)
> rgb->drv = drv;
> encoder = &rgb->encoder;
>
> - tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
> - encoder->bridge = sun4i_tcon_find_bridge(tcon->dev->of_node);
> - if (IS_ERR(tcon->panel) && IS_ERR(encoder->bridge)) {
> + ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
> + &tcon->panel, &encoder->bridge);
> + if (ret) {
> dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
> return 0;
> }
> @@ -239,7 +240,7 @@ int sun4i_rgb_init(struct drm_device *drm)
> /* The RGB encoder can only work with the TCON channel 0 */
> rgb->encoder.possible_crtcs = BIT(0);
>
> - if (!IS_ERR(tcon->panel)) {
> + if (tcon->panel) {
> drm_connector_helper_add(&rgb->connector,
> &sun4i_rgb_con_helper_funcs);
> ret = drm_connector_init(drm, &rgb->connector,
> @@ -260,7 +261,7 @@ int sun4i_rgb_init(struct drm_device *drm)
> }
> }
>
> - if (!IS_ERR(encoder->bridge)) {
> + if (encoder->bridge) {
> encoder->bridge->encoder = &rgb->encoder;
>
> ret = drm_bridge_attach(drm, encoder->bridge);
> @@ -268,8 +269,6 @@ int sun4i_rgb_init(struct drm_device *drm)
> dev_err(drm->dev, "Couldn't attach our bridge\n");
> goto err_cleanup_connector;
> }
> - } else {
> - encoder->bridge = NULL;
> }
>
> return 0;
> diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
> index ea2906f87cb9..2e4e365cecf9 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
> @@ -15,13 +15,12 @@
> #include <drm/drm_crtc.h>
> #include <drm/drm_crtc_helper.h>
> #include <drm/drm_modes.h>
> -#include <drm/drm_panel.h>
> +#include <drm/drm_of.h>
>
> #include <linux/component.h>
> #include <linux/ioport.h>
> #include <linux/of_address.h>
> #include <linux/of_device.h>
> -#include <linux/of_graph.h>
> #include <linux/of_irq.h>
> #include <linux/regmap.h>
> #include <linux/reset.h>
> @@ -405,74 +404,6 @@ static int sun4i_tcon_init_regmap(struct device *dev,
> return 0;
> }
>
> -struct drm_panel *sun4i_tcon_find_panel(struct device_node *node)
> -{
> - struct device_node *port, *remote, *child;
> - struct device_node *end_node = NULL;
> -
> - /* Inputs are listed first, then outputs */
> - port = of_graph_get_port_by_id(node, 1);
> -
> - /*
> - * Our first output is the RGB interface where the panel will
> - * be connected.
> - */
> - for_each_child_of_node(port, child) {
> - u32 reg;
> -
> - of_property_read_u32(child, "reg", ®);
> - if (reg == 0)
> - end_node = child;
> - }
> -
> - if (!end_node) {
> - DRM_DEBUG_DRIVER("Missing panel endpoint\n");
> - return ERR_PTR(-ENODEV);
> - }
> -
> - remote = of_graph_get_remote_port_parent(end_node);
> - if (!remote) {
> - DRM_DEBUG_DRIVER("Unable to parse remote node\n");
> - return ERR_PTR(-EINVAL);
> - }
> -
> - return of_drm_find_panel(remote) ?: ERR_PTR(-EPROBE_DEFER);
> -}
> -
> -struct drm_bridge *sun4i_tcon_find_bridge(struct device_node *node)
> -{
> - struct device_node *port, *remote, *child;
> - struct device_node *end_node = NULL;
> -
> - /* Inputs are listed first, then outputs */
> - port = of_graph_get_port_by_id(node, 1);
> -
> - /*
> - * Our first output is the RGB interface where the panel will
> - * be connected.
> - */
> - for_each_child_of_node(port, child) {
> - u32 reg;
> -
> - of_property_read_u32(child, "reg", ®);
> - if (reg == 0)
> - end_node = child;
> - }
> -
> - if (!end_node) {
> - DRM_DEBUG_DRIVER("Missing bridge endpoint\n");
> - return ERR_PTR(-ENODEV);
> - }
> -
> - remote = of_graph_get_remote_port_parent(end_node);
> - if (!remote) {
> - DRM_DEBUG_DRIVER("Enable to parse remote node\n");
> - return ERR_PTR(-EINVAL);
> - }
> -
> - return of_drm_find_bridge(remote) ?: ERR_PTR(-EPROBE_DEFER);
> -}
> -
> static int sun4i_tcon_bind(struct device *dev, struct device *master,
> void *data)
> {
> @@ -555,22 +486,11 @@ static int sun4i_tcon_probe(struct platform_device *pdev)
> struct device_node *node = pdev->dev.of_node;
> struct drm_bridge *bridge;
> struct drm_panel *panel;
> + int ret;
>
> - /*
> - * Neither the bridge or the panel is ready.
> - * Defer the probe.
> - */
> - panel = sun4i_tcon_find_panel(node);
> - bridge = sun4i_tcon_find_bridge(node);
> -
> - /*
> - * If we don't have a panel endpoint, just go on
> - */
> - if ((PTR_ERR(panel) == -EPROBE_DEFER) &&
> - (PTR_ERR(bridge) == -EPROBE_DEFER)) {
> - DRM_DEBUG_DRIVER("Still waiting for our panel/bridge. Deferring...\n");
> - return -EPROBE_DEFER;
> - }
> + ret = drm_of_find_panel_or_bridge(node, 1, 0, &panel, &bridge);
> + if (ret == -EPROBE_DEFER)
> + return ret;
>
> return component_add(&pdev->dev, &sun4i_tcon_ops);
> }
> --
> 2.10.1
>
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
Powered by blists - more mailing lists