Hi Jagan @@ -1503,28 +1506,18 @@ static int samsung_dsim_panel_or_bridge(struct samsung_dsim *dsi, { struct drm_bridge *panel_bridge; struct drm_panel *panel; - struct device_node *remote; - - if (of_graph_is_present(node)) { - remote = of_graph_get_remote_node(node, DSI_PORT_OUT, 0); - if (!remote) - return -ENODEV; + int ret; - node = remote; - } + ret = drm_of_find_panel_or_bridge(dsi->dev->of_node, 1, 0, &panel, + &panel_bridge); + if (ret) + return ret; - panel_bridge = of_drm_find_bridge(node); - if (!panel_bridge) { - panel = of_drm_find_panel(node); - if (!IS_ERR(panel)) { - panel_bridge = drm_panel_bridge_add(panel); - if (IS_ERR(panel_bridge)) - return PTR_ERR(panel_bridge); - } + if (panel) { + panel_bridge = drm_panel_bridge_add(panel); + if (IS_ERR(panel_bridge)) + return PTR_ERR(panel_bridge); } - - of_node_put(node); - dsi->out_bridge = panel_bridge; I need to apply this change to register my panel on imx8mn even mode I found that @@ -1594,11 +1587,15 @@ static int samsung_dsim_host_attach(struct mipi_dsi_host *host, return ret; } - mutex_lock(&drm->mode_config.mutex); dsi->lanes = device->lanes; dsi->format = device->format; dsi->mode_flags = device->mode_flags; + + if (!drm) + return 0; + + mutex_lock(&drm->mode_config.mutex); mode_config is not initialized in this path. Michael On Tue, Nov 30, 2021 at 8:39 AM Jagan Teki <jagan@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Fri, Nov 26, 2021 at 9:34 PM Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > > > On Thu, Nov 25, 2021 at 09:44:14PM +0530, Jagan Teki wrote: > > > On Thu, Nov 25, 2021 at 9:40 PM Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > > > > > > > On Thu, Nov 25, 2021 at 07:55:41PM +0530, Jagan Teki wrote: > > > > > Hi, > > > > > > > > > > On Thu, Nov 25, 2021 at 7:45 PM Maxime Ripard <maxime@xxxxxxxxxx> wrote: > > > > > > > > > > > > On Wed, Nov 24, 2021 at 12:02:47AM +0530, Jagan Teki wrote: > > > > > > > > > > > > + dsi->panel = of_drm_find_panel(remote); > > > > > > > > > > > > + if (IS_ERR(dsi->panel)) { > > > > > > > > > > > > + dsi->panel = NULL; > > > > > > > > > > > > + > > > > > > > > > > > > + dsi->next_bridge = of_drm_find_bridge(remote); > > > > > > > > > > > > + if (IS_ERR(dsi->next_bridge)) { > > > > > > > > > > > > + dev_err(dsi->dev, "failed to find bridge\n"); > > > > > > > > > > > > + return PTR_ERR(dsi->next_bridge); > > > > > > > > > > > > + } > > > > > > > > > > > > + } else { > > > > > > > > > > > > + dsi->next_bridge = NULL; > > > > > > > > > > > > + } > > > > > > > > > > > > + > > > > > > > > > > > > + of_node_put(remote); > > > > > > > > > > > > > > > > > > > > > > Using devm_drm_of_get_bridge would greatly simplify the driver > > > > > > > > > > > > > > > > > > > > I'm aware of this and this would break the existing sunxi dsi binding, > > > > > > > > > > we are not using ports based pipeline in dsi node. Of-course you have > > > > > > > > > > pointed the same before, please check below > > > > > > > > > > https://patchwork.kernel.org/project/dri-devel/patch/20210322140152.101709-2-jagan@xxxxxxxxxxxxxxxxxxxx/ > > > > > > > > > > > > > > > > > > Then drm_of_find_panel_or_bridge needs to be adjusted to handle the DSI > > > > > > > > > bindings and look for a panel or bridge not only through the OF graph, > > > > > > > > > but also on the child nodes > > > > > > > > > > > > > > > > Okay. I need to check this. > > > > > > > > > > > > > > devm_drm_of_get_bridge is not working with legacy binding like the one > > > > > > > used in sun6i dsi > > > > > > > > > > > > There's nothing legacy about it. > > > > > > > > > > What I'm mean legacy here with current binding used in sun6i-dsi like this. > > > > > > > > > > &dsi { > > > > > vcc-dsi-supply = <®_dcdc1>; /* VCC-DSI */ > > > > > status = "okay"; > > > > > > > > > > panel@0 { > > > > > compatible = "bananapi,s070wv20-ct16-icn6211"; > > > > > reg = <0>; > > > > > reset-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* > > > > > LCD-RST: PL5 */ > > > > > enable-gpios = <&pio 1 7 GPIO_ACTIVE_HIGH>; /* > > > > > LCD-PWR-EN: PB7 */ > > > > > backlight = <&backlight>; > > > > > }; > > > > > }; > > > > > > > > Yes, I know, it's the generic DSI binding. It's still not legacy. > > > > > > > > > devm_drm_of_get_bridge cannot find the device with above binding and > > > > > able to find the device with below binding. > > > > > > > > > > &dsi { > > > > > vcc-dsi-supply = <®_dcdc1>; /* VCC-DSI */ > > > > > status = "okay"; > > > > > > > > > > ports { > > > > > #address-cells = <1>; > > > > > #size-cells = <0>; > > > > > > > > > > dsi_out: port@0 { > > > > > reg = <0>; > > > > > > > > > > dsi_out_bridge: endpoint { > > > > > remote-endpoint = <&bridge_out_dsi>; > > > > > }; > > > > > }; > > > > > }; > > > > > > > > > > panel@0 { > > > > > compatible = "bananapi,s070wv20-ct16-icn6211"; > > > > > reg = <0>; > > > > > reset-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* LCD-RST: PL5 */ > > > > > enable-gpios = <&pio 1 7 GPIO_ACTIVE_HIGH>; /* LCD-PWR-EN: PB7 */ > > > > > backlight = <&backlight>; > > > > > > > > > > port { > > > > > bridge_out_dsi: endpoint { > > > > > remote-endpoint = <&dsi_out_bridge>; > > > > > }; > > > > > }; > > > > > }; > > > > > }; > > > > > > > > Yes, I know, and that's because ... > > > > > > Okay. I will use find panel and bridge separately instead of > > > devm_drm_of_get_bridge in version patches. > > > > That's not been my point, at all? > > > > I mean, that whole discussion has been because you shouldn't do that. > > > > > > > > > > > > > > > > > > > https://patchwork.kernel.org/project/dri-devel/patch/20211122065223.88059-6-jagan@xxxxxxxxxxxxxxxxxxxx/ > > > > > > > > > > > > > > dsi->next_bridge = devm_drm_of_get_bridge(dsi->dev, dsi->dev->of_node, 0, 0); > > > > > > > if (IS_ERR(dsi->next_bridge)) > > > > > > > return PTR_ERR(dsi->next_bridge); > > > > > > > > > > > > > > It is only working if we have ports on the pipeline, something like this > > > > > > > https://patchwork.kernel.org/project/dri-devel/patch/20210214194102.126146-8-jagan@xxxxxxxxxxxxxxxxxxxx/ > > > > > > > > > > > > > > Please have a look and let me know if I miss anything? > > > > > > > > > > > > Yes, you're missing the answer you quoted earlier: > > > > > > > > > > Yes, I'm trying to resolve the comment one after another. Will get back. > > > > > > > > ... You've ignored that comment. > > > > > > Not understand which comment you mean. There are few about bridge > > > conversion details, I will send my comments. > > > > The one that got quoted there and you removed. For reference: > > > > > Then drm_of_find_panel_or_bridge needs to be adjusted to handle the DSI > > > bindings and look for a panel or bridge not only through the OF graph, > > > but also on the child nodes > > > > devm_drm_of_get_bridge uses drm_of_find_panel_or_bridge under the hood, > > so of course it won't find it if drm_of_find_panel_or_bridge doesn't. > > You need to modify drm_of_find_panel_or_bridge to also look for child > > devices and see if there's a panel or bridge registered for that child > > node. Then devm_drm_of_get_bridge will work as you intend it to. > > Got it now, I will make necessary changes. > > Thanks, > Jagan. > > -- Michael Nazzareno Trimarchi Co-Founder & Chief Executive Officer M. +39 347 913 2170 michael@xxxxxxxxxxxxxxxxxxxx __________________________________ Amarula Solutions BV Joop Geesinkweg 125, 1114 AB, Amsterdam, NL T. +31 (0)85 111 9172 info@xxxxxxxxxxxxxxxxxxxx www.amarulasolutions.com