diff options
Diffstat (limited to 'drivers/staging/media/atomisp/i2c/imx')
27 files changed, 15067 insertions, 0 deletions
diff --git a/drivers/staging/media/atomisp/i2c/imx/Kconfig b/drivers/staging/media/atomisp/i2c/imx/Kconfig new file mode 100644 index 0000000..a39eeb3 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/Kconfig @@ -0,0 +1,9 @@ +config VIDEO_IMX + tristate "sony imx sensor support" + depends on I2C && VIDEO_V4L2 && VIDEO_MSRLIST_HELPER && m + ---help--- + This is a Video4Linux2 sensor-level driver for the Sony + IMX RAW sensor. + + It currently depends on internal V4L2 extensions defined in + atomisp driver. diff --git a/drivers/staging/media/atomisp/i2c/imx/Makefile b/drivers/staging/media/atomisp/i2c/imx/Makefile new file mode 100644 index 0000000..1d7f7ab --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/Makefile @@ -0,0 +1,8 @@ +obj-$(CONFIG_VIDEO_IMX) += imx1x5.o + +imx1x5-objs := imx.o drv201.o ad5816g.o dw9714.o dw9719.o dw9718.o vcm.o otp.o otp_imx.o otp_brcc064_e2prom.o otp_e2prom.o + +ov8858_driver-objs := ../ov8858.o dw9718.o vcm.o +obj-$(CONFIG_VIDEO_OV8858) += ov8858_driver.o + +ccflags-y += -Werror diff --git a/drivers/staging/media/atomisp/i2c/imx/ad5816g.c b/drivers/staging/media/atomisp/i2c/imx/ad5816g.c new file mode 100644 index 0000000..d68ebb4 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/ad5816g.c @@ -0,0 +1,225 @@ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/gpio.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/kmod.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/types.h> +#include <media/v4l2-device.h> + +#include "ad5816g.h" + +struct ad5816g_device ad5816g_dev; + +static int ad5816g_i2c_rd8(struct i2c_client *client, u8 reg, u8 *val) +{ + struct i2c_msg msg[2]; + u8 buf[2]; + buf[0] = reg; + buf[1] = 0; + + msg[0].addr = AD5816G_VCM_ADDR; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = &buf[0]; + + msg[1].addr = AD5816G_VCM_ADDR; + msg[1].flags = I2C_M_RD; + msg[1].len = 1; + msg[1].buf = &buf[1]; + *val = 0; + if (i2c_transfer(client->adapter, msg, 2) != 2) + return -EIO; + *val = buf[1]; + return 0; +} + +static int ad5816g_i2c_wr8(struct i2c_client *client, u8 reg, u8 val) +{ + struct i2c_msg msg; + u8 buf[2]; + buf[0] = reg; + buf[1] = val; + msg.addr = AD5816G_VCM_ADDR; + msg.flags = 0; + msg.len = 2; + msg.buf = &buf[0]; + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + return 0; +} + +static int ad5816g_i2c_wr16(struct i2c_client *client, u8 reg, u16 val) +{ + struct i2c_msg msg; + u8 buf[3]; + buf[0] = reg; + buf[1] = (u8)(val >> 8); + buf[2] = (u8)(val & 0xff); + msg.addr = AD5816G_VCM_ADDR; + msg.flags = 0; + msg.len = 3; + msg.buf = &buf[0]; + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + return 0; +} + +static int ad5816g_set_arc_mode(struct i2c_client *client) +{ + int ret; + + ret = ad5816g_i2c_wr8(client, AD5816G_CONTROL, AD5816G_ARC_EN); + if (ret) + return ret; + + ret = ad5816g_i2c_wr8(client, AD5816G_MODE, + AD5816G_MODE_2_5M_SWITCH_CLOCK); + if (ret) + return ret; + + ret = ad5816g_i2c_wr8(client, AD5816G_VCM_FREQ, AD5816G_DEF_FREQ); + return ret; +} + +int ad5816g_vcm_power_up(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u8 ad5816g_id; + + /* Enable power */ + ret = ad5816g_dev.platform_data->power_ctrl(sd, 1); + if (ret) + return ret; + /* waiting time AD5816G(vcm) - t1 + t2 + * t1(1ms) -Time from VDD high to first i2c cmd + * t2(100us) - exit power-down mode time + */ + usleep_range(1100, 2200); + /* Detect device */ + ret = ad5816g_i2c_rd8(client, AD5816G_IC_INFO, &ad5816g_id); + if (ret < 0) + goto fail_powerdown; + if (ad5816g_id != AD5816G_ID) { + ret = -ENXIO; + goto fail_powerdown; + } + ret = ad5816g_set_arc_mode(client); + if (ret) + return ret; + + /* set the VCM_THRESHOLD */ + ret = ad5816g_i2c_wr8(client, AD5816G_VCM_THRESHOLD, + AD5816G_DEF_THRESHOLD); + + return ret; + +fail_powerdown: + ad5816g_dev.platform_data->power_ctrl(sd, 0); + return ret; +} + +int ad5816g_vcm_power_down(struct v4l2_subdev *sd) +{ + return ad5816g_dev.platform_data->power_ctrl(sd, 0); +} + + +int ad5816g_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u16 data = val & VCM_CODE_MASK; + + return ad5816g_i2c_wr16(client, AD5816G_VCM_CODE_MSB, data); +} + +int ad5816g_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + int ret; + + value = clamp(value, 0, AD5816G_MAX_FOCUS_POS); + ret = ad5816g_t_focus_vcm(sd, value); + if (ret == 0) { + ad5816g_dev.number_of_steps = value - ad5816g_dev.focus; + ad5816g_dev.focus = value; + getnstimeofday(&(ad5816g_dev.timestamp_t_focus_abs)); + } + + return ret; +} + +int ad5816g_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + + return ad5816g_t_focus_abs(sd, ad5816g_dev.focus + value); +} + +int ad5816g_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + u32 status = 0; + struct timespec temptime; + const struct timespec timedelay = { + 0, + min_t(u32, abs(ad5816g_dev.number_of_steps) * DELAY_PER_STEP_NS, + DELAY_MAX_PER_STEP_NS), + }; + + ktime_get_ts(&temptime); + + temptime = timespec_sub(temptime, (ad5816g_dev.timestamp_t_focus_abs)); + + if (timespec_compare(&temptime, &timedelay) <= 0) { + status |= ATOMISP_FOCUS_STATUS_MOVING; + status |= ATOMISP_FOCUS_HP_IN_PROGRESS; + } else { + status |= ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE; + status |= ATOMISP_FOCUS_HP_COMPLETE; + } + *value = status; + + return 0; +} + +int ad5816g_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + s32 val; + + ad5816g_q_focus_status(sd, &val); + + if (val & ATOMISP_FOCUS_STATUS_MOVING) + *value = ad5816g_dev.focus - ad5816g_dev.number_of_steps; + else + *value = ad5816g_dev.focus; + + return 0; +} + +int ad5816g_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int ad5816g_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int ad5816g_vcm_init(struct v4l2_subdev *sd) +{ + ad5816g_dev.platform_data = camera_get_af_platform_data(); + return (NULL == ad5816g_dev.platform_data) ? -ENODEV : 0; + +} + + diff --git a/drivers/staging/media/atomisp/i2c/imx/ad5816g.h b/drivers/staging/media/atomisp/i2c/imx/ad5816g.h new file mode 100644 index 0000000..f995c2e --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/ad5816g.h @@ -0,0 +1,49 @@ +#ifndef __AD5816G_H__ +#define __AD5816G_H__ + +#include "../../include/linux/atomisp_platform.h" +#include <linux/types.h> +#include <linux/time.h> + +#define AD5816G_VCM_ADDR 0x0e + +/* ad5816g device structure */ +struct ad5816g_device { + const struct camera_af_platform_data *platform_data; + struct timespec timestamp_t_focus_abs; + struct timespec focus_time; /* Time when focus was last time set */ + s32 focus; /* Current focus value */ + s16 number_of_steps; +}; + +#define AD5816G_INVALID_CONFIG 0xffffffff +#define AD5816G_MAX_FOCUS_POS 1023 +#define DELAY_PER_STEP_NS 1000000 +#define DELAY_MAX_PER_STEP_NS (1000000 * 1023) + +/* Register Definitions */ +#define AD5816G_IC_INFO 0x00 +#define AD5816G_IC_VERSION 0x01 +#define AD5816G_CONTROL 0x02 +#define AD5816G_VCM_CODE_MSB 0x03 +#define AD5816G_VCM_CODE_LSB 0x04 +#define AD5816G_STATUS 0x05 +#define AD5816G_MODE 0x06 +#define AD5816G_VCM_FREQ 0x07 +#define AD5816G_VCM_THRESHOLD 0x08 + +/* ARC MODE ENABLE */ +#define AD5816G_ARC_EN 0x02 +/* ARC RES2 MODE */ +#define AD5816G_ARC_RES2 0x01 +/* ARC VCM FREQ - 78.1Hz */ +#define AD5816G_DEF_FREQ 0x7a +/* ARC VCM THRESHOLD - 0x08 << 1 */ +#define AD5816G_DEF_THRESHOLD 0x64 +#define AD5816G_ID 0x24 +#define VCM_CODE_MASK 0x03ff + +#define AD5816G_MODE_2_5M_SWITCH_CLOCK 0x14 + +#endif + diff --git a/drivers/staging/media/atomisp/i2c/imx/common.h b/drivers/staging/media/atomisp/i2c/imx/common.h new file mode 100644 index 0000000..7e525ce --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/common.h @@ -0,0 +1,65 @@ +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#define MAX_FPS_OPTIONS_SUPPORTED 3 +#define I2C_MSG_LENGTH 0x2 +#define E2PROM_2ADDR 0x80000000 +#define E2PROM_ADDR_MASK 0x7fffffff + +/* Defines for register writes and register array processing */ +#define IMX_BYTE_MAX 32 +#define IMX_SHORT_MAX 16 +#define I2C_RETRY_COUNT 5 +#define IMX_TOK_MASK 0xfff0 + +enum imx_tok_type { + IMX_8BIT = 0x0001, + IMX_16BIT = 0x0002, + IMX_TOK_TERM = 0xf000, /* terminating token for reg list */ + IMX_TOK_DELAY = 0xfe00 /* delay token for reg list */ +}; + +/** + * struct imx_reg - MI sensor register format + * @type: type of the register + * @reg: 16-bit offset to register + * @val: 8/16/32-bit register value + * + * Define a structure for sensor register initialization values + */ +struct imx_reg { + enum imx_tok_type type; + u16 sreg; + u32 val; /* @set value for read/mod/write, @mask */ +}; + +struct imx_fps_setting { + int fps; + unsigned short pixels_per_line; + unsigned short lines_per_frame; + int mipi_freq; /* MIPI lane frequency in kHz */ + const struct imx_reg *regs; /* regs that the fps setting needs */ +}; + +struct imx_resolution { + const struct imx_fps_setting fps_options[MAX_FPS_OPTIONS_SUPPORTED]; + u8 *desc; + const struct imx_reg *regs; + int res; + int width; + int height; + int fps; + unsigned short pixels_per_line; + unsigned short lines_per_frame; + int mipi_freq; /* MIPI lane frequency in kHz */ + unsigned short skip_frames; + u8 bin_factor_x; + u8 bin_factor_y; + bool used; +}; + +#define GROUPED_PARAMETER_HOLD_ENABLE {IMX_8BIT, 0x0104, 0x1} +#define GROUPED_PARAMETER_HOLD_DISABLE {IMX_8BIT, 0x0104, 0x0} + +int imx_write_reg(struct i2c_client *client, u16 data_length, u16 reg, u16 val); +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/drv201.c b/drivers/staging/media/atomisp/i2c/imx/drv201.c new file mode 100644 index 0000000..915e401 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/drv201.c @@ -0,0 +1,218 @@ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/gpio.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/kmod.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include <asm/intel-mid.h> + +#include "drv201.h" + +static struct drv201_device drv201_dev; + +static int drv201_i2c_rd8(struct i2c_client *client, u8 reg, u8 *val) +{ + struct i2c_msg msg[2]; + u8 buf[2]; + buf[0] = reg; + buf[1] = 0; + + msg[0].addr = DRV201_VCM_ADDR; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = &buf[0]; + + msg[1].addr = DRV201_VCM_ADDR; + msg[1].flags = I2C_M_RD; + msg[1].len = 1; + msg[1].buf = &buf[1]; + *val = 0; + if (i2c_transfer(client->adapter, msg, 2) != 2) + return -EIO; + *val = buf[1]; + return 0; +} + +static int drv201_i2c_wr8(struct i2c_client *client, u8 reg, u8 val) +{ + struct i2c_msg msg; + u8 buf[2]; + buf[0] = reg; + buf[1] = val; + msg.addr = DRV201_VCM_ADDR; + msg.flags = 0; + msg.len = 2; + msg.buf = &buf[0]; + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + return 0; +} + +static int drv201_i2c_wr16(struct i2c_client *client, u8 reg, u16 val) +{ + struct i2c_msg msg; + u8 buf[3]; + buf[0] = reg; + buf[1] = (u8)(val >> 8); + buf[2] = (u8)(val & 0xff); + msg.addr = DRV201_VCM_ADDR; + msg.flags = 0; + msg.len = 3; + msg.buf = &buf[0]; + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + return 0; +} + +int drv201_vcm_power_up(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u8 value; + + /* Enable power */ + ret = drv201_dev.platform_data->power_ctrl(sd, 1); + if (ret) + return ret; + /* Wait for VBAT to stabilize */ + udelay(1); + /* + * Jiggle SCL pin to wake up device. + * Drv201 expect SCL from low to high to wake device up. + * So the 1st access to i2c would fail. + * Using following function to wake device up. + */ + drv201_i2c_wr8(client, DRV201_CONTROL, DRV201_RESET); + + /* Need 100us to transit from SHUTDOWN to STANDBY*/ + usleep_range(WAKEUP_DELAY_US, WAKEUP_DELAY_US * 10); + + /* Reset device */ + ret = drv201_i2c_wr8(client, DRV201_CONTROL, DRV201_RESET); + if (ret < 0) + goto fail_powerdown; + + /* Detect device */ + ret = drv201_i2c_rd8(client, DRV201_CONTROL, &value); + if (ret < 0) + goto fail_powerdown; + if (value != DEFAULT_CONTROL_VAL) { + ret = -ENXIO; + goto fail_powerdown; + } + + drv201_dev.focus = DRV201_MAX_FOCUS_POS; + drv201_dev.initialized = true; + + return 0; +fail_powerdown: + drv201_dev.platform_data->power_ctrl(sd, 0); + return ret; +} + +int drv201_vcm_power_down(struct v4l2_subdev *sd) +{ + return drv201_dev.platform_data->power_ctrl(sd, 0); +} + + +int drv201_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u16 data = val & VCM_CODE_MASK; + + if (!drv201_dev.initialized) + return -ENODEV; + return drv201_i2c_wr16(client, DRV201_VCM_CURRENT, data); +} + +int drv201_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + int ret; + + value = clamp(value, 0, DRV201_MAX_FOCUS_POS); + ret = drv201_t_focus_vcm(sd, value); + if (ret == 0) { + drv201_dev.number_of_steps = value - drv201_dev.focus; + drv201_dev.focus = value; + getnstimeofday(&(drv201_dev.timestamp_t_focus_abs)); + } + + return ret; +} + +int drv201_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + return drv201_t_focus_abs(sd, drv201_dev.focus + value); +} + +int drv201_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + u32 status = 0; + struct timespec temptime; + const struct timespec timedelay = { + 0, + min_t(u32, abs(drv201_dev.number_of_steps)*DELAY_PER_STEP_NS, + DELAY_MAX_PER_STEP_NS), + }; + + ktime_get_ts(&temptime); + + temptime = timespec_sub(temptime, (drv201_dev.timestamp_t_focus_abs)); + + if (timespec_compare(&temptime, &timedelay) <= 0) { + status |= ATOMISP_FOCUS_STATUS_MOVING; + status |= ATOMISP_FOCUS_HP_IN_PROGRESS; + } else { + status |= ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE; + status |= ATOMISP_FOCUS_HP_COMPLETE; + } + *value = status; + + return 0; +} + +int drv201_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + s32 val; + + drv201_q_focus_status(sd, &val); + + if (val & ATOMISP_FOCUS_STATUS_MOVING) + *value = drv201_dev.focus - drv201_dev.number_of_steps; + else + *value = drv201_dev.focus; + + return 0; +} + +int drv201_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int drv201_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int drv201_vcm_init(struct v4l2_subdev *sd) +{ + drv201_dev.platform_data = camera_get_af_platform_data(); + return (NULL == drv201_dev.platform_data) ? -ENODEV : 0; +} + + + diff --git a/drivers/staging/media/atomisp/i2c/imx/drv201.h b/drivers/staging/media/atomisp/i2c/imx/drv201.h new file mode 100644 index 0000000..8fc0ad1 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/drv201.h @@ -0,0 +1,38 @@ +#ifndef __DRV201_H__ +#define __DRV201_H__ + +#include "../../include/linux/atomisp_platform.h" +#include <linux/types.h> +#include <linux/time.h> + +#define DRV201_VCM_ADDR 0x0e + +/* drv201 device structure */ +struct drv201_device { + const struct camera_af_platform_data *platform_data; + struct timespec timestamp_t_focus_abs; + struct timespec focus_time; /* Time when focus was last time set */ + s32 focus; /* Current focus value */ + s16 number_of_steps; + bool initialized; /* true if drv201 is detected */ +}; + +#define DRV201_INVALID_CONFIG 0xffffffff +#define DRV201_MAX_FOCUS_POS 1023 +#define DELAY_PER_STEP_NS 1000000 +#define DELAY_MAX_PER_STEP_NS (1000000 * 1023) + +#define DRV201_CONTROL 2 +#define DRV201_VCM_CURRENT 3 +#define DRV201_STATUS 5 +#define DRV201_MODE 6 +#define DRV201_VCM_FREQ 7 + +#define DEFAULT_CONTROL_VAL 2 +#define DRV201_RESET 1 +#define WAKEUP_DELAY_US 100 +#define VCM_CODE_MASK 0x03ff + +#endif + + diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9714.c b/drivers/staging/media/atomisp/i2c/imx/dw9714.c new file mode 100644 index 0000000..b7dee1b --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9714.c @@ -0,0 +1,235 @@ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/gpio.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/kmod.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include <asm/intel-mid.h> + +#include "dw9714.h" + +static struct dw9714_device dw9714_dev; +static int dw9714_i2c_write(struct i2c_client *client, u16 data) +{ + struct i2c_msg msg; + const int num_msg = 1; + int ret; + u16 val; + + val = cpu_to_be16(data); + msg.addr = DW9714_VCM_ADDR; + msg.flags = 0; + msg.len = DW9714_16BIT; + msg.buf = (u8 *)&val; + + ret = i2c_transfer(client->adapter, &msg, 1); + + return ret == num_msg ? 0 : -EIO; +} + +int dw9714_vcm_power_up(struct v4l2_subdev *sd) +{ + int ret; + + /* Enable power */ + ret = dw9714_dev.platform_data->power_ctrl(sd, 1); + /* waiting time requested by DW9714A(vcm) */ + usleep_range(12000, 12500); + return ret; +} + +int dw9714_vcm_power_down(struct v4l2_subdev *sd) +{ + return dw9714_dev.platform_data->power_ctrl(sd, 0); +} + + +int dw9714_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret = -EINVAL; + u8 mclk = vcm_step_mclk(dw9714_dev.vcm_settings.step_setting); + u8 s = vcm_step_s(dw9714_dev.vcm_settings.step_setting); + + /* + * For different mode, VCM_PROTECTION_OFF/ON required by the + * control procedure. For DW9714_DIRECT/DLC mode, slew value is + * VCM_DEFAULT_S(0). + */ + switch (dw9714_dev.vcm_mode) { + case DW9714_DIRECT: + if (dw9714_dev.vcm_settings.update) { + ret = dw9714_i2c_write(client, VCM_PROTECTION_OFF); + if (ret) + return ret; + ret = dw9714_i2c_write(client, DIRECT_VCM); + if (ret) + return ret; + ret = dw9714_i2c_write(client, VCM_PROTECTION_ON); + if (ret) + return ret; + dw9714_dev.vcm_settings.update = false; + } + ret = dw9714_i2c_write(client, + vcm_val(val, VCM_DEFAULT_S)); + break; + case DW9714_LSC: + if (dw9714_dev.vcm_settings.update) { + ret = dw9714_i2c_write(client, VCM_PROTECTION_OFF); + if (ret) + return ret; + ret = dw9714_i2c_write(client, + vcm_dlc_mclk(DLC_DISABLE, mclk)); + if (ret) + return ret; + ret = dw9714_i2c_write(client, + vcm_tsrc(dw9714_dev.vcm_settings.t_src)); + if (ret) + return ret; + ret = dw9714_i2c_write(client, VCM_PROTECTION_ON); + if (ret) + return ret; + dw9714_dev.vcm_settings.update = false; + } + ret = dw9714_i2c_write(client, vcm_val(val, s)); + break; + case DW9714_DLC: + if (dw9714_dev.vcm_settings.update) { + ret = dw9714_i2c_write(client, VCM_PROTECTION_OFF); + if (ret) + return ret; + ret = dw9714_i2c_write(client, + vcm_dlc_mclk(DLC_ENABLE, mclk)); + if (ret) + return ret; + ret = dw9714_i2c_write(client, + vcm_tsrc(dw9714_dev.vcm_settings.t_src)); + if (ret) + return ret; + ret = dw9714_i2c_write(client, VCM_PROTECTION_ON); + if (ret) + return ret; + dw9714_dev.vcm_settings.update = false; + } + ret = dw9714_i2c_write(client, + vcm_val(val, VCM_DEFAULT_S)); + break; + } + return ret; +} + +int dw9714_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + int ret; + + value = clamp(value, 0, DW9714_MAX_FOCUS_POS); + ret = dw9714_t_focus_vcm(sd, value); + if (ret == 0) { + dw9714_dev.number_of_steps = value - dw9714_dev.focus; + dw9714_dev.focus = value; + getnstimeofday(&(dw9714_dev.timestamp_t_focus_abs)); + } + + return ret; +} + +int dw9714_t_focus_abs_init(struct v4l2_subdev *sd) +{ + int ret; + + ret = dw9714_t_focus_vcm(sd, DW9714_DEFAULT_FOCUS_POS); + if (ret == 0) { + dw9714_dev.number_of_steps = + DW9714_DEFAULT_FOCUS_POS - dw9714_dev.focus; + dw9714_dev.focus = DW9714_DEFAULT_FOCUS_POS; + getnstimeofday(&(dw9714_dev.timestamp_t_focus_abs)); + } + + return ret; +} + +int dw9714_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + + return dw9714_t_focus_abs(sd, dw9714_dev.focus + value); +} + +int dw9714_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + u32 status = 0; + struct timespec temptime; + const struct timespec timedelay = { + 0, + min_t(u32, abs(dw9714_dev.number_of_steps)*DELAY_PER_STEP_NS, + DELAY_MAX_PER_STEP_NS), + }; + + ktime_get_ts(&temptime); + + temptime = timespec_sub(temptime, (dw9714_dev.timestamp_t_focus_abs)); + + if (timespec_compare(&temptime, &timedelay) <= 0) { + status |= ATOMISP_FOCUS_STATUS_MOVING; + status |= ATOMISP_FOCUS_HP_IN_PROGRESS; + } else { + status |= ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE; + status |= ATOMISP_FOCUS_HP_COMPLETE; + } + *value = status; + + return 0; +} + +int dw9714_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + s32 val; + + dw9714_q_focus_status(sd, &val); + + if (val & ATOMISP_FOCUS_STATUS_MOVING) + *value = dw9714_dev.focus - dw9714_dev.number_of_steps; + else + *value = dw9714_dev.focus; + + return 0; +} + +int dw9714_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + dw9714_dev.vcm_settings.step_setting = value; + dw9714_dev.vcm_settings.update = true; + + return 0; +} + +int dw9714_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + dw9714_dev.vcm_settings.t_src = value; + dw9714_dev.vcm_settings.update = true; + + return 0; +} + +int dw9714_vcm_init(struct v4l2_subdev *sd) +{ + + /* set VCM to home position and vcm mode to direct*/ + dw9714_dev.vcm_mode = DW9714_DIRECT; + dw9714_dev.vcm_settings.update = false; + dw9714_dev.platform_data = camera_get_af_platform_data(); + return (NULL == dw9714_dev.platform_data) ? -ENODEV : 0; + +} + diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9714.h b/drivers/staging/media/atomisp/i2c/imx/dw9714.h new file mode 100644 index 0000000..5a98a9c --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9714.h @@ -0,0 +1,63 @@ +#ifndef __DW9714_H__ +#define __DW9714_H__ + +#include "../../include/linux/atomisp_platform.h" +#include <linux/types.h> + + +#define DW9714_VCM_ADDR 0x0c + +enum dw9714_tok_type { + DW9714_8BIT = 0x0001, + DW9714_16BIT = 0x0002, +}; + +struct dw9714_vcm_settings { + u16 code; /* bit[9:0]: Data[9:0] */ + u8 t_src; /* bit[4:0]: T_SRC[4:0] */ + u8 step_setting; /* bit[3:0]: S[3:0]/bit[5:4]: MCLK[1:0] */ + bool update; +}; + +enum dw9714_vcm_mode { + DW9714_DIRECT = 0x1, /* direct control */ + DW9714_LSC = 0x2, /* linear slope control */ + DW9714_DLC = 0x3, /* dual level control */ +}; + +/* dw9714 device structure */ +struct dw9714_device { + struct dw9714_vcm_settings vcm_settings; + struct timespec timestamp_t_focus_abs; + enum dw9714_vcm_mode vcm_mode; + s16 number_of_steps; + bool initialized; /* true if dw9714 is detected */ + s32 focus; /* Current focus value */ + struct timespec focus_time; /* Time when focus was last time set */ + __u8 buffer[4]; /* Used for i2c transactions */ + const struct camera_af_platform_data *platform_data; +}; + +#define DW9714_INVALID_CONFIG 0xffffffff +#define DW9714_MAX_FOCUS_POS 1023 +#define DW9714_DEFAULT_FOCUS_POS 290 + + +/* MCLK[1:0] = 01 T_SRC[4:0] = 00001 S[3:0] = 0111 */ +#define DELAY_PER_STEP_NS 1000000 +#define DELAY_MAX_PER_STEP_NS (1000000 * 1023) + +#define DLC_ENABLE 1 +#define DLC_DISABLE 0 +#define VCM_PROTECTION_OFF 0xeca3 +#define VCM_PROTECTION_ON 0xdc51 +#define VCM_DEFAULT_S 0x0 + +#define vcm_step_s(a) (u8)(a & 0xf) +#define vcm_step_mclk(a) (u8)((a >> 4) & 0x3) +#define vcm_dlc_mclk(dlc, mclk) (u16)((dlc << 3) | mclk | 0xa104) +#define vcm_tsrc(tsrc) (u16)(tsrc << 3 | 0xf200) +#define vcm_val(data, s) (u16)(data << 4 | s) +#define DIRECT_VCM vcm_dlc_mclk(0, 0) + +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9718.c b/drivers/staging/media/atomisp/i2c/imx/dw9718.c new file mode 100644 index 0000000..65a1fcf --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9718.c @@ -0,0 +1,238 @@ +/* + * Support for dw9718 vcm driver. + * + * Copyright (c) 2014 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include <linux/delay.h> +#include "dw9718.h" + +static struct dw9718_device dw9718_dev; + +static int dw9718_i2c_rd8(struct i2c_client *client, u8 reg, u8 *val) +{ + struct i2c_msg msg[2]; + u8 buf[2] = { reg }; + + msg[0].addr = DW9718_VCM_ADDR; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = buf; + + msg[1].addr = DW9718_VCM_ADDR; + msg[1].flags = I2C_M_RD; + msg[1].len = 1; + msg[1].buf = &buf[1]; + *val = 0; + + if (i2c_transfer(client->adapter, msg, 2) != 2) + return -EIO; + *val = buf[1]; + + return 0; +} + +static int dw9718_i2c_wr8(struct i2c_client *client, u8 reg, u8 val) +{ + struct i2c_msg msg; + u8 buf[2] = { reg, val}; + + msg.addr = DW9718_VCM_ADDR; + msg.flags = 0; + msg.len = sizeof(buf); + msg.buf = buf; + + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + + return 0; +} + +static int dw9718_i2c_wr16(struct i2c_client *client, u8 reg, u16 val) +{ + struct i2c_msg msg; + u8 buf[3] = { reg, (u8)(val >> 8), (u8)(val & 0xff)}; + + msg.addr = DW9718_VCM_ADDR; + msg.flags = 0; + msg.len = sizeof(buf); + msg.buf = buf; + + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + + return 0; +} + +int dw9718_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + + value = clamp(value, 0, DW9718_MAX_FOCUS_POS); + ret = dw9718_i2c_wr16(client, DW9718_DATA_M, value); + /*pr_info("%s: value = %d\n", __func__, value);*/ + if (ret < 0) + return ret; + + getnstimeofday(&dw9718_dev.focus_time); + dw9718_dev.focus = value; + + return 0; +} + +int dw9718_vcm_power_up(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u8 value; + + if (dw9718_dev.power_on) + return 0; + + /* Enable power */ + ret = dw9718_dev.platform_data->power_ctrl(sd, 1); + if (ret) { + dev_err(&client->dev, "DW9718_PD power_ctrl failed %d\n", ret); + return ret; + } + /* Wait for VBAT to stabilize */ + udelay(100); + + /* Detect device */ + ret = dw9718_i2c_rd8(client, DW9718_SACT, &value); + if (ret < 0) { + dev_err(&client->dev, "read DW9718_SACT failed %d\n", ret); + goto fail_powerdown; + } + /* + * WORKAROUND: for module P8V12F-203 which are used on + * Cherrytrail Refresh Davis Reef AoB, register SACT is not + * returning default value as spec. But VCM works as expected and + * root cause is still under discussion with vendor. + * workaround here to avoid aborting the power up sequence and just + * give a warning about this error. + */ + if (value != DW9718_SACT_DEFAULT_VAL) + dev_warn(&client->dev, "%s error, incorrect ID\n", __func__); + + /* Initialize according to recommended settings */ + ret = dw9718_i2c_wr8(client, DW9718_CONTROL, + DW9718_CONTROL_SW_LINEAR | + DW9718_CONTROL_S_SAC4 | + DW9718_CONTROL_OCP_DISABLE | + DW9718_CONTROL_UVLO_DISABLE); + if (ret < 0) { + dev_err(&client->dev, "write DW9718_CONTROL failed %d\n", ret); + goto fail_powerdown; + } + ret = dw9718_i2c_wr8(client, DW9718_SACT, + DW9718_SACT_MULT_TWO | + DW9718_SACT_PERIOD_8_8MS); + if (ret < 0) { + dev_err(&client->dev, "write DW9718_SACT failed %d\n", ret); + goto fail_powerdown; + } + + ret = dw9718_t_focus_abs(sd, dw9718_dev.focus); + if (ret) + return ret; + dw9718_dev.initialized = true; + dw9718_dev.power_on = 1; + + return 0; + +fail_powerdown: + dev_err(&client->dev, "%s error, powerup failed\n", __func__); + dw9718_dev.platform_data->power_ctrl(sd, 0); + return ret; +} + +int dw9718_vcm_power_down(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + + if (!dw9718_dev.power_on) + return 0; + + ret = dw9718_dev.platform_data->power_ctrl(sd, 0); + if (ret) { + dev_err(&client->dev, "%s power_ctrl failed\n", + __func__); + return ret; + } + dw9718_dev.power_on = 0; + + return 0; +} + +int dw9718_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + static const struct timespec move_time = { + .tv_sec = 0, + .tv_nsec = 60000000 + }; + struct timespec current_time, finish_time, delta_time; + + getnstimeofday(¤t_time); + finish_time = timespec_add(dw9718_dev.focus_time, move_time); + delta_time = timespec_sub(current_time, finish_time); + if (delta_time.tv_sec >= 0 && delta_time.tv_nsec >= 0) { + *value = ATOMISP_FOCUS_HP_COMPLETE | + ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE; + } else { + *value = ATOMISP_FOCUS_STATUS_MOVING | + ATOMISP_FOCUS_HP_IN_PROGRESS; + } + + return 0; +} + +int dw9718_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + return -EINVAL; +} + +int dw9718_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + return dw9718_t_focus_abs(sd, dw9718_dev.focus + value); +} + +int dw9718_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + *value = dw9718_dev.focus; + return 0; +} +int dw9718_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int dw9718_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int dw9718_vcm_init(struct v4l2_subdev *sd) +{ + dw9718_dev.platform_data = camera_get_af_platform_data(); + dw9718_dev.focus = DW9718_DEFAULT_FOCUS_POSITION; + dw9718_dev.power_on = 0; + return (NULL == dw9718_dev.platform_data) ? -ENODEV : 0; +} diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9718.h b/drivers/staging/media/atomisp/i2c/imx/dw9718.h new file mode 100644 index 0000000..4a1040c --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9718.h @@ -0,0 +1,64 @@ +/* + * Support for dw9719 vcm driver. + * + * Copyright (c) 2014 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __DW9718_H__ +#define __DW9718_H__ + +#include "../../include/linux/atomisp_platform.h" +#include <linux/types.h> + +#define DW9718_VCM_ADDR (0x18 >> 1) + +/* dw9718 device structure */ +struct dw9718_device { + struct timespec timestamp_t_focus_abs; + s16 number_of_steps; + bool initialized; /* true if dw9718 is detected */ + s32 focus; /* Current focus value */ + struct timespec focus_time; /* Time when focus was last time set */ + __u8 buffer[4]; /* Used for i2c transactions */ + const struct camera_af_platform_data *platform_data; + __u8 power_on; +}; + +#define DW9718_MAX_FOCUS_POS 1023 + +/* Register addresses */ +#define DW9718_PD 0x00 +#define DW9718_CONTROL 0x01 +#define DW9718_DATA_M 0x02 +#define DW9718_DATA_L 0x03 +#define DW9718_SW 0x04 +#define DW9718_SACT 0x05 +#define DW9718_FLAG 0x10 + +#define DW9718_CONTROL_SW_LINEAR BIT(0) +#define DW9718_CONTROL_S_SAC4 (BIT(1) | BIT(3)) +#define DW9718_CONTROL_OCP_DISABLE BIT(4) +#define DW9718_CONTROL_UVLO_DISABLE BIT(5) + +#define DW9718_SACT_MULT_TWO 0x00 +#define DW9718_SACT_PERIOD_8_8MS 0x19 +#define DW9718_SACT_DEFAULT_VAL 0x60 + +#define DW9718_DEFAULT_FOCUS_POSITION 300 + +#endif /* __DW9718_H__ */ diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9719.c b/drivers/staging/media/atomisp/i2c/imx/dw9719.c new file mode 100644 index 0000000..eca2d76 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9719.c @@ -0,0 +1,209 @@ +/* + * Support for dw9719 vcm driver. + * + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include <linux/delay.h> +#include "dw9719.h" + +static struct dw9719_device dw9719_dev; + +static int dw9719_i2c_rd8(struct i2c_client *client, u8 reg, u8 *val) +{ + struct i2c_msg msg[2]; + u8 buf[2] = { reg }; + + msg[0].addr = DW9719_VCM_ADDR; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = buf; + + msg[1].addr = DW9719_VCM_ADDR; + msg[1].flags = I2C_M_RD; + msg[1].len = 1; + msg[1].buf = &buf[1]; + *val = 0; + + if (i2c_transfer(client->adapter, msg, 2) != 2) + return -EIO; + *val = buf[1]; + + return 0; +} + +static int dw9719_i2c_wr8(struct i2c_client *client, u8 reg, u8 val) +{ + struct i2c_msg msg; + u8 buf[2] = { reg, val }; + + msg.addr = DW9719_VCM_ADDR; + msg.flags = 0; + msg.len = sizeof(buf); + msg.buf = buf; + + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + + return 0; +} + +static int dw9719_i2c_wr16(struct i2c_client *client, u8 reg, u16 val) +{ + struct i2c_msg msg; + u8 buf[3] = { reg, (u8)(val >> 8), (u8)(val & 0xff)}; + + msg.addr = DW9719_VCM_ADDR; + msg.flags = 0; + msg.len = sizeof(buf); + msg.buf = buf; + + if (i2c_transfer(client->adapter, &msg, 1) != 1) + return -EIO; + + return 0; +} + +int dw9719_vcm_power_up(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u8 value; + + /* Enable power */ + ret = dw9719_dev.platform_data->power_ctrl(sd, 1); + /* waiting time requested by DW9714A(vcm) */ + if (ret) + return ret; + /* Wait for VBAT to stabilize */ + udelay(1); + + /* + * Jiggle SCL pin to wake up device. + */ + ret = dw9719_i2c_wr8(client, DW9719_CONTROL, 1); + /* Need 100us to transit from SHUTDOWN to STANDBY*/ + usleep_range(100, 1000); + + /* Enable the ringing compensation */ + ret = dw9719_i2c_wr8(client, DW9719_CONTROL, DW9719_ENABLE_RINGING); + if (ret < 0) + goto fail_powerdown; + + /* Use SAC3 mode */ + ret = dw9719_i2c_wr8(client, DW9719_MODE, DW9719_MODE_SAC3); + if (ret < 0) + goto fail_powerdown; + + /* Set the resonance frequency */ + ret = dw9719_i2c_wr8(client, DW9719_VCM_FREQ, DW9719_DEFAULT_VCM_FREQ); + if (ret < 0) + goto fail_powerdown; + + /* Detect device */ + ret = dw9719_i2c_rd8(client, DW9719_INFO, &value); + if (ret < 0) + goto fail_powerdown; + if (value != DW9719_ID) { + ret = -ENXIO; + goto fail_powerdown; + } + dw9719_dev.focus = 0; + dw9719_dev.initialized = true; + + return 0; + +fail_powerdown: + dw9719_dev.platform_data->power_ctrl(sd, 0); + return ret; +} + +int dw9719_vcm_power_down(struct v4l2_subdev *sd) +{ + return dw9719_dev.platform_data->power_ctrl(sd, 0); +} + +int dw9719_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + static const struct timespec move_time = { + + .tv_sec = 0, + .tv_nsec = 60000000 + }; + struct timespec current_time, finish_time, delta_time; + + getnstimeofday(¤t_time); + finish_time = timespec_add(dw9719_dev.focus_time, move_time); + delta_time = timespec_sub(current_time, finish_time); + if (delta_time.tv_sec >= 0 && delta_time.tv_nsec >= 0) { + *value = ATOMISP_FOCUS_HP_COMPLETE | + ATOMISP_FOCUS_STATUS_ACCEPTS_NEW_MOVE; + } else { + *value = ATOMISP_FOCUS_STATUS_MOVING | + ATOMISP_FOCUS_HP_IN_PROGRESS; + } + + return 0; +} + +int dw9719_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + return -EINVAL; +} + +int dw9719_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + + value = clamp(value, 0, DW9719_MAX_FOCUS_POS); + ret = dw9719_i2c_wr16(client, DW9719_VCM_CURRENT, value); + if (ret < 0) + return ret; + + getnstimeofday(&dw9719_dev.focus_time); + dw9719_dev.focus = value; + + return 0; +} + +int dw9719_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + return dw9719_t_focus_abs(sd, dw9719_dev.focus + value); +} + +int dw9719_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + *value = dw9719_dev.focus; + return 0; +} +int dw9719_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int dw9719_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + return 0; +} + +int dw9719_vcm_init(struct v4l2_subdev *sd) +{ + dw9719_dev.platform_data = camera_get_af_platform_data(); + return (NULL == dw9719_dev.platform_data) ? -ENODEV : 0; +} diff --git a/drivers/staging/media/atomisp/i2c/imx/dw9719.h b/drivers/staging/media/atomisp/i2c/imx/dw9719.h new file mode 100644 index 0000000..711f412 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/dw9719.h @@ -0,0 +1,58 @@ +/* + * Support for dw9719 vcm driver. + * + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __DW9719_H__ +#define __DW9719_H__ + +#include "../../include/linux/atomisp_platform.h" +#include <linux/types.h> + +#define DW9719_VCM_ADDR (0x18 >> 1) + +/* dw9719 device structure */ +struct dw9719_device { + struct timespec timestamp_t_focus_abs; + s16 number_of_steps; + bool initialized; /* true if dw9719 is detected */ + s32 focus; /* Current focus value */ + struct timespec focus_time; /* Time when focus was last time set */ + __u8 buffer[4]; /* Used for i2c transactions */ + const struct camera_af_platform_data *platform_data; +}; + +#define DW9719_INVALID_CONFIG 0xffffffff +#define DW9719_MAX_FOCUS_POS 1023 +#define DELAY_PER_STEP_NS 1000000 +#define DELAY_MAX_PER_STEP_NS (1000000 * 1023) + +#define DW9719_INFO 0 +#define DW9719_ID 0xF1 +#define DW9719_CONTROL 2 +#define DW9719_VCM_CURRENT 3 + +#define DW9719_MODE 6 +#define DW9719_VCM_FREQ 7 + +#define DW9719_MODE_SAC3 0x40 +#define DW9719_DEFAULT_VCM_FREQ 0x04 +#define DW9719_ENABLE_RINGING 0x02 + +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/imx.c b/drivers/staging/media/atomisp/i2c/imx/imx.c new file mode 100644 index 0000000..408a7b9 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx.c @@ -0,0 +1,2512 @@ +/* + * Support for Sony imx 8MP camera sensor. + * + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <asm/intel-mid.h> +#include "../../include/linux/atomisp_platform.h" +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/gpio.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include "../../include/linux/libmsrlisthelper.h" +#include <linux/mm.h> +#include <linux/kmod.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/types.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-device.h> +#include "imx.h" + +/* + * The imx135 embedded data info: + * embedded data line num: 2 + * line 0 effective data size(byte): 76 + * line 1 effective data size(byte): 113 + */ +static const uint32_t + imx135_embedded_effective_size[IMX135_EMBEDDED_DATA_LINE_NUM] + = {76, 113}; + +static enum atomisp_bayer_order imx_bayer_order_mapping[] = { + atomisp_bayer_order_rggb, + atomisp_bayer_order_grbg, + atomisp_bayer_order_gbrg, + atomisp_bayer_order_bggr +}; + +static const unsigned int +IMX227_BRACKETING_LUT_FRAME_ENTRY[IMX_MAX_AE_LUT_LENGTH] = { + 0x0E10, 0x0E1E, 0x0E2C, 0x0E3A, 0x0E48}; + +static int +imx_read_reg(struct i2c_client *client, u16 len, u16 reg, u16 *val) +{ + struct i2c_msg msg[2]; + u16 data[IMX_SHORT_MAX]; + int ret, i; + int retry = 0; + + if (len > IMX_BYTE_MAX) { + dev_err(&client->dev, "%s error, invalid data length\n", + __func__); + return -EINVAL; + } + + do { + memset(msg, 0 , sizeof(msg)); + memset(data, 0 , sizeof(data)); + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = I2C_MSG_LENGTH; + msg[0].buf = (u8 *)data; + /* high byte goes first */ + data[0] = cpu_to_be16(reg); + + msg[1].addr = client->addr; + msg[1].len = len; + msg[1].flags = I2C_M_RD; + msg[1].buf = (u8 *)data; + + ret = i2c_transfer(client->adapter, msg, 2); + if (ret != 2) { + dev_err(&client->dev, + "retrying i2c read from offset 0x%x error %d... %d\n", + reg, ret, retry); + msleep(20); + } + } while (ret != 2 && retry++ < I2C_RETRY_COUNT); + + if (ret != 2) + return -EIO; + + /* high byte comes first */ + if (len == IMX_8BIT) { + *val = (u8)data[0]; + } else { + /* 16-bit access is default when len > 1 */ + for (i = 0; i < (len >> 1); i++) + val[i] = be16_to_cpu(data[i]); + } + + return 0; +} + +static int imx_i2c_write(struct i2c_client *client, u16 len, u8 *data) +{ + struct i2c_msg msg; + int ret; + int retry = 0; + + do { + msg.addr = client->addr; + msg.flags = 0; + msg.len = len; + msg.buf = data; + + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret != 1) { + dev_err(&client->dev, + "retrying i2c write transfer... %d\n", retry); + msleep(20); + } + } while (ret != 1 && retry++ < I2C_RETRY_COUNT); + + return ret == 1 ? 0 : -EIO; +} + +int +imx_write_reg(struct i2c_client *client, u16 data_length, u16 reg, u16 val) +{ + int ret; + unsigned char data[4] = {0}; + u16 *wreg = (u16 *)data; + const u16 len = data_length + sizeof(u16); /* 16-bit address + data */ + + if (data_length != IMX_8BIT && data_length != IMX_16BIT) { + v4l2_err(client, "%s error, invalid data_length\n", __func__); + return -EINVAL; + } + + /* high byte goes out first */ + *wreg = cpu_to_be16(reg); + + if (data_length == IMX_8BIT) + data[2] = (u8)(val); + else { + /* IMX_16BIT */ + u16 *wdata = (u16 *)&data[2]; + *wdata = cpu_to_be16(val); + } + + ret = imx_i2c_write(client, len, data); + if (ret) + dev_err(&client->dev, + "write error: wrote 0x%x to offset 0x%x error %d", + val, reg, ret); + + return ret; +} + +/* + * imx_write_reg_array - Initializes a list of imx registers + * @client: i2c driver client structure + * @reglist: list of registers to be written + * + * This function initializes a list of registers. When consecutive addresses + * are found in a row on the list, this function creates a buffer and sends + * consecutive data in a single i2c_transfer(). + * + * __imx_flush_reg_array, __imx_buf_reg_array() and + * __imx_write_reg_is_consecutive() are internal functions to + * imx_write_reg_array_fast() and should be not used anywhere else. + * + */ + +static int __imx_flush_reg_array(struct i2c_client *client, + struct imx_write_ctrl *ctrl) +{ + u16 size; + + if (ctrl->index == 0) + return 0; + + size = sizeof(u16) + ctrl->index; /* 16-bit address + data */ + ctrl->buffer.addr = cpu_to_be16(ctrl->buffer.addr); + ctrl->index = 0; + + return imx_i2c_write(client, size, (u8 *)&ctrl->buffer); +} + +static int __imx_buf_reg_array(struct i2c_client *client, + struct imx_write_ctrl *ctrl, + const struct imx_reg *next) +{ + int size; + u16 *data16; + + switch (next->type) { + case IMX_8BIT: + size = 1; + ctrl->buffer.data[ctrl->index] = (u8)next->val; + break; + case IMX_16BIT: + size = 2; + data16 = (u16 *)&ctrl->buffer.data[ctrl->index]; + *data16 = cpu_to_be16((u16)next->val); + break; + default: + return -EINVAL; + } + + /* When first item is added, we need to store its starting address */ + if (ctrl->index == 0) + ctrl->buffer.addr = next->sreg; + + ctrl->index += size; + + /* + * Buffer cannot guarantee free space for u32? Better flush it to avoid + * possible lack of memory for next item. + */ + if (ctrl->index + sizeof(u16) >= IMX_MAX_WRITE_BUF_SIZE) + return __imx_flush_reg_array(client, ctrl); + + return 0; +} + +static int +__imx_write_reg_is_consecutive(struct i2c_client *client, + struct imx_write_ctrl *ctrl, + const struct imx_reg *next) +{ + if (ctrl->index == 0) + return 1; + + return ctrl->buffer.addr + ctrl->index == next->sreg; +} + +static int imx_write_reg_array(struct i2c_client *client, + const struct imx_reg *reglist) +{ + const struct imx_reg *next = reglist; + struct imx_write_ctrl ctrl; + int err; + + ctrl.index = 0; + for (; next->type != IMX_TOK_TERM; next++) { + switch (next->type & IMX_TOK_MASK) { + case IMX_TOK_DELAY: + err = __imx_flush_reg_array(client, &ctrl); + if (err) + return err; + msleep(next->val); + break; + + default: + /* + * If next address is not consecutive, data needs to be + * flushed before proceed. + */ + if (!__imx_write_reg_is_consecutive(client, &ctrl, + next)) { + err = __imx_flush_reg_array(client, &ctrl); + if (err) + return err; + } + err = __imx_buf_reg_array(client, &ctrl, next); + if (err) { + v4l2_err(client, "%s: write error, aborted\n", + __func__); + return err; + } + break; + } + } + + return __imx_flush_reg_array(client, &ctrl); +} + +static int __imx_min_fps_diff(int fps, const struct imx_fps_setting *fps_list) +{ + int diff = INT_MAX; + int i; + + if (fps == 0) + return 0; + + for (i = 0; i < MAX_FPS_OPTIONS_SUPPORTED; i++) { + if (!fps_list[i].fps) + break; + if (abs(fps_list[i].fps - fps) < diff) + diff = abs(fps_list[i].fps - fps); + } + + return diff; +} + +static int __imx_nearest_fps_index(int fps, + const struct imx_fps_setting *fps_list) +{ + int fps_index = 0; + int i; + + for (i = 0; i < MAX_FPS_OPTIONS_SUPPORTED; i++) { + if (!fps_list[i].fps) + break; + if (abs(fps_list[i].fps - fps) + < abs(fps_list[fps_index].fps - fps)) + fps_index = i; + } + return fps_index; +} + +/* + * This is to choose the nearest fps setting above the requested fps + * fps_list should be in ascendant order. + */ +static int __imx_above_nearest_fps_index(int fps, + const struct imx_fps_setting *fps_list) +{ + int fps_index = 0; + int i; + + for (i = 0; i < MAX_FPS_OPTIONS_SUPPORTED; i++) { + if (!fps_list[i].fps) + break; + if (fps <= fps_list[i].fps) { + fps_index = i; + break; + } + } + + return fps_index; +} + +static int imx_get_lanes(struct v4l2_subdev *sd) +{ + struct camera_mipi_info *imx_info = v4l2_get_subdev_hostdata(sd); + + if (!imx_info) + return -ENOSYS; + if (imx_info->num_lanes < 1 || imx_info->num_lanes > 4 || + imx_info->num_lanes == 3) + return -EINVAL; + + return imx_info->num_lanes; +} + +static int __imx_update_exposure_timing(struct i2c_client *client, u16 exposure, + u16 llp, u16 fll) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx_device *dev = to_imx_sensor(sd); + int ret = 0; + + if (dev->sensor_id != IMX227_ID) { + /* Increase the VTS to match exposure + margin */ + if (exposure > fll - IMX_INTEGRATION_TIME_MARGIN) + fll = exposure + IMX_INTEGRATION_TIME_MARGIN; + } + + ret = imx_write_reg(client, IMX_16BIT, + dev->reg_addr->line_length_pixels, llp); + if (ret) + return ret; + + ret = imx_write_reg(client, IMX_16BIT, + dev->reg_addr->frame_length_lines, fll); + if (ret) + return ret; + + if (exposure) + ret = imx_write_reg(client, IMX_16BIT, + dev->reg_addr->coarse_integration_time, exposure); + + return ret; +} + +static int __imx_update_gain(struct v4l2_subdev *sd, u16 gain) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + + /* set global gain */ + ret = imx_write_reg(client, IMX_8BIT, dev->reg_addr->global_gain, gain); + if (ret) + return ret; + + /* set short analog gain */ + if (dev->sensor_id == IMX135_ID) + ret = imx_write_reg(client, IMX_8BIT, IMX_SHORT_AGC_GAIN, gain); + + return ret; +} + +static int __imx_update_digital_gain(struct i2c_client *client, u16 digitgain) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx_device *dev = to_imx_sensor(sd); + struct imx_write_buffer digit_gain; + + digit_gain.addr = cpu_to_be16(dev->reg_addr->dgc_adj); + digit_gain.data[0] = (digitgain >> 8) & 0xFF; + digit_gain.data[1] = digitgain & 0xFF; + + if (dev->sensor_id == IMX219_ID) { + return imx_i2c_write(client, IMX219_DGC_LEN, (u8 *)&digit_gain); + } else if (dev->sensor_id == IMX227_ID) { + return imx_i2c_write(client, IMX227_DGC_LEN, (u8 *)&digit_gain); + } else { + digit_gain.data[2] = (digitgain >> 8) & 0xFF; + digit_gain.data[3] = digitgain & 0xFF; + digit_gain.data[4] = (digitgain >> 8) & 0xFF; + digit_gain.data[5] = digitgain & 0xFF; + digit_gain.data[6] = (digitgain >> 8) & 0xFF; + digit_gain.data[7] = digitgain & 0xFF; + return imx_i2c_write(client, IMX_DGC_LEN, (u8 *)&digit_gain); + } + return 0; +} + +static int imx_set_exposure_gain(struct v4l2_subdev *sd, u16 coarse_itg, + u16 gain, u16 digitgain) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + int lanes = imx_get_lanes(sd); + unsigned int digitgain_scaled; + int ret = 0; + + /* Validate exposure: cannot exceed VTS-4 where VTS is 16bit */ + coarse_itg = clamp_t(u16, coarse_itg, 0, IMX_MAX_EXPOSURE_SUPPORTED); + + /* Validate gain: must not exceed maximum 8bit value */ + gain = clamp_t(u16, gain, 0, IMX_MAX_GLOBAL_GAIN_SUPPORTED); + + mutex_lock(&dev->input_lock); + + if (dev->sensor_id == IMX227_ID) { + ret = imx_write_reg_array(client, imx_param_hold); + if (ret) { + mutex_unlock(&dev->input_lock); + return ret; + } + } + + /* For imx175, setting gain must be delayed by one */ + if ((dev->sensor_id == IMX175_ID) && dev->digital_gain) + digitgain_scaled = dev->digital_gain; + else + digitgain_scaled = digitgain; + /* imx132 with two lanes needs more gain to saturate at max */ + if (dev->sensor_id == IMX132_ID && lanes > 1) { + digitgain_scaled *= IMX132_2LANES_GAINFACT; + digitgain_scaled >>= IMX132_2LANES_GAINFACT_SHIFT; + } + /* Validate digital gain: must not exceed 12 bit value*/ + digitgain_scaled = clamp_t(unsigned int, digitgain_scaled, + 0, IMX_MAX_DIGITAL_GAIN_SUPPORTED); + + ret = __imx_update_exposure_timing(client, coarse_itg, + dev->pixels_per_line, dev->lines_per_frame); + if (ret) + goto out; + dev->coarse_itg = coarse_itg; + + if (dev->sensor_id == IMX175_ID) + ret = __imx_update_gain(sd, dev->gain); + else + ret = __imx_update_gain(sd, gain); + if (ret) + goto out; + dev->gain = gain; + + ret = __imx_update_digital_gain(client, digitgain_scaled); + if (ret) + goto out; + dev->digital_gain = digitgain; + +out: + if (dev->sensor_id == IMX227_ID) + ret = imx_write_reg_array(client, imx_param_update); + mutex_unlock(&dev->input_lock); + return ret; +} + +static long imx_s_exposure(struct v4l2_subdev *sd, + struct atomisp_exposure *exposure) +{ + return imx_set_exposure_gain(sd, exposure->integration_time[0], + exposure->gain[0], exposure->gain[1]); +} + +/* FIXME -To be updated with real OTP reading */ +static int imx_g_priv_int_data(struct v4l2_subdev *sd, + struct v4l2_private_int_data *priv) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + u8 __user *to = priv->data; + u32 read_size = priv->size; + int ret; + + /* No need to copy data if size is 0 */ + if (!read_size) + goto out; + + if (IS_ERR(dev->otp_data)) { + dev_err(&client->dev, "OTP data not available"); + return PTR_ERR(dev->otp_data); + } + /* Correct read_size value only if bigger than maximum */ + if (read_size > dev->otp_driver->size) + read_size = dev->otp_driver->size; + + ret = copy_to_user(to, dev->otp_data, read_size); + if (ret) { + dev_err(&client->dev, "%s: failed to copy OTP data to user\n", + __func__); + return -EFAULT; + } +out: + /* Return correct size */ + priv->size = dev->otp_driver->size; + + return 0; +} + +static int __imx_init(struct v4l2_subdev *sd, u32 val) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + int lanes = imx_get_lanes(sd); + int ret; + + if (dev->sensor_id == IMX_ID_DEFAULT) + return 0; + + /* The default is no flip at sensor initialization */ + dev->h_flip->cur.val = 0; + dev->v_flip->cur.val = 0; + /* Sets the default FPS */ + dev->fps_index = 0; + dev->curr_res_table = dev->mode_tables->res_preview; + dev->entries_curr_table = dev->mode_tables->n_res_preview; + + ret = imx_write_reg_array(client, dev->mode_tables->init_settings); + if (ret) + return ret; + + if (dev->sensor_id == IMX132_ID && lanes > 0) { + static const u8 imx132_rglanesel[] = { + IMX132_RGLANESEL_1LANE, /* 1 lane */ + IMX132_RGLANESEL_2LANES, /* 2 lanes */ + IMX132_RGLANESEL_1LANE, /* undefined */ + IMX132_RGLANESEL_4LANES, /* 4 lanes */ + }; + ret = imx_write_reg(client, IMX_8BIT, + IMX132_RGLANESEL, imx132_rglanesel[lanes - 1]); + } + + return ret; +} + +static int imx_init(struct v4l2_subdev *sd, u32 val) +{ + struct imx_device *dev = to_imx_sensor(sd); + int ret = 0; + + mutex_lock(&dev->input_lock); + ret = __imx_init(sd, val); + mutex_unlock(&dev->input_lock); + + return ret; +} + +static long imx_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) +{ + + switch (cmd) { + case ATOMISP_IOC_S_EXPOSURE: + return imx_s_exposure(sd, arg); + case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA: + return imx_g_priv_int_data(sd, arg); + default: + return -EINVAL; + } + return 0; +} + +static int power_up(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + int ret; + + /* power control */ + ret = dev->platform_data->power_ctrl(sd, 1); + if (ret) + goto fail_power; + + /* flis clock control */ + ret = dev->platform_data->flisclk_ctrl(sd, 1); + if (ret) + goto fail_clk; + + /* gpio ctrl */ + ret = dev->platform_data->gpio_ctrl(sd, 1); + if (ret) { + dev_err(&client->dev, "gpio failed\n"); + goto fail_gpio; + } + + return 0; +fail_gpio: + dev->platform_data->gpio_ctrl(sd, 0); +fail_clk: + dev->platform_data->flisclk_ctrl(sd, 0); +fail_power: + dev->platform_data->power_ctrl(sd, 0); + dev_err(&client->dev, "sensor power-up failed\n"); + + return ret; +} + +static int power_down(struct v4l2_subdev *sd) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + + ret = dev->platform_data->flisclk_ctrl(sd, 0); + if (ret) + dev_err(&client->dev, "flisclk failed\n"); + + /* gpio ctrl */ + ret = dev->platform_data->gpio_ctrl(sd, 0); + if (ret) + dev_err(&client->dev, "gpio failed\n"); + + /* power control */ + ret = dev->platform_data->power_ctrl(sd, 0); + if (ret) + dev_err(&client->dev, "vprog failed.\n"); + + return ret; +} + +static int __imx_s_power(struct v4l2_subdev *sd, int on) +{ + struct imx_device *dev = to_imx_sensor(sd); + int ret = 0; + int r = 0; + + if (on == 0) { + ret = power_down(sd); + if (dev->vcm_driver && dev->vcm_driver->power_down) + r = dev->vcm_driver->power_down(sd); + if (ret == 0) + ret = r; + dev->power = 0; + } else { + if (dev->vcm_driver && dev->vcm_driver->power_up) + ret = dev->vcm_driver->power_up(sd); + if (ret) + return ret; + ret = power_up(sd); + if (!ret) { + dev->power = 1; + return __imx_init(sd, 0); + } + } + + return ret; +} + +static int imx_s_power(struct v4l2_subdev *sd, int on) +{ + int ret; + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + ret = __imx_s_power(sd, on); + mutex_unlock(&dev->input_lock); + + return ret; +} + +static int imx_get_intg_factor(struct i2c_client *client, + struct camera_mipi_info *info, + const struct imx_reg *reglist) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx_device *dev = to_imx_sensor(sd); + int lanes = imx_get_lanes(sd); + u32 vt_pix_clk_div; + u32 vt_sys_clk_div; + u32 pre_pll_clk_div; + u32 pll_multiplier; + + const int ext_clk_freq_hz = 19200000; + struct atomisp_sensor_mode_data *buf = &info->data; + int ret; + u16 data[IMX_INTG_BUF_COUNT]; + + u32 vt_pix_clk_freq_mhz; + u32 coarse_integration_time_min; + u32 coarse_integration_time_max_margin; + u32 read_mode; + u32 div; + + if (info == NULL) + return -EINVAL; + + memset(data, 0, IMX_INTG_BUF_COUNT * sizeof(u16)); + ret = imx_read_reg(client, 1, IMX_VT_PIX_CLK_DIV, data); + if (ret) + return ret; + vt_pix_clk_div = data[0] & IMX_MASK_5BIT; + + if (dev->sensor_id == IMX132_ID || dev->sensor_id == IMX208_ID) { + static const int rgpltd[] = { 2, 4, 1, 1 }; + ret = imx_read_reg(client, 1, IMX132_208_VT_RGPLTD, data); + if (ret) + return ret; + vt_sys_clk_div = rgpltd[data[0] & IMX_MASK_2BIT]; + } else { + ret = imx_read_reg(client, 1, IMX_VT_SYS_CLK_DIV, data); + if (ret) + return ret; + vt_sys_clk_div = data[0] & IMX_MASK_2BIT; + } + ret = imx_read_reg(client, 1, IMX_PRE_PLL_CLK_DIV, data); + if (ret) + return ret; + pre_pll_clk_div = data[0] & IMX_MASK_4BIT; + + ret = imx_read_reg(client, 2, + (dev->sensor_id == IMX132_ID || + dev->sensor_id == IMX219_ID || + dev->sensor_id == IMX208_ID) ? + IMX132_208_219_PLL_MULTIPLIER : IMX_PLL_MULTIPLIER, data); + if (ret) + return ret; + pll_multiplier = data[0] & IMX_MASK_11BIT; + + memset(data, 0, IMX_INTG_BUF_COUNT * sizeof(u16)); + ret = imx_read_reg(client, 4, IMX_COARSE_INTG_TIME_MIN, data); + if (ret) + return ret; + coarse_integration_time_min = data[0]; + coarse_integration_time_max_margin = data[1]; + + /* Get the cropping and output resolution to ISP for this mode. */ + ret = imx_read_reg(client, 2, dev->reg_addr->horizontal_start_h, data); + if (ret) + return ret; + buf->crop_horizontal_start = data[0]; + + ret = imx_read_reg(client, 2, dev->reg_addr->vertical_start_h, data); + if (ret) + return ret; + buf->crop_vertical_start = data[0]; + + ret = imx_read_reg(client, 2, dev->reg_addr->horizontal_end_h, data); + if (ret) + return ret; + buf->crop_horizontal_end = data[0]; + + ret = imx_read_reg(client, 2, dev->reg_addr->vertical_end_h, data); + if (ret) + return ret; + buf->crop_vertical_end = data[0]; + + ret = imx_read_reg(client, 2, + dev->reg_addr->horizontal_output_size_h, data); + if (ret) + return ret; + buf->output_width = data[0]; + + ret = imx_read_reg(client, 2, + dev->reg_addr->vertical_output_size_h, data); + if (ret) + return ret; + buf->output_height = data[0]; + + memset(data, 0, IMX_INTG_BUF_COUNT * sizeof(u16)); + if (dev->sensor_id == IMX132_ID || dev->sensor_id == IMX208_ID || + dev->sensor_id == IMX219_ID) + read_mode = 0; + else { + if (dev->sensor_id == IMX227_ID) + ret = imx_read_reg(client, 1, IMX227_READ_MODE, data); + else + ret = imx_read_reg(client, 1, IMX_READ_MODE, data); + + if (ret) + return ret; + read_mode = data[0] & IMX_MASK_2BIT; + } + + div = pre_pll_clk_div*vt_sys_clk_div*vt_pix_clk_div; + if (div == 0) + return -EINVAL; + + if (dev->sensor_id == IMX132_ID || dev->sensor_id == IMX208_ID) + vt_pix_clk_freq_mhz = ext_clk_freq_hz / div; + else if (dev->sensor_id == IMX227_ID) { + /* according to IMX227 datasheet: + * vt_pix_freq_mhz = * num_of_vt_lanes(4) * ivt_pix_clk_freq_mhz + */ + vt_pix_clk_freq_mhz = + (u64)4 * ext_clk_freq_hz * pll_multiplier; + do_div(vt_pix_clk_freq_mhz, div); + } else + vt_pix_clk_freq_mhz = 2 * ext_clk_freq_hz / div; + + vt_pix_clk_freq_mhz *= pll_multiplier; + if (dev->sensor_id == IMX132_ID && lanes > 0) + vt_pix_clk_freq_mhz *= lanes; + + dev->vt_pix_clk_freq_mhz = vt_pix_clk_freq_mhz; + + buf->vt_pix_clk_freq_mhz = vt_pix_clk_freq_mhz; + buf->coarse_integration_time_min = coarse_integration_time_min; + buf->coarse_integration_time_max_margin = + coarse_integration_time_max_margin; + + buf->fine_integration_time_min = IMX_FINE_INTG_TIME; + buf->fine_integration_time_max_margin = IMX_FINE_INTG_TIME; + buf->fine_integration_time_def = IMX_FINE_INTG_TIME; + buf->frame_length_lines = dev->lines_per_frame; + buf->line_length_pck = dev->pixels_per_line; + buf->read_mode = read_mode; + + if (dev->sensor_id == IMX132_ID || dev->sensor_id == IMX208_ID || + dev->sensor_id == IMX219_ID) { + buf->binning_factor_x = 1; + buf->binning_factor_y = 1; + } else { + if (dev->sensor_id == IMX227_ID) + ret = imx_read_reg(client, 1, IMX227_BINNING_ENABLE, + data); + else + ret = imx_read_reg(client, 1, IMX_BINNING_ENABLE, data); + + if (ret) + return ret; + /* 1:binning enabled, 0:disabled */ + if (data[0] == 1) { + if (dev->sensor_id == IMX227_ID) + ret = imx_read_reg(client, 1, + IMX227_BINNING_TYPE, data); + else + ret = imx_read_reg(client, 1, + IMX_BINNING_TYPE, data); + + if (ret) + return ret; + buf->binning_factor_x = data[0] >> 4 & 0x0f; + if (!buf->binning_factor_x) + buf->binning_factor_x = 1; + buf->binning_factor_y = data[0] & 0xf; + if (!buf->binning_factor_y) + buf->binning_factor_y = 1; + /* WOWRKAROUND, NHD setting for IMX227 should have 4x4 + * binning but the register setting does not reflect + * this, I am asking vendor why this happens. this is + * workaround for INTEL BZ 216560. + */ + if (dev->sensor_id == IMX227_ID) { + if (dev->curr_res_table[dev->fmt_idx].width == + 376 && + dev->curr_res_table[dev->fmt_idx].height == + 656) { + buf->binning_factor_x = 4; + buf->binning_factor_y = 4; + } + } + } else { + buf->binning_factor_x = 1; + buf->binning_factor_y = 1; + } + } + + return 0; +} + +/* This returns the exposure time being used. This should only be used + for filling in EXIF data, not for actual image processing. */ +static int imx_q_exposure(struct v4l2_subdev *sd, s32 *value) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + u16 coarse; + int ret; + + /* the fine integration time is currently not calculated */ + ret = imx_read_reg(client, IMX_16BIT, + dev->reg_addr->coarse_integration_time, &coarse); + *value = coarse; + + return ret; +} + +static int imx_test_pattern(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + int ret; + + if (dev->power == 0) + return 0; + + ret = imx_write_reg(client, IMX_16BIT, IMX_TEST_PATTERN_COLOR_R, + (u16)(dev->tp_r->val >> 22)); + if (ret) + return ret; + + ret = imx_write_reg(client, IMX_16BIT, IMX_TEST_PATTERN_COLOR_GR, + (u16)(dev->tp_gr->val >> 22)); + if (ret) + return ret; + + ret = imx_write_reg(client, IMX_16BIT, IMX_TEST_PATTERN_COLOR_GB, + (u16)(dev->tp_gb->val >> 22)); + if (ret) + return ret; + + ret = imx_write_reg(client, IMX_16BIT, IMX_TEST_PATTERN_COLOR_B, + (u16)(dev->tp_b->val >> 22)); + if (ret) + return ret; + + return imx_write_reg(client, IMX_16BIT, IMX_TEST_PATTERN_MODE, + (u16)(dev->tp_mode->val)); +} + +static u32 imx_translate_bayer_order(enum atomisp_bayer_order code) +{ + switch (code) { + case atomisp_bayer_order_rggb: + return MEDIA_BUS_FMT_SRGGB10_1X10; + case atomisp_bayer_order_grbg: + return MEDIA_BUS_FMT_SGRBG10_1X10; + case atomisp_bayer_order_bggr: + return MEDIA_BUS_FMT_SBGGR10_1X10; + case atomisp_bayer_order_gbrg: + return MEDIA_BUS_FMT_SGBRG10_1X10; + } + return 0; +} + +static int imx_v_flip(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct camera_mipi_info *imx_info = NULL; + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u16 val; + + if (dev->power == 0) + return -EIO; + + ret = imx_write_reg_array(client, dev->param_hold); + if (ret) + return ret; + + ret = imx_read_reg(client, IMX_8BIT, + dev->reg_addr->img_orientation, &val); + if (ret) + return ret; + if (value) + val |= IMX_VFLIP_BIT; + else + val &= ~IMX_VFLIP_BIT; + + ret = imx_write_reg(client, IMX_8BIT, + dev->reg_addr->img_orientation, val); + if (ret) + return ret; + + imx_info = v4l2_get_subdev_hostdata(sd); + if (imx_info) { + val &= (IMX_VFLIP_BIT|IMX_HFLIP_BIT); + imx_info->raw_bayer_order = imx_bayer_order_mapping[val]; + dev->format.code = imx_translate_bayer_order( + imx_info->raw_bayer_order); + } + + return imx_write_reg_array(client, dev->param_update); +} + +static int imx_h_flip(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct camera_mipi_info *imx_info = NULL; + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret; + u16 val; + + if (dev->power == 0) + return -EIO; + + ret = imx_write_reg_array(client, dev->param_hold); + if (ret) + return ret; + ret = imx_read_reg(client, IMX_8BIT, + dev->reg_addr->img_orientation, &val); + if (ret) + return ret; + if (value) + val |= IMX_HFLIP_BIT; + else + val &= ~IMX_HFLIP_BIT; + ret = imx_write_reg(client, IMX_8BIT, + dev->reg_addr->img_orientation, val); + if (ret) + return ret; + + imx_info = v4l2_get_subdev_hostdata(sd); + if (imx_info) { + val &= (IMX_VFLIP_BIT|IMX_HFLIP_BIT); + imx_info->raw_bayer_order = imx_bayer_order_mapping[val]; + dev->format.code = imx_translate_bayer_order( + imx_info->raw_bayer_order); + } + + return imx_write_reg_array(client, dev->param_update); +} + +static int imx_g_focal(struct v4l2_subdev *sd, s32 *val) +{ + *val = (IMX_FOCAL_LENGTH_NUM << 16) | IMX_FOCAL_LENGTH_DEM; + return 0; +} + +static int imx_g_fnumber(struct v4l2_subdev *sd, s32 *val) +{ + /*const f number for imx*/ + *val = (IMX_F_NUMBER_DEFAULT_NUM << 16) | IMX_F_NUMBER_DEM; + return 0; +} + +static int imx_g_fnumber_range(struct v4l2_subdev *sd, s32 *val) +{ + *val = (IMX_F_NUMBER_DEFAULT_NUM << 24) | + (IMX_F_NUMBER_DEM << 16) | + (IMX_F_NUMBER_DEFAULT_NUM << 8) | IMX_F_NUMBER_DEM; + return 0; +} + +static int imx_g_bin_factor_x(struct v4l2_subdev *sd, s32 *val) +{ + struct imx_device *dev = to_imx_sensor(sd); + + *val = dev->curr_res_table[dev->fmt_idx].bin_factor_x; + + return 0; +} + +static int imx_g_bin_factor_y(struct v4l2_subdev *sd, s32 *val) +{ + struct imx_device *dev = to_imx_sensor(sd); + + *val = dev->curr_res_table[dev->fmt_idx].bin_factor_y; + + return 0; +} + +int imx_vcm_power_up(struct v4l2_subdev *sd) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->power_up) + return dev->vcm_driver->power_up(sd); + return 0; +} + +int imx_vcm_power_down(struct v4l2_subdev *sd) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->power_down) + return dev->vcm_driver->power_down(sd); + return 0; +} + +int imx_vcm_init(struct v4l2_subdev *sd) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->init) + return dev->vcm_driver->init(sd); + return 0; +} + +int imx_t_focus_vcm(struct v4l2_subdev *sd, u16 val) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->t_focus_vcm) + return dev->vcm_driver->t_focus_vcm(sd, val); + return 0; +} + +int imx_t_focus_abs(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->t_focus_abs) + return dev->vcm_driver->t_focus_abs(sd, value); + return 0; +} +int imx_t_focus_rel(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->t_focus_rel) + return dev->vcm_driver->t_focus_rel(sd, value); + return 0; +} + +int imx_q_focus_status(struct v4l2_subdev *sd, s32 *value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->q_focus_status) + return dev->vcm_driver->q_focus_status(sd, value); + return 0; +} + +int imx_q_focus_abs(struct v4l2_subdev *sd, s32 *value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->q_focus_abs) + return dev->vcm_driver->q_focus_abs(sd, value); + return 0; +} + +int imx_t_vcm_slew(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->t_vcm_slew) + return dev->vcm_driver->t_vcm_slew(sd, value); + return 0; +} + +int imx_t_vcm_timing(struct v4l2_subdev *sd, s32 value) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (dev->vcm_driver && dev->vcm_driver->t_vcm_timing) + return dev->vcm_driver->t_vcm_timing(sd, value); + return 0; +} + +static int imx_s_ctrl(struct v4l2_ctrl *ctrl) +{ + struct imx_device *dev = container_of( + ctrl->handler, struct imx_device, ctrl_handler); + struct i2c_client *client = v4l2_get_subdevdata(&dev->sd); + int ret = 0; + + switch (ctrl->id) { + case V4L2_CID_TEST_PATTERN: + ret = imx_test_pattern(&dev->sd); + break; + case V4L2_CID_VFLIP: + dev_dbg(&client->dev, "%s: CID_VFLIP:%d.\n", + __func__, ctrl->val); + ret = imx_v_flip(&dev->sd, ctrl->val); + break; + case V4L2_CID_HFLIP: + dev_dbg(&client->dev, "%s: CID_HFLIP:%d.\n", + __func__, ctrl->val); + ret = imx_h_flip(&dev->sd, ctrl->val); + break; + case V4L2_CID_FOCUS_ABSOLUTE: + ret = imx_t_focus_abs(&dev->sd, ctrl->val); + break; + case V4L2_CID_FOCUS_RELATIVE: + ret = imx_t_focus_rel(&dev->sd, ctrl->val); + break; + case V4L2_CID_VCM_SLEW: + ret = imx_t_vcm_slew(&dev->sd, ctrl->val); + break; + case V4L2_CID_VCM_TIMEING: + ret = imx_t_vcm_timing(&dev->sd, ctrl->val); + break; + } + + return ret; +} + +static int imx_g_volatile_ctrl(struct v4l2_ctrl *ctrl) +{ + struct imx_device *dev = container_of( + ctrl->handler, struct imx_device, ctrl_handler); + int ret = 0; + unsigned int val; + + switch (ctrl->id) { + case V4L2_CID_EXPOSURE_ABSOLUTE: + ret = imx_q_exposure(&dev->sd, &ctrl->val); + break; + case V4L2_CID_FOCUS_ABSOLUTE: + ret = imx_q_focus_abs(&dev->sd, &ctrl->val); + break; + case V4L2_CID_FOCUS_STATUS: + ret = imx_q_focus_status(&dev->sd, &ctrl->val); + break; + case V4L2_CID_FOCAL_ABSOLUTE: + ret = imx_g_focal(&dev->sd, &ctrl->val); + break; + case V4L2_CID_FNUMBER_ABSOLUTE: + ret = imx_g_fnumber(&dev->sd, &ctrl->val); + break; + case V4L2_CID_FNUMBER_RANGE: + ret = imx_g_fnumber_range(&dev->sd, &ctrl->val); + break; + case V4L2_CID_BIN_FACTOR_HORZ: + ret = imx_g_bin_factor_x(&dev->sd, &ctrl->val); + break; + case V4L2_CID_BIN_FACTOR_VERT: + ret = imx_g_bin_factor_y(&dev->sd, &ctrl->val); + break; + case V4L2_CID_VBLANK: + ctrl->val = dev->lines_per_frame - + dev->curr_res_table[dev->fmt_idx].height; + break; + case V4L2_CID_HBLANK: + ctrl->val = dev->pixels_per_line - + dev->curr_res_table[dev->fmt_idx].width; + break; + case V4L2_CID_PIXEL_RATE: + ctrl->val = dev->vt_pix_clk_freq_mhz; + break; + case V4L2_CID_LINK_FREQ: + val = dev->curr_res_table[dev->fmt_idx]. + fps_options[dev->fps_index].mipi_freq; + if (val == 0) + val = dev->curr_res_table[dev->fmt_idx].mipi_freq; + if (val == 0) + return -EINVAL; + ctrl->val = val * 1000; /* To Hz */ + break; + default: + return -EINVAL; + } + + return ret; +} + +static const struct v4l2_ctrl_ops ctrl_ops = { + .s_ctrl = imx_s_ctrl, + .g_volatile_ctrl = imx_g_volatile_ctrl +}; + +static const struct v4l2_ctrl_config imx_controls[] = { + { + .ops = &ctrl_ops, + .id = V4L2_CID_EXPOSURE_ABSOLUTE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "exposure", + .min = 0x0, + .max = 0xffff, + .step = 0x01, + .def = 0x00, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_TEST_PATTERN, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Test pattern", + .min = 0, + .max = 0xffff, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_TEST_PATTERN_COLOR_R, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Test pattern solid color R", + .min = INT_MIN, + .max = INT_MAX, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_TEST_PATTERN_COLOR_GR, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Test pattern solid color GR", + .min = INT_MIN, + .max = INT_MAX, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_TEST_PATTERN_COLOR_GB, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Test pattern solid color GB", + .min = INT_MIN, + .max = INT_MAX, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_TEST_PATTERN_COLOR_B, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "Test pattern solid color B", + .min = INT_MIN, + .max = INT_MAX, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_VFLIP, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .name = "Flip", + .min = 0, + .max = 1, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_HFLIP, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .name = "Mirror", + .min = 0, + .max = 1, + .step = 1, + .def = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FOCUS_ABSOLUTE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "focus move absolute", + .min = 0, + .max = IMX_MAX_FOCUS_POS, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FOCUS_RELATIVE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "focus move relative", + .min = IMX_MAX_FOCUS_NEG, + .max = IMX_MAX_FOCUS_POS, + .step = 1, + .def = 0, + .flags = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FOCUS_STATUS, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "focus status", + .min = 0, + .max = 100, /* allow enum to grow in the future */ + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_VCM_SLEW, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "vcm slew", + .min = 0, + .max = IMX_VCM_SLEW_STEP_MAX, + .step = 1, + .def = 0, + .flags = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_VCM_TIMEING, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "vcm step time", + .min = 0, + .max = IMX_VCM_SLEW_TIME_MAX, + .step = 1, + .def = 0, + .flags = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FOCAL_ABSOLUTE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "focal length", + .min = IMX_FOCAL_LENGTH_DEFAULT, + .max = IMX_FOCAL_LENGTH_DEFAULT, + .step = 0x01, + .def = IMX_FOCAL_LENGTH_DEFAULT, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FNUMBER_ABSOLUTE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "f-number", + .min = IMX_F_NUMBER_DEFAULT, + .max = IMX_F_NUMBER_DEFAULT, + .step = 0x01, + .def = IMX_F_NUMBER_DEFAULT, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_FNUMBER_RANGE, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "f-number range", + .min = IMX_F_NUMBER_RANGE, + .max = IMX_F_NUMBER_RANGE, + .step = 0x01, + .def = IMX_F_NUMBER_RANGE, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_BIN_FACTOR_HORZ, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "horizontal binning factor", + .min = 0, + .max = IMX_BIN_FACTOR_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_BIN_FACTOR_VERT, + .type = V4L2_CTRL_TYPE_INTEGER, + .name = "vertical binning factor", + .min = 0, + .max = IMX_BIN_FACTOR_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_LINK_FREQ, + .name = "Link Frequency", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 1, + .max = 1500000 * 1000, + .step = 1, + .def = 1, + .flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_PIXEL_RATE, + .name = "Pixel Rate", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 0, + .max = INT_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_HBLANK, + .name = "Horizontal Blanking", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 0, + .max = SHRT_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_VBLANK, + .name = "Vertical Blanking", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 0, + .max = SHRT_MAX, + .step = 1, + .def = 0, + .flags = V4L2_CTRL_FLAG_VOLATILE, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_HFLIP, + .name = "Horizontal Flip", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 0, + .max = 1, + .step = 1, + .def = 0, + .flags = 0, + }, + { + .ops = &ctrl_ops, + .id = V4L2_CID_VFLIP, + .name = "Vertical Flip", + .type = V4L2_CTRL_TYPE_INTEGER, + .min = 0, + .max = 1, + .step = 1, + .def = 0, + .flags = 0, + }, +}; + +/* + * distance - calculate the distance + * @res: resolution + * @w: width + * @h: height + * + * Get the gap between resolution and w/h. + * res->width/height smaller than w/h wouldn't be considered. + * Returns the value of gap or -1 if fail. + */ +#define LARGEST_ALLOWED_RATIO_MISMATCH 600 +static int distance(struct imx_resolution const *res, u32 w, u32 h, + bool keep_ratio) +{ + unsigned int w_ratio; + unsigned int h_ratio; + int match; + unsigned int allowed_ratio_mismatch = LARGEST_ALLOWED_RATIO_MISMATCH; + + if (!keep_ratio) + allowed_ratio_mismatch = ~0; + + if (w == 0) + return -1; + w_ratio = (res->width << 13) / w; + if (h == 0) + return -1; + h_ratio = (res->height << 13) / h; + if (h_ratio == 0) + return -1; + match = abs(((w_ratio << 13) / h_ratio) - ((int)8192)); + + if ((w_ratio < (int)8192) || (h_ratio < (int)8192) || + (match > allowed_ratio_mismatch)) + return -1; + + return w_ratio + h_ratio; +} + +/* Return the nearest higher resolution index */ +static int nearest_resolution_index(struct v4l2_subdev *sd, int w, int h) +{ + int i; + int idx = -1; + int dist; + int fps_diff; + int min_fps_diff = INT_MAX; + int min_dist = INT_MAX; + const struct imx_resolution *tmp_res = NULL; + struct imx_device *dev = to_imx_sensor(sd); + bool again = 1; +retry: + for (i = 0; i < dev->entries_curr_table; i++) { + tmp_res = &dev->curr_res_table[i]; + dist = distance(tmp_res, w, h, again); + if (dist == -1) + continue; + if (dist < min_dist) { + min_dist = dist; + idx = i; + } + if (dist == min_dist) { + fps_diff = __imx_min_fps_diff(dev->targetfps, + tmp_res->fps_options); + if (fps_diff < min_fps_diff) { + min_fps_diff = fps_diff; + idx = i; + } + } + } + + /* + * FIXME! + * only IMX135 for Saltbay and IMX227 use this algorithm + */ + if (idx == -1 && again == true && dev->new_res_sel_method) { + again = false; + goto retry; + } + return idx; +} + +/* Call with ctrl_handler.lock hold */ +static int __adjust_hvblank(struct v4l2_subdev *sd) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + u16 new_frame_length_lines, new_line_length_pck; + int ret; + + /* + * No need to adjust h/v blank if not set dbg value + * Note that there is no other checking on the h/v blank value, + * as h/v blank can be set to any value above zero for debug purpose + */ + if (!dev->v_blank->val || !dev->h_blank->val) + return 0; + + new_frame_length_lines = dev->curr_res_table[dev->fmt_idx].height + + dev->v_blank->val; + new_line_length_pck = dev->curr_res_table[dev->fmt_idx].width + + dev->h_blank->val; + + ret = imx_write_reg(client, IMX_16BIT, + dev->reg_addr->line_length_pixels, new_line_length_pck); + if (ret) + return ret; + ret = imx_write_reg(client, IMX_16BIT, + dev->reg_addr->frame_length_lines, new_frame_length_lines); + if (ret) + return ret; + + dev->lines_per_frame = new_frame_length_lines; + dev->pixels_per_line = new_line_length_pck; + + return 0; +} + +static int imx_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *format) +{ + struct v4l2_mbus_framefmt *fmt = &format->format; + struct imx_device *dev = to_imx_sensor(sd); + struct camera_mipi_info *imx_info = NULL; + struct i2c_client *client = v4l2_get_subdevdata(sd); + const struct imx_resolution *res; + int lanes = imx_get_lanes(sd); + int ret; + u16 data, val; + int idx; + if (format->pad) + return -EINVAL; + if (!fmt) + return -EINVAL; + + imx_info = v4l2_get_subdev_hostdata(sd); + if (imx_info == NULL) + return -EINVAL; + if ((fmt->width > imx_max_res[dev->sensor_id].res_max_width) + || (fmt->height > imx_max_res[dev->sensor_id].res_max_height)) { + fmt->width = imx_max_res[dev->sensor_id].res_max_width; + fmt->height = imx_max_res[dev->sensor_id].res_max_height; + } else { + idx = nearest_resolution_index(sd, fmt->width, fmt->height); + + /* + * nearest_resolution_index() doesn't return smaller + * resolutions. If it fails, it means the requested + * resolution is higher than wecan support. Fallback + * to highest possible resolution in this case. + */ + if (idx == -1) + idx = dev->entries_curr_table - 1; + + fmt->width = dev->curr_res_table[idx].width; + fmt->height = dev->curr_res_table[idx].height; + } + + fmt->code = dev->format.code; + if(format->which == V4L2_SUBDEV_FORMAT_TRY) { + cfg->try_fmt = *fmt; + return 0; + } + mutex_lock(&dev->input_lock); + + dev->fmt_idx = nearest_resolution_index(sd, fmt->width, fmt->height); + if (dev->fmt_idx == -1) { + ret = -EINVAL; + goto out; + } + res = &dev->curr_res_table[dev->fmt_idx]; + + /* Adjust the FPS selection based on the resolution selected */ + dev->fps_index = __imx_nearest_fps_index(dev->targetfps, + res->fps_options); + dev->fps = res->fps_options[dev->fps_index].fps; + dev->regs = res->fps_options[dev->fps_index].regs; + if (!dev->regs) + dev->regs = res->regs; + + ret = imx_write_reg_array(client, dev->regs); + if (ret) + goto out; + + if (dev->sensor_id == IMX132_ID && lanes > 0) { + static const u8 imx132_rgpltd[] = { + 2, /* 1 lane: /1 */ + 0, /* 2 lanes: /2 */ + 0, /* undefined */ + 1, /* 4 lanes: /4 */ + }; + ret = imx_write_reg(client, IMX_8BIT, IMX132_208_VT_RGPLTD, + imx132_rgpltd[lanes - 1]); + if (ret) + goto out; + } + + dev->pixels_per_line = res->fps_options[dev->fps_index].pixels_per_line; + dev->lines_per_frame = res->fps_options[dev->fps_index].lines_per_frame; + + /* dbg h/v blank time */ + __adjust_hvblank(sd); + + ret = __imx_update_exposure_timing(client, dev->coarse_itg, + dev->pixels_per_line, dev->lines_per_frame); + if (ret) + goto out; + + ret = __imx_update_gain(sd, dev->gain); + if (ret) + goto out; + + ret = __imx_update_digital_gain(client, dev->digital_gain); + if (ret) + goto out; + + ret = imx_write_reg_array(client, dev->param_update); + if (ret) + goto out; + + ret = imx_get_intg_factor(client, imx_info, dev->regs); + if (ret) + goto out; + + ret = imx_read_reg(client, IMX_8BIT, + dev->reg_addr->img_orientation, &val); + if (ret) + goto out; + val &= (IMX_VFLIP_BIT|IMX_HFLIP_BIT); + imx_info->raw_bayer_order = imx_bayer_order_mapping[val]; + dev->format.code = imx_translate_bayer_order( + imx_info->raw_bayer_order); + + /* + * Fill meta data info. add imx135 metadata setting for RAW10 format + */ + switch (dev->sensor_id) { + case IMX135_ID: + ret = imx_read_reg(client, 2, + IMX135_OUTPUT_DATA_FORMAT_REG, &data); + if (ret) + goto out; + /* + * The IMX135 can support various resolutions like + * RAW6/8/10/12/14. + * 1.The data format is RAW10: + * matadata width = current resolution width(pixel) * 10 / 8 + * 2.The data format is RAW6 or RAW8: + * matadata width = current resolution width(pixel); + * 3.other data format(RAW12/14 etc): + * TBD. + */ + if (data == IMX135_OUTPUT_FORMAT_RAW10) + /* the data format is RAW10. */ + imx_info->metadata_width = res->width * 10 / 8; + else + /* The data format is RAW6/8/12/14/ etc. */ + imx_info->metadata_width = res->width; + + imx_info->metadata_height = IMX135_EMBEDDED_DATA_LINE_NUM; + + if (imx_info->metadata_effective_width == NULL) + imx_info->metadata_effective_width = + imx135_embedded_effective_size; + + break; + case IMX227_ID: + ret = imx_read_reg(client, 2, IMX227_OUTPUT_DATA_FORMAT_REG, + &data); + if (ret) + goto out; + if (data == IMX227_OUTPUT_FORMAT_RAW10) + /* the data format is RAW10. */ + imx_info->metadata_width = res->width * 10 / 8; + else + /* The data format is RAW6/8/12/14/ etc. */ + imx_info->metadata_width = res->width; + + imx_info->metadata_height = IMX227_EMBEDDED_DATA_LINE_NUM; + + if (imx_info->metadata_effective_width == NULL) + imx_info->metadata_effective_width = + imx227_embedded_effective_size; + + break; + default: + imx_info->metadata_width = 0; + imx_info->metadata_height = 0; + imx_info->metadata_effective_width = NULL; + break; + } + +out: + mutex_unlock(&dev->input_lock); + return ret; +} + + +static int imx_get_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *format) +{ + struct v4l2_mbus_framefmt *fmt = &format->format; + struct imx_device *dev = to_imx_sensor(sd); + + if (format->pad) + return -EINVAL; + if (!fmt) + return -EINVAL; + + mutex_lock(&dev->input_lock); + fmt->width = dev->curr_res_table[dev->fmt_idx].width; + fmt->height = dev->curr_res_table[dev->fmt_idx].height; + fmt->code = dev->format.code; + mutex_unlock(&dev->input_lock); + return 0; +} + +static int imx_detect(struct i2c_client *client, u16 *id, u8 *revision) +{ + struct i2c_adapter *adapter = client->adapter; + + /* i2c check */ + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) + return -ENODEV; + + /* check sensor chip ID */ + if (imx_read_reg(client, IMX_16BIT, IMX132_175_208_219_CHIP_ID, id)) { + v4l2_err(client, "sensor_id = 0x%x\n", *id); + return -ENODEV; + } + + if (*id == IMX132_ID || *id == IMX175_ID || + *id == IMX208_ID || *id == IMX219_ID) + goto found; + + if (imx_read_reg(client, IMX_16BIT, IMX134_135_227_CHIP_ID, id)) { + v4l2_err(client, "sensor_id = 0x%x\n", *id); + return -ENODEV; + } + if (*id != IMX134_ID && *id != IMX135_ID && *id != IMX227_ID) { + v4l2_err(client, "no imx sensor found\n"); + return -ENODEV; + } +found: + v4l2_info(client, "sensor_id = 0x%x\n", *id); + + /* TODO - need to be updated */ + *revision = 0; + + return 0; +} + +static void __imx_print_timing(struct v4l2_subdev *sd) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + u16 width = dev->curr_res_table[dev->fmt_idx].width; + u16 height = dev->curr_res_table[dev->fmt_idx].height; + + dev_dbg(&client->dev, "Dump imx timing in stream on:\n"); + dev_dbg(&client->dev, "width: %d:\n", width); + dev_dbg(&client->dev, "height: %d:\n", height); + dev_dbg(&client->dev, "pixels_per_line: %d:\n", dev->pixels_per_line); + dev_dbg(&client->dev, "line per frame: %d:\n", dev->lines_per_frame); + dev_dbg(&client->dev, "pix freq: %d:\n", dev->vt_pix_clk_freq_mhz); + dev_dbg(&client->dev, "init fps: %d:\n", dev->vt_pix_clk_freq_mhz / + dev->pixels_per_line / dev->lines_per_frame); + dev_dbg(&client->dev, "HBlank: %d nS:\n", + 1000 * (dev->pixels_per_line - width) / + (dev->vt_pix_clk_freq_mhz / 1000000)); + dev_dbg(&client->dev, "VBlank: %d uS:\n", + (dev->lines_per_frame - height) * dev->pixels_per_line / + (dev->vt_pix_clk_freq_mhz / 1000000)); +} + +/* + * imx stream on/off + */ +static int imx_s_stream(struct v4l2_subdev *sd, int enable) +{ + int ret; + struct i2c_client *client = v4l2_get_subdevdata(sd); + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + if (enable) { + /* Noise reduction & dead pixel applied before streaming */ + if (dev->fw == NULL) { + dev_warn(&client->dev, "No MSR loaded from library"); + } else { + ret = apply_msr_data(client, dev->fw); + if (ret) { + mutex_unlock(&dev->input_lock); + return ret; + } + } + ret = imx_test_pattern(sd); + if (ret) { + v4l2_err(client, "Configure test pattern failed.\n"); + mutex_unlock(&dev->input_lock); + return ret; + } + __imx_print_timing(sd); + ret = imx_write_reg_array(client, imx_streaming); + if (ret != 0) { + v4l2_err(client, "write_reg_array err\n"); + mutex_unlock(&dev->input_lock); + return ret; + } + dev->streaming = 1; + if (dev->vcm_driver && dev->vcm_driver->t_focus_abs_init) + dev->vcm_driver->t_focus_abs_init(sd); + } else { + ret = imx_write_reg_array(client, imx_soft_standby); + if (ret != 0) { + v4l2_err(client, "write_reg_array err\n"); + mutex_unlock(&dev->input_lock); + return ret; + } + dev->streaming = 0; + dev->targetfps = 0; + } + mutex_unlock(&dev->input_lock); + + return 0; +} + +static int __update_imx_device_settings(struct imx_device *dev, u16 sensor_id) +{ + /* IMX on other platform is not supported yet */ + return -EINVAL; +} + +static int imx_s_config(struct v4l2_subdev *sd, + int irq, void *pdata) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + u8 sensor_revision; + u16 sensor_id; + int ret; + if (pdata == NULL) + return -ENODEV; + + dev->platform_data = pdata; + + mutex_lock(&dev->input_lock); + + if (dev->platform_data->platform_init) { + ret = dev->platform_data->platform_init(client); + if (ret) { + mutex_unlock(&dev->input_lock); + dev_err(&client->dev, "imx platform init err\n"); + return ret; + } + } + /* + * power off the module first. + * + * As first power on by board have undecided state of power/gpio pins. + */ + ret = __imx_s_power(sd, 0); + if (ret) { + v4l2_err(client, "imx power-down err.\n"); + mutex_unlock(&dev->input_lock); + return ret; + } + + ret = __imx_s_power(sd, 1); + if (ret) { + v4l2_err(client, "imx power-up err.\n"); + mutex_unlock(&dev->input_lock); + return ret; + } + + ret = dev->platform_data->csi_cfg(sd, 1); + if (ret) + goto fail_csi_cfg; + + /* config & detect sensor */ + ret = imx_detect(client, &sensor_id, &sensor_revision); + if (ret) { + v4l2_err(client, "imx_detect err s_config.\n"); + goto fail_detect; + } + + dev->sensor_id = sensor_id; + dev->sensor_revision = sensor_revision; + + /* Resolution settings depend on sensor type and platform */ + ret = __update_imx_device_settings(dev, dev->sensor_id); + if (ret) + goto fail_detect; + /* Read sensor's OTP data */ + dev->otp_data = dev->otp_driver->otp_read(sd, + dev->otp_driver->dev_addr, dev->otp_driver->start_addr, + dev->otp_driver->size); + + /* power off sensor */ + ret = __imx_s_power(sd, 0); + + mutex_unlock(&dev->input_lock); + if (ret) + v4l2_err(client, "imx power-down err.\n"); + + return ret; + +fail_detect: + dev->platform_data->csi_cfg(sd, 0); +fail_csi_cfg: + __imx_s_power(sd, 0); + if (dev->platform_data->platform_deinit) + dev->platform_data->platform_deinit(); + mutex_unlock(&dev->input_lock); + dev_err(&client->dev, "sensor power-gating failed\n"); + return ret; +} + +static int +imx_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_mbus_code_enum *code) +{ + struct imx_device *dev = to_imx_sensor(sd); + if (code->index >= MAX_FMTS) + return -EINVAL; + + mutex_lock(&dev->input_lock); + code->code = dev->format.code; + mutex_unlock(&dev->input_lock); + return 0; +} + +static int +imx_enum_frame_size(struct v4l2_subdev *sd, struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_frame_size_enum *fse) +{ + int index = fse->index; + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + if (index >= dev->entries_curr_table) { + mutex_unlock(&dev->input_lock); + return -EINVAL; + } + + fse->min_width = dev->curr_res_table[index].width; + fse->min_height = dev->curr_res_table[index].height; + fse->max_width = dev->curr_res_table[index].width; + fse->max_height = dev->curr_res_table[index].height; + mutex_unlock(&dev->input_lock); + return 0; +} + +static int +imx_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *param) +{ + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + dev->run_mode = param->parm.capture.capturemode; + + switch (dev->run_mode) { + case CI_MODE_VIDEO: + dev->curr_res_table = dev->mode_tables->res_video; + dev->entries_curr_table = dev->mode_tables->n_res_video; + break; + case CI_MODE_STILL_CAPTURE: + dev->curr_res_table = dev->mode_tables->res_still; + dev->entries_curr_table = dev->mode_tables->n_res_still; + break; + default: + dev->curr_res_table = dev->mode_tables->res_preview; + dev->entries_curr_table = dev->mode_tables->n_res_preview; + } + mutex_unlock(&dev->input_lock); + return 0; +} + +int +imx_g_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *interval) +{ + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + interval->interval.denominator = dev->fps; + interval->interval.numerator = 1; + mutex_unlock(&dev->input_lock); + return 0; +} + +static int __imx_s_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *interval) +{ + struct imx_device *dev = to_imx_sensor(sd); + struct i2c_client *client = v4l2_get_subdevdata(sd); + const struct imx_resolution *res = + &dev->curr_res_table[dev->fmt_idx]; + struct camera_mipi_info *imx_info = NULL; + unsigned short pixels_per_line; + unsigned short lines_per_frame; + unsigned int fps_index; + int fps; + int ret = 0; + + + imx_info = v4l2_get_subdev_hostdata(sd); + if (imx_info == NULL) + return -EINVAL; + + if (!interval->interval.numerator) + interval->interval.numerator = 1; + + fps = interval->interval.denominator / interval->interval.numerator; + + if (!fps) + return -EINVAL; + + dev->targetfps = fps; + /* No need to proceed further if we are not streaming */ + if (!dev->streaming) + return 0; + + /* Ignore if we are already using the required FPS. */ + if (fps == dev->fps) + return 0; + + /* + * Start here, sensor is already streaming, so adjust fps dynamically + */ + fps_index = __imx_above_nearest_fps_index(fps, res->fps_options); + if (fps > res->fps_options[fps_index].fps) { + /* + * if does not have high fps setting, not support increase fps + * by adjust lines per frame. + */ + dev_err(&client->dev, "Could not support fps: %d.\n", fps); + return -EINVAL; + } + + if (res->fps_options[fps_index].regs && + res->fps_options[fps_index].regs != dev->regs) { + /* + * if need a new setting, but the new setting has difference + * with current setting, not use this one, as may have + * unexpected result, e.g. PLL, IQ. + */ + dev_dbg(&client->dev, + "Sensor is streaming, not apply new sensor setting\n"); + if (fps > res->fps_options[dev->fps_index].fps) { + /* + * Does not support increase fps based on low fps + * setting, as the high fps setting could not be used, + * and fps requested is above current setting fps. + */ + dev_warn(&client->dev, + "Could not support fps: %d, keep current: %d.\n", + fps, dev->fps); + return 0; + } + } else { + dev->fps_index = fps_index; + dev->fps = res->fps_options[dev->fps_index].fps; + } + + /* Update the new frametimings based on FPS */ + pixels_per_line = res->fps_options[dev->fps_index].pixels_per_line; + lines_per_frame = res->fps_options[dev->fps_index].lines_per_frame; + + if (fps > res->fps_options[fps_index].fps) { + /* + * if does not have high fps setting, not support increase fps + * by adjust lines per frame. + */ + dev_warn(&client->dev, "Could not support fps: %d. Use:%d.\n", + fps, res->fps_options[fps_index].fps); + goto done; + } + + /* if the new setting does not match exactly */ + if (dev->fps != fps) { +#define MAX_LINES_PER_FRAME 0xffff + dev_dbg(&client->dev, "adjusting fps using lines_per_frame\n"); + /* + * FIXME! + * 1: check DS on max value of lines_per_frame + * 2: consider use pixel per line for more range? + */ + if (dev->lines_per_frame * dev->fps / fps > + MAX_LINES_PER_FRAME) { + dev_warn(&client->dev, + "adjust lines_per_frame out of range, try to use max value.\n"); + lines_per_frame = MAX_LINES_PER_FRAME; + } else { + lines_per_frame = lines_per_frame * dev->fps / fps; + } + } +done: + /* Update the new frametimings based on FPS */ + dev->pixels_per_line = pixels_per_line; + dev->lines_per_frame = lines_per_frame; + + /* Update the new values so that user side knows the current settings */ + ret = __imx_update_exposure_timing(client, + dev->coarse_itg, dev->pixels_per_line, dev->lines_per_frame); + if (ret) + return ret; + + dev->fps = fps; + + ret = imx_get_intg_factor(client, imx_info, dev->regs); + if (ret) + return ret; + + interval->interval.denominator = res->fps_options[dev->fps_index].fps; + interval->interval.numerator = 1; + __imx_print_timing(sd); + + return ret; +} + +static int imx_s_frame_interval(struct v4l2_subdev *sd, + struct v4l2_subdev_frame_interval *interval) +{ + struct imx_device *dev = to_imx_sensor(sd); + int ret; + + mutex_lock(&dev->input_lock); + ret = __imx_s_frame_interval(sd, interval); + mutex_unlock(&dev->input_lock); + + return ret; +} +static int imx_g_skip_frames(struct v4l2_subdev *sd, u32 *frames) +{ + struct imx_device *dev = to_imx_sensor(sd); + + mutex_lock(&dev->input_lock); + *frames = dev->curr_res_table[dev->fmt_idx].skip_frames; + mutex_unlock(&dev->input_lock); + + return 0; +} + +static const struct v4l2_subdev_sensor_ops imx_sensor_ops = { + .g_skip_frames = imx_g_skip_frames, +}; + +static const struct v4l2_subdev_video_ops imx_video_ops = { + .s_stream = imx_s_stream, + .s_parm = imx_s_parm, + .g_frame_interval = imx_g_frame_interval, + .s_frame_interval = imx_s_frame_interval, +}; + +static const struct v4l2_subdev_core_ops imx_core_ops = { + .s_power = imx_s_power, + .ioctl = imx_ioctl, + .init = imx_init, +}; + +static const struct v4l2_subdev_pad_ops imx_pad_ops = { + .enum_mbus_code = imx_enum_mbus_code, + .enum_frame_size = imx_enum_frame_size, + .get_fmt = imx_get_fmt, + .set_fmt = imx_set_fmt, +}; + +static const struct v4l2_subdev_ops imx_ops = { + .core = &imx_core_ops, + .video = &imx_video_ops, + .pad = &imx_pad_ops, + .sensor = &imx_sensor_ops, +}; + +static const struct media_entity_operations imx_entity_ops = { + .link_setup = NULL, +}; + +static int imx_remove(struct i2c_client *client) +{ + struct v4l2_subdev *sd = i2c_get_clientdata(client); + struct imx_device *dev = to_imx_sensor(sd); + + if (dev->platform_data->platform_deinit) + dev->platform_data->platform_deinit(); + + media_entity_cleanup(&dev->sd.entity); + v4l2_ctrl_handler_free(&dev->ctrl_handler); + dev->platform_data->csi_cfg(sd, 0); + v4l2_device_unregister_subdev(sd); + release_msr_list(client, dev->fw); + kfree(dev); + + return 0; +} + +static int __imx_init_ctrl_handler(struct imx_device *dev) +{ + struct v4l2_ctrl_handler *hdl; + int i; + + hdl = &dev->ctrl_handler; + + v4l2_ctrl_handler_init(&dev->ctrl_handler, ARRAY_SIZE(imx_controls)); + + for (i = 0; i < ARRAY_SIZE(imx_controls); i++) + v4l2_ctrl_new_custom(&dev->ctrl_handler, + &imx_controls[i], NULL); + + dev->pixel_rate = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_PIXEL_RATE); + dev->h_blank = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_HBLANK); + dev->v_blank = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_VBLANK); + dev->link_freq = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_LINK_FREQ); + dev->h_flip = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_HFLIP); + dev->v_flip = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_VFLIP); + dev->tp_mode = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_TEST_PATTERN); + dev->tp_r = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_TEST_PATTERN_COLOR_R); + dev->tp_gr = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_TEST_PATTERN_COLOR_GR); + dev->tp_gb = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_TEST_PATTERN_COLOR_GB); + dev->tp_b = v4l2_ctrl_find(&dev->ctrl_handler, + V4L2_CID_TEST_PATTERN_COLOR_B); + + if (dev->ctrl_handler.error || dev->pixel_rate == NULL + || dev->h_blank == NULL || dev->v_blank == NULL + || dev->h_flip == NULL || dev->v_flip == NULL + || dev->link_freq == NULL) { + return dev->ctrl_handler.error; + } + + dev->ctrl_handler.lock = &dev->input_lock; + dev->sd.ctrl_handler = hdl; + v4l2_ctrl_handler_setup(&dev->ctrl_handler); + + return 0; +} + +static void imx_update_reg_info(struct imx_device *dev) +{ + if (dev->sensor_id == IMX219_ID) { + dev->reg_addr = &imx219_addr; + dev->param_hold = imx219_param_hold; + dev->param_update = imx219_param_update; + } else { + dev->reg_addr = &imx_addr; + dev->param_hold = imx_param_hold; + dev->param_update = imx_param_update; + } +} + +static int imx_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct imx_device *dev; + struct camera_mipi_info *imx_info = NULL; + int ret; + char *msr_file_name = NULL; + + /* allocate sensor device & init sub device */ + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) { + v4l2_err(client, "%s: out of memory\n", __func__); + return -ENOMEM; + } + + mutex_init(&dev->input_lock); + + dev->i2c_id = id->driver_data; + dev->fmt_idx = 0; + dev->sensor_id = IMX_ID_DEFAULT; + dev->vcm_driver = &imx_vcms[IMX_ID_DEFAULT]; + dev->digital_gain = 256; + + v4l2_i2c_subdev_init(&(dev->sd), client, &imx_ops); + + if (client->dev.platform_data) { + ret = imx_s_config(&dev->sd, client->irq, + client->dev.platform_data); + if (ret) + goto out_free; + } + imx_info = v4l2_get_subdev_hostdata(&dev->sd); + + /* + * sd->name is updated with sensor driver name by the v4l2. + * change it to sensor name in this case. + */ + imx_update_reg_info(dev); + snprintf(dev->sd.name, sizeof(dev->sd.name), "%s%x %d-%04x", + IMX_SUBDEV_PREFIX, dev->sensor_id, + i2c_adapter_id(client->adapter), client->addr); + + ret = __imx_init_ctrl_handler(dev); + if (ret) + goto out_ctrl_handler_free; + + dev->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + dev->pad.flags = MEDIA_PAD_FL_SOURCE; + dev->format.code = imx_translate_bayer_order( + imx_info->raw_bayer_order); + dev->sd.entity.ops = &imx_entity_ops; + dev->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; + + ret = media_entity_pads_init(&dev->sd.entity, 1, &dev->pad); + if (ret) { + imx_remove(client); + return ret; + } + + /* Load the Noise reduction, Dead pixel registers from cpf file*/ + if (dev->platform_data->msr_file_name != NULL) + msr_file_name = dev->platform_data->msr_file_name(); + if (msr_file_name) { + ret = load_msr_list(client, msr_file_name, &dev->fw); + if (ret) { + imx_remove(client); + return ret; + } + } else { + dev_warn(&client->dev, "Drvb file not present"); + } + + return ret; + +out_ctrl_handler_free: + v4l2_ctrl_handler_free(&dev->ctrl_handler); + +out_free: + v4l2_device_unregister_subdev(&dev->sd); + kfree(dev); + return ret; +} + +static const struct i2c_device_id imx_ids[] = { + {IMX_NAME_175, IMX175_ID}, + {IMX_NAME_135, IMX135_ID}, + {IMX_NAME_135_FUJI, IMX135_FUJI_ID}, + {IMX_NAME_134, IMX134_ID}, + {IMX_NAME_132, IMX132_ID}, + {IMX_NAME_208, IMX208_ID}, + {IMX_NAME_219, IMX219_ID}, + {IMX_NAME_227, IMX227_ID}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, imx_ids); + +static struct i2c_driver imx_driver = { + .driver = { + .name = IMX_DRIVER, + }, + .probe = imx_probe, + .remove = imx_remove, + .id_table = imx_ids, +}; + +static __init int init_imx(void) +{ + return i2c_add_driver(&imx_driver); +} + +static __exit void exit_imx(void) +{ + i2c_del_driver(&imx_driver); +} + +module_init(init_imx); +module_exit(exit_imx); + +MODULE_DESCRIPTION("A low-level driver for Sony IMX sensors"); +MODULE_AUTHOR("Shenbo Huang <shenbo.huang@intel.com>"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/staging/media/atomisp/i2c/imx/imx.h b/drivers/staging/media/atomisp/i2c/imx/imx.h new file mode 100644 index 0000000..36b3f3a --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx.h @@ -0,0 +1,766 @@ +/* + * Support for Sony IMX camera sensor. + * + * Copyright (c) 2010 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __IMX_H__ +#define __IMX_H__ +#include "../../include/linux/atomisp_platform.h" +#include "../../include/linux/atomisp.h" +#include <linux/delay.h> +#include <linux/i2c.h> +#include <linux/kernel.h> +#include <linux/spinlock.h> +#include <linux/types.h> +#include <linux/videodev2.h> +#include <linux/v4l2-mediabus.h> +#include <media/media-entity.h> +#include <media/v4l2-ctrls.h> +#include <media/v4l2-device.h> +#include <media/v4l2-subdev.h> +#include "imx175.h" +#include "imx135.h" +#include "imx134.h" +#include "imx132.h" +#include "imx208.h" +#include "imx219.h" +#include "imx227.h" + +#define IMX_MCLK 192 + +/* TODO - This should be added into include/linux/videodev2.h */ +#ifndef V4L2_IDENT_IMX +#define V4L2_IDENT_IMX 8245 +#endif + +#define IMX_MAX_AE_LUT_LENGTH 5 +/* + * imx System control registers + */ +#define IMX_MASK_5BIT 0x1F +#define IMX_MASK_4BIT 0xF +#define IMX_MASK_3BIT 0x7 +#define IMX_MASK_2BIT 0x3 +#define IMX_MASK_8BIT 0xFF +#define IMX_MASK_11BIT 0x7FF +#define IMX_INTG_BUF_COUNT 2 + +#define IMX_FINE_INTG_TIME 0x1E8 + +#define IMX_VT_PIX_CLK_DIV 0x0301 +#define IMX_VT_SYS_CLK_DIV 0x0303 +#define IMX_PRE_PLL_CLK_DIV 0x0305 +#define IMX227_IOP_PRE_PLL_CLK_DIV 0x030D +#define IMX227_PLL_MULTIPLIER 0x0306 +#define IMX227_IOP_PLL_MULTIPLIER 0x030E +#define IMX227_PLL_MULTI_DRIVE 0x0310 +#define IMX227_OP_PIX_CLK_DIV 0x0309 +#define IMX227_OP_SYS_CLK_DIV 0x030B +#define IMX_PLL_MULTIPLIER 0x030C +#define IMX_OP_PIX_DIV 0x0309 +#define IMX_OP_SYS_DIV 0x030B +#define IMX_FRAME_LENGTH_LINES 0x0340 +#define IMX_LINE_LENGTH_PIXELS 0x0342 +#define IMX_COARSE_INTG_TIME_MIN 0x1004 +#define IMX_COARSE_INTG_TIME_MAX 0x1006 +#define IMX_BINNING_ENABLE 0x0390 +#define IMX227_BINNING_ENABLE 0x0900 +#define IMX_BINNING_TYPE 0x0391 +#define IMX227_BINNING_TYPE 0x0901 +#define IMX_READ_MODE 0x0390 +#define IMX227_READ_MODE 0x0900 + +#define IMX_HORIZONTAL_START_H 0x0344 +#define IMX_VERTICAL_START_H 0x0346 +#define IMX_HORIZONTAL_END_H 0x0348 +#define IMX_VERTICAL_END_H 0x034a +#define IMX_HORIZONTAL_OUTPUT_SIZE_H 0x034c +#define IMX_VERTICAL_OUTPUT_SIZE_H 0x034e + +/* Post Divider setting register for imx132 and imx208 */ +#define IMX132_208_VT_RGPLTD 0x30A4 + +/* Multiplier setting register for imx132, imx208, and imx219 */ +#define IMX132_208_219_PLL_MULTIPLIER 0x0306 + +#define IMX_COARSE_INTEGRATION_TIME 0x0202 +#define IMX_TEST_PATTERN_MODE 0x0600 +#define IMX_TEST_PATTERN_COLOR_R 0x0602 +#define IMX_TEST_PATTERN_COLOR_GR 0x0604 +#define IMX_TEST_PATTERN_COLOR_B 0x0606 +#define IMX_TEST_PATTERN_COLOR_GB 0x0608 +#define IMX_IMG_ORIENTATION 0x0101 +#define IMX_VFLIP_BIT 2 +#define IMX_HFLIP_BIT 1 +#define IMX_GLOBAL_GAIN 0x0205 +#define IMX_SHORT_AGC_GAIN 0x0233 +#define IMX_DGC_ADJ 0x020E +#define IMX_DGC_LEN 10 +#define IMX227_DGC_LEN 4 +#define IMX_MAX_EXPOSURE_SUPPORTED 0xfffb +#define IMX_MAX_GLOBAL_GAIN_SUPPORTED 0x00ff +#define IMX_MAX_DIGITAL_GAIN_SUPPORTED 0x0fff + +#define MAX_FMTS 1 +#define IMX_OTP_DATA_SIZE 1280 + +#define IMX_SUBDEV_PREFIX "imx" +#define IMX_DRIVER "imx1x5" + +/* Sensor ids from identification register */ +#define IMX_NAME_134 "imx134" +#define IMX_NAME_135 "imx135" +#define IMX_NAME_175 "imx175" +#define IMX_NAME_132 "imx132" +#define IMX_NAME_208 "imx208" +#define IMX_NAME_219 "imx219" +#define IMX_NAME_227 "imx227" +#define IMX175_ID 0x0175 +#define IMX135_ID 0x0135 +#define IMX134_ID 0x0134 +#define IMX132_ID 0x0132 +#define IMX208_ID 0x0208 +#define IMX219_ID 0x0219 +#define IMX227_ID 0x0227 + +/* Sensor id based on i2c_device_id table + * (Fuji module can not be detected based on sensor registers) */ +#define IMX135_FUJI_ID 0x0136 +#define IMX_NAME_135_FUJI "imx135fuji" + +/* imx175 - use dw9714 vcm */ +#define IMX175_MERRFLD 0x175 +#define IMX175_VALLEYVIEW 0x176 +#define IMX135_SALTBAY 0x135 +#define IMX135_VICTORIABAY 0x136 +#define IMX132_SALTBAY 0x132 +#define IMX134_VALLEYVIEW 0x134 +#define IMX208_MOFD_PD2 0x208 +#define IMX219_MFV0_PRH 0x219 +#define IMX227_SAND 0x227 + +/* otp - specific settings */ +#define E2PROM_ADDR 0xa0 +#define E2PROM_LITEON_12P1BA869D_ADDR 0xa0 +#define E2PROM_ABICO_SS89A839_ADDR 0xa8 +#define DEFAULT_OTP_SIZE 1280 +#define IMX135_OTP_SIZE 1280 +#define IMX219_OTP_SIZE 2048 +#define IMX227_OTP_SIZE 2560 +#define E2PROM_LITEON_12P1BA869D_SIZE 544 + +#define IMX_ID_DEFAULT 0x0000 +#define IMX132_175_208_219_CHIP_ID 0x0000 +#define IMX134_135_CHIP_ID 0x0016 +#define IMX134_135_227_CHIP_ID 0x0016 + +#define IMX175_RES_WIDTH_MAX 3280 +#define IMX175_RES_HEIGHT_MAX 2464 +#define IMX135_RES_WIDTH_MAX 4208 +#define IMX135_RES_HEIGHT_MAX 3120 +#define IMX132_RES_WIDTH_MAX 1936 +#define IMX132_RES_HEIGHT_MAX 1096 +#define IMX134_RES_WIDTH_MAX 3280 +#define IMX134_RES_HEIGHT_MAX 2464 +#define IMX208_RES_WIDTH_MAX 1936 +#define IMX208_RES_HEIGHT_MAX 1096 +#define IMX219_RES_WIDTH_MAX 3280 +#define IMX219_RES_HEIGHT_MAX 2464 +#define IMX227_RES_WIDTH_MAX 2400 +#define IMX227_RES_HEIGHT_MAX 2720 + +/* Defines for lens/VCM */ +#define IMX_FOCAL_LENGTH_NUM 369 /*3.69mm*/ +#define IMX_FOCAL_LENGTH_DEM 100 +#define IMX_F_NUMBER_DEFAULT_NUM 22 +#define IMX_F_NUMBER_DEM 10 +#define IMX_INVALID_CONFIG 0xffffffff +#define IMX_MAX_FOCUS_POS 1023 +#define IMX_MAX_FOCUS_NEG (-1023) +#define IMX_VCM_SLEW_STEP_MAX 0x3f +#define IMX_VCM_SLEW_TIME_MAX 0x1f + +#define IMX_BIN_FACTOR_MAX 4 +#define IMX_INTEGRATION_TIME_MARGIN 4 +/* + * focal length bits definition: + * bits 31-16: numerator, bits 15-0: denominator + */ +#define IMX_FOCAL_LENGTH_DEFAULT 0x1710064 + +/* + * current f-number bits definition: + * bits 31-16: numerator, bits 15-0: denominator + */ +#define IMX_F_NUMBER_DEFAULT 0x16000a + +/* + * f-number range bits definition: + * bits 31-24: max f-number numerator + * bits 23-16: max f-number denominator + * bits 15-8: min f-number numerator + * bits 7-0: min f-number denominator + */ +#define IMX_F_NUMBER_RANGE 0x160a160a + +struct imx_vcm { + int (*power_up)(struct v4l2_subdev *sd); + int (*power_down)(struct v4l2_subdev *sd); + int (*init)(struct v4l2_subdev *sd); + int (*t_focus_vcm)(struct v4l2_subdev *sd, u16 val); + int (*t_focus_abs)(struct v4l2_subdev *sd, s32 value); + int (*t_focus_abs_init)(struct v4l2_subdev *sd); + int (*t_focus_rel)(struct v4l2_subdev *sd, s32 value); + int (*q_focus_status)(struct v4l2_subdev *sd, s32 *value); + int (*q_focus_abs)(struct v4l2_subdev *sd, s32 *value); + int (*t_vcm_slew)(struct v4l2_subdev *sd, s32 value); + int (*t_vcm_timing)(struct v4l2_subdev *sd, s32 value); +}; + +struct imx_otp { + void * (*otp_read)(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); + u32 start_addr; + u32 size; + u8 dev_addr; +}; + +struct max_res { + int res_max_width; + int res_max_height; +}; + +struct max_res imx_max_res[] = { + [IMX175_ID] = { + .res_max_width = IMX175_RES_WIDTH_MAX, + .res_max_height = IMX175_RES_HEIGHT_MAX, + }, + [IMX135_ID] = { + .res_max_width = IMX135_RES_WIDTH_MAX, + .res_max_height = IMX135_RES_HEIGHT_MAX, + }, + [IMX132_ID] = { + .res_max_width = IMX132_RES_WIDTH_MAX, + .res_max_height = IMX132_RES_HEIGHT_MAX, + }, + [IMX134_ID] = { + .res_max_width = IMX134_RES_WIDTH_MAX, + .res_max_height = IMX134_RES_HEIGHT_MAX, + }, + [IMX208_ID] = { + .res_max_width = IMX208_RES_WIDTH_MAX, + .res_max_height = IMX208_RES_HEIGHT_MAX, + }, + [IMX219_ID] = { + .res_max_width = IMX219_RES_WIDTH_MAX, + .res_max_height = IMX219_RES_HEIGHT_MAX, + }, + [IMX227_ID] = { + .res_max_width = IMX227_RES_WIDTH_MAX, + .res_max_height = IMX227_RES_HEIGHT_MAX, + }, +}; + +struct imx_settings { + struct imx_reg const *init_settings; + struct imx_resolution *res_preview; + struct imx_resolution *res_still; + struct imx_resolution *res_video; + int n_res_preview; + int n_res_still; + int n_res_video; +}; + +struct imx_settings imx_sets[] = { + [IMX175_MERRFLD] = { + .init_settings = imx175_init_settings, + .res_preview = imx175_res_preview, + .res_still = imx175_res_still, + .res_video = imx175_res_video, + .n_res_preview = ARRAY_SIZE(imx175_res_preview), + .n_res_still = ARRAY_SIZE(imx175_res_still), + .n_res_video = ARRAY_SIZE(imx175_res_video), + }, + [IMX175_VALLEYVIEW] = { + .init_settings = imx175_init_settings, + .res_preview = imx175_res_preview, + .res_still = imx175_res_still, + .res_video = imx175_res_video, + .n_res_preview = ARRAY_SIZE(imx175_res_preview), + .n_res_still = ARRAY_SIZE(imx175_res_still), + .n_res_video = ARRAY_SIZE(imx175_res_video), + }, + [IMX135_SALTBAY] = { + .init_settings = imx135_init_settings, + .res_preview = imx135_res_preview, + .res_still = imx135_res_still, + .res_video = imx135_res_video, + .n_res_preview = ARRAY_SIZE(imx135_res_preview), + .n_res_still = ARRAY_SIZE(imx135_res_still), + .n_res_video = ARRAY_SIZE(imx135_res_video), + }, + [IMX135_VICTORIABAY] = { + .init_settings = imx135_init_settings, + .res_preview = imx135_res_preview_mofd, + .res_still = imx135_res_still_mofd, + .res_video = imx135_res_video, + .n_res_preview = ARRAY_SIZE(imx135_res_preview_mofd), + .n_res_still = ARRAY_SIZE(imx135_res_still_mofd), + .n_res_video = ARRAY_SIZE(imx135_res_video), + }, + [IMX132_SALTBAY] = { + .init_settings = imx132_init_settings, + .res_preview = imx132_res_preview, + .res_still = imx132_res_still, + .res_video = imx132_res_video, + .n_res_preview = ARRAY_SIZE(imx132_res_preview), + .n_res_still = ARRAY_SIZE(imx132_res_still), + .n_res_video = ARRAY_SIZE(imx132_res_video), + }, + [IMX134_VALLEYVIEW] = { + .init_settings = imx134_init_settings, + .res_preview = imx134_res_preview, + .res_still = imx134_res_still, + .res_video = imx134_res_video, + .n_res_preview = ARRAY_SIZE(imx134_res_preview), + .n_res_still = ARRAY_SIZE(imx134_res_still), + .n_res_video = ARRAY_SIZE(imx134_res_video), + }, + [IMX208_MOFD_PD2] = { + .init_settings = imx208_init_settings, + .res_preview = imx208_res_preview, + .res_still = imx208_res_still, + .res_video = imx208_res_video, + .n_res_preview = ARRAY_SIZE(imx208_res_preview), + .n_res_still = ARRAY_SIZE(imx208_res_still), + .n_res_video = ARRAY_SIZE(imx208_res_video), + }, + [IMX219_MFV0_PRH] = { + .init_settings = imx219_init_settings, + .res_preview = imx219_res_preview, + .res_still = imx219_res_still, + .res_video = imx219_res_video, + .n_res_preview = ARRAY_SIZE(imx219_res_preview), + .n_res_still = ARRAY_SIZE(imx219_res_still), + .n_res_video = ARRAY_SIZE(imx219_res_video), + }, + [IMX227_SAND] = { + .init_settings = imx227_init_settings, + .res_preview = imx227_res_preview, + .res_still = imx227_res_still, + .res_video = imx227_res_video, + .n_res_preview = ARRAY_SIZE(imx227_res_preview), + .n_res_still = ARRAY_SIZE(imx227_res_still), + .n_res_video = ARRAY_SIZE(imx227_res_video), + }, +}; + +struct imx_reg_addr { + u16 frame_length_lines; + u16 line_length_pixels; + u16 horizontal_start_h; + u16 vertical_start_h; + u16 horizontal_end_h; + u16 vertical_end_h; + u16 horizontal_output_size_h; + u16 vertical_output_size_h; + u16 coarse_integration_time; + u16 img_orientation; + u16 global_gain; + u16 dgc_adj; +}; + +struct imx_reg_addr imx_addr = { + IMX_FRAME_LENGTH_LINES, + IMX_LINE_LENGTH_PIXELS, + IMX_HORIZONTAL_START_H, + IMX_VERTICAL_START_H, + IMX_HORIZONTAL_END_H, + IMX_VERTICAL_END_H, + IMX_HORIZONTAL_OUTPUT_SIZE_H, + IMX_VERTICAL_OUTPUT_SIZE_H, + IMX_COARSE_INTEGRATION_TIME, + IMX_IMG_ORIENTATION, + IMX_GLOBAL_GAIN, + IMX_DGC_ADJ, +}; + +struct imx_reg_addr imx219_addr = { + IMX219_FRAME_LENGTH_LINES, + IMX219_LINE_LENGTH_PIXELS, + IMX219_HORIZONTAL_START_H, + IMX219_VERTICAL_START_H, + IMX219_HORIZONTAL_END_H, + IMX219_VERTICAL_END_H, + IMX219_HORIZONTAL_OUTPUT_SIZE_H, + IMX219_VERTICAL_OUTPUT_SIZE_H, + IMX219_COARSE_INTEGRATION_TIME, + IMX219_IMG_ORIENTATION, + IMX219_GLOBAL_GAIN, + IMX219_DGC_ADJ, +}; + +#define v4l2_format_capture_type_entry(_width, _height, \ + _pixelformat, _bytesperline, _colorspace) \ + {\ + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,\ + .fmt.pix.width = (_width),\ + .fmt.pix.height = (_height),\ + .fmt.pix.pixelformat = (_pixelformat),\ + .fmt.pix.bytesperline = (_bytesperline),\ + .fmt.pix.colorspace = (_colorspace),\ + .fmt.pix.sizeimage = (_height)*(_bytesperline),\ + } + +#define s_output_format_entry(_width, _height, _pixelformat, \ + _bytesperline, _colorspace, _fps) \ + {\ + .v4l2_fmt = v4l2_format_capture_type_entry(_width, \ + _height, _pixelformat, _bytesperline, \ + _colorspace),\ + .fps = (_fps),\ + } + +#define s_output_format_reg_entry(_width, _height, _pixelformat, \ + _bytesperline, _colorspace, _fps, _reg_setting) \ + {\ + .s_fmt = s_output_format_entry(_width, _height,\ + _pixelformat, _bytesperline, \ + _colorspace, _fps),\ + .reg_setting = (_reg_setting),\ + } + +/* imx device structure */ +struct imx_device { + struct v4l2_subdev sd; + struct media_pad pad; + struct v4l2_mbus_framefmt format; + struct camera_sensor_platform_data *platform_data; + struct mutex input_lock; /* serialize sensor's ioctl */ + int fmt_idx; + int status; + int streaming; + int power; + int run_mode; + int vt_pix_clk_freq_mhz; + int fps_index; + u32 focus; + u16 sensor_id; /* Sensor id from registers */ + u16 i2c_id; /* Sensor id from i2c_device_id */ + u16 coarse_itg; + u16 fine_itg; + u16 digital_gain; + u16 gain; + u16 pixels_per_line; + u16 lines_per_frame; + u8 targetfps; + u8 fps; + const struct imx_reg *regs; + u8 res; + u8 type; + u8 sensor_revision; + u8 *otp_data; + struct imx_settings *mode_tables; + struct imx_vcm *vcm_driver; + struct imx_otp *otp_driver; + const struct imx_resolution *curr_res_table; + int entries_curr_table; + const struct firmware *fw; + struct imx_reg_addr *reg_addr; + const struct imx_reg *param_hold; + const struct imx_reg *param_update; + + /* used for h/b blank tuning */ + struct v4l2_ctrl_handler ctrl_handler; + struct v4l2_ctrl *pixel_rate; + struct v4l2_ctrl *h_blank; + struct v4l2_ctrl *v_blank; + struct v4l2_ctrl *link_freq; + struct v4l2_ctrl *h_flip; + struct v4l2_ctrl *v_flip; + + /* Test pattern control */ + struct v4l2_ctrl *tp_mode; + struct v4l2_ctrl *tp_r; + struct v4l2_ctrl *tp_gr; + struct v4l2_ctrl *tp_gb; + struct v4l2_ctrl *tp_b; + + /* FIXME! */ + bool new_res_sel_method; +}; + +#define to_imx_sensor(x) container_of(x, struct imx_device, sd) + +#define IMX_MAX_WRITE_BUF_SIZE 32 +struct imx_write_buffer { + u16 addr; + u8 data[IMX_MAX_WRITE_BUF_SIZE]; +}; + +struct imx_write_ctrl { + int index; + struct imx_write_buffer buffer; +}; + +static const struct imx_reg imx_soft_standby[] = { + {IMX_8BIT, 0x0100, 0x00}, + {IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx_streaming[] = { + {IMX_8BIT, 0x0100, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx_param_hold[] = { + {IMX_8BIT, 0x0104, 0x01}, /* GROUPED_PARAMETER_HOLD */ + {IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx_param_update[] = { + {IMX_8BIT, 0x0104, 0x00}, /* GROUPED_PARAMETER_HOLD */ + {IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx219_param_hold[] = { + {IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx219_param_update[] = { + {IMX_TOK_TERM, 0, 0} +}; + +extern int ad5816g_vcm_power_up(struct v4l2_subdev *sd); +extern int ad5816g_vcm_power_down(struct v4l2_subdev *sd); +extern int ad5816g_vcm_init(struct v4l2_subdev *sd); + +extern int ad5816g_t_focus_vcm(struct v4l2_subdev *sd, u16 val); +extern int ad5816g_t_focus_abs(struct v4l2_subdev *sd, s32 value); +extern int ad5816g_t_focus_rel(struct v4l2_subdev *sd, s32 value); +extern int ad5816g_q_focus_status(struct v4l2_subdev *sd, s32 *value); +extern int ad5816g_q_focus_abs(struct v4l2_subdev *sd, s32 *value); +extern int ad5816g_t_vcm_slew(struct v4l2_subdev *sd, s32 value); +extern int ad5816g_t_vcm_timing(struct v4l2_subdev *sd, s32 value); + +extern int drv201_vcm_power_up(struct v4l2_subdev *sd); +extern int drv201_vcm_power_down(struct v4l2_subdev *sd); +extern int drv201_vcm_init(struct v4l2_subdev *sd); + +extern int drv201_t_focus_vcm(struct v4l2_subdev *sd, u16 val); +extern int drv201_t_focus_abs(struct v4l2_subdev *sd, s32 value); +extern int drv201_t_focus_rel(struct v4l2_subdev *sd, s32 value); +extern int drv201_q_focus_status(struct v4l2_subdev *sd, s32 *value); +extern int drv201_q_focus_abs(struct v4l2_subdev *sd, s32 *value); +extern int drv201_t_vcm_slew(struct v4l2_subdev *sd, s32 value); +extern int drv201_t_vcm_timing(struct v4l2_subdev *sd, s32 value); + +extern int dw9714_vcm_power_up(struct v4l2_subdev *sd); +extern int dw9714_vcm_power_down(struct v4l2_subdev *sd); +extern int dw9714_vcm_init(struct v4l2_subdev *sd); + +extern int dw9714_t_focus_vcm(struct v4l2_subdev *sd, u16 val); +extern int dw9714_t_focus_abs(struct v4l2_subdev *sd, s32 value); +extern int dw9714_t_focus_abs_init(struct v4l2_subdev *sd); +extern int dw9714_t_focus_rel(struct v4l2_subdev *sd, s32 value); +extern int dw9714_q_focus_status(struct v4l2_subdev *sd, s32 *value); +extern int dw9714_q_focus_abs(struct v4l2_subdev *sd, s32 *value); +extern int dw9714_t_vcm_slew(struct v4l2_subdev *sd, s32 value); +extern int dw9714_t_vcm_timing(struct v4l2_subdev *sd, s32 value); + +extern int dw9719_vcm_power_up(struct v4l2_subdev *sd); +extern int dw9719_vcm_power_down(struct v4l2_subdev *sd); +extern int dw9719_vcm_init(struct v4l2_subdev *sd); + +extern int dw9719_t_focus_vcm(struct v4l2_subdev *sd, u16 val); +extern int dw9719_t_focus_abs(struct v4l2_subdev *sd, s32 value); +extern int dw9719_t_focus_rel(struct v4l2_subdev *sd, s32 value); +extern int dw9719_q_focus_status(struct v4l2_subdev *sd, s32 *value); +extern int dw9719_q_focus_abs(struct v4l2_subdev *sd, s32 *value); +extern int dw9719_t_vcm_slew(struct v4l2_subdev *sd, s32 value); +extern int dw9719_t_vcm_timing(struct v4l2_subdev *sd, s32 value); + +extern int dw9718_vcm_power_up(struct v4l2_subdev *sd); +extern int dw9718_vcm_power_down(struct v4l2_subdev *sd); +extern int dw9718_vcm_init(struct v4l2_subdev *sd); + +extern int dw9718_t_focus_vcm(struct v4l2_subdev *sd, u16 val); +extern int dw9718_t_focus_abs(struct v4l2_subdev *sd, s32 value); +extern int dw9718_t_focus_rel(struct v4l2_subdev *sd, s32 value); +extern int dw9718_q_focus_status(struct v4l2_subdev *sd, s32 *value); +extern int dw9718_q_focus_abs(struct v4l2_subdev *sd, s32 *value); +extern int dw9718_t_vcm_slew(struct v4l2_subdev *sd, s32 value); +extern int dw9718_t_vcm_timing(struct v4l2_subdev *sd, s32 value); + +extern int vcm_power_up(struct v4l2_subdev *sd); +extern int vcm_power_down(struct v4l2_subdev *sd); + +struct imx_vcm imx_vcms[] = { + [IMX175_MERRFLD] = { + .power_up = drv201_vcm_power_up, + .power_down = drv201_vcm_power_down, + .init = drv201_vcm_init, + .t_focus_vcm = drv201_t_focus_vcm, + .t_focus_abs = drv201_t_focus_abs, + .t_focus_abs_init = NULL, + .t_focus_rel = drv201_t_focus_rel, + .q_focus_status = drv201_q_focus_status, + .q_focus_abs = drv201_q_focus_abs, + .t_vcm_slew = drv201_t_vcm_slew, + .t_vcm_timing = drv201_t_vcm_timing, + }, + [IMX175_VALLEYVIEW] = { + .power_up = dw9714_vcm_power_up, + .power_down = dw9714_vcm_power_down, + .init = dw9714_vcm_init, + .t_focus_vcm = dw9714_t_focus_vcm, + .t_focus_abs = dw9714_t_focus_abs, + .t_focus_abs_init = NULL, + .t_focus_rel = dw9714_t_focus_rel, + .q_focus_status = dw9714_q_focus_status, + .q_focus_abs = dw9714_q_focus_abs, + .t_vcm_slew = dw9714_t_vcm_slew, + .t_vcm_timing = dw9714_t_vcm_timing, + }, + [IMX135_SALTBAY] = { + .power_up = ad5816g_vcm_power_up, + .power_down = ad5816g_vcm_power_down, + .init = ad5816g_vcm_init, + .t_focus_vcm = ad5816g_t_focus_vcm, + .t_focus_abs = ad5816g_t_focus_abs, + .t_focus_abs_init = NULL, + .t_focus_rel = ad5816g_t_focus_rel, + .q_focus_status = ad5816g_q_focus_status, + .q_focus_abs = ad5816g_q_focus_abs, + .t_vcm_slew = ad5816g_t_vcm_slew, + .t_vcm_timing = ad5816g_t_vcm_timing, + }, + [IMX135_VICTORIABAY] = { + .power_up = dw9719_vcm_power_up, + .power_down = dw9719_vcm_power_down, + .init = dw9719_vcm_init, + .t_focus_vcm = dw9719_t_focus_vcm, + .t_focus_abs = dw9719_t_focus_abs, + .t_focus_abs_init = NULL, + .t_focus_rel = dw9719_t_focus_rel, + .q_focus_status = dw9719_q_focus_status, + .q_focus_abs = dw9719_q_focus_abs, + .t_vcm_slew = dw9719_t_vcm_slew, + .t_vcm_timing = dw9719_t_vcm_timing, + }, + [IMX134_VALLEYVIEW] = { + .power_up = dw9714_vcm_power_up, + .power_down = dw9714_vcm_power_down, + .init = dw9714_vcm_init, + .t_focus_vcm = dw9714_t_focus_vcm, + .t_focus_abs = dw9714_t_focus_abs, + .t_focus_abs_init = dw9714_t_focus_abs_init, + .t_focus_rel = dw9714_t_focus_rel, + .q_focus_status = dw9714_q_focus_status, + .q_focus_abs = dw9714_q_focus_abs, + .t_vcm_slew = dw9714_t_vcm_slew, + .t_vcm_timing = dw9714_t_vcm_timing, + }, + [IMX219_MFV0_PRH] = { + .power_up = dw9718_vcm_power_up, + .power_down = dw9718_vcm_power_down, + .init = dw9718_vcm_init, + .t_focus_vcm = dw9718_t_focus_vcm, + .t_focus_abs = dw9718_t_focus_abs, + .t_focus_abs_init = NULL, + .t_focus_rel = dw9718_t_focus_rel, + .q_focus_status = dw9718_q_focus_status, + .q_focus_abs = dw9718_q_focus_abs, + .t_vcm_slew = dw9718_t_vcm_slew, + .t_vcm_timing = dw9718_t_vcm_timing, + }, + [IMX_ID_DEFAULT] = { + .power_up = NULL, + .power_down = NULL, + .t_focus_abs_init = NULL, + }, +}; + +extern void *dummy_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +extern void *imx_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +extern void *e2prom_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +extern void *brcc064_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +extern void *imx227_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +extern void *e2prom_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size); +struct imx_otp imx_otps[] = { + [IMX175_MERRFLD] = { + .otp_read = imx_otp_read, + .dev_addr = E2PROM_ADDR, + .start_addr = 0, + .size = DEFAULT_OTP_SIZE, + }, + [IMX175_VALLEYVIEW] = { + .otp_read = e2prom_otp_read, + .dev_addr = E2PROM_ABICO_SS89A839_ADDR, + .start_addr = E2PROM_2ADDR, + .size = DEFAULT_OTP_SIZE, + }, + [IMX135_SALTBAY] = { + .otp_read = e2prom_otp_read, + .dev_addr = E2PROM_ADDR, + .start_addr = 0, + .size = DEFAULT_OTP_SIZE, + }, + [IMX135_VICTORIABAY] = { + .otp_read = imx_otp_read, + .size = DEFAULT_OTP_SIZE, + }, + [IMX134_VALLEYVIEW] = { + .otp_read = e2prom_otp_read, + .dev_addr = E2PROM_LITEON_12P1BA869D_ADDR, + .start_addr = 0, + .size = E2PROM_LITEON_12P1BA869D_SIZE, + }, + [IMX132_SALTBAY] = { + .otp_read = dummy_otp_read, + .size = DEFAULT_OTP_SIZE, + }, + [IMX208_MOFD_PD2] = { + .otp_read = dummy_otp_read, + .size = DEFAULT_OTP_SIZE, + }, + [IMX219_MFV0_PRH] = { + .otp_read = brcc064_otp_read, + .dev_addr = E2PROM_ADDR, + .start_addr = 0, + .size = IMX219_OTP_SIZE, + }, + [IMX227_SAND] = { + .otp_read = imx227_otp_read, + .size = IMX227_OTP_SIZE, + }, + [IMX_ID_DEFAULT] = { + .otp_read = dummy_otp_read, + .size = DEFAULT_OTP_SIZE, + }, +}; + +#endif + diff --git a/drivers/staging/media/atomisp/i2c/imx/imx132.h b/drivers/staging/media/atomisp/i2c/imx/imx132.h new file mode 100644 index 0000000..98f047b --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx132.h @@ -0,0 +1,566 @@ +/* + * Support for Sony IMX camera sensor. + * + * Copyright (c) 2013 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __IMX132_H__ +#define __IMX132_H__ +#include "common.h" + +/********************** registers define ********************************/ +#define IMX132_RGLANESEL 0x3301 /* Number of lanes */ +#define IMX132_RGLANESEL_1LANE 0x01 +#define IMX132_RGLANESEL_2LANES 0x00 +#define IMX132_RGLANESEL_4LANES 0x03 + +#define IMX132_2LANES_GAINFACT 2096 /* 524/256 * 2^10 */ +#define IMX132_2LANES_GAINFACT_SHIFT 10 + +/********************** settings for imx from vendor*********************/ +static struct imx_reg imx132_1080p_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* Global Settings */ + {IMX_8BIT, 0x3087, 0x53}, + {IMX_8BIT, 0x308B, 0x5A}, + {IMX_8BIT, 0x3094, 0x11}, + {IMX_8BIT, 0x309D, 0xA4}, + {IMX_8BIT, 0x30AA, 0x01}, + {IMX_8BIT, 0x30C6, 0x00}, + {IMX_8BIT, 0x30C7, 0x00}, + {IMX_8BIT, 0x3118, 0x2F}, + {IMX_8BIT, 0x312A, 0x00}, + {IMX_8BIT, 0x312B, 0x0B}, + {IMX_8BIT, 0x312C, 0x0B}, + {IMX_8BIT, 0x312D, 0x13}, + /* PLL setting */ + {IMX_8BIT, 0x0305, 0x02}, + {IMX_8BIT, 0x0307, 0x50}, + {IMX_8BIT, 0x30A4, 0x02}, + {IMX_8BIT, 0x303C, 0x3C}, + /* Mode setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x14}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x32}, + {IMX_8BIT, 0x0348, 0x07}, + {IMX_8BIT, 0x0349, 0xA3}, + {IMX_8BIT, 0x034A, 0x04}, + {IMX_8BIT, 0x034B, 0x79}, + {IMX_8BIT, 0x034C, 0x07}, + {IMX_8BIT, 0x034D, 0x90}, + {IMX_8BIT, 0x034E, 0x04}, + {IMX_8BIT, 0x034F, 0x48}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x303D, 0x10}, + {IMX_8BIT, 0x303E, 0x5A}, + {IMX_8BIT, 0x3040, 0x00}, + {IMX_8BIT, 0x3041, 0x00}, + {IMX_8BIT, 0x3048, 0x00}, + {IMX_8BIT, 0x304C, 0x2F}, + {IMX_8BIT, 0x304D, 0x02}, + {IMX_8BIT, 0x3064, 0x92}, + {IMX_8BIT, 0x306A, 0x10}, + {IMX_8BIT, 0x309B, 0x00}, + {IMX_8BIT, 0x309E, 0x41}, + {IMX_8BIT, 0x30A0, 0x10}, + {IMX_8BIT, 0x30A1, 0x0B}, + {IMX_8BIT, 0x30B2, 0x00}, + {IMX_8BIT, 0x30D5, 0x00}, + {IMX_8BIT, 0x30D6, 0x00}, + {IMX_8BIT, 0x30D7, 0x00}, + {IMX_8BIT, 0x30D8, 0x00}, + {IMX_8BIT, 0x30D9, 0x00}, + {IMX_8BIT, 0x30DA, 0x00}, + {IMX_8BIT, 0x30DB, 0x00}, + {IMX_8BIT, 0x30DC, 0x00}, + {IMX_8BIT, 0x30DD, 0x00}, + {IMX_8BIT, 0x30DE, 0x00}, + {IMX_8BIT, 0x3102, 0x0C}, + {IMX_8BIT, 0x3103, 0x33}, + {IMX_8BIT, 0x3104, 0x18}, + {IMX_8BIT, 0x3105, 0x00}, + {IMX_8BIT, 0x3106, 0x65}, + {IMX_8BIT, 0x3107, 0x00}, + {IMX_8BIT, 0x3108, 0x06}, + {IMX_8BIT, 0x3109, 0x04}, + {IMX_8BIT, 0x310A, 0x04}, + {IMX_8BIT, 0x315C, 0x3D}, + {IMX_8BIT, 0x315D, 0x3C}, + {IMX_8BIT, 0x316E, 0x3E}, + {IMX_8BIT, 0x316F, 0x3D}, + /* Global timing */ + {IMX_8BIT, 0x3304, 0x07}, /* RGTLPX[5:0] TLPX */ + {IMX_8BIT, 0x3305, 0x06}, /* RGTCLKPREPARE[3:0] TCLK-PREPARE */ + {IMX_8BIT, 0x3306, 0x19}, /* RGTCLKZERO[5:0] TCLK-ZERO */ + {IMX_8BIT, 0x3307, 0x03}, /* RGTCLKPRE[5:0] TCLK-PRE */ + {IMX_8BIT, 0x3308, 0x0F}, /* RGTCLKPOST[5:0] TCLK-POST */ + {IMX_8BIT, 0x3309, 0x07}, /* RGTCLKTRAIL[3:0] TCLK-TRAIL */ + {IMX_8BIT, 0x330A, 0x0C}, /* RGTHSEXIT[5:0] THS-EXIT */ + {IMX_8BIT, 0x330B, 0x06}, /* RGTHSPREPARE[3:0] THS-PREPARE */ + {IMX_8BIT, 0x330C, 0x0B}, /* RGTHSZERO[5:0] THS-ZERO */ + {IMX_8BIT, 0x330D, 0x07}, /* RGTHSTRAIL[3:0] THS-TRAIL */ + {IMX_8BIT, 0x330E, 0x03}, + {IMX_8BIT, 0x3318, 0x62}, + {IMX_8BIT, 0x3322, 0x09}, + {IMX_8BIT, 0x3342, 0x00}, + {IMX_8BIT, 0x3348, 0xE0}, + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx132_1456x1096_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* Global Settings */ + {IMX_8BIT, 0x3087, 0x53}, + {IMX_8BIT, 0x308B, 0x5A}, + {IMX_8BIT, 0x3094, 0x11}, + {IMX_8BIT, 0x309D, 0xA4}, + {IMX_8BIT, 0x30AA, 0x01}, + {IMX_8BIT, 0x30C6, 0x00}, + {IMX_8BIT, 0x30C7, 0x00}, + {IMX_8BIT, 0x3118, 0x2F}, + {IMX_8BIT, 0x312A, 0x00}, + {IMX_8BIT, 0x312B, 0x0B}, + {IMX_8BIT, 0x312C, 0x0B}, + {IMX_8BIT, 0x312D, 0x13}, + /* PLL setting */ + {IMX_8BIT, 0x0305, 0x02}, + {IMX_8BIT, 0x0307, 0x50}, + {IMX_8BIT, 0x30A4, 0x02}, + {IMX_8BIT, 0x303C, 0x3C}, + /* Mode setting */ + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0x04}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x32}, + {IMX_8BIT, 0x0348, 0x06}, + {IMX_8BIT, 0x0349, 0xB3}, + {IMX_8BIT, 0x034A, 0x04}, + {IMX_8BIT, 0x034B, 0x79}, + {IMX_8BIT, 0x034C, 0x05}, + {IMX_8BIT, 0x034D, 0xB0}, + {IMX_8BIT, 0x034E, 0x04}, + {IMX_8BIT, 0x034F, 0x48}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x303D, 0x10}, + {IMX_8BIT, 0x303E, 0x5A}, + {IMX_8BIT, 0x3040, 0x00}, + {IMX_8BIT, 0x3041, 0x00}, + {IMX_8BIT, 0x3048, 0x00}, + {IMX_8BIT, 0x304C, 0x2F}, + {IMX_8BIT, 0x304D, 0x02}, + {IMX_8BIT, 0x3064, 0x92}, + {IMX_8BIT, 0x306A, 0x10}, + {IMX_8BIT, 0x309B, 0x00}, + {IMX_8BIT, 0x309E, 0x41}, + {IMX_8BIT, 0x30A0, 0x10}, + {IMX_8BIT, 0x30A1, 0x0B}, + {IMX_8BIT, 0x30B2, 0x00}, + {IMX_8BIT, 0x30D5, 0x00}, + {IMX_8BIT, 0x30D6, 0x00}, + {IMX_8BIT, 0x30D7, 0x00}, + {IMX_8BIT, 0x30D8, 0x00}, + {IMX_8BIT, 0x30D9, 0x00}, + {IMX_8BIT, 0x30DA, 0x00}, + {IMX_8BIT, 0x30DB, 0x00}, + {IMX_8BIT, 0x30DC, 0x00}, + {IMX_8BIT, 0x30DD, 0x00}, + {IMX_8BIT, 0x30DE, 0x00}, + {IMX_8BIT, 0x3102, 0x0C}, + {IMX_8BIT, 0x3103, 0x33}, + {IMX_8BIT, 0x3104, 0x18}, + {IMX_8BIT, 0x3105, 0x00}, + {IMX_8BIT, 0x3106, 0x65}, + {IMX_8BIT, 0x3107, 0x00}, + {IMX_8BIT, 0x3108, 0x06}, + {IMX_8BIT, 0x3109, 0x04}, + {IMX_8BIT, 0x310A, 0x04}, + {IMX_8BIT, 0x315C, 0x3D}, + {IMX_8BIT, 0x315D, 0x3C}, + {IMX_8BIT, 0x316E, 0x3E}, + {IMX_8BIT, 0x316F, 0x3D}, + /* Global timing */ + {IMX_8BIT, 0x3304, 0x07}, /* RGTLPX[5:0] TLPX */ + {IMX_8BIT, 0x3305, 0x06}, /* RGTCLKPREPARE[3:0] TCLK-PREPARE */ + {IMX_8BIT, 0x3306, 0x19}, /* RGTCLKZERO[5:0] TCLK-ZERO */ + {IMX_8BIT, 0x3307, 0x03}, /* RGTCLKPRE[5:0] TCLK-PRE */ + {IMX_8BIT, 0x3308, 0x0F}, /* RGTCLKPOST[5:0] TCLK-POST */ + {IMX_8BIT, 0x3309, 0x07}, /* RGTCLKTRAIL[3:0] TCLK-TRAIL */ + {IMX_8BIT, 0x330A, 0x0C}, /* RGTHSEXIT[5:0] THS-EXIT */ + {IMX_8BIT, 0x330B, 0x06}, /* RGTHSPREPARE[3:0] THS-PREPARE */ + {IMX_8BIT, 0x330C, 0x0B}, /* RGTHSZERO[5:0] THS-ZERO */ + {IMX_8BIT, 0x330D, 0x07}, /* RGTHSTRAIL[3:0] THS-TRAIL */ + {IMX_8BIT, 0x330E, 0x03}, + {IMX_8BIT, 0x3318, 0x62}, + {IMX_8BIT, 0x3322, 0x09}, + {IMX_8BIT, 0x3342, 0x00}, + {IMX_8BIT, 0x3348, 0xE0}, + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx132_1636x1096_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* Global Settings */ + {IMX_8BIT, 0x3087, 0x53}, + {IMX_8BIT, 0x308B, 0x5A}, + {IMX_8BIT, 0x3094, 0x11}, + {IMX_8BIT, 0x309D, 0xA4}, + {IMX_8BIT, 0x30AA, 0x01}, + {IMX_8BIT, 0x30C6, 0x00}, + {IMX_8BIT, 0x30C7, 0x00}, + {IMX_8BIT, 0x3118, 0x2F}, + {IMX_8BIT, 0x312A, 0x00}, + {IMX_8BIT, 0x312B, 0x0B}, + {IMX_8BIT, 0x312C, 0x0B}, + {IMX_8BIT, 0x312D, 0x13}, + /* PLL setting */ + {IMX_8BIT, 0x0305, 0x02}, + {IMX_8BIT, 0x0307, 0x50}, + {IMX_8BIT, 0x30A4, 0x02}, + {IMX_8BIT, 0x303C, 0x3C}, + /* Mode setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0xAA}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x32}, + {IMX_8BIT, 0x0348, 0x07}, + {IMX_8BIT, 0x0349, 0x0D}, + {IMX_8BIT, 0x034A, 0x04}, + {IMX_8BIT, 0x034B, 0x79}, + {IMX_8BIT, 0x034C, 0x06}, + {IMX_8BIT, 0x034D, 0x64}, + {IMX_8BIT, 0x034E, 0x04}, + {IMX_8BIT, 0x034F, 0x48}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x303D, 0x10}, + {IMX_8BIT, 0x303E, 0x5A}, + {IMX_8BIT, 0x3040, 0x00}, + {IMX_8BIT, 0x3041, 0x00}, + {IMX_8BIT, 0x3048, 0x00}, + {IMX_8BIT, 0x304C, 0x2F}, + {IMX_8BIT, 0x304D, 0x02}, + {IMX_8BIT, 0x3064, 0x92}, + {IMX_8BIT, 0x306A, 0x10}, + {IMX_8BIT, 0x309B, 0x00}, + {IMX_8BIT, 0x309E, 0x41}, + {IMX_8BIT, 0x30A0, 0x10}, + {IMX_8BIT, 0x30A1, 0x0B}, + {IMX_8BIT, 0x30B2, 0x00}, + {IMX_8BIT, 0x30D5, 0x00}, + {IMX_8BIT, 0x30D6, 0x00}, + {IMX_8BIT, 0x30D7, 0x00}, + {IMX_8BIT, 0x30D8, 0x00}, + {IMX_8BIT, 0x30D9, 0x00}, + {IMX_8BIT, 0x30DA, 0x00}, + {IMX_8BIT, 0x30DB, 0x00}, + {IMX_8BIT, 0x30DC, 0x00}, + {IMX_8BIT, 0x30DD, 0x00}, + {IMX_8BIT, 0x30DE, 0x00}, + {IMX_8BIT, 0x3102, 0x0C}, + {IMX_8BIT, 0x3103, 0x33}, + {IMX_8BIT, 0x3104, 0x18}, + {IMX_8BIT, 0x3105, 0x00}, + {IMX_8BIT, 0x3106, 0x65}, + {IMX_8BIT, 0x3107, 0x00}, + {IMX_8BIT, 0x3108, 0x06}, + {IMX_8BIT, 0x3109, 0x04}, + {IMX_8BIT, 0x310A, 0x04}, + {IMX_8BIT, 0x315C, 0x3D}, + {IMX_8BIT, 0x315D, 0x3C}, + {IMX_8BIT, 0x316E, 0x3E}, + {IMX_8BIT, 0x316F, 0x3D}, + /* Global timing */ + {IMX_8BIT, 0x3304, 0x07}, /* RGTLPX[5:0] TLPX */ + {IMX_8BIT, 0x3305, 0x06}, /* RGTCLKPREPARE[3:0] TCLK-PREPARE */ + {IMX_8BIT, 0x3306, 0x19}, /* RGTCLKZERO[5:0] TCLK-ZERO */ + {IMX_8BIT, 0x3307, 0x03}, /* RGTCLKPRE[5:0] TCLK-PRE */ + {IMX_8BIT, 0x3308, 0x0F}, /* RGTCLKPOST[5:0] TCLK-POST */ + {IMX_8BIT, 0x3309, 0x07}, /* RGTCLKTRAIL[3:0] TCLK-TRAIL */ + {IMX_8BIT, 0x330A, 0x0C}, /* RGTHSEXIT[5:0] THS-EXIT */ + {IMX_8BIT, 0x330B, 0x06}, /* RGTHSPREPARE[3:0] THS-PREPARE */ + {IMX_8BIT, 0x330C, 0x0B}, /* RGTHSZERO[5:0] THS-ZERO */ + {IMX_8BIT, 0x330D, 0x07}, /* RGTHSTRAIL[3:0] THS-TRAIL */ + {IMX_8BIT, 0x330E, 0x03}, + {IMX_8BIT, 0x3318, 0x62}, + {IMX_8BIT, 0x3322, 0x09}, + {IMX_8BIT, 0x3342, 0x00}, + {IMX_8BIT, 0x3348, 0xE0}, + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx132_1336x1096_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* Global Settings */ + {IMX_8BIT, 0x3087, 0x53}, + {IMX_8BIT, 0x308B, 0x5A}, + {IMX_8BIT, 0x3094, 0x11}, + {IMX_8BIT, 0x309D, 0xA4}, + {IMX_8BIT, 0x30AA, 0x01}, + {IMX_8BIT, 0x30C6, 0x00}, + {IMX_8BIT, 0x30C7, 0x00}, + {IMX_8BIT, 0x3118, 0x2F}, + {IMX_8BIT, 0x312A, 0x00}, + {IMX_8BIT, 0x312B, 0x0B}, + {IMX_8BIT, 0x312C, 0x0B}, + {IMX_8BIT, 0x312D, 0x13}, + /* PLL setting */ + {IMX_8BIT, 0x0305, 0x02}, + {IMX_8BIT, 0x0307, 0x50}, + {IMX_8BIT, 0x30A4, 0x02}, + {IMX_8BIT, 0x303C, 0x3C}, + /* Mode setting */ + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0x2C}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x32}, + {IMX_8BIT, 0x0348, 0x06}, + {IMX_8BIT, 0x0349, 0x77}, + {IMX_8BIT, 0x034A, 0x04}, + {IMX_8BIT, 0x034B, 0x79}, + {IMX_8BIT, 0x034C, 0x05}, + {IMX_8BIT, 0x034D, 0x38}, + {IMX_8BIT, 0x034E, 0x04}, + {IMX_8BIT, 0x034F, 0x48}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x303D, 0x10}, + {IMX_8BIT, 0x303E, 0x5A}, + {IMX_8BIT, 0x3040, 0x00}, + {IMX_8BIT, 0x3041, 0x00}, + {IMX_8BIT, 0x3048, 0x00}, + {IMX_8BIT, 0x304C, 0x2F}, + {IMX_8BIT, 0x304D, 0x02}, + {IMX_8BIT, 0x3064, 0x92}, + {IMX_8BIT, 0x306A, 0x10}, + {IMX_8BIT, 0x309B, 0x00}, + {IMX_8BIT, 0x309E, 0x41}, + {IMX_8BIT, 0x30A0, 0x10}, + {IMX_8BIT, 0x30A1, 0x0B}, + {IMX_8BIT, 0x30B2, 0x00}, + {IMX_8BIT, 0x30D5, 0x00}, + {IMX_8BIT, 0x30D6, 0x00}, + {IMX_8BIT, 0x30D7, 0x00}, + {IMX_8BIT, 0x30D8, 0x00}, + {IMX_8BIT, 0x30D9, 0x00}, + {IMX_8BIT, 0x30DA, 0x00}, + {IMX_8BIT, 0x30DB, 0x00}, + {IMX_8BIT, 0x30DC, 0x00}, + {IMX_8BIT, 0x30DD, 0x00}, + {IMX_8BIT, 0x30DE, 0x00}, + {IMX_8BIT, 0x3102, 0x0C}, + {IMX_8BIT, 0x3103, 0x33}, + {IMX_8BIT, 0x3104, 0x18}, + {IMX_8BIT, 0x3105, 0x00}, + {IMX_8BIT, 0x3106, 0x65}, + {IMX_8BIT, 0x3107, 0x00}, + {IMX_8BIT, 0x3108, 0x06}, + {IMX_8BIT, 0x3109, 0x04}, + {IMX_8BIT, 0x310A, 0x04}, + {IMX_8BIT, 0x315C, 0x3D}, + {IMX_8BIT, 0x315D, 0x3C}, + {IMX_8BIT, 0x316E, 0x3E}, + {IMX_8BIT, 0x316F, 0x3D}, + /* Global timing */ + {IMX_8BIT, 0x3304, 0x07}, /* RGTLPX[5:0] TLPX */ + {IMX_8BIT, 0x3305, 0x06}, /* RGTCLKPREPARE[3:0] TCLK-PREPARE */ + {IMX_8BIT, 0x3306, 0x19}, /* RGTCLKZERO[5:0] TCLK-ZERO */ + {IMX_8BIT, 0x3307, 0x03}, /* RGTCLKPRE[5:0] TCLK-PRE */ + {IMX_8BIT, 0x3308, 0x0F}, /* RGTCLKPOST[5:0] TCLK-POST */ + {IMX_8BIT, 0x3309, 0x07}, /* RGTCLKTRAIL[3:0] TCLK-TRAIL */ + {IMX_8BIT, 0x330A, 0x0C}, /* RGTHSEXIT[5:0] THS-EXIT */ + {IMX_8BIT, 0x330B, 0x06}, /* RGTHSPREPARE[3:0] THS-PREPARE */ + {IMX_8BIT, 0x330C, 0x0B}, /* RGTHSZERO[5:0] THS-ZERO */ + {IMX_8BIT, 0x330D, 0x07}, /* RGTHSTRAIL[3:0] THS-TRAIL */ + {IMX_8BIT, 0x330E, 0x03}, + {IMX_8BIT, 0x3318, 0x62}, + {IMX_8BIT, 0x3322, 0x09}, + {IMX_8BIT, 0x3342, 0x00}, + {IMX_8BIT, 0x3348, 0xE0}, + + {IMX_TOK_TERM, 0, 0}, +}; + +/********************** settings for imx - reference *********************/ +static struct imx_reg const imx132_init_settings[] = { + /* sw reset */ + { IMX_8BIT, 0x0100, 0x00 }, + { IMX_8BIT, 0x0103, 0x01 }, + { IMX_TOK_DELAY, 0, 5}, + { IMX_8BIT, 0x0103, 0x00 }, + GROUPED_PARAMETER_HOLD_ENABLE, + /* Global Settings */ + {IMX_8BIT, 0x3087, 0x53}, + {IMX_8BIT, 0x308B, 0x5A}, + {IMX_8BIT, 0x3094, 0x11}, + {IMX_8BIT, 0x309D, 0xA4}, + {IMX_8BIT, 0x30AA, 0x01}, + {IMX_8BIT, 0x30C6, 0x00}, + {IMX_8BIT, 0x30C7, 0x00}, + {IMX_8BIT, 0x3118, 0x2F}, + {IMX_8BIT, 0x312A, 0x00}, + {IMX_8BIT, 0x312B, 0x0B}, + {IMX_8BIT, 0x312C, 0x0B}, + {IMX_8BIT, 0x312D, 0x13}, + GROUPED_PARAMETER_HOLD_DISABLE, + { IMX_TOK_TERM, 0, 0} +}; + +struct imx_resolution imx132_res_preview[] = { + { + .desc = "imx132_1080p_30fps", + .regs = imx132_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, +}; + +struct imx_resolution imx132_res_still[] = { + { + .desc = "imx132_1080p_30fps", + .regs = imx132_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, +}; + +struct imx_resolution imx132_res_video[] = { + { + .desc = "imx132_1336x1096_30fps", + .regs = imx132_1336x1096_30fps, + .width = 1336, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, + { + .desc = "imx132_1456x1096_30fps", + .regs = imx132_1456x1096_30fps, + .width = 1456, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, + { + .desc = "imx132_1636x1096_30fps", + .regs = imx132_1636x1096_30fps, + .width = 1636, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, + { + .desc = "imx132_1080p_30fps", + .regs = imx132_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08F2, + .lines_per_frame = 0x045C, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .skip_frames = 2, + .mipi_freq = 384000, + }, +}; +#endif + diff --git a/drivers/staging/media/atomisp/i2c/imx/imx134.h b/drivers/staging/media/atomisp/i2c/imx/imx134.h new file mode 100644 index 0000000..cf35197 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx134.h @@ -0,0 +1,2464 @@ +#ifndef __IMX134_H__ +#define __IMX134_H__ + +/********************** imx134 setting - version 1 *********************/ +static struct imx_reg const imx134_init_settings[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* Basic settings */ + { IMX_8BIT, 0x0105, 0x01 }, + { IMX_8BIT, 0x0220, 0x01 }, + { IMX_8BIT, 0x3302, 0x11 }, + { IMX_8BIT, 0x3833, 0x20 }, + { IMX_8BIT, 0x3893, 0x00 }, + { IMX_8BIT, 0x3906, 0x08 }, + { IMX_8BIT, 0x3907, 0x01 }, + { IMX_8BIT, 0x391B, 0x01 }, + { IMX_8BIT, 0x3C09, 0x01 }, + { IMX_8BIT, 0x600A, 0x00 }, + + /* Analog settings */ + { IMX_8BIT, 0x3008, 0xB0 }, + { IMX_8BIT, 0x320A, 0x01 }, + { IMX_8BIT, 0x320D, 0x10 }, + { IMX_8BIT, 0x3216, 0x2E }, + { IMX_8BIT, 0x322C, 0x02 }, + { IMX_8BIT, 0x3409, 0x0C }, + { IMX_8BIT, 0x340C, 0x2D }, + { IMX_8BIT, 0x3411, 0x39 }, + { IMX_8BIT, 0x3414, 0x1E }, + { IMX_8BIT, 0x3427, 0x04 }, + { IMX_8BIT, 0x3480, 0x1E }, + { IMX_8BIT, 0x3484, 0x1E }, + { IMX_8BIT, 0x3488, 0x1E }, + { IMX_8BIT, 0x348C, 0x1E }, + { IMX_8BIT, 0x3490, 0x1E }, + { IMX_8BIT, 0x3494, 0x1E }, + { IMX_8BIT, 0x3511, 0x8F }, + { IMX_8BIT, 0x3617, 0x2D }, + + GROUPED_PARAMETER_HOLD_DISABLE, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 3280x2464 8M 30fps, vendor provide */ +static struct imx_reg const imx134_8M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* clock setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, + { IMX_8BIT, 0x0391, 0x11 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, /* down scaling 16/16 = 1 */ + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0345, 0x00 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0347, 0x00 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3279 */ + { IMX_8BIT, 0x0349, 0xCF }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2463 */ + { IMX_8BIT, 0x034B, 0x9F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x0C }, /* x_output_size[15:8]: 3280*/ + { IMX_8BIT, 0x034D, 0xD0 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x09 }, /* y_output_size[15:8]:2464 */ + { IMX_8BIT, 0x034F, 0xA0 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x0C }, + { IMX_8BIT, 0x0355, 0xD0 }, + { IMX_8BIT, 0x0356, 0x09 }, + { IMX_8BIT, 0x0357, 0xA0 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x0C }, + { IMX_8BIT, 0x3311, 0xD0 }, + { IMX_8BIT, 0x3312, 0x09 }, + { IMX_8BIT, 0x3313, 0xA0 }, + { IMX_8BIT, 0x331C, 0x01 }, + { IMX_8BIT, 0x331D, 0xAE }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global timing setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration time setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/2 binning 30fps 1640x1232, vendor provide */ +static struct imx_reg const imx134_1640_1232_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* no resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0345, 0x00 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0347, 0x00 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3279 */ + { IMX_8BIT, 0x0349, 0xCF }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2463 */ + { IMX_8BIT, 0x034B, 0x9F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x06 }, /* x_output_size[15:8]:1640 */ + { IMX_8BIT, 0x034D, 0x68 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x04 }, /* y_output_size[15:8]:1232 */ + { IMX_8BIT, 0x034F, 0xD0 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x68 }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0xD0 }, + + { IMX_8BIT, 0x301D, 0x30 }, + + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x68 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0xD0 }, + + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x06 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/4 binning 30fps 820x616, vendor provide */ +static struct imx_reg const imx134_820_616_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x44 }, /* 4x4 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* no resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0345, 0x00 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0347, 0x00 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3279 */ + { IMX_8BIT, 0x0349, 0xCF }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2463 */ + { IMX_8BIT, 0x034B, 0x9F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x03 }, /* x_output_size[15:8]:820 */ + { IMX_8BIT, 0x034D, 0x34 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:616 */ + { IMX_8BIT, 0x034F, 0x68 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x03 }, + { IMX_8BIT, 0x0355, 0x34 }, + { IMX_8BIT, 0x0356, 0x02 }, + { IMX_8BIT, 0x0357, 0x68 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x03 }, + { IMX_8BIT, 0x3311, 0x34 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x68 }, + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/4 binning 30fps 820x552 */ +static struct imx_reg const imx134_820_552_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x44 }, /* 4x4 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* no resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0345, 0x00 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:128 */ + { IMX_8BIT, 0x0347, 0x80 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3280-1 */ + { IMX_8BIT, 0x0349, 0xCF }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2208+128-1 */ + { IMX_8BIT, 0x034B, 0x1F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x03 }, /* x_output_size[15:8]: */ + { IMX_8BIT, 0x034D, 0x34 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:616 */ + { IMX_8BIT, 0x034F, 0x28 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x03 }, + { IMX_8BIT, 0x0355, 0x34 }, + { IMX_8BIT, 0x0356, 0x02 }, + { IMX_8BIT, 0x0357, 0x28 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x03 }, + { IMX_8BIT, 0x3311, 0x34 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x28 }, + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/4 binning 30fps 720x592 */ +static struct imx_reg const imx134_720_592_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x44 }, /* 4x4 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* no resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:200 */ + { IMX_8BIT, 0x0345, 0xC8 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:40 */ + { IMX_8BIT, 0x0347, 0x28 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:2880+200-1 */ + { IMX_8BIT, 0x0349, 0x07 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2368+40-1 */ + { IMX_8BIT, 0x034B, 0x67 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x02 }, /* x_output_size[15:8]: */ + { IMX_8BIT, 0x034D, 0xD0 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:616 */ + { IMX_8BIT, 0x034F, 0x50 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x02 }, + { IMX_8BIT, 0x0355, 0xD0 }, + { IMX_8BIT, 0x0356, 0x02 }, + { IMX_8BIT, 0x0357, 0x50 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x02 }, + { IMX_8BIT, 0x3311, 0xD0 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x50 }, + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +static struct imx_reg const imx134_752_616_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x44 }, /* 4x4 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* no resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:136 */ + { IMX_8BIT, 0x0345, 0x88 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0347, 0x00 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3145+134-1 */ + { IMX_8BIT, 0x0349, 0x47 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2463 */ + { IMX_8BIT, 0x034B, 0x9F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x02 }, /* x_output_size[15:8]: 752*/ + { IMX_8BIT, 0x034D, 0xF0 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:616 */ + { IMX_8BIT, 0x034F, 0x68 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + + { IMX_8BIT, 0x0354, 0x02 }, + { IMX_8BIT, 0x0355, 0xF0 }, + { IMX_8BIT, 0x0356, 0x02 }, + { IMX_8BIT, 0x0357, 0x68 }, + + { IMX_8BIT, 0x301D, 0x30 }, + + { IMX_8BIT, 0x3310, 0x02 }, + { IMX_8BIT, 0x3311, 0xF0 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x68 }, + + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 1424x1168 */ +static struct imx_reg const imx134_1424_1168_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, /* binning */ + { IMX_8BIT, 0x0391, 0x11 }, /* no binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x22 }, /* 34/16=2.125 */ + { IMX_8BIT, 0x4082, 0x00 }, /* ?? */ + { IMX_8BIT, 0x4083, 0x00 }, /* ?? */ + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:136 */ + { IMX_8BIT, 0x0345, 0x80 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:0 */ + { IMX_8BIT, 0x0347, 0x00 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3145+134-1 */ + { IMX_8BIT, 0x0349, 0x51 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2463 */ + { IMX_8BIT, 0x034B, 0xB1 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x05 }, /* x_output_size[15:8]: 1424*/ + { IMX_8BIT, 0x034D, 0x90 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x04 }, /* y_output_size[15:8]:1168 */ + { IMX_8BIT, 0x034F, 0x90 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + + { IMX_8BIT, 0x0354, 0x0B }, + { IMX_8BIT, 0x0355, 0xD2 }, + { IMX_8BIT, 0x0356, 0x09 }, + { IMX_8BIT, 0x0357, 0xB2 }, + + { IMX_8BIT, 0x301D, 0x30 }, + + { IMX_8BIT, 0x3310, 0x05 }, + { IMX_8BIT, 0x3311, 0x90 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0x90 }, + + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + { IMX_8BIT, 0x4084, 0x05 }, + { IMX_8BIT, 0x4085, 0x90 }, + { IMX_8BIT, 0x4086, 0x04 }, + { IMX_8BIT, 0x4087, 0x90 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/4 binning, 16/35 down scaling, 30fps, dvs */ +static struct imx_reg const imx134_240_196_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /*4x4 binning */ + { IMX_8BIT, 0x0391, 0x44 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x23 }, /* down scaling = 16/35 */ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x02 }, /* x_addr_start[15:8]:590 */ + { IMX_8BIT, 0x0345, 0x4E }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:366 */ + { IMX_8BIT, 0x0347, 0x6E }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0A }, /* x_addr_end[15:8]:2104+590-1 */ + { IMX_8BIT, 0x0349, 0x85 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:1720+366-1 */ + { IMX_8BIT, 0x034B, 0x25 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x00 }, /* x_output_size[15:8]: 240*/ + { IMX_8BIT, 0x034D, 0xF0 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x00 }, /* y_output_size[15:8]:196 */ + { IMX_8BIT, 0x034F, 0xC4 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x02 }, /* crop_x: 526 */ + { IMX_8BIT, 0x0355, 0x0E }, + { IMX_8BIT, 0x0356, 0x01 }, /* crop_y: 430 */ + { IMX_8BIT, 0x0357, 0xAE }, + + { IMX_8BIT, 0x301D, 0x30 }, + + { IMX_8BIT, 0x3310, 0x00 }, + { IMX_8BIT, 0x3311, 0xF0 }, + { IMX_8BIT, 0x3312, 0x00 }, + { IMX_8BIT, 0x3313, 0xC4 }, + + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x4C }, + + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0xF0 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0xC4 }, + + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x0A }, + { IMX_8BIT, 0x0203, 0x88 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane, 1/2 binning, 16/38 downscaling, 30fps, dvs */ +static struct imx_reg const imx134_448_366_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* 2x2 binning */ + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x26 }, /* down scaling = 16/38 */ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x02 }, /* x_addr_start[15:8]:590 */ + { IMX_8BIT, 0x0345, 0x4E }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:366 */ + { IMX_8BIT, 0x0347, 0x6E }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0A }, /* x_addr_end[15:8]:2128+590-1 */ + { IMX_8BIT, 0x0349, 0x9D }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:1740+366-1 */ + { IMX_8BIT, 0x034B, 0x39 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x01 }, /* x_output_size[15:8]: 448*/ + { IMX_8BIT, 0x034D, 0xC0 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x01 }, /* y_output_size[15:8]:366 */ + { IMX_8BIT, 0x034F, 0x6E }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x04 }, /* crop_x: 1064 */ + { IMX_8BIT, 0x0355, 0x28 }, + { IMX_8BIT, 0x0356, 0x03 }, /* crop_y: 870 */ + { IMX_8BIT, 0x0357, 0x66 }, + + { IMX_8BIT, 0x301D, 0x30 }, + + { IMX_8BIT, 0x3310, 0x01 }, + { IMX_8BIT, 0x3311, 0xC0 }, + { IMX_8BIT, 0x3312, 0x01 }, + { IMX_8BIT, 0x3313, 0x6E }, + + { IMX_8BIT, 0x331C, 0x02 }, + { IMX_8BIT, 0x331D, 0xD0 }, + + { IMX_8BIT, 0x4084, 0x01 }, + { IMX_8BIT, 0x4085, 0xC0 }, + { IMX_8BIT, 0x4086, 0x01 }, + { IMX_8BIT, 0x4087, 0x6E }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 2336x1312, 30fps, for 1080p dvs, vendor provide */ +static struct imx_reg const imx134_2336_1312_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, /* disable binning */ + { IMX_8BIT, 0x0391, 0x11 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x16 }, /* down scaling = 16/22 = 8/11 */ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:34 */ + { IMX_8BIT, 0x0345, 0x22 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:332 */ + { IMX_8BIT, 0x0347, 0x4C }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3245 */ + { IMX_8BIT, 0x0349, 0xAD }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2135 */ + { IMX_8BIT, 0x034B, 0x57 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x09 }, /* x_output_size[15:8]:2336 */ + { IMX_8BIT, 0x034D, 0x20 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x05 }, /* y_output_size[15:8]:1312 */ + { IMX_8BIT, 0x034F, 0x20 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x0C }, + { IMX_8BIT, 0x0355, 0x8C }, + { IMX_8BIT, 0x0356, 0x07 }, + { IMX_8BIT, 0x0357, 0x0C }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x09 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x05 }, + { IMX_8BIT, 0x3313, 0x20 }, + { IMX_8BIT, 0x331C, 0x03 }, + { IMX_8BIT, 0x331D, 0xEB }, + { IMX_8BIT, 0x4084, 0x09 }, + { IMX_8BIT, 0x4085, 0x20 }, + { IMX_8BIT, 0x4086, 0x05 }, + { IMX_8BIT, 0x4087, 0x20 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 1920x1080, 30fps, for 720p still capture */ +static struct imx_reg const imx134_1936_1096_30fps_v1[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, /* disable binning */ + { IMX_8BIT, 0x0391, 0x11 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x1A }, /* downscaling 16/26*/ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:64 */ + { IMX_8BIT, 0x0345, 0x40 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:340 */ + { IMX_8BIT, 0x0347, 0x54 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3209 */ + { IMX_8BIT, 0x0349, 0x89 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2121 */ + { IMX_8BIT, 0x034B, 0x49 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x07 }, /* x_output_size[15:8]:1936 */ + { IMX_8BIT, 0x034D, 0x90 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x04 }, /* y_output_size[15:8]:1096 */ + { IMX_8BIT, 0x034F, 0x48 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x0C }, /* crop x:3146 */ + { IMX_8BIT, 0x0355, 0x4A }, + { IMX_8BIT, 0x0356, 0x06 }, /* xrop y:1782 */ + { IMX_8BIT, 0x0357, 0xF6 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x07 }, + { IMX_8BIT, 0x3311, 0x80 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0x38 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x1E }, + { IMX_8BIT, 0x4084, 0x07 }, + { IMX_8BIT, 0x4085, 0x80 }, + { IMX_8BIT, 0x4086, 0x04 }, + { IMX_8BIT, 0x4087, 0x38 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 1920x1080, 30fps, for 720p still capture, vendor provide */ +static struct imx_reg const imx134_1936_1096_30fps_v2[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, /* disable binning */ + { IMX_8BIT, 0x0391, 0x11 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x1B }, /* downscaling 16/27*/ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* Optionnal Function setting */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:64 */ + { IMX_8BIT, 0x0345, 0x06 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:340 */ + { IMX_8BIT, 0x0347, 0x34 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3209 */ + { IMX_8BIT, 0x0349, 0xC9 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2121 */ + { IMX_8BIT, 0x034B, 0x6F }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x07 }, /* x_output_size[15:8]:1936 */ + { IMX_8BIT, 0x034D, 0x90 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x04 }, /* y_output_size[15:8]:1096 */ + { IMX_8BIT, 0x034F, 0x48 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x0C }, /* crop x:3146 */ + { IMX_8BIT, 0x0355, 0xC4 }, + { IMX_8BIT, 0x0356, 0x07 }, /* xrop y:1782 */ + { IMX_8BIT, 0x0357, 0x3A }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x07 }, /* decide by mode and output size */ + { IMX_8BIT, 0x3311, 0x90 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0x48 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x1E }, + { IMX_8BIT, 0x4084, 0x07 }, + { IMX_8BIT, 0x4085, 0x90 }, + { IMX_8BIT, 0x4086, 0x04 }, + { IMX_8BIT, 0x4087, 0x48 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Setting */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 1296x736, 30fps, for 720p still capture, vendor provide */ +static struct imx_reg const imx134_1296_736_30fps_v2[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning */ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x14 }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:40 */ + { IMX_8BIT, 0x0345, 0x14 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:332 */ + { IMX_8BIT, 0x0347, 0x38 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3239 */ + { IMX_8BIT, 0x0349, 0xBB }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2131 */ + { IMX_8BIT, 0x034B, 0x67 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x05 }, /* x_output_size[15:8]:1280 */ + { IMX_8BIT, 0x034D, 0x10 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:720 */ + { IMX_8BIT, 0x034F, 0xE0 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x54 }, + { IMX_8BIT, 0x0356, 0x03 }, + { IMX_8BIT, 0x0357, 0x98 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x05 }, + { IMX_8BIT, 0x3311, 0x10 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0xE0 }, + { IMX_8BIT, 0x331C, 0x01 }, + { IMX_8BIT, 0x331D, 0x10 }, + { IMX_8BIT, 0x4084, 0x05 }, + { IMX_8BIT, 0x4085, 0x10 }, + { IMX_8BIT, 0x4086, 0x02 }, + { IMX_8BIT, 0x4087, 0xE0 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +/* 4 lane 1280x720, 30fps, for 720p dvs, vendor provide */ +static struct imx_reg const imx134_1568_880_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xA9 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning*/ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, /* down scaling 16/16 = 1 */ + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:72 */ + { IMX_8BIT, 0x0345, 0x48 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:356 */ + { IMX_8BIT, 0x0347, 0x64 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3207 */ + { IMX_8BIT, 0x0349, 0x87 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2115 */ + { IMX_8BIT, 0x034B, 0x43 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x06 }, /* x_output_size[15:8]:1568 */ + { IMX_8BIT, 0x034D, 0x20 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x03 }, /* y_output_size[15:8]:880 */ + { IMX_8BIT, 0x034F, 0x70 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x20 }, + { IMX_8BIT, 0x0356, 0x03 }, + { IMX_8BIT, 0x0357, 0x70 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x03 }, + { IMX_8BIT, 0x3313, 0x70 }, + { IMX_8BIT, 0x331C, 0x03 }, + { IMX_8BIT, 0x331D, 0xF2 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xAF }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +static struct imx_reg const imx134_1568_876_60fps_0625[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0x8F }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning*/ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, /* down scaling 16/16 = 1 */ + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:72 */ + { IMX_8BIT, 0x0345, 0x48 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:356 */ + { IMX_8BIT, 0x0347, 0x64 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3207 */ + { IMX_8BIT, 0x0349, 0x87 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2115 */ + { IMX_8BIT, 0x034B, 0x3B }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x06 }, /* x_output_size[15:8]:1568 */ + { IMX_8BIT, 0x034D, 0x20 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x03 }, /* y_output_size[15:8]:880 */ + { IMX_8BIT, 0x034F, 0x6C }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x20 }, + { IMX_8BIT, 0x0356, 0x03 }, + { IMX_8BIT, 0x0357, 0x6C }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x03 }, + { IMX_8BIT, 0x3313, 0x6C }, + { IMX_8BIT, 0x331C, 0x03 }, + { IMX_8BIT, 0x331D, 0xF2 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x6F }, + { IMX_8BIT, 0x0831, 0x27 }, + { IMX_8BIT, 0x0832, 0x4F }, + { IMX_8BIT, 0x0833, 0x2F }, + { IMX_8BIT, 0x0834, 0x2F }, + { IMX_8BIT, 0x0835, 0x2F }, + { IMX_8BIT, 0x0836, 0x9F }, + { IMX_8BIT, 0x0837, 0x37 }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + + +/* 4 lane for 720p dvs, vendor provide */ +static struct imx_reg const imx134_1568_880[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xC8 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning*/ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, /* down scaling 16/16 = 1 */ + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:72 */ + { IMX_8BIT, 0x0345, 0x48 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x01 }, /* y_addr_start[15:8]:356 */ + { IMX_8BIT, 0x0347, 0x64 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3207 */ + { IMX_8BIT, 0x0349, 0x87 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x08 }, /* y_addr_end[15:8]:2115 */ + { IMX_8BIT, 0x034B, 0x43 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x06 }, /* x_output_size[15:8]:1568 */ + { IMX_8BIT, 0x034D, 0x20 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x03 }, /* y_output_size[15:8]:880 */ + { IMX_8BIT, 0x034F, 0x70 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x20 }, + { IMX_8BIT, 0x0356, 0x03 }, + { IMX_8BIT, 0x0357, 0x70 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x03 }, + { IMX_8BIT, 0x3313, 0x70 }, + { IMX_8BIT, 0x331C, 0x03 }, + { IMX_8BIT, 0x331D, 0xF2 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x5F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x37 }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xBF }, + { IMX_8BIT, 0x0837, 0x3F }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x09 }, + { IMX_8BIT, 0x0203, 0xD2 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; +/* 4 lane for 480p dvs, default 60fps, vendor provide */ +static struct imx_reg const imx134_880_592[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xC8 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, /* binning*/ + { IMX_8BIT, 0x0391, 0x22 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x1D }, /* downscaling ratio = 16/29 */ + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* x_addr_start[15:8]:44 */ + { IMX_8BIT, 0x0345, 0x2C }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x00 }, /* y_addr_start[15:8]:160 */ + { IMX_8BIT, 0x0347, 0xA0 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0C }, /* x_addr_end[15:8]:3235 */ + { IMX_8BIT, 0x0349, 0xA3 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x09 }, /* y_addr_end[15:8]:2307 */ + { IMX_8BIT, 0x034B, 0x03 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x03 }, /* x_output_size[15:8]:880 */ + { IMX_8BIT, 0x034D, 0x70 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x02 }, /* y_output_size[15:8]:592 */ + { IMX_8BIT, 0x034F, 0x50 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x06 }, + { IMX_8BIT, 0x0355, 0x3C }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0x32 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x03 }, + { IMX_8BIT, 0x3311, 0x70 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x50 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x4C }, + { IMX_8BIT, 0x4084, 0x03 }, + { IMX_8BIT, 0x4085, 0x70 }, + { IMX_8BIT, 0x4086, 0x02 }, + { IMX_8BIT, 0x4087, 0x50 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x5F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x37 }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xBF }, + { IMX_8BIT, 0x0837, 0x3F }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x05 }, + { IMX_8BIT, 0x0203, 0x42 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; +static struct imx_reg const imx134_2336_1308_60fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + /* mode set clear */ + { IMX_8BIT, 0x3A43, 0x01 }, + /* Clock Setting */ + { IMX_8BIT, 0x011E, 0x13 }, + { IMX_8BIT, 0x011F, 0x33 }, + { IMX_8BIT, 0x0301, 0x05 }, + { IMX_8BIT, 0x0303, 0x01 }, + { IMX_8BIT, 0x0305, 0x0C }, + { IMX_8BIT, 0x0309, 0x05 }, + { IMX_8BIT, 0x030B, 0x01 }, + { IMX_8BIT, 0x030C, 0x01 }, + { IMX_8BIT, 0x030D, 0xC8 }, + { IMX_8BIT, 0x030E, 0x01 }, + { IMX_8BIT, 0x3A06, 0x11 }, + + /* Mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, /* binning*/ + { IMX_8BIT, 0x0391, 0x11 }, /* 2x2 binning */ + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, /* H/V resize */ + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, /* down scaling 16/16 = 1 */ + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + + /* OptionnalFunction settig */ + { IMX_8BIT, 0x0700, 0x00 }, + { IMX_8BIT, 0x3A63, 0x00 }, + { IMX_8BIT, 0x4100, 0xF8 }, + { IMX_8BIT, 0x4203, 0xFF }, + { IMX_8BIT, 0x4344, 0x00 }, + { IMX_8BIT, 0x441C, 0x01 }, + + /* Size setting */ + { IMX_8BIT, 0x0344, 0x01 }, /* x_addr_start[15:8]:72 */ + { IMX_8BIT, 0x0345, 0xD8 }, /* x_addr_start[7:0] */ + { IMX_8BIT, 0x0346, 0x02 }, /* y_addr_start[15:8]:356 */ + { IMX_8BIT, 0x0347, 0x44 }, /* y_addr_start[7:0] */ + { IMX_8BIT, 0x0348, 0x0A }, /* x_addr_end[15:8]:3207 */ + { IMX_8BIT, 0x0349, 0xF7 }, /* x_addr_end[7:0] */ + { IMX_8BIT, 0x034A, 0x07 }, /* y_addr_end[15:8]:2107 */ + { IMX_8BIT, 0x034B, 0x5F+4 }, /* y_addr_end[7:0] */ + { IMX_8BIT, 0x034C, 0x09 }, /* x_output_size[15:8]:1568 */ + { IMX_8BIT, 0x034D, 0x20 }, /* x_output_size[7:0] */ + { IMX_8BIT, 0x034E, 0x05 }, /* y_output_size[15:8]:876 */ + { IMX_8BIT, 0x034F, 0x1C+4 }, /* y_output_size[7:0] */ + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x09 }, + { IMX_8BIT, 0x0355, 0x20 }, + { IMX_8BIT, 0x0356, 0x05 }, + { IMX_8BIT, 0x0357, 0x1C+4 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x09 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x05 }, + { IMX_8BIT, 0x3313, 0x1C+4 }, + { IMX_8BIT, 0x331C, 0x03 }, + { IMX_8BIT, 0x331D, 0xE8 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + + /* Global Timing Setting */ + { IMX_8BIT, 0x0830, 0x77 }, + { IMX_8BIT, 0x0831, 0x2F }, + { IMX_8BIT, 0x0832, 0x5F }, + { IMX_8BIT, 0x0833, 0x37 }, + { IMX_8BIT, 0x0834, 0x37 }, + { IMX_8BIT, 0x0835, 0x37 }, + { IMX_8BIT, 0x0836, 0xBF }, + { IMX_8BIT, 0x0837, 0x3F }, + { IMX_8BIT, 0x0839, 0x1F }, + { IMX_8BIT, 0x083A, 0x17 }, + { IMX_8BIT, 0x083B, 0x02 }, + + /* Integration Time Settin */ + { IMX_8BIT, 0x0202, 0x05 }, + { IMX_8BIT, 0x0203, 0x42 }, + + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00 }, + { IMX_8BIT, 0x0231, 0x00 }, + { IMX_8BIT, 0x0233, 0x00 }, + { IMX_8BIT, 0x0234, 0x00 }, + { IMX_8BIT, 0x0235, 0x40 }, + { IMX_8BIT, 0x0238, 0x00 }, + { IMX_8BIT, 0x0239, 0x04 }, + { IMX_8BIT, 0x023B, 0x00 }, + { IMX_8BIT, 0x023C, 0x01 }, + { IMX_8BIT, 0x33B0, 0x04 }, + { IMX_8BIT, 0x33B1, 0x00 }, + { IMX_8BIT, 0x33B3, 0x00 }, + { IMX_8BIT, 0x33B4, 0x01 }, + { IMX_8BIT, 0x3800, 0x00 }, + { IMX_TOK_TERM, 0, 0 } +}; + +struct imx_resolution imx134_res_preview[] = { + { + .desc = "imx134_CIF_30fps", + .regs = imx134_720_592_30fps, + .width = 720, + .height = 592, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + }, + { + .desc = "imx134_820_552_30fps_preview", + .regs = imx134_820_552_30fps, + .width = 820, + .height = 552, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + }, + { + .desc = "imx134_820_616_preview_30fps", + .regs = imx134_820_616_30fps, + .width = 820, + .height = 616, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + }, + { + .desc = "imx134_1080p_preview_30fps", + .regs = imx134_1936_1096_30fps_v2, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, + { + .desc = "imx134_1640_1232_preview_30fps", + .regs = imx134_1640_1232_30fps, + .width = 1640, + .height = 1232, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_8M_preview_30fps", + .regs = imx134_8M_30fps, + .width = 3280, + .height = 2464, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, +}; + +struct imx_resolution imx134_res_still[] = { + { + .desc = "imx134_CIF_30fps", + .regs = imx134_1424_1168_30fps, + .width = 1424, + .height = 1168, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_VGA_still_30fps", + .regs = imx134_1640_1232_30fps, + .width = 1640, + .height = 1232, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_1080p_still_30fps", + .regs = imx134_1936_1096_30fps_v2, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, + { + .desc = "imx134_1640_1232_still_30fps", + .regs = imx134_1640_1232_30fps, + .width = 1640, + .height = 1232, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_8M_still_30fps", + .regs = imx134_8M_30fps, + .width = 3280, + .height = 2464, + .fps_options = { + { + /* WORKAROUND for FW performance limitation */ + .fps = 8, + .pixels_per_line = 6400, + .lines_per_frame = 5312, + }, + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, +}; + +struct imx_resolution imx134_res_video[] = { + { + .desc = "imx134_QCIF_DVS_30fps", + .regs = imx134_240_196_30fps, + .width = 240, + .height = 196, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + }, + { + .desc = "imx134_CIF_DVS_30fps", + .regs = imx134_448_366_30fps, + .width = 448, + .height = 366, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_VGA_30fps", + .regs = imx134_820_616_30fps, + .width = 820, + .height = 616, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + }, + { + .desc = "imx134_480p", + .regs = imx134_880_592, + .width = 880, + .height = 592, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2700, + }, + { + .fps = 60, + .pixels_per_line = 3600, + .lines_per_frame = 1350, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_1568_880", + .regs = imx134_1568_880, + .width = 1568, + .height = 880, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2700, + }, + { + .fps = 60, + .pixels_per_line = 3600, + .lines_per_frame = 1350, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + }, + { + .desc = "imx134_1080p_dvs_30fps", + .regs = imx134_2336_1312_30fps, + .width = 2336, + .height = 1312, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, + { + .desc = "imx134_1080p_dvs_60fps", + .regs = imx134_2336_1308_60fps, + .width = 2336, + .height = 1312, + .fps_options = { + { + .fps = 60, + .pixels_per_line = 3600, + .lines_per_frame = 1350, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, + { + /*This setting only be used for SDV mode*/ + .desc = "imx134_8M_sdv_30fps", + .regs = imx134_8M_30fps, + .width = 3280, + .height = 2464, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 3600, + .lines_per_frame = 2518, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + }, +}; + +#endif + diff --git a/drivers/staging/media/atomisp/i2c/imx/imx135.h b/drivers/staging/media/atomisp/i2c/imx/imx135.h new file mode 100644 index 0000000..58b43af --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx135.h @@ -0,0 +1,3374 @@ +/* + * Support for Sony IMX camera sensor. + * + * Copyright (c) 2010 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __IMX135_H__ +#define __IMX135_H__ + +#include "common.h" + +#define IMX_SC_CMMN_CHIP_ID_H 0x0016 +#define IMX_SC_CMMN_CHIP_ID_L 0x0017 + +/* + * focal length bits definition: + * bits 31-16: numerator, bits 15-0: denominator + */ +#define IMX_FOCAL_LENGTH_DEFAULT 0x1710064 + +/* + * current f-number bits definition: + * bits 31-16: numerator, bits 15-0: denominator + */ +#define IMX_F_NUMBER_DEFAULT 0x16000a + +/* + * f-number range bits definition: + * bits 31-24: max f-number numerator + * bits 23-16: max f-number denominator + * bits 15-8: min f-number numerator + * bits 7-0: min f-number denominator + */ +#define IMX_F_NUMBER_RANGE 0x160a160a + +#define GROUPED_PARAMETER_HOLD_ENABLE {IMX_8BIT, 0x0104, 0x1} +#define GROUPED_PARAMETER_HOLD_DISABLE {IMX_8BIT, 0x0104, 0x0} + +#define IMX135_EMBEDDED_DATA_LINE_NUM 2 +#define IMX135_OUTPUT_DATA_FORMAT_REG 0x0112 +#define IMX135_OUTPUT_FORMAT_RAW10 0x0a0a +/* + * We use three different MIPI rates for our modes based on the resolution and + * FPS requirements. So we have three PLL configurationa and these are based + * on the EMC friendly MIPI values. + * + * Maximum clock: Pix clock @ 360.96MHz MIPI @ 451.2MHz 902.4mbps + * Reduced clock: Pix clock @ 273.00MHz MIPI @ 342.0MHz 684.0mbps + * Binning modes: Pix clock @ 335.36MHz MIPI @ 209.6MHz 419.2mbps + * Global Timing registers are based on the data rates and these are part of + * the below clock definitions. + */ +/* MIPI 499.2MHz 998.4mbps PIXCLK: 399.36MHz */ +#define PLL_SETTINGS_FOR_MIPI_499_2MHZ_SALTBAY \ + {IMX_8BIT, 0x011e, 0x13}, \ + {IMX_8BIT, 0x011f, 0x33}, \ + {IMX_8BIT, 0x0301, 0x05}, \ + {IMX_8BIT, 0x0303, 0x01}, \ + {IMX_8BIT, 0x0305, 0x0c}, \ + {IMX_8BIT, 0x0309, 0x05}, \ + {IMX_8BIT, 0x030b, 0x01}, \ + {IMX_8BIT, 0x030c, 0x02}, \ + {IMX_8BIT, 0x030d, 0x70}, \ + {IMX_8BIT, 0x030e, 0x01}, \ + {IMX_8BIT, 0x3a06, 0x11}, \ + {IMX_8BIT, 0x0830, 0x7f}, \ + {IMX_8BIT, 0x0831, 0x37}, \ + {IMX_8BIT, 0x0832, 0x67}, \ + {IMX_8BIT, 0x0833, 0x3f}, \ + {IMX_8BIT, 0x0834, 0x3f}, \ + {IMX_8BIT, 0x0835, 0x47}, \ + {IMX_8BIT, 0x0836, 0xdf}, \ + {IMX_8BIT, 0x0837, 0x47}, \ + {IMX_8BIT, 0x0839, 0x1f}, \ + {IMX_8BIT, 0x083a, 0x17}, \ + {IMX_8BIT, 0x083b, 0x02} + +/* MIPI 451.2MHz 902.4mbps PIXCLK: 360.96MHz */ +#define PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY \ + {IMX_8BIT, 0x011e, 0x13}, \ + {IMX_8BIT, 0x011f, 0x33}, \ + {IMX_8BIT, 0x0301, 0x05}, \ + {IMX_8BIT, 0x0303, 0x01}, \ + {IMX_8BIT, 0x0305, 0x0c}, \ + {IMX_8BIT, 0x0309, 0x05}, \ + {IMX_8BIT, 0x030b, 0x01}, \ + {IMX_8BIT, 0x030c, 0x02}, \ + {IMX_8BIT, 0x030d, 0x34}, \ + {IMX_8BIT, 0x030e, 0x01}, \ + {IMX_8BIT, 0x3a06, 0x11}, \ + {IMX_8BIT, 0x0830, 0x7f}, \ + {IMX_8BIT, 0x0831, 0x37}, \ + {IMX_8BIT, 0x0832, 0x67}, \ + {IMX_8BIT, 0x0833, 0x3f}, \ + {IMX_8BIT, 0x0834, 0x3f}, \ + {IMX_8BIT, 0x0835, 0x47}, \ + {IMX_8BIT, 0x0836, 0xdf}, \ + {IMX_8BIT, 0x0837, 0x47}, \ + {IMX_8BIT, 0x0839, 0x1f}, \ + {IMX_8BIT, 0x083a, 0x17}, \ + {IMX_8BIT, 0x083b, 0x02} + +/* MIPI 209.6MHz, 419.2mbps PIXCLK: 335.36 MHz */ +#define PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY \ + {IMX_8BIT, 0x011e, 0x13}, \ + {IMX_8BIT, 0x011f, 0x33}, \ + {IMX_8BIT, 0x0301, 0x05}, \ + {IMX_8BIT, 0x0303, 0x01}, \ + {IMX_8BIT, 0x0305, 0x06}, \ + {IMX_8BIT, 0x0309, 0x05}, \ + {IMX_8BIT, 0x030b, 0x02}, \ + {IMX_8BIT, 0x030c, 0x01}, \ + {IMX_8BIT, 0x030d, 0x06}, \ + {IMX_8BIT, 0x030e, 0x01}, \ + {IMX_8BIT, 0x3a06, 0x12}, \ + {IMX_8BIT, 0x0830, 0x5f}, \ + {IMX_8BIT, 0x0831, 0x1f}, \ + {IMX_8BIT, 0x0832, 0x3f}, \ + {IMX_8BIT, 0x0833, 0x1f}, \ + {IMX_8BIT, 0x0834, 0x1f}, \ + {IMX_8BIT, 0x0835, 0x17}, \ + {IMX_8BIT, 0x0836, 0x67}, \ + {IMX_8BIT, 0x0837, 0x27}, \ + {IMX_8BIT, 0x0839, 0x1f}, \ + {IMX_8BIT, 0x083a, 0x17}, \ + {IMX_8BIT, 0x083b, 0x02} + +/* MIPI 342MHz 684mbps PIXCLK: 273.6MHz */ +#define PLL_SETTINGS_FOR_MIPI_342MHZ_SALTBAY \ + {IMX_8BIT, 0x011e, 0x13}, \ + {IMX_8BIT, 0x011f, 0x33}, \ + {IMX_8BIT, 0x0301, 0x05}, \ + {IMX_8BIT, 0x0303, 0x01}, \ + {IMX_8BIT, 0x0305, 0x08}, \ + {IMX_8BIT, 0x0309, 0x05}, \ + {IMX_8BIT, 0x030b, 0x01}, \ + {IMX_8BIT, 0x030c, 0x01}, \ + {IMX_8BIT, 0x030d, 0x1d}, \ + {IMX_8BIT, 0x030e, 0x01}, \ + {IMX_8BIT, 0x3a06, 0x11}, \ + {IMX_8BIT, 0x0830, 0x77}, \ + {IMX_8BIT, 0x0831, 0x2f}, \ + {IMX_8BIT, 0x0832, 0x4f}, \ + {IMX_8BIT, 0x0833, 0x37}, \ + {IMX_8BIT, 0x0834, 0x2f}, \ + {IMX_8BIT, 0x0835, 0x37}, \ + {IMX_8BIT, 0x0836, 0xa7}, \ + {IMX_8BIT, 0x0837, 0x37}, \ + {IMX_8BIT, 0x0839, 0x1f}, \ + {IMX_8BIT, 0x083a, 0x17}, \ + {IMX_8BIT, 0x083b, 0x02} + +/* Basic settings: Applied only once after the sensor power up */ +static struct imx_reg const imx135_init_settings[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + { IMX_8BIT, 0x0220, 0x01}, + { IMX_8BIT, 0x3008, 0xB0}, + { IMX_8BIT, 0x320A, 0x01}, + { IMX_8BIT, 0x320D, 0x10}, + { IMX_8BIT, 0x3216, 0x2E}, + { IMX_8BIT, 0x3230, 0x0A}, + { IMX_8BIT, 0x3228, 0x05}, + { IMX_8BIT, 0x3229, 0x02}, + { IMX_8BIT, 0x322C, 0x02}, + { IMX_8BIT, 0x3302, 0x10}, + { IMX_8BIT, 0x3390, 0x45}, + { IMX_8BIT, 0x3409, 0x0C}, + { IMX_8BIT, 0x340B, 0xF5}, + { IMX_8BIT, 0x340C, 0x2D}, + { IMX_8BIT, 0x3412, 0x41}, + { IMX_8BIT, 0x3413, 0xAD}, + { IMX_8BIT, 0x3414, 0x1E}, + { IMX_8BIT, 0x3427, 0x04}, + { IMX_8BIT, 0x3480, 0x1E}, + { IMX_8BIT, 0x3484, 0x1E}, + { IMX_8BIT, 0x3488, 0x1E}, + { IMX_8BIT, 0x348C, 0x1E}, + { IMX_8BIT, 0x3490, 0x1E}, + { IMX_8BIT, 0x3494, 0x1E}, + { IMX_8BIT, 0x349C, 0x38}, + { IMX_8BIT, 0x34A3, 0x38}, + { IMX_8BIT, 0x3511, 0x8F}, + { IMX_8BIT, 0x3518, 0x00}, + { IMX_8BIT, 0x3519, 0x94}, + { IMX_8BIT, 0x3833, 0x20}, + { IMX_8BIT, 0x3893, 0x01}, + { IMX_8BIT, 0x38C2, 0x08}, + { IMX_8BIT, 0x38C3, 0x08}, + { IMX_8BIT, 0x3C09, 0x01}, + { IMX_8BIT, 0x4000, 0x0E}, + { IMX_8BIT, 0x4300, 0x00}, + { IMX_8BIT, 0x4316, 0x12}, + { IMX_8BIT, 0x4317, 0x22}, + { IMX_8BIT, 0x4318, 0x00}, + { IMX_8BIT, 0x4319, 0x00}, + { IMX_8BIT, 0x431A, 0x00}, + { IMX_8BIT, 0x4324, 0x03}, + { IMX_8BIT, 0x4325, 0x20}, + { IMX_8BIT, 0x4326, 0x03}, + { IMX_8BIT, 0x4327, 0x84}, + { IMX_8BIT, 0x4328, 0x03}, + { IMX_8BIT, 0x4329, 0x20}, + { IMX_8BIT, 0x432A, 0x03}, + { IMX_8BIT, 0x432B, 0x84}, + { IMX_8BIT, 0x432C, 0x01}, + { IMX_8BIT, 0x4401, 0x3F}, + { IMX_8BIT, 0x4402, 0xFF}, + { IMX_8BIT, 0x4412, 0x3F}, + { IMX_8BIT, 0x4413, 0xFF}, + { IMX_8BIT, 0x441D, 0x28}, + { IMX_8BIT, 0x4444, 0x00}, + { IMX_8BIT, 0x4445, 0x00}, + { IMX_8BIT, 0x4446, 0x3F}, + { IMX_8BIT, 0x4447, 0xFF}, + { IMX_8BIT, 0x4452, 0x00}, + { IMX_8BIT, 0x4453, 0xA0}, + { IMX_8BIT, 0x4454, 0x08}, + { IMX_8BIT, 0x4455, 0x00}, + { IMX_8BIT, 0x4458, 0x18}, + { IMX_8BIT, 0x4459, 0x18}, + { IMX_8BIT, 0x445A, 0x3F}, + { IMX_8BIT, 0x445B, 0x3A}, + { IMX_8BIT, 0x4462, 0x00}, + { IMX_8BIT, 0x4463, 0x00}, + { IMX_8BIT, 0x4464, 0x00}, + { IMX_8BIT, 0x4465, 0x00}, + { IMX_8BIT, 0x446E, 0x01}, + { IMX_8BIT, 0x4500, 0x1F}, + { IMX_8BIT, 0x600a, 0x00}, + { IMX_8BIT, 0x380a, 0x00}, + { IMX_8BIT, 0x380b, 0x00}, + { IMX_8BIT, 0x4103, 0x00}, + { IMX_8BIT, 0x4243, 0x9a}, + { IMX_8BIT, 0x4330, 0x01}, + { IMX_8BIT, 0x4331, 0x90}, + { IMX_8BIT, 0x4332, 0x02}, + { IMX_8BIT, 0x4333, 0x58}, + { IMX_8BIT, 0x4334, 0x03}, + { IMX_8BIT, 0x4335, 0x20}, + { IMX_8BIT, 0x4336, 0x03}, + { IMX_8BIT, 0x4337, 0x84}, + { IMX_8BIT, 0x433C, 0x01}, + { IMX_8BIT, 0x4340, 0x02}, + { IMX_8BIT, 0x4341, 0x58}, + { IMX_8BIT, 0x4342, 0x03}, + { IMX_8BIT, 0x4343, 0x52}, + { IMX_8BIT, 0x4364, 0x0b}, + { IMX_8BIT, 0x4368, 0x00}, + { IMX_8BIT, 0x4369, 0x0f}, + { IMX_8BIT, 0x436a, 0x03}, + { IMX_8BIT, 0x436b, 0xa8}, + { IMX_8BIT, 0x436c, 0x00}, + { IMX_8BIT, 0x436d, 0x00}, + { IMX_8BIT, 0x436e, 0x00}, + { IMX_8BIT, 0x436f, 0x06}, + { IMX_8BIT, 0x4281, 0x21}, + { IMX_8BIT, 0x4282, 0x18}, + { IMX_8BIT, 0x4283, 0x04}, + { IMX_8BIT, 0x4284, 0x08}, + { IMX_8BIT, 0x4287, 0x7f}, + { IMX_8BIT, 0x4288, 0x08}, + { IMX_8BIT, 0x428c, 0x08}, + { IMX_8BIT, 0x4297, 0x00}, + { IMX_8BIT, 0x4299, 0x7E}, + { IMX_8BIT, 0x42A4, 0xFB}, + { IMX_8BIT, 0x42A5, 0x7E}, + { IMX_8BIT, 0x42A6, 0xDF}, + { IMX_8BIT, 0x42A7, 0xB7}, + { IMX_8BIT, 0x42AF, 0x03}, + { IMX_8BIT, 0x4207, 0x03}, + { IMX_8BIT, 0x4218, 0x00}, + { IMX_8BIT, 0x421B, 0x20}, + { IMX_8BIT, 0x421F, 0x04}, + { IMX_8BIT, 0x4222, 0x02}, + { IMX_8BIT, 0x4223, 0x22}, + { IMX_8BIT, 0x422E, 0x54}, + { IMX_8BIT, 0x422F, 0xFB}, + { IMX_8BIT, 0x4230, 0xFF}, + { IMX_8BIT, 0x4231, 0xFE}, + { IMX_8BIT, 0x4232, 0xFF}, + { IMX_8BIT, 0x4235, 0x58}, + { IMX_8BIT, 0x4236, 0xF7}, + { IMX_8BIT, 0x4237, 0xFD}, + { IMX_8BIT, 0x4239, 0x4E}, + { IMX_8BIT, 0x423A, 0xFC}, + { IMX_8BIT, 0x423B, 0xFD}, + { IMX_8BIT, 0x4300, 0x00}, + { IMX_8BIT, 0x4316, 0x12}, + { IMX_8BIT, 0x4317, 0x22}, + { IMX_8BIT, 0x4318, 0x00}, + { IMX_8BIT, 0x4319, 0x00}, + { IMX_8BIT, 0x431A, 0x00}, + { IMX_8BIT, 0x4324, 0x03}, + { IMX_8BIT, 0x4325, 0x20}, + { IMX_8BIT, 0x4326, 0x03}, + { IMX_8BIT, 0x4327, 0x84}, + { IMX_8BIT, 0x4328, 0x03}, + { IMX_8BIT, 0x4329, 0x20}, + { IMX_8BIT, 0x432A, 0x03}, + { IMX_8BIT, 0x432B, 0x20}, + { IMX_8BIT, 0x432C, 0x01}, + { IMX_8BIT, 0x432D, 0x01}, + { IMX_8BIT, 0x4338, 0x02}, + { IMX_8BIT, 0x4339, 0x00}, + { IMX_8BIT, 0x433A, 0x00}, + { IMX_8BIT, 0x433B, 0x02}, + { IMX_8BIT, 0x435A, 0x03}, + { IMX_8BIT, 0x435B, 0x84}, + { IMX_8BIT, 0x435E, 0x01}, + { IMX_8BIT, 0x435F, 0xFF}, + { IMX_8BIT, 0x4360, 0x01}, + { IMX_8BIT, 0x4361, 0xF4}, + { IMX_8BIT, 0x4362, 0x03}, + { IMX_8BIT, 0x4363, 0x84}, + { IMX_8BIT, 0x437B, 0x01}, + { IMX_8BIT, 0x4400, 0x00}, /* STATS off ISP do not support STATS*/ + { IMX_8BIT, 0x4401, 0x3F}, + { IMX_8BIT, 0x4402, 0xFF}, + { IMX_8BIT, 0x4404, 0x13}, + { IMX_8BIT, 0x4405, 0x26}, + { IMX_8BIT, 0x4406, 0x07}, + { IMX_8BIT, 0x4408, 0x20}, + { IMX_8BIT, 0x4409, 0xE5}, + { IMX_8BIT, 0x440A, 0xFB}, + { IMX_8BIT, 0x440C, 0xF6}, + { IMX_8BIT, 0x440D, 0xEA}, + { IMX_8BIT, 0x440E, 0x20}, + { IMX_8BIT, 0x4410, 0x00}, + { IMX_8BIT, 0x4411, 0x00}, + { IMX_8BIT, 0x4412, 0x3F}, + { IMX_8BIT, 0x4413, 0xFF}, + { IMX_8BIT, 0x4414, 0x1F}, + { IMX_8BIT, 0x4415, 0xFF}, + { IMX_8BIT, 0x4416, 0x20}, + { IMX_8BIT, 0x4417, 0x00}, + { IMX_8BIT, 0x4418, 0x1F}, + { IMX_8BIT, 0x4419, 0xFF}, + { IMX_8BIT, 0x441A, 0x20}, + { IMX_8BIT, 0x441B, 0x00}, + { IMX_8BIT, 0x441D, 0x40}, + { IMX_8BIT, 0x441E, 0x1E}, + { IMX_8BIT, 0x441F, 0x38}, + { IMX_8BIT, 0x4420, 0x01}, + { IMX_8BIT, 0x4444, 0x00}, + { IMX_8BIT, 0x4445, 0x00}, + { IMX_8BIT, 0x4446, 0x1D}, + { IMX_8BIT, 0x4447, 0xF9}, + { IMX_8BIT, 0x4452, 0x00}, + { IMX_8BIT, 0x4453, 0xA0}, + { IMX_8BIT, 0x4454, 0x08}, + { IMX_8BIT, 0x4455, 0x00}, + { IMX_8BIT, 0x4456, 0x0F}, + { IMX_8BIT, 0x4457, 0xFF}, + { IMX_8BIT, 0x4458, 0x18}, + { IMX_8BIT, 0x4459, 0x18}, + { IMX_8BIT, 0x445A, 0x3F}, + { IMX_8BIT, 0x445B, 0x3A}, + { IMX_8BIT, 0x445C, 0x00}, + { IMX_8BIT, 0x445D, 0x28}, + { IMX_8BIT, 0x445E, 0x01}, + { IMX_8BIT, 0x445F, 0x90}, + { IMX_8BIT, 0x4460, 0x00}, + { IMX_8BIT, 0x4461, 0x60}, + { IMX_8BIT, 0x4462, 0x00}, + { IMX_8BIT, 0x4463, 0x00}, + { IMX_8BIT, 0x4464, 0x00}, + { IMX_8BIT, 0x4465, 0x00}, + { IMX_8BIT, 0x446C, 0x00}, + { IMX_8BIT, 0x446D, 0x00}, + { IMX_8BIT, 0x446E, 0x00}, + { IMX_8BIT, 0x452A, 0x02}, + { IMX_8BIT, 0x0712, 0x01}, + { IMX_8BIT, 0x0713, 0x00}, + { IMX_8BIT, 0x0714, 0x01}, + { IMX_8BIT, 0x0715, 0x00}, + { IMX_8BIT, 0x0716, 0x01}, + { IMX_8BIT, 0x0717, 0x00}, + { IMX_8BIT, 0x0718, 0x01}, + { IMX_8BIT, 0x0719, 0x00}, + { IMX_8BIT, 0x4500, 0x1F }, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + { IMX_8BIT, 0x0205, 0x00}, + { IMX_8BIT, 0x020E, 0x01}, + { IMX_8BIT, 0x020F, 0x00}, + { IMX_8BIT, 0x0210, 0x02}, + { IMX_8BIT, 0x0211, 0x00}, + { IMX_8BIT, 0x0212, 0x02}, + { IMX_8BIT, 0x0213, 0x00}, + { IMX_8BIT, 0x0214, 0x01}, + { IMX_8BIT, 0x0215, 0x00}, + /* HDR Setting */ + { IMX_8BIT, 0x0230, 0x00}, + { IMX_8BIT, 0x0231, 0x00}, + { IMX_8BIT, 0x0233, 0x00}, + { IMX_8BIT, 0x0234, 0x00}, + { IMX_8BIT, 0x0235, 0x40}, + { IMX_8BIT, 0x0238, 0x00}, + { IMX_8BIT, 0x0239, 0x04}, + { IMX_8BIT, 0x023B, 0x00}, + { IMX_8BIT, 0x023C, 0x01}, + { IMX_8BIT, 0x33B0, 0x04}, + { IMX_8BIT, 0x33B1, 0x00}, + { IMX_8BIT, 0x33B3, 0x00}, + { IMX_8BIT, 0x33B4, 0x01}, + { IMX_8BIT, 0x3800, 0x00}, + GROUPED_PARAMETER_HOLD_DISABLE, + { IMX_TOK_TERM, 0, 0} +}; + +/********* Preview, continuous capture and still modes *****************/ + +static struct imx_reg const imx135_13m[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size Setting */ + {IMX_8BIT, 0x0344, 0x00}, /* 0, 0, 4207,3119 4208x3120 */ + {IMX_8BIT, 0x0345, 0x00}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x00}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x6F}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x2F}, + {IMX_8BIT, 0x034C, 0x10}, + {IMX_8BIT, 0x034D, 0x70}, + {IMX_8BIT, 0x034E, 0x0C}, + {IMX_8BIT, 0x034F, 0x30}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, /* 4208x3120 */ + {IMX_8BIT, 0x0355, 0x70}, + {IMX_8BIT, 0x0356, 0x0C}, + {IMX_8BIT, 0x0357, 0x30}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x10}, + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x0C}, + {IMX_8BIT, 0x3313, 0x30}, + {IMX_8BIT, 0x331C, 0x00}, + {IMX_8BIT, 0x331D, 0x10}, + {IMX_8BIT, 0x4084, 0x00}, /* If scaling, Fill this */ + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +/* 13MP reduced pixel clock MIPI 342MHz is EMC friendly*/ +static struct imx_reg const imx135_13m_for_mipi_342[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_342MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size Setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x00}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x00}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x6F}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x2F}, + {IMX_8BIT, 0x034C, 0x10}, + {IMX_8BIT, 0x034D, 0x70}, + {IMX_8BIT, 0x034E, 0x0C}, + {IMX_8BIT, 0x034F, 0x30}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, + {IMX_8BIT, 0x0355, 0x70}, + {IMX_8BIT, 0x0356, 0x0C}, + {IMX_8BIT, 0x0357, 0x30}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x10}, + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x0C}, + {IMX_8BIT, 0x3313, 0x30}, + {IMX_8BIT, 0x331C, 0x00}, + {IMX_8BIT, 0x331D, 0x10}, + {IMX_8BIT, 0x4084, 0x00}, /* If scaling, Fill this */ + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_10m[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, /* 0, 376, 4207, 2743 */ + {IMX_8BIT, 0x0345, 0x00}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x78}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x6f}, + {IMX_8BIT, 0x034A, 0x0a}, + {IMX_8BIT, 0x034B, 0xb7}, + {IMX_8BIT, 0x034C, 0x10}, /* 4208x2368 */ + {IMX_8BIT, 0x034D, 0x70}, + {IMX_8BIT, 0x034E, 0x09}, + {IMX_8BIT, 0x034F, 0x40}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, + {IMX_8BIT, 0x0355, 0x70}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0x40}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x10}, + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x09}, + {IMX_8BIT, 0x3313, 0x40}, + {IMX_8BIT, 0x331C, 0x01}, + {IMX_8BIT, 0x331D, 0x68}, + {IMX_8BIT, 0x4084, 0x00}, + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_10m_for_mipi_342[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_342MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, /* 0, 376, 4207, 2743 */ + {IMX_8BIT, 0x0345, 0x00}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x78}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x6f}, + {IMX_8BIT, 0x034A, 0x0a}, + {IMX_8BIT, 0x034B, 0xb7}, + {IMX_8BIT, 0x034C, 0x10}, /* 4208x2368 */ + {IMX_8BIT, 0x034D, 0x70}, + {IMX_8BIT, 0x034E, 0x09}, + {IMX_8BIT, 0x034F, 0x40}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, + {IMX_8BIT, 0x0355, 0x70}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0x40}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x10}, + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x09}, + {IMX_8BIT, 0x3313, 0x40}, + {IMX_8BIT, 0x331C, 0x01}, + {IMX_8BIT, 0x331D, 0x68}, + {IMX_8BIT, 0x4084, 0x00}, + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * It is 8.5 DS from (3:2)8m cropped setting. + * + * The 8m(3:2) cropped setting is 2992x2448 effective res. + * The ISP effect cropped setting should be 1408x1152 effect res. + * + * Consider ISP 16x16 padding: + * sensor outputs 368x304 + * cropped region is 3128x2584 + */ +static struct imx_reg const imx135_368x304_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, /* no binning */ + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* resize */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x88}, /* 136/16=8.5 */ + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x02}, /* X_ADD_STA */ + {IMX_8BIT, 0x0345, 0x1C}, /* 540 */ + {IMX_8BIT, 0x0346, 0x01}, /* Y_ADD_STA */ + {IMX_8BIT, 0x0347, 0x0C}, /* 268 */ + {IMX_8BIT, 0x0348, 0x0E}, /* X_ADD_END */ + {IMX_8BIT, 0x0349, 0x53}, /* 3667 */ + {IMX_8BIT, 0x034A, 0x0B}, /* Y_ADD_END */ + {IMX_8BIT, 0x034B, 0x23}, /* 2851 */ + {IMX_8BIT, 0x034C, 0x01}, /* X_OUT_SIZE */ + {IMX_8BIT, 0x034D, 0x70}, /* 368 */ + {IMX_8BIT, 0x034E, 0x01}, /* Y_OUT_SIZE */ + {IMX_8BIT, 0x034F, 0x30}, /* 304 */ + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x0C}, /* Cut out siz same as the size after crop */ + {IMX_8BIT, 0x0355, 0x38}, + {IMX_8BIT, 0x0356, 0x0A}, + {IMX_8BIT, 0x0357, 0x18}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x01}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x01}, + {IMX_8BIT, 0x3313, 0x30}, + {IMX_8BIT, 0x331C, 0x02}, /* ?? */ + {IMX_8BIT, 0x331D, 0xD0}, + {IMX_8BIT, 0x4084, 0x01}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x70}, + {IMX_8BIT, 0x4086, 0x01}, + {IMX_8BIT, 0x4087, 0x30}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * It is 1/4 binning from 8m cropped setting. + * + * The 8m cropped setting is 3264x2448 effective res. + * The xga cropped setting should be 816x612 effect res. + * + * Consider ISP 16x16 padding: + * sensor outputs 832x628 + * cropped region is 3328x2512 + */ +static struct imx_reg const imx135_xga_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, + {IMX_8BIT, 0x0391, 0x44}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, +/* {IMX_8BIT, 0x4203, 0xFF}, */ + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, /* X_ADD_STA */ + {IMX_8BIT, 0x0345, 0xB8}, /* 440 */ + {IMX_8BIT, 0x0346, 0x01}, /* Y_ADD_STA */ + {IMX_8BIT, 0x0347, 0x30}, /* 304 */ + {IMX_8BIT, 0x0348, 0x0E}, /* X_ADD_END */ + {IMX_8BIT, 0x0349, 0xB7}, /* 4207-440=3767 */ + {IMX_8BIT, 0x034A, 0x0A}, /* Y_ADD_END */ + {IMX_8BIT, 0x034B, 0xFF}, /* 3119-304=2815 */ + {IMX_8BIT, 0x034C, 0x03}, /* X_OUT_SIZE */ + {IMX_8BIT, 0x034D, 0x40}, /* 832 */ + {IMX_8BIT, 0x034E, 0x02}, /* Y_OUT_SIZE */ + {IMX_8BIT, 0x034F, 0x74}, /* 628 */ + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x03}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0x40}, + {IMX_8BIT, 0x0356, 0x02}, + {IMX_8BIT, 0x0357, 0x74}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x03}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0x40}, + {IMX_8BIT, 0x3312, 0x02}, + {IMX_8BIT, 0x3313, 0x74}, + {IMX_8BIT, 0x331C, 0x02}, /* ?? */ + {IMX_8BIT, 0x331D, 0x21}, + {IMX_8BIT, 0x4084, 0x03}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x40}, + {IMX_8BIT, 0x4086, 0x02}, + {IMX_8BIT, 0x4087, 0x74}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * It is 28/16 DS from (16:9)8m cropped setting. + * + * The 8m(16:9) cropped setting is 3360x1890 effective res. + * - this is larger then the expected 3264x1836 FOV + * + * Consider ISP 16x16 padding: + * sensor outputs 1936x1096 + * cropped region is 3388x1918 + */ +static struct imx_reg const imx135_1936x1096_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, /* no binning */ + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* resize */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x1C}, /* 28/16 */ + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, /* X_ADD_STA */ + {IMX_8BIT, 0x0345, 0x9A}, /* 410 */ + {IMX_8BIT, 0x0346, 0x02}, /* Y_ADD_STA */ + {IMX_8BIT, 0x0347, 0x58}, /* 600 */ + {IMX_8BIT, 0x0348, 0x0E}, /* X_ADD_END */ + {IMX_8BIT, 0x0349, 0xD5}, /* 3797 */ + {IMX_8BIT, 0x034A, 0x09}, /* Y_ADD_END */ + {IMX_8BIT, 0x034B, 0xD5}, /* 2517 */ + {IMX_8BIT, 0x034C, 0x07}, /* X_OUT_SIZE */ + {IMX_8BIT, 0x034D, 0x90}, /* 1936 */ + {IMX_8BIT, 0x034E, 0x04}, /* Y_OUT_SIZE */ + {IMX_8BIT, 0x034F, 0x48}, /* 1096 */ + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x0D}, /* Cut out siz same as the size after crop */ + {IMX_8BIT, 0x0355, 0x3C}, + {IMX_8BIT, 0x0356, 0x07}, + {IMX_8BIT, 0x0357, 0x7E}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x07}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0x90}, + {IMX_8BIT, 0x3312, 0x04}, + {IMX_8BIT, 0x3313, 0x48}, + {IMX_8BIT, 0x331C, 0x00}, /* ?? */ + {IMX_8BIT, 0x331D, 0xAA}, + {IMX_8BIT, 0x4084, 0x07}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x90}, + {IMX_8BIT, 0x4086, 0x04}, + {IMX_8BIT, 0x4087, 0x48}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * It is 2.125 DS from (3:2)8m cropped setting. + * + * The 8m(3:2) cropped setting is 2992x2448 effective res. + * The ISP effect cropped setting should be 1408x1152 effect res. + * + * Consider ISP 16x16 padding: + * sensor outputs 1424x1168 + * cropped region is 3026x2482 + */ +static struct imx_reg const imx135_1424x1168_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, /* no binning */ + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* resize */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x22}, /* 34/16=2.125 */ + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x02}, /* X_ADD_STA */ + {IMX_8BIT, 0x0345, 0x4E}, /* 590 */ + {IMX_8BIT, 0x0346, 0x01}, /* Y_ADD_STA */ + {IMX_8BIT, 0x0347, 0x3E}, /* 318 */ + {IMX_8BIT, 0x0348, 0x0E}, /* X_ADD_END */ + {IMX_8BIT, 0x0349, 0x1F}, /* 3615 */ + {IMX_8BIT, 0x034A, 0x0A}, /* Y_ADD_END */ + {IMX_8BIT, 0x034B, 0xEF}, /* 2799 */ + {IMX_8BIT, 0x034C, 0x05}, /* X_OUT_SIZE */ + {IMX_8BIT, 0x034D, 0x90}, /* 1424 */ + {IMX_8BIT, 0x034E, 0x04}, /* Y_OUT_SIZE */ + {IMX_8BIT, 0x034F, 0x90}, /* 1168 */ + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x0B}, /* Cut out siz same as the size after crop */ + {IMX_8BIT, 0x0355, 0xD2}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0xB2}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x05}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0x90}, + {IMX_8BIT, 0x3312, 0x04}, + {IMX_8BIT, 0x3313, 0x90}, + {IMX_8BIT, 0x331C, 0x00}, /* ?? */ + {IMX_8BIT, 0x331D, 0xAA}, + {IMX_8BIT, 0x4084, 0x05}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x90}, + {IMX_8BIT, 0x4086, 0x04}, + {IMX_8BIT, 0x4087, 0x90}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * It is 1/2 binning from 8m cropped setting. + * + * The 8m cropped setting is 3264x2448 effective res. + * The 2m cropped setting should be 1632x1224 effect res. + * + * Consider ISP 16x16 padding: + * sensor outputs 1648x1240 + * cropped region is 3296x2480 + */ +static struct imx_reg const imx135_2m_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, + {IMX_8BIT, 0x0391, 0x22}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, /* X_ADD_STA */ + {IMX_8BIT, 0x0345, 0xC8}, /* 464(1D0) -> 456(1C8)*/ + {IMX_8BIT, 0x0346, 0x01}, /* Y_ADD_STA */ + {IMX_8BIT, 0x0347, 0x40}, /* 320 */ + {IMX_8BIT, 0x0348, 0x0E}, /* X_ADD_END */ + {IMX_8BIT, 0x0349, 0xA7}, /* 4207-456=3751 */ + {IMX_8BIT, 0x034A, 0x0A}, /* Y_ADD_END */ + {IMX_8BIT, 0x034B, 0xEF}, /* 3119-320=2799 */ + {IMX_8BIT, 0x034C, 0x06}, /* X_OUT_SIZE */ + {IMX_8BIT, 0x034D, 0x70}, /* 1648 */ + {IMX_8BIT, 0x034E, 0x04}, /* Y_OUT_SIZE */ + {IMX_8BIT, 0x034F, 0xD8}, /* 1240 */ + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x06}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0x70}, + {IMX_8BIT, 0x0356, 0x04}, + {IMX_8BIT, 0x0357, 0xD8}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x06}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0x70}, + {IMX_8BIT, 0x3312, 0x04}, + {IMX_8BIT, 0x3313, 0xD8}, + {IMX_8BIT, 0x331C, 0x00}, /* ?? */ + {IMX_8BIT, 0x331D, 0xAA}, + {IMX_8BIT, 0x4084, 0x00}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * 8M Cropped 16:9 setting + * + * Effect res: 3264x1836 + * Sensor out: 3280x1852 + */ +static struct imx_reg const imx135_6m_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0xD0}, + {IMX_8BIT, 0x0346, 0x02}, /* 634 */ + {IMX_8BIT, 0x0347, 0x7A}, + {IMX_8BIT, 0x0348, 0x0E}, + {IMX_8BIT, 0x0349, 0x9F}, + {IMX_8BIT, 0x034A, 0x09}, /* 2485 */ + {IMX_8BIT, 0x034B, 0xB5}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x07}, /* 1852 */ + {IMX_8BIT, 0x034F, 0x3C}, + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x0C}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0xD0}, + {IMX_8BIT, 0x0356, 0x07}, + {IMX_8BIT, 0x0357, 0x3C}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x0C}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x07}, + {IMX_8BIT, 0x3313, 0x3C}, + {IMX_8BIT, 0x331C, 0x00}, /* ?? */ + {IMX_8BIT, 0x331D, 0x10}, + {IMX_8BIT, 0x4084, 0x00}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_8m_cropped[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0xD0}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x48}, + {IMX_8BIT, 0x0348, 0x0E}, + {IMX_8BIT, 0x0349, 0x9F}, + {IMX_8BIT, 0x034A, 0x0A}, + {IMX_8BIT, 0x034B, 0xE7}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x09}, /* 2464 */ + {IMX_8BIT, 0x034F, 0xA0}, + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x0C}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0xD0}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0xA0}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x0C}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x09}, + {IMX_8BIT, 0x3313, 0xA0}, + {IMX_8BIT, 0x331C, 0x00}, /* ?? */ + {IMX_8BIT, 0x331D, 0x10}, + {IMX_8BIT, 0x4084, 0x00}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_8m_scaled_from_12m[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* Scaling */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x14}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x36}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x14}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x39}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x1B}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280x2464 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x09}, + {IMX_8BIT, 0x034F, 0xA0}, + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0x04}, + {IMX_8BIT, 0x0356, 0x0C}, + {IMX_8BIT, 0x0357, 0x08}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x0C}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x09}, + {IMX_8BIT, 0x3313, 0xA0}, + {IMX_8BIT, 0x331C, 0x02}, /* ?? */ + {IMX_8BIT, 0x331D, 0xA0}, + {IMX_8BIT, 0x4084, 0x0C}, /* Scaling related? */ + {IMX_8BIT, 0x4085, 0xD0}, + {IMX_8BIT, 0x4086, 0x09}, + {IMX_8BIT, 0x4087, 0xA0}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_8m_scaled_from_12m_for_mipi342[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_342MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* Scaling */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x14}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x36}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x14}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x39}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x1B}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280x2464 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x09}, + {IMX_8BIT, 0x034F, 0xA0}, + {IMX_8BIT, 0x0350, 0x00}, /* No Dig crop */ + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, /* Cut out size same as the size after crop */ + {IMX_8BIT, 0x0355, 0x04}, + {IMX_8BIT, 0x0356, 0x0C}, + {IMX_8BIT, 0x0357, 0x08}, + {IMX_8BIT, 0x301D, 0x30}, /* ?? */ + {IMX_8BIT, 0x3310, 0x0C}, /* Write H and V size same as output size? */ + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x09}, + {IMX_8BIT, 0x3313, 0xA0}, + {IMX_8BIT, 0x331C, 0x02}, /* ?? */ + {IMX_8BIT, 0x331D, 0xA0}, + {IMX_8BIT, 0x4084, 0x0C}, /* Resize IMG Hand V size-> Scaling related?*/ + {IMX_8BIT, 0x4085, 0xD0}, + {IMX_8BIT, 0x4086, 0x09}, + {IMX_8BIT, 0x4087, 0xA0}, + {IMX_8BIT, 0x4400, 0x00}, /* STATS off */ + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_6m[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x14}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, /* 36, 194, 1039, a9f 4100x2316 */ + {IMX_8BIT, 0x0345, 0x36}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x94}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x39}, + {IMX_8BIT, 0x034A, 0x0A}, + {IMX_8BIT, 0x034B, 0x9F}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280x1852 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x07}, + {IMX_8BIT, 0x034F, 0x3C}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, /* 4100x2316 */ + {IMX_8BIT, 0x0355, 0x04}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0x0C}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x0C}, + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x07}, + {IMX_8BIT, 0x3313, 0x3C}, + {IMX_8BIT, 0x331C, 0x02}, + {IMX_8BIT, 0x331D, 0xA0}, + {IMX_8BIT, 0x4084, 0x0C}, + {IMX_8BIT, 0x4085, 0xD0}, + {IMX_8BIT, 0x4086, 0x07}, + {IMX_8BIT, 0x4087, 0x3C}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_6m_for_mipi_342[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_342MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x00}, + {IMX_8BIT, 0x0391, 0x11}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x14}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, /* 36, 194, 1039, a9f 4100x2316 */ + {IMX_8BIT, 0x0345, 0x36}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x94}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x39}, + {IMX_8BIT, 0x034A, 0x0A}, + {IMX_8BIT, 0x034B, 0x9F}, + {IMX_8BIT, 0x034C, 0x0C}, /* 3280x1852 */ + {IMX_8BIT, 0x034D, 0xD0}, + {IMX_8BIT, 0x034E, 0x07}, + {IMX_8BIT, 0x034F, 0x3C}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x10}, /* 4100x2316 */ + {IMX_8BIT, 0x0355, 0x04}, + {IMX_8BIT, 0x0356, 0x09}, + {IMX_8BIT, 0x0357, 0x0C}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x0C}, + {IMX_8BIT, 0x3311, 0xD0}, + {IMX_8BIT, 0x3312, 0x07}, + {IMX_8BIT, 0x3313, 0x3C}, + {IMX_8BIT, 0x331C, 0x02}, + {IMX_8BIT, 0x331D, 0xA0}, + {IMX_8BIT, 0x4084, 0x0C}, + {IMX_8BIT, 0x4085, 0xD0}, + {IMX_8BIT, 0x4086, 0x07}, + {IMX_8BIT, 0x4087, 0x3C}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +/* + * FOV is: 3280x2464, larger then 3264x2448. + * Sensor output: 336x256 + * Cropping region: 3444x2624 + */ +static struct imx_reg const imx135_336x256[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, + {IMX_8BIT, 0x0391, 0x22}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, /* 2x binning */ + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x52}, /* scaling: 82/16 */ + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01}, /* x_start: 374 */ + {IMX_8BIT, 0x0345, 0x76}, + {IMX_8BIT, 0x0346, 0x00}, /* y_start: 248 */ + {IMX_8BIT, 0x0347, 0xF8}, + {IMX_8BIT, 0x0348, 0x0E}, /* x_end: 3817 */ + {IMX_8BIT, 0x0349, 0xE9}, + {IMX_8BIT, 0x034A, 0x0B}, /* y_end: 2871 */ + {IMX_8BIT, 0x034B, 0x37}, + {IMX_8BIT, 0x034C, 0x01}, /* x_out: 336 */ + {IMX_8BIT, 0x034D, 0x50}, + {IMX_8BIT, 0x034E, 0x01}, /* y_out: 256 */ + {IMX_8BIT, 0x034F, 0x00}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x06}, /* dig x_out: 1722 */ + {IMX_8BIT, 0x0355, 0xBA}, + {IMX_8BIT, 0x0356, 0x05}, /* dig y_out: 1312 */ + {IMX_8BIT, 0x0357, 0x20}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x01}, /* ?: x_out */ + {IMX_8BIT, 0x3311, 0x50}, + {IMX_8BIT, 0x3312, 0x01}, /* ?: y_out */ + {IMX_8BIT, 0x3313, 0x00}, + {IMX_8BIT, 0x331C, 0x02}, + {IMX_8BIT, 0x331D, 0x4E}, + {IMX_8BIT, 0x4084, 0x01}, /* ?: x_out */ + {IMX_8BIT, 0x4085, 0x50}, + {IMX_8BIT, 0x4086, 0x01}, /* ?: y_out */ + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_1m[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, + {IMX_8BIT, 0x0391, 0x22}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x1F}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x58}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x28}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x17}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x07}, + {IMX_8BIT, 0x034C, 0x04}, + {IMX_8BIT, 0x034D, 0x10}, + {IMX_8BIT, 0x034E, 0x03}, + {IMX_8BIT, 0x034F, 0x10}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x07}, + {IMX_8BIT, 0x0355, 0xE0}, + {IMX_8BIT, 0x0356, 0x05}, + {IMX_8BIT, 0x0357, 0xF0}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x04}, + {IMX_8BIT, 0x3311, 0x10}, + {IMX_8BIT, 0x3312, 0x03}, + {IMX_8BIT, 0x3313, 0x10}, + {IMX_8BIT, 0x331C, 0x02}, + {IMX_8BIT, 0x331D, 0x4E}, + {IMX_8BIT, 0x4084, 0x04}, + {IMX_8BIT, 0x4085, 0x10}, + {IMX_8BIT, 0x4086, 0x03}, + {IMX_8BIT, 0x4087, 0x10}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg const imx135_3m_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, /* Binning */ + {IMX_8BIT, 0x0391, 0x22}, /* 2x2 binning */ + {IMX_8BIT, 0x0392, 0x00}, /* average */ + {IMX_8BIT, 0x0401, 0x00}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x10}, + {IMX_8BIT, 0x4082, 0x01}, + {IMX_8BIT, 0x4083, 0x01}, + {IMX_8BIT, 0x4203, 0xFF}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x28}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x08}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x47}, + {IMX_8BIT, 0x034A, 0x0C}, + {IMX_8BIT, 0x034B, 0x27}, + {IMX_8BIT, 0x034C, 0x08}, + {IMX_8BIT, 0x034D, 0x10}, + {IMX_8BIT, 0x034E, 0x06}, + {IMX_8BIT, 0x034F, 0x10}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x08}, + {IMX_8BIT, 0x0355, 0x10}, + {IMX_8BIT, 0x0356, 0x06}, + {IMX_8BIT, 0x0357, 0x10}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x08}, + {IMX_8BIT, 0x3311, 0x10}, + {IMX_8BIT, 0x3312, 0x06}, + {IMX_8BIT, 0x3313, 0x10}, + {IMX_8BIT, 0x331C, 0x00}, + {IMX_8BIT, 0x331D, 0xAA}, + {IMX_8BIT, 0x4084, 0x00}, + {IMX_8BIT, 0x4085, 0x00}, + {IMX_8BIT, 0x4086, 0x00}, + {IMX_8BIT, 0x4087, 0x00}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +/* 1080P 1936x1104 */ +static struct imx_reg const imx135_1080p_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03}, + {IMX_8BIT, 0x0112, 0x0A}, + {IMX_8BIT, 0x0113, 0x0A}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0387, 0x01}, + {IMX_8BIT, 0x0390, 0x01}, + {IMX_8BIT, 0x0391, 0x22}, + {IMX_8BIT, 0x0392, 0x00}, + {IMX_8BIT, 0x0401, 0x02}, + {IMX_8BIT, 0x0404, 0x00}, + {IMX_8BIT, 0x0405, 0x11}, + {IMX_8BIT, 0x4082, 0x00}, + {IMX_8BIT, 0x4083, 0x00}, + {IMX_8BIT, 0x7006, 0x04}, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x2E}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x84}, + {IMX_8BIT, 0x0348, 0x10}, + {IMX_8BIT, 0x0349, 0x41}, + {IMX_8BIT, 0x034A, 0x0A}, + {IMX_8BIT, 0x034B, 0xAF}, + {IMX_8BIT, 0x034C, 0x07}, + {IMX_8BIT, 0x034D, 0x90}, + {IMX_8BIT, 0x034E, 0x04}, + {IMX_8BIT, 0x034F, 0x50}, + {IMX_8BIT, 0x0350, 0x00}, + {IMX_8BIT, 0x0351, 0x00}, + {IMX_8BIT, 0x0352, 0x00}, + {IMX_8BIT, 0x0353, 0x00}, + {IMX_8BIT, 0x0354, 0x08}, + {IMX_8BIT, 0x0355, 0x0A}, + {IMX_8BIT, 0x0356, 0x04}, + {IMX_8BIT, 0x0357, 0x96}, + {IMX_8BIT, 0x301D, 0x30}, + {IMX_8BIT, 0x3310, 0x07}, + {IMX_8BIT, 0x3311, 0x90}, + {IMX_8BIT, 0x3312, 0x04}, + {IMX_8BIT, 0x3313, 0x50}, + {IMX_8BIT, 0x331C, 0x01}, + {IMX_8BIT, 0x331D, 0x00}, + {IMX_8BIT, 0x4084, 0x07}, + {IMX_8BIT, 0x4085, 0x90}, + {IMX_8BIT, 0x4086, 0x04}, + {IMX_8BIT, 0x4087, 0x50}, + {IMX_8BIT, 0x4400, 0x00}, + {IMX_TOK_TERM, 0, 0}, +}; + +static const struct imx_reg imx135_1080p_nodvs_fullfov_max_clock[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 168,464,4039,2655: 3872x2192 */ + { IMX_8BIT, 0x0345, 0xA8 }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0xD0 }, + { IMX_8BIT, 0x0348, 0x0F }, + { IMX_8BIT, 0x0349, 0xC7 }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0x5F }, + { IMX_8BIT, 0x034C, 0x07 }, /*1936 x 1096 */ + { IMX_8BIT, 0x034D, 0x90 }, + { IMX_8BIT, 0x034E, 0x04 }, + { IMX_8BIT, 0x034F, 0x48 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x07 }, /*1936 x 1096 */ + { IMX_8BIT, 0x0355, 0x90 }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0x48 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x07 }, + { IMX_8BIT, 0x3311, 0x90 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0x48 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0xB0 }, + { IMX_8BIT, 0x4084, 0x07 }, + { IMX_8BIT, 0x4085, 0x90 }, + { IMX_8BIT, 0x4086, 0x04 }, + { IMX_8BIT, 0x4087, 0x48 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* 1080P NODVS 1936x1096 */ +static const struct imx_reg imx135_1080p_nodvs_max_clock[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x11 }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 46,396,4161,2727: 4116x2332 */ + { IMX_8BIT, 0x0345, 0x2E }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0x8C }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x41 }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0xA7 }, + { IMX_8BIT, 0x034C, 0x07 }, /*1936 x 1096 */ + { IMX_8BIT, 0x034D, 0x90 }, + { IMX_8BIT, 0x034E, 0x04 }, + { IMX_8BIT, 0x034F, 0x48 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x08 }, /* 2058x1166 */ + { IMX_8BIT, 0x0355, 0x0A }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0x8E }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x07 }, + { IMX_8BIT, 0x3311, 0x90 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0x48 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0xB0 }, + { IMX_8BIT, 0x4084, 0x07 }, + { IMX_8BIT, 0x4085, 0x90 }, + { IMX_8BIT, 0x4086, 0x04 }, + { IMX_8BIT, 0x4087, 0x48 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* 1080P 10%DVS 2104x1184 */ +static const struct imx_reg imx135_1080p_10_dvs_max_clock[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x00 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x10 }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 0,376,4207,2743: 4208x2368 */ + { IMX_8BIT, 0x0345, 0x00 }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0x78 }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x6F }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0xB7 }, + { IMX_8BIT, 0x034C, 0x08 }, /* 2104 x 1184 */ + { IMX_8BIT, 0x034D, 0x38 }, + { IMX_8BIT, 0x034E, 0x04 }, + { IMX_8BIT, 0x034F, 0xA0 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x08 }, /* 2104 x 1184 */ + { IMX_8BIT, 0x0355, 0x38 }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0xA0 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x08 }, + { IMX_8BIT, 0x3311, 0x38 }, + { IMX_8BIT, 0x3312, 0x04 }, + { IMX_8BIT, 0x3313, 0xA0 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0xB0 }, + { IMX_8BIT, 0x4084, 0x00 }, + { IMX_8BIT, 0x4085, 0x00 }, + { IMX_8BIT, 0x4086, 0x00 }, + { IMX_8BIT, 0x4087, 0x00 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +static const struct imx_reg imx135_720pdvs_max_clock[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x15 }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 46,404,4161,2715: 4116x2312 */ + { IMX_8BIT, 0x0345, 0x2E }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0x94 }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x41 }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0x9B }, + { IMX_8BIT, 0x034C, 0x06 }, /*1568 x 880 */ + { IMX_8BIT, 0x034D, 0x20 }, + { IMX_8BIT, 0x034E, 0x03 }, + { IMX_8BIT, 0x034F, 0x70 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x08 }, /*2058 x 1156 */ + { IMX_8BIT, 0x0355, 0x0A }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0x84 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x03 }, + { IMX_8BIT, 0x3313, 0x70 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0x4C }, + { IMX_8BIT, 0x4084, 0x06 }, + { IMX_8BIT, 0x4085, 0x20 }, + { IMX_8BIT, 0x4086, 0x03 }, + { IMX_8BIT, 0x4087, 0x70 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/******************* Video Modes ******************/ + +/* 1080P DVS 2336x1320 */ +static const struct imx_reg imx135_2336x1320_max_clock[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_451_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, + { IMX_8BIT, 0x0391, 0x11 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x1C }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 60,404,4147,2715: 4088x2312 */ + { IMX_8BIT, 0x0345, 0x3C }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0x94 }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x33 }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0x9B }, + { IMX_8BIT, 0x034C, 0x09 }, /*2336 x 1320 */ + { IMX_8BIT, 0x034D, 0x20 }, + { IMX_8BIT, 0x034E, 0x05 }, + { IMX_8BIT, 0x034F, 0x28 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x0F }, /* 4088x2312 */ + { IMX_8BIT, 0x0355, 0xF8 }, + { IMX_8BIT, 0x0356, 0x09 }, + { IMX_8BIT, 0x0357, 0x08 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x09 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x05 }, + { IMX_8BIT, 0x3313, 0x28 }, + { IMX_8BIT, 0x331C, 0x04 }, + { IMX_8BIT, 0x331D, 0xE2 }, + { IMX_8BIT, 0x4084, 0x09 }, + { IMX_8BIT, 0x4085, 0x20 }, + { IMX_8BIT, 0x4086, 0x05 }, + { IMX_8BIT, 0x4087, 0x28 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* 1080P DVS 2336x1320 Cropped */ +static const struct imx_reg imx135_2336x1320_cropped_mipi499[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_499_2MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x00 }, + { IMX_8BIT, 0x0391, 0x11 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x1C }, + { IMX_8BIT, 0x4082, 0x01 }, + { IMX_8BIT, 0x4083, 0x01 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x03 }, /* 936,900,3271,2219: 2336x1320 */ + { IMX_8BIT, 0x0345, 0xA8 }, + { IMX_8BIT, 0x0346, 0x03 }, + { IMX_8BIT, 0x0347, 0x84 }, + { IMX_8BIT, 0x0348, 0x0C }, + { IMX_8BIT, 0x0349, 0xC7 }, + { IMX_8BIT, 0x034A, 0x08 }, + { IMX_8BIT, 0x034B, 0xAB }, + { IMX_8BIT, 0x034C, 0x09 }, /* 2336 x 1320 */ + { IMX_8BIT, 0x034D, 0x20 }, + { IMX_8BIT, 0x034E, 0x05 }, + { IMX_8BIT, 0x034F, 0x28 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x09 }, /* 2336 x 1320 */ + { IMX_8BIT, 0x0355, 0x20 }, + { IMX_8BIT, 0x0356, 0x05 }, + { IMX_8BIT, 0x0357, 0x28 }, + { IMX_8BIT, 0x301D, 0x30 }, + { IMX_8BIT, 0x3310, 0x09 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x05 }, + { IMX_8BIT, 0x3313, 0x28 }, + { IMX_8BIT, 0x331C, 0x00 }, + { IMX_8BIT, 0x331D, 0xB4 }, + { IMX_8BIT, 0x4084, 0x09 }, + { IMX_8BIT, 0x4085, 0x20 }, + { IMX_8BIT, 0x4086, 0x05 }, + { IMX_8BIT, 0x4087, 0x28 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* 720P DVS 1568 x 880 */ +static const struct imx_reg imx135_720p_dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x15 }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 46,404,4161,2715: 4116x2312 */ + { IMX_8BIT, 0x0345, 0x2e }, + { IMX_8BIT, 0x0346, 0x01 }, + { IMX_8BIT, 0x0347, 0x94 }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x41 }, + { IMX_8BIT, 0x034A, 0x0A }, + { IMX_8BIT, 0x034B, 0x9B }, + { IMX_8BIT, 0x034C, 0x06 }, /*1568 x 880 */ + { IMX_8BIT, 0x034D, 0x20 }, + { IMX_8BIT, 0x034E, 0x03 }, + { IMX_8BIT, 0x034F, 0x70 }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x08 }, /* 2058x1156 */ + { IMX_8BIT, 0x0355, 0x0a }, + { IMX_8BIT, 0x0356, 0x04 }, + { IMX_8BIT, 0x0357, 0x84 }, + { IMX_8BIT, 0x301D, 0x30 }, /* TODO! */ + { IMX_8BIT, 0x3310, 0x06 }, + { IMX_8BIT, 0x3311, 0x20 }, + { IMX_8BIT, 0x3312, 0x03 }, + { IMX_8BIT, 0x3313, 0x70 }, + { IMX_8BIT, 0x331C, 0x01 }, /* TODO! */ + { IMX_8BIT, 0x331D, 0xd6 }, /* TODO! */ + { IMX_8BIT, 0x4084, 0x06 }, + { IMX_8BIT, 0x4085, 0x20 }, + { IMX_8BIT, 0x4086, 0x03 }, + { IMX_8BIT, 0x4087, 0x70 }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* wvga: H : 1640 V : 1024 */ +static const struct imx_reg imx135_wvga_dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x22 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x14 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, + {IMX_8BIT, 0x0345, 0x36 }, + {IMX_8BIT, 0x0346, 0x01 }, + {IMX_8BIT, 0x0347, 0x18 }, + {IMX_8BIT, 0x0348, 0x10 }, + {IMX_8BIT, 0x0349, 0x39 }, + {IMX_8BIT, 0x034A, 0x0B }, + {IMX_8BIT, 0x034B, 0x17 }, + {IMX_8BIT, 0x034C, 0x06 }, + {IMX_8BIT, 0x034D, 0x68 }, + {IMX_8BIT, 0x034E, 0x04 }, + {IMX_8BIT, 0x034F, 0x00 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x08 }, + {IMX_8BIT, 0x0355, 0x02 }, + {IMX_8BIT, 0x0356, 0x05 }, + {IMX_8BIT, 0x0357, 0x00 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x06 }, + {IMX_8BIT, 0x3311, 0x68 }, + {IMX_8BIT, 0x3312, 0x04 }, + {IMX_8BIT, 0x3313, 0x00 }, + {IMX_8BIT, 0x331C, 0x01 }, + {IMX_8BIT, 0x331D, 0xBD }, + {IMX_8BIT, 0x4084, 0x06 }, + {IMX_8BIT, 0x4085, 0x68 }, + {IMX_8BIT, 0x4086, 0x04 }, + {IMX_8BIT, 0x4087, 0x00 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* 480P 1036 x 696 */ +static const struct imx_reg imx135_480p_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x00 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x10 },/* No scal */ + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 52,20,4155, 3099 4144x2784*/ + {IMX_8BIT, 0x0345, 0x20 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0xA8 }, + {IMX_8BIT, 0x0348, 0x10 }, + {IMX_8BIT, 0x0349, 0x4F }, + {IMX_8BIT, 0x034A, 0x0B }, + {IMX_8BIT, 0x034B, 0x88 }, + {IMX_8BIT, 0x034C, 0x04 }, /* 1036 * 696 */ + {IMX_8BIT, 0x034D, 0x0C }, + {IMX_8BIT, 0x034E, 0x02 }, + {IMX_8BIT, 0x034F, 0xB8 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x04 }, /* 1036x696 */ + {IMX_8BIT, 0x0355, 0x0C }, + {IMX_8BIT, 0x0356, 0x02 }, + {IMX_8BIT, 0x0357, 0xB8 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x04 }, + {IMX_8BIT, 0x3311, 0x0C }, + {IMX_8BIT, 0x3312, 0x02 }, + {IMX_8BIT, 0x3313, 0xB8 }, + {IMX_8BIT, 0x331C, 0x02 }, + {IMX_8BIT, 0x331D, 0x21 }, + {IMX_8BIT, 0x4084, 0x04 }, + {IMX_8BIT, 0x4085, 0x0C }, + {IMX_8BIT, 0x4086, 0x02 }, + {IMX_8BIT, 0x4087, 0xB8 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* 480P DVS 936 x 602 */ +static const struct imx_reg imx135_480p_dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* mode setting */ + { IMX_8BIT, 0x0108, 0x03 }, + { IMX_8BIT, 0x0112, 0x0A }, + { IMX_8BIT, 0x0113, 0x0A }, + { IMX_8BIT, 0x0381, 0x01 }, + { IMX_8BIT, 0x0383, 0x01 }, + { IMX_8BIT, 0x0385, 0x01 }, + { IMX_8BIT, 0x0387, 0x01 }, + { IMX_8BIT, 0x0390, 0x01 }, + { IMX_8BIT, 0x0391, 0x22 }, + { IMX_8BIT, 0x0392, 0x00 }, + { IMX_8BIT, 0x0401, 0x02 }, + { IMX_8BIT, 0x0404, 0x00 }, + { IMX_8BIT, 0x0405, 0x23 }, + { IMX_8BIT, 0x4082, 0x00 }, + { IMX_8BIT, 0x4083, 0x00 }, + { IMX_8BIT, 0x7006, 0x04 }, + /* size setting */ + { IMX_8BIT, 0x0344, 0x00 }, /* 56,244,4151,2877: 4096x2634 */ + { IMX_8BIT, 0x0345, 0x38 }, + { IMX_8BIT, 0x0346, 0x00 }, + { IMX_8BIT, 0x0347, 0xf4 }, + { IMX_8BIT, 0x0348, 0x10 }, + { IMX_8BIT, 0x0349, 0x37 }, + { IMX_8BIT, 0x034A, 0x0b }, + { IMX_8BIT, 0x034B, 0x3d }, + { IMX_8BIT, 0x034C, 0x03 }, /* 936 x 602 */ + { IMX_8BIT, 0x034D, 0xa8 }, + { IMX_8BIT, 0x034E, 0x02 }, + { IMX_8BIT, 0x034F, 0x5a }, + { IMX_8BIT, 0x0350, 0x00 }, + { IMX_8BIT, 0x0351, 0x00 }, + { IMX_8BIT, 0x0352, 0x00 }, + { IMX_8BIT, 0x0353, 0x00 }, + { IMX_8BIT, 0x0354, 0x08 }, /* 2058x1156 */ + { IMX_8BIT, 0x0355, 0x00 }, + { IMX_8BIT, 0x0356, 0x05 }, + { IMX_8BIT, 0x0357, 0x25 }, + { IMX_8BIT, 0x301D, 0x30 }, /* TODO! */ + { IMX_8BIT, 0x3310, 0x03 }, + { IMX_8BIT, 0x3311, 0xa8 }, + { IMX_8BIT, 0x3312, 0x02 }, + { IMX_8BIT, 0x3313, 0x5a }, + { IMX_8BIT, 0x331C, 0x01 }, /* TODO! */ + { IMX_8BIT, 0x331D, 0xd6 }, + { IMX_8BIT, 0x4084, 0x03 }, + { IMX_8BIT, 0x4085, 0xa8 }, + { IMX_8BIT, 0x4086, 0x02 }, + { IMX_8BIT, 0x4087, 0x5a }, + { IMX_8BIT, 0x4400, 0x00 }, + { IMX_TOK_TERM, 0, 0} +}; + +/* VGA: H : 1036 V : 780 */ +static const struct imx_reg imx135_vga_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x00 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x10 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 52,20,4155, 3099 4144x3120*/ + {IMX_8BIT, 0x0345, 0x20 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x00 }, + {IMX_8BIT, 0x0348, 0x10 }, + {IMX_8BIT, 0x0349, 0x4F }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x2F }, + {IMX_8BIT, 0x034C, 0x04 }, /* 1036x780 */ + {IMX_8BIT, 0x034D, 0x0C }, + {IMX_8BIT, 0x034E, 0x03 }, + {IMX_8BIT, 0x034F, 0x0C }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x04 }, /* 1036x780 */ + {IMX_8BIT, 0x0355, 0x0C }, + {IMX_8BIT, 0x0356, 0x03 }, + {IMX_8BIT, 0x0357, 0x0C }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x04 }, + {IMX_8BIT, 0x3311, 0x0C }, + {IMX_8BIT, 0x3312, 0x03 }, + {IMX_8BIT, 0x3313, 0x0C }, + {IMX_8BIT, 0x331C, 0x02 }, + {IMX_8BIT, 0x331D, 0x21 }, + {IMX_8BIT, 0x4084, 0x04 }, + {IMX_8BIT, 0x4085, 0x0C }, + {IMX_8BIT, 0x4086, 0x03 }, + {IMX_8BIT, 0x4087, 0x0C }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* VGA: H : 820 V : 616 */ +static const struct imx_reg imx135_vga_dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x14 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 52,20,4155, 3099 4104x3080*/ + {IMX_8BIT, 0x0345, 0x34 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x14 }, + {IMX_8BIT, 0x0348, 0x10 }, + {IMX_8BIT, 0x0349, 0x3B }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x1B }, + {IMX_8BIT, 0x034C, 0x03 }, /* 820x616 */ + {IMX_8BIT, 0x034D, 0x34 }, + {IMX_8BIT, 0x034E, 0x02 }, + {IMX_8BIT, 0x034F, 0x68 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x04 }, /* 1026x770 */ + {IMX_8BIT, 0x0355, 0x02 }, + {IMX_8BIT, 0x0356, 0x03 }, + {IMX_8BIT, 0x0357, 0x02 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x03 }, + {IMX_8BIT, 0x3311, 0x34 }, + {IMX_8BIT, 0x3312, 0x02 }, + {IMX_8BIT, 0x3313, 0x68 }, + {IMX_8BIT, 0x331C, 0x02 }, + {IMX_8BIT, 0x331D, 0x21 }, + {IMX_8BIT, 0x4084, 0x03 }, + {IMX_8BIT, 0x4085, 0x34 }, + {IMX_8BIT, 0x4086, 0x02 }, + {IMX_8BIT, 0x4087, 0x68 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* VGA: H : 436 V : 360 */ +static const struct imx_reg imx135_436x360_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x22 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 212,0,3995,3119 3784x3120 */ + {IMX_8BIT, 0x0345, 0xD4 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x00 }, + {IMX_8BIT, 0x0348, 0x0F }, + {IMX_8BIT, 0x0349, 0x9B }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x2F }, + + {IMX_8BIT, 0x034C, 0x01 }, /* 436x360 */ + {IMX_8BIT, 0x034D, 0xB4 }, + {IMX_8BIT, 0x034E, 0x01 }, + {IMX_8BIT, 0x034F, 0x68 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x12 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x0C }, + + {IMX_8BIT, 0x0354, 0x03 }, /* 928x768 crop from 946x780*/ + {IMX_8BIT, 0x0355, 0xA0 }, + {IMX_8BIT, 0x0356, 0x03 }, + {IMX_8BIT, 0x0357, 0x00 }, + + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x01 }, + {IMX_8BIT, 0x3311, 0xB4 }, + {IMX_8BIT, 0x3312, 0x01 }, + {IMX_8BIT, 0x3313, 0x68 }, + {IMX_8BIT, 0x331C, 0x02 }, + {IMX_8BIT, 0x331D, 0x21 }, + {IMX_8BIT, 0x4084, 0x01 }, + {IMX_8BIT, 0x4085, 0xB4 }, + {IMX_8BIT, 0x4086, 0x01 }, + {IMX_8BIT, 0x4087, 0x68 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* QVGA: H : 408 V : 308 */ +static const struct imx_reg imx135_qvga__dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x28 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 64,20,4143,3099 4080x3080 */ + {IMX_8BIT, 0x0345, 0x40 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x14 }, + {IMX_8BIT, 0x0348, 0x10 }, + {IMX_8BIT, 0x0349, 0x2F }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x1B }, + {IMX_8BIT, 0x034C, 0x01 }, /* 408x308 */ + {IMX_8BIT, 0x034D, 0x98 }, + {IMX_8BIT, 0x034E, 0x01 }, + {IMX_8BIT, 0x034F, 0x34 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x03 }, /* 1020x770 */ + {IMX_8BIT, 0x0355, 0xFC }, + {IMX_8BIT, 0x0356, 0x03 }, + {IMX_8BIT, 0x0357, 0x02 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x01 }, + {IMX_8BIT, 0x3311, 0x98 }, + {IMX_8BIT, 0x3312, 0x01 }, + {IMX_8BIT, 0x3313, 0x34 }, + {IMX_8BIT, 0x331C, 0x01 }, + {IMX_8BIT, 0x331D, 0x68 }, + {IMX_8BIT, 0x4084, 0x01 }, + {IMX_8BIT, 0x4085, 0x98 }, + {IMX_8BIT, 0x4086, 0x01 }, + {IMX_8BIT, 0x4087, 0x34 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* CIF H : 368 V : 304 */ +static const struct imx_reg imx135_cif_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x28 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x01 }, /* 264,42,3943,3081 3680x3040 */ + {IMX_8BIT, 0x0345, 0x08 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x2a }, + {IMX_8BIT, 0x0348, 0x0F }, + {IMX_8BIT, 0x0349, 0x67 }, + {IMX_8BIT, 0x034A, 0x0c }, + {IMX_8BIT, 0x034B, 0x09 }, + {IMX_8BIT, 0x034C, 0x01 }, /* 368x304 */ + {IMX_8BIT, 0x034D, 0x70 }, + {IMX_8BIT, 0x034E, 0x01 }, + {IMX_8BIT, 0x034F, 0x30 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x03 }, /* 920x760 */ + {IMX_8BIT, 0x0355, 0x98 }, + {IMX_8BIT, 0x0356, 0x02 }, + {IMX_8BIT, 0x0357, 0xf8 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x01 }, + {IMX_8BIT, 0x3311, 0x70 }, + {IMX_8BIT, 0x3312, 0x01 }, + {IMX_8BIT, 0x3313, 0x30 }, + {IMX_8BIT, 0x331C, 0x02 }, /* TODO! binning 4x4 must be 021c? */ + {IMX_8BIT, 0x331D, 0x1C }, + {IMX_8BIT, 0x4084, 0x01 }, + {IMX_8BIT, 0x4085, 0x70 }, + {IMX_8BIT, 0x4086, 0x01 }, + {IMX_8BIT, 0x4087, 0x30 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* CIF H : 1888 V : 1548 */ +static const struct imx_reg imx135_cif_binning_1888x1548[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x22 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x00 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x10 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 264,42, 3776x3096 */ + {IMX_8BIT, 0x0345, 0xD8 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x0C }, + {IMX_8BIT, 0x0348, 0x0F }, + {IMX_8BIT, 0x0349, 0x97 }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x23 }, + {IMX_8BIT, 0x034C, 0x07 }, /* 1888x1548 */ + {IMX_8BIT, 0x034D, 0x60 }, + {IMX_8BIT, 0x034E, 0x06 }, + {IMX_8BIT, 0x034F, 0x0C }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x07 }, /* 1888x1548 */ + {IMX_8BIT, 0x0355, 0x60 }, + {IMX_8BIT, 0x0356, 0x06 }, + {IMX_8BIT, 0x0357, 0x0C }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x07 }, + {IMX_8BIT, 0x3311, 0x60 }, + {IMX_8BIT, 0x3312, 0x06 }, + {IMX_8BIT, 0x3313, 0x0C }, + {IMX_8BIT, 0x331C, 0x02 }, /* TODO! binning 4x4 must be 021c? */ + {IMX_8BIT, 0x331D, 0x1C }, + {IMX_8BIT, 0x4084, 0x07 }, + {IMX_8BIT, 0x4085, 0x60 }, + {IMX_8BIT, 0x4086, 0x06 }, + {IMX_8BIT, 0x4087, 0x0C }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* QCIF H : 216 V : 176 */ +static const struct imx_reg imx135_qcif_dvs_binning[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + PLL_SETTINGS_FOR_MIPI_209_6MHZ_SALTBAY, + /* Mode setting */ + {IMX_8BIT, 0x0108, 0x03 }, + {IMX_8BIT, 0x0112, 0x0A }, + {IMX_8BIT, 0x0113, 0x0A }, + {IMX_8BIT, 0x0381, 0x01 }, + {IMX_8BIT, 0x0383, 0x01 }, + {IMX_8BIT, 0x0385, 0x01 }, + {IMX_8BIT, 0x0387, 0x01 }, + {IMX_8BIT, 0x0390, 0x01 }, + {IMX_8BIT, 0x0391, 0x44 }, + {IMX_8BIT, 0x0392, 0x00 }, + {IMX_8BIT, 0x0401, 0x02 }, + {IMX_8BIT, 0x0404, 0x00 }, + {IMX_8BIT, 0x0405, 0x46 }, + {IMX_8BIT, 0x4082, 0x00 }, + {IMX_8BIT, 0x4083, 0x00 }, + {IMX_8BIT, 0x7006, 0x04 }, + /* Size setting */ + {IMX_8BIT, 0x0344, 0x00 }, /* 212,20,3995,3099 3784x3080 */ + {IMX_8BIT, 0x0345, 0xD4 }, + {IMX_8BIT, 0x0346, 0x00 }, + {IMX_8BIT, 0x0347, 0x14 }, + {IMX_8BIT, 0x0348, 0x0F }, + {IMX_8BIT, 0x0349, 0x9B }, + {IMX_8BIT, 0x034A, 0x0C }, + {IMX_8BIT, 0x034B, 0x1B }, + {IMX_8BIT, 0x034C, 0x00 }, /* 216x176 */ + {IMX_8BIT, 0x034D, 0xD8 }, + {IMX_8BIT, 0x034E, 0x00 }, + {IMX_8BIT, 0x034F, 0xB0 }, + {IMX_8BIT, 0x0350, 0x00 }, + {IMX_8BIT, 0x0351, 0x00 }, + {IMX_8BIT, 0x0352, 0x00 }, + {IMX_8BIT, 0x0353, 0x00 }, + {IMX_8BIT, 0x0354, 0x03 }, /* 946x770 */ + {IMX_8BIT, 0x0355, 0xB2 }, + {IMX_8BIT, 0x0356, 0x03 }, + {IMX_8BIT, 0x0357, 0x02 }, + {IMX_8BIT, 0x301D, 0x30 }, + {IMX_8BIT, 0x3310, 0x00 }, + {IMX_8BIT, 0x3311, 0xD8 }, + {IMX_8BIT, 0x3312, 0x00 }, + {IMX_8BIT, 0x3313, 0xB0 }, + {IMX_8BIT, 0x331C, 0x02 }, /* TODO! binning 4x4 must be 021c */ + {IMX_8BIT, 0x331D, 0x1C }, + {IMX_8BIT, 0x4084, 0x00 }, + {IMX_8BIT, 0x4085, 0xD8 }, + {IMX_8BIT, 0x4086, 0x00 }, + {IMX_8BIT, 0x4087, 0xB0 }, + {IMX_8BIT, 0x4400, 0x00 }, + {IMX_TOK_TERM, 0, 0} +}; + +/* + * ISP Scaling is now supported in offine capture use cases. Because of that + * we need only few modes to cover the different aspect ratios from the + * sensor and the ISP will scale it based on the requested resolution from HAL. + * + * There is a performance impact when continuous view finder option is chose + * for resolutions above 8MP. So 8MP and 6MP resolution are kept, so that lower + * than these take 8MP or 6MP espectively for down scaling based on the + * aspect ratio. + */ +struct imx_resolution imx135_res_preview_mofd[] = { + { + .desc = "imx135_cif_binning_preview", + .regs = imx135_cif_binning, + .width = 368, + .height = 304, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 9114, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_vga_binning_preview", + .regs = imx135_vga_binning, + .width = 1036, + .height = 780, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_480p_preview", + .regs = imx135_480p_binning, + .width = 1036, + .height = 696, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_1080p_binning_preview", + .regs = imx135_1080p_binning, + .width = 1936, + .height = 1104, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_3m__cont_cap", + .regs = imx135_3m_binning, + .width = 2064, + .height = 1552, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_6m_cont_cap", + .regs = imx135_6m, + .width = 3280, + .height = 1852, + .fps_options = { + { /* Binning Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_8m_scaled_from_12m__cont_cap", + .regs = imx135_8m_scaled_from_12m, + .width = 3280, + .height = 2464, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 24, + .pixels_per_line = 4572, + .lines_per_frame = 3280, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_10m__cont_cap", + .regs = imx135_10m, + .width = 4208, + .height = 2368, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2632, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_13m__cont_cap", + .regs = imx135_13m, + .width = 4208, + .height = 3120, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 24, + .pixels_per_line = 4572, + .lines_per_frame = 3290, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, +}; + +struct imx_resolution imx135_res_preview[] = { + { + .desc = "imx135_xga_cropped_video", + .regs = imx135_xga_cropped, + .width = 832, + .height = 628, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_2m_cropped_video", + .regs = imx135_2m_cropped, + .width = 1648, + .height = 1240, + .fps_options = { + { /* Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_1936x1096_cropped", + .regs = imx135_1936x1096_cropped, + .width = 1936, + .height = 1096, + .fps_options = { + { /* Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_8m_cropped_video", + .regs = imx135_8m_cropped, + .width = 3280, + .height = 2464, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, +}; + +/* + * ISP Scaling is now supported in online capture use cases. Because of that + * we need only few modes to cover the different aspect ratios from the + * sensor and the ISP will scale it based on the requested resolution from HAL. + * + * There is a performance impact when continuous view finder option is chose + * for resolutions above 8MP. So 8MP and 6MP resolution are kept, so that lower + * than these take 8MP or 6MP espectively for down scaling based on the + * aspect ratio. + */ +struct imx_resolution imx135_res_still_mofd[] = { + { + .desc = "imx135_cif_binning_still", + .regs = imx135_cif_binning_1888x1548, + .width = 1888, + .height = 1548, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 209600, + }, + { + .desc = "imx135_vga_binning_preview", + .regs = imx135_vga_binning, + .width = 1036, + .height = 780, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_480p_preview", + .regs = imx135_480p_binning, + .width = 1036, + .height = 696, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_1080p_binning_still", + .regs = imx135_1080p_binning, + .width = 1936, + .height = 1104, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 15, + .pixels_per_line = 9114, + .lines_per_frame = 2453, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_3m__still", + .regs = imx135_3m_binning, + .width = 2064, + .height = 1552, + .fps_options = { + { /* Binning Pixel clock: 335.36MHz */ + .fps = 15, + .pixels_per_line = 9114, + .lines_per_frame = 2453, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 209600, + }, + { + .desc = "imx135_6m_for_mipi_342_still", + .regs = imx135_6m_for_mipi_342, + .width = 3280, + .height = 1852, + .fps_options = { + { /* Pixel clock: 273.6MHz */ + .fps = 11, + .pixels_per_line = 9114, + .lines_per_frame = 2664, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 342000, + }, + { + .desc = "imx135_8m_scaled_from_12m_for_mipi342_still", + .regs = imx135_8m_scaled_from_12m_for_mipi342, + .width = 3280, + .height = 2464, + .fps_options = { + { /* Pixel clock: 273.6MHz */ + .fps = 8, + .pixels_per_line = 7672, + .lines_per_frame = 4458, + }, + { /* Pixel clock: 273.6MHz */ + .fps = 15, + .pixels_per_line = 5500, + .lines_per_frame = 3314, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 342000, + }, + { + .desc = "imx135_10m_for_mipi_342_still", + .regs = imx135_10m_for_mipi_342, + .width = 4208, + .height = 2368, + .fps_options = { + { /* Pixel clock: 273.6MHz */ + .fps = 11, + .pixels_per_line = 9144, + .lines_per_frame = 2664, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 342000, + }, + { + .desc = "imx135_13m_still", + .regs = imx135_13m_for_mipi_342, + .width = 4208, + .height = 3120, + .fps_options = { + { /* Pixel clock: 273.6MHz */ + .fps = 5, + .pixels_per_line = 9144, + .lines_per_frame = 5990, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 342000, + }, +}; + +struct imx_resolution imx135_res_still[] = { + { + .desc = "imx135_qvga", + .regs = imx135_336x256, + .width = 336, + .height = 256, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_cif", + .regs = imx135_368x304_cropped, + .width = 368, + .height = 304, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_xga_cropped_video", + .regs = imx135_xga_cropped, + .width = 832, + .height = 628, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_2M_for_11:9", + .regs = imx135_1424x1168_cropped, + .width = 1424, + .height = 1168, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_2m_cropped_video", + .regs = imx135_2m_cropped, + .width = 1648, + .height = 1240, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 15, + .pixels_per_line = 6466, + .lines_per_frame = 3710, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_6m_cropped_video", + .regs = imx135_6m_cropped, + .width = 3280, + .height = 1852, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 8, + .pixels_per_line = 8850, + .lines_per_frame = 5080, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_8m_cropped_video", + .regs = imx135_8m_cropped, + .width = 3280, + .height = 2464, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 8, + .pixels_per_line = 8850, + .lines_per_frame = 5080, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, +}; + +/* + * ISP scaling is not supported in case of video modes. So we need to have + * separate sensor mode for video use cases + */ +struct imx_resolution imx135_res_video[] = { + /* For binning modes pix clock is 335.36 MHz. */ + { + .desc = "imx135_qcif_dvs_binning_video", + .regs = imx135_qcif_dvs_binning, + .width = 216, + .height = 176, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_cif_binning_video", + .regs = imx135_cif_binning, + .width = 368, + .height = 304, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_qvga__dvs_binning_video", + .regs = imx135_qvga__dvs_binning, + .width = 408, + .height = 308, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_436x360_binning_video", + .regs = imx135_436x360_binning, + .width = 436, + .height = 360, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_vga_dvs_binning_video", + .regs = imx135_vga_dvs_binning, + .width = 820, + .height = 616, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 9144, + .lines_per_frame = 1226, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 209600, + }, + { + .desc = "imx135_480p_dvs_binning_video", + .regs = imx135_480p_dvs_binning, + .width = 936, + .height = 602, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 209600, + }, + { + .desc = "imx135_720P_dvs_video", + .regs = imx135_720pdvs_max_clock, + .width = 1568, + .height = 880, + .fps_options = { + {/* Pixel Clock : 360.96 MHz */ + .fps = 30, + .pixels_per_line = 5850, + .lines_per_frame = 2000, + }, + {/* Pixel Clock : 360.96 MHz */ + .fps = 60, + .pixels_per_line = 4572, + .lines_per_frame = 1310, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 451200, + }, + { + .desc = "imx135_wvga_dvs_binning_video", + .regs = imx135_wvga_dvs_binning, + .width = 1640, + .height = 1024, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 5464, + .lines_per_frame = 2046, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 209600, + }, + { + .desc = "imx135_1936_1096_fullfov_max_clock", + .regs = imx135_1080p_nodvs_max_clock, + .width = 1936, + .height = 1096, + .fps_options = { + {/* Pixel Clock : 360.96 MHz */ + .fps = 30, + .pixels_per_line = 5850, + .lines_per_frame = 2000, + }, + {/* Pixel Clock : 360.96 MHz */ + .fps = 60, + .pixels_per_line = 4572, + .lines_per_frame = 1310, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 451200, + }, + { + .desc = "imx135_1080P_dvs_video", + .regs = imx135_2336x1320_max_clock, + .width = 2336, + .height = 1320, + .fps_options = { + {/* Pixel Clock : 360.96 MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2632, + .regs = imx135_2336x1320_max_clock, + .mipi_freq = 451200, + }, + {/* Pixel Clock : 399.36MHz */ + .fps = 60, + .pixels_per_line = 4754, + .lines_per_frame = 1400, + .regs = imx135_2336x1320_cropped_mipi499, + .mipi_freq = 499200, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_6m_cont_cap", + .regs = imx135_6m, + .width = 3280, + .height = 1852, + .fps_options = { + { /* Binning Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, + { + .desc = "imx135_8m_cropped_video", + .regs = imx135_8m_cropped, + .width = 3280, + .height = 2464, + .fps_options = { + { /* Pixel clock: 360.96MHz */ + .fps = 30, + .pixels_per_line = 4572, + .lines_per_frame = 2624, + }, + { + } + }, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .mipi_freq = 451200, + }, +}; + +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/imx175.h b/drivers/staging/media/atomisp/i2c/imx/imx175.h new file mode 100644 index 0000000..5f409cc --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx175.h @@ -0,0 +1,1959 @@ +#ifndef __IMX175_H__ +#define __IMX175_H__ +#include "common.h" + +/************************** settings for imx *************************/ +static struct imx_reg const imx_STILL_8M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xC4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x66}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0C}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0xD0}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x09}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xA0}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_8M_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0B}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xB8}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x16}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x44}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0C}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0xD0}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x09}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xA0}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_3M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xC4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x66}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x08}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x06}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x10}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x19}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_3M_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0B}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xB8}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x16}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x44}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x08}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x06}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x10}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x19}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + + +static struct imx_reg const imx_STILL_5M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xC4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x66}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0A}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x07}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x90}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x14}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_5M_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0B}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xB8}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x16}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x44}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0A}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x07}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x90}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x14}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_6M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xC4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x66}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x32}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x6D}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0C}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0xD0}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x07}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x3C}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_6M_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEF}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0B}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xB8}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x16}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x44}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x32}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x6D}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x0C}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0xD0}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x07}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x3C}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_2M_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x8C}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xC4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x66}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x68}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xD0}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_2M_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x0A}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x8C}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x2c}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0B}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xB8}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x16}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x44}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x68}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xD0}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x77}, + {IMX_8BIT, 0x3371, 0x2F}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x2F}, + {IMX_8BIT, 0x3375, 0x37}, + {IMX_8BIT, 0x3376, 0x9F}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x09}, + {IMX_8BIT, 0x33D7, 0xA0}, + + {IMX_8BIT, 0x030e, 0x01}, + {IMX_8BIT, 0x41c0, 0x01}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_PREVIEW_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x06}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x05}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x48}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x70}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x03}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x34}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x02}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x68}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x03}, + {IMX_8BIT, 0x33D5, 0x34}, + {IMX_8BIT, 0x33D6, 0x02}, + {IMX_8BIT, 0x33D7, 0x68}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_WIDE_PREVIEW_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x06}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x0D}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x70}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x10}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x00}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x14}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x8C}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x68}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x03}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xBC}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x68}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0xBC}, + {IMX_TOK_TERM, 0, 0} +}; + +/*****************************video************************/ +static struct imx_reg const imx_1080p_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x06}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x4C}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xA4}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x11}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0xC6}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x01}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0xDB}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x02}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x42}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0A}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xEA}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x07}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x61}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x09}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x05}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x20}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_1080p_no_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x08}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xD5}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x07}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xD0}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0F}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x3C}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x34}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x6B}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x07}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x94}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x44}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x1B}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_1080p_no_dvs_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x08}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xD5}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x09}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xA6}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x18}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x9C}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x34}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x6B}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x07}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x94}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x44}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x1B}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; +/*****************************video************************/ +static struct imx_reg const imx_720p_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x00}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x13}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x9C}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x01}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0xD7}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x02}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x3E}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0A}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xEE}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x07}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x65}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x03}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x70}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x00}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x18}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_480p_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x00}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x13}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x9C}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x01}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0xD4}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0xC8}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0A}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xF1}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x07}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0xDB}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x03}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x70}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x02}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x50}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x02}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x15}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_720p_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x04}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x05}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x48}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x14}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x28}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x48}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x64}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0x87}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x3B}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x20}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x03}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x6C}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x20}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0x6C}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_STILL_720p_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x04}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x08}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0xCA}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x18}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x38}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x48}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x64}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0x87}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x3B}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x20}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x03}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x6C}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x20}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0x6C}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_WVGA_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xEC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x09}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x01}, + {IMX_8BIT, 0x030D, 0x12}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x00}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x13}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x9C}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0xD0}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x08}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0xCF}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x06}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x68}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x00}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x01}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x57}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x6F}, + {IMX_8BIT, 0x3371, 0x27}, + {IMX_8BIT, 0x3372, 0x4F}, + {IMX_8BIT, 0x3373, 0x2F}, + {IMX_8BIT, 0x3374, 0x27}, + {IMX_8BIT, 0x3375, 0x2F}, + {IMX_8BIT, 0x3376, 0x97}, + {IMX_8BIT, 0x3377, 0x37}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x0C}, + {IMX_8BIT, 0x33D5, 0xD0}, + {IMX_8BIT, 0x33D6, 0x07}, + {IMX_8BIT, 0x33D7, 0x38}, + {IMX_TOK_TERM, 0, 0} +}; +static struct imx_reg const imx_CIF_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x04}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x00}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x11}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0xDB}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x01}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x70}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x01}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x30}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x20}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0x6C}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_VGA_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x04}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x06}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x00}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x11}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x94}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x03}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x34}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x02}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x68}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x20}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0x6C}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_VGA_strong_dvs_15fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0xFC}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x04}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x07}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x9E}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x1C}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0xB6}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x0C}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0xCF}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x09}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x9F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x03}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x34}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x02}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x68}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x06}, + {IMX_8BIT, 0x33D5, 0x20}, + {IMX_8BIT, 0x33D6, 0x03}, + {IMX_8BIT, 0x33D7, 0x6C}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_QVGA_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x06}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x05}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x48}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x70}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x03}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0x38}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x02}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x68}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x09}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0x97}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x07}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x37}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x01}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0x98}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x01}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0x34}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x01}, + {IMX_8BIT, 0x33D5, 0x98}, + {IMX_8BIT, 0x33D6, 0x01}, + {IMX_8BIT, 0x33D7, 0x34}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_QCIF_strong_dvs_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + /* shutter */ + {IMX_8BIT, 0x0202, 0x05}, /* coarse _integration_time[15:8] */ + {IMX_8BIT, 0x0203, 0x44}, /* coarse _integration_time[7:0] */ + /* pll */ + {IMX_8BIT, 0x0301, 0x05}, /* vt_pix_clk_div[7:0] */ + {IMX_8BIT, 0x0303, 0x01}, /* vt_sys_clk_div[7:0] */ + {IMX_8BIT, 0x0305, 0x06}, /* pre_pll_clk_div[7:0] */ + {IMX_8BIT, 0x0309, 0x05}, /* op_pix_clk_div[7:0] */ + {IMX_8BIT, 0x030B, 0x01}, /* op_sys_clk_div[7:0] */ + {IMX_8BIT, 0x030C, 0x00}, + {IMX_8BIT, 0x030D, 0x6D}, + /* image sizing */ + {IMX_8BIT, 0x0340, 0x05}, /* frame_length_lines[15:8] */ + {IMX_8BIT, 0x0341, 0x48}, /* frame_length_lines[7:0] */ + {IMX_8BIT, 0x0342, 0x0D}, /* line_length_pck[15:8] */ + {IMX_8BIT, 0x0343, 0x70}, /* line_length_pck[7:0] */ + {IMX_8BIT, 0x0344, 0x04}, /* x_addr_start[15:8] */ + {IMX_8BIT, 0x0345, 0xB8}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x03}, /* y_addr_start[15:8] */ + {IMX_8BIT, 0x0347, 0x70}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x08}, /* x_addr_end[15:8] */ + {IMX_8BIT, 0x0349, 0x17}, /* x_addr_end[7:0] */ + {IMX_8BIT, 0x034A, 0x06}, /* y_addr_end[15:8] */ + {IMX_8BIT, 0x034B, 0x2F}, /* y_addr_end[7:0] */ + {IMX_8BIT, 0x034C, 0x00}, /* x_output_size[15:8] */ + {IMX_8BIT, 0x034D, 0xD8}, /* x_output_size[7:0] */ + {IMX_8BIT, 0x034E, 0x00}, /* y_output_size[15:8] */ + {IMX_8BIT, 0x034F, 0xB0}, /* y_output_size[7:0] */ + /* binning & scaling */ + {IMX_8BIT, 0x0390, 0x02}, /* binning mode */ + {IMX_8BIT, 0x0401, 0x00}, /* scaling mode*/ + {IMX_8BIT, 0x0405, 0x10}, /* scale_m[7:0] */ + /* timer */ + {IMX_8BIT, 0x3344, 0x37}, + {IMX_8BIT, 0x3345, 0x1F}, + /* timing */ + {IMX_8BIT, 0x3370, 0x5F}, + {IMX_8BIT, 0x3371, 0x17}, + {IMX_8BIT, 0x3372, 0x37}, + {IMX_8BIT, 0x3373, 0x17}, + {IMX_8BIT, 0x3374, 0x17}, + {IMX_8BIT, 0x3375, 0x0F}, + {IMX_8BIT, 0x3376, 0x57}, + {IMX_8BIT, 0x3377, 0x27}, + {IMX_8BIT, 0x33C8, 0x01}, + {IMX_8BIT, 0x33D4, 0x00}, + {IMX_8BIT, 0x33D5, 0xD8}, + {IMX_8BIT, 0x33D6, 0x00}, + {IMX_8BIT, 0x33D7, 0xB0}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx175_init_settings[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0103, 0x01}, + /* misc control */ + {IMX_8BIT, 0x3020, 0x10}, + {IMX_8BIT, 0x302D, 0x02}, + {IMX_8BIT, 0x302F, 0x80}, + {IMX_8BIT, 0x3032, 0xA3}, + {IMX_8BIT, 0x3033, 0x20}, + {IMX_8BIT, 0x3034, 0x24}, + {IMX_8BIT, 0x3041, 0x15}, + {IMX_8BIT, 0x3042, 0x87}, + {IMX_8BIT, 0x3050, 0x35}, + {IMX_8BIT, 0x3056, 0x57}, + {IMX_8BIT, 0x305D, 0x41}, + {IMX_8BIT, 0x3097, 0x69}, + {IMX_8BIT, 0x3109, 0x41}, + {IMX_8BIT, 0x3148, 0x3F}, + {IMX_8BIT, 0x330F, 0x07}, + /* csi & inck */ + {IMX_8BIT, 0x3364, 0x00}, + {IMX_8BIT, 0x3368, 0x13}, + {IMX_8BIT, 0x3369, 0x33}, + /* znr */ + {IMX_8BIT, 0x4100, 0x0E}, + {IMX_8BIT, 0x4104, 0x32}, + {IMX_8BIT, 0x4105, 0x32}, + {IMX_8BIT, 0x4108, 0x01}, + {IMX_8BIT, 0x4109, 0x7C}, + {IMX_8BIT, 0x410A, 0x00}, + {IMX_8BIT, 0x410B, 0x00}, + GROUPED_PARAMETER_HOLD_DISABLE, + {IMX_TOK_TERM, 0, 0} +}; +/* TODO settings of preview/still/video will be updated with new use case */ +struct imx_resolution imx175_res_preview[] = { + { + .desc = "CIF_strong_dvs_30fps", + .regs = imx_CIF_strong_dvs_30fps, + .width = 368, + .height = 304, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x11DB, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 261500, + + }, + { + .desc = "VGA_strong_dvs_30fps", + .regs = imx_VGA_strong_dvs_30fps, + .width = 820, + .height = 616, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x11DB, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 261500, + }, + { + .desc = "WIDE_PREVIEW_30fps", + .regs = imx_WIDE_PREVIEW_30fps, + .width = 1640, + .height = 956, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x1000, + .lines_per_frame = 0x0D70, + }, + { + } + }, + .mipi_freq = 174500, + }, + { + .desc = "STILL_720p_30fps", + .regs = imx_STILL_720p_30fps, + .width = 1568, + .height = 876, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x1428, + .lines_per_frame = 0x0548, + }, + { + } + }, + .mipi_freq = 261500, + }, + { + .desc = "STILL_2M_30fps", + .regs = imx_STILL_2M_30fps, + .width = 1640, + .height = 1232, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D66, + .lines_per_frame = 0x09C4, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "1080p_strong_dvs_30fps", + .regs = imx_1080p_no_dvs_30fps, + .width = 1940, + .height = 1092, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0F3C, + .lines_per_frame = 0x07D0, + }, + { + } + }, + .mipi_freq = 292500, + }, + { + .desc = "STILL_3M_30fps", + .regs = imx_STILL_3M_30fps, + .width = 2064, + .height = 1552, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D66, + .lines_per_frame = 0x09C4, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_5M_30fps", + .regs = imx_STILL_5M_30fps, + .width = 2576, + .height = 1936, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D66, + .lines_per_frame = 0x09C4, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_6M_30fps", + .regs = imx_STILL_6M_30fps, + .width = 3280, + .height = 1852, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D66, + .lines_per_frame = 0x09C4, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_8M_30fps", + .regs = imx_STILL_8M_30fps, + .width = 3280, + .height = 2464, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D66, + .lines_per_frame = 0x09C4, + }, + { + } + }, + .mipi_freq = 320000, + }, +}; + +struct imx_resolution imx175_res_still[] = { + { + .desc = "CIF_strong_dvs_30fps", + .regs = imx_CIF_strong_dvs_30fps, + .width = 368, + .height = 304, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x11DB, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 261000, + }, + { + .desc = "VGA_strong_dvs_15fps", + .regs = imx_VGA_strong_dvs_15fps, + .width = 820, + .height = 616, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1C86, + .lines_per_frame = 0x079E, + }, + { + } + }, + .mipi_freq = 261500, + }, + { + .desc = "imx_STILL_720p_15fps", + .regs = imx_STILL_720p_15fps, + .width = 1568, + .height = 876, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1838, + .lines_per_frame = 0x08CA, + }, + { + } + }, + .mipi_freq = 261500, + }, + { + .desc = "STILL_2M_15fps", + .regs = imx_STILL_2M_15fps, + .width = 1640, + .height = 1232, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1646, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "1080p_strong_dvs_15fps", + .regs = imx_1080p_no_dvs_15fps, + .width = 1940, + .height = 1092, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x189C, + .lines_per_frame = 0x09A6, + }, + { + } + }, + .mipi_freq = 292500, + }, + { + .desc = "STILL_3M_15fps", + .regs = imx_STILL_3M_15fps, + .width = 2064, + .height = 1552, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1646, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_5M_15fps", + .regs = imx_STILL_5M_15fps, + .width = 2576, + .height = 1936, + .fps = 15, + .pixels_per_line = 0x1646, /* consistent with regs arrays */ + .lines_per_frame = 0x0BB8, /* consistent with regs arrays */ + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1646, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_6M_15fps", + .regs = imx_STILL_6M_15fps, + .width = 3280, + .height = 1852, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1646, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + .mipi_freq = 320000, + }, + { + .desc = "STILL_8M_15fps", + .regs = imx_STILL_8M_15fps, + .width = 3280, + .height = 2464, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 15, + .pixels_per_line = 0x1646, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + .mipi_freq = 320000, + }, +}; + +struct imx_resolution imx175_res_video[] = { + { + .desc = "QCIF_strong_dvs_30fps", + .regs = imx_QCIF_strong_dvs_30fps, + .width = 216, + .height = 176, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D70, + .lines_per_frame = 0x0548, + }, + { + } + }, + .mipi_freq = 174500, + }, + { + .desc = "QVGA_strong_dvs_30fps", + .regs = imx_QVGA_strong_dvs_30fps, + .width = 408, + .height = 308, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D70, + .lines_per_frame = 0x0548, + }, + { + } + }, + .mipi_freq = 174500, + }, + { + .desc = "VGA_strong_dvs_30fps", + .regs = imx_VGA_strong_dvs_30fps, + .width = 820, + .height = 616, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x1194, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 261500, + }, + { + .desc = "720p_strong_dvs_30fps", + .regs = imx_720p_strong_dvs_30fps, + .width = 1552, + .height = 880, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x139C, + .lines_per_frame = 0x0600, + }, + { + .fps = 60, + .pixels_per_line = 0xD70, + .lines_per_frame = 0x444, + }, + { + } + }, + .mipi_freq = 292500, + }, + { + .desc = "480p_strong_dvs_30fps", + .regs = imx_480p_strong_dvs_30fps, + .width = 880, + .height = 592, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x139C, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 292500, + }, + { + .desc = "WVGA_strong_dvs_30fps", + .regs = imx_WVGA_strong_dvs_30fps, + .width = 1640, + .height = 1024, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x139C, + .lines_per_frame = 0x0600, + }, + { + } + }, + .mipi_freq = 292500, + }, + { + .desc = "1080p_strong_dvs_30fps", + .regs = imx_1080p_strong_dvs_30fps, + .width = 2320, + .height = 1312, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x11C6, + .lines_per_frame = 0x06A4, + }, + { + } + }, + .mipi_freq = 292500, + }, +}; + +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/imx208.h b/drivers/staging/media/atomisp/i2c/imx/imx208.h new file mode 100644 index 0000000..fed387f --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx208.h @@ -0,0 +1,550 @@ +/* + * Support for Sony IMX camera sensor. + * + * Copyright (c) 2014 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#ifndef __IMX208_H__ +#define __IMX208_H__ +#include "common.h" + +/********************** settings for imx from vendor*********************/ +static struct imx_reg imx208_1080p_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0305, 0x02}, /* PREPLLCK DIV */ + {IMX_8BIT, 0x0307, 0x54}, /* PLL MPY */ + {IMX_8BIT, 0x303C, 0x3C}, /* PLL oscillation stable wait time */ + {IMX_8BIT, 0x30A4, 0x02}, /* Default */ + {IMX_8BIT, 0x0112, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0113, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0340, 0x04}, /* frame length line [15:8] */ + {IMX_8BIT, 0x0341, 0xAA}, /* frame length line [7:0] */ + {IMX_8BIT, 0x0342, 0x08}, /* line length pck [15:8] */ + {IMX_8BIT, 0x0343, 0xC8}, /* line length pck [7:0] */ + {IMX_8BIT, 0x0344, 0x00}, /* x_addr_start[12:8] */ + {IMX_8BIT, 0x0345, 0x00}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[12:8] */ + {IMX_8BIT, 0x0347, 0x00}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x07}, /* x_addr_end [12:8] */ + {IMX_8BIT, 0x0349, 0x8F}, /* x_addr_end [7:0] */ + {IMX_8BIT, 0x034A, 0x04}, /* y_addr_end [12:8] */ + {IMX_8BIT, 0x034B, 0x47}, /* y_addr_end [7:0] */ + {IMX_8BIT, 0x034C, 0x07}, /* x_output_size [ 12:8] */ + {IMX_8BIT, 0x034D, 0x90}, /* x_output_size [7:0] */ + {IMX_8BIT, 0x034E, 0x04}, /* y_output_size [11:8] */ + {IMX_8BIT, 0x034F, 0x48}, /* y_output_size [7:0] */ + {IMX_8BIT, 0x0381, 0x01}, /* x_even_inc */ + {IMX_8BIT, 0x0383, 0x01}, /* x_odd_inc */ + {IMX_8BIT, 0x0385, 0x01}, /* y_even_inc */ + {IMX_8BIT, 0x0387, 0x01}, /* y_odd_inc */ + {IMX_8BIT, 0x3048, 0x00}, /* VMODEFDS binning operation */ + {IMX_8BIT, 0x304E, 0x0A}, /* VTPXCK_DIV */ + {IMX_8BIT, 0x3050, 0x02}, /* OPSYCK_DIV */ + {IMX_8BIT, 0x309B, 0x00}, /* RGDAFDSUMEN */ + {IMX_8BIT, 0x30D5, 0x00}, /* HADDEN ( binning ) */ + {IMX_8BIT, 0x3301, 0x01}, /* RGLANESEL */ + {IMX_8BIT, 0x3318, 0x61}, /* MIPI Global Timing */ + {IMX_8BIT, 0x0202, 0x01}, /* coarse integration time */ + {IMX_8BIT, 0x0203, 0x90}, /* coarse integration time */ + {IMX_8BIT, 0x0205, 0x00}, /* ana global gain */ + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx208_1296x736_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0305, 0x02}, /* PREPLLCK DIV */ + {IMX_8BIT, 0x0307, 0x54}, /* PLL MPY */ + {IMX_8BIT, 0x303C, 0x3C}, /* PLL oscillation stable wait time */ + {IMX_8BIT, 0x30A4, 0x02}, /* Default */ + {IMX_8BIT, 0x0112, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0113, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0340, 0x04}, /* frame length line [15:8] */ + {IMX_8BIT, 0x0341, 0xAA}, /* frame length line [7:0] */ + {IMX_8BIT, 0x0342, 0x08}, /* line length pck [15:8] */ + {IMX_8BIT, 0x0343, 0xC8}, /* line length pck [7:0] */ + {IMX_8BIT, 0x0344, 0x01}, /* x_addr_start[12:8] */ + {IMX_8BIT, 0x0345, 0x40}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[12:8] */ + {IMX_8BIT, 0x0347, 0xB4}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x06}, /* x_addr_end [12:8] */ + {IMX_8BIT, 0x0349, 0x4F}, /* x_addr_end [7:0] */ + {IMX_8BIT, 0x034A, 0x03}, /* y_addr_end [12:8] */ + {IMX_8BIT, 0x034B, 0x93}, /* y_addr_end [7:0] */ + {IMX_8BIT, 0x034C, 0x05}, /* x_output_size [ 12:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size [7:0] */ + {IMX_8BIT, 0x034E, 0x02}, /* y_output_size [11:8] */ + {IMX_8BIT, 0x034F, 0xE0}, /* y_output_size [7:0] */ + {IMX_8BIT, 0x0381, 0x01}, /* x_even_inc */ + {IMX_8BIT, 0x0383, 0x01}, /* x_odd_inc */ + {IMX_8BIT, 0x0385, 0x01}, /* y_even_inc */ + {IMX_8BIT, 0x0387, 0x01}, /* y_odd_inc */ + {IMX_8BIT, 0x3048, 0x00}, /* VMODEFDS binning operation */ + {IMX_8BIT, 0x304E, 0x0A}, /* VTPXCK_DIV */ + {IMX_8BIT, 0x3050, 0x02}, /* OPSYCK_DIV */ + {IMX_8BIT, 0x309B, 0x00}, /* RGDAFDSUMEN */ + {IMX_8BIT, 0x30D5, 0x00}, /* HADDEN ( binning ) */ + {IMX_8BIT, 0x3301, 0x01}, /* RGLANESEL */ + {IMX_8BIT, 0x3318, 0x61}, /* MIPI Global Timing */ + {IMX_8BIT, 0x0202, 0x01}, /* coarse integration time */ + {IMX_8BIT, 0x0203, 0x90}, /* coarse integration time */ + {IMX_8BIT, 0x0205, 0x00}, /* ana global gain */ + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx208_1296x976_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0305, 0x02}, /* PREPLLCK DIV */ + {IMX_8BIT, 0x0307, 0x54}, /* PLL MPY */ + {IMX_8BIT, 0x303C, 0x3C}, /* PLL oscillation stable wait time */ + {IMX_8BIT, 0x30A4, 0x02}, /* Default */ + {IMX_8BIT, 0x0112, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0113, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0340, 0x04}, /* frame length line [15:8] */ + {IMX_8BIT, 0x0341, 0xAA}, /* frame length line [7:0] */ + {IMX_8BIT, 0x0342, 0x08}, /* line length pck [15:8] */ + {IMX_8BIT, 0x0343, 0xC8}, /* line length pck [7:0] */ + {IMX_8BIT, 0x0344, 0x01}, /* x_addr_start[12:8] */ + {IMX_8BIT, 0x0345, 0x40}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[12:8] */ + {IMX_8BIT, 0x0347, 0x3C}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x06}, /* x_addr_end [12:8] */ + {IMX_8BIT, 0x0349, 0x4F}, /* x_addr_end [7:0] */ + {IMX_8BIT, 0x034A, 0x04}, /* y_addr_end [12:8] */ + {IMX_8BIT, 0x034B, 0x0B}, /* y_addr_end [7:0] */ + {IMX_8BIT, 0x034C, 0x05}, /* x_output_size [ 12:8] */ + {IMX_8BIT, 0x034D, 0x10}, /* x_output_size [7:0] */ + {IMX_8BIT, 0x034E, 0x03}, /* y_output_size [11:8] */ + {IMX_8BIT, 0x034F, 0xD0}, /* y_output_size [7:0] */ + {IMX_8BIT, 0x0381, 0x01}, /* x_even_inc */ + {IMX_8BIT, 0x0383, 0x01}, /* x_odd_inc */ + {IMX_8BIT, 0x0385, 0x01}, /* y_even_inc */ + {IMX_8BIT, 0x0387, 0x01}, /* y_odd_inc */ + {IMX_8BIT, 0x3048, 0x00}, /* VMODEFDS binning operation */ + {IMX_8BIT, 0x304E, 0x0A}, /* VTPXCK_DIV */ + {IMX_8BIT, 0x3050, 0x02}, /* OPSYCK_DIV */ + {IMX_8BIT, 0x309B, 0x00}, /* RGDAFDSUMEN */ + {IMX_8BIT, 0x30D5, 0x00}, /* HADDEN ( binning ) */ + {IMX_8BIT, 0x3301, 0x01}, /* RGLANESEL */ + {IMX_8BIT, 0x3318, 0x61}, /* MIPI Global Timing */ + {IMX_8BIT, 0x0202, 0x01}, /* coarse integration time */ + {IMX_8BIT, 0x0203, 0x90}, /* coarse integration time */ + {IMX_8BIT, 0x0205, 0x00}, /* ana global gain */ + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx208_336x256_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0305, 0x02}, /* PREPLLCK DIV */ + {IMX_8BIT, 0x0307, 0x54}, /* PLL MPY */ + {IMX_8BIT, 0x303C, 0x3C}, /* PLL oscillation stable wait time */ + {IMX_8BIT, 0x30A4, 0x02}, /* Default */ + {IMX_8BIT, 0x0112, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0113, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0340, 0x04}, /* frame length line [15:8] */ + {IMX_8BIT, 0x0341, 0xAA}, /* frame length line [7:0] */ + {IMX_8BIT, 0x0342, 0x08}, /* line length pck [15:8] */ + {IMX_8BIT, 0x0343, 0xC8}, /* line length pck [7:0] */ + {IMX_8BIT, 0x0344, 0x02}, /* x_addr_start[12:8] */ + {IMX_8BIT, 0x0345, 0x78}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x01}, /* y_addr_start[12:8] */ + {IMX_8BIT, 0x0347, 0x24}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x05}, /* x_addr_end [12:8] */ + {IMX_8BIT, 0x0349, 0x17}, /* x_addr_end [7:0] */ + {IMX_8BIT, 0x034A, 0x03}, /* y_addr_end [12:8] */ + {IMX_8BIT, 0x034B, 0x23}, /* y_addr_end [7:0] */ + {IMX_8BIT, 0x034C, 0x01}, /* x_output_size [ 12:8] */ + {IMX_8BIT, 0x034D, 0x50}, /* x_output_size [7:0] */ + {IMX_8BIT, 0x034E, 0x01}, /* y_output_size [11:8] */ + {IMX_8BIT, 0x034F, 0x00}, /* y_output_size [7:0] */ + {IMX_8BIT, 0x0381, 0x01}, /* x_even_inc */ + {IMX_8BIT, 0x0383, 0x03}, /* x_odd_inc */ + {IMX_8BIT, 0x0385, 0x01}, /* y_even_inc */ + {IMX_8BIT, 0x0387, 0x03}, /* y_odd_inc */ + {IMX_8BIT, 0x3048, 0x01}, /* VMODEFDS binning operation */ + {IMX_8BIT, 0x304E, 0x0A}, /* VTPXCK_DIV */ + {IMX_8BIT, 0x3050, 0x02}, /* OPSYCK_DIV */ + {IMX_8BIT, 0x309B, 0x00}, /* RGDAFDSUMEN */ + {IMX_8BIT, 0x30D5, 0x03}, /* HADDEN ( binning ) */ + {IMX_8BIT, 0x3301, 0x01}, /* RGLANESEL */ + {IMX_8BIT, 0x3318, 0x66}, /* MIPI Global Timing */ + {IMX_8BIT, 0x0202, 0x01}, /* coarse integration time */ + {IMX_8BIT, 0x0203, 0x90}, /* coarse integration time */ + {IMX_8BIT, 0x0205, 0x00}, /* ana global gain */ + + {IMX_TOK_TERM, 0, 0}, +}; + +static struct imx_reg imx208_192x160_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0305, 0x02}, /* PREPLLCK DIV */ + {IMX_8BIT, 0x0307, 0x54}, /* PLL MPY */ + {IMX_8BIT, 0x303C, 0x3C}, /* PLL oscillation stable wait time */ + {IMX_8BIT, 0x30A4, 0x02}, /* Default */ + {IMX_8BIT, 0x0112, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0113, 0x0A}, /* CCP_data_format : RAW 10bit */ + {IMX_8BIT, 0x0340, 0x04}, /* frame length line [15:8] */ + {IMX_8BIT, 0x0341, 0xAA}, /* frame length line [7:0] */ + {IMX_8BIT, 0x0342, 0x08}, /* line length pck [15:8] */ + {IMX_8BIT, 0x0343, 0xC8}, /* line length pck [7:0] */ + {IMX_8BIT, 0x0344, 0x02}, /* x_addr_start[12:8] */ + {IMX_8BIT, 0x0345, 0x48}, /* x_addr_start[7:0] */ + {IMX_8BIT, 0x0346, 0x00}, /* y_addr_start[12:8] */ + {IMX_8BIT, 0x0347, 0xE4}, /* y_addr_start[7:0] */ + {IMX_8BIT, 0x0348, 0x05}, /* x_addr_end [12:8] */ + {IMX_8BIT, 0x0349, 0x47}, /* x_addr_end [7:0] */ + {IMX_8BIT, 0x034A, 0x03}, /* y_addr_end [12:8] */ + {IMX_8BIT, 0x034B, 0x63}, /* y_addr_end [7:0] */ + {IMX_8BIT, 0x034C, 0x00}, /* x_output_size [ 12:8] */ + {IMX_8BIT, 0x034D, 0xC0}, /* x_output_size [7:0] */ + {IMX_8BIT, 0x034E, 0x00}, /* y_output_size [11:8] */ + {IMX_8BIT, 0x034F, 0xA0}, /* y_output_size [7:0] */ + {IMX_8BIT, 0x0381, 0x03}, /* x_even_inc */ + {IMX_8BIT, 0x0383, 0x05}, /* x_odd_inc */ + {IMX_8BIT, 0x0385, 0x03}, /* y_even_inc */ + {IMX_8BIT, 0x0387, 0x05}, /* y_odd_inc */ + {IMX_8BIT, 0x3048, 0x01}, /* VMODEFDS binning operation */ + {IMX_8BIT, 0x304E, 0x0A}, /* VTPXCK_DIV */ + {IMX_8BIT, 0x3050, 0x02}, /* OPSYCK_DIV */ + {IMX_8BIT, 0x309B, 0x00}, /* RGDAFDSUMEN */ + {IMX_8BIT, 0x30D5, 0x03}, /* HADDEN ( binning ) */ + {IMX_8BIT, 0x3301, 0x11}, /* RGLANESEL */ + {IMX_8BIT, 0x3318, 0x74}, /* MIPI Global Timing */ + {IMX_8BIT, 0x0202, 0x01}, /* coarse integration time */ + {IMX_8BIT, 0x0203, 0x90}, /* coarse integration time */ + {IMX_8BIT, 0x0205, 0x00}, /* ana global gain */ + + {IMX_TOK_TERM, 0, 0}, +}; +/********************** settings for imx - reference *********************/ +static struct imx_reg const imx208_init_settings[] = { + { IMX_TOK_TERM, 0, 0} +}; + +struct imx_resolution imx208_res_preview[] = { + { + .desc = "imx208_1080p_30fps", + .regs = imx208_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x976_30fps", + .regs = imx208_1296x976_30fps, + .width = 1296, + .height = 976, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x736_30fps", + .regs = imx208_1296x736_30fps, + .width = 1296, + .height = 736, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_336x256_30fps", + .regs = imx208_336x256_30fps, + .width = 336, + .height = 256, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .skip_frames = 2, + .mipi_freq = 201600, + }, + { + .desc = "imx208_192x160_30fps", + .regs = imx208_192x160_30fps, + .width = 192, + .height = 160, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .skip_frames = 2, + .mipi_freq = 100800, + }, +}; + +struct imx_resolution imx208_res_still[] = { + { + .desc = "imx208_1080p_30fps", + .regs = imx208_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x976_30fps", + .regs = imx208_1296x976_30fps, + .width = 1296, + .height = 976, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x736_30fps", + .regs = imx208_1296x736_30fps, + .width = 1296, + .height = 736, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_336x256_30fps", + .regs = imx208_336x256_30fps, + .width = 336, + .height = 256, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .skip_frames = 2, + .mipi_freq = 201600, + }, + { + .desc = "imx208_192x160_30fps", + .regs = imx208_192x160_30fps, + .width = 192, + .height = 160, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .skip_frames = 2, + .mipi_freq = 100800, + }, +}; + +struct imx_resolution imx208_res_video[] = { + { + .desc = "imx208_1080p_30fps", + .regs = imx208_1080p_30fps, + .width = 1936, + .height = 1096, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x976_30fps", + .regs = imx208_1296x976_30fps, + .width = 1296, + .height = 976, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_1296x736_30fps", + .regs = imx208_1296x736_30fps, + .width = 1296, + .height = 736, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 1, + .bin_factor_y = 1, + .used = 0, + .skip_frames = 2, + .mipi_freq = 403200, + }, + { + .desc = "imx208_336x256_30fps", + .regs = imx208_336x256_30fps, + .width = 336, + .height = 256, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 2, + .bin_factor_y = 2, + .used = 0, + .skip_frames = 2, + .mipi_freq = 201600, + }, + { + .desc = "imx208_192x160_30fps", + .regs = imx208_192x160_30fps, + .width = 192, + .height = 160, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x08C8, + .lines_per_frame = 0x04AA, + }, + { + } + }, + .bin_factor_x = 4, + .bin_factor_y = 4, + .used = 0, + .skip_frames = 2, + .mipi_freq = 100800, + }, +}; +#endif + diff --git a/drivers/staging/media/atomisp/i2c/imx/imx219.h b/drivers/staging/media/atomisp/i2c/imx/imx219.h new file mode 100644 index 0000000..52df582 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx219.h @@ -0,0 +1,227 @@ +#ifndef __IMX219_H__ +#define __IMX219_H__ +#include "common.h" + +#define IMX219_FRAME_LENGTH_LINES 0x0160 +#define IMX219_LINE_LENGTH_PIXELS 0x0162 +#define IMX219_HORIZONTAL_START_H 0x0164 +#define IMX219_VERTICAL_START_H 0x0168 +#define IMX219_HORIZONTAL_END_H 0x0166 +#define IMX219_VERTICAL_END_H 0x016A +#define IMX219_HORIZONTAL_OUTPUT_SIZE_H 0x016c +#define IMX219_VERTICAL_OUTPUT_SIZE_H 0x016E +#define IMX219_COARSE_INTEGRATION_TIME 0x015A +#define IMX219_IMG_ORIENTATION 0x0172 +#define IMX219_GLOBAL_GAIN 0x0157 +#define IMX219_DGC_ADJ 0x0158 + +#define IMX219_DGC_LEN 4 + +/************************** settings for imx *************************/ +static struct imx_reg const imx219_STILL_8M_30fps[] = { + {IMX_8BIT, 0x30EB, 0x05}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x0C}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x300A, 0xFF}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x300B, 0xFF}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x05}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x09}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x0114, 0x03}, /*CSI_LANE_MODE[1:0}*/ + {IMX_8BIT, 0x0128, 0x00}, /*DPHY_CNTRL*/ + {IMX_8BIT, 0x012A, 0x13}, /*EXCK_FREQ[15:8]*/ + {IMX_8BIT, 0x012B, 0x34}, /*EXCK_FREQ[7:0]*/ + {IMX_8BIT, 0x0160, 0x0A}, /*FRM_LENGTH_A[15:8]*/ + {IMX_8BIT, 0x0161, 0x94}, /*FRM_LENGTH_A[7:0]*/ + {IMX_8BIT, 0x0162, 0x0D}, /*LINE_LENGTH_A[15:8]*/ + {IMX_8BIT, 0x0163, 0x78}, /*LINE_LENGTH_A[7:0]*/ + {IMX_8BIT, 0x0164, 0x00}, /*X_ADD_STA_A[11:8]*/ + {IMX_8BIT, 0x0165, 0x00}, /*X_ADD_STA_A[7:0]*/ + {IMX_8BIT, 0x0166, 0x0C}, /*X_ADD_END_A[11:8]*/ + {IMX_8BIT, 0x0167, 0xCF}, /*X_ADD_END_A[7:0]*/ + {IMX_8BIT, 0x0168, 0x00}, /*Y_ADD_STA_A[11:8]*/ + {IMX_8BIT, 0x0169, 0x00}, /*Y_ADD_STA_A[7:0]*/ + {IMX_8BIT, 0x016A, 0x09}, /*Y_ADD_END_A[11:8]*/ + {IMX_8BIT, 0x016B, 0x9F}, /*Y_ADD_END_A[7:0]*/ + {IMX_8BIT, 0x016C, 0x0C}, /*X_OUTPUT_SIZE_A[11:8]*/ + {IMX_8BIT, 0x016D, 0xD0}, /*X_OUTPUT_SIZE_A[7:0]*/ + {IMX_8BIT, 0x016E, 0x09}, /*Y_OUTPUT_SIZE_A[11:8]*/ + {IMX_8BIT, 0x016F, 0xA0}, /*Y_OUTPUT_SIZE_A[7:0]*/ + {IMX_8BIT, 0x0170, 0x01}, /*X_ODD_INC_A[2:0]*/ + {IMX_8BIT, 0x0171, 0x01}, /*Y_ODD_INC_A[2:0]*/ + {IMX_8BIT, 0x0174, 0x00}, /*BINNING_MODE_H_A*/ + {IMX_8BIT, 0x0175, 0x00}, /*BINNING_MODE_V_A*/ + {IMX_8BIT, 0x018C, 0x0A}, /*CSI_DATA_FORMAT_A[15:8]*/ + {IMX_8BIT, 0x018D, 0x0A}, /*CSI_DATA_FORMAT_A[7:0]*/ + {IMX_8BIT, 0x0301, 0x05}, /*VTPXCK_DIV*/ + {IMX_8BIT, 0x0303, 0x01}, /*VTSYCK_DIV*/ + {IMX_8BIT, 0x0304, 0x02}, /*PREPLLCK_VT_DIV[3:0]*/ + {IMX_8BIT, 0x0305, 0x02}, /*PREPLLCK_OP_DIV[3:0]*/ + {IMX_8BIT, 0x0306, 0x00}, /*PLL_VT_MPY[10:8]*/ + {IMX_8BIT, 0x0307, 0x49}, /*PLL_VT_MPY[7:0]*/ + {IMX_8BIT, 0x0309, 0x0A}, /*OPPXCK_DIV[4:0]*/ + {IMX_8BIT, 0x030B, 0x01}, /*OPSYCK_DIV*/ + {IMX_8BIT, 0x030C, 0x00}, /*PLL_OP_MPY[10:8]*/ + {IMX_8BIT, 0x030D, 0x4C}, /*PLL_OP_MPY[7:0]*/ + {IMX_8BIT, 0x4767, 0x0F}, /*CIS Tuning*/ + {IMX_8BIT, 0x4750, 0x14}, /*CIS Tuning*/ + {IMX_8BIT, 0x47B4, 0x14}, /*CIS Tuning*/ + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx219_STILL_6M_30fps[] = { + {IMX_8BIT, 0x30EB, 0x05}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x0C}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x300A, 0xFF}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x300B, 0xFF}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x05}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x30EB, 0x09}, /*Access Code for address over 0x3000*/ + {IMX_8BIT, 0x0114, 0x03}, /*CSI_LANE_MODE[1:0}*/ + {IMX_8BIT, 0x0128, 0x00}, /*DPHY_CNTRL*/ + {IMX_8BIT, 0x012A, 0x13}, /*EXCK_FREQ[15:8]*/ + {IMX_8BIT, 0x012B, 0x34}, /*EXCK_FREQ[7:0]*/ + {IMX_8BIT, 0x0160, 0x07}, /*FRM_LENGTH_A[15:8]*/ + {IMX_8BIT, 0x0161, 0x64}, /*FRM_LENGTH_A[7:0]*/ + {IMX_8BIT, 0x0162, 0x0D}, /*LINE_LENGTH_A[15:8]*/ + {IMX_8BIT, 0x0163, 0x78}, /*LINE_LENGTH_A[7:0]*/ + {IMX_8BIT, 0x0164, 0x00}, /*X_ADD_STA_A[11:8]*/ + {IMX_8BIT, 0x0165, 0x00}, /*X_ADD_STA_A[7:0]*/ + {IMX_8BIT, 0x0166, 0x0C}, /*X_ADD_END_A[11:8]*/ + {IMX_8BIT, 0x0167, 0xCF}, /*X_ADD_END_A[7:0]*/ + {IMX_8BIT, 0x0168, 0x01}, /*Y_ADD_STA_A[11:8]*/ + {IMX_8BIT, 0x0169, 0x32}, /*Y_ADD_STA_A[7:0]*/ + {IMX_8BIT, 0x016A, 0x08}, /*Y_ADD_END_A[11:8]*/ + {IMX_8BIT, 0x016B, 0x6D}, /*Y_ADD_END_A[7:0]*/ + {IMX_8BIT, 0x016C, 0x0C}, /*X_OUTPUT_SIZE_A[11:8]*/ + {IMX_8BIT, 0x016D, 0xD0}, /*X_OUTPUT_SIZE_A[7:0]*/ + {IMX_8BIT, 0x016E, 0x07}, /*Y_OUTPUT_SIZE_A[11:8]*/ + {IMX_8BIT, 0x016F, 0x3C}, /*Y_OUTPUT_SIZE_A[7:0]*/ + {IMX_8BIT, 0x0170, 0x01}, /*X_ODD_INC_A[2:0]*/ + {IMX_8BIT, 0x0171, 0x01}, /*Y_ODD_INC_A[2:0]*/ + {IMX_8BIT, 0x0174, 0x00}, /*BINNING_MODE_H_A*/ + {IMX_8BIT, 0x0175, 0x00}, /*BINNING_MODE_V_A*/ + {IMX_8BIT, 0x018C, 0x0A}, /*CSI_DATA_FORMAT_A[15:8]*/ + {IMX_8BIT, 0x018D, 0x0A}, /*CSI_DATA_FORMAT_A[7:0]*/ + {IMX_8BIT, 0x0301, 0x05}, /*VTPXCK_DIV*/ + {IMX_8BIT, 0x0303, 0x01}, /*VTSYCK_DIV*/ + {IMX_8BIT, 0x0304, 0x02}, /*PREPLLCK_VT_DIV[3:0]*/ + {IMX_8BIT, 0x0305, 0x02}, /*PREPLLCK_OP_DIV[3:0]*/ + {IMX_8BIT, 0x0306, 0x00}, /*PLL_VT_MPY[10:8]*/ + {IMX_8BIT, 0x0307, 0x33}, /*PLL_VT_MPY[7:0]*/ + {IMX_8BIT, 0x0309, 0x0A}, /*OPPXCK_DIV[4:0]*/ + {IMX_8BIT, 0x030B, 0x01}, /*OPSYCK_DIV*/ + {IMX_8BIT, 0x030C, 0x00}, /*PLL_OP_MPY[10:8]*/ + {IMX_8BIT, 0x030D, 0x36}, /*PLL_OP_MPY[7:0]*/ + {IMX_8BIT, 0x4767, 0x0F}, /*CIS Tuning*/ + {IMX_8BIT, 0x4750, 0x14}, /*CIS Tuning*/ + {IMX_8BIT, 0x47B4, 0x14}, /*CIS Tuning*/ + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx219_init_settings[] = { + {IMX_TOK_TERM, 0, 0} +}; + +struct imx_resolution imx219_res_preview[] = { + { + .desc = "STILL_6M_30fps", + .regs = imx219_STILL_6M_30fps, + .width = 3280, + .height = 1852, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D78, + .lines_per_frame = 0x0764, + }, + { + } + }, + .mipi_freq = 259000, + }, + { + .desc = "STILL_8M_30fps", + .regs = imx219_STILL_8M_30fps, + .width = 3280, + .height = 2464, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D78, + .lines_per_frame = 0x0A94, + }, + { + } + }, + .mipi_freq = 365000, + }, +}; + +struct imx_resolution imx219_res_still[] = { + { + .desc = "STILL_6M_30fps", + .regs = imx219_STILL_6M_30fps, + .width = 3280, + .height = 1852, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D78, + .lines_per_frame = 0x0764, + }, + { + } + }, + .mipi_freq = 259000, + }, + { + .desc = "STILL_8M_30fps", + .regs = imx219_STILL_8M_30fps, + .width = 3280, + .height = 2464, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D78, + .lines_per_frame = 0x0A94, + }, + { + } + }, + .mipi_freq = 365000, + }, +}; + +struct imx_resolution imx219_res_video[] = { + { + .desc = "STILL_6M_30fps", + .regs = imx219_STILL_6M_30fps, + .width = 3280, + .height = 1852, + .bin_factor_x = 0, + .bin_factor_y = 0, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0D78, + .lines_per_frame = 0x0764, + }, + { + } + }, + .mipi_freq = 259000, + }, +}; + +#endif diff --git a/drivers/staging/media/atomisp/i2c/imx/imx227.h b/drivers/staging/media/atomisp/i2c/imx/imx227.h new file mode 100644 index 0000000..10e5b86 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/imx227.h @@ -0,0 +1,726 @@ +#ifndef __IMX227_H__ +#define __IMX227_H__ + +#include "common.h" + +#define IMX227_EMBEDDED_DATA_LINE_NUM 2 +#define IMX227_OUTPUT_DATA_FORMAT_REG 0x0112 +#define IMX227_OUTPUT_FORMAT_RAW10 0x0a0a + +/* AE Bracketing Registers */ +#define IMX227_BRACKETING_LUT_MODE_BIT_CONTINUE_STREAMING 0x1 +#define IMX227_BRACKETING_LUT_MODE_BIT_LOOP_MODE 0x2 + +#define IMX227_BRACKETING_LUT_CONTROL 0x0E00 +#define IMX227_BRACKETING_LUT_MODE 0x0E01 +#define IMX227_BRACKETING_LUT_ENTRY_CONTROL 0x0E02 + +/* + * The imx135 embedded data info: + * embedded data line num: 2 + * line 0 effective data size(byte): 76 + * line 1 effective data size(byte): 113 + */ +static const uint32_t +imx227_embedded_effective_size[IMX227_EMBEDDED_DATA_LINE_NUM] = {160, 62}; + +/************************** settings for imx *************************/ +/* Full Output Mode */ +static struct imx_reg const imx_STILL_6_5M_25fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x6259, 0x06}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xd0}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* 4:3 Output Mode */ +static struct imx_reg const imx_STILL_5_5M_3X4_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0xb0}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x00}, + {IMX_8BIT, 0x0348, 0x08}, + {IMX_8BIT, 0x0349, 0xaf}, + {IMX_8BIT, 0x034a, 0x0a}, + {IMX_8BIT, 0x034b, 0x9f}, + {IMX_8BIT, 0x034c, 0x08}, + {IMX_8BIT, 0x034d, 0x00}, + {IMX_8BIT, 0x034e, 0x0a}, + {IMX_8BIT, 0x034f, 0xa0}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xd8}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* Square Output Mode */ +static struct imx_reg const imx_STILL_5_7M_1X1_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0344, 0x00}, + {IMX_8BIT, 0x0345, 0x00}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0xa0}, + {IMX_8BIT, 0x0348, 0x09}, + {IMX_8BIT, 0x0349, 0x5f}, + {IMX_8BIT, 0x034a, 0x09}, + {IMX_8BIT, 0x034b, 0xff}, + {IMX_8BIT, 0x034c, 0x09}, + {IMX_8BIT, 0x034d, 0x60}, + {IMX_8BIT, 0x034e, 0x09}, + {IMX_8BIT, 0x034f, 0x60}, + + {IMX_8BIT, 0x6259, 0x06}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xd4}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* Full Frame 1080P Mode (use ISP scaler)*/ +static struct imx_reg const imx_VIDEO_4M_9X16_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xdc}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* Cropped 1080P Mode */ +static struct imx_reg const imx_VIDEO_2M_9X16_45fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0112, 0x0a}, + {IMX_8BIT, 0x0113, 0x0a}, + {IMX_8BIT, 0x0344, 0x02}, + {IMX_8BIT, 0x0345, 0x8a}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0x88}, + {IMX_8BIT, 0x0348, 0x06}, + {IMX_8BIT, 0x0349, 0xd1}, + {IMX_8BIT, 0x034a, 0x09}, + {IMX_8BIT, 0x034b, 0x17}, + {IMX_8BIT, 0x034c, 0x04}, + {IMX_8BIT, 0x034d, 0x48}, + {IMX_8BIT, 0x034e, 0x07}, + {IMX_8BIT, 0x034f, 0x90}, + + {IMX_8BIT, 0x0380, 0x00}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0382, 0x00}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0384, 0x00}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0386, 0x00}, + {IMX_8BIT, 0x0387, 0x01}, + + {IMX_8BIT, 0x0408, 0x00}, + {IMX_8BIT, 0x0409, 0x00}, + {IMX_8BIT, 0x040a, 0x00}, + {IMX_8BIT, 0x040b, 0x00}, + {IMX_8BIT, 0x040c, 0x04}, + {IMX_8BIT, 0x040d, 0x48}, + {IMX_8BIT, 0x040e, 0x07}, + {IMX_8BIT, 0x040f, 0x90}, + + {IMX_8BIT, 0x0900, 0x00}, + {IMX_8BIT, 0x0901, 0x00}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xdc}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3c}, /* preset_en */ + + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* Moment mode */ +static struct imx_reg const imx_VIDEO_1_3M_3X4_60fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xd9}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* High Speed 3:4 mode */ +static struct imx_reg const imx_VIDEO_VGA_3X4_120fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x9004, 0xca}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3f}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + + +/* Binned 720P mode */ +static struct imx_reg const imx_VIDEO_1M_9X16_60fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0112, 0x0a}, + {IMX_8BIT, 0x0113, 0x0a}, + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0xd0}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x40}, + {IMX_8BIT, 0x0348, 0x07}, + {IMX_8BIT, 0x0349, 0x8f}, + {IMX_8BIT, 0x034a, 0x0a}, + {IMX_8BIT, 0x034b, 0x5f}, + {IMX_8BIT, 0x034c, 0x02}, + {IMX_8BIT, 0x034d, 0xe0}, + {IMX_8BIT, 0x034e, 0x05}, + {IMX_8BIT, 0x034f, 0x10}, + + {IMX_8BIT, 0x0380, 0x00}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0382, 0x00}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0384, 0x00}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0386, 0x00}, + {IMX_8BIT, 0x0387, 0x01}, + + {IMX_8BIT, 0x0408, 0x00}, + {IMX_8BIT, 0x0409, 0x00}, + {IMX_8BIT, 0x040a, 0x00}, + {IMX_8BIT, 0x040b, 0x00}, + {IMX_8BIT, 0x040c, 0x02}, + {IMX_8BIT, 0x040d, 0xe0}, + {IMX_8BIT, 0x040e, 0x05}, + {IMX_8BIT, 0x040f, 0x10}, + + {IMX_8BIT, 0x0900, 0x01}, + {IMX_8BIT, 0x0901, 0x22}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xdd}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3c}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +/* Binned 496x868 mode */ +static struct imx_reg const imx_VIDEO_496x868_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0112, 0x0a}, + {IMX_8BIT, 0x0113, 0x0a}, + {IMX_8BIT, 0x0344, 0x02}, + {IMX_8BIT, 0x0345, 0xc0}, + {IMX_8BIT, 0x0346, 0x01}, + {IMX_8BIT, 0x0347, 0xec}, + {IMX_8BIT, 0x0348, 0x06}, + {IMX_8BIT, 0x0349, 0x9f}, + {IMX_8BIT, 0x034a, 0x08}, + {IMX_8BIT, 0x034b, 0xb3}, + {IMX_8BIT, 0x034c, 0x01}, + {IMX_8BIT, 0x034d, 0xf0}, + {IMX_8BIT, 0x034e, 0x03}, + {IMX_8BIT, 0x034f, 0x64}, + + {IMX_8BIT, 0x0380, 0x00}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0382, 0x00}, + {IMX_8BIT, 0x0383, 0x01}, + {IMX_8BIT, 0x0384, 0x00}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0386, 0x00}, + {IMX_8BIT, 0x0387, 0x01}, + + {IMX_8BIT, 0x0408, 0x00}, + {IMX_8BIT, 0x0409, 0x00}, + {IMX_8BIT, 0x040a, 0x00}, + {IMX_8BIT, 0x040b, 0x00}, + {IMX_8BIT, 0x040c, 0x01}, + {IMX_8BIT, 0x040d, 0xf0}, + {IMX_8BIT, 0x040e, 0x03}, + {IMX_8BIT, 0x040f, 0x64}, + + {IMX_8BIT, 0x0900, 0x01}, + {IMX_8BIT, 0x0901, 0x22}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xdd}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3c}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + + +/* Hangout mode */ +static struct imx_reg const imx_PREVIEW_374X652_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0112, 0x0a}, + {IMX_8BIT, 0x0113, 0x0a}, + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0xc0}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x30}, + {IMX_8BIT, 0x0348, 0x07}, + {IMX_8BIT, 0x0349, 0x9f}, + {IMX_8BIT, 0x034a, 0x0a}, + {IMX_8BIT, 0x034b, 0x6f}, + {IMX_8BIT, 0x034c, 0x01}, + {IMX_8BIT, 0x034d, 0x78}, + {IMX_8BIT, 0x034e, 0x02}, + {IMX_8BIT, 0x034f, 0x90}, + + {IMX_8BIT, 0x0380, 0x00}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0382, 0x00}, + {IMX_8BIT, 0x0383, 0x03}, + {IMX_8BIT, 0x0384, 0x00}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0386, 0x00}, + {IMX_8BIT, 0x0387, 0x03}, + + {IMX_8BIT, 0x0408, 0x00}, + {IMX_8BIT, 0x0409, 0x00}, + {IMX_8BIT, 0x040a, 0x00}, + {IMX_8BIT, 0x040b, 0x02}, + {IMX_8BIT, 0x040c, 0x01}, + {IMX_8BIT, 0x040d, 0x76}, + {IMX_8BIT, 0x040e, 0x02}, + {IMX_8BIT, 0x040f, 0x8c}, + + {IMX_8BIT, 0x0900, 0x01}, + {IMX_8BIT, 0x0901, 0x22}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xde}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3c}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + +static struct imx_reg const imx_VIDEO_NHD_9X16_30fps[] = { + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0112, 0x0a}, + {IMX_8BIT, 0x0113, 0x0a}, + {IMX_8BIT, 0x0344, 0x01}, + {IMX_8BIT, 0x0345, 0xc0}, + {IMX_8BIT, 0x0346, 0x00}, + {IMX_8BIT, 0x0347, 0x30}, + {IMX_8BIT, 0x0348, 0x07}, + {IMX_8BIT, 0x0349, 0x9f}, + {IMX_8BIT, 0x034a, 0x0a}, + {IMX_8BIT, 0x034b, 0x6f}, + {IMX_8BIT, 0x034c, 0x01}, + {IMX_8BIT, 0x034d, 0x78}, + {IMX_8BIT, 0x034e, 0x02}, + {IMX_8BIT, 0x034f, 0x90}, + + {IMX_8BIT, 0x0380, 0x00}, + {IMX_8BIT, 0x0381, 0x01}, + {IMX_8BIT, 0x0382, 0x00}, + {IMX_8BIT, 0x0383, 0x03}, + {IMX_8BIT, 0x0384, 0x00}, + {IMX_8BIT, 0x0385, 0x01}, + {IMX_8BIT, 0x0386, 0x00}, + {IMX_8BIT, 0x0387, 0x03}, + + {IMX_8BIT, 0x0408, 0x00}, + {IMX_8BIT, 0x0409, 0x00}, + {IMX_8BIT, 0x040a, 0x00}, + {IMX_8BIT, 0x040b, 0x00}, + {IMX_8BIT, 0x040c, 0x01}, + {IMX_8BIT, 0x040d, 0x78}, + {IMX_8BIT, 0x040e, 0x02}, + {IMX_8BIT, 0x040f, 0x90}, + + {IMX_8BIT, 0x0900, 0x01}, + {IMX_8BIT, 0x0901, 0x22}, + + {IMX_8BIT, 0x6259, 0x05}, /* latency ctrl */ + {IMX_8BIT, 0x9004, 0xde}, /* preset_sel */ + {IMX_8BIT, 0x9005, 0x3c}, /* preset_en */ + {IMX_8BIT, 0x0136, 0x13}, + {IMX_8BIT, 0x0137, 0x33}, + {IMX_TOK_TERM, 0, 0} +}; + + +static struct imx_reg const imx227_init_settings[] = { + {IMX_8BIT, 0x0100, 0x00}, /* mode_select */ + GROUPED_PARAMETER_HOLD_ENABLE, + {IMX_8BIT, 0x0306, 0x00}, + {IMX_8BIT, 0x0307, 0xBB}, + {IMX_8BIT, 0x030E, 0x03}, + {IMX_8BIT, 0x030F, 0x0D}, + {IMX_8BIT, 0x463b, 0x30}, + {IMX_8BIT, 0x463e, 0x05}, + {IMX_8BIT, 0x4612, 0x66}, + {IMX_8BIT, 0x4815, 0x65}, + {IMX_8BIT, 0x4991, 0x00}, + {IMX_8BIT, 0x4992, 0x01}, + {IMX_8BIT, 0x4993, 0xff}, + {IMX_8BIT, 0x458b, 0x00}, + {IMX_8BIT, 0x452a, 0x02}, + {IMX_8BIT, 0x4a7c, 0x00}, + {IMX_8BIT, 0x4a7d, 0x1c}, + {IMX_8BIT, 0x4a7e, 0x00}, + {IMX_8BIT, 0x4a7f, 0x17}, + {IMX_8BIT, 0x462C, 0x2E}, + {IMX_8BIT, 0x461B, 0x28}, + {IMX_8BIT, 0x4663, 0x29}, + {IMX_8BIT, 0x461A, 0x7C}, + {IMX_8BIT, 0x4619, 0x28}, + {IMX_8BIT, 0x4667, 0x22}, + {IMX_8BIT, 0x466B, 0x23}, + {IMX_8BIT, 0x40AD, 0xFF}, + {IMX_8BIT, 0x40BE, 0x00}, + {IMX_8BIT, 0x40BF, 0x6E}, + {IMX_8BIT, 0x40CE, 0x00}, + {IMX_8BIT, 0x40CF, 0x0A}, + {IMX_8BIT, 0x40CA, 0x00}, + {IMX_8BIT, 0x40CB, 0x1F}, + {IMX_8BIT, 0x4D16, 0x00}, + {IMX_8BIT, 0x6204, 0x01}, + {IMX_8BIT, 0x6209, 0x00}, + {IMX_8BIT, 0x621F, 0x01}, + {IMX_8BIT, 0x621E, 0x10}, + GROUPED_PARAMETER_HOLD_DISABLE, + {IMX_TOK_TERM, 0, 0} +}; + +/* TODO settings of preview/still/video will be updated with new use case */ +struct imx_resolution imx227_res_preview[] = { + { + .desc = "imx_PREVIEW_374X652_30fps", + .regs = imx_PREVIEW_374X652_30fps, + .width = 374, + .height = 652, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C0A, + }, + { + } + }, + }, + { + .desc = "imx_VIDEO_496x868_30fps", + .regs = imx_VIDEO_496x868_30fps, + .width = 496, + .height = 868, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C08, + }, + { + } + }, + }, + { + .desc = "imx_STILL_5_5M_3X4_30fps", + .regs = imx_STILL_5_5M_3X4_30fps, + .width = 2048, + .height = 2720, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0ED8, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + + }, + { + .desc = "imx_STILL_5_7M_1X1_30fps", + .regs = imx_STILL_5_7M_1X1_30fps, + .width = 2400, + .height = 2400, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x1130, + .lines_per_frame = 0x0A1E, + }, + { + } + }, + + }, + { + .desc = "imx_STILL_6_5M_25fps", + .regs = imx_STILL_6_5M_25fps, + .width = 2400, + .height = 2720, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 25, + .pixels_per_line = 0x1130, + .lines_per_frame = 0x0C24, + }, + { + } + }, + } +}; + +struct imx_resolution imx227_res_still[] = { + { + .desc = "imx_STILL_5_5M_3X4_30fps", + .regs = imx_STILL_5_5M_3X4_30fps, + .width = 2048, + .height = 2720, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 6, + .pixels_per_line = 0x2130, + .lines_per_frame = 0x1A22, + }, + { + .fps = 30, + .pixels_per_line = 0x0ED8, + .lines_per_frame = 0x0BB8, + }, + { + } + }, + + }, + { + .desc = "imx_STILL_5_7M_1X1_30fps", + .regs = imx_STILL_5_7M_1X1_30fps, + .width = 2400, + .height = 2400, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 6, + .pixels_per_line = 0x266E, + .lines_per_frame = 0x1704, + }, + { + .fps = 30, + .pixels_per_line = 0x1130, + .lines_per_frame = 0x0A1E, + }, + { + } + }, + + }, + { + .desc = "imx_STILL_6_5M_25fps", + .regs = imx_STILL_6_5M_25fps, + .width = 2400, + .height = 2720, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 25, + .pixels_per_line = 0x1130, + .lines_per_frame = 0x0C24, + }, + { + } + }, + }, +}; + +struct imx_resolution imx227_res_video[] = { + { + .desc = "imx_VIDEO_4M_9X16_30fps", + .regs = imx_VIDEO_4M_9X16_30fps, + .width = 1536, + .height = 2720, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C08, + }, + { + } + }, + + }, + { + .desc = "imx_VIDEO_2M_9X16_45fps", + .regs = imx_VIDEO_2M_9X16_45fps, + .width = 1096, + .height = 1936, + .bin_factor_x = 0, + .bin_factor_y = 0, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C08, + }, + { + .fps = 45, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0800, + }, + { + } + }, + + }, + { + .desc = "imx_VIDEO_1_3M_3X4_60fps", + .regs = imx_VIDEO_1_3M_3X4_60fps, + .width = 1024, + .height = 1360, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 60, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0604, + }, + { + } + }, + }, + { + .desc = "imx_VIDEO_496x868_30fps", + .regs = imx_VIDEO_496x868_30fps, + .width = 496, + .height = 868, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C08, + }, + { + } + }, + }, + { + .desc = "imx_VIDEO_1M_9X16_60fps", + .regs = imx_VIDEO_1M_9X16_60fps, + .width = 736, + .height = 1296, + .bin_factor_x = 1, + .bin_factor_y = 1, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 60, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0604, + }, + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C10, + }, + { + } + }, + }, + { + .desc = "imx_VIDEO_VGA_3X4_120fps", + .regs = imx_VIDEO_VGA_3X4_120fps, + .width = 512, + .height = 680, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 120, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0302, + }, + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C08, + }, + { + } + }, + }, + { + .desc = "imx_VIDEO_NHD_9X16_30fps", + .regs = imx_VIDEO_NHD_9X16_30fps, + .width = 376, + .height = 656, + .bin_factor_x = 2, + .bin_factor_y = 2, + .mipi_freq = 499000, + .used = 0, + .fps_options = { + { + .fps = 30, + .pixels_per_line = 0x0E70, + .lines_per_frame = 0x0C0A, + }, + { + } + }, + }, +}; + +#endif /* __IMX227_H__ */ diff --git a/drivers/staging/media/atomisp/i2c/imx/otp.c b/drivers/staging/media/atomisp/i2c/imx/otp.c new file mode 100644 index 0000000..4622750 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/otp.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2013 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <linux/device.h> +#include <linux/errno.h> +#include <linux/i2c.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/string.h> +#include <linux/types.h> +#include <media/v4l2-device.h> + +void *dummy_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u8 *buf; + + buf = devm_kzalloc(&client->dev, size, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + + return buf; +} diff --git a/drivers/staging/media/atomisp/i2c/imx/otp_brcc064_e2prom.c b/drivers/staging/media/atomisp/i2c/imx/otp_brcc064_e2prom.c new file mode 100644 index 0000000..b11f90c --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/otp_brcc064_e2prom.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2013 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <linux/string.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include "common.h" + +/* + * Read EEPROM data from brcc064 and store + * it into a kmalloced buffer. On error return NULL. + * @size: set to the size of the returned EEPROM data. + */ +void *brcc064_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + unsigned int e2prom_i2c_addr = dev_addr >> 1; + static const unsigned int max_read_size = 30; + int addr; + u32 s_addr = start_addr & E2PROM_ADDR_MASK; + unsigned char *buffer; + + buffer = devm_kzalloc(&client->dev, size, GFP_KERNEL); + if (!buffer) + return NULL; + + for (addr = s_addr; addr < size; addr += max_read_size) { + struct i2c_msg msg[2]; + unsigned int i2c_addr = e2prom_i2c_addr; + u16 addr_buf; + int r; + + msg[0].flags = 0; + msg[0].addr = i2c_addr; + addr_buf = cpu_to_be16(addr & 0xFFFF); + msg[0].len = 2; + msg[0].buf = (u8 *)&addr_buf; + + msg[1].addr = i2c_addr; + msg[1].flags = I2C_M_RD; + msg[1].len = min(max_read_size, size - addr); + msg[1].buf = &buffer[addr]; + + r = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (r != ARRAY_SIZE(msg)) { + dev_err(&client->dev, "read failed at 0x%03x\n", addr); + return NULL; + } + } + return buffer; + +} + + diff --git a/drivers/staging/media/atomisp/i2c/imx/otp_e2prom.c b/drivers/staging/media/atomisp/i2c/imx/otp_e2prom.c new file mode 100644 index 0000000..73d041f --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/otp_e2prom.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2013 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/slab.h> +#include <linux/string.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include "common.h" + +/* + * Read EEPROM data from the gerneral e2prom chip(eg. + * CAT24C08, CAT24C128, le24l042cs, and store + * it into a kmalloced buffer. On error return NULL. + * @size: set to the size of the returned EEPROM data. + */ +void *e2prom_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + unsigned int e2prom_i2c_addr = dev_addr >> 1; + static const unsigned int max_read_size = 30; + int addr; + u32 s_addr = start_addr & E2PROM_ADDR_MASK; + bool two_addr = (start_addr & E2PROM_2ADDR) >> 31; + char *buffer; + + buffer = devm_kzalloc(&client->dev, size, GFP_KERNEL); + if (!buffer) + return NULL; + + for (addr = s_addr; addr < size; addr += max_read_size) { + struct i2c_msg msg[2]; + unsigned int i2c_addr = e2prom_i2c_addr; + u16 addr_buf; + int r; + + msg[0].flags = 0; + if (two_addr) { + msg[0].addr = i2c_addr; + addr_buf = cpu_to_be16(addr & 0xFFFF); + msg[0].len = 2; + msg[0].buf = (u8 *)&addr_buf; + } else { + i2c_addr |= (addr >> 8) & 0x7; + msg[0].addr = i2c_addr; + addr_buf = addr & 0xFF; + msg[0].len = 1; + msg[0].buf = (u8 *)&addr_buf; + } + + msg[1].addr = i2c_addr; + msg[1].flags = I2C_M_RD; + msg[1].len = min(max_read_size, size - addr); + msg[1].buf = &buffer[addr]; + + r = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (r != ARRAY_SIZE(msg)) { + dev_err(&client->dev, "read failed at 0x%03x\n", addr); + return NULL; + } + } + return buffer; +} + + diff --git a/drivers/staging/media/atomisp/i2c/imx/otp_imx.c b/drivers/staging/media/atomisp/i2c/imx/otp_imx.c new file mode 100644 index 0000000..1ca27c2 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/otp_imx.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2013 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <linux/bitops.h> +#include <linux/device.h> +#include <linux/delay.h> +#include <linux/errno.h> +#include <linux/fs.h> +#include <linux/init.h> +#include <linux/i2c.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include <asm/intel-mid.h> +#include "common.h" + +/* Defines for OTP Data Registers */ +#define IMX_OTP_START_ADDR 0x3B04 +#define IMX_OTP_PAGE_SIZE 64 +#define IMX_OTP_READY_REG 0x3B01 +#define IMX_OTP_PAGE_REG 0x3B02 +#define IMX_OTP_MODE_REG 0x3B00 +#define IMX_OTP_PAGE_MAX 20 +#define IMX_OTP_READY_REG_DONE 1 +#define IMX_OTP_READ_ONETIME 32 +#define IMX_OTP_MODE_READ 1 +#define IMX227_OTP_START_ADDR 0x0A04 +#define IMX227_OTP_ENABLE_REG 0x0A00 +#define IMX227_OTP_READY_REG 0x0A01 +#define IMX227_OTP_PAGE_REG 0x0A02 +#define IMX227_OTP_READY_REG_DONE 1 +#define IMX227_OTP_MODE_READ 1 + +static int +imx_read_otp_data(struct i2c_client *client, u16 len, u16 reg, void *val) +{ + struct i2c_msg msg[2]; + u16 data[IMX_SHORT_MAX] = { 0 }; + int err; + + if (len > IMX_BYTE_MAX) { + dev_err(&client->dev, "%s error, invalid data length\n", + __func__); + return -EINVAL; + } + + memset(msg, 0 , sizeof(msg)); + memset(data, 0 , sizeof(data)); + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = I2C_MSG_LENGTH; + msg[0].buf = (u8 *)data; + /* high byte goes first */ + data[0] = cpu_to_be16(reg); + + msg[1].addr = client->addr; + msg[1].len = len; + msg[1].flags = I2C_M_RD; + msg[1].buf = (u8 *)data; + + err = i2c_transfer(client->adapter, msg, 2); + if (err != 2) { + if (err >= 0) + err = -EIO; + goto error; + } + + memcpy(val, data, len); + return 0; + +error: + dev_err(&client->dev, "read from offset 0x%x error %d", reg, err); + return err; +} + +static int imx_read_otp_reg_array(struct i2c_client *client, u16 size, u16 addr, + u8 *buf) +{ + u16 index; + int ret; + + for (index = 0; index + IMX_OTP_READ_ONETIME <= size; + index += IMX_OTP_READ_ONETIME) { + ret = imx_read_otp_data(client, IMX_OTP_READ_ONETIME, + addr + index, &buf[index]); + if (ret) + return ret; + } + return 0; +} + +void *imx_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u8 *buf; + int ret; + int i; + + buf = devm_kzalloc(&client->dev, size, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + + for (i = 0; i < IMX_OTP_PAGE_MAX; i++) { + + /*set page NO.*/ + ret = imx_write_reg(client, IMX_8BIT, + IMX_OTP_PAGE_REG, i & 0xff); + if (ret) + goto fail; + + /*set read mode*/ + ret = imx_write_reg(client, IMX_8BIT, + IMX_OTP_MODE_REG, IMX_OTP_MODE_READ); + if (ret) + goto fail; + + /* Reading the OTP data array */ + ret = imx_read_otp_reg_array(client, IMX_OTP_PAGE_SIZE, + IMX_OTP_START_ADDR, buf + i * IMX_OTP_PAGE_SIZE); + if (ret) + goto fail; + } + + return buf; +fail: + /* Driver has failed to find valid data */ + dev_err(&client->dev, "sensor found no valid OTP data\n"); + return ERR_PTR(ret); +} + +void *imx227_otp_read(struct v4l2_subdev *sd, u8 dev_addr, + u32 start_addr, u32 size) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + u8 *buf; + int ret; + int i; + + buf = devm_kzalloc(&client->dev, size, GFP_KERNEL); + if (!buf) + return ERR_PTR(-ENOMEM); + + for (i = 0; i < IMX_OTP_PAGE_MAX; i++) { + + /*set page NO.*/ + ret = imx_write_reg(client, IMX_8BIT, + IMX227_OTP_PAGE_REG, i & 0xff); + if (ret) + goto fail; + + /*set read mode*/ + ret = imx_write_reg(client, IMX_8BIT, + IMX227_OTP_ENABLE_REG, IMX227_OTP_MODE_READ); + if (ret) + goto fail; + + /* Reading the OTP data array */ + ret = imx_read_otp_reg_array(client, IMX_OTP_PAGE_SIZE, + IMX227_OTP_START_ADDR, buf + i * IMX_OTP_PAGE_SIZE); + if (ret) + goto fail; + } + + return buf; +fail: + /* Driver has failed to find valid data */ + dev_err(&client->dev, "sensor found no valid OTP data\n"); + return ERR_PTR(ret); +} + diff --git a/drivers/staging/media/atomisp/i2c/imx/vcm.c b/drivers/staging/media/atomisp/i2c/imx/vcm.c new file mode 100644 index 0000000..2d2df04 --- /dev/null +++ b/drivers/staging/media/atomisp/i2c/imx/vcm.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2012 Intel Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version + * 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/types.h> +#include <media/v4l2-device.h> +#include "../../include/linux/atomisp_platform.h" + +int vcm_power_up(struct v4l2_subdev *sd) +{ + const struct camera_af_platform_data *vcm_platform_data; + + vcm_platform_data = camera_get_af_platform_data(); + if (NULL == vcm_platform_data) + return -ENODEV; + /* Enable power */ + return vcm_platform_data->power_ctrl(sd, 1); +} + +int vcm_power_down(struct v4l2_subdev *sd) +{ + const struct camera_af_platform_data *vcm_platform_data; + + vcm_platform_data = camera_get_af_platform_data(); + if (NULL == vcm_platform_data) + return -ENODEV; + return vcm_platform_data->power_ctrl(sd, 0); +} + |