Re: [PATCH v5 3/7] drm: sun4i: dsi: Convert to bridge driver
From: Michael Nazzareno Trimarchi <michael@amarulasolutions.com>
Date: 2021-12-05 17:41:28
Also in:
dri-devel
Hi Jagan
@@ -1503,28 +1506,18 @@ static int samsung_dsim_panel_or_bridge(structsamsung_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(structmipi_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 [off-list ref] wrote:On Fri, Nov 26, 2021 at 9:34 PM Maxime Ripard [off-list ref] wrote:quoted
On Thu, Nov 25, 2021 at 09:44:14PM +0530, Jagan Teki wrote:quoted
On Thu, Nov 25, 2021 at 9:40 PM Maxime Ripard [off-list ref] wrote:quoted
On Thu, Nov 25, 2021 at 07:55:41PM +0530, Jagan Teki wrote:quoted
Hi, On Thu, Nov 25, 2021 at 7:45 PM Maxime Ripard [off-list ref] wrote:quoted
On Wed, Nov 24, 2021 at 12:02:47AM +0530, Jagan Teki wrote:quoted
quoted
quoted
quoted
quoted
quoted
+ 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 driverI'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@amarulasolutions.com/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 nodesOkay. I need to check this.devm_drm_of_get_bridge is not working with legacy binding like the one used in sun6i dsiThere'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.quoted
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.quoted
quoted
quoted
quoted
quoted
https://patchwork.kernel.org/project/dri-devel/patch/20211122065223.88059-6-jagan@amarulasolutions.com/ 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@amarulasolutions.com/ 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:quoted
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 nodesdevm_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@amarulasolutions.com __________________________________ Amarula Solutions BV Joop Geesinkweg 125, 1114 AB, Amsterdam, NL T. +31 (0)85 111 9172 info@amarulasolutions.com www.amarulasolutions.com _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel