From 04dd17822334871b23ea2862f7798fb0e0007777 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Sat, 11 May 2024 08:53:19 +0000 Subject: [PATCH] change otg to host mode --- kernel/drivers/media/i2c/sc430cs.c | 59 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 41 insertions(+), 18 deletions(-) diff --git a/kernel/drivers/media/i2c/sc430cs.c b/kernel/drivers/media/i2c/sc430cs.c index 5ff6850..8c88bc5 100644 --- a/kernel/drivers/media/i2c/sc430cs.c +++ b/kernel/drivers/media/i2c/sc430cs.c @@ -113,14 +113,6 @@ #define SC430CS_NUM_SUPPLIES ARRAY_SIZE(sc430cs_supply_names) -enum sc430cs_max_pad { - PAD0, /* link to isp */ - PAD1, /* link to csi wr0 | hdr x2:L x3:M */ - PAD2, /* link to csi wr1 | hdr x3:L */ - PAD3, /* link to csi wr2 | hdr x2:M x3:S */ - PAD_MAX, -}; - struct regval { u16 addr; u8 val; @@ -149,7 +141,7 @@ struct pinctrl *pinctrl; struct pinctrl_state *pins_default; struct pinctrl_state *pins_sleep; - + struct v4l2_fract cur_fps; struct v4l2_subdev subdev; struct media_pad pad; struct v4l2_ctrl_handler ctrl_handler; @@ -570,6 +562,8 @@ __v4l2_ctrl_modify_range(sc430cs->vblank, vblank_def, SC430CS_VTS_MAX - mode->height, 1, vblank_def); + sc430cs->cur_fps = mode->max_fps; + sc430cs->cur_vts = (u32)mode->vts_def; } mutex_unlock(&sc430cs->mutex); @@ -662,14 +656,15 @@ struct sc430cs *sc430cs = to_sc430cs(sd); const struct sc430cs_mode *mode = sc430cs->cur_mode; - mutex_lock(&sc430cs->mutex); - fi->interval = mode->max_fps; - mutex_unlock(&sc430cs->mutex); + if (sc430cs->streaming) + fi->interval = sc430cs->cur_fps; + else + fi->interval = mode->max_fps; return 0; } -static int sc430cs_g_mbus_config(struct v4l2_subdev *sd, +static int sc430cs_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id, struct v4l2_mbus_config *config) { struct sc430cs *sc430cs = to_sc430cs(sd); @@ -683,7 +678,7 @@ if (mode->hdr_mode == HDR_X3) val |= V4L2_MBUS_CSI2_CHANNEL_2; - config->type = V4L2_MBUS_CSI2; + config->type = V4L2_MBUS_CSI2_DPHY; config->flags = val; return 0; @@ -739,6 +734,8 @@ __v4l2_ctrl_modify_range(sc430cs->hblank, w, w, 1, w); __v4l2_ctrl_modify_range(sc430cs->vblank, h, SC430CS_VTS_MAX - sc430cs->cur_mode->height, 1, h); + sc430cs->cur_fps = sc430cs->cur_mode->max_fps; + sc430cs->cur_vts = sc430cs->cur_mode->vts_def; } break; case PREISP_CMD_SET_HDRAE_EXP: @@ -783,8 +780,11 @@ } ret = sc430cs_ioctl(sd, cmd, inf); - if (!ret) + if (!ret) { ret = copy_to_user(up, inf, sizeof(*inf)); + if (ret) + ret = -EFAULT; + } kfree(inf); break; case RKMODULE_AWB_CFG: @@ -797,6 +797,8 @@ ret = copy_from_user(cfg, up, sizeof(*cfg)); if (!ret) ret = sc430cs_ioctl(sd, cmd, cfg); + else + ret = -EFAULT; kfree(cfg); break; case RKMODULE_GET_HDR_CFG: @@ -807,8 +809,11 @@ } ret = sc430cs_ioctl(sd, cmd, hdr); - if (!ret) + if (!ret) { ret = copy_to_user(up, hdr, sizeof(*hdr)); + if (ret) + ret = -EFAULT; + } kfree(hdr); break; case RKMODULE_SET_HDR_CFG: @@ -821,6 +826,8 @@ ret = copy_from_user(hdr, up, sizeof(*hdr)); if (!ret) ret = sc430cs_ioctl(sd, cmd, hdr); + else + ret = -EFAULT; kfree(hdr); break; case PREISP_CMD_SET_HDRAE_EXP: @@ -833,12 +840,16 @@ ret = copy_from_user(hdrae, up, sizeof(*hdrae)); if (!ret) ret = sc430cs_ioctl(sd, cmd, hdrae); + else + ret = -EFAULT; kfree(hdrae); break; case RKMODULE_SET_QUICK_STREAM: ret = copy_from_user(&stream, up, sizeof(u32)); if (!ret) ret = sc430cs_ioctl(sd, cmd, &stream); + else + ret = -EFAULT; break; default: ret = -ENOIOCTLCMD; @@ -1106,7 +1117,6 @@ static const struct v4l2_subdev_video_ops sc430cs_video_ops = { .s_stream = sc430cs_s_stream, .g_frame_interval = sc430cs_g_frame_interval, - .g_mbus_config = sc430cs_g_mbus_config, }; static const struct v4l2_subdev_pad_ops sc430cs_pad_ops = { @@ -1115,6 +1125,7 @@ .enum_frame_interval = sc430cs_enum_frame_interval, .get_fmt = sc430cs_get_fmt, .set_fmt = sc430cs_set_fmt, + .get_mbus_config = sc430cs_g_mbus_config, }; static const struct v4l2_subdev_ops sc430cs_subdev_ops = { @@ -1122,6 +1133,14 @@ .video = &sc430cs_video_ops, .pad = &sc430cs_pad_ops, }; + +static void sc430cs_modify_fps_info(struct sc430cs *sc430cs) +{ + const struct sc430cs_mode *mode = sc430cs->cur_mode; + + sc430cs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / + sc430cs->cur_vts; +} static int sc430cs_set_ctrl(struct v4l2_ctrl *ctrl) { @@ -1181,7 +1200,9 @@ SC430CS_REG_VALUE_08BIT, (ctrl->val + sc430cs->cur_mode->height) & 0xff); - sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height; + if (!ret) + sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height; + sc430cs_modify_fps_info(sc430cs); break; case V4L2_CID_TEST_PATTERN: ret = sc430cs_enable_test_pattern(sc430cs, ctrl->val); @@ -1275,6 +1296,8 @@ } sc430cs->subdev.ctrl_handler = handler; + sc430cs->cur_fps = mode->max_fps; + sc430cs->cur_vts = mode->vts_def; return 0; -- Gitblit v1.6.2