hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/i2c/gc4663.c
....@@ -99,14 +99,6 @@
9999
100100 #define GC4663_NUM_SUPPLIES ARRAY_SIZE(gc4663_supply_names)
101101
102
-enum gc4663_max_pad {
103
- PAD0, /* link to isp */
104
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
105
- PAD2, /* link to csi wr1 | hdr x3:L */
106
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
107
- PAD_MAX,
108
-};
109
-
110102 struct regval {
111103 u16 addr;
112104 u8 val;
....@@ -278,10 +270,10 @@
278270 {0x0320, 0x77},
279271 {0x0324, 0xc8},
280272 {0x0325, 0x06},
281
- {0x0326, 0x6c},
273
+ {0x0326, 0x60},
282274 {0x0327, 0x03},
283275 {0x0334, 0x40},
284
- {0x0336, 0x6c},
276
+ {0x0336, 0x60},
285277 {0x0337, 0x82},
286278 {0x0315, 0x25},
287279 {0x031c, 0xc6},
....@@ -781,11 +773,6 @@
781773 fmt->format.height = mode->height;
782774 fmt->format.code = mode->bus_fmt;
783775 fmt->format.field = V4L2_FIELD_NONE;
784
- /* format info: width/height/data type/virctual channel */
785
- if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR)
786
- fmt->reserved[0] = mode->vc[fmt->pad];
787
- else
788
- fmt->reserved[0] = mode->vc[PAD0];
789776 }
790777 mutex_unlock(&gc4663->mutex);
791778
....@@ -1012,14 +999,12 @@
1012999 struct gc4663 *gc4663 = to_gc4663(sd);
10131000 const struct gc4663_mode *mode = gc4663->cur_mode;
10141001
1015
- mutex_lock(&gc4663->mutex);
10161002 fi->interval = mode->max_fps;
1017
- mutex_unlock(&gc4663->mutex);
10181003
10191004 return 0;
10201005 }
10211006
1022
-static int gc4663_g_mbus_config(struct v4l2_subdev *sd,
1007
+static int gc4663_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
10231008 struct v4l2_mbus_config *config)
10241009 {
10251010 struct gc4663 *gc4663 = to_gc4663(sd);
....@@ -1036,7 +1021,7 @@
10361021 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
10371022 V4L2_MBUS_CSI2_CHANNEL_1;
10381023
1039
- config->type = V4L2_MBUS_CSI2;
1024
+ config->type = V4L2_MBUS_CSI2_DPHY;
10401025 config->flags = val;
10411026
10421027 return 0;
....@@ -1052,6 +1037,17 @@
10521037 strlcpy(inf->base.lens, gc4663->len_name, sizeof(inf->base.lens));
10531038 }
10541039
1040
+static int gc4663_get_channel_info(struct gc4663 *gc4663, struct rkmodule_channel_info *ch_info)
1041
+{
1042
+ if (ch_info->index < PAD0 || ch_info->index >= PAD_MAX)
1043
+ return -EINVAL;
1044
+ ch_info->vc = gc4663->cur_mode->vc[ch_info->index];
1045
+ ch_info->width = gc4663->cur_mode->width;
1046
+ ch_info->height = gc4663->cur_mode->height;
1047
+ ch_info->bus_fmt = gc4663->cur_mode->bus_fmt;
1048
+ return 0;
1049
+}
1050
+
10551051 static long gc4663_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
10561052 {
10571053 struct gc4663 *gc4663 = to_gc4663(sd);
....@@ -1059,6 +1055,7 @@
10591055 u32 i, h, w;
10601056 long ret = 0;
10611057 u32 stream = 0;
1058
+ struct rkmodule_channel_info *ch_info;
10621059
10631060 switch (cmd) {
10641061 case RKMODULE_GET_MODULE_INFO:
....@@ -1123,6 +1120,10 @@
11231120 ret = gc4663_write_reg(gc4663->client, GC4663_REG_CTRL_MODE,
11241121 GC4663_REG_VALUE_08BIT, GC4663_MODE_SW_STANDBY);
11251122 break;
1123
+ case RKMODULE_GET_CHANNEL_INFO:
1124
+ ch_info = (struct rkmodule_channel_info *)arg;
1125
+ ret = gc4663_get_channel_info(gc4663, ch_info);
1126
+ break;
11261127 default:
11271128 ret = -ENOIOCTLCMD;
11281129 break;
....@@ -1142,6 +1143,7 @@
11421143 struct preisp_hdrae_exp_s *hdrae;
11431144 long ret;
11441145 u32 stream = 0;
1146
+ struct rkmodule_channel_info *ch_info;
11451147
11461148 switch (cmd) {
11471149 case RKMODULE_GET_MODULE_INFO:
....@@ -1152,8 +1154,11 @@
11521154 }
11531155
11541156 ret = gc4663_ioctl(sd, cmd, inf);
1155
- if (!ret)
1157
+ if (!ret) {
11561158 ret = copy_to_user(up, inf, sizeof(*inf));
1159
+ if (ret)
1160
+ ret = -EFAULT;
1161
+ }
11571162 kfree(inf);
11581163 break;
11591164 case RKMODULE_AWB_CFG:
....@@ -1166,6 +1171,8 @@
11661171 ret = copy_from_user(cfg, up, sizeof(*cfg));
11671172 if (!ret)
11681173 ret = gc4663_ioctl(sd, cmd, cfg);
1174
+ else
1175
+ ret = -EFAULT;
11691176 kfree(cfg);
11701177 break;
11711178 case RKMODULE_GET_HDR_CFG:
....@@ -1176,8 +1183,11 @@
11761183 }
11771184
11781185 ret = gc4663_ioctl(sd, cmd, hdr);
1179
- if (!ret)
1186
+ if (!ret) {
11801187 ret = copy_to_user(up, hdr, sizeof(*hdr));
1188
+ if (ret)
1189
+ ret = -EFAULT;
1190
+ }
11811191 kfree(hdr);
11821192 break;
11831193 case RKMODULE_SET_HDR_CFG:
....@@ -1190,6 +1200,8 @@
11901200 ret = copy_from_user(hdr, up, sizeof(*hdr));
11911201 if (!ret)
11921202 ret = gc4663_ioctl(sd, cmd, hdr);
1203
+ else
1204
+ ret = -EFAULT;
11931205 kfree(hdr);
11941206 break;
11951207 case PREISP_CMD_SET_HDRAE_EXP:
....@@ -1202,12 +1214,31 @@
12021214 ret = copy_from_user(hdrae, up, sizeof(*hdrae));
12031215 if (!ret)
12041216 ret = gc4663_ioctl(sd, cmd, hdrae);
1217
+ else
1218
+ ret = -EFAULT;
12051219 kfree(hdrae);
12061220 break;
12071221 case RKMODULE_SET_QUICK_STREAM:
12081222 ret = copy_from_user(&stream, up, sizeof(u32));
12091223 if (!ret)
12101224 ret = gc4663_ioctl(sd, cmd, &stream);
1225
+ else
1226
+ ret = -EFAULT;
1227
+ break;
1228
+ case RKMODULE_GET_CHANNEL_INFO:
1229
+ ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
1230
+ if (!ch_info) {
1231
+ ret = -ENOMEM;
1232
+ return ret;
1233
+ }
1234
+
1235
+ ret = gc4663_ioctl(sd, cmd, ch_info);
1236
+ if (!ret) {
1237
+ ret = copy_to_user(up, ch_info, sizeof(*ch_info));
1238
+ if (ret)
1239
+ ret = -EFAULT;
1240
+ }
1241
+ kfree(ch_info);
12111242 break;
12121243 default:
12131244 ret = -ENOIOCTLCMD;
....@@ -1495,7 +1526,6 @@
14951526 static const struct v4l2_subdev_video_ops gc4663_video_ops = {
14961527 .s_stream = gc4663_s_stream,
14971528 .g_frame_interval = gc4663_g_frame_interval,
1498
- .g_mbus_config = gc4663_g_mbus_config,
14991529 };
15001530
15011531 static const struct v4l2_subdev_pad_ops gc4663_pad_ops = {
....@@ -1504,6 +1534,7 @@
15041534 .enum_frame_interval = gc4663_enum_frame_interval,
15051535 .get_fmt = gc4663_get_fmt,
15061536 .set_fmt = gc4663_set_fmt,
1537
+ .get_mbus_config = gc4663_g_mbus_config,
15071538 };
15081539
15091540 static const struct v4l2_subdev_ops gc4663_subdev_ops = {