From patchwork Sun Jul 7 18:19:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 11034241 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 32984138B for ; Sun, 7 Jul 2019 18:32:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 223492817F for ; Sun, 7 Jul 2019 18:32:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 169C32835B; Sun, 7 Jul 2019 18:32:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A2AC72817F for ; Sun, 7 Jul 2019 18:32:13 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7758E89B67; Sun, 7 Jul 2019 18:32:12 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9A93789B67 for ; Sun, 7 Jul 2019 18:32:10 +0000 (UTC) Received: from pendragon.nordic-sky.finnair.com (unknown [38.98.37.142]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D48CECC; Sun, 7 Jul 2019 20:31:51 +0200 (CEST) From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Subject: [PATCH 33/60] drm/omap: hdmi: Allocate EDID in the .read_edid() operation Date: Sun, 7 Jul 2019 21:19:10 +0300 Message-Id: <20190707181937.6250-30-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190707181937.6250-1-laurent.pinchart@ideasonboard.com> References: <20190707180852.5512-1-laurent.pinchart@ideasonboard.com> <20190707181937.6250-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1562524329; bh=/buyKRtNMCmyl2GrgZWoh0LBzw/lLIUZGaW40HIUJ8Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YX0vtCrDeBU6b0+fWUnbIdZ8eHkEuwnUYAnuQBnaRwSa/NS/sUMdd2OS2Onazmnt9 j9mcYQFIclgWUi/34z6RVFIncfH/EZKOvs44sfcdfnmnYx4KVS+lsCeJLlgCIDz0xL TtCZN2Sl2PB7iEXHIUV2e/O+haTHFoKK2pdZXl7A= X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Maxime Ripard , Sebastian Reichel , Tomi Valkeinen , Sean Paul Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 Reviewed-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/hdmi4.c | 34 ++++++++++++++++-------- drivers/gpu/drm/omapdrm/dss/hdmi5.c | 22 ++++++++++----- drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 +- drivers/gpu/drm/omapdrm/omap_connector.c | 12 +++------ 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c index 0a0bda7f686f..f0586108b41e 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c @@ -416,31 +416,43 @@ 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) +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(512, 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, 512); + 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 07e6d8347689..60d146ac8fd0 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c @@ -421,27 +421,37 @@ 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) +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(512, 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, 512); + 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 8cc08a3290de..ccdf42617613 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -378,7 +378,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 3f913c8cf344..f8b2e63d9e74 100644 --- a/drivers/gpu/drm/omapdrm/omap_connector.c +++ b/drivers/gpu/drm/omapdrm/omap_connector.c @@ -164,25 +164,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; }