hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/i2c/sc401ai.c
....@@ -120,14 +120,6 @@
120120
121121 #define SC401AI_NUM_SUPPLIES ARRAY_SIZE(sc401ai_supply_names)
122122
123
-enum sc401ai_max_pad {
124
- PAD0, /* link to isp */
125
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
126
- PAD2, /* link to csi wr1 | hdr x3:L */
127
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
128
- PAD_MAX,
129
-};
130
-
131123 struct regval {
132124 u16 addr;
133125 u8 val;
....@@ -170,6 +162,7 @@
170162 struct v4l2_ctrl *pixel_rate;
171163 struct v4l2_ctrl *link_freq;
172164 struct mutex mutex;
165
+ struct v4l2_fract cur_fps;
173166 bool streaming;
174167 bool power_on;
175168 unsigned int lane_num;
....@@ -709,6 +702,8 @@
709702 __v4l2_ctrl_modify_range(sc401ai->vblank, vblank_def,
710703 SC401AI_VTS_MAX - mode->height,
711704 1, vblank_def);
705
+ sc401ai->cur_fps = mode->max_fps;
706
+ sc401ai->cur_vts = mode->vts_def;
712707 }
713708
714709 mutex_unlock(&sc401ai->mutex);
....@@ -800,15 +795,17 @@
800795 struct sc401ai *sc401ai = to_sc401ai(sd);
801796 const struct sc401ai_mode *mode = sc401ai->cur_mode;
802797
803
- mutex_lock(&sc401ai->mutex);
804
- fi->interval = mode->max_fps;
805
- mutex_unlock(&sc401ai->mutex);
798
+ if (sc401ai->streaming)
799
+ fi->interval = sc401ai->cur_fps;
800
+ else
801
+ fi->interval = mode->max_fps;
806802
807803 return 0;
808804 }
809805
810806 static int sc401ai_g_mbus_config(struct v4l2_subdev *sd,
811
- struct v4l2_mbus_config *config)
807
+ unsigned int pad_id,
808
+ struct v4l2_mbus_config *config)
812809 {
813810 struct sc401ai *sc401ai = to_sc401ai(sd);
814811 const struct sc401ai_mode *mode = sc401ai->cur_mode;
....@@ -823,7 +820,7 @@
823820 if (mode->hdr_mode == HDR_X3)
824821 val |= V4L2_MBUS_CSI2_CHANNEL_2;
825822
826
- config->type = V4L2_MBUS_CSI2;
823
+ config->type = V4L2_MBUS_CSI2_DPHY;
827824 config->flags = val;
828825
829826 return 0;
....@@ -833,10 +830,10 @@
833830 struct rkmodule_inf *inf)
834831 {
835832 memset(inf, 0, sizeof(*inf));
836
- strlcpy(inf->base.sensor, SC401AI_NAME, sizeof(inf->base.sensor));
837
- strlcpy(inf->base.module, sc401ai->module_name,
833
+ strscpy(inf->base.sensor, SC401AI_NAME, sizeof(inf->base.sensor));
834
+ strscpy(inf->base.module, sc401ai->module_name,
838835 sizeof(inf->base.module));
839
- strlcpy(inf->base.lens, sc401ai->len_name, sizeof(inf->base.lens));
836
+ strscpy(inf->base.lens, sc401ai->len_name, sizeof(inf->base.lens));
840837 }
841838
842839 static long sc401ai_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
....@@ -1249,7 +1246,6 @@
12491246 static const struct v4l2_subdev_video_ops sc401ai_video_ops = {
12501247 .s_stream = sc401ai_s_stream,
12511248 .g_frame_interval = sc401ai_g_frame_interval,
1252
- .g_mbus_config = sc401ai_g_mbus_config,
12531249 };
12541250
12551251 static const struct v4l2_subdev_pad_ops sc401ai_pad_ops = {
....@@ -1258,6 +1254,7 @@
12581254 .enum_frame_interval = sc401ai_enum_frame_interval,
12591255 .get_fmt = sc401ai_get_fmt,
12601256 .set_fmt = sc401ai_set_fmt,
1257
+ .get_mbus_config = sc401ai_g_mbus_config,
12611258 };
12621259
12631260 static const struct v4l2_subdev_ops sc401ai_subdev_ops = {
....@@ -1265,6 +1262,14 @@
12651262 .video = &sc401ai_video_ops,
12661263 .pad = &sc401ai_pad_ops,
12671264 };
1265
+
1266
+static void sc401ai_modify_fps_info(struct sc401ai *sc401ai)
1267
+{
1268
+ const struct sc401ai_mode *mode = sc401ai->cur_mode;
1269
+
1270
+ sc401ai->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def /
1271
+ sc401ai->cur_vts;
1272
+}
12681273
12691274 static int sc401ai_set_ctrl(struct v4l2_ctrl *ctrl)
12701275 {
....@@ -1324,7 +1329,10 @@
13241329 SC401AI_REG_VALUE_08BIT,
13251330 (ctrl->val + sc401ai->cur_mode->height)
13261331 & 0xff);
1327
- sc401ai->cur_vts = ctrl->val + sc401ai->cur_mode->height;
1332
+ if (!ret)
1333
+ sc401ai->cur_vts = ctrl->val + sc401ai->cur_mode->height;
1334
+ if (sc401ai->cur_vts != sc401ai->cur_mode->vts_def)
1335
+ sc401ai_modify_fps_info(sc401ai);
13281336 break;
13291337 case V4L2_CID_TEST_PATTERN:
13301338 ret = sc401ai_enable_test_pattern(sc401ai, ctrl->val);
....@@ -1466,6 +1474,8 @@
14661474 }
14671475
14681476 sc401ai->subdev.ctrl_handler = handler;
1477
+ sc401ai->cur_fps = mode->max_fps;
1478
+ sc401ai->cur_vts = mode->vts_def;
14691479
14701480 return 0;
14711481
....@@ -1713,4 +1723,4 @@
17131723 module_exit(sensor_mod_exit);
17141724
17151725 MODULE_DESCRIPTION("smartsens sc401ai sensor driver");
1716
-MODULE_LICENSE("GPL v2");
1726
+MODULE_LICENSE("GPL");