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.pinch...@ideasonboard.com>
Reviewed-by: Tomi Valkeinen <tomi.valkei...@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

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to