Commit 23788ceb authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

media: i2c: tc358743: export InfoFrames to debugfs



Export InfoFrames to debugfs.

Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Tested-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 42765902
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -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);