From mboxrd@z Thu Jan 1 00:00:00 1970 From: moinejf@free.fr (Jean-Francois Moine) Date: Thu, 9 Jan 2014 12:04:48 +0100 Subject: [PATCH v2 15/28] drm/i2c: tda998x: use the tda998x video format when cea mode Message-ID: <20140109120448.24d89eba@armhf> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This patch uses the tda998x video format tied to the CEA mode. This reduces the number of i2c exchanges. Signed-off-by: Jean-Francois Moine --- drivers/gpu/drm/i2c/tda998x_drv.c | 143 +++++++++++++++++---- 1 file changed, 118 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index 0cae820..91bd4e8 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c @@ -344,6 +344,85 @@ struct tda998x_priv { #define TDA19989N2 0x0202 #define TDA19988 0x0301 +/* REG_VIDFORMAT values */ +enum e_vfmt { /* cea mode */ + E_VFMT_INVALID = 0xff, + E_VFMT_640x480p_60Hz = 0, /* 1 */ + E_VFMT_720x480p_60Hz, /* 2/3 */ + E_VFMT_1280x720p_60Hz, /* 4 */ + E_VFMT_1920x1080i_60Hz, /* 5 */ + E_VFMT_720x480i_60Hz, /* 6/7 */ + E_VFMT_720x240p_60Hz, /*NT 8/9 */ + E_VFMT_1920x1080p_60Hz, /* 16 */ + E_VFMT_720x576p_50Hz, /* 17/18 */ + E_VFMT_1280x720p_50Hz, /* 19 */ + E_VFMT_1920x1080i_50Hz, /* 20 */ + E_VFMT_720x576i_50Hz, /* 21/22 */ + E_VFMT_720x288p_50Hz, /* 23/24 */ + E_VFMT_1920x1080p_50Hz, /* 31 */ + E_VFMT_1920x1080p_24Hz, /* 32 */ + E_VFMT_1440x576p_50Hz, /* 29/30 */ + E_VFMT_1440x480p_60Hz, /* 14/15 */ + E_VFMT_2880x480p_60Hz, /* 35/36 */ + E_VFMT_2880x576p_50Hz, /* 37/38 */ + E_VFMT_2880x480i_60Hz, /* 10/11*/ + E_VFMT_2880x480i_60Hz_PR2, /* 10/11*/ + E_VFMT_2880x480i_60Hz_PR4, /* 10/11*/ + E_VFMT_2880x576i_50Hz, /* 25/26 */ + E_VFMT_2880x576i_50Hz_PR2, /* 25/26 */ + E_VFMT_720x480p_60Hz_FP, /* 2/3 FP */ + E_VFMT_1280x720p_60Hz_FP, /* 4 FP */ + E_VFMT_720x576p_50Hz_FP, /* 17/18 FP */ + E_VFMT_1280x720p_50Hz_FP, /* 19 FP */ + E_VFMT_1920x1080p_24Hz_FP, /* 32 FP */ + E_VFMT_1920x1080p_25Hz_FP, /* 33 FP */ + E_VFMT_1920x1080p_30Hz_FP, /* 34 FP */ + E_VFMT_1920x1080i_60Hz_FP, /* 5 FP */ + E_VFMT_1920x1080i_50Hz_FP, /* 20 FP */ +}; +/* cea mode to VIDFORMAT register */ +static u8 cea2vid[] = { + E_VFMT_INVALID, /* 00 */ + E_VFMT_640x480p_60Hz, /* 01_640x480p_60Hz */ + E_VFMT_720x480p_60Hz, /* 02_720x480p_60Hz */ + E_VFMT_720x480p_60Hz, /* 03_720x480p_60Hz */ + E_VFMT_1280x720p_60Hz, /* 04_1280x720p_60Hz */ + E_VFMT_1920x1080i_60Hz, /* 05_1920x1080i_60Hz */ + E_VFMT_720x480i_60Hz, /* 06_720x480i_60Hz */ + E_VFMT_720x480i_60Hz, /* 07_720x480i_60Hz */ + E_VFMT_720x240p_60Hz, /* 08_720x240p_60Hz */ + E_VFMT_720x240p_60Hz, /* 09_720x240p_60Hz */ + E_VFMT_2880x480i_60Hz_PR4, /* 10_720x480i_60Hz */ + E_VFMT_2880x480i_60Hz_PR4, /* 11_720x480i_60Hz */ + E_VFMT_INVALID, /* 12 */ + E_VFMT_INVALID, /* 13 */ + E_VFMT_1440x480p_60Hz, /* 14_1440x480p_60Hz */ + E_VFMT_1440x480p_60Hz, /* 15_1440x480p_60Hz */ + E_VFMT_1920x1080p_60Hz, /* 16_1920x1080p_60Hz */ + E_VFMT_720x576p_50Hz, /* 17_720x576p_50Hz */ + E_VFMT_720x576p_50Hz, /* 18_720x576p_50Hz */ + E_VFMT_1280x720p_50Hz, /* 19_1280x720p_50Hz */ + E_VFMT_1920x1080i_50Hz, /* 20_1920x1080i_50Hz */ + E_VFMT_720x576i_50Hz, /* 21_720x576i_50Hz */ + E_VFMT_720x576i_50Hz, /* 22_720x576i_50Hz */ + E_VFMT_720x288p_50Hz, /* 23_720x288p_50Hz */ + E_VFMT_720x288p_50Hz, /* 24_720x288p_50Hz */ + E_VFMT_2880x576i_50Hz, /* 25_720x576i_50Hz */ + E_VFMT_2880x576i_50Hz, /* 26_720x576i_50Hz */ + E_VFMT_INVALID, /* 27 */ + E_VFMT_INVALID, /* 28 */ + E_VFMT_1440x576p_50Hz, /* 29_1440x576p_50Hz */ + E_VFMT_1440x576p_50Hz, /* 30_1440x576p_50Hz */ + E_VFMT_1920x1080p_50Hz, /* 31_1920x1080p_50Hz */ + E_VFMT_1920x1080p_24Hz, /* 32_1920x1080p_24Hz */ + E_VFMT_INVALID, /* 33_1920x1080p_25Hz */ + E_VFMT_INVALID, /* 34_1920x1080p_30Hz */ + E_VFMT_2880x480p_60Hz, /* 35_2880x480p_60Hz */ + E_VFMT_2880x480p_60Hz, /* 36_2880x480p_60Hz */ + E_VFMT_720x576p_50Hz, /* 37_2880x576p_50Hz */ + E_VFMT_720x576p_50Hz, /* 38_2880x576p_50Hz */ +}; + static void cec_write(struct tda998x_priv *priv, uint16_t addr, uint8_t val) { @@ -723,6 +802,7 @@ tda998x_configure_audio(struct tda998x_priv *priv, /* DRM encoder functions */ +/* this function is not called when no info->platform (DT support) */ static void tda998x_encoder_set_config(struct drm_encoder *encoder, void *params) { @@ -826,6 +906,7 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, uint16_t vwin2_line_s, vwin2_line_e; uint16_t de_pix_s, de_pix_e; uint8_t reg, div, rep; + u8 cea_mode; mode = adjusted_mode; @@ -946,31 +1027,43 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, reg |= VIP_CNTRL_3_V_TGL; reg_write(priv, REG_VIP_CNTRL_3, reg); - reg_write(priv, REG_VIDFORMAT, 0x00); - reg_write16(priv, REG_REFPIX_MSB, ref_pix); - reg_write16(priv, REG_REFLINE_MSB, ref_line); - reg_write16(priv, REG_NPIX_MSB, n_pix); - reg_write16(priv, REG_NLINE_MSB, n_line); - reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s); - reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); - reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e); - reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e); - reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s); - reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); - reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e); - reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e); - reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s); - reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e); - reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s); - reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e); - reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s); - reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e); - reg_write16(priv, REG_DE_START_MSB, de_pix_s); - reg_write16(priv, REG_DE_STOP_MSB, de_pix_e); - - if (priv->rev == TDA19988) { - /* let incoming pixels fill the active space (if any) */ - reg_write(priv, REG_ENABLE_SPACE, 0x01); + /* + * if one of the cea modes, set the video format + * otherwise, set all values + */ + cea_mode = drm_match_cea_mode(mode); + if (cea_mode >= ARRAY_SIZE(cea2vid)) + cea_mode = 0; + if (cea2vid[cea_mode] != E_VFMT_INVALID) { + reg_write(priv, REG_VIDFORMAT, cea2vid[cea_mode]); + } else { + reg_write(priv, REG_VIDFORMAT, 0x00); + reg_write16(priv, REG_REFPIX_MSB, ref_pix); + reg_write16(priv, REG_REFLINE_MSB, ref_line); + reg_write16(priv, REG_NPIX_MSB, n_pix); + reg_write16(priv, REG_NLINE_MSB, n_line); + reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s); + reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); + reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e); + reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e); + reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s); + reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); + reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e); + reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e); + reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s); + reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e); + reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s); + reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e); + reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s); + reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e); + reg_write16(priv, REG_DE_START_MSB, de_pix_s); + reg_write16(priv, REG_DE_STOP_MSB, de_pix_e); + + + if (priv->rev == TDA19988) { + /* let incoming pixels fill the active space (if any) */ + reg_write(priv, REG_ENABLE_SPACE, 0x01); + } } /* must be last register set: */ -- Ken ar c'henta? | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/ From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean-Francois Moine Subject: [PATCH v2 15/28] drm/i2c: tda998x: use the tda998x video format when cea mode Date: Thu, 9 Jan 2014 12:04:48 +0100 Message-ID: <20140109120448.24d89eba@armhf> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from smtp1-g21.free.fr (smtp1-g21.free.fr [212.27.42.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6D609FBD2A for ; Thu, 9 Jan 2014 03:11:24 -0800 (PST) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org List-Id: dri-devel@lists.freedesktop.org VGhpcyBwYXRjaCB1c2VzIHRoZSB0ZGE5OTh4IHZpZGVvIGZvcm1hdCB0aWVkIHRvIHRoZSBDRUEg bW9kZS4KVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgaTJjIGV4Y2hhbmdlcy4KClNpZ25lZC1v ZmYtYnk6IEplYW4tRnJhbmNvaXMgTW9pbmUgPG1vaW5lamZAZnJlZS5mcj4KLS0tCiBkcml2ZXJz L2dwdS9kcm0vaTJjL3RkYTk5OHhfZHJ2LmMgICB8IDE0MyArKysrKysrKysrKysrKysrKy0tLS0K IDEgZmlsZSBjaGFuZ2VkLCAxMTggaW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2kyYy90ZGE5OTh4X2Rydi5jIGIvZHJpdmVycy9ncHUv ZHJtL2kyYy90ZGE5OTh4X2Rydi5jCmluZGV4IDBjYWU4MjAuLjkxYmQ0ZTggMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pMmMvdGRhOTk4eF9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTJjL3RkYTk5OHhfZHJ2LmMKQEAgLTM0NCw2ICszNDQsODUgQEAgc3RydWN0IHRkYTk5OHhfcHJp diB7CiAjZGVmaW5lIFREQTE5OTg5TjIgICAgICAgICAgICAgICAgMHgwMjAyCiAjZGVmaW5lIFRE QTE5OTg4ICAgICAgICAgICAgICAgICAgMHgwMzAxCiAKKy8qIFJFR19WSURGT1JNQVQgdmFsdWVz ICovCitlbnVtIGVfdmZtdCB7CQkJCS8qIGNlYSBtb2RlICovCisJRV9WRk1UX0lOVkFMSUQgPSAw eGZmLAorCUVfVkZNVF82NDB4NDgwcF82MEh6ID0gMCwJLyogMSAqLworCUVfVkZNVF83MjB4NDgw cF82MEh6LAkJLyogMi8zICovCisJRV9WRk1UXzEyODB4NzIwcF82MEh6LAkJLyogNCAqLworCUVf VkZNVF8xOTIweDEwODBpXzYwSHosCQkvKiA1ICovCisJRV9WRk1UXzcyMHg0ODBpXzYwSHosCQkv KiA2LzcgKi8KKwlFX1ZGTVRfNzIweDI0MHBfNjBIeiwJCS8qTlQgOC85ICovCisJRV9WRk1UXzE5 MjB4MTA4MHBfNjBIeiwJCS8qIDE2ICovCisJRV9WRk1UXzcyMHg1NzZwXzUwSHosCQkvKiAxNy8x OCAqLworCUVfVkZNVF8xMjgweDcyMHBfNTBIeiwJCS8qIDE5ICovCisJRV9WRk1UXzE5MjB4MTA4 MGlfNTBIeiwJCS8qIDIwICovCisJRV9WRk1UXzcyMHg1NzZpXzUwSHosCQkvKiAyMS8yMiAqLwor CUVfVkZNVF83MjB4Mjg4cF81MEh6LAkJLyogMjMvMjQgKi8KKwlFX1ZGTVRfMTkyMHgxMDgwcF81 MEh6LAkJLyogMzEgKi8KKwlFX1ZGTVRfMTkyMHgxMDgwcF8yNEh6LAkJLyogMzIgKi8KKwlFX1ZG TVRfMTQ0MHg1NzZwXzUwSHosCQkvKiAyOS8zMCAqLworCUVfVkZNVF8xNDQweDQ4MHBfNjBIeiwJ CS8qIDE0LzE1ICovCisJRV9WRk1UXzI4ODB4NDgwcF82MEh6LAkJLyogMzUvMzYgKi8KKwlFX1ZG TVRfMjg4MHg1NzZwXzUwSHosCQkvKiAzNy8zOCAqLworCUVfVkZNVF8yODgweDQ4MGlfNjBIeiwJ CS8qIDEwLzExKi8KKwlFX1ZGTVRfMjg4MHg0ODBpXzYwSHpfUFIyLAkvKiAxMC8xMSovCisJRV9W Rk1UXzI4ODB4NDgwaV82MEh6X1BSNCwJLyogMTAvMTEqLworCUVfVkZNVF8yODgweDU3NmlfNTBI eiwJCS8qIDI1LzI2ICovCisJRV9WRk1UXzI4ODB4NTc2aV81MEh6X1BSMiwJLyogMjUvMjYgKi8K KwlFX1ZGTVRfNzIweDQ4MHBfNjBIel9GUCwJLyogMi8zIEZQICovCisJRV9WRk1UXzEyODB4NzIw cF82MEh6X0ZQLAkvKiA0IEZQICovCisJRV9WRk1UXzcyMHg1NzZwXzUwSHpfRlAsCS8qIDE3LzE4 IEZQICovCisJRV9WRk1UXzEyODB4NzIwcF81MEh6X0ZQLAkvKiAxOSBGUCAqLworCUVfVkZNVF8x OTIweDEwODBwXzI0SHpfRlAsCS8qIDMyIEZQICovCisJRV9WRk1UXzE5MjB4MTA4MHBfMjVIel9G UCwJLyogMzMgRlAgKi8KKwlFX1ZGTVRfMTkyMHgxMDgwcF8zMEh6X0ZQLAkvKiAzNCBGUCAqLwor CUVfVkZNVF8xOTIweDEwODBpXzYwSHpfRlAsCS8qIDUgRlAgKi8KKwlFX1ZGTVRfMTkyMHgxMDgw aV81MEh6X0ZQLAkvKiAyMCBGUCAqLworfTsKKy8qIGNlYSBtb2RlIHRvIFZJREZPUk1BVCByZWdp c3RlciAqLworc3RhdGljIHU4IGNlYTJ2aWRbXSA9IHsKKwlFX1ZGTVRfSU5WQUxJRCwJCS8qIDAw ICovCisJRV9WRk1UXzY0MHg0ODBwXzYwSHosCS8qIDAxXzY0MHg0ODBwXzYwSHogKi8KKwlFX1ZG TVRfNzIweDQ4MHBfNjBIeiwJLyogMDJfNzIweDQ4MHBfNjBIeiAqLworCUVfVkZNVF83MjB4NDgw cF82MEh6LAkvKiAwM183MjB4NDgwcF82MEh6ICovCisJRV9WRk1UXzEyODB4NzIwcF82MEh6LAkv KiAwNF8xMjgweDcyMHBfNjBIeiAqLworCUVfVkZNVF8xOTIweDEwODBpXzYwSHosCS8qIDA1XzE5 MjB4MTA4MGlfNjBIeiAqLworCUVfVkZNVF83MjB4NDgwaV82MEh6LAkvKiAwNl83MjB4NDgwaV82 MEh6ICovCisJRV9WRk1UXzcyMHg0ODBpXzYwSHosCS8qIDA3XzcyMHg0ODBpXzYwSHogKi8KKwlF X1ZGTVRfNzIweDI0MHBfNjBIeiwJLyogMDhfNzIweDI0MHBfNjBIeiAqLworCUVfVkZNVF83MjB4 MjQwcF82MEh6LAkvKiAwOV83MjB4MjQwcF82MEh6ICovCisJRV9WRk1UXzI4ODB4NDgwaV82MEh6 X1BSNCwgLyogMTBfNzIweDQ4MGlfNjBIeiAqLworCUVfVkZNVF8yODgweDQ4MGlfNjBIel9QUjQs IC8qIDExXzcyMHg0ODBpXzYwSHogKi8KKwlFX1ZGTVRfSU5WQUxJRCwJCS8qIDEyICovCisJRV9W Rk1UX0lOVkFMSUQsCQkvKiAxMyAqLworCUVfVkZNVF8xNDQweDQ4MHBfNjBIeiwJLyogMTRfMTQ0 MHg0ODBwXzYwSHogKi8KKwlFX1ZGTVRfMTQ0MHg0ODBwXzYwSHosCS8qIDE1XzE0NDB4NDgwcF82 MEh6ICovCisJRV9WRk1UXzE5MjB4MTA4MHBfNjBIeiwJLyogMTZfMTkyMHgxMDgwcF82MEh6ICov CisJRV9WRk1UXzcyMHg1NzZwXzUwSHosCS8qIDE3XzcyMHg1NzZwXzUwSHogKi8KKwlFX1ZGTVRf NzIweDU3NnBfNTBIeiwJLyogMThfNzIweDU3NnBfNTBIeiAqLworCUVfVkZNVF8xMjgweDcyMHBf NTBIeiwJLyogMTlfMTI4MHg3MjBwXzUwSHogKi8KKwlFX1ZGTVRfMTkyMHgxMDgwaV81MEh6LAkv KiAyMF8xOTIweDEwODBpXzUwSHogKi8KKwlFX1ZGTVRfNzIweDU3NmlfNTBIeiwJLyogMjFfNzIw eDU3NmlfNTBIeiAqLworCUVfVkZNVF83MjB4NTc2aV81MEh6LAkvKiAyMl83MjB4NTc2aV81MEh6 ICovCisJRV9WRk1UXzcyMHgyODhwXzUwSHosCS8qIDIzXzcyMHgyODhwXzUwSHogKi8KKwlFX1ZG TVRfNzIweDI4OHBfNTBIeiwJLyogMjRfNzIweDI4OHBfNTBIeiAqLworCUVfVkZNVF8yODgweDU3 NmlfNTBIeiwJLyogMjVfNzIweDU3NmlfNTBIeiAqLworCUVfVkZNVF8yODgweDU3NmlfNTBIeiwJ LyogMjZfNzIweDU3NmlfNTBIeiAqLworCUVfVkZNVF9JTlZBTElELAkJLyogMjcgKi8KKwlFX1ZG TVRfSU5WQUxJRCwJCS8qIDI4ICovCisJRV9WRk1UXzE0NDB4NTc2cF81MEh6LAkvKiAyOV8xNDQw eDU3NnBfNTBIeiAqLworCUVfVkZNVF8xNDQweDU3NnBfNTBIeiwJLyogMzBfMTQ0MHg1NzZwXzUw SHogKi8KKwlFX1ZGTVRfMTkyMHgxMDgwcF81MEh6LAkvKiAzMV8xOTIweDEwODBwXzUwSHogKi8K KwlFX1ZGTVRfMTkyMHgxMDgwcF8yNEh6LAkvKiAzMl8xOTIweDEwODBwXzI0SHogKi8KKwlFX1ZG TVRfSU5WQUxJRCwJCS8qIDMzXzE5MjB4MTA4MHBfMjVIeiAqLworCUVfVkZNVF9JTlZBTElELAkJ LyogMzRfMTkyMHgxMDgwcF8zMEh6ICovCisJRV9WRk1UXzI4ODB4NDgwcF82MEh6LAkvKiAzNV8y ODgweDQ4MHBfNjBIeiAqLworCUVfVkZNVF8yODgweDQ4MHBfNjBIeiwJLyogMzZfMjg4MHg0ODBw XzYwSHogKi8KKwlFX1ZGTVRfNzIweDU3NnBfNTBIeiwJLyogMzdfMjg4MHg1NzZwXzUwSHogKi8K KwlFX1ZGTVRfNzIweDU3NnBfNTBIeiwJLyogMzhfMjg4MHg1NzZwXzUwSHogKi8KK307CisKIHN0 YXRpYyB2b2lkCiBjZWNfd3JpdGUoc3RydWN0IHRkYTk5OHhfcHJpdiAqcHJpdiwgdWludDE2X3Qg YWRkciwgdWludDhfdCB2YWwpCiB7CkBAIC03MjMsNiArODAyLDcgQEAgdGRhOTk4eF9jb25maWd1 cmVfYXVkaW8oc3RydWN0IHRkYTk5OHhfcHJpdiAqcHJpdiwKIAogLyogRFJNIGVuY29kZXIgZnVu Y3Rpb25zICovCiAKKy8qIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCB3aGVuIG5vIGluZm8t PnBsYXRmb3JtIChEVCBzdXBwb3J0KSAqLwogc3RhdGljIHZvaWQKIHRkYTk5OHhfZW5jb2Rlcl9z ZXRfY29uZmlnKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlciwgdm9pZCAqcGFyYW1zKQogewpA QCAtODI2LDYgKzkwNiw3IEBAIHRkYTk5OHhfZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIsCiAJdWludDE2X3QgdndpbjJfbGluZV9zLCB2d2luMl9saW5lX2U7CiAJ dWludDE2X3QgZGVfcGl4X3MsIGRlX3BpeF9lOwogCXVpbnQ4X3QgcmVnLCBkaXYsIHJlcDsKKwl1 OCBjZWFfbW9kZTsKIAogCW1vZGUgPSBhZGp1c3RlZF9tb2RlOwogCkBAIC05NDYsMzEgKzEwMjcs NDMgQEAgdGRhOTk4eF9lbmNvZGVyX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rl ciwKIAkJcmVnIHw9IFZJUF9DTlRSTF8zX1ZfVEdMOwogCXJlZ193cml0ZShwcml2LCBSRUdfVklQ X0NOVFJMXzMsIHJlZyk7CiAKLQlyZWdfd3JpdGUocHJpdiwgUkVHX1ZJREZPUk1BVCwgMHgwMCk7 Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1JFRlBJWF9NU0IsIHJlZl9waXgpOwotCXJlZ193cml0 ZTE2KHByaXYsIFJFR19SRUZMSU5FX01TQiwgcmVmX2xpbmUpOwotCXJlZ193cml0ZTE2KHByaXYs IFJFR19OUElYX01TQiwgbl9waXgpOwotCXJlZ193cml0ZTE2KHByaXYsIFJFR19OTElORV9NU0Is IG5fbGluZSk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX0xJTkVfU1RSVF8xX01TQiwgdnMx X2xpbmVfcyk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX1BJWF9TVFJUXzFfTVNCLCB2czFf cGl4X3MpOwotCXJlZ193cml0ZTE2KHByaXYsIFJFR19WU19MSU5FX0VORF8xX01TQiwgdnMxX2xp bmVfZSk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX1BJWF9FTkRfMV9NU0IsIHZzMV9waXhf ZSk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX0xJTkVfU1RSVF8yX01TQiwgdnMyX2xpbmVf cyk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX1BJWF9TVFJUXzJfTVNCLCB2czJfcGl4X3Mp OwotCXJlZ193cml0ZTE2KHByaXYsIFJFR19WU19MSU5FX0VORF8yX01TQiwgdnMyX2xpbmVfZSk7 Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX1BJWF9FTkRfMl9NU0IsIHZzMl9waXhfZSk7Ci0J cmVnX3dyaXRlMTYocHJpdiwgUkVHX0hTX1BJWF9TVEFSVF9NU0IsIGhzX3BpeF9zKTsKLQlyZWdf d3JpdGUxNihwcml2LCBSRUdfSFNfUElYX1NUT1BfTVNCLCBoc19waXhfZSk7Ci0JcmVnX3dyaXRl MTYocHJpdiwgUkVHX1ZXSU5fU1RBUlRfMV9NU0IsIHZ3aW4xX2xpbmVfcyk7Ci0JcmVnX3dyaXRl MTYocHJpdiwgUkVHX1ZXSU5fRU5EXzFfTVNCLCB2d2luMV9saW5lX2UpOwotCXJlZ193cml0ZTE2 KHByaXYsIFJFR19WV0lOX1NUQVJUXzJfTVNCLCB2d2luMl9saW5lX3MpOwotCXJlZ193cml0ZTE2 KHByaXYsIFJFR19WV0lOX0VORF8yX01TQiwgdndpbjJfbGluZV9lKTsKLQlyZWdfd3JpdGUxNihw cml2LCBSRUdfREVfU1RBUlRfTVNCLCBkZV9waXhfcyk7Ci0JcmVnX3dyaXRlMTYocHJpdiwgUkVH X0RFX1NUT1BfTVNCLCBkZV9waXhfZSk7Ci0KLQlpZiAocHJpdi0+cmV2ID09IFREQTE5OTg4KSB7 Ci0JCS8qIGxldCBpbmNvbWluZyBwaXhlbHMgZmlsbCB0aGUgYWN0aXZlIHNwYWNlIChpZiBhbnkp ICovCi0JCXJlZ193cml0ZShwcml2LCBSRUdfRU5BQkxFX1NQQUNFLCAweDAxKTsKKwkvKgorCSAq IGlmIG9uZSBvZiB0aGUgY2VhIG1vZGVzLCBzZXQgdGhlIHZpZGVvIGZvcm1hdAorCSAqIG90aGVy d2lzZSwgc2V0IGFsbCB2YWx1ZXMKKwkgKi8KKwljZWFfbW9kZSA9IGRybV9tYXRjaF9jZWFfbW9k ZShtb2RlKTsKKwlpZiAoY2VhX21vZGUgPj0gQVJSQVlfU0laRShjZWEydmlkKSkKKwkJY2VhX21v ZGUgPSAwOworCWlmIChjZWEydmlkW2NlYV9tb2RlXSAhPSBFX1ZGTVRfSU5WQUxJRCkgeworCQly ZWdfd3JpdGUocHJpdiwgUkVHX1ZJREZPUk1BVCwgY2VhMnZpZFtjZWFfbW9kZV0pOworCX0gZWxz ZSB7CisJCXJlZ193cml0ZShwcml2LCBSRUdfVklERk9STUFULCAweDAwKTsKKwkJcmVnX3dyaXRl MTYocHJpdiwgUkVHX1JFRlBJWF9NU0IsIHJlZl9waXgpOworCQlyZWdfd3JpdGUxNihwcml2LCBS RUdfUkVGTElORV9NU0IsIHJlZl9saW5lKTsKKwkJcmVnX3dyaXRlMTYocHJpdiwgUkVHX05QSVhf TVNCLCBuX3BpeCk7CisJCXJlZ193cml0ZTE2KHByaXYsIFJFR19OTElORV9NU0IsIG5fbGluZSk7 CisJCXJlZ193cml0ZTE2KHByaXYsIFJFR19WU19MSU5FX1NUUlRfMV9NU0IsIHZzMV9saW5lX3Mp OworCQlyZWdfd3JpdGUxNihwcml2LCBSRUdfVlNfUElYX1NUUlRfMV9NU0IsIHZzMV9waXhfcyk7 CisJCXJlZ193cml0ZTE2KHByaXYsIFJFR19WU19MSU5FX0VORF8xX01TQiwgdnMxX2xpbmVfZSk7 CisJCXJlZ193cml0ZTE2KHByaXYsIFJFR19WU19QSVhfRU5EXzFfTVNCLCB2czFfcGl4X2UpOwor CQlyZWdfd3JpdGUxNihwcml2LCBSRUdfVlNfTElORV9TVFJUXzJfTVNCLCB2czJfbGluZV9zKTsK KwkJcmVnX3dyaXRlMTYocHJpdiwgUkVHX1ZTX1BJWF9TVFJUXzJfTVNCLCB2czJfcGl4X3MpOwor CQlyZWdfd3JpdGUxNihwcml2LCBSRUdfVlNfTElORV9FTkRfMl9NU0IsIHZzMl9saW5lX2UpOwor CQlyZWdfd3JpdGUxNihwcml2LCBSRUdfVlNfUElYX0VORF8yX01TQiwgdnMyX3BpeF9lKTsKKwkJ cmVnX3dyaXRlMTYocHJpdiwgUkVHX0hTX1BJWF9TVEFSVF9NU0IsIGhzX3BpeF9zKTsKKwkJcmVn X3dyaXRlMTYocHJpdiwgUkVHX0hTX1BJWF9TVE9QX01TQiwgaHNfcGl4X2UpOworCQlyZWdfd3Jp dGUxNihwcml2LCBSRUdfVldJTl9TVEFSVF8xX01TQiwgdndpbjFfbGluZV9zKTsKKwkJcmVnX3dy aXRlMTYocHJpdiwgUkVHX1ZXSU5fRU5EXzFfTVNCLCB2d2luMV9saW5lX2UpOworCQlyZWdfd3Jp dGUxNihwcml2LCBSRUdfVldJTl9TVEFSVF8yX01TQiwgdndpbjJfbGluZV9zKTsKKwkJcmVnX3dy aXRlMTYocHJpdiwgUkVHX1ZXSU5fRU5EXzJfTVNCLCB2d2luMl9saW5lX2UpOworCQlyZWdfd3Jp dGUxNihwcml2LCBSRUdfREVfU1RBUlRfTVNCLCBkZV9waXhfcyk7CisJCXJlZ193cml0ZTE2KHBy aXYsIFJFR19ERV9TVE9QX01TQiwgZGVfcGl4X2UpOworCisKKwkJaWYgKHByaXYtPnJldiA9PSBU REExOTk4OCkgeworCQkJLyogbGV0IGluY29taW5nIHBpeGVscyBmaWxsIHRoZSBhY3RpdmUgc3Bh Y2UgKGlmIGFueSkgKi8KKwkJCXJlZ193cml0ZShwcml2LCBSRUdfRU5BQkxFX1NQQUNFLCAweDAx KTsKKwkJfQogCX0KIAogCS8qIG11c3QgYmUgbGFzdCByZWdpc3RlciBzZXQ6ICovCi0tIApLZW4g YXIgYydoZW50YcOxCXwJICAgICAgKiogQnJlaXpoIGhhIExpbnV4IGF0YXYhICoqCkplZgkJfAkJ aHR0cDovL21vaW5lamYuZnJlZS5mci8KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755641AbaAILLa (ORCPT ); Thu, 9 Jan 2014 06:11:30 -0500 Received: from smtp1-g21.free.fr ([212.27.42.1]:36476 "EHLO smtp1-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751753AbaAILL0 convert rfc822-to-8bit (ORCPT ); Thu, 9 Jan 2014 06:11:26 -0500 Date: Thu, 9 Jan 2014 12:04:48 +0100 From: Jean-Francois Moine To: dri-devel@lists.freedesktop.org Cc: Dave Airlie , Rob Clark , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 15/28] drm/i2c: tda998x: use the tda998x video format when cea mode Message-ID: <20140109120448.24d89eba@armhf> X-Mailer: Claws Mail 3.9.3 (GTK+ 2.24.22; arm-unknown-linux-gnueabihf) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch uses the tda998x video format tied to the CEA mode. This reduces the number of i2c exchanges. Signed-off-by: Jean-Francois Moine --- drivers/gpu/drm/i2c/tda998x_drv.c | 143 +++++++++++++++++---- 1 file changed, 118 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index 0cae820..91bd4e8 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c @@ -344,6 +344,85 @@ struct tda998x_priv { #define TDA19989N2 0x0202 #define TDA19988 0x0301 +/* REG_VIDFORMAT values */ +enum e_vfmt { /* cea mode */ + E_VFMT_INVALID = 0xff, + E_VFMT_640x480p_60Hz = 0, /* 1 */ + E_VFMT_720x480p_60Hz, /* 2/3 */ + E_VFMT_1280x720p_60Hz, /* 4 */ + E_VFMT_1920x1080i_60Hz, /* 5 */ + E_VFMT_720x480i_60Hz, /* 6/7 */ + E_VFMT_720x240p_60Hz, /*NT 8/9 */ + E_VFMT_1920x1080p_60Hz, /* 16 */ + E_VFMT_720x576p_50Hz, /* 17/18 */ + E_VFMT_1280x720p_50Hz, /* 19 */ + E_VFMT_1920x1080i_50Hz, /* 20 */ + E_VFMT_720x576i_50Hz, /* 21/22 */ + E_VFMT_720x288p_50Hz, /* 23/24 */ + E_VFMT_1920x1080p_50Hz, /* 31 */ + E_VFMT_1920x1080p_24Hz, /* 32 */ + E_VFMT_1440x576p_50Hz, /* 29/30 */ + E_VFMT_1440x480p_60Hz, /* 14/15 */ + E_VFMT_2880x480p_60Hz, /* 35/36 */ + E_VFMT_2880x576p_50Hz, /* 37/38 */ + E_VFMT_2880x480i_60Hz, /* 10/11*/ + E_VFMT_2880x480i_60Hz_PR2, /* 10/11*/ + E_VFMT_2880x480i_60Hz_PR4, /* 10/11*/ + E_VFMT_2880x576i_50Hz, /* 25/26 */ + E_VFMT_2880x576i_50Hz_PR2, /* 25/26 */ + E_VFMT_720x480p_60Hz_FP, /* 2/3 FP */ + E_VFMT_1280x720p_60Hz_FP, /* 4 FP */ + E_VFMT_720x576p_50Hz_FP, /* 17/18 FP */ + E_VFMT_1280x720p_50Hz_FP, /* 19 FP */ + E_VFMT_1920x1080p_24Hz_FP, /* 32 FP */ + E_VFMT_1920x1080p_25Hz_FP, /* 33 FP */ + E_VFMT_1920x1080p_30Hz_FP, /* 34 FP */ + E_VFMT_1920x1080i_60Hz_FP, /* 5 FP */ + E_VFMT_1920x1080i_50Hz_FP, /* 20 FP */ +}; +/* cea mode to VIDFORMAT register */ +static u8 cea2vid[] = { + E_VFMT_INVALID, /* 00 */ + E_VFMT_640x480p_60Hz, /* 01_640x480p_60Hz */ + E_VFMT_720x480p_60Hz, /* 02_720x480p_60Hz */ + E_VFMT_720x480p_60Hz, /* 03_720x480p_60Hz */ + E_VFMT_1280x720p_60Hz, /* 04_1280x720p_60Hz */ + E_VFMT_1920x1080i_60Hz, /* 05_1920x1080i_60Hz */ + E_VFMT_720x480i_60Hz, /* 06_720x480i_60Hz */ + E_VFMT_720x480i_60Hz, /* 07_720x480i_60Hz */ + E_VFMT_720x240p_60Hz, /* 08_720x240p_60Hz */ + E_VFMT_720x240p_60Hz, /* 09_720x240p_60Hz */ + E_VFMT_2880x480i_60Hz_PR4, /* 10_720x480i_60Hz */ + E_VFMT_2880x480i_60Hz_PR4, /* 11_720x480i_60Hz */ + E_VFMT_INVALID, /* 12 */ + E_VFMT_INVALID, /* 13 */ + E_VFMT_1440x480p_60Hz, /* 14_1440x480p_60Hz */ + E_VFMT_1440x480p_60Hz, /* 15_1440x480p_60Hz */ + E_VFMT_1920x1080p_60Hz, /* 16_1920x1080p_60Hz */ + E_VFMT_720x576p_50Hz, /* 17_720x576p_50Hz */ + E_VFMT_720x576p_50Hz, /* 18_720x576p_50Hz */ + E_VFMT_1280x720p_50Hz, /* 19_1280x720p_50Hz */ + E_VFMT_1920x1080i_50Hz, /* 20_1920x1080i_50Hz */ + E_VFMT_720x576i_50Hz, /* 21_720x576i_50Hz */ + E_VFMT_720x576i_50Hz, /* 22_720x576i_50Hz */ + E_VFMT_720x288p_50Hz, /* 23_720x288p_50Hz */ + E_VFMT_720x288p_50Hz, /* 24_720x288p_50Hz */ + E_VFMT_2880x576i_50Hz, /* 25_720x576i_50Hz */ + E_VFMT_2880x576i_50Hz, /* 26_720x576i_50Hz */ + E_VFMT_INVALID, /* 27 */ + E_VFMT_INVALID, /* 28 */ + E_VFMT_1440x576p_50Hz, /* 29_1440x576p_50Hz */ + E_VFMT_1440x576p_50Hz, /* 30_1440x576p_50Hz */ + E_VFMT_1920x1080p_50Hz, /* 31_1920x1080p_50Hz */ + E_VFMT_1920x1080p_24Hz, /* 32_1920x1080p_24Hz */ + E_VFMT_INVALID, /* 33_1920x1080p_25Hz */ + E_VFMT_INVALID, /* 34_1920x1080p_30Hz */ + E_VFMT_2880x480p_60Hz, /* 35_2880x480p_60Hz */ + E_VFMT_2880x480p_60Hz, /* 36_2880x480p_60Hz */ + E_VFMT_720x576p_50Hz, /* 37_2880x576p_50Hz */ + E_VFMT_720x576p_50Hz, /* 38_2880x576p_50Hz */ +}; + static void cec_write(struct tda998x_priv *priv, uint16_t addr, uint8_t val) { @@ -723,6 +802,7 @@ tda998x_configure_audio(struct tda998x_priv *priv, /* DRM encoder functions */ +/* this function is not called when no info->platform (DT support) */ static void tda998x_encoder_set_config(struct drm_encoder *encoder, void *params) { @@ -826,6 +906,7 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, uint16_t vwin2_line_s, vwin2_line_e; uint16_t de_pix_s, de_pix_e; uint8_t reg, div, rep; + u8 cea_mode; mode = adjusted_mode; @@ -946,31 +1027,43 @@ tda998x_encoder_mode_set(struct drm_encoder *encoder, reg |= VIP_CNTRL_3_V_TGL; reg_write(priv, REG_VIP_CNTRL_3, reg); - reg_write(priv, REG_VIDFORMAT, 0x00); - reg_write16(priv, REG_REFPIX_MSB, ref_pix); - reg_write16(priv, REG_REFLINE_MSB, ref_line); - reg_write16(priv, REG_NPIX_MSB, n_pix); - reg_write16(priv, REG_NLINE_MSB, n_line); - reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s); - reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); - reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e); - reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e); - reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s); - reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); - reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e); - reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e); - reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s); - reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e); - reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s); - reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e); - reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s); - reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e); - reg_write16(priv, REG_DE_START_MSB, de_pix_s); - reg_write16(priv, REG_DE_STOP_MSB, de_pix_e); - - if (priv->rev == TDA19988) { - /* let incoming pixels fill the active space (if any) */ - reg_write(priv, REG_ENABLE_SPACE, 0x01); + /* + * if one of the cea modes, set the video format + * otherwise, set all values + */ + cea_mode = drm_match_cea_mode(mode); + if (cea_mode >= ARRAY_SIZE(cea2vid)) + cea_mode = 0; + if (cea2vid[cea_mode] != E_VFMT_INVALID) { + reg_write(priv, REG_VIDFORMAT, cea2vid[cea_mode]); + } else { + reg_write(priv, REG_VIDFORMAT, 0x00); + reg_write16(priv, REG_REFPIX_MSB, ref_pix); + reg_write16(priv, REG_REFLINE_MSB, ref_line); + reg_write16(priv, REG_NPIX_MSB, n_pix); + reg_write16(priv, REG_NLINE_MSB, n_line); + reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s); + reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s); + reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e); + reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e); + reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s); + reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s); + reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e); + reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e); + reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s); + reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e); + reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s); + reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e); + reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s); + reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e); + reg_write16(priv, REG_DE_START_MSB, de_pix_s); + reg_write16(priv, REG_DE_STOP_MSB, de_pix_e); + + + if (priv->rev == TDA19988) { + /* let incoming pixels fill the active space (if any) */ + reg_write(priv, REG_ENABLE_SPACE, 0x01); + } } /* must be last register set: */ -- Ken ar c'hentaƱ | ** Breizh ha Linux atav! ** Jef | http://moinejf.free.fr/