clear-pkgs-linux-iot-lts2018/1100-media-intel-ipu4-ti960...

167 lines
5.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Meng Wei <wei.meng@intel.com>
Date: Tue, 19 Mar 2019 11:13:56 +0800
Subject: [PATCH] media: intel-ipu4: ti960: ov495 frame sync setting
ov495 frame sync setting.
Change-Id: Ieb2179176846a42a8d4674f0dfc3e8cba3dcdda1
Tracked-On: PKT-2287
Signed-off-by: Chen Meng J <meng.j.chen@intel.com>
Signed-off-by: Meng Wei <wei.meng@intel.com>
---
drivers/media/i2c/ti960-reg.h | 25 ++++++++++++-----
drivers/media/i2c/ti960.c | 52 +++++++++++++++++++++++++++--------
2 files changed, 59 insertions(+), 18 deletions(-)
diff --git a/drivers/media/i2c/ti960-reg.h b/drivers/media/i2c/ti960-reg.h
index 0f34651aaa03..60d9bf29a9b8 100644
--- a/drivers/media/i2c/ti960-reg.h
+++ b/drivers/media/i2c/ti960-reg.h
@@ -18,15 +18,15 @@ static const struct ti960_register_write ti960_frame_sync_settings[2][5] = {
{
{0x18, 0x00}, /* Disable frame sync. */
{0x19, 0x00},
- {0x1a, 0x02},
- {0x1b, 0x0a},
- {0x1c, 0xd3},
+ {0x1a, 0x00},
+ {0x1b, 0x00},
+ {0x1c, 0x00},
},
{
- {0x19, 0x01}, /* Frame sync high time.*/
- {0x1a, 0x15},
- {0x1b, 0x09}, /* Frame sync low time. */
- {0x1c, 0xC3},
+ {0x19, 0x15}, /* Frame sync high time.*/
+ {0x1a, 0xb3},
+ {0x1b, 0xc3}, /* Frame sync low time. */
+ {0x1c, 0x4f},
{0x18, 0x01}, /* Enable frame sync. and use high/low mode */
}
};
@@ -230,4 +230,15 @@ static const struct ti960_register_devid ti953_FPD3_RX_ID[] = {
#define TI960_CSI_CONTS_CLOCK 0x2
#define TI960_CSI_SKEWCAL 0x40
#define TI960_FSIN_ENABLE 0x1
+
+/* register definition */
+#define TI953_LOCAL_GPIO_DATA 0xd
+#define TI953_GPIO_INPUT_CTRL 0xe
+
+/* register value definition */
+#define TI953_GPIO0_RMTEN 0x10
+#define TI953_GPIO0_OUT 0x1
+#define TI953_GPIO1_OUT (0x1 << 1)
+#define TI953_GPIO_OUT_EN 0xf0
+
#endif
diff --git a/drivers/media/i2c/ti960.c b/drivers/media/i2c/ti960.c
index 381351baff4a..2430fcc85527 100644
--- a/drivers/media/i2c/ti960.c
+++ b/drivers/media/i2c/ti960.c
@@ -288,8 +288,9 @@ static int ti960_map_ser_alias_addr(struct ti960 *va, unsigned short rx_port,
}
static int ti960_fsin_gpio_init(struct ti960 *va, unsigned short rx_port,
- unsigned short fsin_gpio)
+ unsigned short ser_alias, unsigned short fsin_gpio)
{
+ unsigned char gpio_data;
int rval;
int reg_val;
@@ -353,6 +354,15 @@ static int ti960_fsin_gpio_init(struct ti960 *va, unsigned short rx_port,
break;
}
+ /* enable output and remote control */
+ ti953_reg_write(va, rx_port, ser_alias, TI953_GPIO_INPUT_CTRL, TI953_GPIO_OUT_EN);
+ rval = ti953_reg_read(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ &gpio_data);
+ if (rval)
+ return rval;
+ ti953_reg_write(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ gpio_data | TI953_GPIO0_RMTEN << fsin_gpio);
+
return rval;
}
@@ -982,11 +992,20 @@ static int ti960_set_stream(struct v4l2_subdev *subdev, int enable)
* only do reset for ov495, then it won't break other sensors.
*/
if (memcmp(va->sub_devs[j].sd_name, "OV495", strlen("OV495")) == 0) {
- ti953_reg_write(va, rx_port, ser_alias, 0x0e, 0xf0);
- msleep(50);
- ti953_reg_write(va, rx_port, ser_alias, 0x0d, 00);
+ unsigned char gpio_data;
+
+ ti953_reg_write(va, rx_port, ser_alias, TI953_GPIO_INPUT_CTRL,
+ TI953_GPIO_OUT_EN);
+ rval = ti953_reg_read(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ &gpio_data);
+ if (rval)
+ return rval;
+ gpio_data &= ~TI953_GPIO0_RMTEN;
+ ti953_reg_write(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ gpio_data & ~TI953_GPIO0_OUT);
msleep(50);
- ti953_reg_write(va, rx_port, ser_alias, 0x0d, 0x1);
+ ti953_reg_write(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ gpio_data | TI953_GPIO0_OUT);
}
}
@@ -1017,6 +1036,7 @@ static int ti960_set_stream(struct v4l2_subdev *subdev, int enable)
if (enable && test_bit(i, rx_port_enabled)) {
rval = ti960_fsin_gpio_init(va,
va->sub_devs[i].rx_port,
+ va->sub_devs[i].ser_i2c_addr,
va->sub_devs[i].fsin_gpio);
if (rval) {
dev_err(va->sd.dev,
@@ -1029,13 +1049,21 @@ static int ti960_set_stream(struct v4l2_subdev *subdev, int enable)
* only do reset for ov495, then it won't break other sensors.
*/
if (memcmp(va->sub_devs[i].sd_name, "OV495", strlen("OV495")) == 0) {
+ unsigned char gpio_data;
rx_port = va->sub_devs[i].rx_port;
ser_alias = va->sub_devs[i].ser_i2c_addr;
- ti953_reg_write(va, rx_port, ser_alias, 0x0e, 0xf0);
- msleep(50);
- ti953_reg_write(va, rx_port, ser_alias, 0x0d, 00);
+ ti953_reg_write(va, rx_port, ser_alias, TI953_GPIO_INPUT_CTRL,
+ TI953_GPIO_OUT_EN);
+ rval = ti953_reg_read(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ &gpio_data);
+ if (rval)
+ return rval;
+ gpio_data &= ~TI953_GPIO0_RMTEN;
+ ti953_reg_write(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ gpio_data & ~TI953_GPIO0_OUT);
msleep(50);
- ti953_reg_write(va, rx_port, ser_alias, 0x0d, 0x1);
+ ti953_reg_write(va, rx_port, ser_alias, TI953_LOCAL_GPIO_DATA,
+ gpio_data | TI953_GPIO0_OUT);
}
}
}
@@ -1447,9 +1475,11 @@ static int ti960_init(struct ti960 *va)
/* reset and power for ti953 */
if (!ov495_detected) {
- ti953_reg_write(va, 0, ser_alias, 0x0d, 00);
+ ti953_reg_write(va, 0, ser_alias, TI953_GPIO_INPUT_CTRL, TI953_GPIO_OUT_EN);
+ ti953_reg_write(va, 0, ser_alias, TI953_LOCAL_GPIO_DATA, 0);
msleep(50);
- ti953_reg_write(va, 0, ser_alias, 0x0d, 0x3);
+ ti953_reg_write(va, 0, ser_alias, TI953_LOCAL_GPIO_DATA,
+ TI953_GPIO0_OUT | TI953_GPIO1_OUT);
}
rval = ti960_map_subdevs_addr(va);
--
https://clearlinux.org