hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/phy/rockchip/phy-rockchip-csi2-dphy.c
....@@ -160,6 +160,7 @@
160160 if (csi_idx < 2) {
161161 dcphy_hw = dphy->samsung_phy_group[csi_idx];
162162 mutex_lock(&dcphy_hw->mutex);
163
+ dcphy_hw->dphy_dev[dcphy_hw->dphy_dev_num] = dphy;
163164 dcphy_hw->dphy_dev_num++;
164165 mutex_unlock(&dcphy_hw->mutex);
165166 dphy->samsung_phy = dcphy_hw;
....@@ -199,6 +200,7 @@
199200 else
200201 dphy->phy_index = 5;
201202 }
203
+ dphy_hw->dphy_dev[dphy_hw->dphy_dev_num] = dphy;
202204 dphy_hw->dphy_dev_num++;
203205 dphy->dphy_hw = dphy_hw;
204206 dphy->phy_hw[index] = (void *)dphy_hw;
....@@ -253,12 +255,56 @@
253255 return 0;
254256 }
255257
258
+static void rockchip_csi2_samsung_phy_remove_dphy_dev(struct csi2_dphy *dphy,
259
+ struct samsung_mipi_dcphy *dcphy_hw)
260
+{
261
+ int i = 0;
262
+ bool is_find_dev = false;
263
+ struct csi2_dphy *csi2_dphy = NULL;
264
+
265
+ for (i = 0; i < dcphy_hw->dphy_dev_num; i++) {
266
+ csi2_dphy = dcphy_hw->dphy_dev[i];
267
+ if (csi2_dphy &&
268
+ csi2_dphy->phy_index == dphy->phy_index)
269
+ is_find_dev = true;
270
+ if (is_find_dev) {
271
+ if (i < dcphy_hw->dphy_dev_num - 1)
272
+ dcphy_hw->dphy_dev[i] = dcphy_hw->dphy_dev[i + 1];
273
+ else
274
+ dcphy_hw->dphy_dev[i] = NULL;
275
+ }
276
+ }
277
+ if (is_find_dev)
278
+ dcphy_hw->dphy_dev_num--;
279
+}
280
+
281
+static void rockchip_csi2_inno_phy_remove_dphy_dev(struct csi2_dphy *dphy,
282
+ struct csi2_dphy_hw *dphy_hw)
283
+{
284
+ int i = 0;
285
+ bool is_find_dev = false;
286
+ struct csi2_dphy *csi2_dphy = NULL;
287
+
288
+ for (i = 0; i < dphy_hw->dphy_dev_num; i++) {
289
+ csi2_dphy = dphy_hw->dphy_dev[i];
290
+ if (csi2_dphy &&
291
+ csi2_dphy->phy_index == dphy->phy_index)
292
+ is_find_dev = true;
293
+ if (is_find_dev) {
294
+ if (i < dphy_hw->dphy_dev_num - 1)
295
+ dphy_hw->dphy_dev[i] = dphy_hw->dphy_dev[i + 1];
296
+ else
297
+ dphy_hw->dphy_dev[i] = NULL;
298
+ }
299
+ }
300
+ if (is_find_dev)
301
+ dphy_hw->dphy_dev_num--;
302
+}
303
+
256304 static int rockchip_csi2_dphy_detach_hw(struct csi2_dphy *dphy, int csi_idx, int index)
257305 {
258306 struct csi2_dphy_hw *dphy_hw = NULL;
259307 struct samsung_mipi_dcphy *dcphy_hw = NULL;
260
- struct csi2_dphy *csi2_dphy = NULL;
261
- int i = 0;
262308
263309 if (dphy->drv_data->chip_id == CHIP_ID_RK3568 ||
264310 dphy->drv_data->chip_id == CHIP_ID_RV1106) {
....@@ -269,15 +315,7 @@
269315 return -EINVAL;
270316 }
271317 mutex_lock(&dphy_hw->mutex);
272
- for (i = 0; i < dphy_hw->dphy_dev_num; i++) {
273
- csi2_dphy = dphy_hw->dphy_dev[i];
274
- if (csi2_dphy &&
275
- csi2_dphy->phy_index == dphy->phy_index) {
276
- dphy_hw->dphy_dev[i] = NULL;
277
- dphy_hw->dphy_dev_num--;
278
- break;
279
- }
280
- }
318
+ rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
281319 mutex_unlock(&dphy_hw->mutex);
282320 } else if (dphy->drv_data->chip_id == CHIP_ID_RK3588) {
283321 if (csi_idx < 2) {
....@@ -288,7 +326,7 @@
288326 return -EINVAL;
289327 }
290328 mutex_lock(&dcphy_hw->mutex);
291
- dcphy_hw->dphy_dev_num--;
329
+ rockchip_csi2_samsung_phy_remove_dphy_dev(dphy, dcphy_hw);
292330 mutex_unlock(&dcphy_hw->mutex);
293331 } else {
294332 dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[index];
....@@ -298,7 +336,7 @@
298336 return -EINVAL;
299337 }
300338 mutex_lock(&dphy_hw->mutex);
301
- dphy_hw->dphy_dev_num--;
339
+ rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
302340 mutex_unlock(&dphy_hw->mutex);
303341 }
304342 } else {
....@@ -309,7 +347,7 @@
309347 return -EINVAL;
310348 }
311349 mutex_lock(&dphy_hw->mutex);
312
- dphy_hw->dphy_dev_num--;
350
+ rockchip_csi2_inno_phy_remove_dphy_dev(dphy, dphy_hw);
313351 mutex_unlock(&dphy_hw->mutex);
314352 }
315353
....@@ -651,6 +689,8 @@
651689 {
652690 struct csi2_dphy *dphy = to_csi2_dphy(sd);
653691 long ret = 0;
692
+ int i = 0;
693
+ int on = 0;
654694
655695 switch (cmd) {
656696 case RKCIF_CMD_SET_CSI_IDX:
....@@ -658,6 +698,24 @@
658698 dphy->drv_data->chip_id != CHIP_ID_RV1106)
659699 dphy->csi_info = *((struct rkcif_csi_info *)arg);
660700 break;
701
+ case RKMODULE_SET_QUICK_STREAM:
702
+ for (i = 0; i < dphy->csi_info.csi_num; i++) {
703
+ if (dphy->csi_info.dphy_vendor[i] == PHY_VENDOR_INNO) {
704
+ dphy->dphy_hw = (struct csi2_dphy_hw *)dphy->phy_hw[i];
705
+ if (!dphy->dphy_hw ||
706
+ !dphy->dphy_hw->quick_stream_off ||
707
+ !dphy->dphy_hw->quick_stream_on) {
708
+ ret = -EINVAL;
709
+ break;
710
+ }
711
+ on = *(int *)arg;
712
+ if (on)
713
+ dphy->dphy_hw->quick_stream_on(dphy, sd);
714
+ else
715
+ dphy->dphy_hw->quick_stream_off(dphy, sd);
716
+ }
717
+ }
718
+ break;
661719 default:
662720 ret = -ENOIOCTLCMD;
663721 break;