@@ -88,11 +88,14 @@ static int _sdw_program_slave_port_params(struct sdw_bus *bus,
8888 return ret ;
8989 }
9090
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+ }
9699 }
97100
98101 /*
@@ -131,18 +134,28 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
131134 struct sdw_port_params * p_params = & p_rt -> port_params ;
132135 struct sdw_slave_prop * slave_prop = & s_rt -> slave -> prop ;
133136 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 ;
135139 int ret ;
136140 u8 wbuf ;
137141
138142 if (s_rt -> slave -> is_mockup_device )
139143 return 0 ;
140144
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+ }
146159
147160 addr1 = SDW_DPN_PORTCTRL (t_params -> port_num );
148161 addr2 = SDW_DPN_BLOCKCTRL1 (t_params -> port_num );
@@ -172,7 +185,7 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
172185 return ret ;
173186 }
174187
175- if (!dpn_prop -> read_only_wordlength ) {
188+ if (!read_only_wordlength ) {
176189 /* Program DPN_BlockCtrl1 register */
177190 ret = sdw_write_no_pm (s_rt -> slave , addr2 , (p_params -> bps - 1 ));
178191 if (ret < 0 ) {
@@ -224,9 +237,9 @@ static int sdw_program_slave_port_params(struct sdw_bus *bus,
224237 }
225238 }
226239
227- if (dpn_prop -> type != SDW_DPN_SIMPLE ) {
240+ if (port_type != SDW_DPN_SIMPLE ) {
228241 ret = _sdw_program_slave_port_params (bus , s_rt -> slave ,
229- t_params , dpn_prop -> type );
242+ t_params , port_type );
230243 if (ret < 0 )
231244 dev_err (& s_rt -> slave -> dev ,
232245 "Transport reg write failed for port: %d\n" ,
@@ -433,27 +446,45 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
433446 struct completion * port_ready ;
434447 struct sdw_dpn_prop * dpn_prop ;
435448 struct sdw_prepare_ch prep_ch ;
449+ u32 imp_def_interrupts ;
450+ bool simple_ch_prep_sm ;
451+ u32 ch_prep_timeout ;
436452 bool intr = false;
437453 int ret = 0 , val ;
438454 u32 addr ;
439455
440456 prep_ch .num = p_rt -> num ;
441457 prep_ch .ch_mask = p_rt -> ch_mask ;
442458
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 ;
450481 }
451482
452483 prep_ch .prepare = prep ;
453484
454485 prep_ch .bank = bus -> params .next_bank ;
455486
456- if (dpn_prop -> imp_def_interrupts || !dpn_prop -> simple_ch_prep_sm ||
487+ if (imp_def_interrupts || !simple_ch_prep_sm ||
457488 bus -> params .s_data_mode != SDW_PORT_DATA_MODE_NORMAL )
458489 intr = true;
459490
@@ -464,7 +495,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
464495 */
465496 if (prep && intr ) {
466497 ret = sdw_configure_dpn_intr (s_rt -> slave , p_rt -> num , prep ,
467- dpn_prop -> imp_def_interrupts );
498+ imp_def_interrupts );
468499 if (ret < 0 )
469500 return ret ;
470501 }
@@ -473,7 +504,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
473504 sdw_do_port_prep (s_rt , prep_ch , prep ? SDW_OPS_PORT_PRE_PREP : SDW_OPS_PORT_PRE_DEPREP );
474505
475506 /* Prepare Slave port implementing CP_SM */
476- if (!dpn_prop -> simple_ch_prep_sm ) {
507+ if (!simple_ch_prep_sm ) {
477508 addr = SDW_DPN_PREPARECTRL (p_rt -> num );
478509
479510 if (prep )
@@ -490,7 +521,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
490521 /* Wait for completion on port ready */
491522 port_ready = & s_rt -> slave -> port_ready [prep_ch .num ];
492523 wait_for_completion_timeout (port_ready ,
493- msecs_to_jiffies (dpn_prop -> ch_prep_timeout ));
524+ msecs_to_jiffies (ch_prep_timeout ));
494525
495526 val = sdw_read_no_pm (s_rt -> slave , SDW_DPN_PREPARESTATUS (p_rt -> num ));
496527 if ((val < 0 ) || (val & p_rt -> ch_mask )) {
@@ -507,7 +538,7 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
507538 /* Disable interrupt after Port de-prepare */
508539 if (!prep && intr )
509540 ret = sdw_configure_dpn_intr (s_rt -> slave , p_rt -> num , prep ,
510- dpn_prop -> imp_def_interrupts );
541+ imp_def_interrupts );
511542
512543 return ret ;
513544}
@@ -1008,7 +1039,8 @@ static int sdw_slave_port_is_valid_range(struct device *dev, int num)
10081039
10091040static int sdw_slave_port_config (struct sdw_slave * slave ,
10101041 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 )
10121044{
10131045 struct sdw_port_runtime * p_rt ;
10141046 int ret ;
@@ -1020,9 +1052,13 @@ static int sdw_slave_port_config(struct sdw_slave *slave,
10201052 * TODO: Check valid port range as defined by DisCo/
10211053 * slave
10221054 */
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+ }
10261062
10271063 ret = sdw_port_config (p_rt , port_config , i );
10281064 if (ret < 0 )
@@ -1331,6 +1367,11 @@ struct sdw_dpn_prop *sdw_get_slave_dpn_prop(struct sdw_slave *slave,
13311367 u8 num_ports ;
13321368 int i ;
13331369
1370+ if (!port_num ) {
1371+ dev_err (& slave -> dev , "%s: port_num is zero\n" , __func__ );
1372+ return NULL ;
1373+ }
1374+
13341375 if (direction == SDW_DATA_DIR_TX ) {
13351376 num_ports = hweight32 (slave -> prop .source_ports );
13361377 dpn_prop = slave -> prop .src_dpn_prop ;
@@ -2116,7 +2157,8 @@ int sdw_stream_add_slave(struct sdw_slave *slave,
21162157 if (ret )
21172158 goto unlock ;
21182159
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 );
21202162 if (ret )
21212163 goto unlock ;
21222164
0 commit comments