[PATCH] drm/exynos: let drm handle edid allocations
김승우
sw0312.kim at samsung.com
Tue Jan 1 16:35:41 PST 2013
Hi Rahul,
On 2012년 12월 28일 16:01, Rahul Sharma wrote:
> There's no need to allocate edid twice and do a memcpy when drm helpers
> exist to do just that. This patch cleans that interaction up, and
> doesn't keep the edid hanging around in the connector.
Basically, I agree about this idea. But exynos_drm_vidi also uses
display_ops->get_edid(), so vidi should be considered.
Best Regards,
- Seung-Woo Kim
>
> Signed-off-by: Sean Paul <seanpaul at chromium.org>
> Signed-off-by: Rahul Sharma <rahul.sharma at samsung.com>
> ---
> This patch is based on branch "exynos-drm-next" at
> http://git.kernel.org/?p=linux/kernel/git/daeinki/drm-exynos.git
>
> drivers/gpu/drm/exynos/exynos_drm_connector.c | 36 ++++++++++++++-------------
> drivers/gpu/drm/exynos/exynos_drm_drv.h | 4 +--
> drivers/gpu/drm/exynos/exynos_drm_hdmi.c | 9 +++----
> drivers/gpu/drm/exynos/exynos_drm_hdmi.h | 4 +--
> drivers/gpu/drm/exynos/exynos_hdmi.c | 25 ++++++++-----------
> 5 files changed, 37 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> index ab37437..7ee43aa 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
> @@ -96,7 +96,9 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
> to_exynos_connector(connector);
> struct exynos_drm_manager *manager = exynos_connector->manager;
> struct exynos_drm_display_ops *display_ops = manager->display_ops;
> - unsigned int count;
> + unsigned int count = 0;
> + struct edid *edid = NULL;
> + int ret;
>
> DRM_DEBUG_KMS("%s\n", __FILE__);
>
> @@ -114,27 +116,25 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
> * because lcd panel has only one mode.
> */
> if (display_ops->get_edid) {
> - int ret;
> - void *edid;
> -
> - edid = kzalloc(MAX_EDID, GFP_KERNEL);
> - if (!edid) {
> - DRM_ERROR("failed to allocate edid\n");
> - return 0;
> + edid = display_ops->get_edid(manager->dev, connector);
> + if (IS_ERR_OR_NULL(edid)) {
> + ret = PTR_ERR(edid);
> + edid = NULL;
> + DRM_ERROR("Panel operation get_edid failed %d\n", ret);
> + goto out;
> }
>
> - ret = display_ops->get_edid(manager->dev, connector,
> - edid, MAX_EDID);
> - if (ret < 0) {
> - DRM_ERROR("failed to get edid data.\n");
> - kfree(edid);
> - edid = NULL;
> - return 0;
> + ret = drm_mode_connector_update_edid_property(connector, edid);
> + if (ret) {
> + DRM_ERROR("update edid property failed(%d)\n", ret);
> + goto out;
> }
>
> - drm_mode_connector_update_edid_property(connector, edid);
> count = drm_add_edid_modes(connector, edid);
> - kfree(edid);
> + if (count < 0) {
> + DRM_ERROR("Add edid modes failed %d\n", count);
> + goto out;
> + }
> } else {
> struct exynos_drm_panel_info *panel;
> struct drm_display_mode *mode = drm_mode_create(connector->dev);
> @@ -161,6 +161,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
> count = 1;
> }
>
> +out:
> + kfree(edid);
> return count;
> }
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> index b9e51bc..4606fac 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> @@ -148,8 +148,8 @@ struct exynos_drm_overlay {
> struct exynos_drm_display_ops {
> enum exynos_drm_output_type type;
> bool (*is_connected)(struct device *dev);
> - int (*get_edid)(struct device *dev, struct drm_connector *connector,
> - u8 *edid, int len);
> + struct edid *(*get_edid)(struct device *dev,
> + struct drm_connector *connector);
> void *(*get_panel)(struct device *dev);
> int (*check_timing)(struct device *dev, void *timing);
> int (*power_on)(struct device *dev, int mode);
<snip>
More information about the dri-devel
mailing list