clear-pkgs-linux-iot-lts2018/0960-media-intel-ipu4-ov495...

537 lines
15 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Meng Wei <wei.meng@intel.com>
Date: Mon, 24 Dec 2018 11:56:05 +0800
Subject: [PATCH] media: intel-ipu4: ov495: OV2775+OV495 enablement
single sensor OV2775 enable.
Change-Id: I77b2117acf81a5dad8d9986d2ba8a8624797f85c
Tracked-On: PKT-1691
Signed-off-by: lizhao7x <zhaox.li@intel.com>
Signed-off-by: Meng Wei <wei.meng@intel.com>
---
.../i2c/crlmodule/crl_ov495_configuration.h | 284 ++++++++++++++++++
drivers/media/i2c/crlmodule/crlmodule-data.c | 2 +
drivers/media/i2c/ti960.c | 12 +-
drivers/media/platform/intel/Kconfig | 6 +
.../media/platform/intel/ipu4-bxt-p-pdata.c | 123 ++++++++
5 files changed, 423 insertions(+), 4 deletions(-)
create mode 100644 drivers/media/i2c/crlmodule/crl_ov495_configuration.h
diff --git a/drivers/media/i2c/crlmodule/crl_ov495_configuration.h b/drivers/media/i2c/crlmodule/crl_ov495_configuration.h
new file mode 100644
index 000000000000..6884cf503bb4
--- /dev/null
+++ b/drivers/media/i2c/crlmodule/crl_ov495_configuration.h
@@ -0,0 +1,284 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2017 - 2018 Intel Corporation
+ *
+ * Author: Ying Chang <ying.chang@intel.com>
+ * Meng J Chen <meng.j.chen@intel.com>
+ * Zhaox Li <zhaox.li@intel.com>
+ *
+ */
+
+#ifndef __CRLMODULE_OV495_CONFIGURATION_H_
+#define __CRLMODULE_OV495_CONFIGURATION_H_
+
+#include "crlmodule-sensor-ds.h"
+
+struct crl_sensor_detect_config ov495_sensor_detect_regset[] = {
+ {
+ .reg = {0x3000, CRL_REG_LEN_08BIT, 0xFF},
+ .width = 8,
+ },
+ {
+ .reg = {0x3001, CRL_REG_LEN_08BIT, 0xFF},
+ .width = 8,
+ },
+ {
+ .reg = {0x3002, CRL_REG_LEN_08BIT, 0xFF},
+ .width = 8,
+ },
+ {
+ .reg = {0x3003, CRL_REG_LEN_08BIT, 0xFF},
+ .width = 8,
+ },
+};
+
+static struct crl_pll_configuration ov495_pll_configurations[] = {
+ {
+ .input_clk = 27000000,
+ .op_sys_clk = 400000000,
+ .bitsperpixel = 16,
+ .pixel_rate_csi = 108000000,
+ .pixel_rate_pa = 108000000, /* pixel_rate = op_sys_clk*2 *csi_lanes/bitsperpixel */
+ .csi_lanes = 4,
+ .comp_items = 0,
+ .ctrl_data = 0,
+ .pll_regs_items = 0,
+ .pll_regs = 0,
+ },
+};
+
+static struct crl_subdev_rect_rep ov495_1280_1080_rects[] = {
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_PIXEL_ARRAY,
+ .in_rect.left = 0,
+ .in_rect.top = 0,
+ .in_rect.width = 1280,
+ .in_rect.height = 1080,
+ .out_rect.left = 0,
+ .out_rect.top = 0,
+ .out_rect.width = 1280,
+ .out_rect.height = 1080,
+ },
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_BINNER,
+ .in_rect.left = 0,
+ .in_rect.top = 0,
+ .in_rect.width = 1280,
+ .in_rect.height = 1080,
+ .out_rect.left = 0,
+ .out_rect.top = 0,
+ .out_rect.width = 1280,
+ .out_rect.height = 1080,
+ },
+};
+
+static struct crl_subdev_rect_rep ov495_1920_1080_rects[] = {
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_PIXEL_ARRAY,
+ .in_rect.left = 0,
+ .in_rect.top = 0,
+ .in_rect.width = 1920,
+ .in_rect.height = 1080,
+ .out_rect.left = 0,
+ .out_rect.top = 0,
+ .out_rect.width = 1920,
+ .out_rect.height = 1080,
+ },
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_BINNER,
+ .in_rect.left = 0,
+ .in_rect.top = 0,
+ .in_rect.width = 1920,
+ .in_rect.height = 1080,
+ .out_rect.left = 0,
+ .out_rect.top = 0,
+ .out_rect.width = 1920,
+ .out_rect.height = 1080,
+ },
+};
+
+static struct crl_register_write_rep ov495_1920x1080_regs[] = {
+ {0x3516, CRL_REG_LEN_08BIT, 0x00},
+ {0x354d, CRL_REG_LEN_08BIT, 0x10},
+ {0x354a, CRL_REG_LEN_08BIT, 0x1d},
+ {0x0500, CRL_REG_LEN_08BIT, 0x00},
+ {0x30c0, CRL_REG_LEN_08BIT, 0xe2},
+ {0x0000, CRL_REG_LEN_DELAY, 0x0a},
+
+ {0x3516, CRL_REG_LEN_08BIT, 0x00},
+ {0x354d, CRL_REG_LEN_08BIT, 0x10},
+ {0x354a, CRL_REG_LEN_08BIT, 0x1d},
+ {0x0500, CRL_REG_LEN_08BIT, 0x01},
+ {0x30c0, CRL_REG_LEN_08BIT, 0xe2},
+ {0x0000, CRL_REG_LEN_DELAY, 0x0a},
+};
+
+static struct crl_register_write_rep ov495_1280x1080_regs[] = {
+ {0x3516, CRL_REG_LEN_08BIT, 0x00},
+ {0x354d, CRL_REG_LEN_08BIT, 0x10},
+ {0x354a, CRL_REG_LEN_08BIT, 0x1d},
+ {0x7800, CRL_REG_LEN_08BIT, 0x00},
+ {0x0500, CRL_REG_LEN_08BIT, 0x00},
+ {0x0501, CRL_REG_LEN_08BIT, 0x01},
+ {0x0502, CRL_REG_LEN_08BIT, 0x01},
+ {0x0503, CRL_REG_LEN_08BIT, 0x40},
+ {0x0504, CRL_REG_LEN_08BIT, 0x00},
+ {0x0505, CRL_REG_LEN_08BIT, 0x00},
+ {0x0506, CRL_REG_LEN_08BIT, 0x05},
+ {0x0507, CRL_REG_LEN_08BIT, 0x00},
+ {0x0508, CRL_REG_LEN_08BIT, 0x04},
+ {0x0509, CRL_REG_LEN_08BIT, 0x38},
+ {0x30c0, CRL_REG_LEN_08BIT, 0xc3},
+ {0x0000, CRL_REG_LEN_DELAY, 0x0a},
+};
+
+static struct crl_mode_rep ov495_modes[] = {
+ {
+ .sd_rects_items = ARRAY_SIZE(ov495_1280_1080_rects),
+ .sd_rects = ov495_1280_1080_rects,
+ .binn_hor = 1,
+ .binn_vert = 1,
+ .scale_m = 1,
+ .width = 1280,
+ .height = 1080,
+ .min_llp = 2250,
+ .min_fll = 1320,
+ .mode_regs_items = ARRAY_SIZE(ov495_1280x1080_regs),
+ .mode_regs = ov495_1280x1080_regs,
+ },
+ {
+ .sd_rects_items = ARRAY_SIZE(ov495_1920_1080_rects),
+ .sd_rects = ov495_1920_1080_rects,
+ .binn_hor = 1,
+ .binn_vert = 1,
+ .scale_m = 1,
+ .width = 1920,
+ .height = 1080,
+ .min_llp = 2250,
+ .min_fll = 1320,
+ .mode_regs_items = ARRAY_SIZE(ov495_1920x1080_regs),
+ .mode_regs = ov495_1920x1080_regs,
+ },
+};
+
+static struct crl_sensor_subdev_config ov495_sensor_subdevs[] = {
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_BINNER,
+ .name = "ov495 binner",
+ },
+ {
+ .subdev_type = CRL_SUBDEV_TYPE_PIXEL_ARRAY,
+ .name = "ov495 pixel array",
+ }
+};
+
+static struct crl_sensor_limits ov495_sensor_limits = {
+ .x_addr_min = 0,
+ .y_addr_min = 0,
+ .x_addr_max = 1920,
+ .y_addr_max = 1080,
+ .min_frame_length_lines = 240,
+ .max_frame_length_lines = 65535,
+ .min_line_length_pixels = 320,
+ .max_line_length_pixels = 32752,
+};
+
+static struct crl_csi_data_fmt ov495_crl_csi_data_fmt[] = {
+ {
+ .code = MEDIA_BUS_FMT_YUYV8_1X16,
+ .pixel_order = CRL_PIXEL_ORDER_IGNORE,
+ .bits_per_pixel = 16,
+ },
+ {
+ .code = MEDIA_BUS_FMT_UYVY8_1X16,
+ .pixel_order = CRL_PIXEL_ORDER_IGNORE,
+ .bits_per_pixel = 16,
+ },
+};
+
+static struct crl_v4l2_ctrl ov495_v4l2_ctrls[] = {
+ {
+ .sd_type = CRL_SUBDEV_TYPE_BINNER,
+ .op_type = CRL_V4L2_CTRL_SET_OP,
+ .context = SENSOR_IDLE,
+ .ctrl_id = V4L2_CID_LINK_FREQ,
+ .name = "V4L2_CID_LINK_FREQ",
+ .type = CRL_V4L2_CTRL_TYPE_MENU_INT,
+ .data.v4l2_int_menu.def = 0,
+ .data.v4l2_int_menu.max = 0,
+ .data.v4l2_int_menu.menu = 0,
+ .flags = 0,
+ .impact = CRL_IMPACTS_NO_IMPACT,
+ .regs_items = 0,
+ .regs = 0,
+ .dep_items = 0,
+ .dep_ctrls = 0,
+ },
+ {
+ .sd_type = CRL_SUBDEV_TYPE_PIXEL_ARRAY,
+ .op_type = CRL_V4L2_CTRL_GET_OP,
+ .context = SENSOR_POWERED_ON,
+ .ctrl_id = V4L2_CID_PIXEL_RATE,
+ .name = "V4L2_CID_PIXEL_RATE_PA",
+ .type = CRL_V4L2_CTRL_TYPE_INTEGER,
+ .data.std_data.min = 0,
+ .data.std_data.max = INT_MAX,
+ .data.std_data.step = 1,
+ .data.std_data.def = 0,
+ .flags = 0,
+ .impact = CRL_IMPACTS_NO_IMPACT,
+ .regs_items = 0,
+ .regs = 0,
+ .dep_items = 0,
+ .dep_ctrls = 0,
+ },
+ {
+ .sd_type = CRL_SUBDEV_TYPE_BINNER,
+ .op_type = CRL_V4L2_CTRL_GET_OP,
+ .context = SENSOR_POWERED_ON,
+ .ctrl_id = V4L2_CID_PIXEL_RATE,
+ .name = "V4L2_CID_PIXEL_RATE_CSI",
+ .type = CRL_V4L2_CTRL_TYPE_INTEGER,
+ .data.std_data.min = 0,
+ .data.std_data.max = INT_MAX,
+ .data.std_data.step = 1,
+ .data.std_data.def = 0,
+ .flags = 0,
+ .impact = CRL_IMPACTS_NO_IMPACT,
+ .regs_items = 0,
+ .regs = 0,
+ .dep_items = 0,
+ .dep_ctrls = 0,
+ },
+};
+
+struct crl_sensor_configuration ov495_crl_configuration = {
+
+ .subdev_items = ARRAY_SIZE(ov495_sensor_subdevs),
+ .subdevs = ov495_sensor_subdevs,
+
+ .pll_config_items = ARRAY_SIZE(ov495_pll_configurations),
+ .pll_configs = ov495_pll_configurations,
+
+ .id_reg_items = ARRAY_SIZE(ov495_sensor_detect_regset),
+ .id_regs = ov495_sensor_detect_regset,
+
+ .sensor_limits = &ov495_sensor_limits,
+
+ .modes_items = ARRAY_SIZE(ov495_modes),
+ .modes = ov495_modes,
+
+ .streamon_regs_items = 0,
+ .streamon_regs = 0,
+
+ .streamoff_regs_items = 0,
+ .streamoff_regs = 0,
+
+ .v4l2_ctrls_items = ARRAY_SIZE(ov495_v4l2_ctrls),
+ .v4l2_ctrl_bank = ov495_v4l2_ctrls,
+
+ .csi_fmts_items = ARRAY_SIZE(ov495_crl_csi_data_fmt),
+ .csi_fmts = ov495_crl_csi_data_fmt,
+
+};
+
+#endif /* __CRLMODULE_OV495_CONFIGURATION_H_ */
diff --git a/drivers/media/i2c/crlmodule/crlmodule-data.c b/drivers/media/i2c/crlmodule/crlmodule-data.c
index d4143a53a7fa..2c07ca06a83a 100644
--- a/drivers/media/i2c/crlmodule/crlmodule-data.c
+++ b/drivers/media/i2c/crlmodule/crlmodule-data.c
@@ -32,6 +32,7 @@
#include "crl_ar023z_configuration.h"
#include "crl_ov2775_configuration.h"
#include "crl_ox03a10_configuration.h"
+#include "crl_ov495_configuration.h"
static const struct crlmodule_sensors supported_sensors[] = {
{ "i2c-SONY214A:00", "imx214", &imx214_crl_configuration },
@@ -70,6 +71,7 @@ static const struct crlmodule_sensors supported_sensors[] = {
{ "AR023Z", "ar023z", &ar023z_crl_configuration },
{ "OV2775", "ov2775", &ov2775_crl_configuration },
{ "OX03A10", "ox03a10", &ox03a10_crl_configuration },
+ { "OV495", "ov495", &ov495_crl_configuration},
};
/*
diff --git a/drivers/media/i2c/ti960.c b/drivers/media/i2c/ti960.c
index 2761dbe17bc8..12cacab51eef 100644
--- a/drivers/media/i2c/ti960.c
+++ b/drivers/media/i2c/ti960.c
@@ -76,6 +76,8 @@ static const u8 ti960_op_sys_clock_reg_val[] = {
* orders must be defined.
*/
static const struct ti960_csi_data_format va_csi_data_formats[] = {
+ { MEDIA_BUS_FMT_YUYV8_1X16, 16, 16, PIXEL_ORDER_GBRG, 0x1e},
+ { MEDIA_BUS_FMT_UYVY8_1X16, 16, 16, PIXEL_ORDER_GBRG, 0X1e},
{ MEDIA_BUS_FMT_SGRBG16_1X16, 16, 16, PIXEL_ORDER_GRBG, 0x2e },
{ MEDIA_BUS_FMT_SRGGB16_1X16, 16, 16, PIXEL_ORDER_RGGB, 0x2e },
{ MEDIA_BUS_FMT_SBGGR16_1X16, 16, 16, PIXEL_ORDER_BGGR, 0x2e },
@@ -91,6 +93,8 @@ static const struct ti960_csi_data_format va_csi_data_formats[] = {
};
static const uint32_t ti960_supported_codes_pad[] = {
+ MEDIA_BUS_FMT_YUYV8_1X16,
+ MEDIA_BUS_FMT_UYVY8_1X16,
MEDIA_BUS_FMT_SBGGR16_1X16,
MEDIA_BUS_FMT_SGBRG16_1X16,
MEDIA_BUS_FMT_SGRBG16_1X16,
@@ -1203,11 +1207,11 @@ static int ti960_probe(struct i2c_client *client,
return -ENOMEM;
for (i = 0; i < va->nstreams; i++) {
- va->ti960_route[i].sink_pad = i / 2;
- va->ti960_route[i].sink_stream = i % 2;
+ va->ti960_route[i].sink_pad = i;
+ va->ti960_route[i].sink_stream = i;
va->ti960_route[i].source_pad = TI960_PAD_SOURCE;
- va->ti960_route[i].source_stream = i % 2;
- va->ti960_route[i].flags = MEDIA_PAD_FL_MULTIPLEX;
+ va->ti960_route[i].source_stream = i;
+// va->ti960_route[i].flags = MEDIA_PAD_FL_MULTIPLEX;
}
va->regmap8 = devm_regmap_init_i2c(client,
diff --git a/drivers/media/platform/intel/Kconfig b/drivers/media/platform/intel/Kconfig
index 31e117e225a7..95e15c58cfef 100644
--- a/drivers/media/platform/intel/Kconfig
+++ b/drivers/media/platform/intel/Kconfig
@@ -94,6 +94,12 @@ config INTEL_IPU4_OX03A10
---help---
"ox03a10 camera sensor"
+config INTEL_IPU4_OV495
+ bool "Compile platorm data for OV495"
+ depends on INTEL_IPU4_BXT_P_PDATA
+ ---help---
+ "ov495 camera sensor"
+
config INTEL_IPU4_ICI_BXT_P_PDATA
depends on VIDEO_INTEL_IPU && VIDEO_INTEL_ICI
bool "Enable built in platform data for Broxton-P ICI driver"
diff --git a/drivers/media/platform/intel/ipu4-bxt-p-pdata.c b/drivers/media/platform/intel/ipu4-bxt-p-pdata.c
index de76065d6699..b7d0558bcae2 100644
--- a/drivers/media/platform/intel/ipu4-bxt-p-pdata.c
+++ b/drivers/media/platform/intel/ipu4-bxt-p-pdata.c
@@ -1203,6 +1203,29 @@ static struct crlmodule_platform_data ox03a10_pdata = {
};
#endif
+#ifdef CONFIG_INTEL_IPU4_OV495
+#define OV495_LANES 4
+#define OV495_I2C_PHY_ADDR 0x48
+#define OV495A_I2C_ADDRESS 0x30
+#define OV495B_I2C_ADDRESS 0x31
+#define OV495C_I2C_ADDRESS 0x32
+#define OV495D_I2C_ADDRESS 0x33
+
+#define OV495A_SER_ADDRESS 0x58
+#define OV495B_SER_ADDRESS 0x59
+#define OV495C_SER_ADDRESS 0x5a
+#define OV495D_SER_ADDRESS 0x5b
+
+static struct crlmodule_platform_data ov495_pdata = {
+ .lanes = OV495_LANES,
+ .ext_clk = 27000000,
+ .op_sys_clock = (uint64_t[]){ 87750000 },
+ .module_name = "OV495",
+ .id_string = "0x51 0x49 0x56 0x4f",
+ .xshutdown = 1,
+};
+#endif
+
#if IS_ENABLED(CONFIG_VIDEO_TI960)
#define TI960_I2C_ADAPTER 2
#define TI960_I2C_ADAPTER_2 7
@@ -1245,6 +1268,56 @@ static struct ti960_subdev_info ti960_subdevs[] = {
.suffix = 'b',
},
#endif
+#ifdef CONFIG_INTEL_IPU4_OV495
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495A_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER,
+ .rx_port = 0,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495A_SER_ADDRESS,
+ .suffix = 'a',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495B_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER,
+ .rx_port = 1,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495B_SER_ADDRESS,
+ .suffix = 'b',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495C_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER,
+ .rx_port = 2,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495C_SER_ADDRESS,
+ .suffix = 'c',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495D_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER,
+ .rx_port = 3,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495D_SER_ADDRESS,
+ .suffix = 'd',
+ },
+#endif
};
static struct ti960_subdev_info ti960_subdevs_2[] = {
@@ -1274,6 +1347,56 @@ static struct ti960_subdev_info ti960_subdevs_2[] = {
.suffix = 'f',
},
#endif
+#ifdef CONFIG_INTEL_IPU4_OV495
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495A_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER_2,
+ .rx_port = 0,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495A_SER_ADDRESS,
+ .suffix = 'e',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495B_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER_2,
+ .rx_port = 1,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495B_SER_ADDRESS,
+ .suffix = 'f',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495C_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER_2,
+ .rx_port = 2,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495C_SER_ADDRESS,
+ .suffix = 'g',
+ },
+ {
+ .board_info = {
+ .type = CRLMODULE_NAME,
+ .addr = OV495D_I2C_ADDRESS,
+ .platform_data = &ov495_pdata,
+ },
+ .i2c_adapter_id = TI960_I2C_ADAPTER_2,
+ .rx_port = 3,
+ .phy_i2c_addr = OV495_I2C_PHY_ADDR,
+ .ser_alias = OV495D_SER_ADDRESS,
+ .suffix = 'h',
+ },
+#endif
};
static struct ti960_pdata ti960_pdata = {
--
https://clearlinux.org