mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 00:15:49 -04:00
media: i2c: tc358743: export InfoFrames to debugfs
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>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
42765902bd
commit
23788ceb87
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user