[PATCH 1/2] drm/bridge: add ->edid_read hook and drm_bridge_edid_read()
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Fri Dec 22 19:27:40 UTC 2023
On Thu, 26 Oct 2023 at 12:40, Jani Nikula <jani.nikula at intel.com> wrote:
>
> Add new struct drm_edid based ->edid_read hook and
> drm_bridge_edid_read() function to call the hook.
>
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
> drivers/gpu/drm/drm_bridge.c | 46 +++++++++++++++++++++++++++++++++++-
> include/drm/drm_bridge.h | 33 ++++++++++++++++++++++++++
> 2 files changed, 78 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index 30d66bee0ec6..e1cfba2ff583 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -27,8 +27,9 @@
> #include <linux/mutex.h>
>
> #include <drm/drm_atomic_state_helper.h>
> -#include <drm/drm_debugfs.h>
> #include <drm/drm_bridge.h>
> +#include <drm/drm_debugfs.h>
> +#include <drm/drm_edid.h>
> #include <drm/drm_encoder.h>
> #include <drm/drm_file.h>
> #include <drm/drm_of.h>
> @@ -1206,6 +1207,47 @@ int drm_bridge_get_modes(struct drm_bridge *bridge,
> }
> EXPORT_SYMBOL_GPL(drm_bridge_get_modes);
>
> +/**
> + * drm_bridge_edid_read - read the EDID data of the connected display
> + * @bridge: bridge control structure
> + * @connector: the connector to read EDID for
> + *
> + * If the bridge supports output EDID retrieval, as reported by the
> + * DRM_BRIDGE_OP_EDID bridge ops flag, call &drm_bridge_funcs.edid_read to get
> + * the EDID and return it. Otherwise return NULL.
> + *
> + * If &drm_bridge_funcs.edid_read is not set, fall back to using
> + * drm_bridge_get_edid() and wrapping it in struct drm_edid.
> + *
> + * RETURNS:
> + * The retrieved EDID on success, or NULL otherwise.
Wouldn't it be better to return an ERR_PTR instead of NULL?
> + */
> +const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,
> + struct drm_connector *connector)
> +{
> + if (!(bridge->ops & DRM_BRIDGE_OP_EDID))
> + return NULL;
> +
> + /* Transitional: Fall back to ->get_edid. */
> + if (!bridge->funcs->edid_read) {
> + const struct drm_edid *drm_edid;
> + struct edid *edid;
> +
> + edid = drm_bridge_get_edid(bridge, connector);
> + if (!edid)
> + return NULL;
> +
> + drm_edid = drm_edid_alloc(edid, (edid->extensions + 1) * EDID_LENGTH);
> +
> + kfree(edid);
> +
> + return drm_edid;
> + }
> +
> + return bridge->funcs->edid_read(bridge, connector);
> +}
> +EXPORT_SYMBOL_GPL(drm_bridge_edid_read);
[skipped the rest]
--
With best wishes
Dmitry
More information about the dri-devel
mailing list