From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198
---
kernel/drivers/media/i2c/imx335.c | 710 ++++------------------------------------------------------
1 files changed, 51 insertions(+), 659 deletions(-)
diff --git a/kernel/drivers/media/i2c/imx335.c b/kernel/drivers/media/i2c/imx335.c
index b687504..717bce3 100644
--- a/kernel/drivers/media/i2c/imx335.c
+++ b/kernel/drivers/media/i2c/imx335.c
@@ -11,7 +11,6 @@
* V0.0X01.0X04 fix hdr ae error
* V0.0X01.0X05 add quick stream on/off
* V0.0X01.0X06 Increase hdr exposure restrictions
- * V0.0X01.0X07 add binning resolution
*/
#define DEBUG
@@ -34,14 +33,13 @@
#include <linux/pinctrl/consumer.h>
#include <linux/rk-preisp.h>
-#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x07)
+#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06)
#ifndef V4L2_CID_DIGITAL_GAIN
#define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN
#endif
#define MIPI_FREQ_594M 594000000
-#define MIPI_FREQ_445M 445000000
#define IMX335_4LANES 4
@@ -160,14 +158,6 @@
#define IMX335_NUM_SUPPLIES ARRAY_SIZE(imx335_supply_names)
-enum imx335_max_pad {
- PAD0, /* link to isp */
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
- PAD2, /* link to csi wr1 | hdr x3:L */
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
- PAD_MAX,
-};
-
struct regval {
u16 addr;
u8 val;
@@ -182,7 +172,6 @@
u32 vts_def;
u32 exp_def;
u32 bpp;
- u32 mipi_freq_idx;
const struct regval *reg_list;
u32 hdr_mode;
u32 vc[PAD_MAX];
@@ -227,157 +216,8 @@
/*
* Xclk 37.125Mhz
*/
-static const struct regval imx335_linear_12bit_1296x972_regs[] = {
- {0x3002, 0x00},
- {0x3018, 0x01},
- {0x300C, 0x5B},
- {0x300D, 0x40},
- {0x3034, 0x26},
- {0x3035, 0x02},
- {0x3048, 0x00},
- {0x3049, 0x00},
- {0x304A, 0x03},
- {0x304B, 0x01},
- {0x304C, 0x14},
- {0x3050, 0x00},
- {0x3056, 0xd8},
- {0x3057, 0x03},
- {0x3058, 0x4E},
- {0x3059, 0x0C},
- {0x305C, 0x12},
- {0x3060, 0xE8},
- {0x3061, 0x00},
- {0x3068, 0xce},
- {0x3069, 0x00},
- {0x306C, 0x68},
- {0x306D, 0x06},
- {0x3072, 0x30},
- {0x3074, 0xa8},
- {0x3075, 0x00},
- {0x3076, 0x60},
- {0x3077, 0x0f},
- {0x3078, 0x04},
- {0x3079, 0xFD},
- {0x307A, 0x04},
- {0x307B, 0xFE},//binning
- {0x307C, 0x04},
- {0x307D, 0xFB},
- {0x307E, 0x04},
- {0x307F, 0x02}, /* Each frame gain adjustment disabled in linear mode */
- {0x3080, 0x04},
- {0x3081, 0xFD},
- {0x3082, 0x04},//binning
- {0x3083, 0xFE},
- {0x3084, 0x04},
- {0x3085, 0xFB},
- {0x3086, 0x04},
- {0x3087, 0x02},
- {0x30A4, 0x77},
- {0x30A8, 0x20},
- {0x30A9, 0x00},
- {0x30AC, 0x08},
- {0x30AD, 0x08},
- {0x30B0, 0x20},
- {0x30B1, 0x00},
- {0x30B4, 0x10},
- {0x30B5, 0x10},
- {0x30E8, 0x14},
- {0x3112, 0x10},
- {0x3116, 0x10},
- {0x314C, 0xC0},
- {0x315A, 0x06},
- {0x316A, 0x7E},
- {0x3199, 0x30},
- {0x319D, 0x01},
- {0x319E, 0x02},
- {0x31A1, 0x00},
- {0x31D7, 0x00},
- {0x3200, 0x01},
- {0x3288, 0x21},
- {0x328A, 0x02},
- {0x3300, 0x01},
- {0x3414, 0x05},
- {0x3416, 0x18},
- {0x341C, 0xFF},
- {0x341D, 0x01},
- {0x3648, 0x01},
- {0x364A, 0x04},
- {0x364C, 0x04},
- {0x3678, 0x01},
- {0x367C, 0x31},
- {0x367E, 0x31},
- {0x3706, 0x10},
- {0x3708, 0x03},
- {0x3714, 0x02},
- {0x3715, 0x02},
- {0x3716, 0x01},
- {0x3717, 0x03},
- {0x371C, 0x3D},
- {0x371D, 0x3F},
- {0x372C, 0x00},
- {0x372D, 0x00},
- {0x372E, 0x46},
- {0x372F, 0x00},
- {0x3730, 0x89},
- {0x3731, 0x00},
- {0x3732, 0x08},
- {0x3733, 0x01},
- {0x3734, 0xFE},
- {0x3735, 0x05},
- {0x3740, 0x02},
- {0x375D, 0x00},
- {0x375E, 0x00},
- {0x375F, 0x11},
- {0x3760, 0x01},
- {0x3768, 0x1B},
- {0x3769, 0x1B},
- {0x376A, 0x1B},
- {0x376B, 0x1B},
- {0x376C, 0x1A},
- {0x376D, 0x17},
- {0x376E, 0x0F},
- {0x3776, 0x00},
- {0x3777, 0x00},
- {0x3778, 0x46},
- {0x3779, 0x00},
- {0x377A, 0x89},
- {0x377B, 0x00},
- {0x377C, 0x08},
- {0x377D, 0x01},
- {0x377E, 0x23},
- {0x377F, 0x02},
- {0x3780, 0xD9},
- {0x3781, 0x03},
- {0x3782, 0xF5},
- {0x3783, 0x06},
- {0x3784, 0xA5},
- {0x3788, 0x0F},
- {0x378A, 0xD9},
- {0x378B, 0x03},
- {0x378C, 0xEB},
- {0x378D, 0x05},
- {0x378E, 0x87},
- {0x378F, 0x06},
- {0x3790, 0xF5},
- {0x3792, 0x43},
- {0x3794, 0x7A},
- {0x3796, 0xA1},
- {0x3A18, 0x7F},
- {0x3A1A, 0x37},
- {0x3A1C, 0x37},
- {0x3A1E, 0xF7},
- {0x3A1F, 0x00},
- {0x3A20, 0x3F},
- {0x3A22, 0x6F},
- {0x3A24, 0x3F},
- {0x3A26, 0x5F},
- {0x3A28, 0x2F},
- {REG_NULL, 0x00},
-};
-
static const struct regval imx335_linear_10bit_2592x1944_regs[] = {
{0x3002, 0x00},
- {0x3018, 0x00},
{0x300C, 0x5B},
{0x300D, 0x40},
{0x3034, 0x26},
@@ -388,8 +228,6 @@
{0x304B, 0x01},
{0x304C, 0x14},
{0x3050, 0x00},
- {0x3056, 0xac},
- {0x3057, 0x07},
{0x3058, 0x09},
{0x3059, 0x00},
{0x305C, 0x12},
@@ -399,51 +237,15 @@
{0x3069, 0x00},
{0x306C, 0x88},
{0x306D, 0x06},
- {0x3072, 0x28},
- {0x3074, 0xb0},
- {0x3075, 0x00},
- {0x3076, 0x58},
- {0x3077, 0x0f},
- {0x3078, 0x01},
- {0x3079, 0x02},
- {0x307A, 0xff},
- {0x307B, 0x02},
- {0x307C, 0x00},
- {0x307D, 0x00},
- {0x307E, 0x00},
- {0x307F, 0x00},
- {0x3080, 0x01},
- {0x3081, 0x02},
- {0x3082, 0xff},
- {0x3083, 0x02},
- {0x3084, 0x00},
- {0x3085, 0x00},
- {0x3086, 0x00},
- {0x3087, 0x00},
- {0x30A4, 0x33},
- {0x30A8, 0x10},
- {0x30A9, 0x04},
- {0x30AC, 0x00},
- {0x30AD, 0x00},
- {0x30B0, 0x10},
- {0x30B1, 0x08},
- {0x30B4, 0x00},
- {0x30B5, 0x00},
{0x30E8, 0x00},
- {0x3112, 0x08},
- {0x3116, 0x08},//full
- {0x314C, 0x80},
{0x315A, 0x02},
{0x316A, 0x7E},
- {0x3199, 0x00}, /* Each frame gain adjustment disabled in linear mode */
{0x319D, 0x00},
- {0x319E, 0x01},
- {0x31A1, 0x00},//full
+ {0x31A1, 0x00},
{0x31D7, 0x00},
- {0x3200, 0x01},
+ {0x3200, 0x01}, /* Each frame gain adjustment disabed in linear mode */
{0x3288, 0x21},
{0x328A, 0x02},
- {0x3300, 0x00},
{0x3414, 0x05},
{0x3416, 0x18},
{0x341C, 0xFF},
@@ -510,22 +312,11 @@
{0x3792, 0x43},
{0x3794, 0x7A},
{0x3796, 0xA1},
- {0x3A18, 0x8F},
- {0x3A1A, 0x4f},
- {0x3A1C, 0x47},
- {0x3A1E, 0x37},
- {0x3A1F, 0x01},
- {0x3A20, 0x4F},
- {0x3A22, 0x87},
- {0x3A24, 0x4F},
- {0x3A26, 0x7F},
- {0x3A28, 0x3F},
{REG_NULL, 0x00},
};
static const struct regval imx335_hdr2_10bit_2592x1944_regs[] = {
{0x3002, 0x00},
- {0x3018, 0x00},
{0x300C, 0x5B},
{0x300D, 0x40},
{0x3034, 0x13},
@@ -536,8 +327,6 @@
{0x304B, 0x03},
{0x304C, 0x13},
{0x3050, 0x00},
- {0x3056, 0xac},
- {0x3057, 0x07},
{0x3058, 0x48},
{0x3059, 0x12},
{0x305C, 0x12},
@@ -547,51 +336,15 @@
{0x3069, 0x01},
{0x306C, 0x68},
{0x306D, 0x06},
- {0x3072, 0x28},
- {0x3074, 0xb0},
- {0x3075, 0x00},
- {0x3076, 0x58},
- {0x3077, 0x0f},
- {0x3078, 0x01},
- {0x3079, 0x02},//full
- {0x307A, 0xff},
- {0x307B, 0x02},
- {0x307C, 0x00},
- {0x307D, 0x00}, /* Each frame gain adjustment EN */
- {0x307E, 0x00},
- {0x307F, 0x00},
- {0x3080, 0x01},//full
- {0x3081, 0x02},
- {0x3082, 0xff},
- {0x3083, 0x02},
- {0x3084, 0x00},
- {0x3085, 0x00},
- {0x3086, 0x00},
- {0x3087, 0x00},
- {0x30A4, 0x33},
- {0x30A8, 0x10},
- {0x30A9, 0x04},
- {0x30AC, 0x00},
- {0x30AD, 0x00},
- {0x30B0, 0x10},
- {0x30B1, 0x08},
- {0x30B4, 0x00},
- {0x30B5, 0x00},
{0x30E8, 0x00},
- {0x3112, 0x08},
- {0x3116, 0x08},
- {0x314C, 0x80},
{0x315A, 0x02},
{0x316A, 0x7E},
- {0x3199, 0x00},
{0x319D, 0x00},
- {0x319E, 0x01},
{0x31A1, 0x00},
{0x31D7, 0x01},
- {0x3200, 0x00},
+ {0x3200, 0x00}, /* Each frame gain adjustment EN */
{0x3288, 0x21},
{0x328A, 0x02},
- {0x3300, 0x00},
{0x3414, 0x05},
{0x3416, 0x18},
{0x341C, 0xFF},
@@ -658,22 +411,11 @@
{0x3792, 0x43},
{0x3794, 0x7A},
{0x3796, 0xA1},
- {0x3A18, 0x8F},
- {0x3A1A, 0x4f},
- {0x3A1C, 0x47},
- {0x3A1E, 0x37},
- {0x3A1F, 0x01},
- {0x3A20, 0x4F},
- {0x3A22, 0x87},
- {0x3A24, 0x4F},
- {0x3A26, 0x7F},
- {0x3A28, 0x3F},
{REG_NULL, 0x00},
};
static const struct regval imx335_hdr3_10bit_2592x1944_regs[] = {
{0x3002, 0x00},
- {0x3018, 0x00},
{0x300C, 0x5B},
{0x300D, 0x40},
{0x3034, 0x13},
@@ -684,8 +426,6 @@
{0x304B, 0x03},
{0x304C, 0x13},
{0x3050, 0x00},
- {0x3056, 0xac},
- {0x3057, 0x07},
{0x3058, 0xC4},
{0x3059, 0x3B},
{0x305C, 0x1A},
@@ -695,51 +435,15 @@
{0x3069, 0x01},
{0x306C, 0x6C},
{0x306D, 0x01},
- {0x3072, 0x28},
- {0x3074, 0xb0},
- {0x3075, 0x00},
- {0x3076, 0x58},
- {0x3077, 0x0f},
- {0x3078, 0x01},
- {0x3079, 0x02},
- {0x307A, 0xff},
- {0x307B, 0x02},
- {0x307C, 0x00},
- {0x307D, 0x00},
- {0x307E, 0x00},
- {0x307F, 0x00},
- {0x3080, 0x01},
- {0x3081, 0x02},
- {0x3082, 0xff},
- {0x3083, 0x02},
- {0x3084, 0x00},
- {0x3085, 0x00},
- {0x3086, 0x00},
- {0x3087, 0x00},
- {0x30A4, 0x33},
- {0x30A8, 0x10},
- {0x30A9, 0x04},
- {0x30AC, 0x00},
- {0x30AD, 0x00},
- {0x30B0, 0x10},
- {0x30B1, 0x08},
- {0x30B4, 0x00},
- {0x30B5, 0x00},
{0x30E8, 0x14},
- {0x3112, 0x08},
- {0x3116, 0x08},
- {0x314C, 0x80},
{0x315A, 0x02},
{0x316A, 0x7E},
- {0x3199, 0x00},
{0x319D, 0x00},
- {0x319E, 0x01},
{0x31A1, 0x00},
{0x31D7, 0x03},
- {0x3200, 0x00},
+ {0x3200, 0x00}, /* Each frame gain adjustment EN */
{0x3288, 0x21},
{0x328A, 0x02},
- {0x3300, 0x00},
{0x3414, 0x05},
{0x3416, 0x18},
{0x341C, 0xFF},
@@ -775,14 +479,14 @@
{0x3760, 0x01},
{0x3768, 0x1B},
{0x3769, 0x1B},
- {0x376A, 0x1B},//full
+ {0x376A, 0x1B},
{0x376B, 0x1B},
{0x376C, 0x1A},
{0x376D, 0x17},
- {0x376E, 0x0F}, /* Each frame gain adjustment EN */
+ {0x376E, 0x0F},
{0x3776, 0x00},
{0x3777, 0x00},
- {0x3778, 0x46},//full
+ {0x3778, 0x46},
{0x3779, 0x00},
{0x377A, 0x89},
{0x377B, 0x00},
@@ -806,16 +510,6 @@
{0x3792, 0x43},
{0x3794, 0x7A},
{0x3796, 0xA1},
- {0x3A18, 0x8F},
- {0x3A1A, 0x4f},
- {0x3A1C, 0x47},
- {0x3A1E, 0x37},
- {0x3A1F, 0x01},
- {0x3A20, 0x4F},
- {0x3A22, 0x87},
- {0x3A24, 0x4F},
- {0x3A26, 0x7F},
- {0x3A28, 0x3F},
{REG_NULL, 0x00},
};
@@ -848,24 +542,6 @@
.reg_list = imx335_linear_10bit_2592x1944_regs,
.hdr_mode = NO_HDR,
.bpp = 10,
- .mipi_freq_idx = 1,
- },
- {
- /* 1H period = 7.4us */
- .bus_fmt = MEDIA_BUS_FMT_SRGGB12_1X12,
- .width = 1308,
- .height = 984,
- .max_fps = {
- .numerator = 10000,
- .denominator = 300000,
- },
- .exp_def = 0x600,
- .hts_def = 0x0226 * IMX335_4LANES * 2,
- .vts_def = 0x1194,
- .reg_list = imx335_linear_12bit_1296x972_regs,
- .hdr_mode = NO_HDR,
- .bpp = 12,
- .mipi_freq_idx = 0,
},
{
/* 1H period = 3.70us */
@@ -886,7 +562,6 @@
.reg_list = imx335_hdr2_10bit_2592x1944_regs,
.hdr_mode = HDR_X2,
.bpp = 10,
- .mipi_freq_idx = 1,
.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
.vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1,
@@ -911,7 +586,6 @@
.reg_list = imx335_hdr3_10bit_2592x1944_regs,
.hdr_mode = HDR_X3,
.bpp = 10,
- .mipi_freq_idx = 1,
.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2,
.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
.vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
@@ -920,7 +594,6 @@
};
static const s64 link_freq_items[] = {
- MIPI_FREQ_445M,
MIPI_FREQ_594M,
};
@@ -1044,7 +717,6 @@
struct imx335 *imx335 = to_imx335(sd);
const struct imx335_mode *mode;
s64 h_blank, vblank_def;
- s64 dst_pixel_rate = 0;
mutex_lock(&imx335->mutex);
@@ -1065,12 +737,6 @@
__v4l2_ctrl_modify_range(imx335->vblank, vblank_def,
IMX335_VTS_MAX - mode->height,
1, vblank_def);
- dst_pixel_rate = ((u32)link_freq_items[mode->mipi_freq_idx]) /
- mode->bpp * 2 * IMX335_4LANES;
- __v4l2_ctrl_s_ctrl_int64(imx335->pixel_rate,
- dst_pixel_rate);
- __v4l2_ctrl_s_ctrl(imx335->link_freq,
- mode->mipi_freq_idx);
}
mutex_unlock(&imx335->mutex);
@@ -1142,14 +808,12 @@
struct imx335 *imx335 = to_imx335(sd);
const struct imx335_mode *mode = imx335->cur_mode;
- mutex_lock(&imx335->mutex);
fi->interval = mode->max_fps;
- mutex_unlock(&imx335->mutex);
return 0;
}
-static int imx335_g_mbus_config(struct v4l2_subdev *sd,
+static int imx335_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
struct v4l2_mbus_config *config)
{
u32 val = 0;
@@ -1163,7 +827,7 @@
val |= V4L2_MBUS_CSI2_CHANNEL_1;
if (mode->hdr_mode == HDR_X3)
val |= V4L2_MBUS_CSI2_CHANNEL_2;
- config->type = V4L2_MBUS_CSI2;
+ config->type = V4L2_MBUS_CSI2_DPHY;
config->flags = val;
return 0;
@@ -1261,7 +925,7 @@
}
rhs1 = SHR1_MIN + s_exp_time;
- rhs1 = (rhs1 + 7u) / 8 * 8 + 2; /* shall be 8n + 2 */
+ rhs1 = (rhs1 & ~0x7) + 2; /* shall be 8n + 2 */
if (rhs1 > rhs1_max)
rhs1 = rhs1_max;
if (rhs1 < rhs1_min)
@@ -1591,7 +1255,6 @@
u32 i, h, w;
long ret = 0;
u32 stream = 0;
- s64 dst_pixel_rate = 0;
switch (cmd) {
case PREISP_CMD_SET_HDRAE_EXP:
@@ -1632,12 +1295,6 @@
__v4l2_ctrl_modify_range(imx335->vblank, h,
IMX335_VTS_MAX - imx335->cur_mode->height,
1, h);
- dst_pixel_rate = ((u32)link_freq_items[imx335->cur_mode->mipi_freq_idx]) /
- imx335->cur_mode->bpp * 2 * IMX335_4LANES;
- __v4l2_ctrl_s_ctrl_int64(imx335->pixel_rate,
- dst_pixel_rate);
- __v4l2_ctrl_s_ctrl(imx335->link_freq,
- imx335->cur_mode->mipi_freq_idx);
}
break;
case RKMODULE_SET_QUICK_STREAM:
@@ -1650,12 +1307,6 @@
else
imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE,
IMX335_REG_VALUE_08BIT, 1);
- break;
- case RKMODULE_GET_READOUT_LINE_CNT_PER_LINE:
- if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964)
- *((u32 *)arg) = 2;
- else
- *((u32 *)arg) = 4;
break;
default:
ret = -ENOIOCTLCMD;
@@ -1676,7 +1327,6 @@
struct preisp_hdrae_exp_s *hdrae;
long ret;
u32 stream = 0;
- u32 readout = 0;
switch (cmd) {
case RKMODULE_GET_MODULE_INFO:
@@ -1687,10 +1337,8 @@
}
ret = imx335_ioctl(sd, cmd, inf);
- if (!ret) {
- if (copy_to_user(up, inf, sizeof(*inf)))
- ret = -EFAULT;
- }
+ if (!ret)
+ ret = copy_to_user(up, inf, sizeof(*inf));
kfree(inf);
break;
case RKMODULE_AWB_CFG:
@@ -1703,8 +1351,6 @@
ret = copy_from_user(cfg, up, sizeof(*cfg));
if (!ret)
ret = imx335_ioctl(sd, cmd, cfg);
- else
- ret = -EFAULT;
kfree(cfg);
break;
case RKMODULE_GET_HDR_CFG:
@@ -1715,10 +1361,8 @@
}
ret = imx335_ioctl(sd, cmd, hdr);
- if (!ret) {
- if (copy_to_user(up, hdr, sizeof(*hdr)))
- ret = -EFAULT;
- }
+ if (!ret)
+ ret = copy_to_user(up, hdr, sizeof(*hdr));
kfree(hdr);
break;
case RKMODULE_SET_HDR_CFG:
@@ -1731,8 +1375,6 @@
ret = copy_from_user(hdr, up, sizeof(*hdr));
if (!ret)
ret = imx335_ioctl(sd, cmd, hdr);
- else
- ret = -EFAULT;
kfree(hdr);
break;
case PREISP_CMD_SET_HDRAE_EXP:
@@ -1745,23 +1387,12 @@
ret = copy_from_user(hdrae, up, sizeof(*hdrae));
if (!ret)
ret = imx335_ioctl(sd, cmd, hdrae);
- else
- ret = -EFAULT;
kfree(hdrae);
break;
case RKMODULE_SET_QUICK_STREAM:
ret = copy_from_user(&stream, up, sizeof(u32));
if (!ret)
ret = imx335_ioctl(sd, cmd, &stream);
- else
- ret = -EFAULT;
- break;
- case RKMODULE_GET_READOUT_LINE_CNT_PER_LINE:
- ret = imx335_ioctl(sd, cmd, &readout);
- if (!ret) {
- if (copy_to_user(up, &readout, sizeof(u32)))
- ret = -EFAULT;
- }
break;
default:
ret = -ENOIOCTLCMD;
@@ -2005,8 +1636,6 @@
#define DST_WIDTH 2592
#define DST_HEIGHT 1944
-#define BINNING_WIDTH 1296
-#define BINNING_HEIGHT 972
/*
* The resolution of the driver configuration needs to be exactly
@@ -2021,23 +1650,15 @@
struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_selection *sel)
{
- struct imx335 *imx335 = to_imx335(sd);
/*
* From "Pixel Array Image Drawing in All scan mode",
* there are 12 pixel offset on horizontal and vertical.
*/
if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
- if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) {
- sel->r.left = 12;
- sel->r.width = DST_WIDTH;
- sel->r.top = 12;
- sel->r.height = DST_HEIGHT;
- } else {
- sel->r.left = 4;
- sel->r.width = BINNING_WIDTH;
- sel->r.top = 8;
- sel->r.height = BINNING_HEIGHT;
- }
+ sel->r.left = 12;
+ sel->r.width = DST_WIDTH;
+ sel->r.top = 12;
+ sel->r.height = DST_HEIGHT;
return 0;
}
return -EINVAL;
@@ -2063,7 +1684,6 @@
static const struct v4l2_subdev_video_ops imx335_video_ops = {
.s_stream = imx335_s_stream,
.g_frame_interval = imx335_g_frame_interval,
- .g_mbus_config = imx335_g_mbus_config,
};
static const struct v4l2_subdev_pad_ops imx335_pad_ops = {
@@ -2073,6 +1693,7 @@
.get_fmt = imx335_get_fmt,
.set_fmt = imx335_set_fmt,
.get_selection = imx335_get_selection,
+ .get_mbus_config = imx335_g_mbus_config,
};
static const struct v4l2_subdev_ops imx335_subdev_ops = {
@@ -2111,7 +1732,7 @@
switch (ctrl->id) {
case V4L2_CID_EXPOSURE:
if (imx335->cur_mode->hdr_mode != NO_HDR)
- return ret;
+ goto ctrl_end;
shr0 = imx335->cur_vts - ctrl->val;
ret = imx335_write_reg(imx335->client, IMX335_LF_EXPO_REG_L,
IMX335_REG_VALUE_08BIT,
@@ -2127,7 +1748,7 @@
break;
case V4L2_CID_ANALOGUE_GAIN:
if (imx335->cur_mode->hdr_mode != NO_HDR)
- return ret;
+ goto ctrl_end;
ret = imx335_write_reg(imx335->client, IMX335_LF_GAIN_REG_H,
IMX335_REG_VALUE_08BIT,
IMX335_FETCH_GAIN_H(ctrl->val));
@@ -2166,269 +1787,39 @@
break;
case V4L2_CID_HFLIP:
ret = imx335_write_reg(imx335->client, IMX335_HREVERSE_REG,
- IMX335_REG_VALUE_08BIT, ctrl->val);
+ IMX335_REG_VALUE_08BIT, !!ctrl->val);
break;
case V4L2_CID_VFLIP:
if (ctrl->val) {
ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG,
- IMX335_REG_VALUE_08BIT, ctrl->val);
- if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) {
- ret |= imx335_write_reg(imx335->client, 0x3078,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3079,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x307a,
- IMX335_REG_VALUE_08BIT, 0xff);
- ret |= imx335_write_reg(imx335->client, 0x307b,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x307c,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307d,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307e,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307f,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3080,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3081,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x3082,
- IMX335_REG_VALUE_08BIT, 0xff);
- ret |= imx335_write_reg(imx335->client, 0x3083,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x3084,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3085,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3086,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3087,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30a4,
- IMX335_REG_VALUE_08BIT, 0x33);
- ret |= imx335_write_reg(imx335->client, 0x30a8,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30a9,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x30ac,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30ad,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b0,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30b1,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x30b4,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b5,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b6,
- IMX335_REG_VALUE_08BIT, 0xfa);
- ret |= imx335_write_reg(imx335->client, 0x30b7,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3112,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x3113,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3116,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3117,
- IMX335_REG_VALUE_08BIT, 0x00);
- } else {
- ret |= imx335_write_reg(imx335->client, 0x3078,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3079,
- IMX335_REG_VALUE_08BIT, 0xfd);
- ret |= imx335_write_reg(imx335->client, 0x307a,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307b,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x307c,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307d,
- IMX335_REG_VALUE_08BIT, 0xfb);
- ret |= imx335_write_reg(imx335->client, 0x307e,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307f,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3080,
- IMX335_REG_VALUE_08BIT, 0xfc);
- ret |= imx335_write_reg(imx335->client, 0x3081,
- IMX335_REG_VALUE_08BIT, 0x05);
- ret |= imx335_write_reg(imx335->client, 0x3082,
- IMX335_REG_VALUE_08BIT, 0xfc);
- ret |= imx335_write_reg(imx335->client, 0x3083,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3084,
- IMX335_REG_VALUE_08BIT, 0xfc);
- ret |= imx335_write_reg(imx335->client, 0x3085,
- IMX335_REG_VALUE_08BIT, 0x03);
- ret |= imx335_write_reg(imx335->client, 0x3086,
- IMX335_REG_VALUE_08BIT, 0xfc);
- ret |= imx335_write_reg(imx335->client, 0x3087,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x30a4,
- IMX335_REG_VALUE_08BIT, 0x77);
- ret |= imx335_write_reg(imx335->client, 0x30a8,
- IMX335_REG_VALUE_08BIT, 0x20);
- ret |= imx335_write_reg(imx335->client, 0x30a9,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30ac,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x30ad,
- IMX335_REG_VALUE_08BIT, 0x78);
- ret |= imx335_write_reg(imx335->client, 0x30b0,
- IMX335_REG_VALUE_08BIT, 0x20);
- ret |= imx335_write_reg(imx335->client, 0x30b1,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b4,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30b5,
- IMX335_REG_VALUE_08BIT, 0x70);
- ret |= imx335_write_reg(imx335->client, 0x30b6,
- IMX335_REG_VALUE_08BIT, 0xf2);
- ret |= imx335_write_reg(imx335->client, 0x30b7,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3112,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x3113,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3116,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3117,
- IMX335_REG_VALUE_08BIT, 0x00);
- }
+ IMX335_REG_VALUE_08BIT, !!ctrl->val);
+ ret |= imx335_write_reg(imx335->client, 0x3081,
+ IMX335_REG_VALUE_08BIT, 0xfe);
+ ret |= imx335_write_reg(imx335->client, 0x3083,
+ IMX335_REG_VALUE_08BIT, 0xfe);
+ ret |= imx335_write_reg(imx335->client, 0x30b6,
+ IMX335_REG_VALUE_08BIT, 0xfa);
+ ret |= imx335_write_reg(imx335->client, 0x30b7,
+ IMX335_REG_VALUE_08BIT, 0x01);
+ ret |= imx335_write_reg(imx335->client, 0x3116,
+ IMX335_REG_VALUE_08BIT, 0x02);
+ ret |= imx335_write_reg(imx335->client, 0x3117,
+ IMX335_REG_VALUE_08BIT, 0x00);
} else {
ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG,
- IMX335_REG_VALUE_08BIT, ctrl->val);
- if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) {
- ret |= imx335_write_reg(imx335->client, 0x3078,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3079,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x307a,
- IMX335_REG_VALUE_08BIT, 0xff);
- ret |= imx335_write_reg(imx335->client, 0x307b,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x307c,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307d,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307e,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x307f,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3080,
- IMX335_REG_VALUE_08BIT, 0x01);
- ret |= imx335_write_reg(imx335->client, 0x3081,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3082,
- IMX335_REG_VALUE_08BIT, 0xff);
- ret |= imx335_write_reg(imx335->client, 0x3083,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3084,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3085,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3086,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3087,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30a4,
- IMX335_REG_VALUE_08BIT, 0x33);
- ret |= imx335_write_reg(imx335->client, 0x30a8,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30a9,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x30ac,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30ad,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b0,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30b1,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x30b4,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b5,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b6,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b7,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3112,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x3113,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3116,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x3117,
- IMX335_REG_VALUE_08BIT, 0x00);
- } else {
- ret |= imx335_write_reg(imx335->client, 0x3078,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3079,
- IMX335_REG_VALUE_08BIT, 0xfd);
- ret |= imx335_write_reg(imx335->client, 0x307a,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307b,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x307c,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307d,
- IMX335_REG_VALUE_08BIT, 0xfb);
- ret |= imx335_write_reg(imx335->client, 0x307e,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x307f,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x3080,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3081,
- IMX335_REG_VALUE_08BIT, 0xfd);
- ret |= imx335_write_reg(imx335->client, 0x3082,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3083,
- IMX335_REG_VALUE_08BIT, 0xfe);
- ret |= imx335_write_reg(imx335->client, 0x3084,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3085,
- IMX335_REG_VALUE_08BIT, 0xfb);
- ret |= imx335_write_reg(imx335->client, 0x3086,
- IMX335_REG_VALUE_08BIT, 0x04);
- ret |= imx335_write_reg(imx335->client, 0x3087,
- IMX335_REG_VALUE_08BIT, 0x02);
- ret |= imx335_write_reg(imx335->client, 0x30a4,
- IMX335_REG_VALUE_08BIT, 0x77);
- ret |= imx335_write_reg(imx335->client, 0x30a8,
- IMX335_REG_VALUE_08BIT, 0x20);
- ret |= imx335_write_reg(imx335->client, 0x30a9,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30ac,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x30ad,
- IMX335_REG_VALUE_08BIT, 0x08);
- ret |= imx335_write_reg(imx335->client, 0x30b0,
- IMX335_REG_VALUE_08BIT, 0x20);
- ret |= imx335_write_reg(imx335->client, 0x30b1,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b4,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30b5,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x30b6,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x30b7,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3112,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x3113,
- IMX335_REG_VALUE_08BIT, 0x00);
- ret |= imx335_write_reg(imx335->client, 0x3116,
- IMX335_REG_VALUE_08BIT, 0x10);
- ret |= imx335_write_reg(imx335->client, 0x3117,
- IMX335_REG_VALUE_08BIT, 0x00);
- }
+ IMX335_REG_VALUE_08BIT, !!ctrl->val);
+ ret |= imx335_write_reg(imx335->client, 0x3081,
+ IMX335_REG_VALUE_08BIT, 0x02);
+ ret |= imx335_write_reg(imx335->client, 0x3083,
+ IMX335_REG_VALUE_08BIT, 0x02);
+ ret |= imx335_write_reg(imx335->client, 0x30b6,
+ IMX335_REG_VALUE_08BIT, 0x00);
+ ret |= imx335_write_reg(imx335->client, 0x30b7,
+ IMX335_REG_VALUE_08BIT, 0x00);
+ ret |= imx335_write_reg(imx335->client, 0x3116,
+ IMX335_REG_VALUE_08BIT, 0x08);
+ ret |= imx335_write_reg(imx335->client, 0x3117,
+ IMX335_REG_VALUE_08BIT, 0x00);
}
break;
default:
@@ -2437,6 +1828,7 @@
break;
}
+ctrl_end:
pm_runtime_put(&client->dev);
return ret;
@@ -2468,7 +1860,7 @@
link_freq_items);
/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
- pixel_rate = (u32)link_freq_items[mode->mipi_freq_idx] / mode->bpp * 2 * IMX335_4LANES;
+ pixel_rate = (u32)link_freq_items[0] / mode->bpp * 2 * IMX335_4LANES;
imx335->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
V4L2_CID_PIXEL_RATE, 0, pixel_rate, 1, pixel_rate);
--
Gitblit v1.6.2