From 5a16cd5b910d0220666032216475b5208cfd471d Mon Sep 17 00:00:00 2001 From: Andrew Jackson Date: Fri, 29 Aug 2014 15:54:53 +0100 Subject: drm: i2c: tda998x: Select appropriate sound clock rate The average CTS value is based upon the (pixel) clock rate. Signed-off-by: Andrew Jackson Signed-off-by: Jon Medhurst --- drivers/gpu/drm/i2c/tda998x_codec.c | 1 + drivers/gpu/drm/i2c/tda998x_drv.c | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i2c/tda998x_codec.c b/drivers/gpu/drm/i2c/tda998x_codec.c index 4f1d7590e267..c84d2b58f42d 100644 --- a/drivers/gpu/drm/i2c/tda998x_codec.c +++ b/drivers/gpu/drm/i2c/tda998x_codec.c @@ -117,6 +117,7 @@ static int tda_hw_params(struct snd_pcm_substream *substream, tda998x_audio_start(priv, 0); return 0; } + priv->params.audio_sample_rate = params_rate(params); priv->params.audio_format = dai->id; priv->audio_sample_format = params_format(params); priv->params.audio_cfg = diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index a943d490b6b2..831e3d7f5abc 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c @@ -652,7 +652,7 @@ tda998x_configure_audio(struct tda998x_priv *priv, struct drm_display_mode *mode, struct tda998x_encoder_params *p) { uint8_t buf[6], clksel_aip, clksel_fs, cts_n, adiv, aclk; - uint32_t n; + uint32_t n, cts; /* Enable audio ports */ reg_write(priv, REG_ENA_AP, p->audio_cfg); @@ -723,9 +723,25 @@ tda998x_configure_audio(struct tda998x_priv *priv, n = 128 * p->audio_sample_rate / 1000; /* Write the CTS and N values */ - buf[0] = 0x44; - buf[1] = 0x42; - buf[2] = 0x01; + if ((n > 0) && (mode->clock > 0)) { + /* + * The average CTS value is calculated as: + * + * fTMDS * n / (128 * fs) + * + * which equates to: + * + * fTMDS / 1000 + * + * for non-coherent clocks. + */ + cts = mode->clock; + } else { + cts = 82500; + } + buf[0] = cts; + buf[1] = cts >> 8; + buf[2] = cts >> 16; buf[3] = n; buf[4] = n >> 8; buf[5] = n >> 16; -- cgit v1.2.3