On Wed Sep 30 14:41:31 2026 +0800, Hermes Wu wrote:
> it6625_get_detected_timings() manually assembled each 16-bit field from
> raw byte-buffer offsets with a shift-and-add sequence. Define two named
> structs of __be16 fields matching the contiguous REG_H_ACTIVE_1..
> REG_V_ACTIVE_0 and REG_H_FP_1..REG_V_BP_0 register layouts at file
> scope, immediately above the function that uses them -- this driver
> accesses many such register areas, so keep the layout struct separate
> from its one caller instead of declaring it locally. Read directly into
> them, and decode each field with be16_to_cpu(). Guard each struct's
> size with static_assert() against the expected register range width.
> 
> Every member is 2 bytes wide and naturally aligned, so the struct is
> laid out with no padding -- this is safe because the struct is the I2C
> read target itself, not a cast over a pre-existing raw buffer.
> 
> Signed-off-by: Hermes Wu <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/i2c/it6625.c | 48 ++++++++++++++++++++++++++++++----------------
 1 file changed, 32 insertions(+), 16 deletions(-)

---

diff --git a/drivers/media/i2c/it6625.c b/drivers/media/i2c/it6625.c
index 09af11db5aa8..dc0b12a6512f 100644
--- a/drivers/media/i2c/it6625.c
+++ b/drivers/media/i2c/it6625.c
@@ -768,14 +768,33 @@ static void it6625_hpd_delayed_work(struct work_struct 
*work)
        it6625_update_config(it6625);
 }
 
+/* REG_H_ACTIVE_1..REG_V_ACTIVE_0 */
+struct it6625_active_size_regs {
+       __be16 h_active;
+       __be16 v_active;
+};
+
+static_assert(sizeof(struct it6625_active_size_regs) == 4);
+
+/* REG_H_FP_1..REG_V_BP_0 */
+struct it6625_porch_regs {
+       __be16 hfrontporch;
+       __be16 hsync;
+       __be16 hbackporch;
+       __be16 vfrontporch;
+       __be16 vsync;
+       __be16 vbackporch;
+};
+
+static_assert(sizeof(struct it6625_porch_regs) == 12);
+
 static int it6625_get_detected_timings(struct it6625 *it6625,
                                       struct v4l2_dv_timings *timings)
 {
        struct v4l2_bt_timings *bt = &timings->bt;
+       struct it6625_active_size_regs active;
+       struct it6625_porch_regs porch;
        int val;
-       unsigned int width, height;
-       u8 buffer[4];
-       u8 buffer2[12];
 
        if (no_signal(it6625)) {
                dev_err(it6625->dev, "no signal detected");
@@ -795,24 +814,21 @@ static int it6625_get_detected_timings(struct it6625 
*it6625,
        bt->interlaced = val & B_INTERLACE ?
                         V4L2_DV_INTERLACED : V4L2_DV_PROGRESSIVE;
 
-       if (it6625_read_bytes(it6625, REG_H_ACTIVE_1, buffer, 4) < 0)
+       if (it6625_read_bytes(it6625, REG_H_ACTIVE_1, (u8 *)&active, 
sizeof(active)) < 0)
                return -EIO;
 
-       width = ((buffer[0] & 0xff) << 8) + buffer[1];
-       height = ((buffer[2] & 0xff) << 8) + buffer[3];
-
-       bt->width = width;
-       bt->height = height;
+       bt->width = be16_to_cpu(active.h_active);
+       bt->height = be16_to_cpu(active.v_active);
 
-       if (it6625_read_bytes(it6625, REG_H_FP_1, buffer2, 12) < 0)
+       if (it6625_read_bytes(it6625, REG_H_FP_1, (u8 *)&porch, sizeof(porch)) 
< 0)
                return -EIO;
 
-       bt->hfrontporch = ((buffer2[0] & 0xff) << 8) + buffer2[1];
-       bt->hsync = ((buffer2[2] & 0xff) << 8) + buffer2[3];
-       bt->hbackporch = ((buffer2[4] & 0xff) << 8) + buffer2[5];
-       bt->vfrontporch = ((buffer2[6] & 0xff) << 8) + buffer2[7];
-       bt->vsync = ((buffer2[8] & 0xff) << 8) + buffer2[9];
-       bt->vbackporch = ((buffer2[10] & 0xff) << 8) + buffer2[11];
+       bt->hfrontporch = be16_to_cpu(porch.hfrontporch);
+       bt->hsync = be16_to_cpu(porch.hsync);
+       bt->hbackporch = be16_to_cpu(porch.hbackporch);
+       bt->vfrontporch = be16_to_cpu(porch.vfrontporch);
+       bt->vsync = be16_to_cpu(porch.vsync);
+       bt->vbackporch = be16_to_cpu(porch.vbackporch);
 
        bt->pixelclock = it6625_get_pclk(it6625);
        if (bt->interlaced == V4L2_DV_INTERLACED) {
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to