Re: [PATCH] drm: rcar-du: Support panels connected directly to the DPAD outputs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Tested and confirmed the correct operation the patched driver on the
Renesas r8a7796-m3ulcb platform.

Tested-by: Kevin Key <kevin.key@xxxxxxxxxx>

On Sat, 2019-03-02 at 18:17 +0200, Laurent Pinchart wrote:
> The R-Car DU driver assumes that a bridge is always connected to the
> DU
> output. This is valid for the LVDS and HDMI outputs, but the DPAD
> outputs can be connected directly to a panel, in which case no bridge
> is
> available.
>
> To support this use case, detect whether the entities connected to
> the
> DU DPAD outputs are encoders or panels based on the number of ports
> of
> their DT node, and retrieve the corresponding type of DRM objects.
> For
> panels, additionally create panel bridge instances.
>
> Signed-off-by: Laurent Pinchart <
> laurent.pinchart+renesas@xxxxxxxxxxxxxxxx>
> ---
>  drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 54 ++++++++++++++++++++-
> --
>  1 file changed, 48 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> index 8ee4e762f4e5..595ecfa1ff0e 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c
> @@ -28,13 +28,33 @@ static const struct drm_encoder_funcs
> encoder_funcs = {
>         .destroy = drm_encoder_cleanup,
>  };
>
> +static unsigned int rcar_du_encoder_count_ports(struct device_node
> *node)
> +{
> +       struct device_node *ports;
> +       struct device_node *port;
> +       unsigned int num_ports = 0;
> +
> +       ports = of_get_child_by_name(node, "ports");
> +       if (!ports)
> +               ports = of_node_get(node);
> +
> +       for_each_child_of_node(ports, port) {
> +               if (of_node_name_eq(port, "port"))
> +                       num_ports++;
> +       }
> +
> +       of_node_put(node);
> +
> +       return num_ports;
> +}
> +
>  int rcar_du_encoder_init(struct rcar_du_device *rcdu,
>                          enum rcar_du_output output,
>                          struct device_node *enc_node)
>  {
>         struct rcar_du_encoder *renc;
>         struct drm_encoder *encoder;
> -       struct drm_bridge *bridge = NULL;
> +       struct drm_bridge *bridge;
>         int ret;
>
>         renc = devm_kzalloc(rcdu->dev, sizeof(*renc), GFP_KERNEL);
> @@ -48,11 +68,33 @@ int rcar_du_encoder_init(struct rcar_du_device
> *rcdu,
>         dev_dbg(rcdu->dev, "initializing encoder %pOF for output
> %u\n",
>                 enc_node, output);
>
> -       /* Locate the DRM bridge from the encoder DT node. */
> -       bridge = of_drm_find_bridge(enc_node);
> -       if (!bridge) {
> -               ret = -EPROBE_DEFER;
> -               goto done;
> +       /*
> +        * Locate the DRM bridge from the DT node. For the DPAD
> outputs, if the
> +        * DT node has a single port, consider it describes a panel
> and create a
> +        * panel bridge.
> +        */
> +       if ((output == RCAR_DU_OUTPUT_DPAD0 ||
> +            output == RCAR_DU_OUTPUT_DPAD1) &&
> +           rcar_du_encoder_count_ports(enc_node) == 1) {
> +               struct drm_panel *panel =
> of_drm_find_panel(enc_node);
> +
> +               if (IS_ERR(panel)) {
> +                       ret = PTR_ERR(panel);
> +                       goto done;
> +               }
> +
> +               bridge = devm_drm_panel_bridge_add(rcdu->dev, panel,
> +                                                  DRM_MODE_CONNECTOR
> _DPI);
> +               if (IS_ERR(bridge)) {
> +                       ret = PTR_ERR(bridge);
> +                       goto done;
> +               }
> +       } else {
> +               bridge = of_drm_find_bridge(enc_node);
> +               if (!bridge) {
> +                       ret = -EPROBE_DEFER;
> +                       goto done;
> +               }
>         }
>
>         ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs,
> --
> Regards,
>
> Laurent Pinchart
>
>
>
> This e-mail was received from outside of Gentex Corporation. Use
> caution when clicking on links/attachments.
THE INFORMATION CONTAINED IN THIS E-MAIL MESSAGE AND ANY ATTACHMENTS SENT FROM GENTEX CORPORATION IS GENTEX CONFIDENTIAL INFORMATION INTENDED ONLY FOR THE PERSONAL USE OF THE INDIVIDUAL OR ENTITY NAMED ABOVE. If you are not the intended recipient, you are hereby notified that any review, distribution, or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately notify the sender by return e-mail, and delete this e-mail message and any attachments from your computer.<>




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux