[PATCH v5 3/7] drm: sun4i: dsi: Convert to bridge driver

Michael Nazzareno Trimarchi michael at amarulasolutions.com
Sun Dec 5 09:39:30 PST 2021


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 at amarulasolutions.com> wrote:
>
> On Fri, Nov 26, 2021 at 9:34 PM Maxime Ripard <maxime at cerno.tech> 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 at cerno.tech> 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 at cerno.tech> 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@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 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 = <&reg_dcdc1>; /* VCC-DSI */
> > > > >           status = "okay";
> > > > >
> > > > >          panel at 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 = <&reg_dcdc1>; /* VCC-DSI */
> > > > >        status = "okay";
> > > > >
> > > > >       ports {
> > > > >             #address-cells = <1>;
> > > > >             #size-cells = <0>;
> > > > >
> > > > >            dsi_out: port at 0 {
> > > > >                    reg = <0>;
> > > > >
> > > > >                   dsi_out_bridge: endpoint {
> > > > >                             remote-endpoint = <&bridge_out_dsi>;
> > > > >                   };
> > > > >            };
> > > > >       };
> > > > >
> > > > >       panel at 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@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:
> >
> > > 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 at amarulasolutions.com
__________________________________

Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info at amarulasolutions.com
www.amarulasolutions.com



More information about the linux-arm-kernel mailing list