Skip to content

Commit

Permalink
media: qcom: camss: csid: Only add TPG v4l2 ctrl if TPG hardware is a…
Browse files Browse the repository at this point in the history
…vailable

[ Upstream commit 2f1361f ]

There is no CSID TPG on some SoCs, so the v4l2 ctrl in CSID driver
shouldn't be registered. Checking the supported TPG modes to indicate
if the TPG hardware exists or not and only registering v4l2 ctrl for
CSID only when the TPG hardware is present.

Signed-off-by: Depeng Shao <quic_depengs@quicinc.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Depeng Shao authored and Greg Kroah-Hartman committed Jun 4, 2025
1 parent 6fed5e2 commit f312bd5
Showing 1 changed file with 35 additions and 25 deletions.
60 changes: 35 additions & 25 deletions drivers/media/platform/qcom/camss/camss-csid.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,13 @@ static int csid_set_stream(struct v4l2_subdev *sd, int enable)
int ret;

if (enable) {
ret = v4l2_ctrl_handler_setup(&csid->ctrls);
if (ret < 0) {
dev_err(csid->camss->dev,
"could not sync v4l2 controls: %d\n", ret);
return ret;
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) {
ret = v4l2_ctrl_handler_setup(&csid->ctrls);
if (ret < 0) {
dev_err(csid->camss->dev,
"could not sync v4l2 controls: %d\n", ret);
return ret;
}
}

if (!csid->testgen.enabled &&
Expand Down Expand Up @@ -318,7 +320,8 @@ static void csid_try_format(struct csid_device *csid,
break;

case MSM_CSID_PAD_SRC:
if (csid->testgen_mode->cur.val == 0) {
if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED ||
csid->testgen_mode->cur.val == 0) {
/* Test generator is disabled, */
/* keep pad formats in sync */
u32 code = fmt->code;
Expand Down Expand Up @@ -368,7 +371,8 @@ static int csid_enum_mbus_code(struct v4l2_subdev *sd,

code->code = csid->formats[code->index].code;
} else {
if (csid->testgen_mode->cur.val == 0) {
if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED ||
csid->testgen_mode->cur.val == 0) {
struct v4l2_mbus_framefmt *sink_fmt;

sink_fmt = __csid_get_format(csid, sd_state,
Expand Down Expand Up @@ -750,7 +754,8 @@ static int csid_link_setup(struct media_entity *entity,

/* If test generator is enabled */
/* do not allow a link from CSIPHY to CSID */
if (csid->testgen_mode->cur.val != 0)
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED &&
csid->testgen_mode->cur.val != 0)
return -EBUSY;

sd = media_entity_to_v4l2_subdev(remote->entity);
Expand Down Expand Up @@ -843,24 +848,27 @@ int msm_csid_register_entity(struct csid_device *csid,
MSM_CSID_NAME, csid->id);
v4l2_set_subdevdata(sd, csid);

ret = v4l2_ctrl_handler_init(&csid->ctrls, 1);
if (ret < 0) {
dev_err(dev, "Failed to init ctrl handler: %d\n", ret);
return ret;
}
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) {
ret = v4l2_ctrl_handler_init(&csid->ctrls, 1);
if (ret < 0) {
dev_err(dev, "Failed to init ctrl handler: %d\n", ret);
return ret;
}

csid->testgen_mode = v4l2_ctrl_new_std_menu_items(&csid->ctrls,
&csid_ctrl_ops, V4L2_CID_TEST_PATTERN,
csid->testgen.nmodes, 0, 0,
csid->testgen.modes);
csid->testgen_mode =
v4l2_ctrl_new_std_menu_items(&csid->ctrls,
&csid_ctrl_ops, V4L2_CID_TEST_PATTERN,
csid->testgen.nmodes, 0, 0,
csid->testgen.modes);

if (csid->ctrls.error) {
dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error);
ret = csid->ctrls.error;
goto free_ctrl;
}
if (csid->ctrls.error) {
dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error);
ret = csid->ctrls.error;
goto free_ctrl;
}

csid->subdev.ctrl_handler = &csid->ctrls;
csid->subdev.ctrl_handler = &csid->ctrls;
}

ret = csid_init_formats(sd, NULL);
if (ret < 0) {
Expand Down Expand Up @@ -891,7 +899,8 @@ int msm_csid_register_entity(struct csid_device *csid,
media_cleanup:
media_entity_cleanup(&sd->entity);
free_ctrl:
v4l2_ctrl_handler_free(&csid->ctrls);
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED)
v4l2_ctrl_handler_free(&csid->ctrls);

return ret;
}
Expand All @@ -904,5 +913,6 @@ void msm_csid_unregister_entity(struct csid_device *csid)
{
v4l2_device_unregister_subdev(&csid->subdev);
media_entity_cleanup(&csid->subdev.entity);
v4l2_ctrl_handler_free(&csid->ctrls);
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED)
v4l2_ctrl_handler_free(&csid->ctrls);
}

0 comments on commit f312bd5

Please sign in to comment.