[PATCH 1/6] drivers: core: ofnode: Add panel timing decode.
Simon Glass
sjg at chromium.org
Mon Jan 23 19:42:35 CET 2023
Hi Nikhil,
On Mon, 23 Jan 2023 at 01:07, Nikhil M Jain <n-jain1 at ti.com> wrote:
>
> ofnode_decode_display_timing supports reading timing parameters from
> subnode of display-timings node, for displays supporting multiple
> resolution, in case if a display supports single resolution, it fails
> reading directly from display-timings node, to support it
> ofnode_decode_panel_timing is added.
>
> Signed-off-by: Nikhil M Jain <n-jain1 at ti.com>
> ---
> drivers/core/ofnode.c | 53 +++++++++++++++++++++++++++++++++++++++++++
> include/dm/ofnode.h | 12 ++++++++++
> 2 files changed, 65 insertions(+)
>
> diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c
> index 4d56b1a767..d06b947516 100644
> --- a/drivers/core/ofnode.c
> +++ b/drivers/core/ofnode.c
> @@ -991,6 +991,59 @@ int ofnode_decode_display_timing(ofnode parent, int index,
> return ret;
> }
>
> +int ofnode_decode_panel_timing(ofnode parent,
> + struct display_timing *dt)
> +{
> + ofnode timings;
> + u32 val = 0;
> + int ret = 0;
> +
> + timings = ofnode_find_subnode(parent, "panel-timings");
> +
> + if (!ofnode_valid(timings))
> + return -EINVAL;
> + memset(dt, 0, sizeof(*dt));
> + ret |= decode_timing_property(timings, "hback-porch", &dt->hback_porch);
> + ret |= decode_timing_property(timings, "hfront-porch", &dt->hfront_porch);
> + ret |= decode_timing_property(timings, "hactive", &dt->hactive);
> + ret |= decode_timing_property(timings, "hsync-len", &dt->hsync_len);
> + ret |= decode_timing_property(timings, "vback-porch", &dt->vback_porch);
> + ret |= decode_timing_property(timings, "vfront-porch", &dt->vfront_porch);
> + ret |= decode_timing_property(timings, "vactive", &dt->vactive);
> + ret |= decode_timing_property(timings, "vsync-len", &dt->vsync_len);
> + ret |= decode_timing_property(timings, "clock-frequency", &dt->pixelclock);
> + dt->flags = 0;
> + val = ofnode_read_u32_default(timings, "vsync-active", -1);
> + if (val != -1) {
if (!ofnode_read_u32(timings, "vsync-active", &val)) {
Please fix below also
> + dt->flags |= val ? DISPLAY_FLAGS_VSYNC_HIGH :
> + DISPLAY_FLAGS_VSYNC_LOW;
> + }
> + val = ofnode_read_u32_default(timings, "hsync-active", -1);
> + if (val != -1) {
> + dt->flags |= val ? DISPLAY_FLAGS_HSYNC_HIGH :
> + DISPLAY_FLAGS_HSYNC_LOW;
> + }
> + val = ofnode_read_u32_default(timings, "de-active", -1);
> + if (val != -1) {
> + dt->flags |= val ? DISPLAY_FLAGS_DE_HIGH :
> + DISPLAY_FLAGS_DE_LOW;
> + }
> + val = ofnode_read_u32_default(timings, "pixelclk-active", -1);
> + if (val != -1) {
> + dt->flags |= val ? DISPLAY_FLAGS_PIXDATA_POSEDGE :
> + DISPLAY_FLAGS_PIXDATA_NEGEDGE;
> + }
> +
> + if (ofnode_read_bool(timings, "interlaced"))
> + dt->flags |= DISPLAY_FLAGS_INTERLACED;
> + if (ofnode_read_bool(timings, "doublescan"))
> + dt->flags |= DISPLAY_FLAGS_DOUBLESCAN;
> + if (ofnode_read_bool(timings, "doubleclk"))
> + dt->flags |= DISPLAY_FLAGS_DOUBLECLK;
> +
> + return ret;
> +}
> +
> const void *ofnode_get_property(ofnode node, const char *propname, int *lenp)
> {
> if (ofnode_is_np(node))
> diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h
> index fa9865602d..3f6b0843c5 100644
> --- a/include/dm/ofnode.h
> +++ b/include/dm/ofnode.h
> @@ -974,6 +974,18 @@ struct display_timing;
> int ofnode_decode_display_timing(ofnode node, int index,
> struct display_timing *config);
>
> +/**
> + * ofnode_decode_panel_timing() - decode display timings
> + *
> + * Decode panel timings from the supplied 'panel-timings' node.
> + *
> + * @node: 'display-timing' node containing the timing subnodes
> + * @config: Place to put timings
> + * Return: 0 if OK, -FDT_ERR_NOTFOUND if not found
> + */
> +int ofnode_decode_panel_timing(ofnode node,
> + struct display_timing *config);
> +
> /**
> * ofnode_get_property() - get a pointer to the value of a node property
> *
> --
> 2.17.1
>
Please add a test to test/dm/ofnode.c
Regards,
Simon
More information about the U-Boot
mailing list