@@ -88,11 +88,14 @@ static int _sdw_program_slave_port_params(struct sdw_bus *bus,
88
88
return ret ;
89
89
}
90
90
91
- /* Program DPN_BlockCtrl3 register */
92
- ret = sdw_write_no_pm (slave , addr2 , t_params -> blk_pkg_mode );
93
- if (ret < 0 ) {
94
- dev_err (bus -> dev , "DPN_BlockCtrl3 register write failed\n" );
95
- return ret ;
91
+ /* DP0 does not implement BlockCtrl3 */
92
+ if (t_params -> port_num ) {
93
+ /* Program DPN_BlockCtrl3 register */
94
+ ret = sdw_write_no_pm (slave , addr2 , t_params -> blk_pkg_mode );
95
+ if (ret < 0 ) {
96
+ dev_err (bus -> dev , "DPN_BlockCtrl3 register write failed\n" );
97
+ return ret ;
98
+ }
96
99
}
97
100
98
101
/*
@@ -131,18 +134,28 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
131
134
struct sdw_port_params * p_params = & p_rt -> port_params ;
132
135
struct sdw_slave_prop * slave_prop = & s_rt -> slave -> prop ;
133
136
u32 addr1 , addr2 , addr3 , addr4 , addr5 , addr6 ;
134
- struct sdw_dpn_prop * dpn_prop ;
137
+ enum sdw_dpn_type port_type ;
138
+ bool read_only_wordlength ;
135
139
int ret ;
136
140
u8 wbuf ;
137
141
138
142
if (s_rt -> slave -> is_mockup_device )
139
143
return 0 ;
140
144
141
- dpn_prop = sdw_get_slave_dpn_prop (s_rt -> slave ,
142
- s_rt -> direction ,
143
- t_params -> port_num );
144
- if (!dpn_prop )
145
- return - EINVAL ;
145
+ if (t_params -> port_num ) {
146
+ struct sdw_dpn_prop * dpn_prop ;
147
+
148
+ dpn_prop = sdw_get_slave_dpn_prop (s_rt -> slave , s_rt -> direction ,
149
+ t_params -> port_num );
150
+ if (!dpn_prop )
151
+ return - EINVAL ;
152
+
153
+ read_only_wordlength = dpn_prop -> read_only_wordlength ;
154
+ port_type = dpn_prop -> type ;
155
+ } else {
156
+ read_only_wordlength = false;
157
+ port_type = SDW_DPN_FULL ;
158
+ }
146
159
147
160
addr1 = SDW_DPN_PORTCTRL (t_params -> port_num );
148
161
addr2 = SDW_DPN_BLOCKCTRL1 (t_params -> port_num );
@@ -172,7 +185,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
172
185
return ret ;
173
186
}
174
187
175
- if (!dpn_prop -> read_only_wordlength ) {
188
+ if (!read_only_wordlength ) {
176
189
/* Program DPN_BlockCtrl1 register */
177
190
ret = sdw_write_no_pm (s_rt -> slave , addr2 , (p_params -> bps - 1 ));
178
191
if (ret < 0 ) {
@@ -224,9 +237,9 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
224
237
}
225
238
}
226
239
227
- if (dpn_prop -> type != SDW_DPN_SIMPLE ) {
240
+ if (port_type != SDW_DPN_SIMPLE ) {
228
241
ret = _sdw_program_slave_port_params (bus , s_rt -> slave ,
229
- t_params , dpn_prop -> type );
242
+ t_params , port_type );
230
243
if (ret < 0 )
231
244
dev_err (& s_rt -> slave -> dev ,
232
245
"Transport reg write failed for port: %d\n" ,
@@ -433,27 +446,45 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
433
446
struct completion * port_ready ;
434
447
struct sdw_dpn_prop * dpn_prop ;
435
448
struct sdw_prepare_ch prep_ch ;
449
+ u32 imp_def_interrupts ;
450
+ bool simple_ch_prep_sm ;
451
+ u32 ch_prep_timeout ;
436
452
bool intr = false;
437
453
int ret = 0 , val ;
438
454
u32 addr ;
439
455
440
456
prep_ch .num = p_rt -> num ;
441
457
prep_ch .ch_mask = p_rt -> ch_mask ;
442
458
443
- dpn_prop = sdw_get_slave_dpn_prop (s_rt -> slave ,
444
- s_rt -> direction ,
445
- prep_ch .num );
446
- if (!dpn_prop ) {
447
- dev_err (bus -> dev ,
448
- "Slave Port:%d properties not found\n" , prep_ch .num );
449
- return - EINVAL ;
459
+ if (p_rt -> num ) {
460
+ dpn_prop = sdw_get_slave_dpn_prop (s_rt -> slave , s_rt -> direction , prep_ch .num );
461
+ if (!dpn_prop ) {
462
+ dev_err (bus -> dev ,
463
+ "Slave Port:%d properties not found\n" , prep_ch .num );
464
+ return - EINVAL ;
465
+ }
466
+
467
+ imp_def_interrupts = dpn_prop -> imp_def_interrupts ;
468
+ simple_ch_prep_sm = dpn_prop -> simple_ch_prep_sm ;
469
+ ch_prep_timeout = dpn_prop -> ch_prep_timeout ;
470
+ } else {
471
+ struct sdw_dp0_prop * dp0_prop = s_rt -> slave -> prop .dp0_prop ;
472
+
473
+ if (!dp0_prop ) {
474
+ dev_err (bus -> dev ,
475
+ "Slave DP0 properties not found\n" );
476
+ return - EINVAL ;
477
+ }
478
+ imp_def_interrupts = dp0_prop -> imp_def_interrupts ;
479
+ simple_ch_prep_sm = dp0_prop -> simple_ch_prep_sm ;
480
+ ch_prep_timeout = dp0_prop -> ch_prep_timeout ;
450
481
}
451
482
452
483
prep_ch .prepare = prep ;
453
484
454
485
prep_ch .bank = bus -> params .next_bank ;
455
486
456
- if (dpn_prop -> imp_def_interrupts || !dpn_prop -> simple_ch_prep_sm ||
487
+ if (imp_def_interrupts || !simple_ch_prep_sm ||
457
488
bus -> params .s_data_mode != SDW_PORT_DATA_MODE_NORMAL )
458
489
intr = true;
459
490
@@ -464,7 +495,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
464
495
*/
465
496
if (prep && intr ) {
466
497
ret = sdw_configure_dpn_intr (s_rt -> slave , p_rt -> num , prep ,
467
- dpn_prop -> imp_def_interrupts );
498
+ imp_def_interrupts );
468
499
if (ret < 0 )
469
500
return ret ;
470
501
}
@@ -473,7 +504,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
473
504
sdw_do_port_prep (s_rt , prep_ch , prep ? SDW_OPS_PORT_PRE_PREP : SDW_OPS_PORT_PRE_DEPREP );
474
505
475
506
/* Prepare Slave port implementing CP_SM */
476
- if (!dpn_prop -> simple_ch_prep_sm ) {
507
+ if (!simple_ch_prep_sm ) {
477
508
addr = SDW_DPN_PREPARECTRL (p_rt -> num );
478
509
479
510
if (prep )
@@ -490,7 +521,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
490
521
/* Wait for completion on port ready */
491
522
port_ready = & s_rt -> slave -> port_ready [prep_ch .num ];
492
523
wait_for_completion_timeout (port_ready ,
493
- msecs_to_jiffies (dpn_prop -> ch_prep_timeout ));
524
+ msecs_to_jiffies (ch_prep_timeout ));
494
525
495
526
val = sdw_read_no_pm (s_rt -> slave , SDW_DPN_PREPARESTATUS (p_rt -> num ));
496
527
if ((val < 0 ) || (val & p_rt -> ch_mask )) {
@@ -507,7 +538,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
507
538
/* Disable interrupt after Port de-prepare */
508
539
if (!prep && intr )
509
540
ret = sdw_configure_dpn_intr (s_rt -> slave , p_rt -> num , prep ,
510
- dpn_prop -> imp_def_interrupts );
541
+ imp_def_interrupts );
511
542
512
543
return ret ;
513
544
}
@@ -1008,7 +1039,8 @@ static int sdw_slave_port_is_valid_range(struct device *dev, int num)
1008
1039
1009
1040
static int sdw_slave_port_config (struct sdw_slave * slave ,
1010
1041
struct sdw_slave_runtime * s_rt ,
1011
- const struct sdw_port_config * port_config )
1042
+ const struct sdw_port_config * port_config ,
1043
+ bool is_bpt_stream )
1012
1044
{
1013
1045
struct sdw_port_runtime * p_rt ;
1014
1046
int ret ;
@@ -1020,9 +1052,13 @@ static int sdw_slave_port_config(struct sdw_slave *slave,
1020
1052
* TODO: Check valid port range as defined by DisCo/
1021
1053
* slave
1022
1054
*/
1023
- ret = sdw_slave_port_is_valid_range (& slave -> dev , port_config [i ].num );
1024
- if (ret < 0 )
1025
- return ret ;
1055
+ if (!is_bpt_stream ) {
1056
+ ret = sdw_slave_port_is_valid_range (& slave -> dev , port_config [i ].num );
1057
+ if (ret < 0 )
1058
+ return ret ;
1059
+ } else if (port_config [i ].num ) {
1060
+ return - EINVAL ;
1061
+ }
1026
1062
1027
1063
ret = sdw_port_config (p_rt , port_config , i );
1028
1064
if (ret < 0 )
@@ -1331,6 +1367,11 @@ struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,
1331
1367
u8 num_ports ;
1332
1368
int i ;
1333
1369
1370
+ if (!port_num ) {
1371
+ dev_err (& slave -> dev , "%s: port_num is zero\n" , __func__ );
1372
+ return NULL ;
1373
+ }
1374
+
1334
1375
if (direction == SDW_DATA_DIR_TX ) {
1335
1376
num_ports = hweight32 (slave -> prop .source_ports );
1336
1377
dpn_prop = slave -> prop .src_dpn_prop ;
@@ -2116,7 +2157,8 @@ int sdw_stream_add_slave(struct sdw_slave *slave,
2116
2157
if (ret )
2117
2158
goto unlock ;
2118
2159
2119
- ret = sdw_slave_port_config (slave , s_rt , port_config );
2160
+ ret = sdw_slave_port_config (slave , s_rt , port_config ,
2161
+ stream -> type == SDW_STREAM_BPT );
2120
2162
if (ret )
2121
2163
goto unlock ;
2122
2164
0 commit comments