[PATCH v2 24/50] drm/omap: hdmi: Allocate EDID in the .read_edid() operation
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Aug 20 01:16:55 UTC 2019
Bring the omapdss-specific .read_edid() operation in sync with the
drm_bridge .get_edid() operation to ease code reuse.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
---
Changes since v1:
- Keep MAX_EDID macro
---
drivers/gpu/drm/omapdrm/dss/hdmi4.c | 36 ++++++++++++++++--------
drivers/gpu/drm/omapdrm/dss/hdmi5.c | 24 ++++++++++++----
drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 +-
drivers/gpu/drm/omapdrm/omap_connector.c | 12 ++------
4 files changed, 47 insertions(+), 27 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index dd4a14fe7e59..e15fa3862922 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -405,31 +405,45 @@ static void hdmi_disconnect(struct omap_dss_device *src,
omapdss_device_disconnect(dst, dst->next);
}
-static int hdmi_read_edid(struct omap_dss_device *dssdev,
- u8 *edid, int len)
+#define MAX_EDID 512
+
+static struct edid *hdmi_read_edid(struct omap_dss_device *dssdev)
{
struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
bool need_enable;
+ u8 *edid;
int r;
+ edid = kzalloc(MAX_EDID, GFP_KERNEL);
+ if (!edid)
+ return NULL;
+
need_enable = hdmi->core_enabled == false;
if (need_enable) {
r = hdmi4_core_enable(&hdmi->core);
- if (r)
- return r;
+ if (r) {
+ kfree(edid);
+ return NULL;
+ }
+ }
+
+ r = read_edid(hdmi, edid, MAX_EDID);
+ if (r < 0) {
+ kfree(edid);
+ edid = NULL;
+ } else {
+ unsigned int cec_addr;
+
+ cec_addr = r >= 256 ? cec_get_edid_phys_addr(edid, r, NULL)
+ : CEC_PHYS_ADDR_INVALID;
+ hdmi4_cec_set_phys_addr(&hdmi->core, cec_addr);
}
- r = read_edid(hdmi, edid, len);
- if (r >= 256)
- hdmi4_cec_set_phys_addr(&hdmi->core,
- cec_get_edid_phys_addr(edid, r, NULL));
- else
- hdmi4_cec_set_phys_addr(&hdmi->core, CEC_PHYS_ADDR_INVALID);
if (need_enable)
hdmi4_core_disable(&hdmi->core);
- return r;
+ return (struct edid *)edid;
}
static void hdmi_lost_hotplug(struct omap_dss_device *dssdev)
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 8e3790dd8b98..99720dfc5769 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -410,27 +410,39 @@ static void hdmi_disconnect(struct omap_dss_device *src,
omapdss_device_disconnect(dst, dst->next);
}
-static int hdmi_read_edid(struct omap_dss_device *dssdev,
- u8 *edid, int len)
+#define MAX_EDID 512
+
+static struct edid *hdmi_read_edid(struct omap_dss_device *dssdev)
{
struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev);
bool need_enable;
+ u8 *edid;
int r;
+ edid = kzalloc(MAX_EDID, GFP_KERNEL);
+ if (!edid)
+ return NULL;
+
need_enable = hdmi->core_enabled == false;
if (need_enable) {
r = hdmi_core_enable(hdmi);
- if (r)
- return r;
+ if (r) {
+ kfree(edid);
+ return NULL;
+ }
}
- r = read_edid(hdmi, edid, len);
+ r = read_edid(hdmi, edid, MAX_EDID);
+ if (r < 0) {
+ kfree(edid);
+ edid = NULL;
+ }
if (need_enable)
hdmi_core_disable(hdmi);
- return r;
+ return (struct edid *)edid;
}
static int hdmi_set_infoframe(struct omap_dss_device *dssdev,
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 82e9bfa5530a..269e143d57be 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -367,7 +367,7 @@ struct omap_dss_device_ops {
void *cb_data);
void (*unregister_hpd_cb)(struct omap_dss_device *dssdev);
- int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
+ struct edid *(*read_edid)(struct omap_dss_device *dssdev);
int (*get_modes)(struct omap_dss_device *dssdev,
struct drm_connector *connector);
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index a24cec4b0bb9..c636ae228130 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -153,25 +153,19 @@ static void omap_connector_destroy(struct drm_connector *connector)
kfree(omap_connector);
}
-#define MAX_EDID 512
-
static int omap_connector_get_modes_edid(struct drm_connector *connector,
struct omap_dss_device *dssdev)
{
enum drm_connector_status status;
- void *edid;
+ struct edid *edid;
int n;
status = omap_connector_detect(connector, false);
if (status != connector_status_connected)
goto no_edid;
- edid = kzalloc(MAX_EDID, GFP_KERNEL);
- if (!edid)
- goto no_edid;
-
- if (dssdev->ops->read_edid(dssdev, edid, MAX_EDID) <= 0 ||
- !drm_edid_is_valid(edid)) {
+ edid = dssdev->ops->read_edid(dssdev);
+ if (!edid || !drm_edid_is_valid(edid)) {
kfree(edid);
goto no_edid;
}
--
Regards,
Laurent Pinchart
More information about the dri-devel
mailing list