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/os02k10.c |   51 +++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/kernel/drivers/media/i2c/os02k10.c b/kernel/drivers/media/i2c/os02k10.c
index 3988053..0a064cd 100644
--- a/kernel/drivers/media/i2c/os02k10.c
+++ b/kernel/drivers/media/i2c/os02k10.c
@@ -47,7 +47,7 @@
 
 #define OS02K10_XVCLK_FREQ		24000000
 
-#define CHIP_ID				0x530243
+#define CHIP_ID				0x005302
 #define OS02K10_REG_CHIP_ID		0x300a
 
 #define OS02K10_REG_CTRL_MODE		0x0100
@@ -1806,6 +1806,7 @@
 	s64 max;
 	int ret = 0;
 	u32 val = 0;
+	u32 reg_data;
 
 	/* Propagate change of current control to all related controls */
 	switch (ctrl->id) {
@@ -1835,23 +1836,53 @@
 		}
 		break;
 	case V4L2_CID_ANALOGUE_GAIN:
+		/*
+		 * dgain reg format is 4.10bits, again reg format is 4.4bits
+		 * 1x is 64, 6 decimal places
+		 */
 		if (ctrl->val > 992) {
-			dgain = ctrl->val * 1024 / 992;
+			dgain = ctrl->val * 1024 / 992;	//15.5X * 64 = 992
 			again = 992;
 		} else {
-			dgain = 1024;
+			dgain = 1024;	//move 10 bits left
 			again = ctrl->val;
 		}
 		dev_dbg(&client->dev, "gain %d, ag 0x%x, dg 0x%x\n",
 			ctrl->val, again, dgain);
-		ret = os02k10_write_reg(os02k10->client,
+
+		ret |= os02k10_read_reg(os02k10->client, OS02K10_AEC_LONG_REL_GAIN_REG_H,
+			       OS02K10_REG_VALUE_08BIT, &reg_data);
+		reg_data = reg_data & 0xf0;
+		ret |= os02k10_write_reg(os02k10->client,
 					OS02K10_AEC_LONG_REL_GAIN_REG_H,
-					OS02K10_REG_VALUE_16BIT,
-					(again << 2) & 0xff0);
+					OS02K10_REG_VALUE_08BIT,
+					((again >> 6) & 0x0f) | reg_data);
+		ret |= os02k10_read_reg(os02k10->client, OS02K10_AEC_LONG_REL_GAIN_REG_L,
+			       OS02K10_REG_VALUE_08BIT, &reg_data);
+		reg_data = reg_data & 0x0f;
+		ret |= os02k10_write_reg(os02k10->client,
+					OS02K10_AEC_LONG_REL_GAIN_REG_L,
+					OS02K10_REG_VALUE_08BIT,
+					(((again >> 2) & 0x0f) << 4) | reg_data);
+
+		ret |= os02k10_read_reg(os02k10->client, OS02K10_AEC_LONG_DIG_GAIN_REG_H,
+			       OS02K10_REG_VALUE_08BIT, &reg_data);
+		reg_data = reg_data & 0xf0;
 		ret |= os02k10_write_reg(os02k10->client,
 					 OS02K10_AEC_LONG_DIG_GAIN_REG_H,
-					 OS02K10_REG_VALUE_24BIT,
-					 (dgain << 6) & 0xfffc0);
+					 OS02K10_REG_VALUE_08BIT,
+					 ((dgain >> 10) & 0x0f) | reg_data);
+		ret |= os02k10_write_reg(os02k10->client,
+					 OS02K10_AEC_LONG_DIG_GAIN_REG_M,
+					 OS02K10_REG_VALUE_08BIT,
+					 (dgain >> 2) & 0xff);
+		ret |= os02k10_read_reg(os02k10->client, OS02K10_AEC_LONG_DIG_GAIN_REG_L,
+			       OS02K10_REG_VALUE_08BIT, &reg_data);
+		reg_data = reg_data & 0x3f;
+		ret |= os02k10_write_reg(os02k10->client,
+					 OS02K10_AEC_LONG_DIG_GAIN_REG_L,
+					 OS02K10_REG_VALUE_08BIT,
+					 ((dgain & 0x03) << 6) | reg_data);
 		break;
 	case V4L2_CID_VBLANK:
 		dev_dbg(&client->dev, "set blank value 0x%x\n", ctrl->val);
@@ -2095,11 +2126,11 @@
 		return -EINVAL;
 	}
 
-	os02k10->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS);
+	os02k10->reset_gpio = devm_gpiod_get(dev, "reset", os02k10->is_thunderboot ? GPIOD_ASIS : GPIOD_OUT_LOW);
 	if (IS_ERR(os02k10->reset_gpio))
 		dev_warn(dev, "Failed to get reset-gpios\n");
 
-	os02k10->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_ASIS);
+	os02k10->pwdn_gpio = devm_gpiod_get(dev, "pwdn", os02k10->is_thunderboot ? GPIOD_ASIS : GPIOD_OUT_LOW);
 	if (IS_ERR(os02k10->pwdn_gpio))
 		dev_warn(dev, "Failed to get pwdn-gpios\n");
 

--
Gitblit v1.6.2