@@ -91,7 +91,7 @@ struct blktyp_devidx_map {
9191};
9292
9393static const char deviceNumber [TASDEVICE_DSP_TAS_MAX_DEVICE ] = {
94- 1 , 2 , 1 , 2 , 1 , 1 , 0 , 2 , 4 , 3 , 1 , 2 , 3 , 4
94+ 1 , 2 , 1 , 2 , 1 , 1 , 0 , 2 , 4 , 3 , 1 , 2 , 3 , 4 , 1 , 2
9595};
9696
9797/* fixed m68k compiling issue: mapping table can save code field */
@@ -521,6 +521,56 @@ static int fw_parse_data_kernel(struct tasdevice_fw *tas_fmw,
521521 return offset ;
522522}
523523
524+ static int fw_parse_tas5825_program_data_kernel (
525+ struct tasdevice_priv * tas_priv , struct tasdevice_fw * tas_fmw ,
526+ const struct firmware * fmw , int offset )
527+ {
528+ struct tasdevice_prog * program ;
529+ unsigned int i ;
530+
531+ for (i = 0 ; i < tas_fmw -> nr_programs ; i ++ ) {
532+ program = & (tas_fmw -> programs [i ]);
533+ if (offset + 72 > fmw -> size ) {
534+ dev_err (tas_priv -> dev , "%s: mpName error\n" , __func__ );
535+ return - EINVAL ;
536+ }
537+ /* Skip 65 unused byts*/
538+ offset += 65 ;
539+ offset = fw_parse_data_kernel (tas_fmw , & (program -> dev_data ),
540+ fmw , offset );
541+ if (offset < 0 )
542+ return offset ;
543+ }
544+
545+ return offset ;
546+ }
547+
548+ static int fw_parse_tas5825_configuration_data_kernel (
549+ struct tasdevice_priv * tas_priv ,
550+ struct tasdevice_fw * tas_fmw , const struct firmware * fmw , int offset )
551+ {
552+ const unsigned char * data = fmw -> data ;
553+ struct tasdevice_config * config ;
554+ unsigned int i ;
555+
556+ for (i = 0 ; i < tas_fmw -> nr_configurations ; i ++ ) {
557+ config = & (tas_fmw -> configs [i ]);
558+ if (offset + 80 > fmw -> size ) {
559+ dev_err (tas_priv -> dev , "%s: mpName error\n" , __func__ );
560+ return - EINVAL ;
561+ }
562+ memcpy (config -> name , & data [offset ], 64 );
563+ /* Skip extra 8 bytes*/
564+ offset += 72 ;
565+ offset = fw_parse_data_kernel (tas_fmw , & (config -> dev_data ),
566+ fmw , offset );
567+ if (offset < 0 )
568+ return offset ;
569+ }
570+
571+ return offset ;
572+ }
573+
524574static int fw_parse_program_data_kernel (
525575 struct tasdevice_priv * tas_priv , struct tasdevice_fw * tas_fmw ,
526576 const struct firmware * fmw , int offset )
@@ -1838,7 +1888,8 @@ static void dspbin_type_check(struct tasdevice_priv *tas_priv,
18381888 else
18391889 tas_priv -> dspbin_typ = TASDEV_ALPHA ;
18401890 }
1841- if (tas_priv -> dspbin_typ != TASDEV_BASIC )
1891+ if ((tas_priv -> dspbin_typ != TASDEV_BASIC ) &&
1892+ (ppcver < PPC3_VERSION_TAS5825_BASE ))
18421893 tas_priv -> fw_parse_fct_param_address =
18431894 fw_parse_fct_param_address ;
18441895}
@@ -1849,7 +1900,17 @@ static int dspfw_default_callback(struct tasdevice_priv *tas_priv,
18491900 int rc = 0 ;
18501901
18511902 if (drv_ver == 0x100 ) {
1852- if (ppcver >= PPC3_VERSION_BASE ) {
1903+ if (ppcver >= PPC3_VERSION_TAS5825_BASE ) {
1904+ tas_priv -> fw_parse_variable_header =
1905+ fw_parse_variable_header_kernel ;
1906+ tas_priv -> fw_parse_program_data =
1907+ fw_parse_tas5825_program_data_kernel ;
1908+ tas_priv -> fw_parse_configuration_data =
1909+ fw_parse_tas5825_configuration_data_kernel ;
1910+ tas_priv -> tasdevice_load_block =
1911+ tasdevice_load_block_kernel ;
1912+ dspbin_type_check (tas_priv , ppcver );
1913+ } else if (ppcver >= PPC3_VERSION_BASE ) {
18531914 tas_priv -> fw_parse_variable_header =
18541915 fw_parse_variable_header_kernel ;
18551916 tas_priv -> fw_parse_program_data =
0 commit comments