Message ID | 1375741218-10225-2-git-send-email-sebastian.hesselbarth@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Aug 06, 2013 at 12:20:11AM +0200, Sebastian Hesselbarth wrote: > From: Russell King <rmk+kernel@arm.linux.org.uk> > > TDA19988 devices need their RAM enabled in order to read EDID > information. Add support for this. > > Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> > Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> There was some debate about whether this is needed or not. It seems that if I don't run the NXP driver, it isn't needed, but if I have run the NXP driver, then yes it is. As it seems to do no harm, I think it's fine to be submitted.
On Wed, Aug 14, 2013 at 8:16 AM, Russell King - ARM Linux <linux@arm.linux.org.uk> wrote: > On Tue, Aug 06, 2013 at 12:20:11AM +0200, Sebastian Hesselbarth wrote: >> From: Russell King <rmk+kernel@arm.linux.org.uk> >> >> TDA19988 devices need their RAM enabled in order to read EDID >> information. Add support for this. >> >> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> >> Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> > > There was some debate about whether this is needed or not. It seems that > if I don't run the NXP driver, it isn't needed, but if I have run the > NXP driver, then yes it is. As it seems to do no harm, I think it's fine > to be submitted. just fwiw, I had noticed before that (at least on the beaglebone-black), nxp doesn't necessarily get reset when doing a warm reboot. So booting a kernel w/ NXP driver, and then rebooting w/ upstream kernel and tda998x should probably hit this same scenario. Better to not assume too much about the state of the tda when the driver is loaded, so I think this patch is a good idea. Signed-off-by: Rob Clark <robdclark@gmail.com> BR, -R
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index e68b58a..d71c408 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c @@ -229,6 +229,8 @@ struct tda998x_priv { /* Page 12h: HDCP and OTP */ #define REG_TX3 REG(0x12, 0x9a) /* read/write */ +#define REG_TX4 REG(0x12, 0x9b) /* read/write */ +# define TX4_PD_RAM (1 << 1) #define REG_TX33 REG(0x12, 0xb8) /* read/write */ # define TX33_HDMI (1 << 1) @@ -673,6 +675,7 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk) static uint8_t * do_get_edid(struct drm_encoder *encoder) { + struct tda998x_priv *priv = to_tda998x_priv(encoder); int j = 0, valid_extensions = 0; uint8_t *block, *new; bool print_bad_edid = drm_debug & DRM_UT_KMS; @@ -680,6 +683,9 @@ do_get_edid(struct drm_encoder *encoder) if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) return NULL; + if (priv->rev == TDA19988) + reg_clear(encoder, REG_TX4, TX4_PD_RAM); + /* base block fetch */ if (read_edid_block(encoder, block, 0)) goto fail; @@ -689,7 +695,7 @@ do_get_edid(struct drm_encoder *encoder) /* if there's no extensions, we're done */ if (block[0x7e] == 0) - return block; + goto done; new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL); if (!new) @@ -716,9 +722,15 @@ do_get_edid(struct drm_encoder *encoder) block = new; } +done: + if (priv->rev == TDA19988) + reg_set(encoder, REG_TX4, TX4_PD_RAM); + return block; fail: + if (priv->rev == TDA19988) + reg_set(encoder, REG_TX4, TX4_PD_RAM); dev_warn(encoder->dev->dev, "failed to read EDID\n"); kfree(block); return NULL;