]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
media: i2c: tc358743: export InfoFrames to debugfs
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 28 Aug 2024 14:24:12 +0000 (16:24 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 12 Oct 2024 08:44:05 +0000 (10:44 +0200)
Export InfoFrames to debugfs.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Tested-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/tc358743.c

index 65d58ddf02870db83e9227234ae0707ccc061819..fd49bf8240518f1bcdd822fc9a470f678843a09a 100644 (file)
@@ -87,6 +87,10 @@ struct tc358743_state {
        struct timer_list timer;
        struct work_struct work_i2c_poll;
 
+       /* debugfs */
+       struct dentry *debugfs_dir;
+       struct v4l2_debugfs_if *infoframes;
+
        /* edid  */
        u8 edid_blocks_written;
 
@@ -430,12 +434,35 @@ static void tc358743_erase_bksv(struct v4l2_subdev *sd)
 
 /* --------------- AVI infoframe --------------- */
 
+static ssize_t
+tc358743_debugfs_if_read(u32 type, void *priv, struct file *filp,
+                        char __user *ubuf, size_t count, loff_t *ppos)
+{
+       u8 buf[V4L2_DEBUGFS_IF_MAX_LEN] = {};
+       struct v4l2_subdev *sd = priv;
+       int len;
+
+       if (!is_hdmi(sd))
+               return 0;
+
+       if (type != V4L2_DEBUGFS_IF_AVI)
+               return 0;
+
+       i2c_rd(sd, PK_AVI_0HEAD, buf, PK_AVI_16BYTE - PK_AVI_0HEAD + 1);
+       len = buf[2] + 4;
+       if (len > V4L2_DEBUGFS_IF_MAX_LEN)
+               len = -ENOENT;
+       if (len > 0)
+               len = simple_read_from_buffer(ubuf, count, ppos, buf, len);
+       return len < 0 ? 0 : len;
+}
+
 static void print_avi_infoframe(struct v4l2_subdev *sd)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct device *dev = &client->dev;
        union hdmi_infoframe frame;
-       u8 buffer[HDMI_INFOFRAME_SIZE(AVI)];
+       u8 buffer[HDMI_INFOFRAME_SIZE(AVI)] = {};
 
        if (!is_hdmi(sd)) {
                v4l2_info(sd, "DVI-D signal - AVI infoframe not supported\n");
@@ -2161,6 +2188,11 @@ static int tc358743_probe(struct i2c_client *client)
        if (err < 0)
                goto err_work_queues;
 
+       state->debugfs_dir = debugfs_create_dir(sd->name, v4l2_debugfs_root());
+       state->infoframes = v4l2_debugfs_if_alloc(state->debugfs_dir,
+                                                 V4L2_DEBUGFS_IF_AVI, sd,
+                                                 tc358743_debugfs_if_read);
+
        v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
                  client->addr << 1, client->adapter->name);
 
@@ -2188,6 +2220,8 @@ static void tc358743_remove(struct i2c_client *client)
                flush_work(&state->work_i2c_poll);
        }
        cancel_delayed_work_sync(&state->delayed_work_enable_hotplug);
+       v4l2_debugfs_if_free(state->infoframes);
+       debugfs_remove_recursive(state->debugfs_dir);
        cec_unregister_adapter(state->cec_adap);
        v4l2_async_unregister_subdev(sd);
        v4l2_device_unregister_subdev(sd);