Commit ef5fa1a4 authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] hdspm - Coding style fixes

Fix codes to follow more to the standard kernel coding style.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent d01ce99f
#ifndef __SOUND_HDSPM_H /* -*- linux-c -*- */ #ifndef __SOUND_HDSPM_H
#define __SOUND_HDSPM_H #define __SOUND_HDSPM_H
/* /*
* Copyright (C) 2003 Winfried Ritsch (IEM) * Copyright (C) 2003 Winfried Ritsch (IEM)
...@@ -61,7 +61,8 @@ struct hdspm_peak_rms_ioctl { ...@@ -61,7 +61,8 @@ struct hdspm_peak_rms_ioctl {
}; };
/* use indirect access due to the limit of ioctl bit size */ /* use indirect access due to the limit of ioctl bit size */
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, struct hdspm_peak_rms_ioctl) #define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
_IOR('H', 0x40, struct hdspm_peak_rms_ioctl)
/* ------------ CONFIG block IOCTL ---------------------- */ /* ------------ CONFIG block IOCTL ---------------------- */
...@@ -79,7 +80,8 @@ struct hdspm_config_info { ...@@ -79,7 +80,8 @@ struct hdspm_config_info {
unsigned int analog_out; unsigned int analog_out;
}; };
#define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, struct hdspm_config_info) #define SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO \
_IOR('H', 0x41, struct hdspm_config_info)
/* get Soundcard Version */ /* get Soundcard Version */
...@@ -93,10 +95,14 @@ struct hdspm_version { ...@@ -93,10 +95,14 @@ struct hdspm_version {
/* ------------- get Matrix Mixer IOCTL --------------- */ /* ------------- get Matrix Mixer IOCTL --------------- */
/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte = 32768 Bytes */ /* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
* 32768 Bytes
*/
/* organisation is 64 channelfader in a continous memory block */ /* organisation is 64 channelfader in a continous memory block */
/* equivalent to hardware definition, maybe for future feature of mmap of them */ /* equivalent to hardware definition, maybe for future feature of mmap of
* them
*/
/* each of 64 outputs has 64 infader and 64 outfader: /* each of 64 outputs has 64 infader and 64 outfader:
Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */ Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
......
/* -*- linux-c -*- /*
*
* ALSA driver for RME Hammerfall DSP MADI audio interface(s) * ALSA driver for RME Hammerfall DSP MADI audio interface(s)
* *
* Copyright (c) 2003 Winfried Ritsch (IEM) * Copyright (c) 2003 Winfried Ritsch (IEM)
...@@ -78,7 +77,8 @@ MODULE_PARM_DESC(enable_monitor, ...@@ -78,7 +77,8 @@ MODULE_PARM_DESC(enable_monitor,
"Enable Analog Out on Channel 63/64 by default."); "Enable Analog Out on Channel 63/64 by default.");
MODULE_AUTHOR MODULE_AUTHOR
("Winfried Ritsch <ritsch_AT_iem.at>, Paul Davis <paul@linuxaudiosystems.com>, " ("Winfried Ritsch <ritsch_AT_iem.at>, "
"Paul Davis <paul@linuxaudiosystems.com>, "
"Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, " "Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, "
"Remy Bruno <remy.bruno@trinnov.com>"); "Remy Bruno <remy.bruno@trinnov.com>");
MODULE_DESCRIPTION("RME HDSPM"); MODULE_DESCRIPTION("RME HDSPM");
...@@ -161,7 +161,9 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -161,7 +161,9 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
0=off, 1=on */ /* MADI ONLY */ 0=off, 1=on */ /* MADI ONLY */
#define HDSPM_Dolby (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */ #define HDSPM_Dolby (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */
#define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax */ /* MADI ONLY*/ #define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
* -- MADI ONLY
*/
#define HDSPM_InputSelect1 (1<<15) /* should be 0 */ #define HDSPM_InputSelect1 (1<<15) /* should be 0 */
#define HDSPM_SyncRef0 (1<<16) /* 0=WOrd, 1=MADI */ #define HDSPM_SyncRef0 (1<<16) /* 0=WOrd, 1=MADI */
...@@ -189,11 +191,13 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -189,11 +191,13 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
/* --- bit helper defines */ /* --- bit helper defines */
#define HDSPM_LatencyMask (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2) #define HDSPM_LatencyMask (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
#define HDSPM_FrequencyMask (HDSPM_Frequency0|HDSPM_Frequency1|HDSPM_DoubleSpeed|HDSPM_QuadSpeed) #define HDSPM_FrequencyMask (HDSPM_Frequency0|HDSPM_Frequency1|\
HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
#define HDSPM_InputMask (HDSPM_InputSelect0|HDSPM_InputSelect1) #define HDSPM_InputMask (HDSPM_InputSelect0|HDSPM_InputSelect1)
#define HDSPM_InputOptical 0 #define HDSPM_InputOptical 0
#define HDSPM_InputCoaxial (HDSPM_InputSelect0) #define HDSPM_InputCoaxial (HDSPM_InputSelect0)
#define HDSPM_SyncRefMask (HDSPM_SyncRef0|HDSPM_SyncRef1|HDSPM_SyncRef2|HDSPM_SyncRef3) #define HDSPM_SyncRefMask (HDSPM_SyncRef0|HDSPM_SyncRef1|\
HDSPM_SyncRef2|HDSPM_SyncRef3)
#define HDSPM_SyncRef_Word 0 #define HDSPM_SyncRef_Word 0
#define HDSPM_SyncRef_MADI (HDSPM_SyncRef0) #define HDSPM_SyncRef_MADI (HDSPM_SyncRef0)
...@@ -205,10 +209,12 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -205,10 +209,12 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
#define HDSPM_Frequency48KHz (HDSPM_Frequency1|HDSPM_Frequency0) #define HDSPM_Frequency48KHz (HDSPM_Frequency1|HDSPM_Frequency0)
#define HDSPM_Frequency64KHz (HDSPM_DoubleSpeed|HDSPM_Frequency0) #define HDSPM_Frequency64KHz (HDSPM_DoubleSpeed|HDSPM_Frequency0)
#define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1) #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
#define HDSPM_Frequency96KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1|HDSPM_Frequency0) #define HDSPM_Frequency96KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
HDSPM_Frequency0)
#define HDSPM_Frequency128KHz (HDSPM_QuadSpeed|HDSPM_Frequency0) #define HDSPM_Frequency128KHz (HDSPM_QuadSpeed|HDSPM_Frequency0)
#define HDSPM_Frequency176_4KHz (HDSPM_QuadSpeed|HDSPM_Frequency1) #define HDSPM_Frequency176_4KHz (HDSPM_QuadSpeed|HDSPM_Frequency1)
#define HDSPM_Frequency192KHz (HDSPM_QuadSpeed|HDSPM_Frequency1|HDSPM_Frequency0) #define HDSPM_Frequency192KHz (HDSPM_QuadSpeed|HDSPM_Frequency1|\
HDSPM_Frequency0)
/* --- for internal discrimination */ /* --- for internal discrimination */
#define HDSPM_CLOCK_SOURCE_AUTOSYNC 0 /* Sample Clock Sources */ #define HDSPM_CLOCK_SOURCE_AUTOSYNC 0 /* Sample Clock Sources */
...@@ -256,10 +262,14 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -256,10 +262,14 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
#define HDSPM_RD_MULTIPLE (1<<10) #define HDSPM_RD_MULTIPLE (1<<10)
/* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
that do not conflict with specific bits for AES32 seem to be valid also for the AES32 */ that do not conflict with specific bits for AES32 seem to be valid also
for the AES32
*/
#define HDSPM_audioIRQPending (1<<0) /* IRQ is high and pending */ #define HDSPM_audioIRQPending (1<<0) /* IRQ is high and pending */
#define HDSPM_RX_64ch (1<<1) /* Input 64chan. MODE=1, 56chn. MODE=0 */ #define HDSPM_RX_64ch (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
#define HDSPM_AB_int (1<<2) /* InputChannel Opt=0, Coax=1 (like inp0) */ #define HDSPM_AB_int (1<<2) /* InputChannel Opt=0, Coax=1
* (like inp0)
*/
#define HDSPM_madiLock (1<<3) /* MADI Locked =1, no=0 */ #define HDSPM_madiLock (1<<3) /* MADI Locked =1, no=0 */
#define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */ #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
...@@ -274,12 +284,15 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -274,12 +284,15 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
#define HDSPM_madiFreq2 (1<<24) /* 4=64, 5=88.2 6=96 */ #define HDSPM_madiFreq2 (1<<24) /* 4=64, 5=88.2 6=96 */
#define HDSPM_madiFreq3 (1<<25) /* 7=128, 8=176.4 9=192 */ #define HDSPM_madiFreq3 (1<<25) /* 7=128, 8=176.4 9=192 */
#define HDSPM_BufferID (1<<26) /* (Double)Buffer ID toggles with Interrupt */ #define HDSPM_BufferID (1<<26) /* (Double)Buffer ID toggles with
* Interrupt
*/
#define HDSPM_midi0IRQPending (1<<30) /* MIDI IRQ is pending */ #define HDSPM_midi0IRQPending (1<<30) /* MIDI IRQ is pending */
#define HDSPM_midi1IRQPending (1<<31) /* and aktiv */ #define HDSPM_midi1IRQPending (1<<31) /* and aktiv */
/* --- status bit helpers */ /* --- status bit helpers */
#define HDSPM_madiFreqMask (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2|HDSPM_madiFreq3) #define HDSPM_madiFreqMask (HDSPM_madiFreq0|HDSPM_madiFreq1|\
HDSPM_madiFreq2|HDSPM_madiFreq3)
#define HDSPM_madiFreq32 (HDSPM_madiFreq0) #define HDSPM_madiFreq32 (HDSPM_madiFreq0)
#define HDSPM_madiFreq44_1 (HDSPM_madiFreq1) #define HDSPM_madiFreq44_1 (HDSPM_madiFreq1)
#define HDSPM_madiFreq48 (HDSPM_madiFreq0|HDSPM_madiFreq1) #define HDSPM_madiFreq48 (HDSPM_madiFreq0|HDSPM_madiFreq1)
...@@ -319,10 +332,12 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}"); ...@@ -319,10 +332,12 @@ MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
#define HDSPM_wcFreq96 (HDSPM_wc_freq1|HDSPM_wc_freq2) #define HDSPM_wcFreq96 (HDSPM_wc_freq1|HDSPM_wc_freq2)
#define HDSPM_SelSyncRefMask (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|HDSPM_SelSyncRef2) #define HDSPM_SelSyncRefMask (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
HDSPM_SelSyncRef2)
#define HDSPM_SelSyncRef_WORD 0 #define HDSPM_SelSyncRef_WORD 0
#define HDSPM_SelSyncRef_MADI (HDSPM_SelSyncRef0) #define HDSPM_SelSyncRef_MADI (HDSPM_SelSyncRef0)
#define HDSPM_SelSyncRef_NVALID (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|HDSPM_SelSyncRef2) #define HDSPM_SelSyncRef_NVALID (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
HDSPM_SelSyncRef2)
/* /*
For AES32, bits for status, status2 and timecode are different For AES32, bits for status, status2 and timecode are different
...@@ -412,8 +427,9 @@ struct hdspm_midi { ...@@ -412,8 +427,9 @@ struct hdspm_midi {
struct hdspm { struct hdspm {
spinlock_t lock; spinlock_t lock;
struct snd_pcm_substream *capture_substream; /* only one playback */ /* only one playback and/or capture stream */
struct snd_pcm_substream *playback_substream; /* and/or capture stream */ struct snd_pcm_substream *capture_substream;
struct snd_pcm_substream *playback_substream;
char *card_name; /* for procinfo */ char *card_name; /* for procinfo */
unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/ unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
...@@ -460,9 +476,12 @@ struct hdspm { ...@@ -460,9 +476,12 @@ struct hdspm {
struct pci_dev *pci; /* and an pci info */ struct pci_dev *pci; /* and an pci info */
/* Mixer vars */ /* Mixer vars */
struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS]; /* fast alsa mixer */ /* fast alsa mixer */
struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS]; /* but input to much, so not used */ struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
struct hdspm_mixer *mixer; /* full mixer accessable over mixer ioctl or hwdep-device */ /* but input to much, so not used */
struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
/* full mixer accessable over mixer ioctl or hwdep-device */
struct hdspm_mixer *mixer;
}; };
...@@ -616,13 +635,15 @@ static inline int hdspm_external_sample_rate(struct hdspm * hdspm) ...@@ -616,13 +635,15 @@ static inline int hdspm_external_sample_rate(struct hdspm * hdspm)
if (hdspm->is_aes32) { if (hdspm->is_aes32) {
unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2); unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister); unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
unsigned int timecode = hdspm_read(hdspm, HDSPM_timecodeRegister); unsigned int timecode =
hdspm_read(hdspm, HDSPM_timecodeRegister);
int syncref = hdspm_autosync_ref(hdspm); int syncref = hdspm_autosync_ref(hdspm);
if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD && if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
status & HDSPM_AES32_wcLock) status & HDSPM_AES32_wcLock)
return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF); return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit)
& 0xF);
if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 && if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 && syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
status2 & (HDSPM_LockAES >> status2 & (HDSPM_LockAES >>
...@@ -668,7 +689,9 @@ static inline int hdspm_external_sample_rate(struct hdspm * hdspm) ...@@ -668,7 +689,9 @@ static inline int hdspm_external_sample_rate(struct hdspm * hdspm)
} }
} }
/* if rate detected and Syncref is Word than have it, word has priority to MADI */ /* if rate detected and Syncref is Word than have it,
* word has priority to MADI
*/
if (rate != 0 && if (rate != 0 &&
(status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD) (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
return rate; return rate;
...@@ -727,12 +750,12 @@ static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm * hdspm) ...@@ -727,12 +750,12 @@ static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm * hdspm)
position = hdspm_read(hdspm, HDSPM_statusRegister); position = hdspm_read(hdspm, HDSPM_statusRegister);
if (!hdspm->precise_ptr) { if (!hdspm->precise_ptr)
return (position & HDSPM_BufferID) ? (hdspm->period_bytes / return (position & HDSPM_BufferID) ?
4) : 0; (hdspm->period_bytes / 4) : 0;
}
/* hwpointer comes in bytes and is 64Bytes accurate (by docu since PCI Burst) /* hwpointer comes in bytes and is 64Bytes accurate (by docu since
PCI Burst)
i have experimented that it is at most 64 Byte to much for playing i have experimented that it is at most 64 Byte to much for playing
so substraction of 64 byte should be ok for ALSA, but use it only so substraction of 64 byte should be ok for ALSA, but use it only
for application where you know what you do since if you come to for application where you know what you do since if you come to
...@@ -808,10 +831,10 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate) ...@@ -808,10 +831,10 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
rate /= 2; rate /= 2;
/* RME says n = 104857600000000, but in the windows MADI driver, I see: /* RME says n = 104857600000000, but in the windows MADI driver, I see:
// return 104857600000000 / rate; // 100 MHz return 104857600000000 / rate; // 100 MHz
return 110100480000000 / rate; // 105 MHz return 110100480000000 / rate; // 105 MHz
*/ */
//n = 104857600000000ULL; /* = 2^20 * 10^8 */ /* n = 104857600000000ULL; */ /* = 2^20 * 10^8 */
n = 110100480000000ULL; /* Value checked for AES32 and MADI */ n = 110100480000000ULL; /* Value checked for AES32 and MADI */
div64_32(&n, rate, &r); div64_32(&n, rate, &r);
/* n should be less than 2^32 for being written to FREQ register */ /* n should be less than 2^32 for being written to FREQ register */
...@@ -841,8 +864,9 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) ...@@ -841,8 +864,9 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
just make a warning an remember setting just make a warning an remember setting
for future master mode switching */ for future master mode switching */
snd_printk snd_printk(KERN_WARNING "HDSPM: "
(KERN_WARNING "HDSPM: Warning: device is not running as a clock master.\n"); "Warning: device is not running "
"as a clock master.\n");
not_set = 1; not_set = 1;
} else { } else {
...@@ -850,16 +874,18 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) ...@@ -850,16 +874,18 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
int external_freq = int external_freq =
hdspm_external_sample_rate(hdspm); hdspm_external_sample_rate(hdspm);
if ((hdspm_autosync_ref(hdspm) == if (hdspm_autosync_ref(hdspm) ==
HDSPM_AUTOSYNC_FROM_NONE)) { HDSPM_AUTOSYNC_FROM_NONE) {
snd_printk(KERN_WARNING "HDSPM: Detected no Externel Sync \n"); snd_printk(KERN_WARNING "HDSPM: "
"Detected no Externel Sync \n");
not_set = 1; not_set = 1;
} else if (rate != external_freq) { } else if (rate != external_freq) {
snd_printk snd_printk(KERN_WARNING "HDSPM: "
(KERN_WARNING "HDSPM: Warning: No AutoSync source for requested rate\n"); "Warning: No AutoSync source for "
"requested rate\n");
not_set = 1; not_set = 1;
} }
} }
...@@ -934,7 +960,9 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) ...@@ -934,7 +960,9 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
if (reject_if_open if (reject_if_open
&& (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) { && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
snd_printk snd_printk
(KERN_ERR "HDSPM: cannot change between single- and double-speed mode (capture PID = %d, playback PID = %d)\n", (KERN_ERR "HDSPM: "
"cannot change between single- and double-speed mode "
"(capture PID = %d, playback PID = %d)\n",
hdspm->capture_pid, hdspm->playback_pid); hdspm->capture_pid, hdspm->playback_pid);
return -EBUSY; return -EBUSY;
} }
...@@ -966,8 +994,14 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally) ...@@ -966,8 +994,14 @@ static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
static void all_in_all_mixer(struct hdspm * hdspm, int sgain) static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
{ {
int i, j; int i, j;
unsigned int gain = unsigned int gain;
(sgain > UNITY_GAIN) ? UNITY_GAIN : (sgain < 0) ? 0 : sgain;
if (sgain > UNITY_GAIN)
gain = UNITY_GAIN;
else if (sgain < 0)
gain = 0;
else
gain = sgain;
for (i = 0; i < HDSPM_MIXER_CHANNELS; i++) for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) { for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
...@@ -980,7 +1014,8 @@ static void all_in_all_mixer(struct hdspm * hdspm, int sgain) ...@@ -980,7 +1014,8 @@ static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
MIDI MIDI
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm, int id) static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
int id)
{ {
/* the hardware already does the relevant bit-mask with 0xff */ /* the hardware already does the relevant bit-mask with 0xff */
if (id) if (id)
...@@ -989,7 +1024,8 @@ static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm, int i ...@@ -989,7 +1024,8 @@ static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm, int i
return hdspm_read(hdspm, HDSPM_midiDataIn0); return hdspm_read(hdspm, HDSPM_midiDataIn0);
} }
static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id, int val) static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
int val)
{ {
/* the hardware already does the relevant bit-mask with 0xff */ /* the hardware already does the relevant bit-mask with 0xff */
if (id) if (id)
...@@ -1011,9 +1047,10 @@ static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id) ...@@ -1011,9 +1047,10 @@ static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
int fifo_bytes_used; int fifo_bytes_used;
if (id) if (id)
fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xff; fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut1);
else else
fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xff; fifo_bytes_used = hdspm_read(hdspm, HDSPM_midiStatusOut0);
fifo_bytes_used &= 0xff;
if (fifo_bytes_used < 128) if (fifo_bytes_used < 128)
return 128 - fifo_bytes_used; return 128 - fifo_bytes_used;
...@@ -1038,16 +1075,21 @@ static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi) ...@@ -1038,16 +1075,21 @@ static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
/* 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)) { !snd_rawmidi_transmit_empty (hmidi->output)) {
if ((n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm, hmidi->id)) > 0) { n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
if (n_pending > (int)sizeof (buf)) hmidi->id);
n_pending = sizeof (buf); if (n_pending > 0) {
if (n_pending > (int)sizeof (buf))
if ((to_write = snd_rawmidi_transmit (hmidi->output, buf, n_pending)) > 0) { n_pending = sizeof (buf);
for (i = 0; i < to_write; ++i)
snd_hdspm_midi_write_byte (hmidi->hdspm, hmidi->id, buf[i]); to_write = snd_rawmidi_transmit (hmidi->output, buf,
} n_pending);
if (to_write > 0) {
for (i = 0; i < to_write; ++i)
snd_hdspm_midi_write_byte (hmidi->hdspm,
hmidi->id,
buf[i]);
} }
} }
} }
...@@ -1057,51 +1099,55 @@ static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi) ...@@ -1057,51 +1099,55 @@ static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi) static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
{ {
unsigned char buf[128]; /* this buffer is designed to match the MIDI input FIFO size */ unsigned char buf[128]; /* this buffer is designed to match the MIDI
* input FIFO size
*/
unsigned long flags; unsigned long flags;
int n_pending; int n_pending;
int i; int i;
spin_lock_irqsave (&hmidi->lock, flags); spin_lock_irqsave (&hmidi->lock, flags);
if ((n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id)) > 0) { n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
if (n_pending > 0) {
if (hmidi->input) { if (hmidi->input) {
if (n_pending > (int)sizeof (buf)) { if (n_pending > (int)sizeof (buf))
n_pending = sizeof (buf); n_pending = sizeof (buf);
} for (i = 0; i < n_pending; ++i)
for (i = 0; i < n_pending; ++i) { buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm, hmidi->id); hmidi->id);
} if (n_pending)
if (n_pending) { snd_rawmidi_receive (hmidi->input, buf,
snd_rawmidi_receive (hmidi->input, buf, n_pending); n_pending);
}
} else { } else {
/* flush the MIDI input FIFO */ /* flush the MIDI input FIFO */
while (n_pending--) { while (n_pending--)
snd_hdspm_midi_read_byte (hmidi->hdspm, hmidi->id); snd_hdspm_midi_read_byte (hmidi->hdspm,
} hmidi->id);
} }
} }
hmidi->pending = 0; hmidi->pending = 0;
if (hmidi->id) { if (hmidi->id)
hmidi->hdspm->control_register |= HDSPM_Midi1InterruptEnable; hmidi->hdspm->control_register |= HDSPM_Midi1InterruptEnable;
} else { else
hmidi->hdspm->control_register |= HDSPM_Midi0InterruptEnable; hmidi->hdspm->control_register |= HDSPM_Midi0InterruptEnable;
} hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
hdspm_write(hmidi->hdspm, HDSPM_controlRegister, hmidi->hdspm->control_register); hmidi->hdspm->control_register);
spin_unlock_irqrestore (&hmidi->lock, flags); spin_unlock_irqrestore (&hmidi->lock, flags);
return snd_hdspm_midi_output_write (hmidi); return snd_hdspm_midi_output_write (hmidi);
} }
static void snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up) static void
snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
{ {
struct hdspm *hdspm; struct hdspm *hdspm;
struct hdspm_midi *hmidi; struct hdspm_midi *hmidi;
unsigned long flags; unsigned long flags;
u32 ie; u32 ie;
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
hdspm = hmidi->hdspm; hdspm = hmidi->hdspm;
ie = hmidi->id ? HDSPM_Midi1InterruptEnable : HDSPM_Midi0InterruptEnable; ie = hmidi->id ?
HDSPM_Midi1InterruptEnable : HDSPM_Midi0InterruptEnable;
spin_lock_irqsave (&hdspm->lock, flags); spin_lock_irqsave (&hdspm->lock, flags);
if (up) { if (up) {
if (!(hdspm->control_register & ie)) { if (!(hdspm->control_register & ie)) {
...@@ -1138,12 +1184,13 @@ static void snd_hdspm_midi_output_timer(unsigned long data) ...@@ -1138,12 +1184,13 @@ static void snd_hdspm_midi_output_timer(unsigned long data)
spin_unlock_irqrestore (&hmidi->lock, flags); spin_unlock_irqrestore (&hmidi->lock, flags);
} }
static void snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up) static void
snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
{ {
struct hdspm_midi *hmidi; struct hdspm_midi *hmidi;
unsigned long flags; unsigned long flags;
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
spin_lock_irqsave (&hmidi->lock, flags); spin_lock_irqsave (&hmidi->lock, flags);
if (up) { if (up) {
if (!hmidi->istimer) { if (!hmidi->istimer) {
...@@ -1155,9 +1202,8 @@ static void snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substrea ...@@ -1155,9 +1202,8 @@ static void snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substrea
hmidi->istimer++; hmidi->istimer++;
} }
} else { } else {
if (hmidi->istimer && --hmidi->istimer <= 0) { if (hmidi->istimer && --hmidi->istimer <= 0)
del_timer (&hmidi->timer); del_timer (&hmidi->timer);
}
} }
spin_unlock_irqrestore (&hmidi->lock, flags); spin_unlock_irqrestore (&hmidi->lock, flags);
if (up) if (up)
...@@ -1168,7 +1214,7 @@ static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream) ...@@ -1168,7 +1214,7 @@ static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
{ {
struct hdspm_midi *hmidi; struct hdspm_midi *hmidi;
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
spin_lock_irq (&hmidi->lock); spin_lock_irq (&hmidi->lock);
snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id); snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
hmidi->input = substream; hmidi->input = substream;
...@@ -1181,7 +1227,7 @@ static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream) ...@@ -1181,7 +1227,7 @@ static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
{ {
struct hdspm_midi *hmidi; struct hdspm_midi *hmidi;
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
spin_lock_irq (&hmidi->lock); spin_lock_irq (&hmidi->lock);
hmidi->output = substream; hmidi->output = substream;
spin_unlock_irq (&hmidi->lock); spin_unlock_irq (&hmidi->lock);
...@@ -1195,7 +1241,7 @@ static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream) ...@@ -1195,7 +1241,7 @@ static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
snd_hdspm_midi_input_trigger (substream, 0); snd_hdspm_midi_input_trigger (substream, 0);
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
spin_lock_irq (&hmidi->lock); spin_lock_irq (&hmidi->lock);
hmidi->input = NULL; hmidi->input = NULL;
spin_unlock_irq (&hmidi->lock); spin_unlock_irq (&hmidi->lock);
...@@ -1209,7 +1255,7 @@ static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream) ...@@ -1209,7 +1255,7 @@ static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
snd_hdspm_midi_output_trigger (substream, 0); snd_hdspm_midi_output_trigger (substream, 0);
hmidi = (struct hdspm_midi *) substream->rmidi->private_data; hmidi = substream->rmidi->private_data;
spin_lock_irq (&hmidi->lock); spin_lock_irq (&hmidi->lock);
hmidi->output = NULL; hmidi->output = NULL;
spin_unlock_irq (&hmidi->lock); spin_unlock_irq (&hmidi->lock);
...@@ -1231,29 +1277,28 @@ static struct snd_rawmidi_ops snd_hdspm_midi_input = ...@@ -1231,29 +1277,28 @@ static struct snd_rawmidi_ops snd_hdspm_midi_input =
.trigger = snd_hdspm_midi_input_trigger, .trigger = snd_hdspm_midi_input_trigger,
}; };
static int __devinit snd_hdspm_create_midi (struct snd_card *card, struct hdspm *hdspm, int id) static int __devinit snd_hdspm_create_midi (struct snd_card *card,
struct hdspm *hdspm, int id)
{ {
int err; int err;
char buf[32]; char buf[32];
hdspm->midi[id].id = id; hdspm->midi[id].id = id;
hdspm->midi[id].rmidi = NULL;
hdspm->midi[id].input = NULL;
hdspm->midi[id].output = NULL;
hdspm->midi[id].hdspm = hdspm; hdspm->midi[id].hdspm = hdspm;
hdspm->midi[id].istimer = 0;
hdspm->midi[id].pending = 0;
spin_lock_init (&hdspm->midi[id].lock); spin_lock_init (&hdspm->midi[id].lock);
sprintf (buf, "%s MIDI %d", card->shortname, id+1); sprintf (buf, "%s MIDI %d", card->shortname, id+1);
if ((err = snd_rawmidi_new (card, buf, id, 1, 1, &hdspm->midi[id].rmidi)) < 0) err = snd_rawmidi_new (card, buf, id, 1, 1, &hdspm->midi[id].rmidi);
if (err < 0)
return err; return err;
sprintf (hdspm->midi[id].rmidi->name, "%s MIDI %d", card->id, id+1); sprintf (hdspm->midi[id].rmidi->name, "%s MIDI %d", card->id, id+1);
hdspm->midi[id].rmidi->private_data = &hdspm->midi[id]; hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
snd_rawmidi_set_ops (hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_hdspm_midi_output); snd_rawmidi_set_ops(hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
snd_rawmidi_set_ops (hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_hdspm_midi_input); &snd_hdspm_midi_output);
snd_rawmidi_set_ops(hdspm->midi[id].rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
&snd_hdspm_midi_input);
hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT |
SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_INPUT |
...@@ -1637,7 +1682,8 @@ static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref) ...@@ -1637,7 +1682,8 @@ static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
hdspm->control_register |= HDSPM_SyncRef2+HDSPM_SyncRef1; hdspm->control_register |= HDSPM_SyncRef2+HDSPM_SyncRef1;
break; break;
case 7: case 7:
hdspm->control_register |= HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0; hdspm->control_register |=
HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
break; break;
case 8: case 8:
hdspm->control_register |= HDSPM_SyncRef3; hdspm->control_register |= HDSPM_SyncRef3;
...@@ -1675,7 +1721,8 @@ static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol, ...@@ -1675,7 +1721,8 @@ static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
uinfo->value.enumerated.items = 9; uinfo->value.enumerated.items = 9;
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.item =
uinfo->value.enumerated.items - 1; uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
...@@ -1688,7 +1735,8 @@ static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol, ...@@ -1688,7 +1735,8 @@ static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
uinfo->value.enumerated.items = 2; uinfo->value.enumerated.items = 2;
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.item =
uinfo->value.enumerated.items - 1; uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
...@@ -1740,7 +1788,8 @@ static int hdspm_autosync_ref(struct hdspm * hdspm) ...@@ -1740,7 +1788,8 @@ static int hdspm_autosync_ref(struct hdspm * hdspm)
{ {
if (hdspm->is_aes32) { if (hdspm->is_aes32) {
unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister); unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) & 0xF; unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) &
0xF;
if (syncref == 0) if (syncref == 0)
return HDSPM_AES32_AUTOSYNC_FROM_WORD; return HDSPM_AES32_AUTOSYNC_FROM_WORD;
if (syncref <= 8) if (syncref <= 8)
...@@ -1777,20 +1826,20 @@ static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol, ...@@ -1777,20 +1826,20 @@ static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1; uinfo->count = 1;
uinfo->value.enumerated.items = 10; uinfo->value.enumerated.items = 10;
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.item =
uinfo->value.enumerated.items - 1; uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
texts[uinfo->value.enumerated.item]); texts[uinfo->value.enumerated.item]);
} } else {
else
{
static char *texts[] = { "WordClock", "MADI", "None" }; static char *texts[] = { "WordClock", "MADI", "None" };
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;
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.item =
uinfo->value.enumerated.items - 1; uinfo->value.enumerated.items - 1;
strcpy(uinfo->value.enumerated.name, strcpy(uinfo->value.enumerated.name,
...@@ -2416,7 +2465,7 @@ static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol, ...@@ -2416,7 +2465,7 @@ static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
if (val > 2) if (val > 2)
val = 2; val = 2;
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
change = (int) val != hdspm_qs_wire(hdspm); change = val != hdspm_qs_wire(hdspm);
hdspm_set_qs_wire(hdspm, val); hdspm_set_qs_wire(hdspm, val);
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
return change; return change;
...@@ -2517,8 +2566,8 @@ static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol, ...@@ -2517,8 +2566,8 @@ static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
source - source -
HDSPM_MAX_CHANNELS); HDSPM_MAX_CHANNELS);
else else
change = change = gain != hdspm_read_in_gain(hdspm, destination,
gain != hdspm_read_in_gain(hdspm, destination, source); source);
if (change) { if (change) {
if (source >= HDSPM_MAX_CHANNELS) if (source >= HDSPM_MAX_CHANNELS)
...@@ -2571,7 +2620,8 @@ static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol, ...@@ -2571,7 +2620,8 @@ static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
snd_assert(channel >= 0 snd_assert(channel >= 0
|| channel < HDSPM_MAX_CHANNELS, return -EINVAL); || channel < HDSPM_MAX_CHANNELS, return -EINVAL);
if ((mapped_channel = hdspm->channel_map[channel]) < 0) mapped_channel = hdspm->channel_map[channel];
if (mapped_channel < 0)
return -EINVAL; return -EINVAL;
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
...@@ -2579,10 +2629,12 @@ static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol, ...@@ -2579,10 +2629,12 @@ static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
hdspm_read_pb_gain(hdspm, mapped_channel, mapped_channel); hdspm_read_pb_gain(hdspm, mapped_channel, mapped_channel);
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
/* snd_printdd("get pb mixer index %d, channel %d, mapped_channel %d, value %d\n", /*
ucontrol->id.index, channel, mapped_channel, ucontrol->value.integer.value[0]); snd_printdd("get pb mixer index %d, channel %d, mapped_channel %d, "
*/ "value %d\n",
ucontrol->id.index, channel, mapped_channel,
ucontrol->value.integer.value[0]);
*/
return 0; return 0;
} }
...@@ -2603,7 +2655,8 @@ static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol, ...@@ -2603,7 +2655,8 @@ static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
snd_assert(channel >= 0 snd_assert(channel >= 0
|| channel < HDSPM_MAX_CHANNELS, return -EINVAL); || channel < HDSPM_MAX_CHANNELS, return -EINVAL);
if ((mapped_channel = hdspm->channel_map[channel]) < 0) mapped_channel = hdspm->channel_map[channel];
if (mapped_channel < 0)
return -EINVAL; return -EINVAL;
gain = ucontrol->value.integer.value[0]; gain = ucontrol->value.integer.value[0];
...@@ -2853,28 +2906,26 @@ static int snd_hdspm_create_controls(struct snd_card *card, struct hdspm * hdspm ...@@ -2853,28 +2906,26 @@ static int snd_hdspm_create_controls(struct snd_card *card, struct hdspm * hdspm
} }
/* Channel playback mixer as default control /* Channel playback mixer as default control
Note: the whole matrix would be 128*HDSPM_MIXER_CHANNELS Faders, thats too big for any alsamixer Note: the whole matrix would be 128*HDSPM_MIXER_CHANNELS Faders,
they are accesible via special IOCTL on hwdep thats too * big for any alsamixer they are accesible via special
and the mixer 2dimensional mixer control */ IOCTL on hwdep and the mixer 2dimensional mixer control
*/
snd_hdspm_playback_mixer.name = "Chn"; snd_hdspm_playback_mixer.name = "Chn";
limit = HDSPM_MAX_CHANNELS; limit = HDSPM_MAX_CHANNELS;
/* The index values are one greater than the channel ID so that alsamixer /* The index values are one greater than the channel ID so that
will display them correctly. We want to use the index for fast lookup * alsamixer will display them correctly. We want to use the index
of the relevant channel, but if we use it at all, most ALSA software * for fast lookup of the relevant channel, but if we use it at all,
does the wrong thing with it ... * most ALSA software does the wrong thing with it ...
*/ */
for (idx = 0; idx < limit; ++idx) { for (idx = 0; idx < limit; ++idx) {
snd_hdspm_playback_mixer.index = idx + 1; snd_hdspm_playback_mixer.index = idx + 1;
if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
kctl = err = snd_ctl_add(card, kctl);
snd_ctl_new1 if (err < 0)
(&snd_hdspm_playback_mixer,
hdspm)))) {
return err; return err;
}
hdspm->playback_mixer_ctls[idx] = kctl; hdspm->playback_mixer_ctls[idx] = kctl;
} }
...@@ -2889,7 +2940,7 @@ static void ...@@ -2889,7 +2940,7 @@ static void
snd_hdspm_proc_read_madi(struct snd_info_entry * entry, snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
struct snd_info_buffer *buffer) struct snd_info_buffer *buffer)
{ {
struct hdspm *hdspm = (struct hdspm *) entry->private_data; struct hdspm *hdspm = entry->private_data;
unsigned int status; unsigned int status;
unsigned int status2; unsigned int status2;
char *pref_sync_ref; char *pref_sync_ref;
...@@ -2922,14 +2973,14 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry, ...@@ -2922,14 +2973,14 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
(status & HDSPM_midi1IRQPending) ? 1 : 0, (status & HDSPM_midi1IRQPending) ? 1 : 0,
hdspm->irq_count); hdspm->irq_count);
snd_iprintf(buffer, snd_iprintf(buffer,
"HW pointer: id = %d, rawptr = %d (%d->%d) estimated= %ld (bytes)\n", "HW pointer: id = %d, rawptr = %d (%d->%d) "
"estimated= %ld (bytes)\n",
((status & HDSPM_BufferID) ? 1 : 0), ((status & HDSPM_BufferID) ? 1 : 0),
(status & HDSPM_BufferPositionMask), (status & HDSPM_BufferPositionMask),
(status & HDSPM_BufferPositionMask) % (2 * (status & HDSPM_BufferPositionMask) %
(int)hdspm-> (2 * (int)hdspm->period_bytes),
period_bytes), ((status & HDSPM_BufferPositionMask) - 64) %
((status & HDSPM_BufferPositionMask) - (2 * (int)hdspm->period_bytes),
64) % (2 * (int)hdspm->period_bytes),
(long) hdspm_hw_pointer(hdspm) * 4); (long) hdspm_hw_pointer(hdspm) * 4);
snd_iprintf(buffer, snd_iprintf(buffer,
...@@ -2939,24 +2990,22 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry, ...@@ -2939,24 +2990,22 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF, hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF); hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
snd_iprintf(buffer, snd_iprintf(buffer,
"Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, status2=0x%x\n", "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
"status2=0x%x\n",
hdspm->control_register, hdspm->control2_register, hdspm->control_register, hdspm->control2_register,
status, status2); status, status2);
snd_iprintf(buffer, "--- Settings ---\n"); snd_iprintf(buffer, "--- Settings ---\n");
x = 1 << (6 + x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
hdspm_decode_latency(hdspm-> HDSPM_LatencyMask));
control_register &
HDSPM_LatencyMask));
snd_iprintf(buffer, snd_iprintf(buffer,
"Size (Latency): %d samples (2 periods of %lu bytes)\n", "Size (Latency): %d samples (2 periods of %lu bytes)\n",
x, (unsigned long) hdspm->period_bytes); x, (unsigned long) hdspm->period_bytes);
snd_iprintf(buffer, "Line out: %s, Precise Pointer: %s\n", snd_iprintf(buffer, "Line out: %s, Precise Pointer: %s\n",
(hdspm-> (hdspm->control_register & HDSPM_LineOut) ? "on " : "off",
control_register & HDSPM_LineOut) ? "on " : "off",
(hdspm->precise_ptr) ? "on" : "off"); (hdspm->precise_ptr) ? "on" : "off");
switch (hdspm->control_register & HDSPM_InputMask) { switch (hdspm->control_register & HDSPM_InputMask) {
...@@ -2984,7 +3033,8 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry, ...@@ -2984,7 +3033,8 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
syncref); syncref);
snd_iprintf(buffer, snd_iprintf(buffer,
"ClearTrackMarker = %s, Transmit in %s Channel Mode, Auto Input %s\n", "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
"Auto Input %s\n",
(hdspm-> (hdspm->
control_register & HDSPM_clr_tms) ? "on" : "off", control_register & HDSPM_clr_tms) ? "on" : "off",
(hdspm-> (hdspm->
...@@ -3085,7 +3135,7 @@ static void ...@@ -3085,7 +3135,7 @@ static void
snd_hdspm_proc_read_aes32(struct snd_info_entry * entry, snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
struct snd_info_buffer *buffer) struct snd_info_buffer *buffer)
{ {
struct hdspm *hdspm = (struct hdspm *) entry->private_data; struct hdspm *hdspm = entry->private_data;
unsigned int status; unsigned int status;
unsigned int status2; unsigned int status2;
unsigned int timecode; unsigned int timecode;
...@@ -3115,14 +3165,14 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry, ...@@ -3115,14 +3165,14 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
(status & HDSPM_midi1IRQPending) ? 1 : 0, (status & HDSPM_midi1IRQPending) ? 1 : 0,
hdspm->irq_count); hdspm->irq_count);
snd_iprintf(buffer, snd_iprintf(buffer,
"HW pointer: id = %d, rawptr = %d (%d->%d) estimated= %ld (bytes)\n", "HW pointer: id = %d, rawptr = %d (%d->%d) "
"estimated= %ld (bytes)\n",
((status & HDSPM_BufferID) ? 1 : 0), ((status & HDSPM_BufferID) ? 1 : 0),
(status & HDSPM_BufferPositionMask), (status & HDSPM_BufferPositionMask),
(status & HDSPM_BufferPositionMask) % (2 * (status & HDSPM_BufferPositionMask) %
(int)hdspm-> (2 * (int)hdspm->period_bytes),
period_bytes), ((status & HDSPM_BufferPositionMask) - 64) %
((status & HDSPM_BufferPositionMask) - (2 * (int)hdspm->period_bytes),
64) % (2 * (int)hdspm->period_bytes),
(long) hdspm_hw_pointer(hdspm) * 4); (long) hdspm_hw_pointer(hdspm) * 4);
snd_iprintf(buffer, snd_iprintf(buffer,
...@@ -3132,16 +3182,15 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry, ...@@ -3132,16 +3182,15 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF, hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF); hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
snd_iprintf(buffer, snd_iprintf(buffer,
"Register: ctrl1=0x%x, status1=0x%x, status2=0x%x, timecode=0x%x\n", "Register: ctrl1=0x%x, status1=0x%x, status2=0x%x, "
"timecode=0x%x\n",
hdspm->control_register, hdspm->control_register,
status, status2, timecode); status, status2, timecode);
snd_iprintf(buffer, "--- Settings ---\n"); snd_iprintf(buffer, "--- Settings ---\n");
x = 1 << (6 + x = 1 << (6 + hdspm_decode_latency(hdspm->control_register &
hdspm_decode_latency(hdspm-> HDSPM_LatencyMask));
control_register &
HDSPM_LatencyMask));
snd_iprintf(buffer, snd_iprintf(buffer,
"Size (Latency): %d samples (2 periods of %lu bytes)\n", "Size (Latency): %d samples (2 periods of %lu bytes)\n",
...@@ -3224,14 +3273,15 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry, ...@@ -3224,14 +3273,15 @@ snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
snd_iprintf(buffer, "--- Status:\n"); snd_iprintf(buffer, "--- Status:\n");
snd_iprintf(buffer, "Word: %s Frequency: %d\n", snd_iprintf(buffer, "Word: %s Frequency: %d\n",
(status & HDSPM_AES32_wcLock)? "Sync " : "No Lock", (status & HDSPM_AES32_wcLock)? "Sync " : "No Lock",
HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF)); HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
for (x = 0; x < 8; x++) { for (x = 0; x < 8; x++) {
snd_iprintf(buffer, "AES%d: %s Frequency: %d\n", snd_iprintf(buffer, "AES%d: %s Frequency: %d\n",
x+1, x+1,
(status2 & (HDSPM_LockAES >> x))? "Sync ": "No Lock", (status2 & (HDSPM_LockAES >> x)) ?
HDSPM_bit2freq((timecode >> (4*x)) & 0xF)); "Sync ": "No Lock",
HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
} }
switch (hdspm_autosync_ref(hdspm)) { switch (hdspm_autosync_ref(hdspm)) {
...@@ -3257,12 +3307,11 @@ static void ...@@ -3257,12 +3307,11 @@ static void
snd_hdspm_proc_read_debug(struct snd_info_entry * entry, snd_hdspm_proc_read_debug(struct snd_info_entry * entry,
struct snd_info_buffer *buffer) struct snd_info_buffer *buffer)
{ {
struct hdspm *hdspm = (struct hdspm *)entry->private_data; struct hdspm *hdspm = entry->private_data;
int j,i; int j,i;
for (i = 0; i < 256 /* 1024*64 */; i += j) for (i = 0; i < 256 /* 1024*64 */; i += j) {
{
snd_iprintf(buffer, "0x%08X: ", i); snd_iprintf(buffer, "0x%08X: ", i);
for (j = 0; j < 16; j += 4) for (j = 0; j < 16; j += 4)
snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j)); snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
...@@ -3305,14 +3354,20 @@ static int snd_hdspm_set_defaults(struct hdspm * hdspm) ...@@ -3305,14 +3354,20 @@ static int snd_hdspm_set_defaults(struct hdspm * hdspm)
/* set defaults: */ /* set defaults: */
if (hdspm->is_aes32) if (hdspm->is_aes32)
hdspm->control_register = HDSPM_ClockModeMaster | /* Master Cloack Mode on */ hdspm->control_register =
hdspm_encode_latency(7) | /* latency maximum = 8192 samples */ HDSPM_ClockModeMaster | /* Master Cloack Mode on */
hdspm_encode_latency(7) | /* latency maximum =
* 8192 samples
*/
HDSPM_SyncRef0 | /* AES1 is syncclock */ HDSPM_SyncRef0 | /* AES1 is syncclock */
HDSPM_LineOut | /* Analog output in */ HDSPM_LineOut | /* Analog output in */
HDSPM_Professional; /* Professional mode */ HDSPM_Professional; /* Professional mode */
else else
hdspm->control_register = HDSPM_ClockModeMaster | /* Master Cloack Mode on */ hdspm->control_register =
hdspm_encode_latency(7) | /* latency maximum = 8192 samples */ HDSPM_ClockModeMaster | /* Master Cloack Mode on */
hdspm_encode_latency(7) | /* latency maximum =
* 8192 samples
*/
HDSPM_InputCoaxial | /* Input Coax not Optical */ HDSPM_InputCoaxial | /* Input Coax not Optical */
HDSPM_SyncRef_MADI | /* Madi is syncclock */ HDSPM_SyncRef_MADI | /* Madi is syncclock */
HDSPM_LineOut | /* Analog output in */ HDSPM_LineOut | /* Analog output in */
...@@ -3343,7 +3398,8 @@ static int snd_hdspm_set_defaults(struct hdspm * hdspm) ...@@ -3343,7 +3398,8 @@ static int snd_hdspm_set_defaults(struct hdspm * hdspm)
if (line_outs_monitor[hdspm->dev]) { if (line_outs_monitor[hdspm->dev]) {
snd_printk(KERN_INFO "HDSPM: sending all playback streams to line outs.\n"); snd_printk(KERN_INFO "HDSPM: "
"sending all playback streams to line outs.\n");
for (i = 0; i < HDSPM_MIXER_CHANNELS; i++) { for (i = 0; i < HDSPM_MIXER_CHANNELS; i++) {
if (hdspm_write_pb_gain(hdspm, i, i, UNITY_GAIN)) if (hdspm_write_pb_gain(hdspm, i, i, UNITY_GAIN))
...@@ -3392,20 +3448,16 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id) ...@@ -3392,20 +3448,16 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
if (audio) { if (audio) {
if (hdspm->capture_substream) if (hdspm->capture_substream)
snd_pcm_period_elapsed(hdspm->pcm-> snd_pcm_period_elapsed(hdspm->capture_substream);
streams
[SNDRV_PCM_STREAM_CAPTURE].
substream);
if (hdspm->playback_substream) if (hdspm->playback_substream)
snd_pcm_period_elapsed(hdspm->pcm-> snd_pcm_period_elapsed(hdspm->playback_substream);
streams
[SNDRV_PCM_STREAM_PLAYBACK].
substream);
} }
if (midi0 && midi0status) { if (midi0 && midi0status) {
/* we disable interrupts for this input until processing is done */ /* we disable interrupts for this input until processing
* is done
*/
hdspm->control_register &= ~HDSPM_Midi0InterruptEnable; hdspm->control_register &= ~HDSPM_Midi0InterruptEnable;
hdspm_write(hdspm, HDSPM_controlRegister, hdspm_write(hdspm, HDSPM_controlRegister,
hdspm->control_register); hdspm->control_register);
...@@ -3413,7 +3465,9 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id) ...@@ -3413,7 +3465,9 @@ static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
schedule = 1; schedule = 1;
} }
if (midi1 && midi1status) { if (midi1 && midi1status) {
/* we disable interrupts for this input until processing is done */ /* we disable interrupts for this input until processing
* is done
*/
hdspm->control_register &= ~HDSPM_Midi1InterruptEnable; hdspm->control_register &= ~HDSPM_Midi1InterruptEnable;
hdspm_write(hdspm, HDSPM_controlRegister, hdspm_write(hdspm, HDSPM_controlRegister,
hdspm->control_register); hdspm->control_register);
...@@ -3445,16 +3499,16 @@ static char *hdspm_channel_buffer_location(struct hdspm * hdspm, ...@@ -3445,16 +3499,16 @@ static char *hdspm_channel_buffer_location(struct hdspm * hdspm,
snd_assert(channel >= 0 snd_assert(channel >= 0
|| channel < HDSPM_MAX_CHANNELS, return NULL); || channel < HDSPM_MAX_CHANNELS, return NULL);
if ((mapped_channel = hdspm->channel_map[channel]) < 0) mapped_channel = hdspm->channel_map[channel];
if (mapped_channel < 0)
return NULL; return NULL;
if (stream == SNDRV_PCM_STREAM_CAPTURE) { if (stream == SNDRV_PCM_STREAM_CAPTURE)
return hdspm->capture_buffer + return hdspm->capture_buffer +
mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES; mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
} else { else
return hdspm->playback_buffer + return hdspm->playback_buffer +
mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES; mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
}
} }
...@@ -3469,9 +3523,9 @@ static int snd_hdspm_playback_copy(struct snd_pcm_substream *substream, ...@@ -3469,9 +3523,9 @@ static int snd_hdspm_playback_copy(struct snd_pcm_substream *substream,
snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4, snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4,
return -EINVAL); return -EINVAL);
channel_buf = hdspm_channel_buffer_location(hdspm, channel_buf =
substream->pstr-> hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
stream, channel); channel);
snd_assert(channel_buf != NULL, return -EIO); snd_assert(channel_buf != NULL, return -EIO);
...@@ -3488,9 +3542,9 @@ static int snd_hdspm_capture_copy(struct snd_pcm_substream *substream, ...@@ -3488,9 +3542,9 @@ static int snd_hdspm_capture_copy(struct snd_pcm_substream *substream,
snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4, snd_assert(pos + count <= HDSPM_CHANNEL_BUFFER_BYTES / 4,
return -EINVAL); return -EINVAL);
channel_buf = hdspm_channel_buffer_location(hdspm, channel_buf =
substream->pstr-> hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
stream, channel); channel);
snd_assert(channel_buf != NULL, return -EIO); snd_assert(channel_buf != NULL, return -EIO);
return copy_to_user(dst, channel_buf + pos * 4, count * 4); return copy_to_user(dst, channel_buf + pos * 4, count * 4);
} }
...@@ -3503,8 +3557,8 @@ static int snd_hdspm_hw_silence(struct snd_pcm_substream *substream, ...@@ -3503,8 +3557,8 @@ static int snd_hdspm_hw_silence(struct snd_pcm_substream *substream,
char *channel_buf; char *channel_buf;
channel_buf = channel_buf =
hdspm_channel_buffer_location(hdspm, substream->pstr->stream, hdspm_channel_buffer_location(hdspm, substream->pstr->stream,
channel); channel);
snd_assert(channel_buf != NULL, return -EIO); snd_assert(channel_buf != NULL, return -EIO);
memset(channel_buf + pos * 4, 0, count * 4); memset(channel_buf + pos * 4, 0, count * 4);
return 0; return 0;
...@@ -3560,7 +3614,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3560,7 +3614,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
other_pid = hdspm->playback_pid; other_pid = hdspm->playback_pid;
} }
if ((other_pid > 0) && (this_pid != other_pid)) { if (other_pid > 0 && this_pid != other_pid) {
/* The other stream is open, and not by the same /* The other stream is open, and not by the same
task as this one. Make sure that the parameters task as this one. Make sure that the parameters
...@@ -3577,7 +3631,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3577,7 +3631,7 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
if (params_period_size(params) != hdspm->period_bytes / 4) { if (params_period_size(params) != hdspm->period_bytes / 4) {
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
_snd_pcm_hw_param_setempty(params, _snd_pcm_hw_param_setempty(params,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE); SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
return -EBUSY; return -EBUSY;
} }
...@@ -3588,7 +3642,8 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3588,7 +3642,8 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
/* how to make sure that the rate matches an externally-set one ? */ /* how to make sure that the rate matches an externally-set one ? */
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
if ((err = hdspm_set_rate(hdspm, params_rate(params), 0)) < 0) { err = hdspm_set_rate(hdspm, params_rate(params), 0);
if (err < 0) {
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
_snd_pcm_hw_param_setempty(params, _snd_pcm_hw_param_setempty(params,
SNDRV_PCM_HW_PARAM_RATE); SNDRV_PCM_HW_PARAM_RATE);
...@@ -3596,16 +3651,17 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream, ...@@ -3596,16 +3651,17 @@ static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
} }
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
if ((err = err = hdspm_set_interrupt_interval(hdspm,
hdspm_set_interrupt_interval(hdspm, params_period_size(params));
params_period_size(params))) < if (err < 0) {
0) {
_snd_pcm_hw_param_setempty(params, _snd_pcm_hw_param_setempty(params,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE); SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
return err; return err;
} }
/* Memory allocation, takashi's method, dont know if we should spinlock */ /* Memory allocation, takashi's method, dont know if we should
* spinlock
*/
/* malloc all buffer even if not enabled to get sure */ /* malloc all buffer even if not enabled to get sure */
/* Update for MADI rev 204: we need to allocate for all channels, /* Update for MADI rev 204: we need to allocate for all channels,
* otherwise it doesn't work at 96kHz */ * otherwise it doesn't work at 96kHz */
...@@ -3690,7 +3746,8 @@ static int snd_hdspm_channel_info(struct snd_pcm_substream *substream, ...@@ -3690,7 +3746,8 @@ static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
snd_assert(info->channel < HDSPM_MAX_CHANNELS, return -EINVAL); snd_assert(info->channel < HDSPM_MAX_CHANNELS, return -EINVAL);
if ((mapped_channel = hdspm->channel_map[info->channel]) < 0) mapped_channel = hdspm->channel_map[info->channel];
if (mapped_channel < 0)
return -EINVAL; return -EINVAL;
info->offset = mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES; info->offset = mapped_channel * HDSPM_CHANNEL_BUFFER_BYTES;
...@@ -3704,15 +3761,13 @@ static int snd_hdspm_ioctl(struct snd_pcm_substream *substream, ...@@ -3704,15 +3761,13 @@ static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
{ {
switch (cmd) { switch (cmd) {
case SNDRV_PCM_IOCTL1_RESET: case SNDRV_PCM_IOCTL1_RESET:
{ return snd_hdspm_reset(substream);
return snd_hdspm_reset(substream);
}
case SNDRV_PCM_IOCTL1_CHANNEL_INFO: case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
{ {
struct snd_pcm_channel_info *info = arg; struct snd_pcm_channel_info *info = arg;
return snd_hdspm_channel_info(substream, info); return snd_hdspm_channel_info(substream, info);
} }
default: default:
break; break;
} }
...@@ -3923,9 +3978,12 @@ static int snd_hdspm_hw_rule_channels(struct snd_pcm_hw_params *params, ...@@ -3923,9 +3978,12 @@ static int snd_hdspm_hw_rule_channels(struct snd_pcm_hw_params *params,
} }
static unsigned int hdspm_aes32_sample_rates[] = { 32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000 }; static unsigned int hdspm_aes32_sample_rates[] = {
32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
};
static struct snd_pcm_hw_constraint_list hdspm_hw_constraints_aes32_sample_rates = { static struct snd_pcm_hw_constraint_list
hdspm_hw_constraints_aes32_sample_rates = {
.count = ARRAY_SIZE(hdspm_aes32_sample_rates), .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
.list = hdspm_aes32_sample_rates, .list = hdspm_aes32_sample_rates,
.mask = 0 .mask = 0
...@@ -4051,7 +4109,7 @@ static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep * hw, struct file *file) ...@@ -4051,7 +4109,7 @@ static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep * hw, struct file *file)
static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct hdspm *hdspm = (struct hdspm *) hw->private_data; struct hdspm *hdspm = hw->private_data;
struct hdspm_mixer_ioctl mixer; struct hdspm_mixer_ioctl mixer;
struct hdspm_config_info info; struct hdspm_config_info info;
struct hdspm_version hdspm_version; struct hdspm_version hdspm_version;
...@@ -4059,11 +4117,12 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, ...@@ -4059,11 +4117,12 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,
switch (cmd) { switch (cmd) {
case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS: case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
if (copy_from_user(&rms, (void __user *)arg, sizeof(rms))) if (copy_from_user(&rms, (void __user *)arg, sizeof(rms)))
return -EFAULT; return -EFAULT;
/* maybe there is a chance to memorymap in future so dont touch just copy */ /* maybe there is a chance to memorymap in future
* so dont touch just copy
*/
if(copy_to_user_fromio((void __user *)rms.peak, if(copy_to_user_fromio((void __user *)rms.peak,
hdspm->iobase+HDSPM_MADI_peakrmsbase, hdspm->iobase+HDSPM_MADI_peakrmsbase,
sizeof(struct hdspm_peak_rms)) != 0 ) sizeof(struct hdspm_peak_rms)) != 0 )
...@@ -4075,21 +4134,16 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, ...@@ -4075,21 +4134,16 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,
case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO:
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
info.pref_sync_ref = info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
(unsigned char) hdspm_pref_sync_ref(hdspm); info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
info.wordclock_sync_check =
(unsigned char) hdspm_wc_sync_check(hdspm);
info.system_sample_rate = hdspm->system_sample_rate; info.system_sample_rate = hdspm->system_sample_rate;
info.autosync_sample_rate = info.autosync_sample_rate =
hdspm_external_sample_rate(hdspm); hdspm_external_sample_rate(hdspm);
info.system_clock_mode = info.system_clock_mode = hdspm_system_clock_mode(hdspm);
(unsigned char) hdspm_system_clock_mode(hdspm); info.clock_source = hdspm_clock_source(hdspm);
info.clock_source = info.autosync_ref = hdspm_autosync_ref(hdspm);
(unsigned char) hdspm_clock_source(hdspm); info.line_out = hdspm_line_out(hdspm);
info.autosync_ref =
(unsigned char) hdspm_autosync_ref(hdspm);
info.line_out = (unsigned char) hdspm_line_out(hdspm);
info.passthru = 0; info.passthru = 0;
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
if (copy_to_user((void __user *) arg, &info, sizeof(info))) if (copy_to_user((void __user *) arg, &info, sizeof(info)))
...@@ -4106,8 +4160,8 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, ...@@ -4106,8 +4160,8 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,
case SNDRV_HDSPM_IOCTL_GET_MIXER: case SNDRV_HDSPM_IOCTL_GET_MIXER:
if (copy_from_user(&mixer, (void __user *)arg, sizeof(mixer))) if (copy_from_user(&mixer, (void __user *)arg, sizeof(mixer)))
return -EFAULT; return -EFAULT;
if (copy_to_user if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
((void __user *)mixer.mixer, hdspm->mixer, sizeof(struct hdspm_mixer))) sizeof(struct hdspm_mixer)))
return -EFAULT; return -EFAULT;
break; break;
...@@ -4150,7 +4204,8 @@ static int __devinit snd_hdspm_create_hwdep(struct snd_card *card, ...@@ -4150,7 +4204,8 @@ static int __devinit snd_hdspm_create_hwdep(struct snd_card *card,
struct snd_hwdep *hw; struct snd_hwdep *hw;
int err; int err;
if ((err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw)) < 0) err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
if (err < 0)
return err; return err;
hdspm->hwdep = hw; hdspm->hwdep = hw;
...@@ -4176,15 +4231,15 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm) ...@@ -4176,15 +4231,15 @@ static int __devinit snd_hdspm_preallocate_memory(struct hdspm * hdspm)
pcm = hdspm->pcm; pcm = hdspm->pcm;
/* wanted = HDSPM_DMA_AREA_BYTES + 4096;*/ /* dont know why, but it works */
wanted = HDSPM_DMA_AREA_BYTES; wanted = HDSPM_DMA_AREA_BYTES;
if ((err = err =
snd_pcm_lib_preallocate_pages_for_all(pcm, snd_pcm_lib_preallocate_pages_for_all(pcm,
SNDRV_DMA_TYPE_DEV_SG, SNDRV_DMA_TYPE_DEV_SG,
snd_dma_pci_data(hdspm->pci), snd_dma_pci_data(hdspm->pci),
wanted, wanted,
wanted)) < 0) { wanted);
if (err < 0) {
snd_printdd("Could not preallocate %zd Bytes\n", wanted); snd_printdd("Could not preallocate %zd Bytes\n", wanted);
return err; return err;
...@@ -4200,8 +4255,7 @@ static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf, ...@@ -4200,8 +4255,7 @@ static void hdspm_set_sgbuf(struct hdspm * hdspm, struct snd_sg_buf *sgbuf,
int i; int i;
for (i = 0; i < (channels * 16); i++) for (i = 0; i < (channels * 16); i++)
hdspm_write(hdspm, reg + 4 * i, hdspm_write(hdspm, reg + 4 * i,
snd_pcm_sgbuf_get_addr(sgbuf, snd_pcm_sgbuf_get_addr(sgbuf, (size_t) 4096 * i));
(size_t) 4096 * i));
} }
/* ------------- ALSA Devices ---------------------------- */ /* ------------- ALSA Devices ---------------------------- */
...@@ -4211,7 +4265,8 @@ static int __devinit snd_hdspm_create_pcm(struct snd_card *card, ...@@ -4211,7 +4265,8 @@ static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
struct snd_pcm *pcm; struct snd_pcm *pcm;
int err; int err;
if ((err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm)) < 0) err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
if (err < 0)
return err; return err;
hdspm->pcm = pcm; hdspm->pcm = pcm;
...@@ -4225,7 +4280,8 @@ static int __devinit snd_hdspm_create_pcm(struct snd_card *card, ...@@ -4225,7 +4280,8 @@ static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX; pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
if ((err = snd_hdspm_preallocate_memory(hdspm)) < 0) err = snd_hdspm_preallocate_memory(hdspm);
if (err < 0)
return err; return err;
return 0; return 0;
...@@ -4243,19 +4299,24 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card, ...@@ -4243,19 +4299,24 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
int err; int err;
snd_printdd("Create card...\n"); snd_printdd("Create card...\n");
if ((err = snd_hdspm_create_pcm(card, hdspm)) < 0) err = snd_hdspm_create_pcm(card, hdspm);
if (err < 0)
return err; return err;
if ((err = snd_hdspm_create_midi(card, hdspm, 0)) < 0) err = snd_hdspm_create_midi(card, hdspm, 0);
if (err < 0)
return err; return err;
if ((err = snd_hdspm_create_midi(card, hdspm, 1)) < 0) err = snd_hdspm_create_midi(card, hdspm, 1);
if (err < 0)
return err; return err;
if ((err = snd_hdspm_create_controls(card, hdspm)) < 0) err = snd_hdspm_create_controls(card, hdspm);
if (err < 0)
return err; return err;
if ((err = snd_hdspm_create_hwdep(card, hdspm)) < 0) err = snd_hdspm_create_hwdep(card, hdspm);
if (err < 0)
return err; return err;
snd_printdd("proc init...\n"); snd_printdd("proc init...\n");
...@@ -4270,7 +4331,8 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card, ...@@ -4270,7 +4331,8 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
hdspm->playback_substream = NULL; hdspm->playback_substream = NULL;
snd_printdd("Set defaults...\n"); snd_printdd("Set defaults...\n");
if ((err = snd_hdspm_set_defaults(hdspm)) < 0) err = snd_hdspm_set_defaults(hdspm);
if (err < 0)
return err; return err;
snd_printdd("Update mixer controls...\n"); snd_printdd("Update mixer controls...\n");
...@@ -4278,7 +4340,8 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card, ...@@ -4278,7 +4340,8 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
snd_printdd("Initializeing complete ???\n"); snd_printdd("Initializeing complete ???\n");
if ((err = snd_card_register(card)) < 0) { err = snd_card_register(card);
if (err < 0) {
snd_printk(KERN_ERR "HDSPM: error registering card\n"); snd_printk(KERN_ERR "HDSPM: error registering card\n");
return err; return err;
} }
...@@ -4288,36 +4351,18 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card, ...@@ -4288,36 +4351,18 @@ static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
return 0; return 0;
} }
static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdspm, static int __devinit snd_hdspm_create(struct snd_card *card,
struct hdspm *hdspm,
int precise_ptr, int enable_monitor) int precise_ptr, int enable_monitor)
{ {
struct pci_dev *pci = hdspm->pci; struct pci_dev *pci = hdspm->pci;
int err; int err;
int i;
unsigned long io_extent; unsigned long io_extent;
hdspm->irq = -1; hdspm->irq = -1;
hdspm->irq_count = 0;
hdspm->midi[0].rmidi = NULL;
hdspm->midi[1].rmidi = NULL;
hdspm->midi[0].input = NULL;
hdspm->midi[1].input = NULL;
hdspm->midi[0].output = NULL;
hdspm->midi[1].output = NULL;
spin_lock_init(&hdspm->midi[0].lock); spin_lock_init(&hdspm->midi[0].lock);
spin_lock_init(&hdspm->midi[1].lock); spin_lock_init(&hdspm->midi[1].lock);
hdspm->iobase = NULL;
hdspm->control_register = 0;
hdspm->control2_register = 0;
hdspm->playback_buffer = NULL;
hdspm->capture_buffer = NULL;
for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
hdspm->playback_mixer_ctls[i] = NULL;
hdspm->mixer = NULL;
hdspm->card = card; hdspm->card = card;
...@@ -4340,12 +4385,14 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp ...@@ -4340,12 +4385,14 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
hdspm->card_name = "RME HDSPM MADI"; hdspm->card_name = "RME HDSPM MADI";
} }
if ((err = pci_enable_device(pci)) < 0) err = pci_enable_device(pci);
if (err < 0)
return err; return err;
pci_set_master(hdspm->pci); pci_set_master(hdspm->pci);
if ((err = pci_request_regions(pci, "hdspm")) < 0) err = pci_request_regions(pci, "hdspm");
if (err < 0)
return err; return err;
hdspm->port = pci_resource_start(pci, 0); hdspm->port = pci_resource_start(pci, 0);
...@@ -4355,8 +4402,10 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp ...@@ -4355,8 +4402,10 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
hdspm->port, hdspm->port + io_extent - 1); hdspm->port, hdspm->port + io_extent - 1);
if ((hdspm->iobase = ioremap_nocache(hdspm->port, io_extent)) == NULL) { hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
snd_printk(KERN_ERR "HDSPM: unable to remap region 0x%lx-0x%lx\n", if (!hdspm->iobase) {
snd_printk(KERN_ERR "HDSPM: "
"unable to remap region 0x%lx-0x%lx\n",
hdspm->port, hdspm->port + io_extent - 1); hdspm->port, hdspm->port + io_extent - 1);
return -EBUSY; return -EBUSY;
} }
...@@ -4379,9 +4428,10 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp ...@@ -4379,9 +4428,10 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
snd_printdd("kmalloc Mixer memory of %zd Bytes\n", snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
sizeof(struct hdspm_mixer)); sizeof(struct hdspm_mixer));
if ((hdspm->mixer = kmalloc(sizeof(struct hdspm_mixer), GFP_KERNEL)) hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
== NULL) { if (!hdspm->mixer) {
snd_printk(KERN_ERR "HDSPM: unable to kmalloc Mixer memory of %d Bytes\n", snd_printk(KERN_ERR "HDSPM: "
"unable to kmalloc Mixer memory of %d Bytes\n",
(int)sizeof(struct hdspm_mixer)); (int)sizeof(struct hdspm_mixer));
return err; return err;
} }
...@@ -4391,7 +4441,8 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp ...@@ -4391,7 +4441,8 @@ static int __devinit snd_hdspm_create(struct snd_card *card, struct hdspm * hdsp
hdspm->qs_channels = MADI_QS_CHANNELS; hdspm->qs_channels = MADI_QS_CHANNELS;
snd_printdd("create alsa devices.\n"); snd_printdd("create alsa devices.\n");
if ((err = snd_hdspm_create_alsa_devices(card, hdspm)) < 0) err = snd_hdspm_create_alsa_devices(card, hdspm);
if (err < 0)
return err; return err;
snd_hdspm_initialize_midi_flush(hdspm); snd_hdspm_initialize_midi_flush(hdspm);
...@@ -4406,9 +4457,8 @@ static int snd_hdspm_free(struct hdspm * hdspm) ...@@ -4406,9 +4457,8 @@ static int snd_hdspm_free(struct hdspm * hdspm)
/* stop th audio, and cancel all interrupts */ /* stop th audio, and cancel all interrupts */
hdspm->control_register &= hdspm->control_register &=
~(HDSPM_Start | HDSPM_AudioInterruptEnable ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
| HDSPM_Midi0InterruptEnable | HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable);
HDSPM_Midi1InterruptEnable);
hdspm_write(hdspm, HDSPM_controlRegister, hdspm_write(hdspm, HDSPM_controlRegister,
hdspm->control_register); hdspm->control_register);
} }
...@@ -4416,7 +4466,6 @@ static int snd_hdspm_free(struct hdspm * hdspm) ...@@ -4416,7 +4466,6 @@ static int snd_hdspm_free(struct hdspm * hdspm)
if (hdspm->irq >= 0) if (hdspm->irq >= 0)
free_irq(hdspm->irq, (void *) hdspm); free_irq(hdspm->irq, (void *) hdspm);
kfree(hdspm->mixer); kfree(hdspm->mixer);
if (hdspm->iobase) if (hdspm->iobase)
...@@ -4431,7 +4480,7 @@ static int snd_hdspm_free(struct hdspm * hdspm) ...@@ -4431,7 +4480,7 @@ static int snd_hdspm_free(struct hdspm * hdspm)
static void snd_hdspm_card_free(struct snd_card *card) static void snd_hdspm_card_free(struct snd_card *card)
{ {
struct hdspm *hdspm = (struct hdspm *) card->private_data; struct hdspm *hdspm = card->private_data;
if (hdspm) if (hdspm)
snd_hdspm_free(hdspm); snd_hdspm_free(hdspm);
...@@ -4452,20 +4501,21 @@ static int __devinit snd_hdspm_probe(struct pci_dev *pci, ...@@ -4452,20 +4501,21 @@ static int __devinit snd_hdspm_probe(struct pci_dev *pci,
return -ENOENT; return -ENOENT;
} }
if (!(card = snd_card_new(index[dev], id[dev], card = snd_card_new(index[dev], id[dev],
THIS_MODULE, sizeof(struct hdspm)))) THIS_MODULE, sizeof(struct hdspm));
if (!card)
return -ENOMEM; return -ENOMEM;
hdspm = (struct hdspm *) card->private_data; hdspm = card->private_data;
card->private_free = snd_hdspm_card_free; card->private_free = snd_hdspm_card_free;
hdspm->dev = dev; hdspm->dev = dev;
hdspm->pci = pci; hdspm->pci = pci;
snd_card_set_dev(card, &pci->dev); snd_card_set_dev(card, &pci->dev);
if ((err = err = snd_hdspm_create(card, hdspm, precise_ptr[dev],
snd_hdspm_create(card, hdspm, precise_ptr[dev], enable_monitor[dev]);
enable_monitor[dev])) < 0) { if (err < 0) {
snd_card_free(card); snd_card_free(card);
return err; return err;
} }
...@@ -4474,7 +4524,8 @@ static int __devinit snd_hdspm_probe(struct pci_dev *pci, ...@@ -4474,7 +4524,8 @@ static int __devinit snd_hdspm_probe(struct pci_dev *pci,
sprintf(card->longname, "%s at 0x%lx, irq %d", hdspm->card_name, sprintf(card->longname, "%s at 0x%lx, irq %d", hdspm->card_name,
hdspm->port, hdspm->irq); hdspm->port, hdspm->irq);
if ((err = snd_card_register(card)) < 0) { err = snd_card_register(card);
if (err < 0) {
snd_card_free(card); snd_card_free(card);
return err; return err;
} }
......
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