Hi Christoph, Am Mittwoch, 10. April 2019, 16:10:44 CEST schrieb Christoph Muellner: > On our RK3399-Q7 EVK base board we have the option to connect an arbitrary > monitor via DP cable. The actual monitor is therefore not known in advance. > This means, we don't have any panel information besides the EDID > data from the device itself. Just so I understand correctly, you have a real dp-connector wired to the Analogix dp-controller, and therefore want to connect actual monitors to it. So the problem you're trying to work around is probably that the rockchip-driver of the analogix controller explictly expects a bridge to be present during probe, right? I think hacking up the panel-driver is not an ideal approach: (1) bridges/panels do expect to stay connected all the time and are meant for devices with actual hard-wired displays with specific power-sequence requirements (2) devicetree is expected to describe the real hardware, therefore the dt should not describe one thing while the actual hardware is really different So, I guess a more ideal approach could perhaps be to: (1) define a "dp-connector" devicetree binding, see Documentation/devicetree/bindings/display/connector/hdmi-connector.txt for a similar one (2) steal an idea from drivers/gpu/drm/mediatek/mtk_hdmi.c and check for that new compatible: if (!of_device_is_compatible(remote, "hdmi-connector")) { //move bridge handling here } and modify both the rockchip-part and the generic analogix bridge code to work with the connector declared instead of a panel? Heiko > The functionality for a 'simple-panel' has been remove a couple > of years ago with 81cf32b. This patch brings this feature back. > > Signed-off-by: Christoph Muellner <christoph.muellner@xxxxxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/panel/panel-simple.c | 24 ++++++++++++++++-------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c > index 9e8218f6a3f2..1f69283f3e4b 100644 > --- a/drivers/gpu/drm/panel/panel-simple.c > +++ b/drivers/gpu/drm/panel/panel-simple.c > @@ -176,7 +176,7 @@ static int panel_simple_disable(struct drm_panel *panel) > backlight_update_status(p->backlight); > } > > - if (p->desc->delay.disable) > + if (p->desc && p->desc->delay.disable) > msleep(p->desc->delay.disable); > > p->enabled = false; > @@ -195,7 +195,7 @@ static int panel_simple_unprepare(struct drm_panel *panel) > > regulator_disable(p->supply); > > - if (p->desc->delay.unprepare) > + if (p->desc && p->desc->delay.unprepare) > msleep(p->desc->delay.unprepare); > > p->prepared = false; > @@ -220,11 +220,13 @@ static int panel_simple_prepare(struct drm_panel *panel) > > gpiod_set_value_cansleep(p->enable_gpio, 1); > > - delay = p->desc->delay.prepare; > - if (p->no_hpd) > - delay += p->desc->delay.hpd_absent_delay; > - if (delay) > - msleep(delay); > + if (p->desc) { > + delay = p->desc->delay.prepare; > + if (p->no_hpd) > + delay += p->desc->delay.hpd_absent_delay; > + if (delay) > + msleep(delay); > + } > > p->prepared = true; > > @@ -238,7 +240,7 @@ static int panel_simple_enable(struct drm_panel *panel) > if (p->enabled) > return 0; > > - if (p->desc->delay.enable) > + if (p->desc && p->desc->delay.enable) > msleep(p->desc->delay.enable); > > if (p->backlight) { > @@ -280,6 +282,9 @@ static int panel_simple_get_timings(struct drm_panel *panel, > struct panel_simple *p = to_panel_simple(panel); > unsigned int i; > > + if (!p->desc) > + return 0; > + > if (p->desc->num_timings < num_timings) > num_timings = p->desc->num_timings; > > @@ -2536,6 +2541,9 @@ static const struct panel_desc arm_rtsm = { > > static const struct of_device_id platform_of_match[] = { > { > + .compatible = "simple-panel", > + .data = NULL, > + }, { > .compatible = "ampire,am-480272h3tmqw-t01h", > .data = &ire_am_480272h3tmqw_t01h, > }, { >