hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/i2c/sc430cs.c
....@@ -113,14 +113,6 @@
113113
114114 #define SC430CS_NUM_SUPPLIES ARRAY_SIZE(sc430cs_supply_names)
115115
116
-enum sc430cs_max_pad {
117
- PAD0, /* link to isp */
118
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
119
- PAD2, /* link to csi wr1 | hdr x3:L */
120
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
121
- PAD_MAX,
122
-};
123
-
124116 struct regval {
125117 u16 addr;
126118 u8 val;
....@@ -149,7 +141,7 @@
149141 struct pinctrl *pinctrl;
150142 struct pinctrl_state *pins_default;
151143 struct pinctrl_state *pins_sleep;
152
-
144
+ struct v4l2_fract cur_fps;
153145 struct v4l2_subdev subdev;
154146 struct media_pad pad;
155147 struct v4l2_ctrl_handler ctrl_handler;
....@@ -570,6 +562,8 @@
570562 __v4l2_ctrl_modify_range(sc430cs->vblank, vblank_def,
571563 SC430CS_VTS_MAX - mode->height,
572564 1, vblank_def);
565
+ sc430cs->cur_fps = mode->max_fps;
566
+ sc430cs->cur_vts = (u32)mode->vts_def;
573567 }
574568
575569 mutex_unlock(&sc430cs->mutex);
....@@ -662,14 +656,15 @@
662656 struct sc430cs *sc430cs = to_sc430cs(sd);
663657 const struct sc430cs_mode *mode = sc430cs->cur_mode;
664658
665
- mutex_lock(&sc430cs->mutex);
666
- fi->interval = mode->max_fps;
667
- mutex_unlock(&sc430cs->mutex);
659
+ if (sc430cs->streaming)
660
+ fi->interval = sc430cs->cur_fps;
661
+ else
662
+ fi->interval = mode->max_fps;
668663
669664 return 0;
670665 }
671666
672
-static int sc430cs_g_mbus_config(struct v4l2_subdev *sd,
667
+static int sc430cs_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
673668 struct v4l2_mbus_config *config)
674669 {
675670 struct sc430cs *sc430cs = to_sc430cs(sd);
....@@ -683,7 +678,7 @@
683678 if (mode->hdr_mode == HDR_X3)
684679 val |= V4L2_MBUS_CSI2_CHANNEL_2;
685680
686
- config->type = V4L2_MBUS_CSI2;
681
+ config->type = V4L2_MBUS_CSI2_DPHY;
687682 config->flags = val;
688683
689684 return 0;
....@@ -739,6 +734,8 @@
739734 __v4l2_ctrl_modify_range(sc430cs->hblank, w, w, 1, w);
740735 __v4l2_ctrl_modify_range(sc430cs->vblank, h,
741736 SC430CS_VTS_MAX - sc430cs->cur_mode->height, 1, h);
737
+ sc430cs->cur_fps = sc430cs->cur_mode->max_fps;
738
+ sc430cs->cur_vts = sc430cs->cur_mode->vts_def;
742739 }
743740 break;
744741 case PREISP_CMD_SET_HDRAE_EXP:
....@@ -783,8 +780,11 @@
783780 }
784781
785782 ret = sc430cs_ioctl(sd, cmd, inf);
786
- if (!ret)
783
+ if (!ret) {
787784 ret = copy_to_user(up, inf, sizeof(*inf));
785
+ if (ret)
786
+ ret = -EFAULT;
787
+ }
788788 kfree(inf);
789789 break;
790790 case RKMODULE_AWB_CFG:
....@@ -797,6 +797,8 @@
797797 ret = copy_from_user(cfg, up, sizeof(*cfg));
798798 if (!ret)
799799 ret = sc430cs_ioctl(sd, cmd, cfg);
800
+ else
801
+ ret = -EFAULT;
800802 kfree(cfg);
801803 break;
802804 case RKMODULE_GET_HDR_CFG:
....@@ -807,8 +809,11 @@
807809 }
808810
809811 ret = sc430cs_ioctl(sd, cmd, hdr);
810
- if (!ret)
812
+ if (!ret) {
811813 ret = copy_to_user(up, hdr, sizeof(*hdr));
814
+ if (ret)
815
+ ret = -EFAULT;
816
+ }
812817 kfree(hdr);
813818 break;
814819 case RKMODULE_SET_HDR_CFG:
....@@ -821,6 +826,8 @@
821826 ret = copy_from_user(hdr, up, sizeof(*hdr));
822827 if (!ret)
823828 ret = sc430cs_ioctl(sd, cmd, hdr);
829
+ else
830
+ ret = -EFAULT;
824831 kfree(hdr);
825832 break;
826833 case PREISP_CMD_SET_HDRAE_EXP:
....@@ -833,12 +840,16 @@
833840 ret = copy_from_user(hdrae, up, sizeof(*hdrae));
834841 if (!ret)
835842 ret = sc430cs_ioctl(sd, cmd, hdrae);
843
+ else
844
+ ret = -EFAULT;
836845 kfree(hdrae);
837846 break;
838847 case RKMODULE_SET_QUICK_STREAM:
839848 ret = copy_from_user(&stream, up, sizeof(u32));
840849 if (!ret)
841850 ret = sc430cs_ioctl(sd, cmd, &stream);
851
+ else
852
+ ret = -EFAULT;
842853 break;
843854 default:
844855 ret = -ENOIOCTLCMD;
....@@ -1106,7 +1117,6 @@
11061117 static const struct v4l2_subdev_video_ops sc430cs_video_ops = {
11071118 .s_stream = sc430cs_s_stream,
11081119 .g_frame_interval = sc430cs_g_frame_interval,
1109
- .g_mbus_config = sc430cs_g_mbus_config,
11101120 };
11111121
11121122 static const struct v4l2_subdev_pad_ops sc430cs_pad_ops = {
....@@ -1115,6 +1125,7 @@
11151125 .enum_frame_interval = sc430cs_enum_frame_interval,
11161126 .get_fmt = sc430cs_get_fmt,
11171127 .set_fmt = sc430cs_set_fmt,
1128
+ .get_mbus_config = sc430cs_g_mbus_config,
11181129 };
11191130
11201131 static const struct v4l2_subdev_ops sc430cs_subdev_ops = {
....@@ -1122,6 +1133,14 @@
11221133 .video = &sc430cs_video_ops,
11231134 .pad = &sc430cs_pad_ops,
11241135 };
1136
+
1137
+static void sc430cs_modify_fps_info(struct sc430cs *sc430cs)
1138
+{
1139
+ const struct sc430cs_mode *mode = sc430cs->cur_mode;
1140
+
1141
+ sc430cs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
1142
+ sc430cs->cur_vts;
1143
+}
11251144
11261145 static int sc430cs_set_ctrl(struct v4l2_ctrl *ctrl)
11271146 {
....@@ -1181,7 +1200,10 @@
11811200 SC430CS_REG_VALUE_08BIT,
11821201 (ctrl->val + sc430cs->cur_mode->height)
11831202 & 0xff);
1184
- sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height;
1203
+ if (!ret)
1204
+ sc430cs->cur_vts = ctrl->val + sc430cs->cur_mode->height;
1205
+ if (sc430cs->cur_vts != sc430cs->cur_mode->vts_def)
1206
+ sc430cs_modify_fps_info(sc430cs);
11851207 break;
11861208 case V4L2_CID_TEST_PATTERN:
11871209 ret = sc430cs_enable_test_pattern(sc430cs, ctrl->val);
....@@ -1275,6 +1297,8 @@
12751297 }
12761298
12771299 sc430cs->subdev.ctrl_handler = handler;
1300
+ sc430cs->cur_fps = mode->max_fps;
1301
+ sc430cs->cur_vts = mode->vts_def;
12781302
12791303 return 0;
12801304