@@ -490,6 +490,8 @@ struct rcar_csi2_info {
490
490
unsigned int num_channels ;
491
491
bool clear_ulps ;
492
492
bool use_isp ;
493
+ bool support_dphy ;
494
+ bool support_cphy ;
493
495
};
494
496
495
497
struct rcar_csi2 {
@@ -511,6 +513,7 @@ struct rcar_csi2 {
511
513
struct v4l2_mbus_framefmt mf ;
512
514
int stream_count ;
513
515
516
+ bool cphy ;
514
517
unsigned short lanes ;
515
518
unsigned char lane_swap [4 ];
516
519
};
@@ -665,7 +668,16 @@ static int rcsi2_get_active_lanes(struct rcar_csi2 *priv,
665
668
return ret ;
666
669
}
667
670
668
- if (mbus_config .type != V4L2_MBUS_CSI2_DPHY ) {
671
+ switch (mbus_config .type ) {
672
+ case V4L2_MBUS_CSI2_CPHY :
673
+ if (!priv -> cphy )
674
+ return - EINVAL ;
675
+ break ;
676
+ case V4L2_MBUS_CSI2_DPHY :
677
+ if (priv -> cphy )
678
+ return - EINVAL ;
679
+ break ;
680
+ default :
669
681
dev_err (priv -> dev , "Unsupported media bus type %u\n" ,
670
682
mbus_config .type );
671
683
return - EINVAL ;
@@ -1025,15 +1037,41 @@ static int rcsi2_parse_v4l2(struct rcar_csi2 *priv,
1025
1037
if (vep -> base .port || vep -> base .id )
1026
1038
return - ENOTCONN ;
1027
1039
1028
- if (vep -> bus_type != V4L2_MBUS_CSI2_DPHY ) {
1029
- dev_err (priv -> dev , "Unsupported bus: %u\n" , vep -> bus_type );
1030
- return - EINVAL ;
1031
- }
1032
-
1033
1040
priv -> lanes = vep -> bus .mipi_csi2 .num_data_lanes ;
1034
- if (priv -> lanes != 1 && priv -> lanes != 2 && priv -> lanes != 4 ) {
1035
- dev_err (priv -> dev , "Unsupported number of data-lanes: %u\n" ,
1036
- priv -> lanes );
1041
+
1042
+ switch (vep -> bus_type ) {
1043
+ case V4L2_MBUS_CSI2_DPHY :
1044
+ if (!priv -> info -> support_dphy ) {
1045
+ dev_err (priv -> dev , "D-PHY not supported\n" );
1046
+ return - EINVAL ;
1047
+ }
1048
+
1049
+ if (priv -> lanes != 1 && priv -> lanes != 2 && priv -> lanes != 4 ) {
1050
+ dev_err (priv -> dev ,
1051
+ "Unsupported number of data-lanes for D-PHY: %u\n" ,
1052
+ priv -> lanes );
1053
+ return - EINVAL ;
1054
+ }
1055
+
1056
+ priv -> cphy = false;
1057
+ break ;
1058
+ case V4L2_MBUS_CSI2_CPHY :
1059
+ if (!priv -> info -> support_cphy ) {
1060
+ dev_err (priv -> dev , "C-PHY not supported\n" );
1061
+ return - EINVAL ;
1062
+ }
1063
+
1064
+ if (priv -> lanes != 3 ) {
1065
+ dev_err (priv -> dev ,
1066
+ "Unsupported number of data-lanes for C-PHY: %u\n" ,
1067
+ priv -> lanes );
1068
+ return - EINVAL ;
1069
+ }
1070
+
1071
+ priv -> cphy = true;
1072
+ break ;
1073
+ default :
1074
+ dev_err (priv -> dev , "Unsupported bus: %u\n" , vep -> bus_type );
1037
1075
return - EINVAL ;
1038
1076
}
1039
1077
@@ -1057,7 +1095,7 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv)
1057
1095
struct fwnode_handle * fwnode ;
1058
1096
struct fwnode_handle * ep ;
1059
1097
struct v4l2_fwnode_endpoint v4l2_ep = {
1060
- .bus_type = V4L2_MBUS_CSI2_DPHY
1098
+ .bus_type = V4L2_MBUS_UNKNOWN ,
1061
1099
};
1062
1100
int ret ;
1063
1101
@@ -1378,6 +1416,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a7795 = {
1378
1416
.csi0clkfreqrange = 0x20 ,
1379
1417
.num_channels = 4 ,
1380
1418
.clear_ulps = true,
1419
+ .support_dphy = true,
1381
1420
};
1382
1421
1383
1422
static const struct rcar_csi2_info rcar_csi2_info_r8a7795es2 = {
@@ -1388,20 +1427,23 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a7795es2 = {
1388
1427
.csi0clkfreqrange = 0x20 ,
1389
1428
.num_channels = 4 ,
1390
1429
.clear_ulps = true,
1430
+ .support_dphy = true,
1391
1431
};
1392
1432
1393
1433
static const struct rcar_csi2_info rcar_csi2_info_r8a7796 = {
1394
1434
.start_receiver = rcsi2_start_receiver_gen3 ,
1395
1435
.enter_standby = rcsi2_enter_standby_gen3 ,
1396
1436
.hsfreqrange = hsfreqrange_m3w ,
1397
1437
.num_channels = 4 ,
1438
+ .support_dphy = true,
1398
1439
};
1399
1440
1400
1441
static const struct rcar_csi2_info rcar_csi2_info_r8a77961 = {
1401
1442
.start_receiver = rcsi2_start_receiver_gen3 ,
1402
1443
.enter_standby = rcsi2_enter_standby_gen3 ,
1403
1444
.hsfreqrange = hsfreqrange_m3w ,
1404
1445
.num_channels = 4 ,
1446
+ .support_dphy = true,
1405
1447
};
1406
1448
1407
1449
static const struct rcar_csi2_info rcar_csi2_info_r8a77965 = {
@@ -1412,6 +1454,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a77965 = {
1412
1454
.csi0clkfreqrange = 0x20 ,
1413
1455
.num_channels = 4 ,
1414
1456
.clear_ulps = true,
1457
+ .support_dphy = true,
1415
1458
};
1416
1459
1417
1460
static const struct rcar_csi2_info rcar_csi2_info_r8a77970 = {
@@ -1420,6 +1463,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a77970 = {
1420
1463
.start_receiver = rcsi2_start_receiver_gen3 ,
1421
1464
.enter_standby = rcsi2_enter_standby_gen3 ,
1422
1465
.num_channels = 4 ,
1466
+ .support_dphy = true,
1423
1467
};
1424
1468
1425
1469
static const struct rcar_csi2_info rcar_csi2_info_r8a77980 = {
@@ -1429,6 +1473,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a77980 = {
1429
1473
.hsfreqrange = hsfreqrange_h3_v3h_m3n ,
1430
1474
.csi0clkfreqrange = 0x20 ,
1431
1475
.clear_ulps = true,
1476
+ .support_dphy = true,
1432
1477
};
1433
1478
1434
1479
static const struct rcar_csi2_info rcar_csi2_info_r8a77990 = {
@@ -1437,6 +1482,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a77990 = {
1437
1482
.start_receiver = rcsi2_start_receiver_gen3 ,
1438
1483
.enter_standby = rcsi2_enter_standby_gen3 ,
1439
1484
.num_channels = 2 ,
1485
+ .support_dphy = true,
1440
1486
};
1441
1487
1442
1488
static const struct rcar_csi2_info rcar_csi2_info_r8a779a0 = {
@@ -1447,6 +1493,7 @@ static const struct rcar_csi2_info rcar_csi2_info_r8a779a0 = {
1447
1493
.csi0clkfreqrange = 0x20 ,
1448
1494
.clear_ulps = true,
1449
1495
.use_isp = true,
1496
+ .support_dphy = true,
1450
1497
};
1451
1498
1452
1499
static const struct of_device_id rcar_csi2_of_table [] = {
0 commit comments