From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 19 Dec 2024 01:47:39 +0000
Subject: [PATCH] add wifi6 8852be driver

---
 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