From 188658b88afebf2d032b7e23ab3c1e87f216f67e Mon Sep 17 00:00:00 2001
From: Benjamin Schaaf <ben.schaaf@gmail.com>
Date: Mon, 22 Nov 2021 23:38:26 +1100
Subject: [PATCH 074/463] media: ov5640: Fix focus commands blocking until
 complete

Previously setting the focus controls would block until the sensor
completed the focus routine.
---
 drivers/media/i2c/ov5640.c | 67 ++++++++++----------------------------
 1 file changed, 18 insertions(+), 49 deletions(-)

diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c
index 74004ede5fc81..59a644dc36e23 100644
--- a/drivers/media/i2c/ov5640.c
+++ b/drivers/media/i2c/ov5640.c
@@ -2642,6 +2642,19 @@ static int ov5640_copy_fw_to_device(struct ov5640_dev *sensor,
 	return -ETIMEDOUT;
 }
 
+static int ov5640_fw_command(struct ov5640_dev *sensor, int command)
+{
+	int ret;
+
+	ret = ov5640_write_reg(sensor, OV5640_REG_FW_CMD_MAIN, command);
+	if(ret)
+		return ret;
+
+	msleep(5);
+
+	return 0;
+}
+
 static int ov5640_af_init(struct ov5640_dev *sensor)
 {
 	struct i2c_client *client = sensor->i2c_client;
@@ -2679,6 +2692,11 @@ static int ov5640_af_init(struct ov5640_dev *sensor)
 
 	// Set lens focus driver on
 	ret = ov5640_write_reg(sensor, OV5640_REG_VCM_CONTROL4, 0x3f);
+	if (ret)
+		return ret;
+
+	// Set the default focus zone
+	ret = ov5640_fw_command(sensor, OV5640_FW_CMD_ZONE_CONFIG);
 	if (ret)
 		return ret;
 	return ret;
@@ -3303,35 +3321,6 @@ static int ov5640_set_framefmt(struct ov5640_dev *sensor,
 			      is_jpeg ? (BIT(5) | BIT(3)) : 0);
 }
 
-static int ov5640_fw_command(struct ov5640_dev *sensor, int command)
-{
-	u8 fw_ack;
-	int i;
-	int ret;
-
-	ret = ov5640_write_reg(sensor, OV5640_REG_FW_CMD_ACK, 0x01);
-	if(ret)
-		return ret;
-	
-	ret = ov5640_write_reg(sensor, OV5640_REG_FW_CMD_MAIN, command);
-	if(ret)
-		return ret;
-
-	for (i = 0; i < 100; i++) {
-		ret = ov5640_read_reg(sensor, OV5640_REG_FW_CMD_ACK, &fw_ack);
-		if (ret)
-			return ret;
-
-		if (fw_ack == 0){
-			return ret;
-		}
-
-		msleep(50);
-	}
-	return -ETIMEDOUT;
-}
-
-
 /*
  * Sensor Controls.
  */
@@ -3467,26 +3456,6 @@ static int ov5640_set_ctrl_focus(struct ov5640_dev *sensor, int command)
 		return 0;
 	}
 
-	if (command == OV5640_FW_CMD_RELEASE_FOCUS) {
-		dev_dbg(&client->dev, "%s: Releasing autofocus\n",
-			__func__);
-		return ov5640_fw_command(sensor, OV5640_FW_CMD_RELEASE_FOCUS);
-	}
-	
-	// Restart zone config
-	ret = ov5640_fw_command(sensor, OV5640_FW_CMD_ZONE_CONFIG);
-	if (ret)
-		return ret;
-
-	// Set default focus zones
-	ret = ov5640_fw_command(sensor, OV5640_FW_CMD_DEFAULT_ZONES);
-	if (ret)
-		return ret;
-
-	dev_dbg(&client->dev, "%s: Triggering autofocus\n",
-		__func__);
-
-	// Start focussing
 	return ov5640_fw_command(sensor, command);
 }
 
-- 
2.46.0

