mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
99 lines
3.1 KiB
Diff
99 lines
3.1 KiB
Diff
From 6e089b7c2526037b0eaf9ecaed4d38957f33c19c Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
|
Date: Wed, 31 Oct 2018 14:57:34 +0000
|
|
Subject: [PATCH] media: tc358743: Check I2C succeeded during probe.
|
|
|
|
The probe for the TC358743 reads the CHIPID register from
|
|
the device and compares it to the expected value of 0.
|
|
If the I2C request fails then that also returns 0, so
|
|
the driver loads thinking that the device is there.
|
|
|
|
Generally I2C communications are reliable so there is
|
|
limited need to check the return value on every transfer,
|
|
therefore only amend the one read during probe to check
|
|
for I2C errors.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
|
|
---
|
|
drivers/media/i2c/tc358743.c | 27 +++++++++++++++++++++++----
|
|
1 file changed, 23 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/media/i2c/tc358743.c
|
|
+++ b/drivers/media/i2c/tc358743.c
|
|
@@ -110,7 +110,7 @@ static inline struct tc358743_state *to_
|
|
|
|
/* --------------- I2C --------------- */
|
|
|
|
-static void i2c_rd(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
|
|
+static int i2c_rd(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
|
|
{
|
|
struct tc358743_state *state = to_state(sd);
|
|
struct i2c_client *client = state->i2c_client;
|
|
@@ -136,6 +136,7 @@ static void i2c_rd(struct v4l2_subdev *s
|
|
v4l2_err(sd, "%s: reading register 0x%x from 0x%x failed\n",
|
|
__func__, reg, client->addr);
|
|
}
|
|
+ return err != ARRAY_SIZE(msgs);
|
|
}
|
|
|
|
static void i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)
|
|
@@ -192,15 +193,24 @@ static void i2c_wr(struct v4l2_subdev *s
|
|
}
|
|
}
|
|
|
|
-static noinline u32 i2c_rdreg(struct v4l2_subdev *sd, u16 reg, u32 n)
|
|
+static noinline u32 i2c_rdreg_err(struct v4l2_subdev *sd, u16 reg, u32 n,
|
|
+ int *err)
|
|
{
|
|
+ int error;
|
|
__le32 val = 0;
|
|
|
|
- i2c_rd(sd, reg, (u8 __force *)&val, n);
|
|
+ error = i2c_rd(sd, reg, (u8 __force *)&val, n);
|
|
+ if (err)
|
|
+ *err = error;
|
|
|
|
return le32_to_cpu(val);
|
|
}
|
|
|
|
+static inline u32 i2c_rdreg(struct v4l2_subdev *sd, u16 reg, u32 n)
|
|
+{
|
|
+ return i2c_rdreg_err(sd, reg, n, NULL);
|
|
+}
|
|
+
|
|
static noinline void i2c_wrreg(struct v4l2_subdev *sd, u16 reg, u32 val, u32 n)
|
|
{
|
|
__le32 raw = cpu_to_le32(val);
|
|
@@ -229,6 +239,13 @@ static u16 i2c_rd16(struct v4l2_subdev *
|
|
return i2c_rdreg(sd, reg, 2);
|
|
}
|
|
|
|
+static int i2c_rd16_err(struct v4l2_subdev *sd, u16 reg, u16 *value)
|
|
+{
|
|
+ int err;
|
|
+ *value = i2c_rdreg_err(sd, reg, 2, &err);
|
|
+ return err;
|
|
+}
|
|
+
|
|
static void i2c_wr16(struct v4l2_subdev *sd, u16 reg, u16 val)
|
|
{
|
|
i2c_wrreg(sd, reg, val, 2);
|
|
@@ -2054,6 +2071,7 @@ static int tc358743_probe(struct i2c_cli
|
|
struct tc358743_platform_data *pdata = client->dev.platform_data;
|
|
struct v4l2_subdev *sd;
|
|
u16 irq_mask = MASK_HDMI_MSK | MASK_CSI_MSK;
|
|
+ u16 chipid;
|
|
int err;
|
|
|
|
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
|
@@ -2086,7 +2104,8 @@ static int tc358743_probe(struct i2c_cli
|
|
sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
|
|
|
|
/* i2c access */
|
|
- if ((i2c_rd16(sd, CHIPID) & MASK_CHIPID) != 0) {
|
|
+ if (i2c_rd16_err(sd, CHIPID, &chipid) ||
|
|
+ (chipid & MASK_CHIPID) != 0) {
|
|
v4l2_info(sd, "not a TC358743 on address 0x%x\n",
|
|
client->addr << 1);
|
|
return -ENODEV;
|