From df920df1a7a26dd4b49f90d4ce4e94b2541348d6 Mon Sep 17 00:00:00 2001 From: Vladimir Barinov Date: Thu, 3 Jan 2019 23:24:03 +0300 Subject: [PATCH 086/122] lvds: poll ub960 deserializer lock status Poll FPDLINK lock status instead delay Signed-off-by: Vladimir Barinov --- drivers/media/i2c/soc_camera/ti9x4.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/drivers/media/i2c/soc_camera/ti9x4.c b/drivers/media/i2c/soc_camera/ti9x4.c index d03c0f9..f0b782f 100644 --- a/drivers/media/i2c/soc_camera/ti9x4.c +++ b/drivers/media/i2c/soc_camera/ti9x4.c @@ -278,7 +278,9 @@ static void ti9x4_fpdlink3_setup(struct i2c_client *client, int idx) static int ti9x4_initialize(struct i2c_client *client) { struct ti9x4_priv *priv = i2c_get_clientdata(client); - int idx; + int idx, timeout; + u8 port_sts1 = 0, port_sts2 = 0; + int tmp_addr; dev_info(&client->dev, "LINKs=%d, LANES=%d, FORWARDING=%s, CABLE=%s, ID=%s\n", priv->links, priv->lanes, priv->forwarding_mode, priv->is_coax ? "coax" : "stp", priv->chip_id); @@ -294,12 +296,35 @@ static int ti9x4_initialize(struct i2c_client *client) ti9x4_fpdlink3_setup(client, idx); } - /* extra delay to wait imager power up */ - if (priv->poc_delay) - mdelay(350); - client->addr = priv->des_addr; + /* check lock status */ + for (timeout = 500 / priv->links; timeout > 0; timeout--) { + for (idx = 0; idx < priv->links; idx++) { + reg8_write(client, 0x4c, (idx << 4) | (1 << idx)); /* Select RX port number */ + usleep_range(1000, 1500); /* wait 1ms */ + reg8_read(client, 0x4d, &port_sts1); /* Lock status */ + reg8_read(client, 0x4e, &port_sts2); /* Freq stable */ + + if (port_sts1 & 0x1) { + tmp_addr = client->addr; + client->addr = priv->ti9x3_addr_map[idx]; /* TI9X3 I2C addr */ + reg8_write(client, 0x0d, 0xf0); /* Enable all remote GPIOs */ + reg8_write(client, 0x0e, 0xf0); /* Enable serializer GPIOs */ + client->addr = tmp_addr; + } + + if ((port_sts1 & 0x1) && (port_sts2 & 0x4)) + goto out; + } + } + + if (!timeout) + dev_info(&client->dev, "Receiver is not locked\n"); +out: + if (priv->poc_delay) + mdelay(100); + return 0; } -- 2.7.4