@ -662,7 +662,7 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu)
return 0 ;
}
static int snd_emu1010_load_firmware ( struct snd_emu10k1 * emu ,
static int snd_emu1010_load_firmware_entry ( struct snd_emu10k1 * emu ,
const struct firmware * fw_entry )
{
int n , i ;
@ -708,6 +708,40 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu,
return 0 ;
}
/* firmware file names, per model, init-fw and dock-fw (optional) */
static const char * const firmware_names [ 5 ] [ 2 ] = {
[ EMU_MODEL_EMU1010 ] = {
HANA_FILENAME , DOCK_FILENAME
} ,
[ EMU_MODEL_EMU1010B ] = {
EMU1010B_FILENAME , MICRO_DOCK_FILENAME
} ,
[ EMU_MODEL_EMU1616 ] = {
EMU1010_NOTEBOOK_FILENAME , MICRO_DOCK_FILENAME
} ,
[ EMU_MODEL_EMU0404 ] = {
EMU0404_FILENAME , NULL
} ,
} ;
static int snd_emu1010_load_firmware ( struct snd_emu10k1 * emu , int dock ,
const struct firmware * * fw )
{
const char * filename ;
int err ;
if ( ! * fw ) {
filename = firmware_names [ emu - > card_capabilities - > emu_model ] [ dock ] ;
if ( ! filename )
return 0 ;
err = request_firmware ( fw , filename , & emu - > pci - > dev ) ;
if ( err )
return err ;
}
return snd_emu1010_load_firmware_entry ( emu , * fw ) ;
}
static int emu1010_firmware_thread ( void * data )
{
struct snd_emu10k1 * emu = data ;
@ -732,34 +766,9 @@ static int emu1010_firmware_thread(void *data)
dev_info ( emu - > card - > dev ,
" emu1010: Loading Audio Dock Firmware \n " ) ;
snd_emu1010_fpga_write ( emu , EMU_HANA_FPGA_CONFIG , EMU_HANA_FPGA_CONFIG_AUDIODOCK ) ;
if ( ! emu - > dock_fw ) {
const char * filename = NULL ;
switch ( emu - > card_capabilities - > emu_model ) {
case EMU_MODEL_EMU1010 :
filename = DOCK_FILENAME ;
break ;
case EMU_MODEL_EMU1010B :
filename = MICRO_DOCK_FILENAME ;
break ;
case EMU_MODEL_EMU1616 :
filename = MICRO_DOCK_FILENAME ;
break ;
}
if ( filename ) {
err = request_firmware ( & emu - > dock_fw ,
filename ,
& emu - > pci - > dev ) ;
if ( err )
continue ;
}
}
if ( emu - > dock_fw ) {
err = snd_emu1010_load_firmware ( emu , emu - > dock_fw ) ;
if ( err )
continue ;
}
err = snd_emu1010_load_firmware ( emu , 1 , & emu - > dock_fw ) ;
if ( err < 0 )
continue ;
snd_emu1010_fpga_write ( emu , EMU_HANA_FPGA_CONFIG , 0 ) ;
snd_emu1010_fpga_read ( emu , EMU_HANA_IRQ_STATUS , & tmp ) ;
@ -881,39 +890,8 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
}
dev_info ( emu - > card - > dev , " emu1010: EMU_HANA_ID = 0x%x \n " , reg ) ;
if ( ! emu - > firmware ) {
const char * filename ;
switch ( emu - > card_capabilities - > emu_model ) {
case EMU_MODEL_EMU1010 :
filename = HANA_FILENAME ;
break ;
case EMU_MODEL_EMU1010B :
filename = EMU1010B_FILENAME ;
break ;
case EMU_MODEL_EMU1616 :
filename = EMU1010_NOTEBOOK_FILENAME ;
break ;
case EMU_MODEL_EMU0404 :
filename = EMU0404_FILENAME ;
break ;
default :
return - ENODEV ;
}
err = request_firmware ( & emu - > firmware , filename , & emu - > pci - > dev ) ;
if ( err ! = 0 ) {
dev_info ( emu - > card - > dev ,
" emu1010: firmware: %s not found. Err = %d \n " ,
filename , err ) ;
return err ;
}
dev_info ( emu - > card - > dev ,
" emu1010: firmware file = %s, size = 0x%zx \n " ,
filename , emu - > firmware - > size ) ;
}
err = snd_emu1010_load_firmware ( emu , emu - > firmware ) ;
if ( err ! = 0 ) {
err = snd_emu1010_load_firmware ( emu , 0 , & emu - > firmware ) ;
if ( err < 0 ) {
dev_info ( emu - > card - > dev , " emu1010: Loading Firmware failed \n " ) ;
return err ;
}