^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <media/v4l2-fwnode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define IMX319_REG_MODE_SELECT 0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define IMX319_MODE_STANDBY 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define IMX319_MODE_STREAMING 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* Chip ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define IMX319_REG_CHIP_ID 0x0016
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define IMX319_CHIP_ID 0x0319
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* V_TIMING internal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define IMX319_REG_FLL 0x0340
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define IMX319_FLL_MAX 0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* Exposure control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define IMX319_REG_EXPOSURE 0x0202
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define IMX319_EXPOSURE_MIN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define IMX319_EXPOSURE_STEP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define IMX319_EXPOSURE_DEFAULT 0x04f6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * the digital control register for all color control looks like:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * +-----------------+------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * | [7:0] | [15:8] |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * +-----------------+------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * | 0x020f | 0x020e |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * --------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * it is used to calculate the digital gain times value(integral + fractional)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * the [15:8] bits is the fractional part and [7:0] bits is the integral
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * calculation equation is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * gain value (unit: times) = REG[15:8] + REG[7:0]/0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * Only value in 0x0100 ~ 0x0FFF range is allowed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * Analog gain use 10 bits in the registers and allowed range is 0 ~ 960
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* Analog gain control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define IMX319_REG_ANALOG_GAIN 0x0204
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define IMX319_ANA_GAIN_MIN 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define IMX319_ANA_GAIN_MAX 960
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define IMX319_ANA_GAIN_STEP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define IMX319_ANA_GAIN_DEFAULT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* Digital gain control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define IMX319_REG_DPGA_USE_GLOBAL_GAIN 0x3ff9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define IMX319_REG_DIG_GAIN_GLOBAL 0x020e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define IMX319_DGTL_GAIN_MIN 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define IMX319_DGTL_GAIN_MAX 4095
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define IMX319_DGTL_GAIN_STEP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define IMX319_DGTL_GAIN_DEFAULT 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* Test Pattern Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define IMX319_REG_TEST_PATTERN 0x0600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define IMX319_TEST_PATTERN_DISABLED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define IMX319_TEST_PATTERN_SOLID_COLOR 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define IMX319_TEST_PATTERN_COLOR_BARS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define IMX319_TEST_PATTERN_GRAY_COLOR_BARS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define IMX319_TEST_PATTERN_PN9 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* Flip Control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define IMX319_REG_ORIENTATION 0x0101
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* default link frequency and external clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define IMX319_LINK_FREQ_DEFAULT 482400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define IMX319_EXT_CLK 19200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define IMX319_LINK_FREQ_INDEX 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct imx319_reg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u16 address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct imx319_reg_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u32 num_of_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) const struct imx319_reg *regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* Mode : resolution and related config&values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct imx319_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Frame width */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u32 width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* Frame height */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) u32 height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* V-timing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u32 fll_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u32 fll_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* H-timing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u32 llp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* index of link frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u32 link_freq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /* Default register values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct imx319_reg_list reg_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct imx319_hwcfg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) u32 ext_clk; /* sensor external clk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) s64 *link_freqs; /* CSI-2 link frequencies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned int nr_of_link_freqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct imx319 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) struct v4l2_subdev sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct media_pad pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct v4l2_ctrl_handler ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* V4L2 Controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct v4l2_ctrl *link_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct v4l2_ctrl *pixel_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct v4l2_ctrl *vblank;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct v4l2_ctrl *hblank;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct v4l2_ctrl *exposure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct v4l2_ctrl *vflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct v4l2_ctrl *hflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* Current mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) const struct imx319_mode *cur_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct imx319_hwcfg *hwcfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) s64 link_def_freq; /* CSI-2 link default frequency */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * Mutex for serialized access:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * Protect sensor set pad format and start/stop streaming safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * Protect access to sensor v4l2 controls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* Streaming on/off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) bool streaming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) static const struct imx319_reg imx319_global_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { 0x0136, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { 0x0137, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { 0x3c7e, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { 0x3c7f, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { 0x4d39, 0x0b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { 0x4d41, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { 0x4d43, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { 0x4d49, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { 0x4e05, 0x0b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { 0x4e0d, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { 0x4e0f, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { 0x4e15, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { 0x4e49, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) { 0x4e51, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { 0x4e53, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { 0x4e59, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) { 0x5601, 0x4f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { 0x560b, 0x45 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { 0x562f, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) { 0x5643, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { 0x5645, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) { 0x56ef, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) { 0x586f, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { 0x5873, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { 0x5905, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) { 0x5907, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { 0x590d, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) { 0x590f, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) { 0x5915, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) { 0x5917, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) { 0x5969, 0x1c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) { 0x596b, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { 0x5971, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { 0x5973, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) { 0x5975, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { 0x5977, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { 0x5979, 0x1c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) { 0x597b, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { 0x5985, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) { 0x5987, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) { 0x5999, 0x1c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) { 0x599b, 0x72 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { 0x59a5, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { 0x59a7, 0x89 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) { 0x7485, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { 0x7487, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) { 0x7489, 0xc7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) { 0x748b, 0x8b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { 0x9004, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) { 0x9200, 0x6a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) { 0x9201, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { 0x9202, 0x6a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { 0x9203, 0x23 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) { 0x9204, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { 0x9205, 0x23 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { 0x9206, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { 0x9207, 0x24 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { 0x9208, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { 0x9209, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { 0x920a, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { 0x920b, 0x27 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { 0x920c, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { 0x920d, 0x29 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { 0x920e, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { 0x920f, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) { 0x9210, 0x5f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) { 0x9211, 0x2c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { 0xbc22, 0x1a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) { 0xf01f, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) { 0xf021, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { 0xf023, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) { 0xf03d, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { 0xf03f, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { 0xf041, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) { 0xf0af, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) { 0xf0b1, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { 0xf0b3, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) { 0xf0cd, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { 0xf0cf, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { 0xf0d1, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) { 0xf13f, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) { 0xf141, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { 0xf143, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { 0xf15d, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { 0xf15f, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) { 0xf161, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { 0xf1cf, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) { 0xf1d1, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) { 0xf1d3, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) { 0xf1ed, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) { 0xf1ef, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { 0xf1f1, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { 0xf287, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) { 0xf289, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { 0xf28b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { 0xf2a5, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { 0xf2a7, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) { 0xf2a9, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { 0xf2b7, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { 0xf2b9, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { 0xf2bb, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { 0xf2d5, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { 0xf2d7, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { 0xf2d9, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) static const struct imx319_reg_list imx319_global_setting = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .num_of_regs = ARRAY_SIZE(imx319_global_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) .regs = imx319_global_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static const struct imx319_reg mode_3264x2448_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { 0x0342, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) { 0x0343, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) { 0x0340, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) { 0x0341, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { 0x0346, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { 0x0347, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { 0x034a, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) { 0x034b, 0x9f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) { 0x0900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) { 0x0901, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) { 0x3f3c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) { 0x0409, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) { 0x040b, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) { 0x040c, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) { 0x040d, 0xc0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) { 0x040e, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) { 0x040f, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) { 0x034c, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) { 0x034d, 0xc0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) { 0x034e, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { 0x034f, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) { 0x3c01, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) { 0x3f78, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) { 0x3f79, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) { 0xa081, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) { 0x0202, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) { 0x0203, 0x7a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) static const struct imx319_reg mode_3280x2464_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) { 0x0342, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) { 0x0343, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { 0x0340, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) { 0x0341, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) { 0x0346, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) { 0x0347, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) { 0x034a, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) { 0x034b, 0x9f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) { 0x0900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) { 0x0901, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) { 0x3f3c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) { 0x0409, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) { 0x040c, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) { 0x040d, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) { 0x040e, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) { 0x040f, 0xa0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) { 0x034c, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) { 0x034d, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) { 0x034e, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) { 0x034f, 0xa0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) { 0x3c01, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) { 0x3f78, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) { 0x3f79, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) { 0xa081, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) { 0x0202, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) { 0x0203, 0x7a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) static const struct imx319_reg mode_1936x1096_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) { 0x0342, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) { 0x0343, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) { 0x0340, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) { 0x0341, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) { 0x0346, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) { 0x0347, 0xac },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) { 0x034a, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) { 0x034b, 0xf3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) { 0x0900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) { 0x0901, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) { 0x3f3c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) { 0x0408, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) { 0x0409, 0xa0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) { 0x040c, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) { 0x040d, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) { 0x040e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) { 0x040f, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) { 0x034c, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) { 0x034d, 0x90 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) { 0x034e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) { 0x034f, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) { 0x3c01, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) { 0x3f78, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) { 0x3f79, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) { 0xa081, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) { 0x0202, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) { 0x0203, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) static const struct imx319_reg mode_1920x1080_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) { 0x0342, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) { 0x0343, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) { 0x0340, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) { 0x0341, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) { 0x0346, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) { 0x0347, 0xb4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) { 0x034a, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) { 0x034b, 0xeb },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) { 0x0900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) { 0x0901, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) { 0x3f3c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) { 0x0408, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) { 0x0409, 0xa8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) { 0x040c, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) { 0x040d, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) { 0x040e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) { 0x040f, 0x38 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) { 0x034c, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) { 0x034d, 0x80 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) { 0x034e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) { 0x034f, 0x38 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) { 0x3c01, 0x48 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) { 0x3f78, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) { 0x3f79, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) { 0xa081, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) { 0x0202, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) { 0x0203, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) static const struct imx319_reg mode_1640x1232_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) { 0x0342, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) { 0x0343, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) { 0x0340, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) { 0x0341, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) { 0x0346, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) { 0x0347, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) { 0x034a, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) { 0x034b, 0x9f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) { 0x0900, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) { 0x0901, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) { 0x3f3c, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) { 0x0409, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) { 0x040c, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) { 0x040d, 0x68 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) { 0x040e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) { 0x040f, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) { 0x034c, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) { 0x034d, 0x68 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) { 0x034e, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) { 0x034f, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) { 0x3c01, 0xba },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) { 0x3f78, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) { 0x3f79, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) { 0xa081, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) { 0x0202, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) { 0x0203, 0xf6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) static const struct imx319_reg mode_1640x922_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) { 0x0342, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) { 0x0343, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) { 0x0340, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) { 0x0341, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) { 0x0346, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) { 0x0347, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) { 0x034a, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) { 0x034b, 0x6f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) { 0x0900, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) { 0x0901, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) { 0x3f3c, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) { 0x0409, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) { 0x040b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) { 0x040c, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) { 0x040d, 0x68 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) { 0x040e, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) { 0x040f, 0x9a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) { 0x034c, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) { 0x034d, 0x68 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) { 0x034e, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) { 0x034f, 0x9a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) { 0x3c01, 0xba },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) { 0x3f78, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) { 0x3f79, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) { 0xa081, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) { 0x0202, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) { 0x0203, 0xf6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) static const struct imx319_reg mode_1296x736_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) { 0x0342, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) { 0x0343, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) { 0x0340, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) { 0x0341, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) { 0x0346, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) { 0x0347, 0xf0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) { 0x034a, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) { 0x034b, 0xaf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) { 0x0900, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) { 0x0901, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) { 0x3f3c, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) { 0x0409, 0xac },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) { 0x040c, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) { 0x040d, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) { 0x040e, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) { 0x040f, 0xe0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) { 0x034c, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) { 0x034d, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) { 0x034e, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) { 0x034f, 0xe0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) { 0x3c01, 0xba },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) { 0x3f78, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) { 0x3f79, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) { 0xa081, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) { 0x0202, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) { 0x0203, 0xf6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) static const struct imx319_reg mode_1280x720_regs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) { 0x0112, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) { 0x0113, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) { 0x0114, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) { 0x0342, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) { 0x0343, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) { 0x0340, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) { 0x0341, 0x2a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) { 0x0344, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) { 0x0345, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) { 0x0346, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) { 0x0347, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) { 0x0348, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) { 0x0349, 0xcf },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) { 0x034a, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) { 0x034b, 0x9f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) { 0x0220, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) { 0x0221, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) { 0x0381, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) { 0x0383, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) { 0x0385, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) { 0x0387, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) { 0x0900, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) { 0x0901, 0x22 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) { 0x0902, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) { 0x3140, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) { 0x3141, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) { 0x3f0d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) { 0x3f14, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) { 0x3f3c, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) { 0x3f4d, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) { 0x3f4c, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) { 0x4254, 0x7f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) { 0x0401, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) { 0x0404, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) { 0x0405, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) { 0x0408, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) { 0x0409, 0xb4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) { 0x040a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) { 0x040b, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) { 0x040c, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) { 0x040d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) { 0x040e, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) { 0x040f, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) { 0x034c, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) { 0x034d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) { 0x034e, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) { 0x034f, 0xd0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) { 0x3261, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) { 0x3264, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) { 0x3265, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) { 0x0301, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) { 0x0303, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) { 0x0305, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) { 0x0306, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) { 0x0307, 0x92 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) { 0x0309, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) { 0x030b, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) { 0x030d, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) { 0x030e, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) { 0x030f, 0xfa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) { 0x0310, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) { 0x0820, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) { 0x0821, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) { 0x0822, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) { 0x0823, 0x33 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) { 0x3e20, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) { 0x3e37, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) { 0x3e3b, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) { 0x38a3, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) { 0x38a8, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) { 0x38a9, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) { 0x38aa, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) { 0x38ab, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) { 0x3234, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) { 0x3fc1, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) { 0x3235, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) { 0x3802, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) { 0x3143, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) { 0x360a, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) { 0x0b00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) { 0x0106, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) { 0x0b05, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) { 0x0b06, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) { 0x3230, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) { 0x3602, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) { 0x3607, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) { 0x3c00, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) { 0x3c01, 0xba },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) { 0x3c02, 0xc8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) { 0x3c03, 0xaa },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) { 0x3c04, 0x91 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) { 0x3c05, 0x54 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) { 0x3c06, 0x26 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) { 0x3c07, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) { 0x3c08, 0x51 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) { 0x3d80, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) { 0x3f50, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) { 0x3f56, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) { 0x3f57, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) { 0x3f78, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) { 0x3f79, 0x34 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) { 0x3f7c, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) { 0x3f7d, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) { 0x3fba, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) { 0x3fbb, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) { 0xa081, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) { 0xe014, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) { 0x0202, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) { 0x0203, 0xf6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) { 0x0224, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) { 0x0225, 0xf4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) { 0x0204, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) { 0x0205, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) { 0x0216, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) { 0x0217, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) { 0x020e, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) { 0x020f, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) { 0x0210, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) { 0x0211, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) { 0x0212, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) { 0x0213, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) { 0x0214, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) { 0x0215, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) { 0x0218, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) { 0x0219, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) { 0x3614, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) { 0x3616, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) { 0x3617, 0x56 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) { 0xb612, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) { 0xb613, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) { 0xb614, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) { 0xb615, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) { 0xb616, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) { 0xb617, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) { 0xb618, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) { 0xb619, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) { 0xb61a, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) { 0xb61b, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) { 0xb61c, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) { 0xb61d, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) { 0xb666, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) { 0xb667, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) { 0xb668, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) { 0xb669, 0x30 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) { 0xb66a, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) { 0xb66b, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) { 0xb66c, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) { 0xb66d, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) { 0xb66e, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) { 0xb66f, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) { 0xb670, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) { 0xb671, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) { 0x3237, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) { 0x3900, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) { 0x3901, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) { 0x3902, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) { 0x3904, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) { 0x3905, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) { 0x3906, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) { 0x3907, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) { 0x3908, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) { 0x3909, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) { 0x3912, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) { 0x3930, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) { 0x3931, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) { 0x3933, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) { 0x3934, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) { 0x3935, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) { 0x3936, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) { 0x3937, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) { 0x30ac, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) static const char * const imx319_test_pattern_menu[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) "Disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) "Solid Colour",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) "Eight Vertical Colour Bars",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) "Colour Bars With Fade to Grey",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) "Pseudorandom Sequence (PN9)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) /* supported link frequencies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) static const s64 link_freq_menu_items[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) IMX319_LINK_FREQ_DEFAULT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) /* Mode configs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) static const struct imx319_mode supported_modes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) .width = 3280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) .height = 2464,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) .fll_def = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) .fll_min = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) .llp = 3968,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) .num_of_regs = ARRAY_SIZE(mode_3280x2464_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) .regs = mode_3280x2464_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) .width = 3264,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) .height = 2448,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) .fll_def = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) .fll_min = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) .llp = 3968,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) .num_of_regs = ARRAY_SIZE(mode_3264x2448_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) .regs = mode_3264x2448_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) .width = 1936,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) .height = 1096,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) .fll_def = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) .fll_min = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) .llp = 3968,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) .num_of_regs = ARRAY_SIZE(mode_1936x1096_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) .regs = mode_1936x1096_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) .width = 1920,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) .height = 1080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) .fll_def = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) .fll_min = 3242,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) .llp = 3968,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) .num_of_regs = ARRAY_SIZE(mode_1920x1080_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) .regs = mode_1920x1080_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) .width = 1640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) .height = 1232,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) .fll_def = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) .fll_min = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) .llp = 2500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) .num_of_regs = ARRAY_SIZE(mode_1640x1232_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) .regs = mode_1640x1232_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) .width = 1640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) .height = 922,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) .fll_def = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) .fll_min = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) .llp = 2500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) .num_of_regs = ARRAY_SIZE(mode_1640x922_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) .regs = mode_1640x922_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) .width = 1296,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) .height = 736,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) .fll_def = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) .fll_min = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) .llp = 2500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) .num_of_regs = ARRAY_SIZE(mode_1296x736_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) .regs = mode_1296x736_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) .width = 1280,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) .height = 720,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) .fll_def = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) .fll_min = 5146,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) .llp = 2500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) .link_freq_index = IMX319_LINK_FREQ_INDEX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) .reg_list = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) .num_of_regs = ARRAY_SIZE(mode_1280x720_regs),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) .regs = mode_1280x720_regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) static inline struct imx319 *to_imx319(struct v4l2_subdev *_sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) return container_of(_sd, struct imx319, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) /* Get bayer order based on flip setting. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) static u32 imx319_get_format_code(struct imx319 *imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) * Only one bayer order is supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) * It depends on the flip settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) u32 code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) static const u32 codes[2][2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) { MEDIA_BUS_FMT_SRGGB10_1X10, MEDIA_BUS_FMT_SGRBG10_1X10, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) { MEDIA_BUS_FMT_SGBRG10_1X10, MEDIA_BUS_FMT_SBGGR10_1X10, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) lockdep_assert_held(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) code = codes[imx319->vflip->val][imx319->hflip->val];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) return code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) /* Read registers up to 4 at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) static int imx319_read_reg(struct imx319 *imx319, u16 reg, u32 len, u32 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) struct i2c_msg msgs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) u8 addr_buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) u8 data_buf[4] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) if (len > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) put_unaligned_be16(reg, addr_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) /* Write register address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) msgs[0].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) msgs[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) msgs[0].len = ARRAY_SIZE(addr_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) msgs[0].buf = addr_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) /* Read data from register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) msgs[1].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) msgs[1].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) msgs[1].len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) msgs[1].buf = &data_buf[4 - len];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) if (ret != ARRAY_SIZE(msgs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) *val = get_unaligned_be32(data_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) /* Write registers up to 4 at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) static int imx319_write_reg(struct imx319 *imx319, u16 reg, u32 len, u32 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) u8 buf[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) if (len > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) put_unaligned_be16(reg, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) if (i2c_master_send(client, buf, len + 2) != len + 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) /* Write a list of registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) static int imx319_write_regs(struct imx319 *imx319,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) const struct imx319_reg *regs, u32 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) for (i = 0; i < len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) ret = imx319_write_reg(imx319, regs[i].address, 1, regs[i].val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) dev_err_ratelimited(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) "write reg 0x%4.4x return err %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) regs[i].address, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) /* Open sub-device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) static int imx319_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) struct v4l2_mbus_framefmt *try_fmt =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) v4l2_subdev_get_try_format(sd, fh->pad, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) /* Initialize try_fmt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) try_fmt->width = imx319->cur_mode->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) try_fmt->height = imx319->cur_mode->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) try_fmt->code = imx319_get_format_code(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) try_fmt->field = V4L2_FIELD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) static int imx319_set_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) struct imx319 *imx319 = container_of(ctrl->handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) struct imx319, ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) s64 max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) /* Propagate change of current control to all related controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) case V4L2_CID_VBLANK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) /* Update max exposure while meeting expected vblanking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) max = imx319->cur_mode->height + ctrl->val - 18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) __v4l2_ctrl_modify_range(imx319->exposure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) imx319->exposure->minimum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) max, imx319->exposure->step, max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) * Applying V4L2 control value only happens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) * when power is up for streaming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (!pm_runtime_get_if_in_use(&client->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) case V4L2_CID_ANALOGUE_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) /* Analog gain = 1024/(1024 - ctrl->val) times */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) ret = imx319_write_reg(imx319, IMX319_REG_ANALOG_GAIN, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) case V4L2_CID_DIGITAL_GAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) ret = imx319_write_reg(imx319, IMX319_REG_DIG_GAIN_GLOBAL, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) case V4L2_CID_EXPOSURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) ret = imx319_write_reg(imx319, IMX319_REG_EXPOSURE, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) case V4L2_CID_VBLANK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) /* Update FLL that meets expected vertical blanking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) ret = imx319_write_reg(imx319, IMX319_REG_FLL, 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) imx319->cur_mode->height + ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) case V4L2_CID_TEST_PATTERN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) ret = imx319_write_reg(imx319, IMX319_REG_TEST_PATTERN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 2, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) case V4L2_CID_HFLIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) case V4L2_CID_VFLIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) ret = imx319_write_reg(imx319, IMX319_REG_ORIENTATION, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) imx319->hflip->val |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) imx319->vflip->val << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) dev_info(&client->dev, "ctrl(id:0x%x,val:0x%x) is not handled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) ctrl->id, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) pm_runtime_put(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) static const struct v4l2_ctrl_ops imx319_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) .s_ctrl = imx319_set_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) static int imx319_enum_mbus_code(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) struct v4l2_subdev_mbus_code_enum *code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) if (code->index > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) code->code = imx319_get_format_code(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) static int imx319_enum_frame_size(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) struct v4l2_subdev_frame_size_enum *fse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) if (fse->index >= ARRAY_SIZE(supported_modes))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) if (fse->code != imx319_get_format_code(imx319)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) fse->min_width = supported_modes[fse->index].width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) fse->max_width = fse->min_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) fse->min_height = supported_modes[fse->index].height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) fse->max_height = fse->min_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) static void imx319_update_pad_format(struct imx319 *imx319,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) const struct imx319_mode *mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) struct v4l2_subdev_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) fmt->format.width = mode->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) fmt->format.height = mode->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) fmt->format.code = imx319_get_format_code(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) fmt->format.field = V4L2_FIELD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) static int imx319_do_get_pad_format(struct imx319 *imx319,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) struct v4l2_subdev_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) struct v4l2_mbus_framefmt *framefmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) struct v4l2_subdev *sd = &imx319->sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) framefmt = v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) fmt->format = *framefmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) imx319_update_pad_format(imx319, imx319->cur_mode, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) static int imx319_get_pad_format(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) struct v4l2_subdev_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) ret = imx319_do_get_pad_format(imx319, cfg, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) imx319_set_pad_format(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) struct v4l2_subdev_format *fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) const struct imx319_mode *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) struct v4l2_mbus_framefmt *framefmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) s32 vblank_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) s32 vblank_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) s64 h_blank;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) u64 pixel_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) u32 height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) * Only one bayer order is supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) * It depends on the flip settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) fmt->format.code = imx319_get_format_code(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) mode = v4l2_find_nearest_size(supported_modes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) ARRAY_SIZE(supported_modes),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) width, height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) fmt->format.width, fmt->format.height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) imx319_update_pad_format(imx319, mode, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) framefmt = v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) *framefmt = fmt->format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) imx319->cur_mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) pixel_rate = imx319->link_def_freq * 2 * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) do_div(pixel_rate, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) __v4l2_ctrl_s_ctrl_int64(imx319->pixel_rate, pixel_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) /* Update limits and set FPS to default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) height = imx319->cur_mode->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) vblank_def = imx319->cur_mode->fll_def - height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) vblank_min = imx319->cur_mode->fll_min - height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) height = IMX319_FLL_MAX - height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) __v4l2_ctrl_modify_range(imx319->vblank, vblank_min, height, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) vblank_def);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) __v4l2_ctrl_s_ctrl(imx319->vblank, vblank_def);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) h_blank = mode->llp - imx319->cur_mode->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) * Currently hblank is not changeable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) * So FPS control is done only by vblank.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) __v4l2_ctrl_modify_range(imx319->hblank, h_blank,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) h_blank, 1, h_blank);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) /* Start streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) static int imx319_start_streaming(struct imx319 *imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) const struct imx319_reg_list *reg_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) /* Global Setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) reg_list = &imx319_global_setting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) dev_err(&client->dev, "failed to set global settings");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) /* Apply default values of current mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) reg_list = &imx319->cur_mode->reg_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) ret = imx319_write_regs(imx319, reg_list->regs, reg_list->num_of_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) dev_err(&client->dev, "failed to set mode");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) /* set digital gain control to all color mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) ret = imx319_write_reg(imx319, IMX319_REG_DPGA_USE_GLOBAL_GAIN, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) /* Apply customized values from user */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) ret = __v4l2_ctrl_handler_setup(imx319->sd.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 1, IMX319_MODE_STREAMING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) /* Stop streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) static int imx319_stop_streaming(struct imx319 *imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) return imx319_write_reg(imx319, IMX319_REG_MODE_SELECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 1, IMX319_MODE_STANDBY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) static int imx319_set_stream(struct v4l2_subdev *sd, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) struct i2c_client *client = v4l2_get_subdevdata(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) mutex_lock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) if (imx319->streaming == enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) ret = pm_runtime_get_sync(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) pm_runtime_put_noidle(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) * Apply default & customized values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) * and then start streaming.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) ret = imx319_start_streaming(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) goto err_rpm_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) imx319_stop_streaming(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) pm_runtime_put(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) imx319->streaming = enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) /* vflip and hflip cannot change during streaming */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) __v4l2_ctrl_grab(imx319->vflip, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) __v4l2_ctrl_grab(imx319->hflip, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) err_rpm_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) pm_runtime_put(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) err_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) mutex_unlock(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) static int __maybe_unused imx319_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) struct v4l2_subdev *sd = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) if (imx319->streaming)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) imx319_stop_streaming(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) static int __maybe_unused imx319_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) struct v4l2_subdev *sd = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) if (imx319->streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) ret = imx319_start_streaming(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) imx319_stop_streaming(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) imx319->streaming = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) /* Verify chip ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) static int imx319_identify_module(struct imx319 *imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) ret = imx319_read_reg(imx319, IMX319_REG_CHIP_ID, 2, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) if (val != IMX319_CHIP_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) dev_err(&client->dev, "chip id mismatch: %x!=%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) IMX319_CHIP_ID, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) static const struct v4l2_subdev_core_ops imx319_subdev_core_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) .unsubscribe_event = v4l2_event_subdev_unsubscribe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) static const struct v4l2_subdev_video_ops imx319_video_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) .s_stream = imx319_set_stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) static const struct v4l2_subdev_pad_ops imx319_pad_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) .enum_mbus_code = imx319_enum_mbus_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) .get_fmt = imx319_get_pad_format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) .set_fmt = imx319_set_pad_format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) .enum_frame_size = imx319_enum_frame_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) static const struct v4l2_subdev_ops imx319_subdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) .core = &imx319_subdev_core_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) .video = &imx319_video_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) .pad = &imx319_pad_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) static const struct media_entity_operations imx319_subdev_entity_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .link_validate = v4l2_subdev_link_validate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) static const struct v4l2_subdev_internal_ops imx319_internal_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) .open = imx319_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) /* Initialize control handlers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) static int imx319_init_controls(struct imx319 *imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) struct v4l2_ctrl_handler *ctrl_hdlr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) s64 exposure_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) s64 vblank_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) s64 vblank_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) s64 hblank;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) u64 pixel_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) const struct imx319_mode *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) u32 max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) ctrl_hdlr = &imx319->ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) ret = v4l2_ctrl_handler_init(ctrl_hdlr, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) ctrl_hdlr->lock = &imx319->mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) max = ARRAY_SIZE(link_freq_menu_items) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) V4L2_CID_LINK_FREQ, max, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) link_freq_menu_items);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) if (imx319->link_freq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) /* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) pixel_rate = imx319->link_def_freq * 2 * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) do_div(pixel_rate, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) /* By default, PIXEL_RATE is read only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) V4L2_CID_PIXEL_RATE, pixel_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) pixel_rate, 1, pixel_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) /* Initial vblank/hblank/exposure parameters based on current mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) mode = imx319->cur_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) vblank_def = mode->fll_def - mode->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) vblank_min = mode->fll_min - mode->height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) V4L2_CID_VBLANK, vblank_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) IMX319_FLL_MAX - mode->height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 1, vblank_def);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) hblank = mode->llp - mode->width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) V4L2_CID_HBLANK, hblank, hblank,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 1, hblank);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) if (imx319->hblank)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) /* fll >= exposure time + adjust parameter (default value is 18) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) exposure_max = mode->fll_def - 18;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) V4L2_CID_EXPOSURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) IMX319_EXPOSURE_MIN, exposure_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) IMX319_EXPOSURE_STEP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) IMX319_EXPOSURE_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) V4L2_CID_HFLIP, 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) V4L2_CID_VFLIP, 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) IMX319_ANA_GAIN_MIN, IMX319_ANA_GAIN_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) IMX319_ANA_GAIN_STEP, IMX319_ANA_GAIN_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) /* Digital gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) IMX319_DGTL_GAIN_MIN, IMX319_DGTL_GAIN_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) IMX319_DGTL_GAIN_STEP, IMX319_DGTL_GAIN_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx319_ctrl_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) V4L2_CID_TEST_PATTERN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) ARRAY_SIZE(imx319_test_pattern_menu) - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 0, 0, imx319_test_pattern_menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) if (ctrl_hdlr->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) ret = ctrl_hdlr->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) dev_err(&client->dev, "control init failed: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) imx319->sd.ctrl_handler = ctrl_hdlr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) v4l2_ctrl_handler_free(ctrl_hdlr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) static struct imx319_hwcfg *imx319_get_hwcfg(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) struct imx319_hwcfg *cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) struct v4l2_fwnode_endpoint bus_cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) .bus_type = V4L2_MBUS_CSI2_DPHY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) struct fwnode_handle *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) struct fwnode_handle *fwnode = dev_fwnode(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) if (!fwnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) cfg = devm_kzalloc(dev, sizeof(*cfg), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) if (!cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) &cfg->ext_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) dev_err(dev, "can't get clock frequency");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) dev_dbg(dev, "ext clk: %d", cfg->ext_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) if (cfg->ext_clk != IMX319_EXT_CLK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) dev_err(dev, "external clock %d is not supported",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) cfg->ext_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) dev_dbg(dev, "num of link freqs: %d", bus_cfg.nr_of_link_frequencies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) if (!bus_cfg.nr_of_link_frequencies) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) dev_warn(dev, "no link frequencies defined");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) cfg->nr_of_link_freqs = bus_cfg.nr_of_link_frequencies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) cfg->link_freqs = devm_kcalloc(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) bus_cfg.nr_of_link_frequencies + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) sizeof(*cfg->link_freqs), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) if (!cfg->link_freqs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) goto out_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) for (i = 0; i < bus_cfg.nr_of_link_frequencies; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) cfg->link_freqs[i] = bus_cfg.link_frequencies[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) dev_dbg(dev, "link_freq[%d] = %lld", i, cfg->link_freqs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) v4l2_fwnode_endpoint_free(&bus_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) fwnode_handle_put(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) return cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) out_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) v4l2_fwnode_endpoint_free(&bus_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) fwnode_handle_put(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) static int imx319_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) struct imx319 *imx319;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) imx319 = devm_kzalloc(&client->dev, sizeof(*imx319), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) if (!imx319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) mutex_init(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) /* Initialize subdev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) v4l2_i2c_subdev_init(&imx319->sd, client, &imx319_subdev_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) /* Check module identity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) ret = imx319_identify_module(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) dev_err(&client->dev, "failed to find sensor: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) goto error_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) imx319->hwcfg = imx319_get_hwcfg(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) if (!imx319->hwcfg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) dev_err(&client->dev, "failed to get hwcfg");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) goto error_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) imx319->link_def_freq = link_freq_menu_items[IMX319_LINK_FREQ_INDEX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) for (i = 0; i < imx319->hwcfg->nr_of_link_freqs; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) if (imx319->hwcfg->link_freqs[i] == imx319->link_def_freq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) dev_dbg(&client->dev, "link freq index %d matched", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) if (i == imx319->hwcfg->nr_of_link_freqs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) dev_err(&client->dev, "no link frequency supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) goto error_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) /* Set default mode to max resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) imx319->cur_mode = &supported_modes[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) ret = imx319_init_controls(imx319);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) dev_err(&client->dev, "failed to init controls: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) goto error_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) /* Initialize subdev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) imx319->sd.internal_ops = &imx319_internal_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) imx319->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) V4L2_SUBDEV_FL_HAS_EVENTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) imx319->sd.entity.ops = &imx319_subdev_entity_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) imx319->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) /* Initialize source pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) imx319->pad.flags = MEDIA_PAD_FL_SOURCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) ret = media_entity_pads_init(&imx319->sd.entity, 1, &imx319->pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) dev_err(&client->dev, "failed to init entity pads: %d", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) goto error_handler_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) ret = v4l2_async_register_subdev_sensor_common(&imx319->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) goto error_media_entity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) * Device is already turned on by i2c-core with ACPI domain PM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) * Enable runtime PM and turn off the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) pm_runtime_set_active(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) pm_runtime_enable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) pm_runtime_idle(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) error_media_entity:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) media_entity_cleanup(&imx319->sd.entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) error_handler_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) v4l2_ctrl_handler_free(imx319->sd.ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) error_probe:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) mutex_destroy(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) static int imx319_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) struct v4l2_subdev *sd = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) struct imx319 *imx319 = to_imx319(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) v4l2_async_unregister_subdev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) media_entity_cleanup(&sd->entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) v4l2_ctrl_handler_free(sd->ctrl_handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) pm_runtime_disable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) pm_runtime_set_suspended(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) mutex_destroy(&imx319->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) static const struct dev_pm_ops imx319_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) SET_SYSTEM_SLEEP_PM_OPS(imx319_suspend, imx319_resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) static const struct acpi_device_id imx319_acpi_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) { "SONY319A" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) { /* sentinel */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) MODULE_DEVICE_TABLE(acpi, imx319_acpi_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) static struct i2c_driver imx319_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) .name = "imx319",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) .pm = &imx319_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) .acpi_match_table = ACPI_PTR(imx319_acpi_ids),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) .probe_new = imx319_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) .remove = imx319_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) module_i2c_driver(imx319_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) MODULE_AUTHOR("Qiu, Tianshu <tian.shu.qiu@intel.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) MODULE_AUTHOR("Rapolu, Chiranjeevi <chiranjeevi.rapolu@intel.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) MODULE_AUTHOR("Bingbu Cao <bingbu.cao@intel.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) MODULE_AUTHOR("Yang, Hyungwoo <hyungwoo.yang@intel.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) MODULE_DESCRIPTION("Sony imx319 sensor driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) MODULE_LICENSE("GPL v2");