From mboxrd@z Thu Jan 1 00:00:00 1970 From: Archit Taneja Subject: Re: [PATCH v2 5/6] drm: convert drivers to use drm_of_find_panel_or_bridge Date: Mon, 13 Feb 2017 10:27:22 +0530 Message-ID: <1b459142-9aca-4af4-70ee-ddec98ce1307@codeaurora.org> References: <20170209190558.4784-1-robh@kernel.org> <20170209190558.4784-6-robh@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20170209190558.4784-6-robh@kernel.org> Sender: linux-kernel-owner@vger.kernel.org To: Rob Herring , David Airlie , Daniel Vetter , Sean Paul Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Frank Rowand , Boris Brezillon , Jingoo Han , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Kukjin Kim , Krzysztof Kozlowski , Javier Martinez Canillas , Stefan Agner , Alison Wang , Xinliang Liu , Rongrong Zou , Xinwei Kong , Chen Feng Philipp Zabel List-Id: devicetree@vger.kernel.org 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 Thanks, Archit > > Signed-off-by: Rob Herring > --- > 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 > > #include > -#include > +#include > > #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 > #include > #include > -#include > > +#include > #include > > #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 > #include > #include > -#include > #include > #include > > +#include > #include > > #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 > #include > #include > +#include > #include > > #include > @@ -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 > #include > #include > +#include > #include > > #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 > #include > -#include > > #include > #include > @@ -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 > #include > #include > +#include > #include > #include > #include