From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: qianmenx 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 Signed-off-by: Meng Wei --- .../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