Skip to content

Commit 6b844f0

Browse files
committed
Merge branch 'topic/emu10k1-fix' into for-next
Pull emu10k1 fixes from Oswald Buddenhagen Signed-off-by: Takashi Iwai <tiwai@suse.de>
2 parents 078c95f + 1aa4127 commit 6b844f0

8 files changed

Lines changed: 238 additions & 176 deletions

File tree

include/sound/emu10k1.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,8 +1692,8 @@ struct snd_emu1010 {
16921692
unsigned int clock_fallback;
16931693
unsigned int optical_in; /* 0:SPDIF, 1:ADAT */
16941694
unsigned int optical_out; /* 0:SPDIF, 1:ADAT */
1695-
struct work_struct firmware_work;
1696-
struct work_struct clock_work;
1695+
struct work_struct work;
1696+
struct mutex lock;
16971697
};
16981698

16991699
struct snd_emu10k1 {
@@ -1842,12 +1842,16 @@ unsigned int snd_emu10k1_ptr20_read(struct snd_emu10k1 * emu, unsigned int reg,
18421842
void snd_emu10k1_ptr20_write(struct snd_emu10k1 *emu, unsigned int reg, unsigned int chn, unsigned int data);
18431843
int snd_emu10k1_spi_write(struct snd_emu10k1 * emu, unsigned int data);
18441844
int snd_emu10k1_i2c_write(struct snd_emu10k1 *emu, u32 reg, u32 value);
1845+
static inline void snd_emu1010_fpga_lock(struct snd_emu10k1 *emu) { mutex_lock(&emu->emu1010.lock); };
1846+
static inline void snd_emu1010_fpga_unlock(struct snd_emu10k1 *emu) { mutex_unlock(&emu->emu1010.lock); };
1847+
void snd_emu1010_fpga_write_lock(struct snd_emu10k1 *emu, u32 reg, u32 value);
18451848
void snd_emu1010_fpga_write(struct snd_emu10k1 *emu, u32 reg, u32 value);
18461849
void snd_emu1010_fpga_read(struct snd_emu10k1 *emu, u32 reg, u32 *value);
18471850
void snd_emu1010_fpga_link_dst_src_write(struct snd_emu10k1 *emu, u32 dst, u32 src);
18481851
u32 snd_emu1010_fpga_link_dst_src_read(struct snd_emu10k1 *emu, u32 dst);
18491852
int snd_emu1010_get_raw_rate(struct snd_emu10k1 *emu, u8 src);
18501853
void snd_emu1010_update_clock(struct snd_emu10k1 *emu);
1854+
void snd_emu1010_load_firmware_entry(struct snd_emu10k1 *emu, int dock, const struct firmware *fw_entry);
18511855
unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc);
18521856
void snd_emu10k1_intr_enable(struct snd_emu10k1 *emu, unsigned int intrenb);
18531857
void snd_emu10k1_intr_disable(struct snd_emu10k1 *emu, unsigned int intrenb);

sound/core/seq/seq_ump_convert.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,
428428
midi1->note.group = midi2->note.group;
429429
midi1->note.status = midi2->note.status;
430430
midi1->note.channel = midi2->note.channel;
431-
switch (midi2->note.status << 4) {
431+
switch (midi2->note.status) {
432432
case UMP_MSG_STATUS_NOTE_ON:
433433
case UMP_MSG_STATUS_NOTE_OFF:
434434
midi1->note.note = midi2->note.note;

sound/pci/emu10k1/emu10k1.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,7 @@ static int snd_emu10k1_suspend(struct device *dev)
189189

190190
emu->suspend = 1;
191191

192-
cancel_work_sync(&emu->emu1010.firmware_work);
193-
cancel_work_sync(&emu->emu1010.clock_work);
192+
cancel_work_sync(&emu->emu1010.work);
194193

195194
snd_ac97_suspend(emu->ac97);
196195

sound/pci/emu10k1/emu10k1_main.c

Lines changed: 91 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -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) */
702656
static 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

Comments
 (0)