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

132 lines
4.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: qianmenx <qianx.meng@intel.com>
Date: Tue, 23 Apr 2019 16:03:31 +0800
Subject: [PATCH] media: intel-ipu4: ti960: add metadata support for x3a
- change crl_ox03a10_common.h to let sensor support
- change function ti960_get_frame_desc, the old way was query
the list of ti960, change to query from input entry(the sensor)
Change-Id: I2fe5e6b43c36c0df7293691f712b7f1367120f8d
Tracked-On: PKT-2588
Tracked-On: #JIIAP-723
Signed-off-by: qianmenx <qianx.meng@intel.com>
Signed-off-by: Meng Wei <wei.meng@intel.com>
---
.../media/i2c/crlmodule/crl_ox03a10_common.h | 18 ++++++-
drivers/media/i2c/ti960-des.c | 49 ++++++++++++-------
2 files changed, 46 insertions(+), 21 deletions(-)
diff --git a/drivers/media/i2c/crlmodule/crl_ox03a10_common.h b/drivers/media/i2c/crlmodule/crl_ox03a10_common.h
index 7ef243bcdcb0..ceaed8f2466b 100644
--- a/drivers/media/i2c/crlmodule/crl_ox03a10_common.h
+++ b/drivers/media/i2c/crlmodule/crl_ox03a10_common.h
@@ -174,7 +174,7 @@ static struct crl_register_write_rep ox03a10_1920_1088_12DCG[] = {
{ 0x3101, CRL_REG_LEN_08BIT, 0x32 },
{ 0x3192, CRL_REG_LEN_08BIT, 0x00 },
{ 0x3193, CRL_REG_LEN_08BIT, 0x00 },
- { 0x3206, CRL_REG_LEN_08BIT, 0xc8 },
+ { 0x3206, CRL_REG_LEN_08BIT, 0x08 },
{ 0x3216, CRL_REG_LEN_08BIT, 0x01 },
{ 0x3304, CRL_REG_LEN_08BIT, 0x04 },
{ 0x3400, CRL_REG_LEN_08BIT, 0x08 },
@@ -528,6 +528,20 @@ static struct crl_register_write_rep ox03a10_1920_1088_12DCG[] = {
{ 0x384c, CRL_REG_LEN_08BIT, 0x02 },
{ 0x384d, CRL_REG_LEN_08BIT, 0x14 },
{ 0x460a, CRL_REG_LEN_08BIT, 0x0e },
+ /* embedded data */
+ { 0x3208, CRL_REG_LEN_08BIT, 0x04 },
+ { 0x3800, CRL_REG_LEN_08BIT, 0x03 },
+ { 0x4800, CRL_REG_LEN_08BIT, 0x02 },
+ { 0x3208, CRL_REG_LEN_08BIT, 0x14 },
+ { 0x3208, CRL_REG_LEN_08BIT, 0x05 },
+ { 0x5000, CRL_REG_LEN_08BIT, 0x10 },
+ { 0x0304, CRL_REG_LEN_08BIT, 0x19 },
+ { 0x3208, CRL_REG_LEN_08BIT, 0x15 },
+ { 0x3217, CRL_REG_LEN_08BIT, 0xbb },
+ { 0x3219, CRL_REG_LEN_08BIT, 0x55 },
+ { 0x3216, CRL_REG_LEN_08BIT, 0x02 },
+ { 0x3221, CRL_REG_LEN_08BIT, 0x02 },/* enable CRC */
+ { 0x366f, CRL_REG_LEN_08BIT, 0xf4 },/* front 2 rows, end 2 rows */
{ 0x0100, CRL_REG_LEN_08BIT, 0x01 },
};
@@ -1612,7 +1626,7 @@ static struct crl_arithmetic_ops ox03a10_frame_desc_height_ops[] = {
{
.op = CRL_ASSIGNMENT,
.operand.entity_type = CRL_DYNAMIC_VAL_OPERAND_TYPE_CONST,
- .operand.entity_val = 1,
+ .operand.entity_val = 4,
},
};
diff --git a/drivers/media/i2c/ti960-des.c b/drivers/media/i2c/ti960-des.c
index 3414b8a75983..f410f61e71f3 100644
--- a/drivers/media/i2c/ti960-des.c
+++ b/drivers/media/i2c/ti960-des.c
@@ -417,31 +417,42 @@ static const struct ti960_csi_data_format
return &va_csi_data_formats[0];
}
-static int ti960_get_frame_desc(struct v4l2_subdev *sd,
- unsigned int pad, struct v4l2_mbus_frame_desc *desc)
+static int ti960_get_routing_remote_pad(struct v4l2_subdev *sd,
+ unsigned int pad)
{
struct ti960 *va = to_ti960(sd);
- struct v4l2_mbus_frame_desc_entry *entry = desc->entry;
- u8 vc = 0;
int i;
- desc->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
- desc->num_entries = min_t(int, va->nstreams, V4L2_FRAME_DESC_ENTRY_MAX);
-
- for (i = 0; i < desc->num_entries; i++) {
- struct v4l2_mbus_framefmt *ffmt =
- &va->ffmts[TI960_PAD_SOURCE][i];
- const struct ti960_csi_data_format *csi_format =
- ti960_validate_csi_data_format(ffmt->code);
-
- entry->two_dim.width = ffmt->width;
- entry->two_dim.height = ffmt->height;
- entry->pixelcode = ffmt->code;
- entry->bus.csi2.channel = vc++;
- entry->bpp = csi_format->compressed;
- entry++;
+ for (i = 0; i < va->nstreams; ++i) {
+ if (va->ti960_route[i].sink_pad == pad)
+ return va->ti960_route[i].source_pad;
+ if (va->ti960_route[i].source_pad == pad)
+ return va->ti960_route[i].sink_pad;
}
+ return -1;
+}
+static int ti960_get_frame_desc(struct v4l2_subdev *sd,
+ unsigned int pad, struct v4l2_mbus_frame_desc *desc)
+{
+ struct ti960 *va = to_ti960(sd);
+ int sink_pad = pad;
+
+ if (va->pad[pad].flags & MEDIA_PAD_FL_SOURCE)
+ sink_pad = ti960_get_routing_remote_pad(sd, pad);
+ if (sink_pad >= 0) {
+ struct media_pad *remote_pad =
+ media_entity_remote_pad(&sd->entity.pads[sink_pad]);
+ if (remote_pad) {
+ struct v4l2_subdev *rsd =
+ media_entity_to_v4l2_subdev(remote_pad->entity);
+
+ dev_dbg(sd->dev, "%s remote sd: %s\n",
+ __func__, rsd->name);
+ v4l2_subdev_call(rsd, pad, get_frame_desc, 0, desc);
+ }
+ } else
+ dev_err(sd->dev, "can't find the frame desc\n");
return 0;
}
--
https://clearlinux.org