From a3dec1c8cc2b3de7116cede7aa7b2000b800a70d Mon Sep 17 00:00:00 2001 From: Vladimir Barinov Date: Thu, 8 Nov 2018 21:34:37 +0300 Subject: [PATCH 081/122] lvds: ti960: fix frame sync time for different ref clock This fixes frame sync signal for different reference clock Signed-off-by: Vladimir Barinov --- drivers/media/i2c/soc_camera/ti9x4.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/drivers/media/i2c/soc_camera/ti9x4.c b/drivers/media/i2c/soc_camera/ti9x4.c index e36ecdb..effcf6c 100644 --- a/drivers/media/i2c/soc_camera/ti9x4.c +++ b/drivers/media/i2c/soc_camera/ti9x4.c @@ -123,6 +123,7 @@ static void ti9x4_read_chipid(struct i2c_client *client) static void ti9x4_initial_setup(struct i2c_client *client) { struct ti9x4_priv *priv = i2c_get_clientdata(client); + int fs_time = 0; /* Initial setup */ client->addr = priv->des_addr; /* TI9x4 I2C */ @@ -132,7 +133,7 @@ static void ti9x4_initial_setup(struct i2c_client *client) reg8_write(client, 0x0d, 0xb9); /* VDDIO 3.3V */ switch (priv->csi_rate) { case 1600: /* REFCLK = 25MHZ */ - case 1500: /* REFCLK = 23MHZ */ + case 1500: /* REFCLK = 23.5MHZ */ case 1450: /* REFCLK = 22.5MHZ */ reg8_write(client, 0x1f, 0x00); /* CSI rate 1.5/1.6Gbps */ break; @@ -152,6 +153,29 @@ static void ti9x4_initial_setup(struct i2c_client *client) dev_err(&client->dev, "unsupported CSI rate %d\n", priv->csi_rate); } + switch (priv->csi_rate) { + case 1600: + case 1200: + case 800: + case 400: + /* FrameSync setup for REFCLK=25MHz, FPS=30: period_counts=1/FPS/12mks=1/30/12e-6=2777 -> HI=2, LO=2775 */ + fs_time = 2790; + break; + case 1500: + /* FrameSync setup for REFCLK=23.5MHz, FPS=30: period_counts=1/FPS/12.766mks=1/30/12.766e-6=2612 -> HI=2, LO=2610 */ + fs_time = 2625; + break; + case 1450: + case 1100: + case 700: + case 350: + /* FrameSync setup for REFCLK=22.5MHz, FPS=30: period_counts=1/FPS/13.333mks=1/30/13.333e-6=2500 -> HI=2, LO=2498 */ + fs_time = 2513; + break; + default: + dev_err(&client->dev, "unsupported CSI rate %d\n", priv->csi_rate); + } + if (strcmp(priv->forwarding_mode, "round-robin") == 0) { reg8_write(client, 0x21, 0x03); /* Round Robin forwarding enable for CSI0/CSI1 */ } else if (strcmp(priv->forwarding_mode, "synchronized") == 0) { @@ -171,15 +195,10 @@ static void ti9x4_initial_setup(struct i2c_client *client) reg8_write(client, 0x1c, FS_TIME & 0xff); reg8_write(client, 0x18, 0x43); /* Enable FrameSync, 50/50 mode, Frame clock from 25MHz */ #else - /* FrameSync setup for REFCLK=25MHz, FPS=30: period_counts=1/FPS/12mks=1/30/12e-6=2777 -> HI=2, LO=2775 */ - /* FrameSync setup for REFCLK=22.5MHz, FPS=30: period_counts=1/FPS/13.333mks=1/30/13.333e-6=2500 -> HI=2, LO=2498 */ -// #define FS_TIME (priv->csi_rate == 1450 ? (2498+15) : (2775+15)) -// #define FS_TIME (2498+15) - #define FS_TIME (2498+15) reg8_write(client, 0x19, 2 >> 8); /* FrameSync high time MSB */ reg8_write(client, 0x1a, 2 & 0xff); /* FrameSync high time LSB */ - reg8_write(client, 0x1b, FS_TIME >> 8); /* FrameSync low time MSB */ - reg8_write(client, 0x1c, FS_TIME & 0xff); /* FrameSync low time LSB */ + reg8_write(client, 0x1b, fs_time >> 8); /* FrameSync low time MSB */ + reg8_write(client, 0x1c, fs_time & 0xff); /* FrameSync low time LSB */ reg8_write(client, 0x18, 0x01); /* Enable FrameSync, HI/LO mode, Frame clock from port0 */ // reg8_write(client, 0x18, 0x80); /* Enable FrameSync, HI/LO mode, Frame clock from port0 */ #endif -- 2.7.4