Commit 593aff6c authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/hdsp' into for-linus

parents e7bfbb02 c2503cd3
...@@ -113,7 +113,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); ...@@ -113,7 +113,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
/* the meters are regular i/o-mapped registers, but offset /* the meters are regular i/o-mapped registers, but offset
considerably from the rest. the peak registers are reset considerably from the rest. the peak registers are reset
when read; the least-significant 4 bits are full-scale counters; when read; the least-significant 4 bits are full-scale counters;
the actual peak value is in the most-significant 24 bits. the actual peak value is in the most-significant 24 bits.
*/ */
...@@ -131,7 +131,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); ...@@ -131,7 +131,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
26*3 values are read in ss mode 26*3 values are read in ss mode
14*3 in ds mode, with no gap between values 14*3 in ds mode, with no gap between values
*/ */
#define HDSP_9652_peakBase 7164 #define HDSP_9652_peakBase 7164
#define HDSP_9652_rmsBase 4096 #define HDSP_9652_rmsBase 4096
/* c.f. the hdsp_9632_meters_t struct */ /* c.f. the hdsp_9632_meters_t struct */
...@@ -173,12 +173,12 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); ...@@ -173,12 +173,12 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
#define HDSP_SPDIFEmphasis (1<<10) /* 0=none, 1=on */ #define HDSP_SPDIFEmphasis (1<<10) /* 0=none, 1=on */
#define HDSP_SPDIFNonAudio (1<<11) /* 0=off, 1=on */ #define HDSP_SPDIFNonAudio (1<<11) /* 0=off, 1=on */
#define HDSP_SPDIFOpticalOut (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */ #define HDSP_SPDIFOpticalOut (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */
#define HDSP_SyncRef2 (1<<13) #define HDSP_SyncRef2 (1<<13)
#define HDSP_SPDIFInputSelect0 (1<<14) #define HDSP_SPDIFInputSelect0 (1<<14)
#define HDSP_SPDIFInputSelect1 (1<<15) #define HDSP_SPDIFInputSelect1 (1<<15)
#define HDSP_SyncRef0 (1<<16) #define HDSP_SyncRef0 (1<<16)
#define HDSP_SyncRef1 (1<<17) #define HDSP_SyncRef1 (1<<17)
#define HDSP_AnalogExtensionBoard (1<<18) /* For H9632 cards */ #define HDSP_AnalogExtensionBoard (1<<18) /* For H9632 cards */
#define HDSP_XLRBreakoutCable (1<<20) /* For H9632 cards */ #define HDSP_XLRBreakoutCable (1<<20) /* For H9632 cards */
#define HDSP_Midi0InterruptEnable (1<<22) #define HDSP_Midi0InterruptEnable (1<<22)
#define HDSP_Midi1InterruptEnable (1<<23) #define HDSP_Midi1InterruptEnable (1<<23)
...@@ -314,7 +314,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); ...@@ -314,7 +314,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
#define HDSP_TimecodeSync (1<<27) #define HDSP_TimecodeSync (1<<27)
#define HDSP_AEBO (1<<28) /* H9632 specific Analog Extension Boards */ #define HDSP_AEBO (1<<28) /* H9632 specific Analog Extension Boards */
#define HDSP_AEBI (1<<29) /* 0 = present, 1 = absent */ #define HDSP_AEBI (1<<29) /* 0 = present, 1 = absent */
#define HDSP_midi0IRQPending (1<<30) #define HDSP_midi0IRQPending (1<<30)
#define HDSP_midi1IRQPending (1<<31) #define HDSP_midi1IRQPending (1<<31)
#define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2) #define HDSP_spdifFrequencyMask (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
...@@ -391,7 +391,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin"); ...@@ -391,7 +391,7 @@ MODULE_FIRMWARE("digiface_firmware_rev11.bin");
#define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES) #define HDSP_CHANNEL_BUFFER_BYTES (4*HDSP_CHANNEL_BUFFER_SAMPLES)
/* the size of the area we need to allocate for DMA transfers. the /* the size of the area we need to allocate for DMA transfers. the
size is the same regardless of the number of channels - the size is the same regardless of the number of channels - the
Multiface still uses the same memory area. Multiface still uses the same memory area.
Note that we allocate 1 more channel than is apparently needed Note that we allocate 1 more channel than is apparently needed
...@@ -460,7 +460,7 @@ struct hdsp { ...@@ -460,7 +460,7 @@ struct hdsp {
unsigned char qs_in_channels; /* quad speed mode for H9632 */ unsigned char qs_in_channels; /* quad speed mode for H9632 */
unsigned char ds_in_channels; unsigned char ds_in_channels;
unsigned char ss_in_channels; /* different for multiface/digiface */ unsigned char ss_in_channels; /* different for multiface/digiface */
unsigned char qs_out_channels; unsigned char qs_out_channels;
unsigned char ds_out_channels; unsigned char ds_out_channels;
unsigned char ss_out_channels; unsigned char ss_out_channels;
...@@ -502,9 +502,9 @@ static char channel_map_df_ss[HDSP_MAX_CHANNELS] = { ...@@ -502,9 +502,9 @@ static char channel_map_df_ss[HDSP_MAX_CHANNELS] = {
static char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */ static char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */
/* Analog */ /* Analog */
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
/* ADAT 2 */ /* ADAT 2 */
16, 17, 18, 19, 20, 21, 22, 23, 16, 17, 18, 19, 20, 21, 22, 23,
/* SPDIF */ /* SPDIF */
24, 25, 24, 25,
-1, -1, -1, -1, -1, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1
...@@ -525,11 +525,11 @@ static char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = { ...@@ -525,11 +525,11 @@ static char channel_map_H9632_ss[HDSP_MAX_CHANNELS] = {
/* SPDIF */ /* SPDIF */
8, 9, 8, 9,
/* Analog */ /* Analog */
10, 11, 10, 11,
/* AO4S-192 and AI4S-192 extension boards */ /* AO4S-192 and AI4S-192 extension boards */
12, 13, 14, 15, 12, 13, 14, 15,
/* others don't exist */ /* others don't exist */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1 -1, -1
}; };
...@@ -539,7 +539,7 @@ static char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = { ...@@ -539,7 +539,7 @@ static char channel_map_H9632_ds[HDSP_MAX_CHANNELS] = {
/* SPDIF */ /* SPDIF */
8, 9, 8, 9,
/* Analog */ /* Analog */
10, 11, 10, 11,
/* AO4S-192 and AI4S-192 extension boards */ /* AO4S-192 and AI4S-192 extension boards */
12, 13, 14, 15, 12, 13, 14, 15,
/* others don't exist */ /* others don't exist */
...@@ -587,7 +587,7 @@ static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_d ...@@ -587,7 +587,7 @@ static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_d
static struct pci_device_id snd_hdsp_ids[] = { static struct pci_device_id snd_hdsp_ids[] = {
{ {
.vendor = PCI_VENDOR_ID_XILINX, .vendor = PCI_VENDOR_ID_XILINX,
.device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP,
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
}, /* RME Hammerfall-DSP */ }, /* RME Hammerfall-DSP */
...@@ -653,7 +653,6 @@ static unsigned int hdsp_read(struct hdsp *hdsp, int reg) ...@@ -653,7 +653,6 @@ static unsigned int hdsp_read(struct hdsp *hdsp, int reg)
static int hdsp_check_for_iobox (struct hdsp *hdsp) static int hdsp_check_for_iobox (struct hdsp *hdsp)
{ {
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0; if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0;
if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) { if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) {
snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n"); snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n");
...@@ -661,7 +660,29 @@ static int hdsp_check_for_iobox (struct hdsp *hdsp) ...@@ -661,7 +660,29 @@ static int hdsp_check_for_iobox (struct hdsp *hdsp)
return -EIO; return -EIO;
} }
return 0; return 0;
}
static int hdsp_wait_for_iobox(struct hdsp *hdsp, unsigned int loops,
unsigned int delay)
{
unsigned int i;
if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
return 0;
for (i = 0; i != loops; ++i) {
if (hdsp_read(hdsp, HDSP_statusRegister) & HDSP_ConfigError)
msleep(delay);
else {
snd_printd("Hammerfall-DSP: iobox found after %ums!\n",
i * delay);
return 0;
}
}
snd_printk("Hammerfall-DSP: no Digiface or Multiface connected!\n");
hdsp->state &= ~HDSP_FirmwareLoaded;
return -EIO;
} }
static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
...@@ -670,19 +691,19 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { ...@@ -670,19 +691,19 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
unsigned long flags; unsigned long flags;
if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
snd_printk ("Hammerfall-DSP: loading firmware\n"); snd_printk ("Hammerfall-DSP: loading firmware\n");
hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_PROGRAM); hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_PROGRAM);
hdsp_write (hdsp, HDSP_fifoData, 0); hdsp_write (hdsp, HDSP_fifoData, 0);
if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
snd_printk ("Hammerfall-DSP: timeout waiting for download preparation\n"); snd_printk ("Hammerfall-DSP: timeout waiting for download preparation\n");
return -EIO; return -EIO;
} }
hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD); hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD);
for (i = 0; i < 24413; ++i) { for (i = 0; i < 24413; ++i) {
hdsp_write(hdsp, HDSP_fifoData, hdsp->firmware_cache[i]); hdsp_write(hdsp, HDSP_fifoData, hdsp->firmware_cache[i]);
if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) { if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) {
...@@ -692,7 +713,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { ...@@ -692,7 +713,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
} }
ssleep(3); ssleep(3);
if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) { if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
snd_printk ("Hammerfall-DSP: timeout at end of firmware loading\n"); snd_printk ("Hammerfall-DSP: timeout at end of firmware loading\n");
return -EIO; return -EIO;
...@@ -705,15 +726,15 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { ...@@ -705,15 +726,15 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
#endif #endif
hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register); hdsp_write (hdsp, HDSP_control2Reg, hdsp->control2_register);
snd_printk ("Hammerfall-DSP: finished firmware loading\n"); snd_printk ("Hammerfall-DSP: finished firmware loading\n");
} }
if (hdsp->state & HDSP_InitializationComplete) { if (hdsp->state & HDSP_InitializationComplete) {
snd_printk(KERN_INFO "Hammerfall-DSP: firmware loaded from cache, restoring defaults\n"); snd_printk(KERN_INFO "Hammerfall-DSP: firmware loaded from cache, restoring defaults\n");
spin_lock_irqsave(&hdsp->lock, flags); spin_lock_irqsave(&hdsp->lock, flags);
snd_hdsp_set_defaults(hdsp); snd_hdsp_set_defaults(hdsp);
spin_unlock_irqrestore(&hdsp->lock, flags); spin_unlock_irqrestore(&hdsp->lock, flags);
} }
hdsp->state |= HDSP_FirmwareLoaded; hdsp->state |= HDSP_FirmwareLoaded;
return 0; return 0;
...@@ -722,7 +743,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) { ...@@ -722,7 +743,7 @@ static int snd_hdsp_load_firmware_from_cache(struct hdsp *hdsp) {
static int hdsp_get_iobox_version (struct hdsp *hdsp) static int hdsp_get_iobox_version (struct hdsp *hdsp)
{ {
if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
hdsp_write (hdsp, HDSP_control2Reg, HDSP_PROGRAM); hdsp_write (hdsp, HDSP_control2Reg, HDSP_PROGRAM);
hdsp_write (hdsp, HDSP_fifoData, 0); hdsp_write (hdsp, HDSP_fifoData, 0);
if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0)
...@@ -738,7 +759,7 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp) ...@@ -738,7 +759,7 @@ static int hdsp_get_iobox_version (struct hdsp *hdsp)
hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT); hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
} else { } else {
hdsp->io_type = Digiface; hdsp->io_type = Digiface;
} }
} else { } else {
/* firmware was already loaded, get iobox type */ /* firmware was already loaded, get iobox type */
if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1)
...@@ -786,13 +807,13 @@ static int hdsp_check_for_firmware (struct hdsp *hdsp, int load_on_demand) ...@@ -786,13 +807,13 @@ static int hdsp_check_for_firmware (struct hdsp *hdsp, int load_on_demand)
static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout) static int hdsp_fifo_wait(struct hdsp *hdsp, int count, int timeout)
{ {
int i; int i;
/* the fifoStatus registers reports on how many words /* the fifoStatus registers reports on how many words
are available in the command FIFO. are available in the command FIFO.
*/ */
for (i = 0; i < timeout; i++) { for (i = 0; i < timeout; i++) {
if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count) if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count)
...@@ -824,11 +845,11 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short ...@@ -824,11 +845,11 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short
if (addr >= HDSP_MATRIX_MIXER_SIZE) if (addr >= HDSP_MATRIX_MIXER_SIZE)
return -1; return -1;
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) { if (hdsp->io_type == H9652 || hdsp->io_type == H9632) {
/* from martin bjornsen: /* from martin bjornsen:
"You can only write dwords to the "You can only write dwords to the
mixer memory which contain two mixer memory which contain two
mixer values in the low and high mixer values in the low and high
...@@ -847,7 +868,7 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short ...@@ -847,7 +868,7 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short
hdsp->mixer_matrix[addr] = data; hdsp->mixer_matrix[addr] = data;
/* `addr' addresses a 16-bit wide address, but /* `addr' addresses a 16-bit wide address, but
the address space accessed via hdsp_write the address space accessed via hdsp_write
uses byte offsets. put another way, addr uses byte offsets. put another way, addr
...@@ -856,17 +877,17 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short ...@@ -856,17 +877,17 @@ static int hdsp_write_gain(struct hdsp *hdsp, unsigned int addr, unsigned short
to access 0 to 2703 ... to access 0 to 2703 ...
*/ */
ad = addr/2; ad = addr/2;
hdsp_write (hdsp, 4096 + (ad*4), hdsp_write (hdsp, 4096 + (ad*4),
(hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) + (hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) +
hdsp->mixer_matrix[addr&0x7fe]); hdsp->mixer_matrix[addr&0x7fe]);
return 0; return 0;
} else { } else {
ad = (addr << 16) + data; ad = (addr << 16) + data;
if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT)) if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT))
return -1; return -1;
...@@ -902,7 +923,7 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp) ...@@ -902,7 +923,7 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp)
if (status & HDSP_SPDIFErrorFlag) if (status & HDSP_SPDIFErrorFlag)
return 0; return 0;
switch (rate_bits) { switch (rate_bits) {
case HDSP_spdifFrequency32KHz: return 32000; case HDSP_spdifFrequency32KHz: return 32000;
case HDSP_spdifFrequency44_1KHz: return 44100; case HDSP_spdifFrequency44_1KHz: return 44100;
...@@ -910,13 +931,13 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp) ...@@ -910,13 +931,13 @@ static int hdsp_spdif_sample_rate(struct hdsp *hdsp)
case HDSP_spdifFrequency64KHz: return 64000; case HDSP_spdifFrequency64KHz: return 64000;
case HDSP_spdifFrequency88_2KHz: return 88200; case HDSP_spdifFrequency88_2KHz: return 88200;
case HDSP_spdifFrequency96KHz: return 96000; case HDSP_spdifFrequency96KHz: return 96000;
case HDSP_spdifFrequency128KHz: case HDSP_spdifFrequency128KHz:
if (hdsp->io_type == H9632) return 128000; if (hdsp->io_type == H9632) return 128000;
break; break;
case HDSP_spdifFrequency176_4KHz: case HDSP_spdifFrequency176_4KHz:
if (hdsp->io_type == H9632) return 176400; if (hdsp->io_type == H9632) return 176400;
break; break;
case HDSP_spdifFrequency192KHz: case HDSP_spdifFrequency192KHz:
if (hdsp->io_type == H9632) return 192000; if (hdsp->io_type == H9632) return 192000;
break; break;
default: default:
...@@ -1027,7 +1048,7 @@ static void hdsp_set_dds_value(struct hdsp *hdsp, int rate) ...@@ -1027,7 +1048,7 @@ static void hdsp_set_dds_value(struct hdsp *hdsp, int rate)
{ {
u64 n; u64 n;
u32 r; u32 r;
if (rate >= 112000) if (rate >= 112000)
rate /= 4; rate /= 4;
else if (rate >= 56000) else if (rate >= 56000)
...@@ -1053,35 +1074,35 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) ...@@ -1053,35 +1074,35 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally)
there is no need for it (e.g. during module there is no need for it (e.g. during module
initialization). initialization).
*/ */
if (!(hdsp->control_register & HDSP_ClockModeMaster)) { if (!(hdsp->control_register & HDSP_ClockModeMaster)) {
if (called_internally) { if (called_internally) {
/* request from ctl or card initialization */ /* request from ctl or card initialization */
snd_printk(KERN_ERR "Hammerfall-DSP: device is not running as a clock master: cannot set sample rate.\n"); snd_printk(KERN_ERR "Hammerfall-DSP: device is not running as a clock master: cannot set sample rate.\n");
return -1; return -1;
} else { } else {
/* hw_param request while in AutoSync mode */ /* hw_param request while in AutoSync mode */
int external_freq = hdsp_external_sample_rate(hdsp); int external_freq = hdsp_external_sample_rate(hdsp);
int spdif_freq = hdsp_spdif_sample_rate(hdsp); int spdif_freq = hdsp_spdif_sample_rate(hdsp);
if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1))
snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in double speed mode\n"); snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in double speed mode\n");
else if (hdsp->io_type == H9632 && (spdif_freq == external_freq*4) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) else if (hdsp->io_type == H9632 && (spdif_freq == external_freq*4) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1))
snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in quad speed mode\n"); snd_printk(KERN_INFO "Hammerfall-DSP: Detected ADAT in quad speed mode\n");
else if (rate != external_freq) { else if (rate != external_freq) {
snd_printk(KERN_INFO "Hammerfall-DSP: No AutoSync source for requested rate\n"); snd_printk(KERN_INFO "Hammerfall-DSP: No AutoSync source for requested rate\n");
return -1; return -1;
} }
} }
} }
current_rate = hdsp->system_sample_rate; current_rate = hdsp->system_sample_rate;
/* Changing from a "single speed" to a "double speed" rate is /* Changing from a "single speed" to a "double speed" rate is
not allowed if any substreams are open. This is because not allowed if any substreams are open. This is because
such a change causes a shift in the location of such a change causes a shift in the location of
the DMA buffers and a reduction in the number of available the DMA buffers and a reduction in the number of available
buffers. buffers.
Note that a similar but essentially insoluble problem Note that a similar but essentially insoluble problem
exists for externally-driven rate changes. All we can do exists for externally-driven rate changes. All we can do
...@@ -1089,7 +1110,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) ...@@ -1089,7 +1110,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally)
if (rate > 96000 && hdsp->io_type != H9632) if (rate > 96000 && hdsp->io_type != H9632)
return -EINVAL; return -EINVAL;
switch (rate) { switch (rate) {
case 32000: case 32000:
if (current_rate > 48000) if (current_rate > 48000)
...@@ -1179,7 +1200,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally) ...@@ -1179,7 +1200,7 @@ static int hdsp_set_rate(struct hdsp *hdsp, int rate, int called_internally)
break; break;
} }
} }
hdsp->system_sample_rate = rate; hdsp->system_sample_rate = rate;
return 0; return 0;
...@@ -1245,16 +1266,16 @@ static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi) ...@@ -1245,16 +1266,16 @@ static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi)
unsigned char buf[128]; unsigned char buf[128];
/* Output is not interrupt driven */ /* Output is not interrupt driven */
spin_lock_irqsave (&hmidi->lock, flags); spin_lock_irqsave (&hmidi->lock, flags);
if (hmidi->output) { if (hmidi->output) {
if (!snd_rawmidi_transmit_empty (hmidi->output)) { if (!snd_rawmidi_transmit_empty (hmidi->output)) {
if ((n_pending = snd_hdsp_midi_output_possible (hmidi->hdsp, hmidi->id)) > 0) { if ((n_pending = snd_hdsp_midi_output_possible (hmidi->hdsp, hmidi->id)) > 0) {
if (n_pending > (int)sizeof (buf)) if (n_pending > (int)sizeof (buf))
n_pending = sizeof (buf); n_pending = sizeof (buf);
if ((to_write = snd_rawmidi_transmit (hmidi->output, buf, n_pending)) > 0) { if ((to_write = snd_rawmidi_transmit (hmidi->output, buf, n_pending)) > 0) {
for (i = 0; i < to_write; ++i) for (i = 0; i < to_write; ++i)
snd_hdsp_midi_write_byte (hmidi->hdsp, hmidi->id, buf[i]); snd_hdsp_midi_write_byte (hmidi->hdsp, hmidi->id, buf[i]);
} }
} }
...@@ -1325,14 +1346,14 @@ static void snd_hdsp_midi_output_timer(unsigned long data) ...@@ -1325,14 +1346,14 @@ static void snd_hdsp_midi_output_timer(unsigned long data)
{ {
struct hdsp_midi *hmidi = (struct hdsp_midi *) data; struct hdsp_midi *hmidi = (struct hdsp_midi *) data;
unsigned long flags; unsigned long flags;
snd_hdsp_midi_output_write(hmidi); snd_hdsp_midi_output_write(hmidi);
spin_lock_irqsave (&hmidi->lock, flags); spin_lock_irqsave (&hmidi->lock, flags);
/* this does not bump hmidi->istimer, because the /* this does not bump hmidi->istimer, because the
kernel automatically removed the timer when it kernel automatically removed the timer when it
expired, and we are now adding it back, thus expired, and we are now adding it back, thus
leaving istimer wherever it was set before. leaving istimer wherever it was set before.
*/ */
if (hmidi->istimer) { if (hmidi->istimer) {
...@@ -1501,7 +1522,7 @@ static int snd_hdsp_control_spdif_info(struct snd_kcontrol *kcontrol, struct snd ...@@ -1501,7 +1522,7 @@ static int snd_hdsp_control_spdif_info(struct snd_kcontrol *kcontrol, struct snd
static int snd_hdsp_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_control_spdif_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif); snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif);
return 0; return 0;
} }
...@@ -1511,7 +1532,7 @@ static int snd_hdsp_control_spdif_put(struct snd_kcontrol *kcontrol, struct snd_ ...@@ -1511,7 +1532,7 @@ static int snd_hdsp_control_spdif_put(struct snd_kcontrol *kcontrol, struct snd_
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
u32 val; u32 val;
val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
change = val != hdsp->creg_spdif; change = val != hdsp->creg_spdif;
...@@ -1530,7 +1551,7 @@ static int snd_hdsp_control_spdif_stream_info(struct snd_kcontrol *kcontrol, str ...@@ -1530,7 +1551,7 @@ static int snd_hdsp_control_spdif_stream_info(struct snd_kcontrol *kcontrol, str
static int snd_hdsp_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_control_spdif_stream_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif_stream); snd_hdsp_convert_to_aes(&ucontrol->value.iec958, hdsp->creg_spdif_stream);
return 0; return 0;
} }
...@@ -1540,7 +1561,7 @@ static int snd_hdsp_control_spdif_stream_put(struct snd_kcontrol *kcontrol, stru ...@@ -1540,7 +1561,7 @@ static int snd_hdsp_control_spdif_stream_put(struct snd_kcontrol *kcontrol, stru
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
u32 val; u32 val;
val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958); val = snd_hdsp_convert_from_aes(&ucontrol->value.iec958);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
change = val != hdsp->creg_spdif_stream; change = val != hdsp->creg_spdif_stream;
...@@ -1602,7 +1623,7 @@ static int snd_hdsp_info_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_ ...@@ -1602,7 +1623,7 @@ static int snd_hdsp_info_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_
static int snd_hdsp_get_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp); ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp);
return 0; return 0;
} }
...@@ -1612,7 +1633,7 @@ static int snd_hdsp_put_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_e ...@@ -1612,7 +1633,7 @@ static int snd_hdsp_put_spdif_in(struct snd_kcontrol *kcontrol, struct snd_ctl_e
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0] % ((hdsp->io_type == H9632) ? 4 : 3); val = ucontrol->value.enumerated.item[0] % ((hdsp->io_type == H9632) ? 4 : 3);
...@@ -1649,7 +1670,7 @@ static int hdsp_set_spdif_output(struct hdsp *hdsp, int out) ...@@ -1649,7 +1670,7 @@ static int hdsp_set_spdif_output(struct hdsp *hdsp, int out)
static int snd_hdsp_get_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = hdsp_spdif_out(hdsp); ucontrol->value.integer.value[0] = hdsp_spdif_out(hdsp);
return 0; return 0;
} }
...@@ -1659,7 +1680,7 @@ static int snd_hdsp_put_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_ ...@@ -1659,7 +1680,7 @@ static int snd_hdsp_put_spdif_out(struct snd_kcontrol *kcontrol, struct snd_ctl_
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -1693,7 +1714,7 @@ static int hdsp_set_spdif_professional(struct hdsp *hdsp, int val) ...@@ -1693,7 +1714,7 @@ static int hdsp_set_spdif_professional(struct hdsp *hdsp, int val)
static int snd_hdsp_get_spdif_professional(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_professional(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = hdsp_spdif_professional(hdsp); ucontrol->value.integer.value[0] = hdsp_spdif_professional(hdsp);
return 0; return 0;
} }
...@@ -1703,7 +1724,7 @@ static int snd_hdsp_put_spdif_professional(struct snd_kcontrol *kcontrol, struct ...@@ -1703,7 +1724,7 @@ static int snd_hdsp_put_spdif_professional(struct snd_kcontrol *kcontrol, struct
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -1737,7 +1758,7 @@ static int hdsp_set_spdif_emphasis(struct hdsp *hdsp, int val) ...@@ -1737,7 +1758,7 @@ static int hdsp_set_spdif_emphasis(struct hdsp *hdsp, int val)
static int snd_hdsp_get_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = hdsp_spdif_emphasis(hdsp); ucontrol->value.integer.value[0] = hdsp_spdif_emphasis(hdsp);
return 0; return 0;
} }
...@@ -1747,7 +1768,7 @@ static int snd_hdsp_put_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd ...@@ -1747,7 +1768,7 @@ static int snd_hdsp_put_spdif_emphasis(struct snd_kcontrol *kcontrol, struct snd
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -1781,7 +1802,7 @@ static int hdsp_set_spdif_nonaudio(struct hdsp *hdsp, int val) ...@@ -1781,7 +1802,7 @@ static int hdsp_set_spdif_nonaudio(struct hdsp *hdsp, int val)
static int snd_hdsp_get_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = hdsp_spdif_nonaudio(hdsp); ucontrol->value.integer.value[0] = hdsp_spdif_nonaudio(hdsp);
return 0; return 0;
} }
...@@ -1791,7 +1812,7 @@ static int snd_hdsp_put_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd ...@@ -1791,7 +1812,7 @@ static int snd_hdsp_put_spdif_nonaudio(struct snd_kcontrol *kcontrol, struct snd
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -1828,7 +1849,7 @@ static int snd_hdsp_info_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct ...@@ -1828,7 +1849,7 @@ static int snd_hdsp_info_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct
static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
switch (hdsp_spdif_sample_rate(hdsp)) { switch (hdsp_spdif_sample_rate(hdsp)) {
case 32000: case 32000:
ucontrol->value.enumerated.item[0] = 0; ucontrol->value.enumerated.item[0] = 0;
...@@ -1858,7 +1879,7 @@ static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct ...@@ -1858,7 +1879,7 @@ static int snd_hdsp_get_spdif_sample_rate(struct snd_kcontrol *kcontrol, struct
ucontrol->value.enumerated.item[0] = 9; ucontrol->value.enumerated.item[0] = 9;
break; break;
default: default:
ucontrol->value.enumerated.item[0] = 6; ucontrol->value.enumerated.item[0] = 6;
} }
return 0; return 0;
} }
...@@ -1882,7 +1903,7 @@ static int snd_hdsp_info_system_sample_rate(struct snd_kcontrol *kcontrol, struc ...@@ -1882,7 +1903,7 @@ static int snd_hdsp_info_system_sample_rate(struct snd_kcontrol *kcontrol, struc
static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate; ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate;
return 0; return 0;
} }
...@@ -1899,7 +1920,7 @@ static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct ...@@ -1899,7 +1920,7 @@ static int snd_hdsp_get_system_sample_rate(struct snd_kcontrol *kcontrol, struct
static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"}; static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None", "128000", "176400", "192000"};
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = (hdsp->io_type == H9632) ? 10 : 7 ; uinfo->value.enumerated.items = (hdsp->io_type == H9632) ? 10 : 7 ;
...@@ -1912,7 +1933,7 @@ static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, str ...@@ -1912,7 +1933,7 @@ static int snd_hdsp_info_autosync_sample_rate(struct snd_kcontrol *kcontrol, str
static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
switch (hdsp_external_sample_rate(hdsp)) { switch (hdsp_external_sample_rate(hdsp)) {
case 32000: case 32000:
ucontrol->value.enumerated.item[0] = 0; ucontrol->value.enumerated.item[0] = 0;
...@@ -1940,9 +1961,9 @@ static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, stru ...@@ -1940,9 +1961,9 @@ static int snd_hdsp_get_autosync_sample_rate(struct snd_kcontrol *kcontrol, stru
break; break;
case 192000: case 192000:
ucontrol->value.enumerated.item[0] = 9; ucontrol->value.enumerated.item[0] = 9;
break; break;
default: default:
ucontrol->value.enumerated.item[0] = 6; ucontrol->value.enumerated.item[0] = 6;
} }
return 0; return 0;
} }
...@@ -1968,7 +1989,7 @@ static int hdsp_system_clock_mode(struct hdsp *hdsp) ...@@ -1968,7 +1989,7 @@ static int hdsp_system_clock_mode(struct hdsp *hdsp)
static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"Master", "Slave" }; static char *texts[] = {"Master", "Slave" };
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 2; uinfo->value.enumerated.items = 2;
...@@ -1981,7 +2002,7 @@ static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct ...@@ -1981,7 +2002,7 @@ static int snd_hdsp_info_system_clock_mode(struct snd_kcontrol *kcontrol, struct
static int snd_hdsp_get_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_system_clock_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp); ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp);
return 0; return 0;
} }
...@@ -2018,7 +2039,7 @@ static int hdsp_clock_source(struct hdsp *hdsp) ...@@ -2018,7 +2039,7 @@ static int hdsp_clock_source(struct hdsp *hdsp)
case 192000: case 192000:
return 9; return 9;
default: default:
return 3; return 3;
} }
} else { } else {
return 0; return 0;
...@@ -2032,7 +2053,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode) ...@@ -2032,7 +2053,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode)
case HDSP_CLOCK_SOURCE_AUTOSYNC: case HDSP_CLOCK_SOURCE_AUTOSYNC:
if (hdsp_external_sample_rate(hdsp) != 0) { if (hdsp_external_sample_rate(hdsp) != 0) {
if (!hdsp_set_rate(hdsp, hdsp_external_sample_rate(hdsp), 1)) { if (!hdsp_set_rate(hdsp, hdsp_external_sample_rate(hdsp), 1)) {
hdsp->control_register &= ~HDSP_ClockModeMaster; hdsp->control_register &= ~HDSP_ClockModeMaster;
hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
return 0; return 0;
} }
...@@ -2043,7 +2064,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode) ...@@ -2043,7 +2064,7 @@ static int hdsp_set_clock_source(struct hdsp *hdsp, int mode)
break; break;
case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ: case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ:
rate = 44100; rate = 44100;
break; break;
case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ: case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ:
rate = 48000; rate = 48000;
break; break;
...@@ -2078,13 +2099,13 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_ ...@@ -2078,13 +2099,13 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_
{ {
static char *texts[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz", "Internal 192.0 KHz" }; static char *texts[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz", "Internal 128 kHz", "Internal 176.4 kHz", "Internal 192.0 KHz" };
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
if (hdsp->io_type == H9632) if (hdsp->io_type == H9632)
uinfo->value.enumerated.items = 10; uinfo->value.enumerated.items = 10;
else else
uinfo->value.enumerated.items = 7; uinfo->value.enumerated.items = 7;
if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
...@@ -2094,7 +2115,7 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_ ...@@ -2094,7 +2115,7 @@ static int snd_hdsp_info_clock_source(struct snd_kcontrol *kcontrol, struct snd_
static int snd_hdsp_get_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_clock_source(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp); ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp);
return 0; return 0;
} }
...@@ -2104,7 +2125,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c ...@@ -2104,7 +2125,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0]; val = ucontrol->value.enumerated.item[0];
...@@ -2130,7 +2151,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c ...@@ -2130,7 +2151,7 @@ static int snd_hdsp_put_clock_source(struct snd_kcontrol *kcontrol, struct snd_c
static int snd_hdsp_get_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_clock_source_lock(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.integer.value[0] = hdsp->clock_source_locked; ucontrol->value.integer.value[0] = hdsp->clock_source_locked;
return 0; return 0;
} }
...@@ -2165,7 +2186,7 @@ static int hdsp_da_gain(struct hdsp *hdsp) ...@@ -2165,7 +2186,7 @@ static int hdsp_da_gain(struct hdsp *hdsp)
case HDSP_DAGainMinus10dBV: case HDSP_DAGainMinus10dBV:
return 2; return 2;
default: default:
return 1; return 1;
} }
} }
...@@ -2180,8 +2201,8 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode) ...@@ -2180,8 +2201,8 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode)
hdsp->control_register |= HDSP_DAGainPlus4dBu; hdsp->control_register |= HDSP_DAGainPlus4dBu;
break; break;
case 2: case 2:
hdsp->control_register |= HDSP_DAGainMinus10dBV; hdsp->control_register |= HDSP_DAGainMinus10dBV;
break; break;
default: default:
return -1; return -1;
...@@ -2193,7 +2214,7 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode) ...@@ -2193,7 +2214,7 @@ static int hdsp_set_da_gain(struct hdsp *hdsp, int mode)
static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"Hi Gain", "+4 dBu", "-10 dbV"}; static char *texts[] = {"Hi Gain", "+4 dBu", "-10 dbV"};
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 3; uinfo->value.enumerated.items = 3;
...@@ -2206,7 +2227,7 @@ static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e ...@@ -2206,7 +2227,7 @@ static int snd_hdsp_info_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e
static int snd_hdsp_get_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_da_gain(hdsp); ucontrol->value.enumerated.item[0] = hdsp_da_gain(hdsp);
return 0; return 0;
} }
...@@ -2216,7 +2237,7 @@ static int snd_hdsp_put_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el ...@@ -2216,7 +2237,7 @@ static int snd_hdsp_put_da_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0]; val = ucontrol->value.enumerated.item[0];
...@@ -2250,7 +2271,7 @@ static int hdsp_ad_gain(struct hdsp *hdsp) ...@@ -2250,7 +2271,7 @@ static int hdsp_ad_gain(struct hdsp *hdsp)
case HDSP_ADGainLowGain: case HDSP_ADGainLowGain:
return 2; return 2;
default: default:
return 1; return 1;
} }
} }
...@@ -2262,11 +2283,11 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode) ...@@ -2262,11 +2283,11 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode)
hdsp->control_register |= HDSP_ADGainMinus10dBV; hdsp->control_register |= HDSP_ADGainMinus10dBV;
break; break;
case 1: case 1:
hdsp->control_register |= HDSP_ADGainPlus4dBu; hdsp->control_register |= HDSP_ADGainPlus4dBu;
break; break;
case 2: case 2:
hdsp->control_register |= HDSP_ADGainLowGain; hdsp->control_register |= HDSP_ADGainLowGain;
break; break;
default: default:
return -1; return -1;
...@@ -2278,7 +2299,7 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode) ...@@ -2278,7 +2299,7 @@ static int hdsp_set_ad_gain(struct hdsp *hdsp, int mode)
static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"-10 dBV", "+4 dBu", "Lo Gain"}; static char *texts[] = {"-10 dBV", "+4 dBu", "Lo Gain"};
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 3; uinfo->value.enumerated.items = 3;
...@@ -2291,7 +2312,7 @@ static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e ...@@ -2291,7 +2312,7 @@ static int snd_hdsp_info_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_e
static int snd_hdsp_get_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_ad_gain(hdsp); ucontrol->value.enumerated.item[0] = hdsp_ad_gain(hdsp);
return 0; return 0;
} }
...@@ -2301,7 +2322,7 @@ static int snd_hdsp_put_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el ...@@ -2301,7 +2322,7 @@ static int snd_hdsp_put_ad_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_el
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0]; val = ucontrol->value.enumerated.item[0];
...@@ -2335,7 +2356,7 @@ static int hdsp_phone_gain(struct hdsp *hdsp) ...@@ -2335,7 +2356,7 @@ static int hdsp_phone_gain(struct hdsp *hdsp)
case HDSP_PhoneGainMinus12dB: case HDSP_PhoneGainMinus12dB:
return 2; return 2;
default: default:
return 0; return 0;
} }
} }
...@@ -2347,11 +2368,11 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode) ...@@ -2347,11 +2368,11 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode)
hdsp->control_register |= HDSP_PhoneGain0dB; hdsp->control_register |= HDSP_PhoneGain0dB;
break; break;
case 1: case 1:
hdsp->control_register |= HDSP_PhoneGainMinus6dB; hdsp->control_register |= HDSP_PhoneGainMinus6dB;
break; break;
case 2: case 2:
hdsp->control_register |= HDSP_PhoneGainMinus12dB; hdsp->control_register |= HDSP_PhoneGainMinus12dB;
break; break;
default: default:
return -1; return -1;
...@@ -2363,7 +2384,7 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode) ...@@ -2363,7 +2384,7 @@ static int hdsp_set_phone_gain(struct hdsp *hdsp, int mode)
static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"0 dB", "-6 dB", "-12 dB"}; static char *texts[] = {"0 dB", "-6 dB", "-12 dB"};
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 3; uinfo->value.enumerated.items = 3;
...@@ -2376,7 +2397,7 @@ static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ct ...@@ -2376,7 +2397,7 @@ static int snd_hdsp_info_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ct
static int snd_hdsp_get_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_phone_gain(hdsp); ucontrol->value.enumerated.item[0] = hdsp_phone_gain(hdsp);
return 0; return 0;
} }
...@@ -2386,7 +2407,7 @@ static int snd_hdsp_put_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl ...@@ -2386,7 +2407,7 @@ static int snd_hdsp_put_phone_gain(struct snd_kcontrol *kcontrol, struct snd_ctl
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0]; val = ucontrol->value.enumerated.item[0];
...@@ -2432,7 +2453,7 @@ static int hdsp_set_xlr_breakout_cable(struct hdsp *hdsp, int mode) ...@@ -2432,7 +2453,7 @@ static int hdsp_set_xlr_breakout_cable(struct hdsp *hdsp, int mode)
static int snd_hdsp_get_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_xlr_breakout_cable(hdsp); ucontrol->value.enumerated.item[0] = hdsp_xlr_breakout_cable(hdsp);
return 0; return 0;
} }
...@@ -2442,7 +2463,7 @@ static int snd_hdsp_put_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct ...@@ -2442,7 +2463,7 @@ static int snd_hdsp_put_xlr_breakout_cable(struct snd_kcontrol *kcontrol, struct
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -2488,7 +2509,7 @@ static int hdsp_set_aeb(struct hdsp *hdsp, int mode) ...@@ -2488,7 +2509,7 @@ static int hdsp_set_aeb(struct hdsp *hdsp, int mode)
static int snd_hdsp_get_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_aeb(hdsp); ucontrol->value.enumerated.item[0] = hdsp_aeb(hdsp);
return 0; return 0;
} }
...@@ -2498,7 +2519,7 @@ static int snd_hdsp_put_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v ...@@ -2498,7 +2519,7 @@ static int snd_hdsp_put_aeb(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -2576,7 +2597,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd ...@@ -2576,7 +2597,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd
{ {
static char *texts[] = {"Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3" }; static char *texts[] = {"Word", "IEC958", "ADAT1", "ADAT Sync", "ADAT2", "ADAT3" };
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
...@@ -2595,7 +2616,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd ...@@ -2595,7 +2616,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd
uinfo->value.enumerated.items = 0; uinfo->value.enumerated.items = 0;
break; break;
} }
if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
...@@ -2605,7 +2626,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd ...@@ -2605,7 +2626,7 @@ static int snd_hdsp_info_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd
static int snd_hdsp_get_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp); ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp);
return 0; return 0;
} }
...@@ -2615,7 +2636,7 @@ static int snd_hdsp_put_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_ ...@@ -2615,7 +2636,7 @@ static int snd_hdsp_put_pref_sync_ref(struct snd_kcontrol *kcontrol, struct snd_
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change, max; int change, max;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
...@@ -2664,7 +2685,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp) ...@@ -2664,7 +2685,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp)
case HDSP_SelSyncRef_SPDIF: case HDSP_SelSyncRef_SPDIF:
return HDSP_AUTOSYNC_FROM_SPDIF; return HDSP_AUTOSYNC_FROM_SPDIF;
case HDSP_SelSyncRefMask: case HDSP_SelSyncRefMask:
return HDSP_AUTOSYNC_FROM_NONE; return HDSP_AUTOSYNC_FROM_NONE;
case HDSP_SelSyncRef_ADAT1: case HDSP_SelSyncRef_ADAT1:
return HDSP_AUTOSYNC_FROM_ADAT1; return HDSP_AUTOSYNC_FROM_ADAT1;
case HDSP_SelSyncRef_ADAT2: case HDSP_SelSyncRef_ADAT2:
...@@ -2680,7 +2701,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp) ...@@ -2680,7 +2701,7 @@ static int hdsp_autosync_ref(struct hdsp *hdsp)
static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" }; static char *texts[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" };
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 7; uinfo->value.enumerated.items = 7;
...@@ -2693,7 +2714,7 @@ static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ ...@@ -2693,7 +2714,7 @@ static int snd_hdsp_info_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_
static int snd_hdsp_get_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_autosync_ref(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_autosync_ref(hdsp); ucontrol->value.enumerated.item[0] = hdsp_autosync_ref(hdsp);
return 0; return 0;
} }
...@@ -2727,7 +2748,7 @@ static int hdsp_set_line_output(struct hdsp *hdsp, int out) ...@@ -2727,7 +2748,7 @@ static int hdsp_set_line_output(struct hdsp *hdsp, int out)
static int snd_hdsp_get_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
ucontrol->value.integer.value[0] = hdsp_line_out(hdsp); ucontrol->value.integer.value[0] = hdsp_line_out(hdsp);
spin_unlock_irq(&hdsp->lock); spin_unlock_irq(&hdsp->lock);
...@@ -2739,7 +2760,7 @@ static int snd_hdsp_put_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_e ...@@ -2739,7 +2760,7 @@ static int snd_hdsp_put_line_out(struct snd_kcontrol *kcontrol, struct snd_ctl_e
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -2773,7 +2794,7 @@ static int hdsp_set_precise_pointer(struct hdsp *hdsp, int precise) ...@@ -2773,7 +2794,7 @@ static int hdsp_set_precise_pointer(struct hdsp *hdsp, int precise)
static int snd_hdsp_get_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_precise_pointer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
ucontrol->value.integer.value[0] = hdsp->precise_ptr; ucontrol->value.integer.value[0] = hdsp->precise_ptr;
spin_unlock_irq(&hdsp->lock); spin_unlock_irq(&hdsp->lock);
...@@ -2785,7 +2806,7 @@ static int snd_hdsp_put_precise_pointer(struct snd_kcontrol *kcontrol, struct sn ...@@ -2785,7 +2806,7 @@ static int snd_hdsp_put_precise_pointer(struct snd_kcontrol *kcontrol, struct sn
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -2819,7 +2840,7 @@ static int hdsp_set_use_midi_tasklet(struct hdsp *hdsp, int use_tasklet) ...@@ -2819,7 +2840,7 @@ static int hdsp_set_use_midi_tasklet(struct hdsp *hdsp, int use_tasklet)
static int snd_hdsp_get_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
ucontrol->value.integer.value[0] = hdsp->use_midi_tasklet; ucontrol->value.integer.value[0] = hdsp->use_midi_tasklet;
spin_unlock_irq(&hdsp->lock); spin_unlock_irq(&hdsp->lock);
...@@ -2831,7 +2852,7 @@ static int snd_hdsp_put_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct s ...@@ -2831,7 +2852,7 @@ static int snd_hdsp_put_use_midi_tasklet(struct snd_kcontrol *kcontrol, struct s
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
unsigned int val; unsigned int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.integer.value[0] & 1; val = ucontrol->value.integer.value[0] & 1;
...@@ -2873,12 +2894,12 @@ static int snd_hdsp_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem ...@@ -2873,12 +2894,12 @@ static int snd_hdsp_get_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
source = ucontrol->value.integer.value[0]; source = ucontrol->value.integer.value[0];
destination = ucontrol->value.integer.value[1]; destination = ucontrol->value.integer.value[1];
if (source >= hdsp->max_channels) if (source >= hdsp->max_channels)
addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination); addr = hdsp_playback_to_output_key(hdsp,source-hdsp->max_channels,destination);
else else
addr = hdsp_input_to_output_key(hdsp,source, destination); addr = hdsp_input_to_output_key(hdsp,source, destination);
spin_lock_irq(&hdsp->lock); spin_lock_irq(&hdsp->lock);
ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr); ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr);
spin_unlock_irq(&hdsp->lock); spin_unlock_irq(&hdsp->lock);
...@@ -2926,7 +2947,7 @@ static int snd_hdsp_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem ...@@ -2926,7 +2947,7 @@ static int snd_hdsp_put_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
static int snd_hdsp_info_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) static int snd_hdsp_info_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ {
static char *texts[] = {"No Lock", "Lock", "Sync" }; static char *texts[] = {"No Lock", "Lock", "Sync" };
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 3; uinfo->value.enumerated.items = 3;
...@@ -2971,7 +2992,7 @@ static int hdsp_spdif_sync_check(struct hdsp *hdsp) ...@@ -2971,7 +2992,7 @@ static int hdsp_spdif_sync_check(struct hdsp *hdsp)
int status = hdsp_read(hdsp, HDSP_statusRegister); int status = hdsp_read(hdsp, HDSP_statusRegister);
if (status & HDSP_SPDIFErrorFlag) if (status & HDSP_SPDIFErrorFlag)
return 0; return 0;
else { else {
if (status & HDSP_SPDIFSync) if (status & HDSP_SPDIFSync)
return 2; return 2;
else else
...@@ -3007,7 +3028,7 @@ static int hdsp_adatsync_sync_check(struct hdsp *hdsp) ...@@ -3007,7 +3028,7 @@ static int hdsp_adatsync_sync_check(struct hdsp *hdsp)
return 1; return 1;
} else } else
return 0; return 0;
} }
static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
...@@ -3025,17 +3046,17 @@ static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struc ...@@ -3025,17 +3046,17 @@ static int snd_hdsp_get_adatsync_sync_check(struct snd_kcontrol *kcontrol, struc
} }
static int hdsp_adat_sync_check(struct hdsp *hdsp, int idx) static int hdsp_adat_sync_check(struct hdsp *hdsp, int idx)
{ {
int status = hdsp_read(hdsp, HDSP_statusRegister); int status = hdsp_read(hdsp, HDSP_statusRegister);
if (status & (HDSP_Lock0>>idx)) { if (status & (HDSP_Lock0>>idx)) {
if (status & (HDSP_Sync0>>idx)) if (status & (HDSP_Sync0>>idx))
return 2; return 2;
else else
return 1; return 1;
} else } else
return 0; return 0;
} }
static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
...@@ -3053,7 +3074,7 @@ static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct sn ...@@ -3053,7 +3074,7 @@ static int snd_hdsp_get_adat_sync_check(struct snd_kcontrol *kcontrol, struct sn
break; break;
case Multiface: case Multiface:
case H9632: case H9632:
if (offset >= 1) if (offset >= 1)
return -EINVAL; return -EINVAL;
break; break;
default: default:
...@@ -3115,7 +3136,7 @@ static int snd_hdsp_info_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ct ...@@ -3115,7 +3136,7 @@ static int snd_hdsp_info_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ct
static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ {
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
ucontrol->value.enumerated.item[0] = hdsp_dds_offset(hdsp); ucontrol->value.enumerated.item[0] = hdsp_dds_offset(hdsp);
return 0; return 0;
} }
...@@ -3125,7 +3146,7 @@ static int snd_hdsp_put_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl ...@@ -3125,7 +3146,7 @@ static int snd_hdsp_put_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl
struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); struct hdsp *hdsp = snd_kcontrol_chip(kcontrol);
int change; int change;
int val; int val;
if (!snd_hdsp_use_is_exclusive(hdsp)) if (!snd_hdsp_use_is_exclusive(hdsp))
return -EBUSY; return -EBUSY;
val = ucontrol->value.enumerated.item[0]; val = ucontrol->value.enumerated.item[0];
...@@ -3170,7 +3191,7 @@ static struct snd_kcontrol_new snd_hdsp_controls[] = { ...@@ -3170,7 +3191,7 @@ static struct snd_kcontrol_new snd_hdsp_controls[] = {
.get = snd_hdsp_control_spdif_mask_get, .get = snd_hdsp_control_spdif_mask_get,
.private_value = IEC958_AES0_NONAUDIO | .private_value = IEC958_AES0_NONAUDIO |
IEC958_AES0_PROFESSIONAL | IEC958_AES0_PROFESSIONAL |
IEC958_AES0_CON_EMPHASIS, IEC958_AES0_CON_EMPHASIS,
}, },
{ {
.access = SNDRV_CTL_ELEM_ACCESS_READ, .access = SNDRV_CTL_ELEM_ACCESS_READ,
...@@ -3188,7 +3209,7 @@ HDSP_SPDIF_OUT("IEC958 Output also on ADAT1", 0), ...@@ -3188,7 +3209,7 @@ HDSP_SPDIF_OUT("IEC958 Output also on ADAT1", 0),
HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0), HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0),
HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0), HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0),
HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0), HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0),
/* 'Sample Clock Source' complies with the alsa control naming scheme */ /* 'Sample Clock Source' complies with the alsa control naming scheme */
HDSP_CLOCK_SOURCE("Sample Clock Source", 0), HDSP_CLOCK_SOURCE("Sample Clock Source", 0),
{ {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
...@@ -3240,7 +3261,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp) ...@@ -3240,7 +3261,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp)
return err; return err;
} }
} }
/* DA, AD and Phone gain and XLR breakout cable controls for H9632 cards */ /* DA, AD and Phone gain and XLR breakout cable controls for H9632 cards */
if (hdsp->io_type == H9632) { if (hdsp->io_type == H9632) {
for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_9632_controls); idx++) { for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_9632_controls); idx++) {
...@@ -3259,7 +3280,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp) ...@@ -3259,7 +3280,7 @@ static int snd_hdsp_create_controls(struct snd_card *card, struct hdsp *hdsp)
} }
/*------------------------------------------------------------ /*------------------------------------------------------------
/proc interface /proc interface
------------------------------------------------------------*/ ------------------------------------------------------------*/
static void static void
...@@ -3298,7 +3319,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3298,7 +3319,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
} }
} }
} }
status = hdsp_read(hdsp, HDSP_statusRegister); status = hdsp_read(hdsp, HDSP_statusRegister);
status2 = hdsp_read(hdsp, HDSP_status2Register); status2 = hdsp_read(hdsp, HDSP_status2Register);
...@@ -3362,17 +3383,17 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3362,17 +3383,17 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
break; break;
case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ: case HDSP_CLOCK_SOURCE_INTERNAL_192KHZ:
clock_source = "Internal 192 kHz"; clock_source = "Internal 192 kHz";
break; break;
default: default:
clock_source = "Error"; clock_source = "Error";
} }
snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source); snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source);
if (hdsp_system_clock_mode(hdsp)) if (hdsp_system_clock_mode(hdsp))
system_clock_mode = "Slave"; system_clock_mode = "Slave";
else else
system_clock_mode = "Master"; system_clock_mode = "Master";
switch (hdsp_pref_sync_ref (hdsp)) { switch (hdsp_pref_sync_ref (hdsp)) {
case HDSP_SYNC_FROM_WORD: case HDSP_SYNC_FROM_WORD:
pref_sync_ref = "Word Clock"; pref_sync_ref = "Word Clock";
...@@ -3397,7 +3418,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3397,7 +3418,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
break; break;
} }
snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref); snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref);
switch (hdsp_autosync_ref (hdsp)) { switch (hdsp_autosync_ref (hdsp)) {
case HDSP_AUTOSYNC_FROM_WORD: case HDSP_AUTOSYNC_FROM_WORD:
autosync_ref = "Word Clock"; autosync_ref = "Word Clock";
...@@ -3410,7 +3431,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3410,7 +3431,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
break; break;
case HDSP_AUTOSYNC_FROM_NONE: case HDSP_AUTOSYNC_FROM_NONE:
autosync_ref = "None"; autosync_ref = "None";
break; break;
case HDSP_AUTOSYNC_FROM_ADAT1: case HDSP_AUTOSYNC_FROM_ADAT1:
autosync_ref = "ADAT1"; autosync_ref = "ADAT1";
break; break;
...@@ -3425,14 +3446,14 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3425,14 +3446,14 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
break; break;
} }
snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref); snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref);
snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp)); snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp));
snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode); snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode);
snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate); snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate);
snd_iprintf (buffer, "System Clock Locked: %s\n", hdsp->clock_source_locked ? "Yes" : "No"); snd_iprintf (buffer, "System Clock Locked: %s\n", hdsp->clock_source_locked ? "Yes" : "No");
snd_iprintf(buffer, "\n"); snd_iprintf(buffer, "\n");
switch (hdsp_spdif_in(hdsp)) { switch (hdsp_spdif_in(hdsp)) {
...@@ -3452,7 +3473,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3452,7 +3473,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
snd_iprintf(buffer, "IEC958 input: ???\n"); snd_iprintf(buffer, "IEC958 input: ???\n");
break; break;
} }
if (hdsp->control_register & HDSP_SPDIFOpticalOut) if (hdsp->control_register & HDSP_SPDIFOpticalOut)
snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n"); snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n");
else else
...@@ -3510,13 +3531,13 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3510,13 +3531,13 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
snd_iprintf (buffer, "SPDIF: No Lock\n"); snd_iprintf (buffer, "SPDIF: No Lock\n");
else else
snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock"); snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock");
x = status2 & HDSP_wc_sync; x = status2 & HDSP_wc_sync;
if (status2 & HDSP_wc_lock) if (status2 & HDSP_wc_lock)
snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock"); snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock");
else else
snd_iprintf (buffer, "Word Clock: No Lock\n"); snd_iprintf (buffer, "Word Clock: No Lock\n");
x = status & HDSP_TimecodeSync; x = status & HDSP_TimecodeSync;
if (status & HDSP_TimecodeLock) if (status & HDSP_TimecodeLock)
snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock"); snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock");
...@@ -3524,11 +3545,11 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3524,11 +3545,11 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
snd_iprintf(buffer, "ADAT Sync: No Lock\n"); snd_iprintf(buffer, "ADAT Sync: No Lock\n");
snd_iprintf(buffer, "\n"); snd_iprintf(buffer, "\n");
/* Informations about H9632 specific controls */ /* Informations about H9632 specific controls */
if (hdsp->io_type == H9632) { if (hdsp->io_type == H9632) {
char *tmp; char *tmp;
switch (hdsp_ad_gain(hdsp)) { switch (hdsp_ad_gain(hdsp)) {
case 0: case 0:
tmp = "-10 dBV"; tmp = "-10 dBV";
...@@ -3554,7 +3575,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3554,7 +3575,7 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
break; break;
} }
snd_iprintf(buffer, "DA Gain : %s\n", tmp); snd_iprintf(buffer, "DA Gain : %s\n", tmp);
switch (hdsp_phone_gain(hdsp)) { switch (hdsp_phone_gain(hdsp)) {
case 0: case 0:
tmp = "0 dB"; tmp = "0 dB";
...@@ -3568,8 +3589,8 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) ...@@ -3568,8 +3589,8 @@ snd_hdsp_proc_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
} }
snd_iprintf(buffer, "Phones Gain : %s\n", tmp); snd_iprintf(buffer, "Phones Gain : %s\n", tmp);
snd_iprintf(buffer, "XLR Breakout Cable : %s\n", hdsp_xlr_breakout_cable(hdsp) ? "yes" : "no"); snd_iprintf(buffer, "XLR Breakout Cable : %s\n", hdsp_xlr_breakout_cable(hdsp) ? "yes" : "no");
if (hdsp->control_register & HDSP_AnalogExtensionBoard) if (hdsp->control_register & HDSP_AnalogExtensionBoard)
snd_iprintf(buffer, "AEB : on (ADAT1 internal)\n"); snd_iprintf(buffer, "AEB : on (ADAT1 internal)\n");
else else
...@@ -3632,18 +3653,18 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) ...@@ -3632,18 +3653,18 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp)
/* set defaults: /* set defaults:
SPDIF Input via Coax SPDIF Input via Coax
Master clock mode Master clock mode
maximum latency (7 => 2^7 = 8192 samples, 64Kbyte buffer, maximum latency (7 => 2^7 = 8192 samples, 64Kbyte buffer,
which implies 2 4096 sample, 32Kbyte periods). which implies 2 4096 sample, 32Kbyte periods).
Enable line out. Enable line out.
*/ */
hdsp->control_register = HDSP_ClockModeMaster | hdsp->control_register = HDSP_ClockModeMaster |
HDSP_SPDIFInputCoaxial | HDSP_SPDIFInputCoaxial |
hdsp_encode_latency(7) | hdsp_encode_latency(7) |
HDSP_LineOut; HDSP_LineOut;
hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
...@@ -3661,7 +3682,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) ...@@ -3661,7 +3682,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp)
hdsp_compute_period_size(hdsp); hdsp_compute_period_size(hdsp);
/* silence everything */ /* silence everything */
for (i = 0; i < HDSP_MATRIX_MIXER_SIZE; ++i) for (i = 0; i < HDSP_MATRIX_MIXER_SIZE; ++i)
hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN; hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN;
...@@ -3669,7 +3690,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) ...@@ -3669,7 +3690,7 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp)
if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN)) if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN))
return -EIO; return -EIO;
} }
/* H9632 specific defaults */ /* H9632 specific defaults */
if (hdsp->io_type == H9632) { if (hdsp->io_type == H9632) {
hdsp->control_register |= (HDSP_DAGainPlus4dBu | HDSP_ADGainPlus4dBu | HDSP_PhoneGain0dB); hdsp->control_register |= (HDSP_DAGainPlus4dBu | HDSP_ADGainPlus4dBu | HDSP_PhoneGain0dB);
...@@ -3687,12 +3708,12 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp) ...@@ -3687,12 +3708,12 @@ static int snd_hdsp_set_defaults(struct hdsp *hdsp)
static void hdsp_midi_tasklet(unsigned long arg) static void hdsp_midi_tasklet(unsigned long arg)
{ {
struct hdsp *hdsp = (struct hdsp *)arg; struct hdsp *hdsp = (struct hdsp *)arg;
if (hdsp->midi[0].pending) if (hdsp->midi[0].pending)
snd_hdsp_midi_input_read (&hdsp->midi[0]); snd_hdsp_midi_input_read (&hdsp->midi[0]);
if (hdsp->midi[1].pending) if (hdsp->midi[1].pending)
snd_hdsp_midi_input_read (&hdsp->midi[1]); snd_hdsp_midi_input_read (&hdsp->midi[1]);
} }
static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id)
{ {
...@@ -3704,7 +3725,7 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) ...@@ -3704,7 +3725,7 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id)
unsigned int midi0status; unsigned int midi0status;
unsigned int midi1status; unsigned int midi1status;
int schedule = 0; int schedule = 0;
status = hdsp_read(hdsp, HDSP_statusRegister); status = hdsp_read(hdsp, HDSP_statusRegister);
audio = status & HDSP_audioIRQPending; audio = status & HDSP_audioIRQPending;
...@@ -3718,15 +3739,18 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id) ...@@ -3718,15 +3739,18 @@ static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id)
midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff; midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff;
midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff; midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff;
if (!(hdsp->state & HDSP_InitializationComplete))
return IRQ_HANDLED;
if (audio) { if (audio) {
if (hdsp->capture_substream) if (hdsp->capture_substream)
snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
if (hdsp->playback_substream) if (hdsp->playback_substream)
snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream);
} }
if (midi0 && midi0status) { if (midi0 && midi0status) {
if (hdsp->use_midi_tasklet) { if (hdsp->use_midi_tasklet) {
/* we disable interrupts for this input until processing is done */ /* we disable interrupts for this input until processing is done */
...@@ -3769,10 +3793,10 @@ static char *hdsp_channel_buffer_location(struct hdsp *hdsp, ...@@ -3769,10 +3793,10 @@ static char *hdsp_channel_buffer_location(struct hdsp *hdsp,
if (snd_BUG_ON(channel < 0 || channel >= hdsp->max_channels)) if (snd_BUG_ON(channel < 0 || channel >= hdsp->max_channels))
return NULL; return NULL;
if ((mapped_channel = hdsp->channel_map[channel]) < 0) if ((mapped_channel = hdsp->channel_map[channel]) < 0)
return NULL; return NULL;
if (stream == SNDRV_PCM_STREAM_CAPTURE) if (stream == SNDRV_PCM_STREAM_CAPTURE)
return hdsp->capture_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES); return hdsp->capture_buffer + (mapped_channel * HDSP_CHANNEL_BUFFER_BYTES);
else else
...@@ -3965,7 +3989,7 @@ static int snd_hdsp_trigger(struct snd_pcm_substream *substream, int cmd) ...@@ -3965,7 +3989,7 @@ static int snd_hdsp_trigger(struct snd_pcm_substream *substream, int cmd)
struct hdsp *hdsp = snd_pcm_substream_chip(substream); struct hdsp *hdsp = snd_pcm_substream_chip(substream);
struct snd_pcm_substream *other; struct snd_pcm_substream *other;
int running; int running;
if (hdsp_check_for_iobox (hdsp)) if (hdsp_check_for_iobox (hdsp))
return -EIO; return -EIO;
...@@ -4059,10 +4083,10 @@ static struct snd_pcm_hardware snd_hdsp_playback_subinfo = ...@@ -4059,10 +4083,10 @@ static struct snd_pcm_hardware snd_hdsp_playback_subinfo =
.formats = SNDRV_PCM_FMTBIT_S32_LE, .formats = SNDRV_PCM_FMTBIT_S32_LE,
#endif #endif
.rates = (SNDRV_PCM_RATE_32000 | .rates = (SNDRV_PCM_RATE_32000 |
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_44100 |
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_48000 |
SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_64000 |
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_88200 |
SNDRV_PCM_RATE_96000), SNDRV_PCM_RATE_96000),
.rate_min = 32000, .rate_min = 32000,
.rate_max = 96000, .rate_max = 96000,
...@@ -4088,10 +4112,10 @@ static struct snd_pcm_hardware snd_hdsp_capture_subinfo = ...@@ -4088,10 +4112,10 @@ static struct snd_pcm_hardware snd_hdsp_capture_subinfo =
.formats = SNDRV_PCM_FMTBIT_S32_LE, .formats = SNDRV_PCM_FMTBIT_S32_LE,
#endif #endif
.rates = (SNDRV_PCM_RATE_32000 | .rates = (SNDRV_PCM_RATE_32000 |
SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_44100 |
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_48000 |
SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_64000 |
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_88200 |
SNDRV_PCM_RATE_96000), SNDRV_PCM_RATE_96000),
.rate_min = 32000, .rate_min = 32000,
.rate_max = 96000, .rate_max = 96000,
...@@ -4170,7 +4194,7 @@ static int snd_hdsp_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params, ...@@ -4170,7 +4194,7 @@ static int snd_hdsp_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
.max = hdsp->qs_in_channels, .max = hdsp->qs_in_channels,
.integer = 1, .integer = 1,
}; };
return snd_interval_refine(c, &t); return snd_interval_refine(c, &t);
} else if (r->min > 48000 && r->max <= 96000) { } else if (r->min > 48000 && r->max <= 96000) {
struct snd_interval t = { struct snd_interval t = {
.min = hdsp->ds_in_channels, .min = hdsp->ds_in_channels,
...@@ -4201,7 +4225,7 @@ static int snd_hdsp_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params, ...@@ -4201,7 +4225,7 @@ static int snd_hdsp_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
.max = hdsp->qs_out_channels, .max = hdsp->qs_out_channels,
.integer = 1, .integer = 1,
}; };
return snd_interval_refine(c, &t); return snd_interval_refine(c, &t);
} else if (r->min > 48000 && r->max <= 96000) { } else if (r->min > 48000 && r->max <= 96000) {
struct snd_interval t = { struct snd_interval t = {
.min = hdsp->ds_out_channels, .min = hdsp->ds_out_channels,
...@@ -4318,8 +4342,8 @@ static int snd_hdsp_playback_open(struct snd_pcm_substream *substream) ...@@ -4318,8 +4342,8 @@ static int snd_hdsp_playback_open(struct snd_pcm_substream *substream)
if (hdsp->io_type == H9632) { if (hdsp->io_type == H9632) {
runtime->hw.channels_min = hdsp->qs_out_channels; runtime->hw.channels_min = hdsp->qs_out_channels;
runtime->hw.channels_max = hdsp->ss_out_channels; runtime->hw.channels_max = hdsp->ss_out_channels;
} }
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
snd_hdsp_hw_rule_out_channels, hdsp, snd_hdsp_hw_rule_out_channels, hdsp,
SNDRV_PCM_HW_PARAM_CHANNELS, -1); SNDRV_PCM_HW_PARAM_CHANNELS, -1);
...@@ -4529,7 +4553,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm ...@@ -4529,7 +4553,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm
hdsp->iobase + HDSP_playbackRmsLevel + i * 8 + 4, hdsp->iobase + HDSP_playbackRmsLevel + i * 8 + 4,
hdsp->iobase + HDSP_playbackRmsLevel + i * 8)) hdsp->iobase + HDSP_playbackRmsLevel + i * 8))
return -EFAULT; return -EFAULT;
if (copy_u64_le(&peak_rms->input_rms[i], if (copy_u64_le(&peak_rms->input_rms[i],
hdsp->iobase + HDSP_inputRmsLevel + i * 8 + 4, hdsp->iobase + HDSP_inputRmsLevel + i * 8 + 4,
hdsp->iobase + HDSP_inputRmsLevel + i * 8)) hdsp->iobase + HDSP_inputRmsLevel + i * 8))
return -EFAULT; return -EFAULT;
...@@ -4539,7 +4563,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm ...@@ -4539,7 +4563,7 @@ static int hdsp_get_peak(struct hdsp *hdsp, struct hdsp_peak_rms __user *peak_rm
static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg) static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg)
{ {
struct hdsp *hdsp = (struct hdsp *)hw->private_data; struct hdsp *hdsp = (struct hdsp *)hw->private_data;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
int err; int err;
...@@ -4573,7 +4597,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4573,7 +4597,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
struct hdsp_config_info info; struct hdsp_config_info info;
unsigned long flags; unsigned long flags;
int i; int i;
err = hdsp_check_for_iobox(hdsp); err = hdsp_check_for_iobox(hdsp);
if (err < 0) if (err < 0)
return err; return err;
...@@ -4607,7 +4631,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4607,7 +4631,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp); info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp);
info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp); info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp);
info.xlr_breakout_cable = (unsigned char)hdsp_xlr_breakout_cable(hdsp); info.xlr_breakout_cable = (unsigned char)hdsp_xlr_breakout_cable(hdsp);
} }
if (hdsp->io_type == H9632 || hdsp->io_type == H9652) if (hdsp->io_type == H9632 || hdsp->io_type == H9652)
info.analog_extension_board = (unsigned char)hdsp_aeb(hdsp); info.analog_extension_board = (unsigned char)hdsp_aeb(hdsp);
...@@ -4618,7 +4642,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4618,7 +4642,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
} }
case SNDRV_HDSP_IOCTL_GET_9632_AEB: { case SNDRV_HDSP_IOCTL_GET_9632_AEB: {
struct hdsp_9632_aeb h9632_aeb; struct hdsp_9632_aeb h9632_aeb;
if (hdsp->io_type != H9632) return -EINVAL; if (hdsp->io_type != H9632) return -EINVAL;
h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS; h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS;
h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS; h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS;
...@@ -4629,7 +4653,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4629,7 +4653,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
case SNDRV_HDSP_IOCTL_GET_VERSION: { case SNDRV_HDSP_IOCTL_GET_VERSION: {
struct hdsp_version hdsp_version; struct hdsp_version hdsp_version;
int err; int err;
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
if (hdsp->io_type == Undefined) { if (hdsp->io_type == Undefined) {
if ((err = hdsp_get_iobox_version(hdsp)) < 0) if ((err = hdsp_get_iobox_version(hdsp)) < 0)
...@@ -4645,7 +4669,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4645,7 +4669,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
struct hdsp_firmware __user *firmware; struct hdsp_firmware __user *firmware;
u32 __user *firmware_data; u32 __user *firmware_data;
int err; int err;
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL; if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
/* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */ /* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */
if (hdsp->io_type == Undefined) return -EINVAL; if (hdsp->io_type == Undefined) return -EINVAL;
...@@ -4658,25 +4682,25 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne ...@@ -4658,25 +4682,25 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
if (get_user(firmware_data, &firmware->firmware_data)) if (get_user(firmware_data, &firmware->firmware_data))
return -EFAULT; return -EFAULT;
if (hdsp_check_for_iobox (hdsp)) if (hdsp_check_for_iobox (hdsp))
return -EIO; return -EIO;
if (copy_from_user(hdsp->firmware_cache, firmware_data, sizeof(hdsp->firmware_cache)) != 0) if (copy_from_user(hdsp->firmware_cache, firmware_data, sizeof(hdsp->firmware_cache)) != 0)
return -EFAULT; return -EFAULT;
hdsp->state |= HDSP_FirmwareCached; hdsp->state |= HDSP_FirmwareCached;
if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0)
return err; return err;
if (!(hdsp->state & HDSP_InitializationComplete)) { if (!(hdsp->state & HDSP_InitializationComplete)) {
if ((err = snd_hdsp_enable_io(hdsp)) < 0) if ((err = snd_hdsp_enable_io(hdsp)) < 0)
return err; return err;
snd_hdsp_initialize_channels(hdsp); snd_hdsp_initialize_channels(hdsp);
snd_hdsp_initialize_midi_flush(hdsp); snd_hdsp_initialize_midi_flush(hdsp);
if ((err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp)) < 0) { if ((err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp)) < 0) {
snd_printk(KERN_ERR "Hammerfall-DSP: error creating alsa devices\n"); snd_printk(KERN_ERR "Hammerfall-DSP: error creating alsa devices\n");
return err; return err;
...@@ -4723,16 +4747,16 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp) ...@@ -4723,16 +4747,16 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp)
{ {
struct snd_hwdep *hw; struct snd_hwdep *hw;
int err; int err;
if ((err = snd_hwdep_new(card, "HDSP hwdep", 0, &hw)) < 0) if ((err = snd_hwdep_new(card, "HDSP hwdep", 0, &hw)) < 0)
return err; return err;
hdsp->hwdep = hw; hdsp->hwdep = hw;
hw->private_data = hdsp; hw->private_data = hdsp;
strcpy(hw->name, "HDSP hwdep interface"); strcpy(hw->name, "HDSP hwdep interface");
hw->ops.ioctl = snd_hdsp_hwdep_ioctl; hw->ops.ioctl = snd_hdsp_hwdep_ioctl;
return 0; return 0;
} }
...@@ -4765,24 +4789,24 @@ static void snd_hdsp_9652_enable_mixer (struct hdsp *hdsp) ...@@ -4765,24 +4789,24 @@ static void snd_hdsp_9652_enable_mixer (struct hdsp *hdsp)
static int snd_hdsp_enable_io (struct hdsp *hdsp) static int snd_hdsp_enable_io (struct hdsp *hdsp)
{ {
int i; int i;
if (hdsp_fifo_wait (hdsp, 0, 100)) { if (hdsp_fifo_wait (hdsp, 0, 100)) {
snd_printk(KERN_ERR "Hammerfall-DSP: enable_io fifo_wait failed\n"); snd_printk(KERN_ERR "Hammerfall-DSP: enable_io fifo_wait failed\n");
return -EIO; return -EIO;
} }
for (i = 0; i < hdsp->max_channels; ++i) { for (i = 0; i < hdsp->max_channels; ++i) {
hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1); hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1);
hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1); hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1);
} }
return 0; return 0;
} }
static void snd_hdsp_initialize_channels(struct hdsp *hdsp) static void snd_hdsp_initialize_channels(struct hdsp *hdsp)
{ {
int status, aebi_channels, aebo_channels; int status, aebi_channels, aebo_channels;
switch (hdsp->io_type) { switch (hdsp->io_type) {
case Digiface: case Digiface:
hdsp->card_name = "RME Hammerfall DSP + Digiface"; hdsp->card_name = "RME Hammerfall DSP + Digiface";
...@@ -4795,7 +4819,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp) ...@@ -4795,7 +4819,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp)
hdsp->ss_in_channels = hdsp->ss_out_channels = H9652_SS_CHANNELS; hdsp->ss_in_channels = hdsp->ss_out_channels = H9652_SS_CHANNELS;
hdsp->ds_in_channels = hdsp->ds_out_channels = H9652_DS_CHANNELS; hdsp->ds_in_channels = hdsp->ds_out_channels = H9652_DS_CHANNELS;
break; break;
case H9632: case H9632:
status = hdsp_read(hdsp, HDSP_statusRegister); status = hdsp_read(hdsp, HDSP_statusRegister);
/* HDSP_AEBx bits are low when AEB are connected */ /* HDSP_AEBx bits are low when AEB are connected */
...@@ -4815,7 +4839,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp) ...@@ -4815,7 +4839,7 @@ static void snd_hdsp_initialize_channels(struct hdsp *hdsp)
hdsp->ss_in_channels = hdsp->ss_out_channels = MULTIFACE_SS_CHANNELS; hdsp->ss_in_channels = hdsp->ss_out_channels = MULTIFACE_SS_CHANNELS;
hdsp->ds_in_channels = hdsp->ds_out_channels = MULTIFACE_DS_CHANNELS; hdsp->ds_in_channels = hdsp->ds_out_channels = MULTIFACE_DS_CHANNELS;
break; break;
default: default:
/* should never get here */ /* should never get here */
break; break;
...@@ -4831,12 +4855,12 @@ static void snd_hdsp_initialize_midi_flush (struct hdsp *hdsp) ...@@ -4831,12 +4855,12 @@ static void snd_hdsp_initialize_midi_flush (struct hdsp *hdsp)
static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp) static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp)
{ {
int err; int err;
if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) { if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) {
snd_printk(KERN_ERR "Hammerfall-DSP: Error creating pcm interface\n"); snd_printk(KERN_ERR "Hammerfall-DSP: Error creating pcm interface\n");
return err; return err;
} }
if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) { if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) {
snd_printk(KERN_ERR "Hammerfall-DSP: Error creating first midi interface\n"); snd_printk(KERN_ERR "Hammerfall-DSP: Error creating first midi interface\n");
...@@ -4867,19 +4891,19 @@ static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp ...@@ -4867,19 +4891,19 @@ static int snd_hdsp_create_alsa_devices(struct snd_card *card, struct hdsp *hdsp
snd_printk(KERN_ERR "Hammerfall-DSP: Error setting default values\n"); snd_printk(KERN_ERR "Hammerfall-DSP: Error setting default values\n");
return err; return err;
} }
if (!(hdsp->state & HDSP_InitializationComplete)) { if (!(hdsp->state & HDSP_InitializationComplete)) {
strcpy(card->shortname, "Hammerfall DSP"); strcpy(card->shortname, "Hammerfall DSP");
sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name,
hdsp->port, hdsp->irq); hdsp->port, hdsp->irq);
if ((err = snd_card_register(card)) < 0) { if ((err = snd_card_register(card)) < 0) {
snd_printk(KERN_ERR "Hammerfall-DSP: error registering card\n"); snd_printk(KERN_ERR "Hammerfall-DSP: error registering card\n");
return err; return err;
} }
hdsp->state |= HDSP_InitializationComplete; hdsp->state |= HDSP_InitializationComplete;
} }
return 0; return 0;
} }
...@@ -4890,7 +4914,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) ...@@ -4890,7 +4914,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp)
const char *fwfile; const char *fwfile;
const struct firmware *fw; const struct firmware *fw;
int err; int err;
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
return 0; return 0;
if (hdsp->io_type == Undefined) { if (hdsp->io_type == Undefined) {
...@@ -4899,7 +4923,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) ...@@ -4899,7 +4923,7 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp)
if (hdsp->io_type == H9652 || hdsp->io_type == H9632) if (hdsp->io_type == H9652 || hdsp->io_type == H9632)
return 0; return 0;
} }
/* caution: max length of firmware filename is 30! */ /* caution: max length of firmware filename is 30! */
switch (hdsp->io_type) { switch (hdsp->io_type) {
case Multiface: case Multiface:
...@@ -4933,12 +4957,12 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp) ...@@ -4933,12 +4957,12 @@ static int hdsp_request_fw_loader(struct hdsp *hdsp)
memcpy(hdsp->firmware_cache, fw->data, sizeof(hdsp->firmware_cache)); memcpy(hdsp->firmware_cache, fw->data, sizeof(hdsp->firmware_cache));
release_firmware(fw); release_firmware(fw);
hdsp->state |= HDSP_FirmwareCached; hdsp->state |= HDSP_FirmwareCached;
if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0)
return err; return err;
if (!(hdsp->state & HDSP_InitializationComplete)) { if (!(hdsp->state & HDSP_InitializationComplete)) {
if ((err = snd_hdsp_enable_io(hdsp)) < 0) if ((err = snd_hdsp_enable_io(hdsp)) < 0)
return err; return err;
...@@ -4985,14 +5009,14 @@ static int __devinit snd_hdsp_create(struct snd_card *card, ...@@ -4985,14 +5009,14 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
hdsp->max_channels = 26; hdsp->max_channels = 26;
hdsp->card = card; hdsp->card = card;
spin_lock_init(&hdsp->lock); spin_lock_init(&hdsp->lock);
tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp); tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp);
pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev); pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev);
hdsp->firmware_rev &= 0xff; hdsp->firmware_rev &= 0xff;
/* From Martin Bjoernsen : /* From Martin Bjoernsen :
"It is important that the card's latency timer register in "It is important that the card's latency timer register in
the PCI configuration space is set to a value much larger the PCI configuration space is set to a value much larger
...@@ -5001,7 +5025,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card, ...@@ -5001,7 +5025,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
to its maximum 255 to avoid problems with some computers." to its maximum 255 to avoid problems with some computers."
*/ */
pci_write_config_byte(hdsp->pci, PCI_LATENCY_TIMER, 0xFF); pci_write_config_byte(hdsp->pci, PCI_LATENCY_TIMER, 0xFF);
strcpy(card->driver, "H-DSP"); strcpy(card->driver, "H-DSP");
strcpy(card->mixername, "Xilinx FPGA"); strcpy(card->mixername, "Xilinx FPGA");
...@@ -5015,7 +5039,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card, ...@@ -5015,7 +5039,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
} else { } else {
hdsp->card_name = "RME HDSP 9632"; hdsp->card_name = "RME HDSP 9632";
hdsp->max_channels = 16; hdsp->max_channels = 16;
is_9632 = 1; is_9632 = 1;
} }
if ((err = pci_enable_device(pci)) < 0) if ((err = pci_enable_device(pci)) < 0)
...@@ -5044,12 +5068,12 @@ static int __devinit snd_hdsp_create(struct snd_card *card, ...@@ -5044,12 +5068,12 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
if ((err = snd_hdsp_initialize_memory(hdsp)) < 0) if ((err = snd_hdsp_initialize_memory(hdsp)) < 0)
return err; return err;
if (!is_9652 && !is_9632) { if (!is_9652 && !is_9632) {
/* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */ /* we wait a maximum of 10 seconds to let freshly
ssleep(2); * inserted cardbus cards do their hardware init */
err = hdsp_wait_for_iobox(hdsp, 1000, 10);
err = hdsp_check_for_iobox(hdsp);
if (err < 0) if (err < 0)
return err; return err;
...@@ -5071,35 +5095,35 @@ static int __devinit snd_hdsp_create(struct snd_card *card, ...@@ -5071,35 +5095,35 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
return err; return err;
return 0; return 0;
} else { } else {
snd_printk(KERN_INFO "Hammerfall-DSP: Firmware already present, initializing card.\n"); snd_printk(KERN_INFO "Hammerfall-DSP: Firmware already present, initializing card.\n");
if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1)
hdsp->io_type = Multiface; hdsp->io_type = Multiface;
else else
hdsp->io_type = Digiface; hdsp->io_type = Digiface;
} }
} }
if ((err = snd_hdsp_enable_io(hdsp)) != 0) if ((err = snd_hdsp_enable_io(hdsp)) != 0)
return err; return err;
if (is_9652) if (is_9652)
hdsp->io_type = H9652; hdsp->io_type = H9652;
if (is_9632) if (is_9632)
hdsp->io_type = H9632; hdsp->io_type = H9632;
if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0)
return err; return err;
snd_hdsp_initialize_channels(hdsp); snd_hdsp_initialize_channels(hdsp);
snd_hdsp_initialize_midi_flush(hdsp); snd_hdsp_initialize_midi_flush(hdsp);
hdsp->state |= HDSP_FirmwareLoaded; hdsp->state |= HDSP_FirmwareLoaded;
if ((err = snd_hdsp_create_alsa_devices(card, hdsp)) < 0) if ((err = snd_hdsp_create_alsa_devices(card, hdsp)) < 0)
return err; return err;
return 0; return 0;
} }
static int snd_hdsp_free(struct hdsp *hdsp) static int snd_hdsp_free(struct hdsp *hdsp)
...@@ -5115,13 +5139,13 @@ static int snd_hdsp_free(struct hdsp *hdsp) ...@@ -5115,13 +5139,13 @@ static int snd_hdsp_free(struct hdsp *hdsp)
free_irq(hdsp->irq, (void *)hdsp); free_irq(hdsp->irq, (void *)hdsp);
snd_hdsp_free_buffers(hdsp); snd_hdsp_free_buffers(hdsp);
if (hdsp->iobase) if (hdsp->iobase)
iounmap(hdsp->iobase); iounmap(hdsp->iobase);
if (hdsp->port) if (hdsp->port)
pci_release_regions(hdsp->pci); pci_release_regions(hdsp->pci);
pci_disable_device(hdsp->pci); pci_disable_device(hdsp->pci);
return 0; return 0;
} }
...@@ -5166,7 +5190,7 @@ static int __devinit snd_hdsp_probe(struct pci_dev *pci, ...@@ -5166,7 +5190,7 @@ static int __devinit snd_hdsp_probe(struct pci_dev *pci,
} }
strcpy(card->shortname, "Hammerfall DSP"); strcpy(card->shortname, "Hammerfall DSP");
sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name,
hdsp->port, hdsp->irq); hdsp->port, hdsp->irq);
if ((err = snd_card_register(card)) < 0) { if ((err = snd_card_register(card)) < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment