@@ -652,52 +652,6 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu)
652652 return 0 ;
653653}
654654
655- static int snd_emu1010_load_firmware_entry (struct snd_emu10k1 * emu ,
656- const struct firmware * fw_entry )
657- {
658- int n , i ;
659- u16 reg ;
660- u8 value ;
661- __always_unused u16 write_post ;
662-
663- if (!fw_entry )
664- return - EIO ;
665-
666- /* The FPGA is a Xilinx Spartan IIE XC2S50E */
667- /* On E-MU 0404b it is a Xilinx Spartan III XC3S50 */
668- /* GPIO7 -> FPGA PGMN
669- * GPIO6 -> FPGA CCLK
670- * GPIO5 -> FPGA DIN
671- * FPGA CONFIG OFF -> FPGA PGMN
672- */
673- spin_lock_irq (& emu -> emu_lock );
674- outw (0x00 , emu -> port + A_GPIO ); /* Set PGMN low for 100uS. */
675- write_post = inw (emu -> port + A_GPIO );
676- udelay (100 );
677- outw (0x80 , emu -> port + A_GPIO ); /* Leave bit 7 set during netlist setup. */
678- write_post = inw (emu -> port + A_GPIO );
679- udelay (100 ); /* Allow FPGA memory to clean */
680- for (n = 0 ; n < fw_entry -> size ; n ++ ) {
681- value = fw_entry -> data [n ];
682- for (i = 0 ; i < 8 ; i ++ ) {
683- reg = 0x80 ;
684- if (value & 0x1 )
685- reg = reg | 0x20 ;
686- value = value >> 1 ;
687- outw (reg , emu -> port + A_GPIO );
688- write_post = inw (emu -> port + A_GPIO );
689- outw (reg | 0x40 , emu -> port + A_GPIO );
690- write_post = inw (emu -> port + A_GPIO );
691- }
692- }
693- /* After programming, set GPIO bit 4 high again. */
694- outw (0x10 , emu -> port + A_GPIO );
695- write_post = inw (emu -> port + A_GPIO );
696- spin_unlock_irq (& emu -> emu_lock );
697-
698- return 0 ;
699- }
700-
701655/* firmware file names, per model, init-fw and dock-fw (optional) */
702656static const char * const firmware_names [5 ][2 ] = {
703657 [EMU_MODEL_EMU1010 ] = {
@@ -729,72 +683,68 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, int dock,
729683 return err ;
730684 }
731685
732- return snd_emu1010_load_firmware_entry (emu , * fw );
686+ snd_emu1010_load_firmware_entry (emu , dock , * fw );
687+ return 0 ;
733688}
734689
735- static void emu1010_firmware_work (struct work_struct * work )
690+ static void snd_emu1010_load_dock_firmware (struct snd_emu10k1 * emu )
736691{
737- struct snd_emu10k1 * emu ;
738- u32 tmp , tmp2 , reg ;
692+ u32 tmp , tmp2 ;
739693 int err ;
740694
741- emu = container_of (work , struct snd_emu10k1 ,
742- emu1010 .firmware_work );
743- if (emu -> card -> shutdown )
695+ // The docking events clearly arrive prematurely - while the
696+ // Dock's FPGA seems to be successfully programmed, the Dock
697+ // fails to initialize subsequently if we don't give it some
698+ // time to "warm up" here.
699+ msleep (200 );
700+
701+ dev_info (emu -> card -> dev , "emu1010: Loading Audio Dock Firmware\n" );
702+ err = snd_emu1010_load_firmware (emu , 1 , & emu -> dock_fw );
703+ if (err < 0 )
744704 return ;
745- #ifdef CONFIG_PM_SLEEP
746- if (emu -> suspend )
705+ snd_emu1010_fpga_write (emu , EMU_HANA_FPGA_CONFIG , 0 );
706+
707+ snd_emu1010_fpga_read (emu , EMU_HANA_ID , & tmp );
708+ dev_dbg (emu -> card -> dev , "emu1010: EMU_HANA+DOCK_ID = 0x%x\n" , tmp );
709+ if ((tmp & 0x1f ) != 0x15 ) {
710+ /* FPGA failed to be programmed */
711+ dev_err (emu -> card -> dev ,
712+ "emu1010: Loading Audio Dock Firmware failed, reg = 0x%x\n" ,
713+ tmp );
747714 return ;
748- #endif
715+ }
716+ dev_info (emu -> card -> dev , "emu1010: Audio Dock Firmware loaded\n" );
717+
718+ snd_emu1010_fpga_read (emu , EMU_DOCK_MAJOR_REV , & tmp );
719+ snd_emu1010_fpga_read (emu , EMU_DOCK_MINOR_REV , & tmp2 );
720+ dev_info (emu -> card -> dev , "Audio Dock ver: %u.%u\n" , tmp , tmp2 );
721+
722+ /* Allow DLL to settle, to sync clocking between 1010 and Dock */
723+ msleep (10 );
724+ }
725+
726+ static void emu1010_dock_event (struct snd_emu10k1 * emu )
727+ {
728+ u32 reg ;
729+
749730 snd_emu1010_fpga_read (emu , EMU_HANA_OPTION_CARDS , & reg ); /* OPTIONS: Which cards are attached to the EMU */
750731 if (reg & EMU_HANA_OPTION_DOCK_OFFLINE ) {
751732 /* Audio Dock attached */
752- /* Return to Audio Dock programming mode */
753- dev_info (emu -> card -> dev ,
754- "emu1010: Loading Audio Dock Firmware\n" );
755- snd_emu1010_fpga_write (emu , EMU_HANA_FPGA_CONFIG ,
756- EMU_HANA_FPGA_CONFIG_AUDIODOCK );
757- err = snd_emu1010_load_firmware (emu , 1 , & emu -> dock_fw );
758- if (err < 0 )
759- return ;
760- snd_emu1010_fpga_write (emu , EMU_HANA_FPGA_CONFIG , 0 );
761- snd_emu1010_fpga_read (emu , EMU_HANA_ID , & tmp );
762- dev_info (emu -> card -> dev ,
763- "emu1010: EMU_HANA+DOCK_ID = 0x%x\n" , tmp );
764- if ((tmp & 0x1f ) != 0x15 ) {
765- /* FPGA failed to be programmed */
766- dev_info (emu -> card -> dev ,
767- "emu1010: Loading Audio Dock Firmware file failed, reg = 0x%x\n" ,
768- tmp );
769- return ;
770- }
771- dev_info (emu -> card -> dev ,
772- "emu1010: Audio Dock Firmware loaded\n" );
773- snd_emu1010_fpga_read (emu , EMU_DOCK_MAJOR_REV , & tmp );
774- snd_emu1010_fpga_read (emu , EMU_DOCK_MINOR_REV , & tmp2 );
775- dev_info (emu -> card -> dev , "Audio Dock ver: %u.%u\n" , tmp , tmp2 );
776- /* Sync clocking between 1010 and Dock */
777- /* Allow DLL to settle */
778- msleep (10 );
733+ snd_emu1010_load_dock_firmware (emu );
779734 /* Unmute all. Default is muted after a firmware load */
780735 snd_emu1010_fpga_write (emu , EMU_HANA_UNMUTE , EMU_UNMUTE );
736+ } else if (!(reg & EMU_HANA_OPTION_DOCK_ONLINE )) {
737+ /* Audio Dock removed */
738+ dev_info (emu -> card -> dev , "emu1010: Audio Dock detached\n" );
739+ /* The hardware auto-mutes all, so we unmute again */
740+ snd_emu1010_fpga_write (emu , EMU_HANA_UNMUTE , EMU_UNMUTE );
781741 }
782742}
783743
784- static void emu1010_clock_work (struct work_struct * work )
744+ static void emu1010_clock_event (struct snd_emu10k1 * emu )
785745{
786- struct snd_emu10k1 * emu ;
787746 struct snd_ctl_elem_id id ;
788747
789- emu = container_of (work , struct snd_emu10k1 ,
790- emu1010 .clock_work );
791- if (emu -> card -> shutdown )
792- return ;
793- #ifdef CONFIG_PM_SLEEP
794- if (emu -> suspend )
795- return ;
796- #endif
797-
798748 spin_lock_irq (& emu -> reg_lock );
799749 // This is the only thing that can actually happen.
800750 emu -> emu1010 .clock_source = emu -> emu1010 .clock_fallback ;
@@ -805,21 +755,44 @@ static void emu1010_clock_work(struct work_struct *work)
805755 snd_ctl_notify (emu -> card , SNDRV_CTL_EVENT_MASK_VALUE , & id );
806756}
807757
808- static void emu1010_interrupt (struct snd_emu10k1 * emu )
758+ static void emu1010_work (struct work_struct * work )
809759{
760+ struct snd_emu10k1 * emu ;
810761 u32 sts ;
811762
763+ emu = container_of (work , struct snd_emu10k1 , emu1010 .work );
764+ if (emu -> card -> shutdown )
765+ return ;
766+ #ifdef CONFIG_PM_SLEEP
767+ if (emu -> suspend )
768+ return ;
769+ #endif
770+
771+ snd_emu1010_fpga_lock (emu );
772+
812773 snd_emu1010_fpga_read (emu , EMU_HANA_IRQ_STATUS , & sts );
813- if (sts & EMU_HANA_IRQ_DOCK_LOST ) {
814- /* Audio Dock removed */
815- dev_info (emu -> card -> dev , "emu1010: Audio Dock detached\n" );
816- /* The hardware auto-mutes all, so we unmute again */
817- snd_emu1010_fpga_write (emu , EMU_HANA_UNMUTE , EMU_UNMUTE );
818- } else if (sts & EMU_HANA_IRQ_DOCK ) {
819- schedule_work (& emu -> emu1010 .firmware_work );
820- }
774+
775+ // The distinction of the IRQ status bits is unreliable,
776+ // so we dispatch later based on option card status.
777+ if (sts & (EMU_HANA_IRQ_DOCK | EMU_HANA_IRQ_DOCK_LOST ))
778+ emu1010_dock_event (emu );
779+
821780 if (sts & EMU_HANA_IRQ_WCLK_CHANGED )
822- schedule_work (& emu -> emu1010 .clock_work );
781+ emu1010_clock_event (emu );
782+
783+ snd_emu1010_fpga_unlock (emu );
784+ }
785+
786+ static void emu1010_interrupt (struct snd_emu10k1 * emu )
787+ {
788+ // We get an interrupt on each GPIO input pin change, but we
789+ // care only about the ones triggered by the dedicated pin.
790+ u16 sts = inw (emu -> port + A_GPIO );
791+ u16 bit = emu -> card_capabilities -> ca0108_chip ? 0x2000 : 0x8000 ;
792+ if (!(sts & bit ))
793+ return ;
794+
795+ schedule_work (& emu -> emu1010 .work );
823796}
824797
825798/*
@@ -841,32 +814,13 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
841814 * Proper init follows in snd_emu10k1_init(). */
842815 outl (HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK , emu -> port + HCFG );
843816
844- /* Disable 48Volt power to Audio Dock */
845- snd_emu1010_fpga_write (emu , EMU_HANA_DOCK_PWR , 0 );
846-
847- /* ID, should read & 0x7f = 0x55. (Bit 7 is the IRQ bit) */
848- snd_emu1010_fpga_read (emu , EMU_HANA_ID , & reg );
849- dev_dbg (emu -> card -> dev , "reg1 = 0x%x\n" , reg );
850- if ((reg & 0x3f ) == 0x15 ) {
851- /* FPGA netlist already present so clear it */
852- /* Return to programming mode */
853-
854- snd_emu1010_fpga_write (emu , EMU_HANA_FPGA_CONFIG , EMU_HANA_FPGA_CONFIG_HANA );
855- }
856- snd_emu1010_fpga_read (emu , EMU_HANA_ID , & reg );
857- dev_dbg (emu -> card -> dev , "reg2 = 0x%x\n" , reg );
858- if ((reg & 0x3f ) == 0x15 ) {
859- /* FPGA failed to return to programming mode */
860- dev_info (emu -> card -> dev ,
861- "emu1010: FPGA failed to return to programming mode\n" );
862- return - ENODEV ;
863- }
864- dev_info (emu -> card -> dev , "emu1010: EMU_HANA_ID = 0x%x\n" , reg );
817+ snd_emu1010_fpga_lock (emu );
865818
819+ dev_info (emu -> card -> dev , "emu1010: Loading Hana Firmware\n" );
866820 err = snd_emu1010_load_firmware (emu , 0 , & emu -> firmware );
867821 if (err < 0 ) {
868822 dev_info (emu -> card -> dev , "emu1010: Loading Firmware failed\n" );
869- return err ;
823+ goto fail ;
870824 }
871825
872826 /* ID, should read & 0x7f = 0x55 when FPGA programmed. */
@@ -876,7 +830,8 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
876830 dev_info (emu -> card -> dev ,
877831 "emu1010: Loading Hana Firmware file failed, reg = 0x%x\n" ,
878832 reg );
879- return - ENODEV ;
833+ err = - ENODEV ;
834+ goto fail ;
880835 }
881836
882837 dev_info (emu -> card -> dev , "emu1010: Hana Firmware loaded\n" );
@@ -889,7 +844,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
889844 snd_emu1010_fpga_read (emu , EMU_HANA_OPTION_CARDS , & reg );
890845 dev_info (emu -> card -> dev , "emu1010: Card options = 0x%x\n" , reg );
891846 if (reg & EMU_HANA_OPTION_DOCK_OFFLINE )
892- schedule_work ( & emu -> emu1010 . firmware_work );
847+ snd_emu1010_load_dock_firmware ( emu );
893848 if (emu -> card_capabilities -> no_adat ) {
894849 emu -> emu1010 .optical_in = 0 ; /* IN_SPDIF */
895850 emu -> emu1010 .optical_out = 0 ; /* OUT_SPDIF */
@@ -936,7 +891,9 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
936891 // so it is safe to simply enable the outputs.
937892 snd_emu1010_fpga_write (emu , EMU_HANA_UNMUTE , EMU_UNMUTE );
938893
939- return 0 ;
894+ fail :
895+ snd_emu1010_fpga_unlock (emu );
896+ return err ;
940897}
941898/*
942899 * Create the EMU10K1 instance
@@ -958,10 +915,10 @@ static void snd_emu10k1_free(struct snd_card *card)
958915 }
959916 if (emu -> card_capabilities -> emu_model == EMU_MODEL_EMU1010 ) {
960917 /* Disable 48Volt power to Audio Dock */
961- snd_emu1010_fpga_write (emu , EMU_HANA_DOCK_PWR , 0 );
918+ snd_emu1010_fpga_write_lock (emu , EMU_HANA_DOCK_PWR , 0 );
962919 }
963- cancel_work_sync (& emu -> emu1010 .firmware_work );
964- cancel_work_sync (& emu -> emu1010 .clock_work );
920+ cancel_work_sync (& emu -> emu1010 .work );
921+ mutex_destroy (& emu -> emu1010 .lock );
965922 release_firmware (emu -> firmware );
966923 release_firmware (emu -> dock_fw );
967924 snd_util_memhdr_free (emu -> memhdr );
@@ -1540,8 +1497,8 @@ int snd_emu10k1_create(struct snd_card *card,
15401497 emu -> irq = -1 ;
15411498 emu -> synth = NULL ;
15421499 emu -> get_synth_voice = NULL ;
1543- INIT_WORK (& emu -> emu1010 .firmware_work , emu1010_firmware_work );
1544- INIT_WORK (& emu -> emu1010 .clock_work , emu1010_clock_work );
1500+ INIT_WORK (& emu -> emu1010 .work , emu1010_work );
1501+ mutex_init (& emu -> emu1010 .lock );
15451502 /* read revision & serial */
15461503 emu -> revision = pci -> revision ;
15471504 pci_read_config_dword (pci , PCI_SUBSYSTEM_VENDOR_ID , & emu -> serial );
0 commit comments