From 07875fbe38d978ca53b16a6ac3ecf0656bff7880 Mon Sep 17 00:00:00 2001 From: Ankur Pawar Date: Fri, 10 Jan 2025 02:13:51 -0800 Subject: [PATCH] media: camera: v4l2-compliance fix Fix v4l2-compliance VIDIOC_G/S_PARM failure. Below is the function call sequence starting from ioctl. doioctl(VIDIOC_G_PARM) vidioc_g_parm tegra_channel_g_parm v4l2_g_parm_cap v4l2_subdev_call_state_active v4l2_subdev_call v4l2_subdev_call_wrappers.pad.get_frame_interval call_get_frame_interval check_frame_interval check_state In file: v4l2-subdev.c check_state() function failed at check: (!state || !state->pads) Which caused the function to return -EINVAL=-22. struct v4l2_subdev contain a member active_state which should be initialized to overcome the failure. To fill active_state call v4l2_subdev_init_finalize in tegracam_v4l2subdev_register(). This failure is seen in K6.8 because in earlier kernel, v4l2_subdev_call() was called instead of v4l2_subdev_call_state_active() in v4l2_g_parm_cap(). And v4l2_subdev doesn't contain active_state member in earlier kernel. Bug 4449673 Change-Id: Id0fbcf9476cf6d194b721f85790e95580ff4007d Signed-off-by: Ankur Pawar Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3281759 Reviewed-by: Frank Chen Reviewed-by: Praveen AC GVS: buildbot_gerritrpt --- drivers/media/platform/tegra/camera/tegracam_v4l2.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/tegra/camera/tegracam_v4l2.c b/drivers/media/platform/tegra/camera/tegracam_v4l2.c index ebf09b9e..b7b1ed8b 100644 --- a/drivers/media/platform/tegra/camera/tegracam_v4l2.c +++ b/drivers/media/platform/tegra/camera/tegracam_v4l2.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -// SPDX-FileCopyrightText: Copyright (c) 2018-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-FileCopyrightText: Copyright (c) 2018-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. /* * tegracam_v4l2 - tegra camera framework for v4l2 support */ @@ -256,6 +256,15 @@ int tegracam_v4l2subdev_register(struct tegracam_device *tc_dev, } #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + sd->state_lock = ctrl_hdl->ctrl_handler.lock; + err = v4l2_subdev_init_finalize(sd); + if (err < 0) { + dev_err(dev, "subdev init error: %d\n", err); + return err; + } +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) */ + #if defined(CONFIG_V4L2_ASYNC) return v4l2_async_register_subdev(sd); #else