From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH] drm: tda998x: Use drm_do_get_edid()
Date: Tue, 23 Dec 2014 11:46:43 +0200 [thread overview]
Message-ID: <1677822.kE7z07TL2m@avalon> (raw)
In-Reply-To: <1417028655-15933-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com>
Hi Russell,
On Wednesday 26 November 2014 21:04:15 Laurent Pinchart wrote:
> Replace the internal EDID read implementation by a call to the new EDID
> read core function.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Do you plan to take this patch in your tree or should I send a pull request to
Dave directly ?
> ---
> drivers/gpu/drm/i2c/tda998x_drv.c | 86 +++++++-----------------------------
> 1 file changed, 18 insertions(+), 68 deletions(-)
>
> This patch has been compile-tested only as I lack test hardware. It depends
> on "[PATCH v4 6/9] drm: Decouple EDID parsing from I2C adapter" previously
> posted to the dri-devel mailing list.
>
> diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c
> b/drivers/gpu/drm/i2c/tda998x_drv.c index d4762799351d..a267a78a0d0a 100644
> --- a/drivers/gpu/drm/i2c/tda998x_drv.c
> +++ b/drivers/gpu/drm/i2c/tda998x_drv.c
> @@ -1011,8 +1011,9 @@ tda998x_encoder_detect(struct tda998x_priv *priv)
> connector_status_disconnected;
> }
>
> -static int read_edid_block(struct tda998x_priv *priv, uint8_t *buf, int
> blk) +static int read_edid_block(void *data, u8 *buf, unsigned int blk,
> size_t length) {
> + struct tda998x_priv *priv = data;
> uint8_t offset, segptr;
> int ret, i;
>
> @@ -1056,8 +1057,8 @@ static int read_edid_block(struct tda998x_priv *priv,
> uint8_t *buf, int blk) return -ETIMEDOUT;
> }
>
> - ret = reg_read_range(priv, REG_EDID_DATA_0, buf, EDID_LENGTH);
> - if (ret != EDID_LENGTH) {
> + ret = reg_read_range(priv, REG_EDID_DATA_0, buf, length);
> + if (ret != length) {
> dev_err(&priv->hdmi->dev, "failed to read edid block %d: %d\n",
> blk, ret);
> return ret;
> @@ -1066,82 +1067,31 @@ static int read_edid_block(struct tda998x_priv
> *priv, uint8_t *buf, int blk) return 0;
> }
>
> -static uint8_t *do_get_edid(struct tda998x_priv *priv)
> +static int
> +tda998x_encoder_get_modes(struct tda998x_priv *priv,
> + struct drm_connector *connector)
> {
> - int j, valid_extensions = 0;
> - uint8_t *block, *new;
> - bool print_bad_edid = drm_debug & DRM_UT_KMS;
> -
> - if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
> - return NULL;
> + struct edid *edid;
> + int n;
>
> if (priv->rev == TDA19988)
> reg_clear(priv, REG_TX4, TX4_PD_RAM);
>
> - /* base block fetch */
> - if (read_edid_block(priv, block, 0))
> - goto fail;
> -
> - if (!drm_edid_block_valid(block, 0, print_bad_edid))
> - goto fail;
> -
> - /* if there's no extensions, we're done */
> - if (block[0x7e] == 0)
> - goto done;
> -
> - new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
> - if (!new)
> - goto fail;
> - block = new;
> -
> - for (j = 1; j <= block[0x7e]; j++) {
> - uint8_t *ext_block = block + (valid_extensions + 1) * EDID_LENGTH;
> - if (read_edid_block(priv, ext_block, j))
> - goto fail;
> -
> - if (!drm_edid_block_valid(ext_block, j, print_bad_edid))
> - goto fail;
> + edid = drm_do_get_edid(connector, read_edid_block, priv);
>
> - valid_extensions++;
> - }
> -
> - if (valid_extensions != block[0x7e]) {
> - block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
> - block[0x7e] = valid_extensions;
> - new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH,
GFP_KERNEL);
> - if (!new)
> - goto fail;
> - block = new;
> - }
> -
> -done:
> if (priv->rev == TDA19988)
> reg_set(priv, REG_TX4, TX4_PD_RAM);
>
> - return block;
> -
> -fail:
> - if (priv->rev == TDA19988)
> - reg_set(priv, REG_TX4, TX4_PD_RAM);
> - dev_warn(&priv->hdmi->dev, "failed to read EDID\n");
> - kfree(block);
> - return NULL;
> -}
> -
> -static int
> -tda998x_encoder_get_modes(struct tda998x_priv *priv,
> - struct drm_connector *connector)
> -{
> - struct edid *edid = (struct edid *)do_get_edid(priv);
> - int n = 0;
> -
> - if (edid) {
> - drm_mode_connector_update_edid_property(connector, edid);
> - n = drm_add_edid_modes(connector, edid);
> - priv->is_hdmi_sink = drm_detect_hdmi_monitor(edid);
> - kfree(edid);
> + if (!edid) {
> + dev_warn(&priv->hdmi->dev, "failed to read EDID\n");
> + return 0;
> }
>
> + drm_mode_connector_update_edid_property(connector, edid);
> + n = drm_add_edid_modes(connector, edid);
> + priv->is_hdmi_sink = drm_detect_hdmi_monitor(edid);
> + kfree(edid);
> +
> return n;
> }
--
Regards,
Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
prev parent reply other threads:[~2014-12-23 9:46 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-26 19:04 [PATCH] drm: tda998x: Use drm_do_get_edid() Laurent Pinchart
2014-11-26 19:59 ` Rob Clark
2014-11-27 10:42 ` Jean-Francois Moine
2014-12-23 9:46 ` Laurent Pinchart [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1677822.kE7z07TL2m@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=rmk+kernel@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.