forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/media/i2c/gc4653.c
....@@ -76,6 +76,10 @@
7676 #define GC4653_MIRROR_BIT_MASK BIT(0)
7777 #define GC4653_FLIP_BIT_MASK BIT(1)
7878
79
+#define GC4653_FRAME_BUFFER_REG 0x031d
80
+#define GC4653_FRAME_BUFFER_START 0x2d
81
+#define GC4653_FRAME_BUFFER_END 0x28
82
+
7983 #define REG_NULL 0xFFFF
8084
8185 #define GC4653_REG_VALUE_08BIT 1
....@@ -94,14 +98,6 @@
9498 };
9599
96100 #define GC4653_NUM_SUPPLIES ARRAY_SIZE(gc4653_supply_names)
97
-
98
-enum gc4653_max_pad {
99
- PAD0, /* link to isp */
100
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
101
- PAD2, /* link to csi wr1 | hdr x3:L */
102
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
103
- PAD_MAX,
104
-};
105101
106102 struct regval {
107103 u16 addr;
....@@ -672,14 +668,12 @@
672668 struct gc4653 *gc4653 = to_gc4653(sd);
673669 const struct gc4653_mode *mode = gc4653->cur_mode;
674670
675
- mutex_lock(&gc4653->mutex);
676671 fi->interval = mode->max_fps;
677
- mutex_unlock(&gc4653->mutex);
678672
679673 return 0;
680674 }
681675
682
-static int gc4653_g_mbus_config(struct v4l2_subdev *sd,
676
+static int gc4653_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
683677 struct v4l2_mbus_config *config)
684678 {
685679 struct gc4653 *gc4653 = to_gc4653(sd);
....@@ -691,7 +685,7 @@
691685 V4L2_MBUS_CSI2_CHANNEL_0 |
692686 V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
693687
694
- config->type = V4L2_MBUS_CSI2;
688
+ config->type = V4L2_MBUS_CSI2_DPHY;
695689 config->flags = val;
696690
697691 return 0;
....@@ -707,6 +701,17 @@
707701 strscpy(inf->base.lens, gc4653->len_name, sizeof(inf->base.lens));
708702 }
709703
704
+static int gc4653_get_channel_info(struct gc4653 *gc4653, struct rkmodule_channel_info *ch_info)
705
+{
706
+ if (ch_info->index < PAD0 || ch_info->index >= PAD_MAX)
707
+ return -EINVAL;
708
+ ch_info->vc = gc4653->cur_mode->vc[ch_info->index];
709
+ ch_info->width = gc4653->cur_mode->width;
710
+ ch_info->height = gc4653->cur_mode->height;
711
+ ch_info->bus_fmt = gc4653->cur_mode->bus_fmt;
712
+ return 0;
713
+}
714
+
710715 static long gc4653_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
711716 {
712717 struct gc4653 *gc4653 = to_gc4653(sd);
....@@ -714,6 +719,7 @@
714719 u32 i, h, w;
715720 long ret = 0;
716721 u32 stream = 0;
722
+ struct rkmodule_channel_info *ch_info;
717723
718724 switch (cmd) {
719725 case RKMODULE_GET_MODULE_INFO:
....@@ -772,6 +778,10 @@
772778 ret = gc4653_write_reg(gc4653->client, GC4653_REG_CTRL_MODE,
773779 GC4653_REG_VALUE_08BIT, GC4653_MODE_SW_STANDBY);
774780 break;
781
+ case RKMODULE_GET_CHANNEL_INFO:
782
+ ch_info = (struct rkmodule_channel_info *)arg;
783
+ ret = gc4653_get_channel_info(gc4653, ch_info);
784
+ break;
775785 default:
776786 ret = -ENOIOCTLCMD;
777787 break;
....@@ -791,6 +801,7 @@
791801 struct preisp_hdrae_exp_s *hdrae;
792802 long ret;
793803 u32 stream = 0;
804
+ struct rkmodule_channel_info *ch_info;
794805
795806 switch (cmd) {
796807 case RKMODULE_GET_MODULE_INFO:
....@@ -871,6 +882,21 @@
871882 ret = gc4653_ioctl(sd, cmd, &stream);
872883 else
873884 ret = -EFAULT;
885
+ break;
886
+ case RKMODULE_GET_CHANNEL_INFO:
887
+ ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
888
+ if (!ch_info) {
889
+ ret = -ENOMEM;
890
+ return ret;
891
+ }
892
+
893
+ ret = gc4653_ioctl(sd, cmd, ch_info);
894
+ if (!ret) {
895
+ ret = copy_to_user(up, ch_info, sizeof(*ch_info));
896
+ if (ret)
897
+ ret = -EFAULT;
898
+ }
899
+ kfree(ch_info);
874900 break;
875901 default:
876902 ret = -ENOIOCTLCMD;
....@@ -1158,7 +1184,6 @@
11581184 static const struct v4l2_subdev_video_ops gc4653_video_ops = {
11591185 .s_stream = gc4653_s_stream,
11601186 .g_frame_interval = gc4653_g_frame_interval,
1161
- .g_mbus_config = gc4653_g_mbus_config,
11621187 };
11631188
11641189 static const struct v4l2_subdev_pad_ops gc4653_pad_ops = {
....@@ -1167,6 +1192,7 @@
11671192 .enum_frame_interval = gc4653_enum_frame_interval,
11681193 .get_fmt = gc4653_get_fmt,
11691194 .set_fmt = gc4653_set_fmt,
1195
+ .get_mbus_config = gc4653_g_mbus_config,
11701196 };
11711197
11721198 static const struct v4l2_subdev_ops gc4653_subdev_ops = {
....@@ -1232,8 +1258,12 @@
12321258 val |= GC4653_MIRROR_BIT_MASK;
12331259 else
12341260 val &= ~GC4653_MIRROR_BIT_MASK;
1261
+ ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG,
1262
+ GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_START);
12351263 ret |= gc4653_write_reg(gc4653->client, GC4653_FLIP_MIRROR_REG,
12361264 GC4653_REG_VALUE_08BIT, val);
1265
+ ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG,
1266
+ GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_END);
12371267 break;
12381268 case V4L2_CID_VFLIP:
12391269 ret = gc4653_read_reg(gc4653->client, GC4653_FLIP_MIRROR_REG,
....@@ -1242,8 +1272,12 @@
12421272 val |= GC4653_FLIP_BIT_MASK;
12431273 else
12441274 val &= ~GC4653_FLIP_BIT_MASK;
1275
+ ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG,
1276
+ GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_START);
12451277 ret |= gc4653_write_reg(gc4653->client, GC4653_FLIP_MIRROR_REG,
12461278 GC4653_REG_VALUE_08BIT, val);
1279
+ ret |= gc4653_write_reg(gc4653->client, GC4653_FRAME_BUFFER_REG,
1280
+ GC4653_REG_VALUE_08BIT, GC4653_FRAME_BUFFER_END);
12471281 break;
12481282 default:
12491283 dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",