drm/bridge/synopsys: dsi: use mipi_dsi_device to find panel

A patch from »drm/bridge/synopsys: dsi: use mipi_dsi_device to find panel« in state Mailinglist for linux-kernel

From: Heiko Stuebner <heiko.stuebner@...> Date: Tue, 17 Dec 2019 21:16:36 +0100

Commit-Message

Right now the dsi driver uses drm_of_find_panel_or_bridge() to find a connected panel or bridge. But this requires an of-graph connection between the dsi-host and dsi-device, where normal bindings for regular panels just expect the dsi device to be a subnode of the actual dsi host not requiring port connections. drm_of_find_panel_or_bridge used to find the actual device-node of the dsi device, but as this happens in the dsi_host_attach callback we already have the dsi-device and its device-node available already, so can just call the relevant panel+bridge functions ourself, making it work as well in setups without port-connections. Tested on a Rockchip px30 single-dsi with panels form Leadtek and Xinpeng as well on Gru-Scarlet (rk3399) with dual-dsi (and therefore ports) connected to the Innotek display variant. Signed-off-by: Heiko Stuebner <heiko.stuebner@...>

Patch-Comment

drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)

Statistics

  • 10 lines added
  • 7 lines removed

Changes

---------------- drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c -----------------
index 981d532cdd59..4b4961e7c680 100644
@@ -26,6 +26,7 @@
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_modes.h>
#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
@@ -310,16 +311,16 @@ static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
dsi->format = device->format;
dsi->mode_flags = device->mode_flags;
- ret = drm_of_find_panel_or_bridge(host->dev->of_node, 1, 0,
- &panel, &bridge);
- if (ret)
- return ret;
-
- if (panel) {
+ panel = of_drm_find_panel(device->dev.of_node);
+ if (!IS_ERR(panel)) {
bridge = drm_panel_bridge_add_typed(panel,
DRM_MODE_CONNECTOR_DSI);
if (IS_ERR(bridge))
return PTR_ERR(bridge);
+ } else {
+ bridge = of_drm_find_bridge(device->dev.of_node);
+ if (!bridge)
+ return -EPROBE_DEFER;
}
dsi->panel_bridge = bridge;
@@ -340,6 +341,7 @@ static int dw_mipi_dsi_host_detach(struct mipi_dsi_host *host,
{
struct dw_mipi_dsi *dsi = host_to_dsi(host);
const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data;
+ struct drm_bridge *bridge;
int ret;
if (pdata->host_ops && pdata->host_ops->detach) {
@@ -348,7 +350,8 @@ static int dw_mipi_dsi_host_detach(struct mipi_dsi_host *host,
return ret;
}
- drm_of_panel_bridge_remove(host->dev->of_node, 1, 0);
+ bridge = of_drm_find_bridge(device->dev.of_node);
+ drm_panel_bridge_remove(bridge);
drm_bridge_remove(&dsi->bridge);
 
 

Recent Patches

About Us

Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer.

Read More...