hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/i2c/gc1084.c
....@@ -136,6 +136,7 @@
136136 const char *module_facing;
137137 const char *module_name;
138138 const char *len_name;
139
+ enum rkmodule_sync_mode sync_mode;
139140 u32 cur_vts;
140141
141142 bool has_init_exp;
....@@ -150,6 +151,27 @@
150151
151152 static const s64 link_freq_menu_items[] = {
152153 MIPI_FREQ_400M,
154
+};
155
+
156
+static const struct reg_sequence gc1084_master_mode_regs[] = {
157
+ {0x0068, 0x85},
158
+ {0x0d6a, 0x80},
159
+ {0x0069, 0x00},
160
+ {0x006a, 0x02},
161
+ {0x0d69, 0x04},
162
+};
163
+
164
+static const struct reg_sequence gc1084_slave_mode_regs[] = {
165
+ {0x0d67, 0x00},
166
+ {0x0d69, 0x03},
167
+ {0x0d6a, 0x08},
168
+ {0x0d6b, 0x50},
169
+ {0x0d6c, 0x00},
170
+ {0x0d6d, 0x53},
171
+ {0x0d6e, 0x00},
172
+ {0x0d6f, 0x10},
173
+ {0x0d70, 0x00},
174
+ {0x0d71, 0x12},
153175 };
154176
155177 /*
....@@ -629,6 +651,7 @@
629651 u32 stream = 0;
630652 u64 delay_us = 0;
631653 u32 fps = 0;
654
+ u32 *sync_mode = NULL;
632655
633656 switch (cmd) {
634657 case RKMODULE_GET_HDR_CFG:
....@@ -654,6 +677,14 @@
654677 delay_us = 1000000 / (gc1084->cur_mode->vts_def * fps / gc1084->cur_vts);
655678 usleep_range(delay_us, delay_us + 2000);
656679 }
680
+ break;
681
+ case RKMODULE_GET_SYNC_MODE:
682
+ sync_mode = (u32 *)arg;
683
+ *sync_mode = gc1084->sync_mode;
684
+ break;
685
+ case RKMODULE_SET_SYNC_MODE:
686
+ sync_mode = (u32 *)arg;
687
+ gc1084->sync_mode = *sync_mode;
657688 break;
658689 default:
659690 ret = -ENOIOCTLCMD;
....@@ -686,6 +717,25 @@
686717 }
687718 }
688719
720
+ if (gc1084->sync_mode == INTERNAL_MASTER_MODE) {
721
+ ret = regmap_multi_reg_write(gc1084->regmap, gc1084_master_mode_regs,
722
+ ARRAY_SIZE(gc1084_master_mode_regs));
723
+ if (ret)
724
+ dev_err(gc1084->dev,
725
+ "write internal master mode reg failed %d\n", ret);
726
+ } else if (gc1084->sync_mode == EXTERNAL_MASTER_MODE) {
727
+ ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs,
728
+ ARRAY_SIZE(gc1084_slave_mode_regs));
729
+ if (ret)
730
+ dev_err(gc1084->dev,
731
+ "write external master mode reg failed %d\n", ret);
732
+ } else if (gc1084->sync_mode == SLAVE_MODE) {
733
+ ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs,
734
+ ARRAY_SIZE(gc1084_slave_mode_regs));
735
+ if (ret)
736
+ dev_err(gc1084->dev, "write slave mode reg failed %d\n", ret);
737
+ }
738
+
689739 return gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE,
690740 GC1084_MODE_STREAMING);
691741 }
....@@ -707,6 +757,7 @@
707757 struct preisp_hdrae_exp_s *hdrae;
708758 long ret = 0;
709759 u32 stream = 0;
760
+ u32 sync_mode;
710761
711762 switch (cmd) {
712763 case RKMODULE_GET_MODULE_INFO:
....@@ -771,6 +822,21 @@
771822 ret = copy_from_user(&stream, up, sizeof(u32));
772823 if (!ret)
773824 ret = gc1084_ioctl(sd, cmd, &stream);
825
+ else
826
+ ret = -EFAULT;
827
+ break;
828
+ case RKMODULE_GET_SYNC_MODE:
829
+ ret = gc1084_ioctl(sd, cmd, &sync_mode);
830
+ if (!ret) {
831
+ ret = copy_to_user(up, &sync_mode, sizeof(u32));
832
+ if (ret)
833
+ ret = -EFAULT;
834
+ }
835
+ break;
836
+ case RKMODULE_SET_SYNC_MODE:
837
+ ret = copy_from_user(&sync_mode, up, sizeof(u32));
838
+ if (!ret)
839
+ ret = gc1084_ioctl(sd, cmd, &sync_mode);
774840 else
775841 ret = -EFAULT;
776842 break;
....@@ -1096,6 +1162,7 @@
10961162 struct v4l2_subdev *sd;
10971163 char facing[2];
10981164 int ret;
1165
+ const char *sync_mode_name = NULL;
10991166
11001167 dev_info(dev, "driver version: %02x.%02x.%02x",
11011168 DRIVER_VERSION >> 16,
....@@ -1126,6 +1193,20 @@
11261193 return -EINVAL;
11271194 }
11281195
1196
+ ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE,
1197
+ &sync_mode_name);
1198
+ if (ret) {
1199
+ gc1084->sync_mode = NO_SYNC_MODE;
1200
+ dev_err(dev, "could not get sync mode!\n");
1201
+ } else {
1202
+ if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0)
1203
+ gc1084->sync_mode = EXTERNAL_MASTER_MODE;
1204
+ else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0)
1205
+ gc1084->sync_mode = INTERNAL_MASTER_MODE;
1206
+ else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0)
1207
+ gc1084->sync_mode = SLAVE_MODE;
1208
+ }
1209
+
11291210 gc1084->xvclk = devm_clk_get(gc1084->dev, "xvclk");
11301211 if (IS_ERR(gc1084->xvclk)) {
11311212 dev_err(gc1084->dev, "Failed to get xvclk\n");