summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2016-02-26 17:33:50 +0100
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:49:20 +0900
commitb26941ee51bbcb6d81b6aa5119d3e364c2dbdf19 (patch)
tree8f0a003faaa4ab9f9e7170afb0da210a7e37a0cc /drivers/media
parentd450f64555f5dc2be01ddb8f80acbb41fa2a165e (diff)
fimc-is: Add setting of vendorSpecific2[0] metadata structure field
vendorSpecific2[0] value pattern depends on the fimc-is firmware revision. Move setting up of this field to the kernel as there is all information required for this. The driver will update the field accordingly only if user space leaves it cleared. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c33
-rw-r--r--drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.h3
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c
index be0de25d28ea..03864545b4e1 100644
--- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c
+++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.c
@@ -757,6 +757,19 @@ static void fimc_is_ischain_version(struct fimc_is_device_ischain *this, char *n
pinfo = &this->pinfo;
memcpy(pinfo->header_ver, &version_str[32], 11);
pinfo->header_ver[11] = '\0';
+
+ if (strnstr(&load_bin[size - FIMC_IS_VERSION_SIZE],
+ "9745-2014/08/27", FIMC_IS_VERSION_SIZE)) {
+ /* TM2E (reverse engineered values) */
+ this->isp_vs2_offset = 0x003f8be0;
+ this->isp_vs2_step = 0x8308;
+ } else {
+ /* TM2 */
+ this->isp_vs2_offset = 0x003f8ce4;
+ this->isp_vs2_step = 0x8350;
+ }
+ info("vendorSpecific2[0]: offset: %#x, step: %#x\n",
+ this->isp_vs2_offset, this->isp_vs2_step);
} else {
memcpy(version_str, &load_bin[size - FIMC_IS_SETFILE_VER_OFFSET],
FIMC_IS_SETFILE_VER_SIZE);
@@ -5214,6 +5227,26 @@ int fimc_is_ischain_isp_buffer_queue(struct fimc_is_device_ischain *device,
groupmgr = device->groupmgr;
group = &device->group_isp;
+ /*
+ * Set the (all undocumented) shot->udm.internal.vendorSpecific2[0]
+ * field if it is cleared.
+ */
+ if (groupmgr && queue && group && group->instance < FIMC_IS_MAX_NODES
+ && group->id < GROUP_ID_MAX && index < FRAMEMGR_MAX_REQUEST) {
+ struct fimc_is_framemgr *framemgr = &queue->framemgr;
+ struct fimc_is_frame *frame = &framemgr->frame[index];
+ struct camera2_shot *shot = frame->shot;
+ int fcount;
+
+ if (shot->udm.internal.vendorSpecific2[0] == 0) {
+ fcount = shot->dm.request.frameCount;
+
+ shot->udm.internal.vendorSpecific2[0] =
+ (device->isp_vs2_offset + ((fcount - 1) % 40)
+ * device->isp_vs2_step);
+ }
+ }
+
ret = fimc_is_group_buffer_queue(groupmgr, group, queue, index);
if (ret) {
merr("fimc_is_group_buffer_queue is fail(%d)", device, ret);
diff --git a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.h b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.h
index a84b0703c75a..f70491358837 100644
--- a/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.h
+++ b/drivers/media/platform/exynos/fimc-is/fimc-is-device-ischain.h
@@ -260,6 +260,9 @@ struct fimc_is_device_ischain {
void * private_data;
struct fimc_is_device_sensor *sensor;
+
+ unsigned int isp_vs2_offset;
+ unsigned int isp_vs2_step;
};
/*global function*/