aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch98
1 files changed, 98 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch b/target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch
new file mode 100644
index 0000000000..526dd668bb
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.15/950-0723-media-i2c-Add-ov7251_detect_chip.patch
@@ -0,0 +1,98 @@
+From d67eece3a8ba9e8961e6050129f6f76d31924d62 Mon Sep 17 00:00:00 2001
+From: Daniel Scally <djrscally@gmail.com>
+Date: Tue, 15 Feb 2022 23:07:34 +0000
+Subject: [PATCH] media: i2c: Add ov7251_detect_chip()
+
+.probe() is quite busy for this driver; make it cleaner by moving the
+chip verification to a dedicated function.
+
+Signed-off-by: Daniel Scally <djrscally@gmail.com>
+---
+ drivers/media/i2c/ov7251.c | 62 +++++++++++++++++++++-----------------
+ 1 file changed, 35 insertions(+), 27 deletions(-)
+
+--- a/drivers/media/i2c/ov7251.c
++++ b/drivers/media/i2c/ov7251.c
+@@ -1442,12 +1442,44 @@ out_free_bus_cfg:
+ return ret;
+ }
+
++static int ov7251_detect_chip(struct ov7251 *ov7251)
++{
++ u8 chip_id_high, chip_id_low, chip_rev;
++ int ret;
++
++ ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_HIGH, &chip_id_high);
++ if (ret < 0 || chip_id_high != OV7251_CHIP_ID_HIGH_BYTE)
++ return dev_err_probe(ov7251->dev, -ENODEV,
++ "could not read ID high\n");
++
++ ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_LOW, &chip_id_low);
++ if (ret < 0 || chip_id_low != OV7251_CHIP_ID_LOW_BYTE)
++ return dev_err_probe(ov7251->dev, -ENODEV,
++ "could not read ID low\n");
++
++ ret = ov7251_read_reg(ov7251, OV7251_SC_GP_IO_IN1, &chip_rev);
++ if (ret < 0)
++ return dev_err_probe(ov7251->dev, -ENODEV,
++ "could not read revision\n");
++ chip_rev >>= 4;
++
++ dev_info(ov7251->dev,
++ "OV7251 revision %x (%s) detected at address 0x%02x\n",
++ chip_rev,
++ chip_rev == 0x4 ? "1A / 1B" :
++ chip_rev == 0x5 ? "1C / 1D" :
++ chip_rev == 0x6 ? "1E" :
++ chip_rev == 0x7 ? "1F" : "unknown",
++ ov7251->i2c_client->addr);
++
++ return 0;
++}
++
+ static int ov7251_probe(struct i2c_client *client)
+ {
+ struct v4l2_fwnode_device_properties props;
+ struct device *dev = &client->dev;
+ struct ov7251 *ov7251;
+- u8 chip_id_high, chip_id_low, chip_rev;
+ unsigned int rate = 0;
+ int ret;
+ int i;
+@@ -1589,34 +1621,10 @@ static int ov7251_probe(struct i2c_clien
+ goto free_entity;
+ }
+
+- ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_HIGH, &chip_id_high);
+- if (ret < 0 || chip_id_high != OV7251_CHIP_ID_HIGH_BYTE) {
+- dev_err(dev, "could not read ID high\n");
+- ret = -ENODEV;
+- goto power_down;
+- }
+- ret = ov7251_read_reg(ov7251, OV7251_CHIP_ID_LOW, &chip_id_low);
+- if (ret < 0 || chip_id_low != OV7251_CHIP_ID_LOW_BYTE) {
+- dev_err(dev, "could not read ID low\n");
+- ret = -ENODEV;
+- goto power_down;
+- }
+-
+- ret = ov7251_read_reg(ov7251, OV7251_SC_GP_IO_IN1, &chip_rev);
+- if (ret < 0) {
+- dev_err(dev, "could not read revision\n");
+- ret = -ENODEV;
++ ret = ov7251_detect_chip(ov7251);
++ if (ret)
+ goto power_down;
+- }
+- chip_rev >>= 4;
+
+- dev_info(dev, "OV7251 revision %x (%s) detected at address 0x%02x\n",
+- chip_rev,
+- chip_rev == 0x4 ? "1A / 1B" :
+- chip_rev == 0x5 ? "1C / 1D" :
+- chip_rev == 0x6 ? "1E" :
+- chip_rev == 0x7 ? "1F" : "unknown",
+- client->addr);
+
+ ret = ov7251_read_reg(ov7251, OV7251_PRE_ISP_00,
+ &ov7251->pre_isp_00);