Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   ALSA driver for RME Hammerfall DSP MADI audio interface(s)
0004  *
0005  *      Copyright (c) 2003 Winfried Ritsch (IEM)
0006  *      code based on hdsp.c   Paul Davis
0007  *                             Marcus Andersson
0008  *                             Thomas Charbonnel
0009  *      Modified 2006-06-01 for AES32 support by Remy Bruno
0010  *                                               <remy.bruno@trinnov.com>
0011  *
0012  *      Modified 2009-04-13 for proper metering by Florian Faber
0013  *                                               <faber@faberman.de>
0014  *
0015  *      Modified 2009-04-14 for native float support by Florian Faber
0016  *                                               <faber@faberman.de>
0017  *
0018  *      Modified 2009-04-26 fixed bug in rms metering by Florian Faber
0019  *                                               <faber@faberman.de>
0020  *
0021  *      Modified 2009-04-30 added hw serial number support by Florian Faber
0022  *
0023  *      Modified 2011-01-14 added S/PDIF input on RayDATs by Adrian Knoth
0024  *
0025  *  Modified 2011-01-25 variable period sizes on RayDAT/AIO by Adrian Knoth
0026  *
0027  *      Modified 2019-05-23 fix AIO single speed ADAT capture and playback
0028  *      by Philippe.Bekaert@uhasselt.be
0029  */
0030 
0031 /* *************    Register Documentation   *******************************************************
0032  *
0033  * Work in progress! Documentation is based on the code in this file.
0034  *
0035  * --------- HDSPM_controlRegister ---------
0036  * :7654.3210:7654.3210:7654.3210:7654.3210: bit number per byte
0037  * :||||.||||:||||.||||:||||.||||:||||.||||:
0038  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number
0039  * :1098.7654:3210.9876:5432.1098:7654.3210: 0..31
0040  * :||||.||||:||||.||||:||||.||||:||||.||||:
0041  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
0042  * :    .    :    .    :    .    :  x .    :  HDSPM_AudioInterruptEnable \_ setting both bits
0043  * :    .    :    .    :    .    :    .   x:  HDSPM_Start                /  enables audio IO
0044  * :    .    :    .    :    .    :   x.    :  HDSPM_ClockModeMaster - 1: Master, 0: Slave
0045  * :    .    :    .    :    .    :    .210 :  HDSPM_LatencyMask - 3 Bit value for latency
0046  * :    .    :    .    :    .    :    .    :      0:64, 1:128, 2:256, 3:512,
0047  * :    .    :    .    :    .    :    .    :      4:1024, 5:2048, 6:4096, 7:8192
0048  * :x   .    :    .    :    .   x:xx  .    :  HDSPM_FrequencyMask
0049  * :    .    :    .    :    .    :10  .    :  HDSPM_Frequency1|HDSPM_Frequency0: 1=32K,2=44.1K,3=48K,0=??
0050  * :    .    :    .    :    .   x:    .    :  <MADI> HDSPM_DoubleSpeed
0051  * :x   .    :    .    :    .    :    .    :  <MADI> HDSPM_QuadSpeed
0052  * :    .  3 :    .  10:  2 .    :    .    :  HDSPM_SyncRefMask :
0053  * :    .    :    .   x:    .    :    .    :  HDSPM_SyncRef0
0054  * :    .    :    .  x :    .    :    .    :  HDSPM_SyncRef1
0055  * :    .    :    .    :  x .    :    .    :  <AES32> HDSPM_SyncRef2
0056  * :    .  x :    .    :    .    :    .    :  <AES32> HDSPM_SyncRef3
0057  * :    .    :    .  10:    .    :    .    :  <MADI> sync ref: 0:WC, 1:Madi, 2:TCO, 3:SyncIn
0058  * :    .  3 :    .  10:  2 .    :    .    :  <AES32>  0:WC, 1:AES1 ... 8:AES8, 9: TCO, 10:SyncIn?
0059  * :    .  x :    .    :    .    :    .    :  <MADIe> HDSPe_FLOAT_FORMAT
0060  * :    .    :    .    : x  .    :    .    :  <MADI> HDSPM_InputSelect0 : 0=optical,1=coax
0061  * :    .    :    .    :x   .    :    .    :  <MADI> HDSPM_InputSelect1
0062  * :    .    :    .x   :    .    :    .    :  <MADI> HDSPM_clr_tms
0063  * :    .    :    .    :    . x  :    .    :  <MADI> HDSPM_TX_64ch
0064  * :    .    :    .    :    . x  :    .    :  <AES32> HDSPM_Emphasis
0065  * :    .    :    .    :    .x   :    .    :  <MADI> HDSPM_AutoInp
0066  * :    .    :    . x  :    .    :    .    :  <MADI> HDSPM_SMUX
0067  * :    .    :    .x   :    .    :    .    :  <MADI> HDSPM_clr_tms
0068  * :    .    :   x.    :    .    :    .    :  <MADI> HDSPM_taxi_reset
0069  * :    .   x:    .    :    .    :    .    :  <MADI> HDSPM_LineOut
0070  * :    .   x:    .    :    .    :    .    :  <AES32> ??????????????????
0071  * :    .    :   x.    :    .    :    .    :  <AES32> HDSPM_WCK48
0072  * :    .    :    .    :    .x   :    .    :  <AES32> HDSPM_Dolby
0073  * :    .    : x  .    :    .    :    .    :  HDSPM_Midi0InterruptEnable
0074  * :    .    :x   .    :    .    :    .    :  HDSPM_Midi1InterruptEnable
0075  * :    .    :  x .    :    .    :    .    :  HDSPM_Midi2InterruptEnable
0076  * :    . x  :    .    :    .    :    .    :  <MADI> HDSPM_Midi3InterruptEnable
0077  * :    . x  :    .    :    .    :    .    :  <AES32> HDSPM_DS_DoubleWire
0078  * :    .x   :    .    :    .    :    .    :  <AES32> HDSPM_QS_DoubleWire
0079  * :   x.    :    .    :    .    :    .    :  <AES32> HDSPM_QS_QuadWire
0080  * :    .    :    .    :    .  x :    .    :  <AES32> HDSPM_Professional
0081  * : x  .    :    .    :    .    :    .    :  HDSPM_wclk_sel
0082  * :    .    :    .    :    .    :    .    :
0083  * :7654.3210:7654.3210:7654.3210:7654.3210: bit number per byte
0084  * :||||.||||:||||.||||:||||.||||:||||.||||:
0085  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number
0086  * :1098.7654:3210.9876:5432.1098:7654.3210: 0..31
0087  * :||||.||||:||||.||||:||||.||||:||||.||||:
0088  * :8421.8421:8421.8421:8421.8421:8421.8421:hex digit
0089  *
0090  *
0091  *
0092  * AIO / RayDAT only
0093  *
0094  * ------------ HDSPM_WR_SETTINGS ----------
0095  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number per byte
0096  * :1098.7654:3210.9876:5432.1098:7654.3210:
0097  * :||||.||||:||||.||||:||||.||||:||||.||||: bit number
0098  * :7654.3210:7654.3210:7654.3210:7654.3210: 0..31
0099  * :||||.||||:||||.||||:||||.||||:||||.||||:
0100  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
0101  * :    .    :    .    :    .    :    .   x: HDSPM_c0Master 1: Master, 0: Slave
0102  * :    .    :    .    :    .    :    .  x : HDSPM_c0_SyncRef0
0103  * :    .    :    .    :    .    :    . x  : HDSPM_c0_SyncRef1
0104  * :    .    :    .    :    .    :    .x   : HDSPM_c0_SyncRef2
0105  * :    .    :    .    :    .    :   x.    : HDSPM_c0_SyncRef3
0106  * :    .    :    .    :    .    :   3.210 : HDSPM_c0_SyncRefMask:
0107  * :    .    :    .    :    .    :    .    :  RayDat: 0:WC, 1:AES, 2:SPDIF, 3..6: ADAT1..4,
0108  * :    .    :    .    :    .    :    .    :          9:TCO, 10:SyncIn
0109  * :    .    :    .    :    .    :    .    :  AIO: 0:WC, 1:AES, 2: SPDIF, 3: ATAT,
0110  * :    .    :    .    :    .    :    .    :          9:TCO, 10:SyncIn
0111  * :    .    :    .    :    .    :    .    :
0112  * :    .    :    .    :    .    :    .    :
0113  * :3322.2222:2222.1111:1111.1100:0000.0000: bit number per byte
0114  * :1098.7654:3210.9876:5432.1098:7654.3210:
0115  * :||||.||||:||||.||||:||||.||||:||||.||||: bit number
0116  * :7654.3210:7654.3210:7654.3210:7654.3210: 0..31
0117  * :||||.||||:||||.||||:||||.||||:||||.||||:
0118  * :8421.8421:8421.8421:8421.8421:8421.8421: hex digit
0119  *
0120  */
0121 #include <linux/init.h>
0122 #include <linux/delay.h>
0123 #include <linux/interrupt.h>
0124 #include <linux/module.h>
0125 #include <linux/slab.h>
0126 #include <linux/pci.h>
0127 #include <linux/math64.h>
0128 #include <linux/io.h>
0129 #include <linux/nospec.h>
0130 
0131 #include <sound/core.h>
0132 #include <sound/control.h>
0133 #include <sound/pcm.h>
0134 #include <sound/pcm_params.h>
0135 #include <sound/info.h>
0136 #include <sound/asoundef.h>
0137 #include <sound/rawmidi.h>
0138 #include <sound/hwdep.h>
0139 #include <sound/initval.h>
0140 
0141 #include <sound/hdspm.h>
0142 
0143 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;    /* Index 0-MAX */
0144 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;     /* ID for this card */
0145 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
0146 
0147 module_param_array(index, int, NULL, 0444);
0148 MODULE_PARM_DESC(index, "Index value for RME HDSPM interface.");
0149 
0150 module_param_array(id, charp, NULL, 0444);
0151 MODULE_PARM_DESC(id, "ID string for RME HDSPM interface.");
0152 
0153 module_param_array(enable, bool, NULL, 0444);
0154 MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards.");
0155 
0156 
0157 MODULE_AUTHOR
0158 (
0159     "Winfried Ritsch <ritsch_AT_iem.at>, "
0160     "Paul Davis <paul@linuxaudiosystems.com>, "
0161     "Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, "
0162     "Remy Bruno <remy.bruno@trinnov.com>, "
0163     "Florian Faber <faberman@linuxproaudio.org>, "
0164     "Adrian Knoth <adi@drcomp.erfurt.thur.de>"
0165 );
0166 MODULE_DESCRIPTION("RME HDSPM");
0167 MODULE_LICENSE("GPL");
0168 
0169 /* --- Write registers. ---
0170   These are defined as byte-offsets from the iobase value.  */
0171 
0172 #define HDSPM_WR_SETTINGS             0
0173 #define HDSPM_outputBufferAddress    32
0174 #define HDSPM_inputBufferAddress     36
0175 #define HDSPM_controlRegister        64
0176 #define HDSPM_interruptConfirmation  96
0177 #define HDSPM_control2Reg        256  /* not in specs ???????? */
0178 #define HDSPM_freqReg                256  /* for setting arbitrary clock values (DDS feature) */
0179 #define HDSPM_midiDataOut0       352  /* just believe in old code */
0180 #define HDSPM_midiDataOut1       356
0181 #define HDSPM_eeprom_wr          384  /* for AES32 */
0182 
0183 /* DMA enable for 64 channels, only Bit 0 is relevant */
0184 #define HDSPM_outputEnableBase       512  /* 512-767  input  DMA */
0185 #define HDSPM_inputEnableBase        768  /* 768-1023 output DMA */
0186 
0187 /* 16 page addresses for each of the 64 channels DMA buffer in and out
0188    (each 64k=16*4k) Buffer must be 4k aligned (which is default i386 ????) */
0189 #define HDSPM_pageAddressBufferOut       8192
0190 #define HDSPM_pageAddressBufferIn        (HDSPM_pageAddressBufferOut+64*16*4)
0191 
0192 #define HDSPM_MADI_mixerBase    32768   /* 32768-65535 for 2x64x64 Fader */
0193 
0194 #define HDSPM_MATRIX_MIXER_SIZE  8192   /* = 2*64*64 * 4 Byte => 32kB */
0195 
0196 /* --- Read registers. ---
0197    These are defined as byte-offsets from the iobase value */
0198 #define HDSPM_statusRegister    0
0199 /*#define HDSPM_statusRegister2  96 */
0200 /* after RME Windows driver sources, status2 is 4-byte word # 48 = word at
0201  * offset 192, for AES32 *and* MADI
0202  * => need to check that offset 192 is working on MADI */
0203 #define HDSPM_statusRegister2  192
0204 #define HDSPM_timecodeRegister 128
0205 
0206 /* AIO, RayDAT */
0207 #define HDSPM_RD_STATUS_0 0
0208 #define HDSPM_RD_STATUS_1 64
0209 #define HDSPM_RD_STATUS_2 128
0210 #define HDSPM_RD_STATUS_3 192
0211 
0212 #define HDSPM_RD_TCO           256
0213 #define HDSPM_RD_PLL_FREQ      512
0214 #define HDSPM_WR_TCO           128
0215 
0216 #define HDSPM_TCO1_TCO_lock         0x00000001
0217 #define HDSPM_TCO1_WCK_Input_Range_LSB      0x00000002
0218 #define HDSPM_TCO1_WCK_Input_Range_MSB      0x00000004
0219 #define HDSPM_TCO1_LTC_Input_valid      0x00000008
0220 #define HDSPM_TCO1_WCK_Input_valid      0x00000010
0221 #define HDSPM_TCO1_Video_Input_Format_NTSC  0x00000020
0222 #define HDSPM_TCO1_Video_Input_Format_PAL   0x00000040
0223 
0224 #define HDSPM_TCO1_set_TC           0x00000100
0225 #define HDSPM_TCO1_set_drop_frame_flag      0x00000200
0226 #define HDSPM_TCO1_LTC_Format_LSB       0x00000400
0227 #define HDSPM_TCO1_LTC_Format_MSB       0x00000800
0228 
0229 #define HDSPM_TCO2_TC_run           0x00010000
0230 #define HDSPM_TCO2_WCK_IO_ratio_LSB     0x00020000
0231 #define HDSPM_TCO2_WCK_IO_ratio_MSB     0x00040000
0232 #define HDSPM_TCO2_set_num_drop_frames_LSB  0x00080000
0233 #define HDSPM_TCO2_set_num_drop_frames_MSB  0x00100000
0234 #define HDSPM_TCO2_set_jam_sync         0x00200000
0235 #define HDSPM_TCO2_set_flywheel         0x00400000
0236 
0237 #define HDSPM_TCO2_set_01_4         0x01000000
0238 #define HDSPM_TCO2_set_pull_down        0x02000000
0239 #define HDSPM_TCO2_set_pull_up          0x04000000
0240 #define HDSPM_TCO2_set_freq         0x08000000
0241 #define HDSPM_TCO2_set_term_75R         0x10000000
0242 #define HDSPM_TCO2_set_input_LSB        0x20000000
0243 #define HDSPM_TCO2_set_input_MSB        0x40000000
0244 #define HDSPM_TCO2_set_freq_from_app        0x80000000
0245 
0246 
0247 #define HDSPM_midiDataOut0    352
0248 #define HDSPM_midiDataOut1    356
0249 #define HDSPM_midiDataOut2    368
0250 
0251 #define HDSPM_midiDataIn0     360
0252 #define HDSPM_midiDataIn1     364
0253 #define HDSPM_midiDataIn2     372
0254 #define HDSPM_midiDataIn3     376
0255 
0256 /* status is data bytes in MIDI-FIFO (0-128) */
0257 #define HDSPM_midiStatusOut0  384
0258 #define HDSPM_midiStatusOut1  388
0259 #define HDSPM_midiStatusOut2  400
0260 
0261 #define HDSPM_midiStatusIn0   392
0262 #define HDSPM_midiStatusIn1   396
0263 #define HDSPM_midiStatusIn2   404
0264 #define HDSPM_midiStatusIn3   408
0265 
0266 
0267 /* the meters are regular i/o-mapped registers, but offset
0268    considerably from the rest. the peak registers are reset
0269    when read; the least-significant 4 bits are full-scale counters;
0270    the actual peak value is in the most-significant 24 bits.
0271 */
0272 
0273 #define HDSPM_MADI_INPUT_PEAK       4096
0274 #define HDSPM_MADI_PLAYBACK_PEAK    4352
0275 #define HDSPM_MADI_OUTPUT_PEAK      4608
0276 
0277 #define HDSPM_MADI_INPUT_RMS_L      6144
0278 #define HDSPM_MADI_PLAYBACK_RMS_L   6400
0279 #define HDSPM_MADI_OUTPUT_RMS_L     6656
0280 
0281 #define HDSPM_MADI_INPUT_RMS_H      7168
0282 #define HDSPM_MADI_PLAYBACK_RMS_H   7424
0283 #define HDSPM_MADI_OUTPUT_RMS_H     7680
0284 
0285 /* --- Control Register bits --------- */
0286 #define HDSPM_Start                (1<<0) /* start engine */
0287 
0288 #define HDSPM_Latency0             (1<<1) /* buffer size = 2^n */
0289 #define HDSPM_Latency1             (1<<2) /* where n is defined */
0290 #define HDSPM_Latency2             (1<<3) /* by Latency{2,1,0} */
0291 
0292 #define HDSPM_ClockModeMaster      (1<<4) /* 1=Master, 0=Autosync */
0293 #define HDSPM_c0Master      0x1    /* Master clock bit in settings
0294                       register [RayDAT, AIO] */
0295 
0296 #define HDSPM_AudioInterruptEnable (1<<5) /* what do you think ? */
0297 
0298 #define HDSPM_Frequency0  (1<<6)  /* 0=44.1kHz/88.2kHz 1=48kHz/96kHz */
0299 #define HDSPM_Frequency1  (1<<7)  /* 0=32kHz/64kHz */
0300 #define HDSPM_DoubleSpeed (1<<8)  /* 0=normal speed, 1=double speed */
0301 #define HDSPM_QuadSpeed   (1<<31) /* quad speed bit */
0302 
0303 #define HDSPM_Professional (1<<9) /* Professional */ /* AES32 ONLY */
0304 #define HDSPM_TX_64ch     (1<<10) /* Output 64channel MODE=1,
0305                      56channelMODE=0 */ /* MADI ONLY*/
0306 #define HDSPM_Emphasis    (1<<10) /* Emphasis */ /* AES32 ONLY */
0307 
0308 #define HDSPM_AutoInp     (1<<11) /* Auto Input (takeover) == Safe Mode,
0309                                      0=off, 1=on  */ /* MADI ONLY */
0310 #define HDSPM_Dolby       (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */
0311 
0312 #define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
0313                     * -- MADI ONLY
0314                     */
0315 #define HDSPM_InputSelect1 (1<<15) /* should be 0 */
0316 
0317 #define HDSPM_SyncRef2     (1<<13)
0318 #define HDSPM_SyncRef3     (1<<25)
0319 
0320 #define HDSPM_SMUX         (1<<18) /* Frame ??? */ /* MADI ONY */
0321 #define HDSPM_clr_tms      (1<<19) /* clear track marker, do not use
0322                                       AES additional bits in
0323                       lower 5 Audiodatabits ??? */
0324 #define HDSPM_taxi_reset   (1<<20) /* ??? */ /* MADI ONLY ? */
0325 #define HDSPM_WCK48        (1<<20) /* Frame ??? = HDSPM_SMUX */ /* AES32 ONLY */
0326 
0327 #define HDSPM_Midi0InterruptEnable 0x0400000
0328 #define HDSPM_Midi1InterruptEnable 0x0800000
0329 #define HDSPM_Midi2InterruptEnable 0x0200000
0330 #define HDSPM_Midi3InterruptEnable 0x4000000
0331 
0332 #define HDSPM_LineOut (1<<24) /* Analog Out on channel 63/64 on=1, mute=0 */
0333 #define HDSPe_FLOAT_FORMAT         0x2000000
0334 
0335 #define HDSPM_DS_DoubleWire (1<<26) /* AES32 ONLY */
0336 #define HDSPM_QS_DoubleWire (1<<27) /* AES32 ONLY */
0337 #define HDSPM_QS_QuadWire   (1<<28) /* AES32 ONLY */
0338 
0339 #define HDSPM_wclk_sel (1<<30)
0340 
0341 /* additional control register bits for AIO*/
0342 #define HDSPM_c0_Wck48              0x20 /* also RayDAT */
0343 #define HDSPM_c0_Input0             0x1000
0344 #define HDSPM_c0_Input1             0x2000
0345 #define HDSPM_c0_Spdif_Opt          0x4000
0346 #define HDSPM_c0_Pro                0x8000
0347 #define HDSPM_c0_clr_tms            0x10000
0348 #define HDSPM_c0_AEB1               0x20000
0349 #define HDSPM_c0_AEB2               0x40000
0350 #define HDSPM_c0_LineOut            0x80000
0351 #define HDSPM_c0_AD_GAIN0           0x100000
0352 #define HDSPM_c0_AD_GAIN1           0x200000
0353 #define HDSPM_c0_DA_GAIN0           0x400000
0354 #define HDSPM_c0_DA_GAIN1           0x800000
0355 #define HDSPM_c0_PH_GAIN0           0x1000000
0356 #define HDSPM_c0_PH_GAIN1           0x2000000
0357 #define HDSPM_c0_Sym6db             0x4000000
0358 
0359 
0360 /* --- bit helper defines */
0361 #define HDSPM_LatencyMask    (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
0362 #define HDSPM_FrequencyMask  (HDSPM_Frequency0|HDSPM_Frequency1|\
0363                   HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
0364 #define HDSPM_InputMask      (HDSPM_InputSelect0|HDSPM_InputSelect1)
0365 #define HDSPM_InputOptical   0
0366 #define HDSPM_InputCoaxial   (HDSPM_InputSelect0)
0367 #define HDSPM_SyncRefMask    (HDSPM_SyncRef0|HDSPM_SyncRef1|\
0368                   HDSPM_SyncRef2|HDSPM_SyncRef3)
0369 
0370 #define HDSPM_c0_SyncRef0      0x2
0371 #define HDSPM_c0_SyncRef1      0x4
0372 #define HDSPM_c0_SyncRef2      0x8
0373 #define HDSPM_c0_SyncRef3      0x10
0374 #define HDSPM_c0_SyncRefMask   (HDSPM_c0_SyncRef0 | HDSPM_c0_SyncRef1 |\
0375                 HDSPM_c0_SyncRef2 | HDSPM_c0_SyncRef3)
0376 
0377 #define HDSPM_SYNC_FROM_WORD    0   /* Preferred sync reference */
0378 #define HDSPM_SYNC_FROM_MADI    1   /* choices - used by "pref_sync_ref" */
0379 #define HDSPM_SYNC_FROM_TCO     2
0380 #define HDSPM_SYNC_FROM_SYNC_IN 3
0381 
0382 #define HDSPM_Frequency32KHz    HDSPM_Frequency0
0383 #define HDSPM_Frequency44_1KHz  HDSPM_Frequency1
0384 #define HDSPM_Frequency48KHz   (HDSPM_Frequency1|HDSPM_Frequency0)
0385 #define HDSPM_Frequency64KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency0)
0386 #define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
0387 #define HDSPM_Frequency96KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
0388                 HDSPM_Frequency0)
0389 #define HDSPM_Frequency128KHz   (HDSPM_QuadSpeed|HDSPM_Frequency0)
0390 #define HDSPM_Frequency176_4KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1)
0391 #define HDSPM_Frequency192KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1|\
0392                  HDSPM_Frequency0)
0393 
0394 
0395 /* Synccheck Status */
0396 #define HDSPM_SYNC_CHECK_NO_LOCK 0
0397 #define HDSPM_SYNC_CHECK_LOCK    1
0398 #define HDSPM_SYNC_CHECK_SYNC    2
0399 
0400 /* AutoSync References - used by "autosync_ref" control switch */
0401 #define HDSPM_AUTOSYNC_FROM_WORD      0
0402 #define HDSPM_AUTOSYNC_FROM_MADI      1
0403 #define HDSPM_AUTOSYNC_FROM_TCO       2
0404 #define HDSPM_AUTOSYNC_FROM_SYNC_IN   3
0405 #define HDSPM_AUTOSYNC_FROM_NONE      4
0406 
0407 /* Possible sources of MADI input */
0408 #define HDSPM_OPTICAL 0     /* optical   */
0409 #define HDSPM_COAXIAL 1     /* BNC */
0410 
0411 #define hdspm_encode_latency(x)       (((x)<<1) & HDSPM_LatencyMask)
0412 #define hdspm_decode_latency(x)       ((((x) & HDSPM_LatencyMask)>>1))
0413 
0414 #define hdspm_encode_in(x) (((x)&0x3)<<14)
0415 #define hdspm_decode_in(x) (((x)>>14)&0x3)
0416 
0417 /* --- control2 register bits --- */
0418 #define HDSPM_TMS             (1<<0)
0419 #define HDSPM_TCK             (1<<1)
0420 #define HDSPM_TDI             (1<<2)
0421 #define HDSPM_JTAG            (1<<3)
0422 #define HDSPM_PWDN            (1<<4)
0423 #define HDSPM_PROGRAM         (1<<5)
0424 #define HDSPM_CONFIG_MODE_0   (1<<6)
0425 #define HDSPM_CONFIG_MODE_1   (1<<7)
0426 /*#define HDSPM_VERSION_BIT     (1<<8) not defined any more*/
0427 #define HDSPM_BIGENDIAN_MODE  (1<<9)
0428 #define HDSPM_RD_MULTIPLE     (1<<10)
0429 
0430 /* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
0431      that do not conflict with specific bits for AES32 seem to be valid also
0432      for the AES32
0433  */
0434 #define HDSPM_audioIRQPending    (1<<0) /* IRQ is high and pending */
0435 #define HDSPM_RX_64ch            (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
0436 #define HDSPM_AB_int             (1<<2) /* InputChannel Opt=0, Coax=1
0437                      * (like inp0)
0438                      */
0439 
0440 #define HDSPM_madiLock           (1<<3) /* MADI Locked =1, no=0 */
0441 #define HDSPM_madiSync          (1<<18) /* MADI is in sync */
0442 
0443 #define HDSPM_tcoLockMadi    0x00000020 /* Optional TCO locked status for HDSPe MADI*/
0444 #define HDSPM_tcoSync    0x10000000 /* Optional TCO sync status for HDSPe MADI and AES32!*/
0445 
0446 #define HDSPM_syncInLock 0x00010000 /* Sync In lock status for HDSPe MADI! */
0447 #define HDSPM_syncInSync 0x00020000 /* Sync In sync status for HDSPe MADI! */
0448 
0449 #define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
0450             /* since 64byte accurate, last 6 bits are not used */
0451 
0452 
0453 
0454 #define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
0455 
0456 #define HDSPM_madiFreq0         (1<<22) /* system freq 0=error */
0457 #define HDSPM_madiFreq1         (1<<23) /* 1=32, 2=44.1 3=48 */
0458 #define HDSPM_madiFreq2         (1<<24) /* 4=64, 5=88.2 6=96 */
0459 #define HDSPM_madiFreq3         (1<<25) /* 7=128, 8=176.4 9=192 */
0460 
0461 #define HDSPM_BufferID          (1<<26) /* (Double)Buffer ID toggles with
0462                      * Interrupt
0463                      */
0464 #define HDSPM_tco_detect         0x08000000
0465 #define HDSPM_tcoLockAes         0x20000000 /* Optional TCO locked status for HDSPe AES */
0466 
0467 #define HDSPM_s2_tco_detect      0x00000040
0468 #define HDSPM_s2_AEBO_D          0x00000080
0469 #define HDSPM_s2_AEBI_D          0x00000100
0470 
0471 
0472 #define HDSPM_midi0IRQPending    0x40000000
0473 #define HDSPM_midi1IRQPending    0x80000000
0474 #define HDSPM_midi2IRQPending    0x20000000
0475 #define HDSPM_midi2IRQPendingAES 0x00000020
0476 #define HDSPM_midi3IRQPending    0x00200000
0477 
0478 /* --- status bit helpers */
0479 #define HDSPM_madiFreqMask  (HDSPM_madiFreq0|HDSPM_madiFreq1|\
0480                  HDSPM_madiFreq2|HDSPM_madiFreq3)
0481 #define HDSPM_madiFreq32    (HDSPM_madiFreq0)
0482 #define HDSPM_madiFreq44_1  (HDSPM_madiFreq1)
0483 #define HDSPM_madiFreq48    (HDSPM_madiFreq0|HDSPM_madiFreq1)
0484 #define HDSPM_madiFreq64    (HDSPM_madiFreq2)
0485 #define HDSPM_madiFreq88_2  (HDSPM_madiFreq0|HDSPM_madiFreq2)
0486 #define HDSPM_madiFreq96    (HDSPM_madiFreq1|HDSPM_madiFreq2)
0487 #define HDSPM_madiFreq128   (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
0488 #define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
0489 #define HDSPM_madiFreq192   (HDSPM_madiFreq3|HDSPM_madiFreq0)
0490 
0491 /* Status2 Register bits */ /* MADI ONLY */
0492 
0493 #define HDSPM_version0 (1<<0)   /* not really defined but I guess */
0494 #define HDSPM_version1 (1<<1)   /* in former cards it was ??? */
0495 #define HDSPM_version2 (1<<2)
0496 
0497 #define HDSPM_wcLock (1<<3) /* Wordclock is detected and locked */
0498 #define HDSPM_wcSync (1<<4) /* Wordclock is in sync with systemclock */
0499 
0500 #define HDSPM_wc_freq0 (1<<5)   /* input freq detected via autosync  */
0501 #define HDSPM_wc_freq1 (1<<6)   /* 001=32, 010==44.1, 011=48, */
0502 #define HDSPM_wc_freq2 (1<<7)   /* 100=64, 101=88.2, 110=96, 111=128 */
0503 #define HDSPM_wc_freq3 0x800    /* 1000=176.4, 1001=192 */
0504 
0505 #define HDSPM_SyncRef0 0x10000  /* Sync Reference */
0506 #define HDSPM_SyncRef1 0x20000
0507 
0508 #define HDSPM_SelSyncRef0 (1<<8)    /* AutoSync Source */
0509 #define HDSPM_SelSyncRef1 (1<<9)    /* 000=word, 001=MADI, */
0510 #define HDSPM_SelSyncRef2 (1<<10)   /* 111=no valid signal */
0511 
0512 #define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
0513 
0514 #define HDSPM_wcFreqMask  (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2|\
0515                 HDSPM_wc_freq3)
0516 #define HDSPM_wcFreq32    (HDSPM_wc_freq0)
0517 #define HDSPM_wcFreq44_1  (HDSPM_wc_freq1)
0518 #define HDSPM_wcFreq48    (HDSPM_wc_freq0|HDSPM_wc_freq1)
0519 #define HDSPM_wcFreq64    (HDSPM_wc_freq2)
0520 #define HDSPM_wcFreq88_2  (HDSPM_wc_freq0|HDSPM_wc_freq2)
0521 #define HDSPM_wcFreq96    (HDSPM_wc_freq1|HDSPM_wc_freq2)
0522 #define HDSPM_wcFreq128   (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
0523 #define HDSPM_wcFreq176_4 (HDSPM_wc_freq3)
0524 #define HDSPM_wcFreq192   (HDSPM_wc_freq0|HDSPM_wc_freq3)
0525 
0526 #define HDSPM_status1_F_0 0x0400000
0527 #define HDSPM_status1_F_1 0x0800000
0528 #define HDSPM_status1_F_2 0x1000000
0529 #define HDSPM_status1_F_3 0x2000000
0530 #define HDSPM_status1_freqMask (HDSPM_status1_F_0|HDSPM_status1_F_1|HDSPM_status1_F_2|HDSPM_status1_F_3)
0531 
0532 
0533 #define HDSPM_SelSyncRefMask       (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
0534                     HDSPM_SelSyncRef2)
0535 #define HDSPM_SelSyncRef_WORD      0
0536 #define HDSPM_SelSyncRef_MADI      (HDSPM_SelSyncRef0)
0537 #define HDSPM_SelSyncRef_TCO       (HDSPM_SelSyncRef1)
0538 #define HDSPM_SelSyncRef_SyncIn    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1)
0539 #define HDSPM_SelSyncRef_NVALID    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
0540                     HDSPM_SelSyncRef2)
0541 
0542 /*
0543    For AES32, bits for status, status2 and timecode are different
0544 */
0545 /* status */
0546 #define HDSPM_AES32_wcLock  0x0200000
0547 #define HDSPM_AES32_wcSync  0x0100000
0548 #define HDSPM_AES32_wcFreq_bit  22
0549 /* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
0550   HDSPM_bit2freq */
0551 #define HDSPM_AES32_syncref_bit  16
0552 /* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
0553 
0554 #define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
0555 #define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
0556 #define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
0557 #define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
0558 #define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
0559 #define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
0560 #define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
0561 #define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
0562 #define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
0563 #define HDSPM_AES32_AUTOSYNC_FROM_TCO 9
0564 #define HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN 10
0565 #define HDSPM_AES32_AUTOSYNC_FROM_NONE 11
0566 
0567 /*  status2 */
0568 /* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
0569 #define HDSPM_LockAES   0x80
0570 #define HDSPM_LockAES1  0x80
0571 #define HDSPM_LockAES2  0x40
0572 #define HDSPM_LockAES3  0x20
0573 #define HDSPM_LockAES4  0x10
0574 #define HDSPM_LockAES5  0x8
0575 #define HDSPM_LockAES6  0x4
0576 #define HDSPM_LockAES7  0x2
0577 #define HDSPM_LockAES8  0x1
0578 /*
0579    Timecode
0580    After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
0581    AES i+1
0582  bits 3210
0583       0001  32kHz
0584       0010  44.1kHz
0585       0011  48kHz
0586       0100  64kHz
0587       0101  88.2kHz
0588       0110  96kHz
0589       0111  128kHz
0590       1000  176.4kHz
0591       1001  192kHz
0592   NB: Timecode register doesn't seem to work on AES32 card revision 230
0593 */
0594 
0595 /* Mixer Values */
0596 #define UNITY_GAIN          32768   /* = 65536/2 */
0597 #define MINUS_INFINITY_GAIN 0
0598 
0599 /* Number of channels for different Speed Modes */
0600 #define MADI_SS_CHANNELS       64
0601 #define MADI_DS_CHANNELS       32
0602 #define MADI_QS_CHANNELS       16
0603 
0604 #define RAYDAT_SS_CHANNELS     36
0605 #define RAYDAT_DS_CHANNELS     20
0606 #define RAYDAT_QS_CHANNELS     12
0607 
0608 #define AIO_IN_SS_CHANNELS        14
0609 #define AIO_IN_DS_CHANNELS        10
0610 #define AIO_IN_QS_CHANNELS        8
0611 #define AIO_OUT_SS_CHANNELS        16
0612 #define AIO_OUT_DS_CHANNELS        12
0613 #define AIO_OUT_QS_CHANNELS        10
0614 
0615 #define AES32_CHANNELS      16
0616 
0617 /* the size of a substream (1 mono data stream) */
0618 #define HDSPM_CHANNEL_BUFFER_SAMPLES  (16*1024)
0619 #define HDSPM_CHANNEL_BUFFER_BYTES    (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
0620 
0621 /* the size of the area we need to allocate for DMA transfers. the
0622    size is the same regardless of the number of channels, and
0623    also the latency to use.
0624    for one direction !!!
0625 */
0626 #define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
0627 #define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
0628 
0629 #define HDSPM_RAYDAT_REV    211
0630 #define HDSPM_AIO_REV       212
0631 #define HDSPM_MADIFACE_REV  213
0632 
0633 /* speed factor modes */
0634 #define HDSPM_SPEED_SINGLE 0
0635 #define HDSPM_SPEED_DOUBLE 1
0636 #define HDSPM_SPEED_QUAD   2
0637 
0638 /* names for speed modes */
0639 static const char * const hdspm_speed_names[] = { "single", "double", "quad" };
0640 
0641 static const char *const texts_autosync_aes_tco[] = { "Word Clock",
0642                       "AES1", "AES2", "AES3", "AES4",
0643                       "AES5", "AES6", "AES7", "AES8",
0644                       "TCO", "Sync In"
0645 };
0646 static const char *const texts_autosync_aes[] = { "Word Clock",
0647                       "AES1", "AES2", "AES3", "AES4",
0648                       "AES5", "AES6", "AES7", "AES8",
0649                       "Sync In"
0650 };
0651 static const char *const texts_autosync_madi_tco[] = { "Word Clock",
0652                        "MADI", "TCO", "Sync In" };
0653 static const char *const texts_autosync_madi[] = { "Word Clock",
0654                        "MADI", "Sync In" };
0655 
0656 static const char *const texts_autosync_raydat_tco[] = {
0657     "Word Clock",
0658     "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
0659     "AES", "SPDIF", "TCO", "Sync In"
0660 };
0661 static const char *const texts_autosync_raydat[] = {
0662     "Word Clock",
0663     "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
0664     "AES", "SPDIF", "Sync In"
0665 };
0666 static const char *const texts_autosync_aio_tco[] = {
0667     "Word Clock",
0668     "ADAT", "AES", "SPDIF", "TCO", "Sync In"
0669 };
0670 static const char *const texts_autosync_aio[] = { "Word Clock",
0671                       "ADAT", "AES", "SPDIF", "Sync In" };
0672 
0673 static const char *const texts_freq[] = {
0674     "No Lock",
0675     "32 kHz",
0676     "44.1 kHz",
0677     "48 kHz",
0678     "64 kHz",
0679     "88.2 kHz",
0680     "96 kHz",
0681     "128 kHz",
0682     "176.4 kHz",
0683     "192 kHz"
0684 };
0685 
0686 static const char * const texts_ports_madi[] = {
0687     "MADI.1", "MADI.2", "MADI.3", "MADI.4", "MADI.5", "MADI.6",
0688     "MADI.7", "MADI.8", "MADI.9", "MADI.10", "MADI.11", "MADI.12",
0689     "MADI.13", "MADI.14", "MADI.15", "MADI.16", "MADI.17", "MADI.18",
0690     "MADI.19", "MADI.20", "MADI.21", "MADI.22", "MADI.23", "MADI.24",
0691     "MADI.25", "MADI.26", "MADI.27", "MADI.28", "MADI.29", "MADI.30",
0692     "MADI.31", "MADI.32", "MADI.33", "MADI.34", "MADI.35", "MADI.36",
0693     "MADI.37", "MADI.38", "MADI.39", "MADI.40", "MADI.41", "MADI.42",
0694     "MADI.43", "MADI.44", "MADI.45", "MADI.46", "MADI.47", "MADI.48",
0695     "MADI.49", "MADI.50", "MADI.51", "MADI.52", "MADI.53", "MADI.54",
0696     "MADI.55", "MADI.56", "MADI.57", "MADI.58", "MADI.59", "MADI.60",
0697     "MADI.61", "MADI.62", "MADI.63", "MADI.64",
0698 };
0699 
0700 
0701 static const char * const texts_ports_raydat_ss[] = {
0702     "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4", "ADAT1.5", "ADAT1.6",
0703     "ADAT1.7", "ADAT1.8", "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
0704     "ADAT2.5", "ADAT2.6", "ADAT2.7", "ADAT2.8", "ADAT3.1", "ADAT3.2",
0705     "ADAT3.3", "ADAT3.4", "ADAT3.5", "ADAT3.6", "ADAT3.7", "ADAT3.8",
0706     "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4", "ADAT4.5", "ADAT4.6",
0707     "ADAT4.7", "ADAT4.8",
0708     "AES.L", "AES.R",
0709     "SPDIF.L", "SPDIF.R"
0710 };
0711 
0712 static const char * const texts_ports_raydat_ds[] = {
0713     "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4",
0714     "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
0715     "ADAT3.1", "ADAT3.2", "ADAT3.3", "ADAT3.4",
0716     "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4",
0717     "AES.L", "AES.R",
0718     "SPDIF.L", "SPDIF.R"
0719 };
0720 
0721 static const char * const texts_ports_raydat_qs[] = {
0722     "ADAT1.1", "ADAT1.2",
0723     "ADAT2.1", "ADAT2.2",
0724     "ADAT3.1", "ADAT3.2",
0725     "ADAT4.1", "ADAT4.2",
0726     "AES.L", "AES.R",
0727     "SPDIF.L", "SPDIF.R"
0728 };
0729 
0730 
0731 static const char * const texts_ports_aio_in_ss[] = {
0732     "Analogue.L", "Analogue.R",
0733     "AES.L", "AES.R",
0734     "SPDIF.L", "SPDIF.R",
0735     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
0736     "ADAT.7", "ADAT.8",
0737     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0738 };
0739 
0740 static const char * const texts_ports_aio_out_ss[] = {
0741     "Analogue.L", "Analogue.R",
0742     "AES.L", "AES.R",
0743     "SPDIF.L", "SPDIF.R",
0744     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
0745     "ADAT.7", "ADAT.8",
0746     "Phone.L", "Phone.R",
0747     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0748 };
0749 
0750 static const char * const texts_ports_aio_in_ds[] = {
0751     "Analogue.L", "Analogue.R",
0752     "AES.L", "AES.R",
0753     "SPDIF.L", "SPDIF.R",
0754     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
0755     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0756 };
0757 
0758 static const char * const texts_ports_aio_out_ds[] = {
0759     "Analogue.L", "Analogue.R",
0760     "AES.L", "AES.R",
0761     "SPDIF.L", "SPDIF.R",
0762     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
0763     "Phone.L", "Phone.R",
0764     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0765 };
0766 
0767 static const char * const texts_ports_aio_in_qs[] = {
0768     "Analogue.L", "Analogue.R",
0769     "AES.L", "AES.R",
0770     "SPDIF.L", "SPDIF.R",
0771     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
0772     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0773 };
0774 
0775 static const char * const texts_ports_aio_out_qs[] = {
0776     "Analogue.L", "Analogue.R",
0777     "AES.L", "AES.R",
0778     "SPDIF.L", "SPDIF.R",
0779     "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
0780     "Phone.L", "Phone.R",
0781     "AEB.1", "AEB.2", "AEB.3", "AEB.4"
0782 };
0783 
0784 static const char * const texts_ports_aes32[] = {
0785     "AES.1", "AES.2", "AES.3", "AES.4", "AES.5", "AES.6", "AES.7",
0786     "AES.8", "AES.9.", "AES.10", "AES.11", "AES.12", "AES.13", "AES.14",
0787     "AES.15", "AES.16"
0788 };
0789 
0790 /* These tables map the ALSA channels 1..N to the channels that we
0791    need to use in order to find the relevant channel buffer. RME
0792    refers to this kind of mapping as between "the ADAT channel and
0793    the DMA channel." We index it using the logical audio channel,
0794    and the value is the DMA channel (i.e. channel buffer number)
0795    where the data for that channel can be read/written from/to.
0796 */
0797 
0798 static const char channel_map_unity_ss[HDSPM_MAX_CHANNELS] = {
0799     0, 1, 2, 3, 4, 5, 6, 7,
0800     8, 9, 10, 11, 12, 13, 14, 15,
0801     16, 17, 18, 19, 20, 21, 22, 23,
0802     24, 25, 26, 27, 28, 29, 30, 31,
0803     32, 33, 34, 35, 36, 37, 38, 39,
0804     40, 41, 42, 43, 44, 45, 46, 47,
0805     48, 49, 50, 51, 52, 53, 54, 55,
0806     56, 57, 58, 59, 60, 61, 62, 63
0807 };
0808 
0809 static const char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
0810     4, 5, 6, 7, 8, 9, 10, 11,   /* ADAT 1 */
0811     12, 13, 14, 15, 16, 17, 18, 19, /* ADAT 2 */
0812     20, 21, 22, 23, 24, 25, 26, 27, /* ADAT 3 */
0813     28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
0814     0, 1,           /* AES */
0815     2, 3,           /* SPDIF */
0816     -1, -1, -1, -1,
0817     -1, -1, -1, -1, -1, -1, -1, -1,
0818     -1, -1, -1, -1, -1, -1, -1, -1,
0819     -1, -1, -1, -1, -1, -1, -1, -1,
0820 };
0821 
0822 static const char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
0823     4, 5, 6, 7,     /* ADAT 1 */
0824     8, 9, 10, 11,       /* ADAT 2 */
0825     12, 13, 14, 15,     /* ADAT 3 */
0826     16, 17, 18, 19,     /* ADAT 4 */
0827     0, 1,           /* AES */
0828     2, 3,           /* SPDIF */
0829     -1, -1, -1, -1,
0830     -1, -1, -1, -1, -1, -1, -1, -1,
0831     -1, -1, -1, -1, -1, -1, -1, -1,
0832     -1, -1, -1, -1, -1, -1, -1, -1,
0833     -1, -1, -1, -1, -1, -1, -1, -1,
0834     -1, -1, -1, -1, -1, -1, -1, -1,
0835 };
0836 
0837 static const char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
0838     4, 5,           /* ADAT 1 */
0839     6, 7,           /* ADAT 2 */
0840     8, 9,           /* ADAT 3 */
0841     10, 11,         /* ADAT 4 */
0842     0, 1,           /* AES */
0843     2, 3,           /* SPDIF */
0844     -1, -1, -1, -1,
0845     -1, -1, -1, -1, -1, -1, -1, -1,
0846     -1, -1, -1, -1, -1, -1, -1, -1,
0847     -1, -1, -1, -1, -1, -1, -1, -1,
0848     -1, -1, -1, -1, -1, -1, -1, -1,
0849     -1, -1, -1, -1, -1, -1, -1, -1,
0850     -1, -1, -1, -1, -1, -1, -1, -1,
0851 };
0852 
0853 static const char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
0854     0, 1,           /* line in */
0855     8, 9,           /* aes in, */
0856     10, 11,         /* spdif in */
0857     12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
0858     2, 3, 4, 5,     /* AEB */
0859     -1, -1, -1, -1, -1, -1,
0860     -1, -1, -1, -1, -1, -1, -1, -1,
0861     -1, -1, -1, -1, -1, -1, -1, -1,
0862     -1, -1, -1, -1, -1, -1, -1, -1,
0863     -1, -1, -1, -1, -1, -1, -1, -1,
0864     -1, -1, -1, -1, -1, -1, -1, -1,
0865 };
0866 
0867 static const char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
0868     0, 1,           /* line out */
0869     8, 9,           /* aes out */
0870     10, 11,         /* spdif out */
0871     12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
0872     6, 7,           /* phone out */
0873     2, 3, 4, 5,     /* AEB */
0874     -1, -1, -1, -1,
0875     -1, -1, -1, -1, -1, -1, -1, -1,
0876     -1, -1, -1, -1, -1, -1, -1, -1,
0877     -1, -1, -1, -1, -1, -1, -1, -1,
0878     -1, -1, -1, -1, -1, -1, -1, -1,
0879     -1, -1, -1, -1, -1, -1, -1, -1,
0880 };
0881 
0882 static const char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
0883     0, 1,           /* line in */
0884     8, 9,           /* aes in */
0885     10, 11,         /* spdif in */
0886     12, 14, 16, 18,     /* adat in */
0887     2, 3, 4, 5,     /* AEB */
0888     -1, -1,
0889     -1, -1, -1, -1, -1, -1, -1, -1,
0890     -1, -1, -1, -1, -1, -1, -1, -1,
0891     -1, -1, -1, -1, -1, -1, -1, -1,
0892     -1, -1, -1, -1, -1, -1, -1, -1,
0893     -1, -1, -1, -1, -1, -1, -1, -1,
0894     -1, -1, -1, -1, -1, -1, -1, -1
0895 };
0896 
0897 static const char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
0898     0, 1,           /* line out */
0899     8, 9,           /* aes out */
0900     10, 11,         /* spdif out */
0901     12, 14, 16, 18,     /* adat out */
0902     6, 7,           /* phone out */
0903     2, 3, 4, 5,     /* AEB */
0904     -1, -1, -1, -1, -1, -1, -1, -1,
0905     -1, -1, -1, -1, -1, -1, -1, -1,
0906     -1, -1, -1, -1, -1, -1, -1, -1,
0907     -1, -1, -1, -1, -1, -1, -1, -1,
0908     -1, -1, -1, -1, -1, -1, -1, -1,
0909     -1, -1, -1, -1, -1, -1, -1, -1
0910 };
0911 
0912 static const char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
0913     0, 1,           /* line in */
0914     8, 9,           /* aes in */
0915     10, 11,         /* spdif in */
0916     12, 16,         /* adat in */
0917     2, 3, 4, 5,     /* AEB */
0918     -1, -1, -1, -1,
0919     -1, -1, -1, -1, -1, -1, -1, -1,
0920     -1, -1, -1, -1, -1, -1, -1, -1,
0921     -1, -1, -1, -1, -1, -1, -1, -1,
0922     -1, -1, -1, -1, -1, -1, -1, -1,
0923     -1, -1, -1, -1, -1, -1, -1, -1,
0924     -1, -1, -1, -1, -1, -1, -1, -1
0925 };
0926 
0927 static const char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
0928     0, 1,           /* line out */
0929     8, 9,           /* aes out */
0930     10, 11,         /* spdif out */
0931     12, 16,         /* adat out */
0932     6, 7,           /* phone out */
0933     2, 3, 4, 5,     /* AEB */
0934     -1, -1,
0935     -1, -1, -1, -1, -1, -1, -1, -1,
0936     -1, -1, -1, -1, -1, -1, -1, -1,
0937     -1, -1, -1, -1, -1, -1, -1, -1,
0938     -1, -1, -1, -1, -1, -1, -1, -1,
0939     -1, -1, -1, -1, -1, -1, -1, -1,
0940     -1, -1, -1, -1, -1, -1, -1, -1
0941 };
0942 
0943 static const char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
0944     0, 1, 2, 3, 4, 5, 6, 7,
0945     8, 9, 10, 11, 12, 13, 14, 15,
0946     -1, -1, -1, -1, -1, -1, -1, -1,
0947     -1, -1, -1, -1, -1, -1, -1, -1,
0948     -1, -1, -1, -1, -1, -1, -1, -1,
0949     -1, -1, -1, -1, -1, -1, -1, -1,
0950     -1, -1, -1, -1, -1, -1, -1, -1,
0951     -1, -1, -1, -1, -1, -1, -1, -1
0952 };
0953 
0954 struct hdspm_midi {
0955     struct hdspm *hdspm;
0956     int id;
0957     struct snd_rawmidi *rmidi;
0958     struct snd_rawmidi_substream *input;
0959     struct snd_rawmidi_substream *output;
0960     char istimer;       /* timer in use */
0961     struct timer_list timer;
0962     spinlock_t lock;
0963     int pending;
0964     int dataIn;
0965     int statusIn;
0966     int dataOut;
0967     int statusOut;
0968     int ie;
0969     int irq;
0970 };
0971 
0972 struct hdspm_tco {
0973     int input; /* 0: LTC, 1:Video, 2: WC*/
0974     int framerate; /* 0=24, 1=25, 2=29.97, 3=29.97d, 4=30, 5=30d */
0975     int wordclock; /* 0=1:1, 1=44.1->48, 2=48->44.1 */
0976     int samplerate; /* 0=44.1, 1=48, 2= freq from app */
0977     int pull; /*   0=0, 1=+0.1%, 2=-0.1%, 3=+4%, 4=-4%*/
0978     int term; /* 0 = off, 1 = on */
0979 };
0980 
0981 struct hdspm {
0982         spinlock_t lock;
0983     /* only one playback and/or capture stream */
0984         struct snd_pcm_substream *capture_substream;
0985         struct snd_pcm_substream *playback_substream;
0986 
0987     char *card_name;         /* for procinfo */
0988     unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
0989 
0990     uint8_t io_type;
0991 
0992     int monitor_outs;   /* set up monitoring outs init flag */
0993 
0994     u32 control_register;   /* cached value */
0995     u32 control2_register;  /* cached value */
0996     u32 settings_register;  /* cached value for AIO / RayDat (sync reference, master/slave) */
0997 
0998     struct hdspm_midi midi[4];
0999     struct work_struct midi_work;
1000 
1001     size_t period_bytes;
1002     unsigned char ss_in_channels;
1003     unsigned char ds_in_channels;
1004     unsigned char qs_in_channels;
1005     unsigned char ss_out_channels;
1006     unsigned char ds_out_channels;
1007     unsigned char qs_out_channels;
1008 
1009     unsigned char max_channels_in;
1010     unsigned char max_channels_out;
1011 
1012     const signed char *channel_map_in;
1013     const signed char *channel_map_out;
1014 
1015     const signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
1016     const signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
1017 
1018     const char * const *port_names_in;
1019     const char * const *port_names_out;
1020 
1021     const char * const *port_names_in_ss;
1022     const char * const *port_names_in_ds;
1023     const char * const *port_names_in_qs;
1024     const char * const *port_names_out_ss;
1025     const char * const *port_names_out_ds;
1026     const char * const *port_names_out_qs;
1027 
1028     unsigned char *playback_buffer; /* suitably aligned address */
1029     unsigned char *capture_buffer;  /* suitably aligned address */
1030 
1031     pid_t capture_pid;  /* process id which uses capture */
1032     pid_t playback_pid; /* process id which uses capture */
1033     int running;        /* running status */
1034 
1035     int last_external_sample_rate;  /* samplerate mystic ... */
1036     int last_internal_sample_rate;
1037     int system_sample_rate;
1038 
1039     int dev;        /* Hardware vars... */
1040     int irq;
1041     unsigned long port;
1042     void __iomem *iobase;
1043 
1044     int irq_count;      /* for debug */
1045     int midiPorts;
1046 
1047     struct snd_card *card;  /* one card */
1048     struct snd_pcm *pcm;        /* has one pcm */
1049     struct snd_hwdep *hwdep;    /* and a hwdep for additional ioctl */
1050     struct pci_dev *pci;    /* and an pci info */
1051 
1052     /* Mixer vars */
1053     /* fast alsa mixer */
1054     struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
1055     /* but input to much, so not used */
1056     struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
1057     /* full mixer accessible over mixer ioctl or hwdep-device */
1058     struct hdspm_mixer *mixer;
1059 
1060     struct hdspm_tco *tco;  /* NULL if no TCO detected */
1061 
1062     const char *const *texts_autosync;
1063     int texts_autosync_items;
1064 
1065     cycles_t last_interrupt;
1066 
1067     unsigned int serial;
1068 
1069     struct hdspm_peak_rms peak_rms;
1070 };
1071 
1072 
1073 static const struct pci_device_id snd_hdspm_ids[] = {
1074     {
1075      .vendor = PCI_VENDOR_ID_XILINX,
1076      .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
1077      .subvendor = PCI_ANY_ID,
1078      .subdevice = PCI_ANY_ID,
1079      .class = 0,
1080      .class_mask = 0,
1081      .driver_data = 0},
1082     {0,}
1083 };
1084 
1085 MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
1086 
1087 /* prototypes */
1088 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
1089                      struct hdspm *hdspm);
1090 static int snd_hdspm_create_pcm(struct snd_card *card,
1091                 struct hdspm *hdspm);
1092 
1093 static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
1094 static inline int hdspm_get_pll_freq(struct hdspm *hdspm);
1095 static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
1096 static int hdspm_autosync_ref(struct hdspm *hdspm);
1097 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out);
1098 static int snd_hdspm_set_defaults(struct hdspm *hdspm);
1099 static int hdspm_system_clock_mode(struct hdspm *hdspm);
1100 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm,
1101                        struct snd_pcm_substream *substream,
1102                        unsigned int reg, int channels);
1103 
1104 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx);
1105 static int hdspm_wc_sync_check(struct hdspm *hdspm);
1106 static int hdspm_tco_sync_check(struct hdspm *hdspm);
1107 static int hdspm_sync_in_sync_check(struct hdspm *hdspm);
1108 
1109 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index);
1110 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm);
1111 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm);
1112 
1113 
1114 
1115 static inline int HDSPM_bit2freq(int n)
1116 {
1117     static const int bit2freq_tab[] = {
1118         0, 32000, 44100, 48000, 64000, 88200,
1119         96000, 128000, 176400, 192000 };
1120     if (n < 1 || n > 9)
1121         return 0;
1122     return bit2freq_tab[n];
1123 }
1124 
1125 static bool hdspm_is_raydat_or_aio(struct hdspm *hdspm)
1126 {
1127     return ((AIO == hdspm->io_type) || (RayDAT == hdspm->io_type));
1128 }
1129 
1130 
1131 /* Write/read to/from HDSPM with Adresses in Bytes
1132    not words but only 32Bit writes are allowed */
1133 
1134 static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
1135                    unsigned int val)
1136 {
1137     writel(val, hdspm->iobase + reg);
1138 }
1139 
1140 static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
1141 {
1142     return readl(hdspm->iobase + reg);
1143 }
1144 
1145 /* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1146    mixer is write only on hardware so we have to cache him for read
1147    each fader is a u32, but uses only the first 16 bit */
1148 
1149 static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1150                      unsigned int in)
1151 {
1152     if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1153         return 0;
1154 
1155     return hdspm->mixer->ch[chan].in[in];
1156 }
1157 
1158 static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1159                      unsigned int pb)
1160 {
1161     if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1162         return 0;
1163     return hdspm->mixer->ch[chan].pb[pb];
1164 }
1165 
1166 static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1167                       unsigned int in, unsigned short data)
1168 {
1169     if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1170         return -1;
1171 
1172     hdspm_write(hdspm,
1173             HDSPM_MADI_mixerBase +
1174             ((in + 128 * chan) * sizeof(u32)),
1175             (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1176     return 0;
1177 }
1178 
1179 static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1180                       unsigned int pb, unsigned short data)
1181 {
1182     if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1183         return -1;
1184 
1185     hdspm_write(hdspm,
1186             HDSPM_MADI_mixerBase +
1187             ((64 + pb + 128 * chan) * sizeof(u32)),
1188             (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1189     return 0;
1190 }
1191 
1192 
1193 /* enable DMA for specific channels, now available for DSP-MADI */
1194 static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1195 {
1196     hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1197 }
1198 
1199 static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1200 {
1201     hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1202 }
1203 
1204 /* check if same process is writing and reading */
1205 static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1206 {
1207     unsigned long flags;
1208     int ret = 1;
1209 
1210     spin_lock_irqsave(&hdspm->lock, flags);
1211     if ((hdspm->playback_pid != hdspm->capture_pid) &&
1212         (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1213         ret = 0;
1214     }
1215     spin_unlock_irqrestore(&hdspm->lock, flags);
1216     return ret;
1217 }
1218 
1219 /* round arbitrary sample rates to commonly known rates */
1220 static int hdspm_round_frequency(int rate)
1221 {
1222     if (rate < 38050)
1223         return 32000;
1224     if (rate < 46008)
1225         return 44100;
1226     else
1227         return 48000;
1228 }
1229 
1230 /* QS and DS rates normally can not be detected
1231  * automatically by the card. Only exception is MADI
1232  * in 96k frame mode.
1233  *
1234  * So if we read SS values (32 .. 48k), check for
1235  * user-provided DS/QS bits in the control register
1236  * and multiply the base frequency accordingly.
1237  */
1238 static int hdspm_rate_multiplier(struct hdspm *hdspm, int rate)
1239 {
1240     if (rate <= 48000) {
1241         if (hdspm->control_register & HDSPM_QuadSpeed)
1242             return rate * 4;
1243         else if (hdspm->control_register &
1244                 HDSPM_DoubleSpeed)
1245             return rate * 2;
1246     }
1247     return rate;
1248 }
1249 
1250 /* check for external sample rate, returns the sample rate in Hz*/
1251 static int hdspm_external_sample_rate(struct hdspm *hdspm)
1252 {
1253     unsigned int status, status2;
1254     int syncref, rate = 0, rate_bits;
1255 
1256     switch (hdspm->io_type) {
1257     case AES32:
1258         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1259         status = hdspm_read(hdspm, HDSPM_statusRegister);
1260 
1261         syncref = hdspm_autosync_ref(hdspm);
1262         switch (syncref) {
1263         case HDSPM_AES32_AUTOSYNC_FROM_WORD:
1264         /* Check WC sync and get sample rate */
1265             if (hdspm_wc_sync_check(hdspm))
1266                 return HDSPM_bit2freq(hdspm_get_wc_sample_rate(hdspm));
1267             break;
1268 
1269         case HDSPM_AES32_AUTOSYNC_FROM_AES1:
1270         case HDSPM_AES32_AUTOSYNC_FROM_AES2:
1271         case HDSPM_AES32_AUTOSYNC_FROM_AES3:
1272         case HDSPM_AES32_AUTOSYNC_FROM_AES4:
1273         case HDSPM_AES32_AUTOSYNC_FROM_AES5:
1274         case HDSPM_AES32_AUTOSYNC_FROM_AES6:
1275         case HDSPM_AES32_AUTOSYNC_FROM_AES7:
1276         case HDSPM_AES32_AUTOSYNC_FROM_AES8:
1277         /* Check AES sync and get sample rate */
1278             if (hdspm_aes_sync_check(hdspm, syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1))
1279                 return HDSPM_bit2freq(hdspm_get_aes_sample_rate(hdspm,
1280                             syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1));
1281             break;
1282 
1283 
1284         case HDSPM_AES32_AUTOSYNC_FROM_TCO:
1285         /* Check TCO sync and get sample rate */
1286             if (hdspm_tco_sync_check(hdspm))
1287                 return HDSPM_bit2freq(hdspm_get_tco_sample_rate(hdspm));
1288             break;
1289         default:
1290             return 0;
1291         } /* end switch(syncref) */
1292         break;
1293 
1294     case MADIface:
1295         status = hdspm_read(hdspm, HDSPM_statusRegister);
1296 
1297         if (!(status & HDSPM_madiLock)) {
1298             rate = 0;  /* no lock */
1299         } else {
1300             switch (status & (HDSPM_status1_freqMask)) {
1301             case HDSPM_status1_F_0*1:
1302                 rate = 32000; break;
1303             case HDSPM_status1_F_0*2:
1304                 rate = 44100; break;
1305             case HDSPM_status1_F_0*3:
1306                 rate = 48000; break;
1307             case HDSPM_status1_F_0*4:
1308                 rate = 64000; break;
1309             case HDSPM_status1_F_0*5:
1310                 rate = 88200; break;
1311             case HDSPM_status1_F_0*6:
1312                 rate = 96000; break;
1313             case HDSPM_status1_F_0*7:
1314                 rate = 128000; break;
1315             case HDSPM_status1_F_0*8:
1316                 rate = 176400; break;
1317             case HDSPM_status1_F_0*9:
1318                 rate = 192000; break;
1319             default:
1320                 rate = 0; break;
1321             }
1322         }
1323 
1324         break;
1325 
1326     case MADI:
1327     case AIO:
1328     case RayDAT:
1329         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1330         status = hdspm_read(hdspm, HDSPM_statusRegister);
1331         rate = 0;
1332 
1333         /* if wordclock has synced freq and wordclock is valid */
1334         if ((status2 & HDSPM_wcLock) != 0 &&
1335                 (status2 & HDSPM_SelSyncRef0) == 0) {
1336 
1337             rate_bits = status2 & HDSPM_wcFreqMask;
1338 
1339 
1340             switch (rate_bits) {
1341             case HDSPM_wcFreq32:
1342                 rate = 32000;
1343                 break;
1344             case HDSPM_wcFreq44_1:
1345                 rate = 44100;
1346                 break;
1347             case HDSPM_wcFreq48:
1348                 rate = 48000;
1349                 break;
1350             case HDSPM_wcFreq64:
1351                 rate = 64000;
1352                 break;
1353             case HDSPM_wcFreq88_2:
1354                 rate = 88200;
1355                 break;
1356             case HDSPM_wcFreq96:
1357                 rate = 96000;
1358                 break;
1359             case HDSPM_wcFreq128:
1360                 rate = 128000;
1361                 break;
1362             case HDSPM_wcFreq176_4:
1363                 rate = 176400;
1364                 break;
1365             case HDSPM_wcFreq192:
1366                 rate = 192000;
1367                 break;
1368             default:
1369                 rate = 0;
1370                 break;
1371             }
1372         }
1373 
1374         /* if rate detected and Syncref is Word than have it,
1375          * word has priority to MADI
1376          */
1377         if (rate != 0 &&
1378         (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1379             return hdspm_rate_multiplier(hdspm, rate);
1380 
1381         /* maybe a madi input (which is taken if sel sync is madi) */
1382         if (status & HDSPM_madiLock) {
1383             rate_bits = status & HDSPM_madiFreqMask;
1384 
1385             switch (rate_bits) {
1386             case HDSPM_madiFreq32:
1387                 rate = 32000;
1388                 break;
1389             case HDSPM_madiFreq44_1:
1390                 rate = 44100;
1391                 break;
1392             case HDSPM_madiFreq48:
1393                 rate = 48000;
1394                 break;
1395             case HDSPM_madiFreq64:
1396                 rate = 64000;
1397                 break;
1398             case HDSPM_madiFreq88_2:
1399                 rate = 88200;
1400                 break;
1401             case HDSPM_madiFreq96:
1402                 rate = 96000;
1403                 break;
1404             case HDSPM_madiFreq128:
1405                 rate = 128000;
1406                 break;
1407             case HDSPM_madiFreq176_4:
1408                 rate = 176400;
1409                 break;
1410             case HDSPM_madiFreq192:
1411                 rate = 192000;
1412                 break;
1413             default:
1414                 rate = 0;
1415                 break;
1416             }
1417 
1418         } /* endif HDSPM_madiLock */
1419 
1420         /* check sample rate from TCO or SYNC_IN */
1421         {
1422             bool is_valid_input = 0;
1423             bool has_sync = 0;
1424 
1425             syncref = hdspm_autosync_ref(hdspm);
1426             if (HDSPM_AUTOSYNC_FROM_TCO == syncref) {
1427                 is_valid_input = 1;
1428                 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1429                     hdspm_tco_sync_check(hdspm));
1430             } else if (HDSPM_AUTOSYNC_FROM_SYNC_IN == syncref) {
1431                 is_valid_input = 1;
1432                 has_sync = (HDSPM_SYNC_CHECK_SYNC ==
1433                     hdspm_sync_in_sync_check(hdspm));
1434             }
1435 
1436             if (is_valid_input && has_sync) {
1437                 rate = hdspm_round_frequency(
1438                     hdspm_get_pll_freq(hdspm));
1439             }
1440         }
1441 
1442         rate = hdspm_rate_multiplier(hdspm, rate);
1443 
1444         break;
1445     }
1446 
1447     return rate;
1448 }
1449 
1450 /* return latency in samples per period */
1451 static int hdspm_get_latency(struct hdspm *hdspm)
1452 {
1453     int n;
1454 
1455     n = hdspm_decode_latency(hdspm->control_register);
1456 
1457     /* Special case for new RME cards with 32 samples period size.
1458      * The three latency bits in the control register
1459      * (HDSP_LatencyMask) encode latency values of 64 samples as
1460      * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1461      * denotes 8192 samples, but on new cards like RayDAT or AIO,
1462      * it corresponds to 32 samples.
1463      */
1464     if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1465         n = -1;
1466 
1467     return 1 << (n + 6);
1468 }
1469 
1470 /* Latency function */
1471 static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1472 {
1473     hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1474 }
1475 
1476 
1477 static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1478 {
1479     int position;
1480 
1481     position = hdspm_read(hdspm, HDSPM_statusRegister);
1482 
1483     switch (hdspm->io_type) {
1484     case RayDAT:
1485     case AIO:
1486         position &= HDSPM_BufferPositionMask;
1487         position /= 4; /* Bytes per sample */
1488         break;
1489     default:
1490         position = (position & HDSPM_BufferID) ?
1491             (hdspm->period_bytes / 4) : 0;
1492     }
1493 
1494     return position;
1495 }
1496 
1497 
1498 static inline void hdspm_start_audio(struct hdspm * s)
1499 {
1500     s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1501     hdspm_write(s, HDSPM_controlRegister, s->control_register);
1502 }
1503 
1504 static inline void hdspm_stop_audio(struct hdspm * s)
1505 {
1506     s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1507     hdspm_write(s, HDSPM_controlRegister, s->control_register);
1508 }
1509 
1510 /* should I silence all or only opened ones ? doit all for first even is 4MB*/
1511 static void hdspm_silence_playback(struct hdspm *hdspm)
1512 {
1513     int i;
1514     int n = hdspm->period_bytes;
1515     void *buf = hdspm->playback_buffer;
1516 
1517     if (!buf)
1518         return;
1519 
1520     for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1521         memset(buf, 0, n);
1522         buf += HDSPM_CHANNEL_BUFFER_BYTES;
1523     }
1524 }
1525 
1526 static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1527 {
1528     int n;
1529 
1530     spin_lock_irq(&s->lock);
1531 
1532     if (32 == frames) {
1533         /* Special case for new RME cards like RayDAT/AIO which
1534          * support period sizes of 32 samples. Since latency is
1535          * encoded in the three bits of HDSP_LatencyMask, we can only
1536          * have values from 0 .. 7. While 0 still means 64 samples and
1537          * 6 represents 4096 samples on all cards, 7 represents 8192
1538          * on older cards and 32 samples on new cards.
1539          *
1540          * In other words, period size in samples is calculated by
1541          * 2^(n+6) with n ranging from 0 .. 7.
1542          */
1543         n = 7;
1544     } else {
1545         frames >>= 7;
1546         n = 0;
1547         while (frames) {
1548             n++;
1549             frames >>= 1;
1550         }
1551     }
1552 
1553     s->control_register &= ~HDSPM_LatencyMask;
1554     s->control_register |= hdspm_encode_latency(n);
1555 
1556     hdspm_write(s, HDSPM_controlRegister, s->control_register);
1557 
1558     hdspm_compute_period_size(s);
1559 
1560     spin_unlock_irq(&s->lock);
1561 
1562     return 0;
1563 }
1564 
1565 static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1566 {
1567     u64 freq_const;
1568 
1569     if (period == 0)
1570         return 0;
1571 
1572     switch (hdspm->io_type) {
1573     case MADI:
1574     case AES32:
1575         freq_const = 110069313433624ULL;
1576         break;
1577     case RayDAT:
1578     case AIO:
1579         freq_const = 104857600000000ULL;
1580         break;
1581     case MADIface:
1582         freq_const = 131072000000000ULL;
1583         break;
1584     default:
1585         snd_BUG();
1586         return 0;
1587     }
1588 
1589     return div_u64(freq_const, period);
1590 }
1591 
1592 
1593 static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1594 {
1595     u64 n;
1596 
1597     if (snd_BUG_ON(rate <= 0))
1598         return;
1599 
1600     if (rate >= 112000)
1601         rate /= 4;
1602     else if (rate >= 56000)
1603         rate /= 2;
1604 
1605     switch (hdspm->io_type) {
1606     case MADIface:
1607         n = 131072000000000ULL;  /* 125 MHz */
1608         break;
1609     case MADI:
1610     case AES32:
1611         n = 110069313433624ULL;  /* 105 MHz */
1612         break;
1613     case RayDAT:
1614     case AIO:
1615         n = 104857600000000ULL;  /* 100 MHz */
1616         break;
1617     default:
1618         snd_BUG();
1619         return;
1620     }
1621 
1622     n = div_u64(n, rate);
1623     /* n should be less than 2^32 for being written to FREQ register */
1624     snd_BUG_ON(n >> 32);
1625     hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1626 }
1627 
1628 /* dummy set rate lets see what happens */
1629 static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1630 {
1631     int current_rate;
1632     int rate_bits;
1633     int not_set = 0;
1634     int current_speed, target_speed;
1635 
1636     /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1637        it (e.g. during module initialization).
1638      */
1639 
1640     if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1641 
1642         /* SLAVE --- */
1643         if (called_internally) {
1644 
1645             /* request from ctl or card initialization
1646                just make a warning an remember setting
1647                for future master mode switching */
1648 
1649             dev_warn(hdspm->card->dev,
1650                  "Warning: device is not running as a clock master.\n");
1651             not_set = 1;
1652         } else {
1653 
1654             /* hw_param request while in AutoSync mode */
1655             int external_freq =
1656                 hdspm_external_sample_rate(hdspm);
1657 
1658             if (hdspm_autosync_ref(hdspm) ==
1659                 HDSPM_AUTOSYNC_FROM_NONE) {
1660 
1661                 dev_warn(hdspm->card->dev,
1662                      "Detected no External Sync\n");
1663                 not_set = 1;
1664 
1665             } else if (rate != external_freq) {
1666 
1667                 dev_warn(hdspm->card->dev,
1668                      "Warning: No AutoSync source for requested rate\n");
1669                 not_set = 1;
1670             }
1671         }
1672     }
1673 
1674     current_rate = hdspm->system_sample_rate;
1675 
1676     /* Changing between Singe, Double and Quad speed is not
1677        allowed if any substreams are open. This is because such a change
1678        causes a shift in the location of the DMA buffers and a reduction
1679        in the number of available buffers.
1680 
1681        Note that a similar but essentially insoluble problem exists for
1682        externally-driven rate changes. All we can do is to flag rate
1683        changes in the read/write routines.
1684      */
1685 
1686     if (current_rate <= 48000)
1687         current_speed = HDSPM_SPEED_SINGLE;
1688     else if (current_rate <= 96000)
1689         current_speed = HDSPM_SPEED_DOUBLE;
1690     else
1691         current_speed = HDSPM_SPEED_QUAD;
1692 
1693     if (rate <= 48000)
1694         target_speed = HDSPM_SPEED_SINGLE;
1695     else if (rate <= 96000)
1696         target_speed = HDSPM_SPEED_DOUBLE;
1697     else
1698         target_speed = HDSPM_SPEED_QUAD;
1699 
1700     switch (rate) {
1701     case 32000:
1702         rate_bits = HDSPM_Frequency32KHz;
1703         break;
1704     case 44100:
1705         rate_bits = HDSPM_Frequency44_1KHz;
1706         break;
1707     case 48000:
1708         rate_bits = HDSPM_Frequency48KHz;
1709         break;
1710     case 64000:
1711         rate_bits = HDSPM_Frequency64KHz;
1712         break;
1713     case 88200:
1714         rate_bits = HDSPM_Frequency88_2KHz;
1715         break;
1716     case 96000:
1717         rate_bits = HDSPM_Frequency96KHz;
1718         break;
1719     case 128000:
1720         rate_bits = HDSPM_Frequency128KHz;
1721         break;
1722     case 176400:
1723         rate_bits = HDSPM_Frequency176_4KHz;
1724         break;
1725     case 192000:
1726         rate_bits = HDSPM_Frequency192KHz;
1727         break;
1728     default:
1729         return -EINVAL;
1730     }
1731 
1732     if (current_speed != target_speed
1733         && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1734         dev_err(hdspm->card->dev,
1735             "cannot change from %s speed to %s speed mode (capture PID = %d, playback PID = %d)\n",
1736             hdspm_speed_names[current_speed],
1737             hdspm_speed_names[target_speed],
1738             hdspm->capture_pid, hdspm->playback_pid);
1739         return -EBUSY;
1740     }
1741 
1742     hdspm->control_register &= ~HDSPM_FrequencyMask;
1743     hdspm->control_register |= rate_bits;
1744     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1745 
1746     /* For AES32, need to set DDS value in FREQ register
1747        For MADI, also apparently */
1748     hdspm_set_dds_value(hdspm, rate);
1749 
1750     if (AES32 == hdspm->io_type && rate != current_rate)
1751         hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1752 
1753     hdspm->system_sample_rate = rate;
1754 
1755     if (rate <= 48000) {
1756         hdspm->channel_map_in = hdspm->channel_map_in_ss;
1757         hdspm->channel_map_out = hdspm->channel_map_out_ss;
1758         hdspm->max_channels_in = hdspm->ss_in_channels;
1759         hdspm->max_channels_out = hdspm->ss_out_channels;
1760         hdspm->port_names_in = hdspm->port_names_in_ss;
1761         hdspm->port_names_out = hdspm->port_names_out_ss;
1762     } else if (rate <= 96000) {
1763         hdspm->channel_map_in = hdspm->channel_map_in_ds;
1764         hdspm->channel_map_out = hdspm->channel_map_out_ds;
1765         hdspm->max_channels_in = hdspm->ds_in_channels;
1766         hdspm->max_channels_out = hdspm->ds_out_channels;
1767         hdspm->port_names_in = hdspm->port_names_in_ds;
1768         hdspm->port_names_out = hdspm->port_names_out_ds;
1769     } else {
1770         hdspm->channel_map_in = hdspm->channel_map_in_qs;
1771         hdspm->channel_map_out = hdspm->channel_map_out_qs;
1772         hdspm->max_channels_in = hdspm->qs_in_channels;
1773         hdspm->max_channels_out = hdspm->qs_out_channels;
1774         hdspm->port_names_in = hdspm->port_names_in_qs;
1775         hdspm->port_names_out = hdspm->port_names_out_qs;
1776     }
1777 
1778     if (not_set != 0)
1779         return -1;
1780 
1781     return 0;
1782 }
1783 
1784 /* mainly for init to 0 on load */
1785 static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1786 {
1787     int i, j;
1788     unsigned int gain;
1789 
1790     if (sgain > UNITY_GAIN)
1791         gain = UNITY_GAIN;
1792     else if (sgain < 0)
1793         gain = 0;
1794     else
1795         gain = sgain;
1796 
1797     for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1798         for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1799             hdspm_write_in_gain(hdspm, i, j, gain);
1800             hdspm_write_pb_gain(hdspm, i, j, gain);
1801         }
1802 }
1803 
1804 /*----------------------------------------------------------------------------
1805    MIDI
1806   ----------------------------------------------------------------------------*/
1807 
1808 static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1809                               int id)
1810 {
1811     /* the hardware already does the relevant bit-mask with 0xff */
1812     return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1813 }
1814 
1815 static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1816                           int val)
1817 {
1818     /* the hardware already does the relevant bit-mask with 0xff */
1819     return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1820 }
1821 
1822 static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1823 {
1824     return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1825 }
1826 
1827 static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1828 {
1829     int fifo_bytes_used;
1830 
1831     fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1832 
1833     if (fifo_bytes_used < 128)
1834         return  128 - fifo_bytes_used;
1835     else
1836         return 0;
1837 }
1838 
1839 static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1840 {
1841     while (snd_hdspm_midi_input_available (hdspm, id))
1842         snd_hdspm_midi_read_byte (hdspm, id);
1843 }
1844 
1845 static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1846 {
1847     unsigned long flags;
1848     int n_pending;
1849     int to_write;
1850     int i;
1851     unsigned char buf[128];
1852 
1853     /* Output is not interrupt driven */
1854 
1855     spin_lock_irqsave (&hmidi->lock, flags);
1856     if (hmidi->output &&
1857         !snd_rawmidi_transmit_empty (hmidi->output)) {
1858         n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1859                                 hmidi->id);
1860         if (n_pending > 0) {
1861             if (n_pending > (int)sizeof (buf))
1862                 n_pending = sizeof (buf);
1863 
1864             to_write = snd_rawmidi_transmit (hmidi->output, buf,
1865                              n_pending);
1866             if (to_write > 0) {
1867                 for (i = 0; i < to_write; ++i)
1868                     snd_hdspm_midi_write_byte (hmidi->hdspm,
1869                                    hmidi->id,
1870                                    buf[i]);
1871             }
1872         }
1873     }
1874     spin_unlock_irqrestore (&hmidi->lock, flags);
1875     return 0;
1876 }
1877 
1878 static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1879 {
1880     unsigned char buf[128]; /* this buffer is designed to match the MIDI
1881                  * input FIFO size
1882                  */
1883     unsigned long flags;
1884     int n_pending;
1885     int i;
1886 
1887     spin_lock_irqsave (&hmidi->lock, flags);
1888     n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1889     if (n_pending > 0) {
1890         if (hmidi->input) {
1891             if (n_pending > (int)sizeof (buf))
1892                 n_pending = sizeof (buf);
1893             for (i = 0; i < n_pending; ++i)
1894                 buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1895                                    hmidi->id);
1896             if (n_pending)
1897                 snd_rawmidi_receive (hmidi->input, buf,
1898                              n_pending);
1899         } else {
1900             /* flush the MIDI input FIFO */
1901             while (n_pending--)
1902                 snd_hdspm_midi_read_byte (hmidi->hdspm,
1903                               hmidi->id);
1904         }
1905     }
1906     hmidi->pending = 0;
1907     spin_unlock_irqrestore(&hmidi->lock, flags);
1908 
1909     spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1910     hmidi->hdspm->control_register |= hmidi->ie;
1911     hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1912             hmidi->hdspm->control_register);
1913     spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1914 
1915     return snd_hdspm_midi_output_write (hmidi);
1916 }
1917 
1918 static void
1919 snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1920 {
1921     struct hdspm *hdspm;
1922     struct hdspm_midi *hmidi;
1923     unsigned long flags;
1924 
1925     hmidi = substream->rmidi->private_data;
1926     hdspm = hmidi->hdspm;
1927 
1928     spin_lock_irqsave (&hdspm->lock, flags);
1929     if (up) {
1930         if (!(hdspm->control_register & hmidi->ie)) {
1931             snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1932             hdspm->control_register |= hmidi->ie;
1933         }
1934     } else {
1935         hdspm->control_register &= ~hmidi->ie;
1936     }
1937 
1938     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1939     spin_unlock_irqrestore (&hdspm->lock, flags);
1940 }
1941 
1942 static void snd_hdspm_midi_output_timer(struct timer_list *t)
1943 {
1944     struct hdspm_midi *hmidi = from_timer(hmidi, t, timer);
1945     unsigned long flags;
1946 
1947     snd_hdspm_midi_output_write(hmidi);
1948     spin_lock_irqsave (&hmidi->lock, flags);
1949 
1950     /* this does not bump hmidi->istimer, because the
1951        kernel automatically removed the timer when it
1952        expired, and we are now adding it back, thus
1953        leaving istimer wherever it was set before.
1954     */
1955 
1956     if (hmidi->istimer)
1957         mod_timer(&hmidi->timer, 1 + jiffies);
1958 
1959     spin_unlock_irqrestore (&hmidi->lock, flags);
1960 }
1961 
1962 static void
1963 snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1964 {
1965     struct hdspm_midi *hmidi;
1966     unsigned long flags;
1967 
1968     hmidi = substream->rmidi->private_data;
1969     spin_lock_irqsave (&hmidi->lock, flags);
1970     if (up) {
1971         if (!hmidi->istimer) {
1972             timer_setup(&hmidi->timer,
1973                     snd_hdspm_midi_output_timer, 0);
1974             mod_timer(&hmidi->timer, 1 + jiffies);
1975             hmidi->istimer++;
1976         }
1977     } else {
1978         if (hmidi->istimer && --hmidi->istimer <= 0)
1979             del_timer (&hmidi->timer);
1980     }
1981     spin_unlock_irqrestore (&hmidi->lock, flags);
1982     if (up)
1983         snd_hdspm_midi_output_write(hmidi);
1984 }
1985 
1986 static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1987 {
1988     struct hdspm_midi *hmidi;
1989 
1990     hmidi = substream->rmidi->private_data;
1991     spin_lock_irq (&hmidi->lock);
1992     snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1993     hmidi->input = substream;
1994     spin_unlock_irq (&hmidi->lock);
1995 
1996     return 0;
1997 }
1998 
1999 static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
2000 {
2001     struct hdspm_midi *hmidi;
2002 
2003     hmidi = substream->rmidi->private_data;
2004     spin_lock_irq (&hmidi->lock);
2005     hmidi->output = substream;
2006     spin_unlock_irq (&hmidi->lock);
2007 
2008     return 0;
2009 }
2010 
2011 static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
2012 {
2013     struct hdspm_midi *hmidi;
2014 
2015     snd_hdspm_midi_input_trigger (substream, 0);
2016 
2017     hmidi = substream->rmidi->private_data;
2018     spin_lock_irq (&hmidi->lock);
2019     hmidi->input = NULL;
2020     spin_unlock_irq (&hmidi->lock);
2021 
2022     return 0;
2023 }
2024 
2025 static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
2026 {
2027     struct hdspm_midi *hmidi;
2028 
2029     snd_hdspm_midi_output_trigger (substream, 0);
2030 
2031     hmidi = substream->rmidi->private_data;
2032     spin_lock_irq (&hmidi->lock);
2033     hmidi->output = NULL;
2034     spin_unlock_irq (&hmidi->lock);
2035 
2036     return 0;
2037 }
2038 
2039 static const struct snd_rawmidi_ops snd_hdspm_midi_output =
2040 {
2041     .open =     snd_hdspm_midi_output_open,
2042     .close =    snd_hdspm_midi_output_close,
2043     .trigger =  snd_hdspm_midi_output_trigger,
2044 };
2045 
2046 static const struct snd_rawmidi_ops snd_hdspm_midi_input =
2047 {
2048     .open =     snd_hdspm_midi_input_open,
2049     .close =    snd_hdspm_midi_input_close,
2050     .trigger =  snd_hdspm_midi_input_trigger,
2051 };
2052 
2053 static int snd_hdspm_create_midi(struct snd_card *card,
2054                  struct hdspm *hdspm, int id)
2055 {
2056     int err;
2057     char buf[64];
2058 
2059     hdspm->midi[id].id = id;
2060     hdspm->midi[id].hdspm = hdspm;
2061     spin_lock_init (&hdspm->midi[id].lock);
2062 
2063     if (0 == id) {
2064         if (MADIface == hdspm->io_type) {
2065             /* MIDI-over-MADI on HDSPe MADIface */
2066             hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
2067             hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
2068             hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
2069             hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
2070             hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
2071             hdspm->midi[0].irq = HDSPM_midi2IRQPending;
2072         } else {
2073             hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
2074             hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
2075             hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
2076             hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
2077             hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
2078             hdspm->midi[0].irq = HDSPM_midi0IRQPending;
2079         }
2080     } else if (1 == id) {
2081         hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
2082         hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
2083         hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
2084         hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
2085         hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
2086         hdspm->midi[1].irq = HDSPM_midi1IRQPending;
2087     } else if ((2 == id) && (MADI == hdspm->io_type)) {
2088         /* MIDI-over-MADI on HDSPe MADI */
2089         hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2090         hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2091         hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
2092         hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
2093         hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2094         hdspm->midi[2].irq = HDSPM_midi2IRQPending;
2095     } else if (2 == id) {
2096         /* TCO MTC, read only */
2097         hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
2098         hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
2099         hdspm->midi[2].dataOut = -1;
2100         hdspm->midi[2].statusOut = -1;
2101         hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
2102         hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
2103     } else if (3 == id) {
2104         /* TCO MTC on HDSPe MADI */
2105         hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
2106         hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
2107         hdspm->midi[3].dataOut = -1;
2108         hdspm->midi[3].statusOut = -1;
2109         hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
2110         hdspm->midi[3].irq = HDSPM_midi3IRQPending;
2111     }
2112 
2113     if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
2114                     (MADIface == hdspm->io_type)))) {
2115         if ((id == 0) && (MADIface == hdspm->io_type)) {
2116             snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
2117                  card->shortname);
2118         } else if ((id == 2) && (MADI == hdspm->io_type)) {
2119             snprintf(buf, sizeof(buf), "%s MIDIoverMADI",
2120                  card->shortname);
2121         } else {
2122             snprintf(buf, sizeof(buf), "%s MIDI %d",
2123                  card->shortname, id+1);
2124         }
2125         err = snd_rawmidi_new(card, buf, id, 1, 1,
2126                 &hdspm->midi[id].rmidi);
2127         if (err < 0)
2128             return err;
2129 
2130         snprintf(hdspm->midi[id].rmidi->name,
2131              sizeof(hdspm->midi[id].rmidi->name),
2132              "%s MIDI %d", card->id, id+1);
2133         hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2134 
2135         snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2136                 SNDRV_RAWMIDI_STREAM_OUTPUT,
2137                 &snd_hdspm_midi_output);
2138         snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2139                 SNDRV_RAWMIDI_STREAM_INPUT,
2140                 &snd_hdspm_midi_input);
2141 
2142         hdspm->midi[id].rmidi->info_flags |=
2143             SNDRV_RAWMIDI_INFO_OUTPUT |
2144             SNDRV_RAWMIDI_INFO_INPUT |
2145             SNDRV_RAWMIDI_INFO_DUPLEX;
2146     } else {
2147         /* TCO MTC, read only */
2148         snprintf(buf, sizeof(buf), "%s MTC %d",
2149              card->shortname, id+1);
2150         err = snd_rawmidi_new(card, buf, id, 1, 1,
2151                 &hdspm->midi[id].rmidi);
2152         if (err < 0)
2153             return err;
2154 
2155         snprintf(hdspm->midi[id].rmidi->name,
2156              sizeof(hdspm->midi[id].rmidi->name),
2157              "%s MTC %d", card->id, id+1);
2158         hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
2159 
2160         snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
2161                 SNDRV_RAWMIDI_STREAM_INPUT,
2162                 &snd_hdspm_midi_input);
2163 
2164         hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
2165     }
2166 
2167     return 0;
2168 }
2169 
2170 
2171 static void hdspm_midi_work(struct work_struct *work)
2172 {
2173     struct hdspm *hdspm = container_of(work, struct hdspm, midi_work);
2174     int i = 0;
2175 
2176     while (i < hdspm->midiPorts) {
2177         if (hdspm->midi[i].pending)
2178             snd_hdspm_midi_input_read(&hdspm->midi[i]);
2179 
2180         i++;
2181     }
2182 }
2183 
2184 
2185 /*-----------------------------------------------------------------------------
2186   Status Interface
2187   ----------------------------------------------------------------------------*/
2188 
2189 /* get the system sample rate which is set */
2190 
2191 
2192 static inline int hdspm_get_pll_freq(struct hdspm *hdspm)
2193 {
2194     unsigned int period, rate;
2195 
2196     period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
2197     rate = hdspm_calc_dds_value(hdspm, period);
2198 
2199     return rate;
2200 }
2201 
2202 /*
2203  * Calculate the real sample rate from the
2204  * current DDS value.
2205  */
2206 static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
2207 {
2208     unsigned int rate;
2209 
2210     rate = hdspm_get_pll_freq(hdspm);
2211 
2212     if (rate > 207000) {
2213         /* Unreasonable high sample rate as seen on PCI MADI cards. */
2214         if (0 == hdspm_system_clock_mode(hdspm)) {
2215             /* master mode, return internal sample rate */
2216             rate = hdspm->system_sample_rate;
2217         } else {
2218             /* slave mode, return external sample rate */
2219             rate = hdspm_external_sample_rate(hdspm);
2220             if (!rate)
2221                 rate = hdspm->system_sample_rate;
2222         }
2223     }
2224 
2225     return rate;
2226 }
2227 
2228 
2229 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
2230 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2231     .name = xname, \
2232     .index = xindex, \
2233     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2234         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2235     .info = snd_hdspm_info_system_sample_rate, \
2236     .put = snd_hdspm_put_system_sample_rate, \
2237     .get = snd_hdspm_get_system_sample_rate \
2238 }
2239 
2240 static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2241                          struct snd_ctl_elem_info *uinfo)
2242 {
2243     uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2244     uinfo->count = 1;
2245     uinfo->value.integer.min = 27000;
2246     uinfo->value.integer.max = 207000;
2247     uinfo->value.integer.step = 1;
2248     return 0;
2249 }
2250 
2251 
2252 static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2253                         struct snd_ctl_elem_value *
2254                         ucontrol)
2255 {
2256     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2257 
2258     ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2259     return 0;
2260 }
2261 
2262 static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol,
2263                         struct snd_ctl_elem_value *
2264                         ucontrol)
2265 {
2266     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2267     int rate = ucontrol->value.integer.value[0];
2268 
2269     if (rate < 27000 || rate > 207000)
2270         return -EINVAL;
2271     hdspm_set_dds_value(hdspm, ucontrol->value.integer.value[0]);
2272     return 0;
2273 }
2274 
2275 
2276 /*
2277  * Returns the WordClock sample rate class for the given card.
2278  */
2279 static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2280 {
2281     int status;
2282 
2283     switch (hdspm->io_type) {
2284     case RayDAT:
2285     case AIO:
2286         status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2287         return (status >> 16) & 0xF;
2288     case AES32:
2289         status = hdspm_read(hdspm, HDSPM_statusRegister);
2290         return (status >> HDSPM_AES32_wcFreq_bit) & 0xF;
2291     default:
2292         break;
2293     }
2294 
2295 
2296     return 0;
2297 }
2298 
2299 
2300 /*
2301  * Returns the TCO sample rate class for the given card.
2302  */
2303 static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2304 {
2305     int status;
2306 
2307     if (hdspm->tco) {
2308         switch (hdspm->io_type) {
2309         case RayDAT:
2310         case AIO:
2311             status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2312             return (status >> 20) & 0xF;
2313         case AES32:
2314             status = hdspm_read(hdspm, HDSPM_statusRegister);
2315             return (status >> 1) & 0xF;
2316         default:
2317             break;
2318         }
2319     }
2320 
2321     return 0;
2322 }
2323 
2324 
2325 /*
2326  * Returns the SYNC_IN sample rate class for the given card.
2327  */
2328 static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2329 {
2330     int status;
2331 
2332     if (hdspm->tco) {
2333         switch (hdspm->io_type) {
2334         case RayDAT:
2335         case AIO:
2336             status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2337             return (status >> 12) & 0xF;
2338         default:
2339             break;
2340         }
2341     }
2342 
2343     return 0;
2344 }
2345 
2346 /*
2347  * Returns the AES sample rate class for the given card.
2348  */
2349 static int hdspm_get_aes_sample_rate(struct hdspm *hdspm, int index)
2350 {
2351     int timecode;
2352 
2353     switch (hdspm->io_type) {
2354     case AES32:
2355         timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
2356         return (timecode >> (4*index)) & 0xF;
2357     default:
2358         break;
2359     }
2360     return 0;
2361 }
2362 
2363 /*
2364  * Returns the sample rate class for input source <idx> for
2365  * 'new style' cards like the AIO and RayDAT.
2366  */
2367 static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2368 {
2369     int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2370 
2371     return (status >> (idx*4)) & 0xF;
2372 }
2373 
2374 #define ENUMERATED_CTL_INFO(info, texts) \
2375     snd_ctl_enum_info(info, 1, ARRAY_SIZE(texts), texts)
2376 
2377 
2378 /* Helper function to query the external sample rate and return the
2379  * corresponding enum to be returned to userspace.
2380  */
2381 static int hdspm_external_rate_to_enum(struct hdspm *hdspm)
2382 {
2383     int rate = hdspm_external_sample_rate(hdspm);
2384     int i, selected_rate = 0;
2385     for (i = 1; i < 10; i++)
2386         if (HDSPM_bit2freq(i) == rate) {
2387             selected_rate = i;
2388             break;
2389         }
2390     return selected_rate;
2391 }
2392 
2393 
2394 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2395 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2396     .name = xname, \
2397     .private_value = xindex, \
2398     .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2399     .info = snd_hdspm_info_autosync_sample_rate, \
2400     .get = snd_hdspm_get_autosync_sample_rate \
2401 }
2402 
2403 
2404 static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2405                            struct snd_ctl_elem_info *uinfo)
2406 {
2407     ENUMERATED_CTL_INFO(uinfo, texts_freq);
2408     return 0;
2409 }
2410 
2411 
2412 static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2413                           struct snd_ctl_elem_value *
2414                           ucontrol)
2415 {
2416     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2417 
2418     switch (hdspm->io_type) {
2419     case RayDAT:
2420         switch (kcontrol->private_value) {
2421         case 0:
2422             ucontrol->value.enumerated.item[0] =
2423                 hdspm_get_wc_sample_rate(hdspm);
2424             break;
2425         case 7:
2426             ucontrol->value.enumerated.item[0] =
2427                 hdspm_get_tco_sample_rate(hdspm);
2428             break;
2429         case 8:
2430             ucontrol->value.enumerated.item[0] =
2431                 hdspm_get_sync_in_sample_rate(hdspm);
2432             break;
2433         default:
2434             ucontrol->value.enumerated.item[0] =
2435                 hdspm_get_s1_sample_rate(hdspm,
2436                         kcontrol->private_value-1);
2437         }
2438         break;
2439 
2440     case AIO:
2441         switch (kcontrol->private_value) {
2442         case 0: /* WC */
2443             ucontrol->value.enumerated.item[0] =
2444                 hdspm_get_wc_sample_rate(hdspm);
2445             break;
2446         case 4: /* TCO */
2447             ucontrol->value.enumerated.item[0] =
2448                 hdspm_get_tco_sample_rate(hdspm);
2449             break;
2450         case 5: /* SYNC_IN */
2451             ucontrol->value.enumerated.item[0] =
2452                 hdspm_get_sync_in_sample_rate(hdspm);
2453             break;
2454         default:
2455             ucontrol->value.enumerated.item[0] =
2456                 hdspm_get_s1_sample_rate(hdspm,
2457                         kcontrol->private_value-1);
2458         }
2459         break;
2460 
2461     case AES32:
2462 
2463         switch (kcontrol->private_value) {
2464         case 0: /* WC */
2465             ucontrol->value.enumerated.item[0] =
2466                 hdspm_get_wc_sample_rate(hdspm);
2467             break;
2468         case 9: /* TCO */
2469             ucontrol->value.enumerated.item[0] =
2470                 hdspm_get_tco_sample_rate(hdspm);
2471             break;
2472         case 10: /* SYNC_IN */
2473             ucontrol->value.enumerated.item[0] =
2474                 hdspm_get_sync_in_sample_rate(hdspm);
2475             break;
2476         case 11: /* External Rate */
2477             ucontrol->value.enumerated.item[0] =
2478                 hdspm_external_rate_to_enum(hdspm);
2479             break;
2480         default: /* AES1 to AES8 */
2481             ucontrol->value.enumerated.item[0] =
2482                 hdspm_get_aes_sample_rate(hdspm,
2483                         kcontrol->private_value -
2484                         HDSPM_AES32_AUTOSYNC_FROM_AES1);
2485             break;
2486         }
2487         break;
2488 
2489     case MADI:
2490     case MADIface:
2491         ucontrol->value.enumerated.item[0] =
2492             hdspm_external_rate_to_enum(hdspm);
2493         break;
2494     default:
2495         break;
2496     }
2497 
2498     return 0;
2499 }
2500 
2501 
2502 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2503 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2504     .name = xname, \
2505     .index = xindex, \
2506     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2507         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2508     .info = snd_hdspm_info_system_clock_mode, \
2509     .get = snd_hdspm_get_system_clock_mode, \
2510     .put = snd_hdspm_put_system_clock_mode, \
2511 }
2512 
2513 
2514 /*
2515  * Returns the system clock mode for the given card.
2516  * @returns 0 - master, 1 - slave
2517  */
2518 static int hdspm_system_clock_mode(struct hdspm *hdspm)
2519 {
2520     switch (hdspm->io_type) {
2521     case AIO:
2522     case RayDAT:
2523         if (hdspm->settings_register & HDSPM_c0Master)
2524             return 0;
2525         break;
2526 
2527     default:
2528         if (hdspm->control_register & HDSPM_ClockModeMaster)
2529             return 0;
2530     }
2531 
2532     return 1;
2533 }
2534 
2535 
2536 /*
2537  * Sets the system clock mode.
2538  * @param mode 0 - master, 1 - slave
2539  */
2540 static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2541 {
2542     hdspm_set_toggle_setting(hdspm,
2543             (hdspm_is_raydat_or_aio(hdspm)) ?
2544             HDSPM_c0Master : HDSPM_ClockModeMaster,
2545             (0 == mode));
2546 }
2547 
2548 
2549 static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2550                         struct snd_ctl_elem_info *uinfo)
2551 {
2552     static const char *const texts[] = { "Master", "AutoSync" };
2553     ENUMERATED_CTL_INFO(uinfo, texts);
2554     return 0;
2555 }
2556 
2557 static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2558                        struct snd_ctl_elem_value *ucontrol)
2559 {
2560     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2561 
2562     ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2563     return 0;
2564 }
2565 
2566 static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2567                        struct snd_ctl_elem_value *ucontrol)
2568 {
2569     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2570     int val;
2571 
2572     if (!snd_hdspm_use_is_exclusive(hdspm))
2573         return -EBUSY;
2574 
2575     val = ucontrol->value.enumerated.item[0];
2576     if (val < 0)
2577         val = 0;
2578     else if (val > 1)
2579         val = 1;
2580 
2581     hdspm_set_system_clock_mode(hdspm, val);
2582 
2583     return 0;
2584 }
2585 
2586 
2587 #define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2588 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2589     .name = xname, \
2590     .index = xindex, \
2591     .info = snd_hdspm_info_clock_source, \
2592     .get = snd_hdspm_get_clock_source, \
2593     .put = snd_hdspm_put_clock_source \
2594 }
2595 
2596 
2597 static int hdspm_clock_source(struct hdspm * hdspm)
2598 {
2599     switch (hdspm->system_sample_rate) {
2600     case 32000: return 0;
2601     case 44100: return 1;
2602     case 48000: return 2;
2603     case 64000: return 3;
2604     case 88200: return 4;
2605     case 96000: return 5;
2606     case 128000: return 6;
2607     case 176400: return 7;
2608     case 192000: return 8;
2609     }
2610 
2611     return -1;
2612 }
2613 
2614 static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2615 {
2616     int rate;
2617     switch (mode) {
2618     case 0:
2619         rate = 32000; break;
2620     case 1:
2621         rate = 44100; break;
2622     case 2:
2623         rate = 48000; break;
2624     case 3:
2625         rate = 64000; break;
2626     case 4:
2627         rate = 88200; break;
2628     case 5:
2629         rate = 96000; break;
2630     case 6:
2631         rate = 128000; break;
2632     case 7:
2633         rate = 176400; break;
2634     case 8:
2635         rate = 192000; break;
2636     default:
2637         rate = 48000;
2638     }
2639     hdspm_set_rate(hdspm, rate, 1);
2640     return 0;
2641 }
2642 
2643 static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2644                        struct snd_ctl_elem_info *uinfo)
2645 {
2646     return snd_ctl_enum_info(uinfo, 1, 9, texts_freq + 1);
2647 }
2648 
2649 static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2650                       struct snd_ctl_elem_value *ucontrol)
2651 {
2652     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2653 
2654     ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2655     return 0;
2656 }
2657 
2658 static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2659                       struct snd_ctl_elem_value *ucontrol)
2660 {
2661     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2662     int change;
2663     int val;
2664 
2665     if (!snd_hdspm_use_is_exclusive(hdspm))
2666         return -EBUSY;
2667     val = ucontrol->value.enumerated.item[0];
2668     if (val < 0)
2669         val = 0;
2670     if (val > 9)
2671         val = 9;
2672     spin_lock_irq(&hdspm->lock);
2673     if (val != hdspm_clock_source(hdspm))
2674         change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2675     else
2676         change = 0;
2677     spin_unlock_irq(&hdspm->lock);
2678     return change;
2679 }
2680 
2681 
2682 #define HDSPM_PREF_SYNC_REF(xname, xindex) \
2683 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2684     .name = xname, \
2685     .index = xindex, \
2686     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2687             SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2688     .info = snd_hdspm_info_pref_sync_ref, \
2689     .get = snd_hdspm_get_pref_sync_ref, \
2690     .put = snd_hdspm_put_pref_sync_ref \
2691 }
2692 
2693 
2694 /*
2695  * Returns the current preferred sync reference setting.
2696  * The semantics of the return value are depending on the
2697  * card, please see the comments for clarification.
2698  */
2699 static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2700 {
2701     switch (hdspm->io_type) {
2702     case AES32:
2703         switch (hdspm->control_register & HDSPM_SyncRefMask) {
2704         case 0: return 0;  /* WC */
2705         case HDSPM_SyncRef0: return 1; /* AES 1 */
2706         case HDSPM_SyncRef1: return 2; /* AES 2 */
2707         case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2708         case HDSPM_SyncRef2: return 4; /* AES 4 */
2709         case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2710         case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2711         case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2712                             return 7; /* AES 7 */
2713         case HDSPM_SyncRef3: return 8; /* AES 8 */
2714         case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2715         }
2716         break;
2717 
2718     case MADI:
2719     case MADIface:
2720         if (hdspm->tco) {
2721             switch (hdspm->control_register & HDSPM_SyncRefMask) {
2722             case 0: return 0;  /* WC */
2723             case HDSPM_SyncRef0: return 1;  /* MADI */
2724             case HDSPM_SyncRef1: return 2;  /* TCO */
2725             case HDSPM_SyncRef1+HDSPM_SyncRef0:
2726                          return 3;  /* SYNC_IN */
2727             }
2728         } else {
2729             switch (hdspm->control_register & HDSPM_SyncRefMask) {
2730             case 0: return 0;  /* WC */
2731             case HDSPM_SyncRef0: return 1;  /* MADI */
2732             case HDSPM_SyncRef1+HDSPM_SyncRef0:
2733                          return 2;  /* SYNC_IN */
2734             }
2735         }
2736         break;
2737 
2738     case RayDAT:
2739         if (hdspm->tco) {
2740             switch ((hdspm->settings_register &
2741                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2742             case 0: return 0;  /* WC */
2743             case 3: return 1;  /* ADAT 1 */
2744             case 4: return 2;  /* ADAT 2 */
2745             case 5: return 3;  /* ADAT 3 */
2746             case 6: return 4;  /* ADAT 4 */
2747             case 1: return 5;  /* AES */
2748             case 2: return 6;  /* SPDIF */
2749             case 9: return 7;  /* TCO */
2750             case 10: return 8; /* SYNC_IN */
2751             }
2752         } else {
2753             switch ((hdspm->settings_register &
2754                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2755             case 0: return 0;  /* WC */
2756             case 3: return 1;  /* ADAT 1 */
2757             case 4: return 2;  /* ADAT 2 */
2758             case 5: return 3;  /* ADAT 3 */
2759             case 6: return 4;  /* ADAT 4 */
2760             case 1: return 5;  /* AES */
2761             case 2: return 6;  /* SPDIF */
2762             case 10: return 7; /* SYNC_IN */
2763             }
2764         }
2765 
2766         break;
2767 
2768     case AIO:
2769         if (hdspm->tco) {
2770             switch ((hdspm->settings_register &
2771                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2772             case 0: return 0;  /* WC */
2773             case 3: return 1;  /* ADAT */
2774             case 1: return 2;  /* AES */
2775             case 2: return 3;  /* SPDIF */
2776             case 9: return 4;  /* TCO */
2777             case 10: return 5; /* SYNC_IN */
2778             }
2779         } else {
2780             switch ((hdspm->settings_register &
2781                 HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2782             case 0: return 0;  /* WC */
2783             case 3: return 1;  /* ADAT */
2784             case 1: return 2;  /* AES */
2785             case 2: return 3;  /* SPDIF */
2786             case 10: return 4; /* SYNC_IN */
2787             }
2788         }
2789 
2790         break;
2791     }
2792 
2793     return -1;
2794 }
2795 
2796 
2797 /*
2798  * Set the preferred sync reference to <pref>. The semantics
2799  * of <pref> are depending on the card type, see the comments
2800  * for clarification.
2801  */
2802 static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2803 {
2804     int p = 0;
2805 
2806     switch (hdspm->io_type) {
2807     case AES32:
2808         hdspm->control_register &= ~HDSPM_SyncRefMask;
2809         switch (pref) {
2810         case 0: /* WC  */
2811             break;
2812         case 1: /* AES 1 */
2813             hdspm->control_register |= HDSPM_SyncRef0;
2814             break;
2815         case 2: /* AES 2 */
2816             hdspm->control_register |= HDSPM_SyncRef1;
2817             break;
2818         case 3: /* AES 3 */
2819             hdspm->control_register |=
2820                 HDSPM_SyncRef1+HDSPM_SyncRef0;
2821             break;
2822         case 4: /* AES 4 */
2823             hdspm->control_register |= HDSPM_SyncRef2;
2824             break;
2825         case 5: /* AES 5 */
2826             hdspm->control_register |=
2827                 HDSPM_SyncRef2+HDSPM_SyncRef0;
2828             break;
2829         case 6: /* AES 6 */
2830             hdspm->control_register |=
2831                 HDSPM_SyncRef2+HDSPM_SyncRef1;
2832             break;
2833         case 7: /* AES 7 */
2834             hdspm->control_register |=
2835                 HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2836             break;
2837         case 8: /* AES 8 */
2838             hdspm->control_register |= HDSPM_SyncRef3;
2839             break;
2840         case 9: /* TCO */
2841             hdspm->control_register |=
2842                 HDSPM_SyncRef3+HDSPM_SyncRef0;
2843             break;
2844         default:
2845             return -1;
2846         }
2847 
2848         break;
2849 
2850     case MADI:
2851     case MADIface:
2852         hdspm->control_register &= ~HDSPM_SyncRefMask;
2853         if (hdspm->tco) {
2854             switch (pref) {
2855             case 0: /* WC */
2856                 break;
2857             case 1: /* MADI */
2858                 hdspm->control_register |= HDSPM_SyncRef0;
2859                 break;
2860             case 2: /* TCO */
2861                 hdspm->control_register |= HDSPM_SyncRef1;
2862                 break;
2863             case 3: /* SYNC_IN */
2864                 hdspm->control_register |=
2865                     HDSPM_SyncRef0+HDSPM_SyncRef1;
2866                 break;
2867             default:
2868                 return -1;
2869             }
2870         } else {
2871             switch (pref) {
2872             case 0: /* WC */
2873                 break;
2874             case 1: /* MADI */
2875                 hdspm->control_register |= HDSPM_SyncRef0;
2876                 break;
2877             case 2: /* SYNC_IN */
2878                 hdspm->control_register |=
2879                     HDSPM_SyncRef0+HDSPM_SyncRef1;
2880                 break;
2881             default:
2882                 return -1;
2883             }
2884         }
2885 
2886         break;
2887 
2888     case RayDAT:
2889         if (hdspm->tco) {
2890             switch (pref) {
2891             case 0: p = 0; break;  /* WC */
2892             case 1: p = 3; break;  /* ADAT 1 */
2893             case 2: p = 4; break;  /* ADAT 2 */
2894             case 3: p = 5; break;  /* ADAT 3 */
2895             case 4: p = 6; break;  /* ADAT 4 */
2896             case 5: p = 1; break;  /* AES */
2897             case 6: p = 2; break;  /* SPDIF */
2898             case 7: p = 9; break;  /* TCO */
2899             case 8: p = 10; break; /* SYNC_IN */
2900             default: return -1;
2901             }
2902         } else {
2903             switch (pref) {
2904             case 0: p = 0; break;  /* WC */
2905             case 1: p = 3; break;  /* ADAT 1 */
2906             case 2: p = 4; break;  /* ADAT 2 */
2907             case 3: p = 5; break;  /* ADAT 3 */
2908             case 4: p = 6; break;  /* ADAT 4 */
2909             case 5: p = 1; break;  /* AES */
2910             case 6: p = 2; break;  /* SPDIF */
2911             case 7: p = 10; break; /* SYNC_IN */
2912             default: return -1;
2913             }
2914         }
2915         break;
2916 
2917     case AIO:
2918         if (hdspm->tco) {
2919             switch (pref) {
2920             case 0: p = 0; break;  /* WC */
2921             case 1: p = 3; break;  /* ADAT */
2922             case 2: p = 1; break;  /* AES */
2923             case 3: p = 2; break;  /* SPDIF */
2924             case 4: p = 9; break;  /* TCO */
2925             case 5: p = 10; break; /* SYNC_IN */
2926             default: return -1;
2927             }
2928         } else {
2929             switch (pref) {
2930             case 0: p = 0; break;  /* WC */
2931             case 1: p = 3; break;  /* ADAT */
2932             case 2: p = 1; break;  /* AES */
2933             case 3: p = 2; break;  /* SPDIF */
2934             case 4: p = 10; break; /* SYNC_IN */
2935             default: return -1;
2936             }
2937         }
2938         break;
2939     }
2940 
2941     switch (hdspm->io_type) {
2942     case RayDAT:
2943     case AIO:
2944         hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2945         hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2946         hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2947         break;
2948 
2949     case MADI:
2950     case MADIface:
2951     case AES32:
2952         hdspm_write(hdspm, HDSPM_controlRegister,
2953                 hdspm->control_register);
2954     }
2955 
2956     return 0;
2957 }
2958 
2959 
2960 static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2961                     struct snd_ctl_elem_info *uinfo)
2962 {
2963     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2964 
2965     snd_ctl_enum_info(uinfo, 1, hdspm->texts_autosync_items, hdspm->texts_autosync);
2966 
2967     return 0;
2968 }
2969 
2970 static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2971                        struct snd_ctl_elem_value *ucontrol)
2972 {
2973     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2974     int psf = hdspm_pref_sync_ref(hdspm);
2975 
2976     if (psf >= 0) {
2977         ucontrol->value.enumerated.item[0] = psf;
2978         return 0;
2979     }
2980 
2981     return -1;
2982 }
2983 
2984 static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2985                        struct snd_ctl_elem_value *ucontrol)
2986 {
2987     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2988     int val, change = 0;
2989 
2990     if (!snd_hdspm_use_is_exclusive(hdspm))
2991         return -EBUSY;
2992 
2993     val = ucontrol->value.enumerated.item[0];
2994 
2995     if (val < 0)
2996         val = 0;
2997     else if (val >= hdspm->texts_autosync_items)
2998         val = hdspm->texts_autosync_items-1;
2999 
3000     spin_lock_irq(&hdspm->lock);
3001     if (val != hdspm_pref_sync_ref(hdspm))
3002         change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
3003 
3004     spin_unlock_irq(&hdspm->lock);
3005     return change;
3006 }
3007 
3008 
3009 #define HDSPM_AUTOSYNC_REF(xname, xindex) \
3010 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3011     .name = xname, \
3012     .index = xindex, \
3013     .access = SNDRV_CTL_ELEM_ACCESS_READ, \
3014     .info = snd_hdspm_info_autosync_ref, \
3015     .get = snd_hdspm_get_autosync_ref, \
3016 }
3017 
3018 static int hdspm_autosync_ref(struct hdspm *hdspm)
3019 {
3020     /* This looks at the autosync selected sync reference */
3021     if (AES32 == hdspm->io_type) {
3022 
3023         unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
3024         unsigned int syncref = (status >> HDSPM_AES32_syncref_bit) & 0xF;
3025         /* syncref >= HDSPM_AES32_AUTOSYNC_FROM_WORD is always true */
3026         if (syncref <= HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN) {
3027             return syncref;
3028         }
3029         return HDSPM_AES32_AUTOSYNC_FROM_NONE;
3030 
3031     } else if (MADI == hdspm->io_type) {
3032 
3033         unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3034         switch (status2 & HDSPM_SelSyncRefMask) {
3035         case HDSPM_SelSyncRef_WORD:
3036             return HDSPM_AUTOSYNC_FROM_WORD;
3037         case HDSPM_SelSyncRef_MADI:
3038             return HDSPM_AUTOSYNC_FROM_MADI;
3039         case HDSPM_SelSyncRef_TCO:
3040             return HDSPM_AUTOSYNC_FROM_TCO;
3041         case HDSPM_SelSyncRef_SyncIn:
3042             return HDSPM_AUTOSYNC_FROM_SYNC_IN;
3043         case HDSPM_SelSyncRef_NVALID:
3044             return HDSPM_AUTOSYNC_FROM_NONE;
3045         default:
3046             return HDSPM_AUTOSYNC_FROM_NONE;
3047         }
3048 
3049     }
3050     return 0;
3051 }
3052 
3053 
3054 static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
3055                        struct snd_ctl_elem_info *uinfo)
3056 {
3057     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3058 
3059     if (AES32 == hdspm->io_type) {
3060         static const char *const texts[] = { "WordClock", "AES1", "AES2", "AES3",
3061             "AES4", "AES5", "AES6", "AES7", "AES8", "TCO", "Sync In", "None"};
3062 
3063         ENUMERATED_CTL_INFO(uinfo, texts);
3064     } else if (MADI == hdspm->io_type) {
3065         static const char *const texts[] = {"Word Clock", "MADI", "TCO",
3066             "Sync In", "None" };
3067 
3068         ENUMERATED_CTL_INFO(uinfo, texts);
3069     }
3070     return 0;
3071 }
3072 
3073 static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
3074                       struct snd_ctl_elem_value *ucontrol)
3075 {
3076     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3077 
3078     ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
3079     return 0;
3080 }
3081 
3082 
3083 
3084 #define HDSPM_TCO_VIDEO_INPUT_FORMAT(xname, xindex) \
3085 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3086     .name = xname, \
3087     .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3088         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3089     .info = snd_hdspm_info_tco_video_input_format, \
3090     .get = snd_hdspm_get_tco_video_input_format, \
3091 }
3092 
3093 static int snd_hdspm_info_tco_video_input_format(struct snd_kcontrol *kcontrol,
3094                        struct snd_ctl_elem_info *uinfo)
3095 {
3096     static const char *const texts[] = {"No video", "NTSC", "PAL"};
3097     ENUMERATED_CTL_INFO(uinfo, texts);
3098     return 0;
3099 }
3100 
3101 static int snd_hdspm_get_tco_video_input_format(struct snd_kcontrol *kcontrol,
3102                       struct snd_ctl_elem_value *ucontrol)
3103 {
3104     u32 status;
3105     int ret = 0;
3106 
3107     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3108     status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3109     switch (status & (HDSPM_TCO1_Video_Input_Format_NTSC |
3110             HDSPM_TCO1_Video_Input_Format_PAL)) {
3111     case HDSPM_TCO1_Video_Input_Format_NTSC:
3112         /* ntsc */
3113         ret = 1;
3114         break;
3115     case HDSPM_TCO1_Video_Input_Format_PAL:
3116         /* pal */
3117         ret = 2;
3118         break;
3119     default:
3120         /* no video */
3121         ret = 0;
3122         break;
3123     }
3124     ucontrol->value.enumerated.item[0] = ret;
3125     return 0;
3126 }
3127 
3128 
3129 
3130 #define HDSPM_TCO_LTC_FRAMES(xname, xindex) \
3131 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3132     .name = xname, \
3133     .access = SNDRV_CTL_ELEM_ACCESS_READ |\
3134         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3135     .info = snd_hdspm_info_tco_ltc_frames, \
3136     .get = snd_hdspm_get_tco_ltc_frames, \
3137 }
3138 
3139 static int snd_hdspm_info_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3140                        struct snd_ctl_elem_info *uinfo)
3141 {
3142     static const char *const texts[] = {"No lock", "24 fps", "25 fps", "29.97 fps",
3143                 "30 fps"};
3144     ENUMERATED_CTL_INFO(uinfo, texts);
3145     return 0;
3146 }
3147 
3148 static int hdspm_tco_ltc_frames(struct hdspm *hdspm)
3149 {
3150     u32 status;
3151     int ret = 0;
3152 
3153     status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3154     if (status & HDSPM_TCO1_LTC_Input_valid) {
3155         switch (status & (HDSPM_TCO1_LTC_Format_LSB |
3156                     HDSPM_TCO1_LTC_Format_MSB)) {
3157         case 0:
3158             /* 24 fps */
3159             ret = fps_24;
3160             break;
3161         case HDSPM_TCO1_LTC_Format_LSB:
3162             /* 25 fps */
3163             ret = fps_25;
3164             break;
3165         case HDSPM_TCO1_LTC_Format_MSB:
3166             /* 29.97 fps */
3167             ret = fps_2997;
3168             break;
3169         default:
3170             /* 30 fps */
3171             ret = fps_30;
3172             break;
3173         }
3174     }
3175 
3176     return ret;
3177 }
3178 
3179 static int snd_hdspm_get_tco_ltc_frames(struct snd_kcontrol *kcontrol,
3180                       struct snd_ctl_elem_value *ucontrol)
3181 {
3182     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3183 
3184     ucontrol->value.enumerated.item[0] = hdspm_tco_ltc_frames(hdspm);
3185     return 0;
3186 }
3187 
3188 #define HDSPM_TOGGLE_SETTING(xname, xindex) \
3189 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3190     .name = xname, \
3191     .private_value = xindex, \
3192     .info = snd_hdspm_info_toggle_setting, \
3193     .get = snd_hdspm_get_toggle_setting, \
3194     .put = snd_hdspm_put_toggle_setting \
3195 }
3196 
3197 static int hdspm_toggle_setting(struct hdspm *hdspm, u32 regmask)
3198 {
3199     u32 reg;
3200 
3201     if (hdspm_is_raydat_or_aio(hdspm))
3202         reg = hdspm->settings_register;
3203     else
3204         reg = hdspm->control_register;
3205 
3206     return (reg & regmask) ? 1 : 0;
3207 }
3208 
3209 static int hdspm_set_toggle_setting(struct hdspm *hdspm, u32 regmask, int out)
3210 {
3211     u32 *reg;
3212     u32 target_reg;
3213 
3214     if (hdspm_is_raydat_or_aio(hdspm)) {
3215         reg = &(hdspm->settings_register);
3216         target_reg = HDSPM_WR_SETTINGS;
3217     } else {
3218         reg = &(hdspm->control_register);
3219         target_reg = HDSPM_controlRegister;
3220     }
3221 
3222     if (out)
3223         *reg |= regmask;
3224     else
3225         *reg &= ~regmask;
3226 
3227     hdspm_write(hdspm, target_reg, *reg);
3228 
3229     return 0;
3230 }
3231 
3232 #define snd_hdspm_info_toggle_setting       snd_ctl_boolean_mono_info
3233 
3234 static int snd_hdspm_get_toggle_setting(struct snd_kcontrol *kcontrol,
3235                    struct snd_ctl_elem_value *ucontrol)
3236 {
3237     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3238     u32 regmask = kcontrol->private_value;
3239 
3240     spin_lock_irq(&hdspm->lock);
3241     ucontrol->value.integer.value[0] = hdspm_toggle_setting(hdspm, regmask);
3242     spin_unlock_irq(&hdspm->lock);
3243     return 0;
3244 }
3245 
3246 static int snd_hdspm_put_toggle_setting(struct snd_kcontrol *kcontrol,
3247                    struct snd_ctl_elem_value *ucontrol)
3248 {
3249     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3250     u32 regmask = kcontrol->private_value;
3251     int change;
3252     unsigned int val;
3253 
3254     if (!snd_hdspm_use_is_exclusive(hdspm))
3255         return -EBUSY;
3256     val = ucontrol->value.integer.value[0] & 1;
3257     spin_lock_irq(&hdspm->lock);
3258     change = (int) val != hdspm_toggle_setting(hdspm, regmask);
3259     hdspm_set_toggle_setting(hdspm, regmask, val);
3260     spin_unlock_irq(&hdspm->lock);
3261     return change;
3262 }
3263 
3264 #define HDSPM_INPUT_SELECT(xname, xindex) \
3265 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3266     .name = xname, \
3267     .index = xindex, \
3268     .info = snd_hdspm_info_input_select, \
3269     .get = snd_hdspm_get_input_select, \
3270     .put = snd_hdspm_put_input_select \
3271 }
3272 
3273 static int hdspm_input_select(struct hdspm * hdspm)
3274 {
3275     return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3276 }
3277 
3278 static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3279 {
3280     if (out)
3281         hdspm->control_register |= HDSPM_InputSelect0;
3282     else
3283         hdspm->control_register &= ~HDSPM_InputSelect0;
3284     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3285 
3286     return 0;
3287 }
3288 
3289 static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3290                        struct snd_ctl_elem_info *uinfo)
3291 {
3292     static const char *const texts[] = { "optical", "coaxial" };
3293     ENUMERATED_CTL_INFO(uinfo, texts);
3294     return 0;
3295 }
3296 
3297 static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3298                       struct snd_ctl_elem_value *ucontrol)
3299 {
3300     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3301 
3302     spin_lock_irq(&hdspm->lock);
3303     ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3304     spin_unlock_irq(&hdspm->lock);
3305     return 0;
3306 }
3307 
3308 static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3309                       struct snd_ctl_elem_value *ucontrol)
3310 {
3311     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3312     int change;
3313     unsigned int val;
3314 
3315     if (!snd_hdspm_use_is_exclusive(hdspm))
3316         return -EBUSY;
3317     val = ucontrol->value.integer.value[0] & 1;
3318     spin_lock_irq(&hdspm->lock);
3319     change = (int) val != hdspm_input_select(hdspm);
3320     hdspm_set_input_select(hdspm, val);
3321     spin_unlock_irq(&hdspm->lock);
3322     return change;
3323 }
3324 
3325 
3326 #define HDSPM_DS_WIRE(xname, xindex) \
3327 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3328     .name = xname, \
3329     .index = xindex, \
3330     .info = snd_hdspm_info_ds_wire, \
3331     .get = snd_hdspm_get_ds_wire, \
3332     .put = snd_hdspm_put_ds_wire \
3333 }
3334 
3335 static int hdspm_ds_wire(struct hdspm * hdspm)
3336 {
3337     return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3338 }
3339 
3340 static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3341 {
3342     if (ds)
3343         hdspm->control_register |= HDSPM_DS_DoubleWire;
3344     else
3345         hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3346     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3347 
3348     return 0;
3349 }
3350 
3351 static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3352                   struct snd_ctl_elem_info *uinfo)
3353 {
3354     static const char *const texts[] = { "Single", "Double" };
3355     ENUMERATED_CTL_INFO(uinfo, texts);
3356     return 0;
3357 }
3358 
3359 static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3360                  struct snd_ctl_elem_value *ucontrol)
3361 {
3362     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3363 
3364     spin_lock_irq(&hdspm->lock);
3365     ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3366     spin_unlock_irq(&hdspm->lock);
3367     return 0;
3368 }
3369 
3370 static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3371                  struct snd_ctl_elem_value *ucontrol)
3372 {
3373     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3374     int change;
3375     unsigned int val;
3376 
3377     if (!snd_hdspm_use_is_exclusive(hdspm))
3378         return -EBUSY;
3379     val = ucontrol->value.integer.value[0] & 1;
3380     spin_lock_irq(&hdspm->lock);
3381     change = (int) val != hdspm_ds_wire(hdspm);
3382     hdspm_set_ds_wire(hdspm, val);
3383     spin_unlock_irq(&hdspm->lock);
3384     return change;
3385 }
3386 
3387 
3388 #define HDSPM_QS_WIRE(xname, xindex) \
3389 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3390     .name = xname, \
3391     .index = xindex, \
3392     .info = snd_hdspm_info_qs_wire, \
3393     .get = snd_hdspm_get_qs_wire, \
3394     .put = snd_hdspm_put_qs_wire \
3395 }
3396 
3397 static int hdspm_qs_wire(struct hdspm * hdspm)
3398 {
3399     if (hdspm->control_register & HDSPM_QS_DoubleWire)
3400         return 1;
3401     if (hdspm->control_register & HDSPM_QS_QuadWire)
3402         return 2;
3403     return 0;
3404 }
3405 
3406 static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3407 {
3408     hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3409     switch (mode) {
3410     case 0:
3411         break;
3412     case 1:
3413         hdspm->control_register |= HDSPM_QS_DoubleWire;
3414         break;
3415     case 2:
3416         hdspm->control_register |= HDSPM_QS_QuadWire;
3417         break;
3418     }
3419     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3420 
3421     return 0;
3422 }
3423 
3424 static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3425                        struct snd_ctl_elem_info *uinfo)
3426 {
3427     static const char *const texts[] = { "Single", "Double", "Quad" };
3428     ENUMERATED_CTL_INFO(uinfo, texts);
3429     return 0;
3430 }
3431 
3432 static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3433                       struct snd_ctl_elem_value *ucontrol)
3434 {
3435     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3436 
3437     spin_lock_irq(&hdspm->lock);
3438     ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3439     spin_unlock_irq(&hdspm->lock);
3440     return 0;
3441 }
3442 
3443 static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3444                       struct snd_ctl_elem_value *ucontrol)
3445 {
3446     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3447     int change;
3448     int val;
3449 
3450     if (!snd_hdspm_use_is_exclusive(hdspm))
3451         return -EBUSY;
3452     val = ucontrol->value.integer.value[0];
3453     if (val < 0)
3454         val = 0;
3455     if (val > 2)
3456         val = 2;
3457     spin_lock_irq(&hdspm->lock);
3458     change = val != hdspm_qs_wire(hdspm);
3459     hdspm_set_qs_wire(hdspm, val);
3460     spin_unlock_irq(&hdspm->lock);
3461     return change;
3462 }
3463 
3464 #define HDSPM_CONTROL_TRISTATE(xname, xindex) \
3465 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3466     .name = xname, \
3467     .private_value = xindex, \
3468     .info = snd_hdspm_info_tristate, \
3469     .get = snd_hdspm_get_tristate, \
3470     .put = snd_hdspm_put_tristate \
3471 }
3472 
3473 static int hdspm_tristate(struct hdspm *hdspm, u32 regmask)
3474 {
3475     u32 reg = hdspm->settings_register & (regmask * 3);
3476     return reg / regmask;
3477 }
3478 
3479 static int hdspm_set_tristate(struct hdspm *hdspm, int mode, u32 regmask)
3480 {
3481     hdspm->settings_register &= ~(regmask * 3);
3482     hdspm->settings_register |= (regmask * mode);
3483     hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
3484 
3485     return 0;
3486 }
3487 
3488 static int snd_hdspm_info_tristate(struct snd_kcontrol *kcontrol,
3489                        struct snd_ctl_elem_info *uinfo)
3490 {
3491     u32 regmask = kcontrol->private_value;
3492 
3493     static const char *const texts_spdif[] = { "Optical", "Coaxial", "Internal" };
3494     static const char *const texts_levels[] = { "Hi Gain", "+4 dBu", "-10 dBV" };
3495 
3496     switch (regmask) {
3497     case HDSPM_c0_Input0:
3498         ENUMERATED_CTL_INFO(uinfo, texts_spdif);
3499         break;
3500     default:
3501         ENUMERATED_CTL_INFO(uinfo, texts_levels);
3502         break;
3503     }
3504     return 0;
3505 }
3506 
3507 static int snd_hdspm_get_tristate(struct snd_kcontrol *kcontrol,
3508                       struct snd_ctl_elem_value *ucontrol)
3509 {
3510     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3511     u32 regmask = kcontrol->private_value;
3512 
3513     spin_lock_irq(&hdspm->lock);
3514     ucontrol->value.enumerated.item[0] = hdspm_tristate(hdspm, regmask);
3515     spin_unlock_irq(&hdspm->lock);
3516     return 0;
3517 }
3518 
3519 static int snd_hdspm_put_tristate(struct snd_kcontrol *kcontrol,
3520                       struct snd_ctl_elem_value *ucontrol)
3521 {
3522     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3523     u32 regmask = kcontrol->private_value;
3524     int change;
3525     int val;
3526 
3527     if (!snd_hdspm_use_is_exclusive(hdspm))
3528         return -EBUSY;
3529     val = ucontrol->value.integer.value[0];
3530     if (val < 0)
3531         val = 0;
3532     if (val > 2)
3533         val = 2;
3534 
3535     spin_lock_irq(&hdspm->lock);
3536     change = val != hdspm_tristate(hdspm, regmask);
3537     hdspm_set_tristate(hdspm, val, regmask);
3538     spin_unlock_irq(&hdspm->lock);
3539     return change;
3540 }
3541 
3542 #define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3543 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3544     .name = xname, \
3545     .index = xindex, \
3546     .info = snd_hdspm_info_madi_speedmode, \
3547     .get = snd_hdspm_get_madi_speedmode, \
3548     .put = snd_hdspm_put_madi_speedmode \
3549 }
3550 
3551 static int hdspm_madi_speedmode(struct hdspm *hdspm)
3552 {
3553     if (hdspm->control_register & HDSPM_QuadSpeed)
3554         return 2;
3555     if (hdspm->control_register & HDSPM_DoubleSpeed)
3556         return 1;
3557     return 0;
3558 }
3559 
3560 static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3561 {
3562     hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3563     switch (mode) {
3564     case 0:
3565         break;
3566     case 1:
3567         hdspm->control_register |= HDSPM_DoubleSpeed;
3568         break;
3569     case 2:
3570         hdspm->control_register |= HDSPM_QuadSpeed;
3571         break;
3572     }
3573     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3574 
3575     return 0;
3576 }
3577 
3578 static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3579                        struct snd_ctl_elem_info *uinfo)
3580 {
3581     static const char *const texts[] = { "Single", "Double", "Quad" };
3582     ENUMERATED_CTL_INFO(uinfo, texts);
3583     return 0;
3584 }
3585 
3586 static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3587                       struct snd_ctl_elem_value *ucontrol)
3588 {
3589     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3590 
3591     spin_lock_irq(&hdspm->lock);
3592     ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3593     spin_unlock_irq(&hdspm->lock);
3594     return 0;
3595 }
3596 
3597 static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3598                       struct snd_ctl_elem_value *ucontrol)
3599 {
3600     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3601     int change;
3602     int val;
3603 
3604     if (!snd_hdspm_use_is_exclusive(hdspm))
3605         return -EBUSY;
3606     val = ucontrol->value.integer.value[0];
3607     if (val < 0)
3608         val = 0;
3609     if (val > 2)
3610         val = 2;
3611     spin_lock_irq(&hdspm->lock);
3612     change = val != hdspm_madi_speedmode(hdspm);
3613     hdspm_set_madi_speedmode(hdspm, val);
3614     spin_unlock_irq(&hdspm->lock);
3615     return change;
3616 }
3617 
3618 #define HDSPM_MIXER(xname, xindex) \
3619 {   .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3620     .name = xname, \
3621     .index = xindex, \
3622     .device = 0, \
3623     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3624         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3625     .info = snd_hdspm_info_mixer, \
3626     .get = snd_hdspm_get_mixer, \
3627     .put = snd_hdspm_put_mixer \
3628 }
3629 
3630 static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3631                 struct snd_ctl_elem_info *uinfo)
3632 {
3633     uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3634     uinfo->count = 3;
3635     uinfo->value.integer.min = 0;
3636     uinfo->value.integer.max = 65535;
3637     uinfo->value.integer.step = 1;
3638     return 0;
3639 }
3640 
3641 static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3642                    struct snd_ctl_elem_value *ucontrol)
3643 {
3644     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3645     int source;
3646     int destination;
3647 
3648     source = ucontrol->value.integer.value[0];
3649     if (source < 0)
3650         source = 0;
3651     else if (source >= 2 * HDSPM_MAX_CHANNELS)
3652         source = 2 * HDSPM_MAX_CHANNELS - 1;
3653 
3654     destination = ucontrol->value.integer.value[1];
3655     if (destination < 0)
3656         destination = 0;
3657     else if (destination >= HDSPM_MAX_CHANNELS)
3658         destination = HDSPM_MAX_CHANNELS - 1;
3659 
3660     spin_lock_irq(&hdspm->lock);
3661     if (source >= HDSPM_MAX_CHANNELS)
3662         ucontrol->value.integer.value[2] =
3663             hdspm_read_pb_gain(hdspm, destination,
3664                        source - HDSPM_MAX_CHANNELS);
3665     else
3666         ucontrol->value.integer.value[2] =
3667             hdspm_read_in_gain(hdspm, destination, source);
3668 
3669     spin_unlock_irq(&hdspm->lock);
3670 
3671     return 0;
3672 }
3673 
3674 static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3675                    struct snd_ctl_elem_value *ucontrol)
3676 {
3677     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3678     int change;
3679     int source;
3680     int destination;
3681     int gain;
3682 
3683     if (!snd_hdspm_use_is_exclusive(hdspm))
3684         return -EBUSY;
3685 
3686     source = ucontrol->value.integer.value[0];
3687     destination = ucontrol->value.integer.value[1];
3688 
3689     if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3690         return -1;
3691     if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3692         return -1;
3693 
3694     gain = ucontrol->value.integer.value[2];
3695 
3696     spin_lock_irq(&hdspm->lock);
3697 
3698     if (source >= HDSPM_MAX_CHANNELS)
3699         change = gain != hdspm_read_pb_gain(hdspm, destination,
3700                             source -
3701                             HDSPM_MAX_CHANNELS);
3702     else
3703         change = gain != hdspm_read_in_gain(hdspm, destination,
3704                             source);
3705 
3706     if (change) {
3707         if (source >= HDSPM_MAX_CHANNELS)
3708             hdspm_write_pb_gain(hdspm, destination,
3709                         source - HDSPM_MAX_CHANNELS,
3710                         gain);
3711         else
3712             hdspm_write_in_gain(hdspm, destination, source,
3713                         gain);
3714     }
3715     spin_unlock_irq(&hdspm->lock);
3716 
3717     return change;
3718 }
3719 
3720 /* The simple mixer control(s) provide gain control for the
3721    basic 1:1 mappings of playback streams to output
3722    streams.
3723 */
3724 
3725 #define HDSPM_PLAYBACK_MIXER \
3726 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3727     .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3728         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3729     .info = snd_hdspm_info_playback_mixer, \
3730     .get = snd_hdspm_get_playback_mixer, \
3731     .put = snd_hdspm_put_playback_mixer \
3732 }
3733 
3734 static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3735                      struct snd_ctl_elem_info *uinfo)
3736 {
3737     uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3738     uinfo->count = 1;
3739     uinfo->value.integer.min = 0;
3740     uinfo->value.integer.max = 64;
3741     uinfo->value.integer.step = 1;
3742     return 0;
3743 }
3744 
3745 static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3746                     struct snd_ctl_elem_value *ucontrol)
3747 {
3748     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3749     int channel;
3750 
3751     channel = ucontrol->id.index - 1;
3752 
3753     if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3754         return -EINVAL;
3755 
3756     spin_lock_irq(&hdspm->lock);
3757     ucontrol->value.integer.value[0] =
3758       (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3759     spin_unlock_irq(&hdspm->lock);
3760 
3761     return 0;
3762 }
3763 
3764 static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3765                     struct snd_ctl_elem_value *ucontrol)
3766 {
3767     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3768     int change;
3769     int channel;
3770     int gain;
3771 
3772     if (!snd_hdspm_use_is_exclusive(hdspm))
3773         return -EBUSY;
3774 
3775     channel = ucontrol->id.index - 1;
3776 
3777     if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3778         return -EINVAL;
3779 
3780     gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3781 
3782     spin_lock_irq(&hdspm->lock);
3783     change =
3784         gain != hdspm_read_pb_gain(hdspm, channel,
3785                        channel);
3786     if (change)
3787         hdspm_write_pb_gain(hdspm, channel, channel,
3788                     gain);
3789     spin_unlock_irq(&hdspm->lock);
3790     return change;
3791 }
3792 
3793 #define HDSPM_SYNC_CHECK(xname, xindex) \
3794 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3795     .name = xname, \
3796     .private_value = xindex, \
3797     .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3798     .info = snd_hdspm_info_sync_check, \
3799     .get = snd_hdspm_get_sync_check \
3800 }
3801 
3802 #define HDSPM_TCO_LOCK_CHECK(xname, xindex) \
3803 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3804     .name = xname, \
3805     .private_value = xindex, \
3806     .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3807     .info = snd_hdspm_tco_info_lock_check, \
3808     .get = snd_hdspm_get_sync_check \
3809 }
3810 
3811 
3812 
3813 static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3814                      struct snd_ctl_elem_info *uinfo)
3815 {
3816     static const char *const texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3817     ENUMERATED_CTL_INFO(uinfo, texts);
3818     return 0;
3819 }
3820 
3821 static int snd_hdspm_tco_info_lock_check(struct snd_kcontrol *kcontrol,
3822                      struct snd_ctl_elem_info *uinfo)
3823 {
3824     static const char *const texts[] = { "No Lock", "Lock" };
3825     ENUMERATED_CTL_INFO(uinfo, texts);
3826     return 0;
3827 }
3828 
3829 static int hdspm_wc_sync_check(struct hdspm *hdspm)
3830 {
3831     int status, status2;
3832 
3833     switch (hdspm->io_type) {
3834     case AES32:
3835         status = hdspm_read(hdspm, HDSPM_statusRegister);
3836         if (status & HDSPM_AES32_wcLock) {
3837             if (status & HDSPM_AES32_wcSync)
3838                 return 2;
3839             else
3840                 return 1;
3841         }
3842         return 0;
3843 
3844     case MADI:
3845         status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3846         if (status2 & HDSPM_wcLock) {
3847             if (status2 & HDSPM_wcSync)
3848                 return 2;
3849             else
3850                 return 1;
3851         }
3852         return 0;
3853 
3854     case RayDAT:
3855     case AIO:
3856         status = hdspm_read(hdspm, HDSPM_statusRegister);
3857 
3858         if (status & 0x2000000)
3859             return 2;
3860         else if (status & 0x1000000)
3861             return 1;
3862         return 0;
3863 
3864     case MADIface:
3865         break;
3866     }
3867 
3868 
3869     return 3;
3870 }
3871 
3872 
3873 static int hdspm_madi_sync_check(struct hdspm *hdspm)
3874 {
3875     int status = hdspm_read(hdspm, HDSPM_statusRegister);
3876     if (status & HDSPM_madiLock) {
3877         if (status & HDSPM_madiSync)
3878             return 2;
3879         else
3880             return 1;
3881     }
3882     return 0;
3883 }
3884 
3885 
3886 static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3887 {
3888     int status, lock, sync;
3889 
3890     status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3891 
3892     lock = (status & (0x1<<idx)) ? 1 : 0;
3893     sync = (status & (0x100<<idx)) ? 1 : 0;
3894 
3895     if (lock && sync)
3896         return 2;
3897     else if (lock)
3898         return 1;
3899     return 0;
3900 }
3901 
3902 
3903 static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3904 {
3905     int status, lock = 0, sync = 0;
3906 
3907     switch (hdspm->io_type) {
3908     case RayDAT:
3909     case AIO:
3910         status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3911         lock = (status & 0x400) ? 1 : 0;
3912         sync = (status & 0x800) ? 1 : 0;
3913         break;
3914 
3915     case MADI:
3916         status = hdspm_read(hdspm, HDSPM_statusRegister);
3917         lock = (status & HDSPM_syncInLock) ? 1 : 0;
3918         sync = (status & HDSPM_syncInSync) ? 1 : 0;
3919         break;
3920 
3921     case AES32:
3922         status = hdspm_read(hdspm, HDSPM_statusRegister2);
3923         lock = (status & 0x100000) ? 1 : 0;
3924         sync = (status & 0x200000) ? 1 : 0;
3925         break;
3926 
3927     case MADIface:
3928         break;
3929     }
3930 
3931     if (lock && sync)
3932         return 2;
3933     else if (lock)
3934         return 1;
3935 
3936     return 0;
3937 }
3938 
3939 static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3940 {
3941     int status2, lock, sync;
3942     status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3943 
3944     lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3945     sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3946 
3947     if (sync)
3948         return 2;
3949     else if (lock)
3950         return 1;
3951     return 0;
3952 }
3953 
3954 static int hdspm_tco_input_check(struct hdspm *hdspm, u32 mask)
3955 {
3956     u32 status;
3957     status = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
3958 
3959     return (status & mask) ? 1 : 0;
3960 }
3961 
3962 
3963 static int hdspm_tco_sync_check(struct hdspm *hdspm)
3964 {
3965     int status;
3966 
3967     if (hdspm->tco) {
3968         switch (hdspm->io_type) {
3969         case MADI:
3970             status = hdspm_read(hdspm, HDSPM_statusRegister);
3971             if (status & HDSPM_tcoLockMadi) {
3972                 if (status & HDSPM_tcoSync)
3973                     return 2;
3974                 else
3975                     return 1;
3976             }
3977             return 0;
3978         case AES32:
3979             status = hdspm_read(hdspm, HDSPM_statusRegister);
3980             if (status & HDSPM_tcoLockAes) {
3981                 if (status & HDSPM_tcoSync)
3982                     return 2;
3983                 else
3984                     return 1;
3985             }
3986             return 0;
3987         case RayDAT:
3988         case AIO:
3989             status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3990 
3991             if (status & 0x8000000)
3992                 return 2; /* Sync */
3993             if (status & 0x4000000)
3994                 return 1; /* Lock */
3995             return 0; /* No signal */
3996 
3997         default:
3998             break;
3999         }
4000     }
4001 
4002     return 3; /* N/A */
4003 }
4004 
4005 
4006 static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
4007                     struct snd_ctl_elem_value *ucontrol)
4008 {
4009     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4010     int val = -1;
4011 
4012     switch (hdspm->io_type) {
4013     case RayDAT:
4014         switch (kcontrol->private_value) {
4015         case 0: /* WC */
4016             val = hdspm_wc_sync_check(hdspm); break;
4017         case 7: /* TCO */
4018             val = hdspm_tco_sync_check(hdspm); break;
4019         case 8: /* SYNC IN */
4020             val = hdspm_sync_in_sync_check(hdspm); break;
4021         default:
4022             val = hdspm_s1_sync_check(hdspm,
4023                     kcontrol->private_value-1);
4024         }
4025         break;
4026 
4027     case AIO:
4028         switch (kcontrol->private_value) {
4029         case 0: /* WC */
4030             val = hdspm_wc_sync_check(hdspm); break;
4031         case 4: /* TCO */
4032             val = hdspm_tco_sync_check(hdspm); break;
4033         case 5: /* SYNC IN */
4034             val = hdspm_sync_in_sync_check(hdspm); break;
4035         default:
4036             val = hdspm_s1_sync_check(hdspm,
4037                     kcontrol->private_value-1);
4038         }
4039         break;
4040 
4041     case MADI:
4042         switch (kcontrol->private_value) {
4043         case 0: /* WC */
4044             val = hdspm_wc_sync_check(hdspm); break;
4045         case 1: /* MADI */
4046             val = hdspm_madi_sync_check(hdspm); break;
4047         case 2: /* TCO */
4048             val = hdspm_tco_sync_check(hdspm); break;
4049         case 3: /* SYNC_IN */
4050             val = hdspm_sync_in_sync_check(hdspm); break;
4051         }
4052         break;
4053 
4054     case MADIface:
4055         val = hdspm_madi_sync_check(hdspm); /* MADI */
4056         break;
4057 
4058     case AES32:
4059         switch (kcontrol->private_value) {
4060         case 0: /* WC */
4061             val = hdspm_wc_sync_check(hdspm); break;
4062         case 9: /* TCO */
4063             val = hdspm_tco_sync_check(hdspm); break;
4064         case 10 /* SYNC IN */:
4065             val = hdspm_sync_in_sync_check(hdspm); break;
4066         default: /* AES1 to AES8 */
4067              val = hdspm_aes_sync_check(hdspm,
4068                      kcontrol->private_value-1);
4069         }
4070         break;
4071 
4072     }
4073 
4074     if (hdspm->tco) {
4075         switch (kcontrol->private_value) {
4076         case 11:
4077             /* Check TCO for lock state of its current input */
4078             val = hdspm_tco_input_check(hdspm, HDSPM_TCO1_TCO_lock);
4079             break;
4080         case 12:
4081             /* Check TCO for valid time code on LTC input. */
4082             val = hdspm_tco_input_check(hdspm,
4083                 HDSPM_TCO1_LTC_Input_valid);
4084             break;
4085         default:
4086             break;
4087         }
4088     }
4089 
4090     if (-1 == val)
4091         val = 3;
4092 
4093     ucontrol->value.enumerated.item[0] = val;
4094     return 0;
4095 }
4096 
4097 
4098 
4099 /*
4100  * TCO controls
4101  */
4102 static void hdspm_tco_write(struct hdspm *hdspm)
4103 {
4104     unsigned int tc[4] = { 0, 0, 0, 0};
4105 
4106     switch (hdspm->tco->input) {
4107     case 0:
4108         tc[2] |= HDSPM_TCO2_set_input_MSB;
4109         break;
4110     case 1:
4111         tc[2] |= HDSPM_TCO2_set_input_LSB;
4112         break;
4113     default:
4114         break;
4115     }
4116 
4117     switch (hdspm->tco->framerate) {
4118     case 1:
4119         tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4120         break;
4121     case 2:
4122         tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4123         break;
4124     case 3:
4125         tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4126             HDSPM_TCO1_set_drop_frame_flag;
4127         break;
4128     case 4:
4129         tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4130             HDSPM_TCO1_LTC_Format_MSB;
4131         break;
4132     case 5:
4133         tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4134             HDSPM_TCO1_LTC_Format_MSB +
4135             HDSPM_TCO1_set_drop_frame_flag;
4136         break;
4137     default:
4138         break;
4139     }
4140 
4141     switch (hdspm->tco->wordclock) {
4142     case 1:
4143         tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4144         break;
4145     case 2:
4146         tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4147         break;
4148     default:
4149         break;
4150     }
4151 
4152     switch (hdspm->tco->samplerate) {
4153     case 1:
4154         tc[2] |= HDSPM_TCO2_set_freq;
4155         break;
4156     case 2:
4157         tc[2] |= HDSPM_TCO2_set_freq_from_app;
4158         break;
4159     default:
4160         break;
4161     }
4162 
4163     switch (hdspm->tco->pull) {
4164     case 1:
4165         tc[2] |= HDSPM_TCO2_set_pull_up;
4166         break;
4167     case 2:
4168         tc[2] |= HDSPM_TCO2_set_pull_down;
4169         break;
4170     case 3:
4171         tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4172         break;
4173     case 4:
4174         tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4175         break;
4176     default:
4177         break;
4178     }
4179 
4180     if (1 == hdspm->tco->term) {
4181         tc[2] |= HDSPM_TCO2_set_term_75R;
4182     }
4183 
4184     hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4185     hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4186     hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4187     hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4188 }
4189 
4190 
4191 #define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4192 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4193     .name = xname, \
4194     .index = xindex, \
4195     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4196         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4197     .info = snd_hdspm_info_tco_sample_rate, \
4198     .get = snd_hdspm_get_tco_sample_rate, \
4199     .put = snd_hdspm_put_tco_sample_rate \
4200 }
4201 
4202 static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4203                       struct snd_ctl_elem_info *uinfo)
4204 {
4205     /* TODO freq from app could be supported here, see tco->samplerate */
4206     static const char *const texts[] = { "44.1 kHz", "48 kHz" };
4207     ENUMERATED_CTL_INFO(uinfo, texts);
4208     return 0;
4209 }
4210 
4211 static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4212                       struct snd_ctl_elem_value *ucontrol)
4213 {
4214     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4215 
4216     ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4217 
4218     return 0;
4219 }
4220 
4221 static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4222                      struct snd_ctl_elem_value *ucontrol)
4223 {
4224     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4225 
4226     if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4227         hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4228 
4229         hdspm_tco_write(hdspm);
4230 
4231         return 1;
4232     }
4233 
4234     return 0;
4235 }
4236 
4237 
4238 #define HDSPM_TCO_PULL(xname, xindex) \
4239 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4240     .name = xname, \
4241     .index = xindex, \
4242     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4243         SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4244     .info = snd_hdspm_info_tco_pull, \
4245     .get = snd_hdspm_get_tco_pull, \
4246     .put = snd_hdspm_put_tco_pull \
4247 }
4248 
4249 static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4250                    struct snd_ctl_elem_info *uinfo)
4251 {
4252     static const char *const texts[] = { "0", "+ 0.1 %", "- 0.1 %",
4253         "+ 4 %", "- 4 %" };
4254     ENUMERATED_CTL_INFO(uinfo, texts);
4255     return 0;
4256 }
4257 
4258 static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4259                   struct snd_ctl_elem_value *ucontrol)
4260 {
4261     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4262 
4263     ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4264 
4265     return 0;
4266 }
4267 
4268 static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4269                   struct snd_ctl_elem_value *ucontrol)
4270 {
4271     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4272 
4273     if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4274         hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4275 
4276         hdspm_tco_write(hdspm);
4277 
4278         return 1;
4279     }
4280 
4281     return 0;
4282 }
4283 
4284 #define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4285 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4286     .name = xname, \
4287     .index = xindex, \
4288     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4289             SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4290     .info = snd_hdspm_info_tco_wck_conversion, \
4291     .get = snd_hdspm_get_tco_wck_conversion, \
4292     .put = snd_hdspm_put_tco_wck_conversion \
4293 }
4294 
4295 static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4296                          struct snd_ctl_elem_info *uinfo)
4297 {
4298     static const char *const texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4299     ENUMERATED_CTL_INFO(uinfo, texts);
4300     return 0;
4301 }
4302 
4303 static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4304                         struct snd_ctl_elem_value *ucontrol)
4305 {
4306     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4307 
4308     ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4309 
4310     return 0;
4311 }
4312 
4313 static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4314                         struct snd_ctl_elem_value *ucontrol)
4315 {
4316     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4317 
4318     if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4319         hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4320 
4321         hdspm_tco_write(hdspm);
4322 
4323         return 1;
4324     }
4325 
4326     return 0;
4327 }
4328 
4329 
4330 #define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4331 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4332     .name = xname, \
4333     .index = xindex, \
4334     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4335             SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4336     .info = snd_hdspm_info_tco_frame_rate, \
4337     .get = snd_hdspm_get_tco_frame_rate, \
4338     .put = snd_hdspm_put_tco_frame_rate \
4339 }
4340 
4341 static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4342                       struct snd_ctl_elem_info *uinfo)
4343 {
4344     static const char *const texts[] = { "24 fps", "25 fps", "29.97fps",
4345         "29.97 dfps", "30 fps", "30 dfps" };
4346     ENUMERATED_CTL_INFO(uinfo, texts);
4347     return 0;
4348 }
4349 
4350 static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4351                     struct snd_ctl_elem_value *ucontrol)
4352 {
4353     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4354 
4355     ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4356 
4357     return 0;
4358 }
4359 
4360 static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4361                     struct snd_ctl_elem_value *ucontrol)
4362 {
4363     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4364 
4365     if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4366         hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4367 
4368         hdspm_tco_write(hdspm);
4369 
4370         return 1;
4371     }
4372 
4373     return 0;
4374 }
4375 
4376 
4377 #define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4378 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4379     .name = xname, \
4380     .index = xindex, \
4381     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4382             SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4383     .info = snd_hdspm_info_tco_sync_source, \
4384     .get = snd_hdspm_get_tco_sync_source, \
4385     .put = snd_hdspm_put_tco_sync_source \
4386 }
4387 
4388 static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4389                       struct snd_ctl_elem_info *uinfo)
4390 {
4391     static const char *const texts[] = { "LTC", "Video", "WCK" };
4392     ENUMERATED_CTL_INFO(uinfo, texts);
4393     return 0;
4394 }
4395 
4396 static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4397                      struct snd_ctl_elem_value *ucontrol)
4398 {
4399     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4400 
4401     ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4402 
4403     return 0;
4404 }
4405 
4406 static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4407                      struct snd_ctl_elem_value *ucontrol)
4408 {
4409     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4410 
4411     if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4412         hdspm->tco->input = ucontrol->value.enumerated.item[0];
4413 
4414         hdspm_tco_write(hdspm);
4415 
4416         return 1;
4417     }
4418 
4419     return 0;
4420 }
4421 
4422 
4423 #define HDSPM_TCO_WORD_TERM(xname, xindex) \
4424 {   .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4425     .name = xname, \
4426     .index = xindex, \
4427     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4428             SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4429     .info = snd_hdspm_info_tco_word_term, \
4430     .get = snd_hdspm_get_tco_word_term, \
4431     .put = snd_hdspm_put_tco_word_term \
4432 }
4433 
4434 static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4435                     struct snd_ctl_elem_info *uinfo)
4436 {
4437     uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4438     uinfo->count = 1;
4439     uinfo->value.integer.min = 0;
4440     uinfo->value.integer.max = 1;
4441 
4442     return 0;
4443 }
4444 
4445 
4446 static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4447                        struct snd_ctl_elem_value *ucontrol)
4448 {
4449     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4450 
4451     ucontrol->value.integer.value[0] = hdspm->tco->term;
4452 
4453     return 0;
4454 }
4455 
4456 
4457 static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4458                        struct snd_ctl_elem_value *ucontrol)
4459 {
4460     struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4461 
4462     if (hdspm->tco->term != ucontrol->value.integer.value[0]) {
4463         hdspm->tco->term = ucontrol->value.integer.value[0];
4464 
4465         hdspm_tco_write(hdspm);
4466 
4467         return 1;
4468     }
4469 
4470     return 0;
4471 }
4472 
4473 
4474 
4475 
4476 static const struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4477     HDSPM_MIXER("Mixer", 0),
4478     HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4479     HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4480     HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4481     HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4482     HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4483     HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4484     HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4485     HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4486     HDSPM_SYNC_CHECK("TCO SyncCheck", 2),
4487     HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4488     HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4489     HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4490     HDSPM_TOGGLE_SETTING("Disable 96K frames", HDSPM_SMUX),
4491     HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4492     HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4493     HDSPM_INPUT_SELECT("Input Select", 0),
4494     HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4495 };
4496 
4497 
4498 static const struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4499     HDSPM_MIXER("Mixer", 0),
4500     HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4501     HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4502     HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4503     HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4504     HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4505     HDSPM_TOGGLE_SETTING("TX 64 channels mode", HDSPM_TX_64ch),
4506     HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4507     HDSPM_TOGGLE_SETTING("Safe Mode", HDSPM_AutoInp),
4508     HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4509 };
4510 
4511 static const struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4512     HDSPM_MIXER("Mixer", 0),
4513     HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4514     HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4515     HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4516     HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4517     HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4518     HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4519     HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4520     HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4521     HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4522     HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4523     HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4524     HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4525     HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4526     HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4527     HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4528     HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4529     HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5),
4530     HDSPM_CONTROL_TRISTATE("S/PDIF Input", HDSPM_c0_Input0),
4531     HDSPM_TOGGLE_SETTING("S/PDIF Out Optical", HDSPM_c0_Spdif_Opt),
4532     HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4533     HDSPM_TOGGLE_SETTING("ADAT internal (AEB/TEB)", HDSPM_c0_AEB1),
4534     HDSPM_TOGGLE_SETTING("XLR Breakout Cable", HDSPM_c0_Sym6db),
4535     HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48),
4536     HDSPM_CONTROL_TRISTATE("Input Level", HDSPM_c0_AD_GAIN0),
4537     HDSPM_CONTROL_TRISTATE("Output Level", HDSPM_c0_DA_GAIN0),
4538     HDSPM_CONTROL_TRISTATE("Phones Level", HDSPM_c0_PH_GAIN0)
4539 
4540         /*
4541            HDSPM_INPUT_SELECT("Input Select", 0),
4542            HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4543            HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4544            HDSPM_SPDIF_IN("SPDIF In", 0);
4545            HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4546            HDSPM_INPUT_LEVEL("Input Level", 0);
4547            HDSPM_OUTPUT_LEVEL("Output Level", 0);
4548            HDSPM_PHONES("Phones", 0);
4549            */
4550 };
4551 
4552 static const struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4553     HDSPM_MIXER("Mixer", 0),
4554     HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4555     HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4556     HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4557     HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4558     HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4559     HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4560     HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4561     HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4562     HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4563     HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4564     HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4565     HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4566     HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4567     HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4568     HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4569     HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4570     HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4571     HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4572     HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4573     HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4574     HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4575     HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8),
4576     HDSPM_TOGGLE_SETTING("S/PDIF Out Professional", HDSPM_c0_Pro),
4577     HDSPM_TOGGLE_SETTING("Single Speed WordClock Out", HDSPM_c0_Wck48)
4578 };
4579 
4580 static const struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4581     HDSPM_MIXER("Mixer", 0),
4582     HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4583     HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4584     HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4585     HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4586     HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4587     HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 11),
4588     HDSPM_SYNC_CHECK("WC Sync Check", 0),
4589     HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4590     HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4591     HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4592     HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4593     HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4594     HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4595     HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4596     HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4597     HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4598     HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4599     HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4600     HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4601     HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4602     HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4603     HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4604     HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4605     HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4606     HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4607     HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4608     HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4609     HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4610     HDSPM_TOGGLE_SETTING("Line Out", HDSPM_LineOut),
4611     HDSPM_TOGGLE_SETTING("Emphasis", HDSPM_Emphasis),
4612     HDSPM_TOGGLE_SETTING("Non Audio", HDSPM_Dolby),
4613     HDSPM_TOGGLE_SETTING("Professional", HDSPM_Professional),
4614     HDSPM_TOGGLE_SETTING("Clear Track Marker", HDSPM_clr_tms),
4615     HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4616     HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4617 };
4618 
4619 
4620 
4621 /* Control elements for the optional TCO module */
4622 static const struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4623     HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4624     HDSPM_TCO_PULL("TCO Pull", 0),
4625     HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4626     HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4627     HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4628     HDSPM_TCO_WORD_TERM("TCO Word Term", 0),
4629     HDSPM_TCO_LOCK_CHECK("TCO Input Check", 11),
4630     HDSPM_TCO_LOCK_CHECK("TCO LTC Valid", 12),
4631     HDSPM_TCO_LTC_FRAMES("TCO Detected Frame Rate", 0),
4632     HDSPM_TCO_VIDEO_INPUT_FORMAT("Video Input Format", 0)
4633 };
4634 
4635 
4636 static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4637 
4638 
4639 static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4640 {
4641     int i;
4642 
4643     for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4644         if (hdspm->system_sample_rate > 48000) {
4645             hdspm->playback_mixer_ctls[i]->vd[0].access =
4646                 SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4647                 SNDRV_CTL_ELEM_ACCESS_READ |
4648                 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4649         } else {
4650             hdspm->playback_mixer_ctls[i]->vd[0].access =
4651                 SNDRV_CTL_ELEM_ACCESS_READWRITE |
4652                 SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4653         }
4654         snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4655                 SNDRV_CTL_EVENT_MASK_INFO,
4656                 &hdspm->playback_mixer_ctls[i]->id);
4657     }
4658 
4659     return 0;
4660 }
4661 
4662 
4663 static int snd_hdspm_create_controls(struct snd_card *card,
4664                     struct hdspm *hdspm)
4665 {
4666     unsigned int idx, limit;
4667     int err;
4668     struct snd_kcontrol *kctl;
4669     const struct snd_kcontrol_new *list = NULL;
4670 
4671     switch (hdspm->io_type) {
4672     case MADI:
4673         list = snd_hdspm_controls_madi;
4674         limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4675         break;
4676     case MADIface:
4677         list = snd_hdspm_controls_madiface;
4678         limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4679         break;
4680     case AIO:
4681         list = snd_hdspm_controls_aio;
4682         limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4683         break;
4684     case RayDAT:
4685         list = snd_hdspm_controls_raydat;
4686         limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4687         break;
4688     case AES32:
4689         list = snd_hdspm_controls_aes32;
4690         limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4691         break;
4692     }
4693 
4694     if (list) {
4695         for (idx = 0; idx < limit; idx++) {
4696             err = snd_ctl_add(card,
4697                     snd_ctl_new1(&list[idx], hdspm));
4698             if (err < 0)
4699                 return err;
4700         }
4701     }
4702 
4703 
4704     /* create simple 1:1 playback mixer controls */
4705     snd_hdspm_playback_mixer.name = "Chn";
4706     if (hdspm->system_sample_rate >= 128000) {
4707         limit = hdspm->qs_out_channels;
4708     } else if (hdspm->system_sample_rate >= 64000) {
4709         limit = hdspm->ds_out_channels;
4710     } else {
4711         limit = hdspm->ss_out_channels;
4712     }
4713     for (idx = 0; idx < limit; ++idx) {
4714         snd_hdspm_playback_mixer.index = idx + 1;
4715         kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4716         err = snd_ctl_add(card, kctl);
4717         if (err < 0)
4718             return err;
4719         hdspm->playback_mixer_ctls[idx] = kctl;
4720     }
4721 
4722 
4723     if (hdspm->tco) {
4724         /* add tco control elements */
4725         list = snd_hdspm_controls_tco;
4726         limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4727         for (idx = 0; idx < limit; idx++) {
4728             err = snd_ctl_add(card,
4729                     snd_ctl_new1(&list[idx], hdspm));
4730             if (err < 0)
4731                 return err;
4732         }
4733     }
4734 
4735     return 0;
4736 }
4737 
4738 /*------------------------------------------------------------
4739    /proc interface
4740  ------------------------------------------------------------*/
4741 
4742 static void
4743 snd_hdspm_proc_read_tco(struct snd_info_entry *entry,
4744                     struct snd_info_buffer *buffer)
4745 {
4746     struct hdspm *hdspm = entry->private_data;
4747     unsigned int status, control;
4748     int a, ltc, frames, seconds, minutes, hours;
4749     unsigned int period;
4750     u64 freq_const = 0;
4751     u32 rate;
4752 
4753     snd_iprintf(buffer, "--- TCO ---\n");
4754 
4755     status = hdspm_read(hdspm, HDSPM_statusRegister);
4756     control = hdspm->control_register;
4757 
4758 
4759     if (status & HDSPM_tco_detect) {
4760         snd_iprintf(buffer, "TCO module detected.\n");
4761         a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4762         if (a & HDSPM_TCO1_LTC_Input_valid) {
4763             snd_iprintf(buffer, "  LTC valid, ");
4764             switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4765                         HDSPM_TCO1_LTC_Format_MSB)) {
4766             case 0:
4767                 snd_iprintf(buffer, "24 fps, ");
4768                 break;
4769             case HDSPM_TCO1_LTC_Format_LSB:
4770                 snd_iprintf(buffer, "25 fps, ");
4771                 break;
4772             case HDSPM_TCO1_LTC_Format_MSB:
4773                 snd_iprintf(buffer, "29.97 fps, ");
4774                 break;
4775             default:
4776                 snd_iprintf(buffer, "30 fps, ");
4777                 break;
4778             }
4779             if (a & HDSPM_TCO1_set_drop_frame_flag) {
4780                 snd_iprintf(buffer, "drop frame\n");
4781             } else {
4782                 snd_iprintf(buffer, "full frame\n");
4783             }
4784         } else {
4785             snd_iprintf(buffer, "  no LTC\n");
4786         }
4787         if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4788             snd_iprintf(buffer, "  Video: NTSC\n");
4789         } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4790             snd_iprintf(buffer, "  Video: PAL\n");
4791         } else {
4792             snd_iprintf(buffer, "  No video\n");
4793         }
4794         if (a & HDSPM_TCO1_TCO_lock) {
4795             snd_iprintf(buffer, "  Sync: lock\n");
4796         } else {
4797             snd_iprintf(buffer, "  Sync: no lock\n");
4798         }
4799 
4800         switch (hdspm->io_type) {
4801         case MADI:
4802         case AES32:
4803             freq_const = 110069313433624ULL;
4804             break;
4805         case RayDAT:
4806         case AIO:
4807             freq_const = 104857600000000ULL;
4808             break;
4809         case MADIface:
4810             break; /* no TCO possible */
4811         }
4812 
4813         period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4814         snd_iprintf(buffer, "    period: %u\n", period);
4815 
4816 
4817         /* rate = freq_const/period; */
4818         rate = div_u64(freq_const, period);
4819 
4820         if (control & HDSPM_QuadSpeed) {
4821             rate *= 4;
4822         } else if (control & HDSPM_DoubleSpeed) {
4823             rate *= 2;
4824         }
4825 
4826         snd_iprintf(buffer, "  Frequency: %u Hz\n",
4827                 (unsigned int) rate);
4828 
4829         ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4830         frames = ltc & 0xF;
4831         ltc >>= 4;
4832         frames += (ltc & 0x3) * 10;
4833         ltc >>= 4;
4834         seconds = ltc & 0xF;
4835         ltc >>= 4;
4836         seconds += (ltc & 0x7) * 10;
4837         ltc >>= 4;
4838         minutes = ltc & 0xF;
4839         ltc >>= 4;
4840         minutes += (ltc & 0x7) * 10;
4841         ltc >>= 4;
4842         hours = ltc & 0xF;
4843         ltc >>= 4;
4844         hours += (ltc & 0x3) * 10;
4845         snd_iprintf(buffer,
4846             "  LTC In: %02d:%02d:%02d:%02d\n",
4847             hours, minutes, seconds, frames);
4848 
4849     } else {
4850         snd_iprintf(buffer, "No TCO module detected.\n");
4851     }
4852 }
4853 
4854 static void
4855 snd_hdspm_proc_read_madi(struct snd_info_entry *entry,
4856              struct snd_info_buffer *buffer)
4857 {
4858     struct hdspm *hdspm = entry->private_data;
4859     unsigned int status, status2;
4860 
4861     char *pref_sync_ref;
4862     char *autosync_ref;
4863     char *system_clock_mode;
4864     int x, x2;
4865 
4866     status = hdspm_read(hdspm, HDSPM_statusRegister);
4867     status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4868 
4869     snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4870             hdspm->card_name, hdspm->card->number + 1,
4871             hdspm->firmware_rev,
4872             (status2 & HDSPM_version0) |
4873             (status2 & HDSPM_version1) | (status2 &
4874                 HDSPM_version2));
4875 
4876     snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4877             (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4878             hdspm->serial);
4879 
4880     snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4881             hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4882 
4883     snd_iprintf(buffer, "--- System ---\n");
4884 
4885     snd_iprintf(buffer,
4886         "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4887         status & HDSPM_audioIRQPending,
4888         (status & HDSPM_midi0IRQPending) ? 1 : 0,
4889         (status & HDSPM_midi1IRQPending) ? 1 : 0,
4890         hdspm->irq_count);
4891     snd_iprintf(buffer,
4892         "HW pointer: id = %d, rawptr = %d (%d->%d) "
4893         "estimated= %ld (bytes)\n",
4894         ((status & HDSPM_BufferID) ? 1 : 0),
4895         (status & HDSPM_BufferPositionMask),
4896         (status & HDSPM_BufferPositionMask) %
4897         (2 * (int)hdspm->period_bytes),
4898         ((status & HDSPM_BufferPositionMask) - 64) %
4899         (2 * (int)hdspm->period_bytes),
4900         (long) hdspm_hw_pointer(hdspm) * 4);
4901 
4902     snd_iprintf(buffer,
4903         "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4904         hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4905         hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4906         hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4907         hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4908     snd_iprintf(buffer,
4909         "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4910         hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4911         hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4912     snd_iprintf(buffer,
4913         "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4914         "status2=0x%x\n",
4915         hdspm->control_register, hdspm->control2_register,
4916         status, status2);
4917 
4918 
4919     snd_iprintf(buffer, "--- Settings ---\n");
4920 
4921     x = hdspm_get_latency(hdspm);
4922 
4923     snd_iprintf(buffer,
4924         "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4925         x, (unsigned long) hdspm->period_bytes);
4926 
4927     snd_iprintf(buffer, "Line out: %s\n",
4928         (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4929 
4930     snd_iprintf(buffer,
4931         "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4932         "Auto Input %s\n",
4933         (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4934         (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4935         (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4936 
4937 
4938     if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4939         system_clock_mode = "AutoSync";
4940     else
4941         system_clock_mode = "Master";
4942     snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4943 
4944     switch (hdspm_pref_sync_ref(hdspm)) {
4945     case HDSPM_SYNC_FROM_WORD:
4946         pref_sync_ref = "Word Clock";
4947         break;
4948     case HDSPM_SYNC_FROM_MADI:
4949         pref_sync_ref = "MADI Sync";
4950         break;
4951     case HDSPM_SYNC_FROM_TCO:
4952         pref_sync_ref = "TCO";
4953         break;
4954     case HDSPM_SYNC_FROM_SYNC_IN:
4955         pref_sync_ref = "Sync In";
4956         break;
4957     default:
4958         pref_sync_ref = "XXXX Clock";
4959         break;
4960     }
4961     snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4962             pref_sync_ref);
4963 
4964     snd_iprintf(buffer, "System Clock Frequency: %d\n",
4965             hdspm->system_sample_rate);
4966 
4967 
4968     snd_iprintf(buffer, "--- Status:\n");
4969 
4970     x = status & HDSPM_madiSync;
4971     x2 = status2 & HDSPM_wcSync;
4972 
4973     snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4974             (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4975             "NoLock",
4976             (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4977             "NoLock");
4978 
4979     switch (hdspm_autosync_ref(hdspm)) {
4980     case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4981         autosync_ref = "Sync In";
4982         break;
4983     case HDSPM_AUTOSYNC_FROM_TCO:
4984         autosync_ref = "TCO";
4985         break;
4986     case HDSPM_AUTOSYNC_FROM_WORD:
4987         autosync_ref = "Word Clock";
4988         break;
4989     case HDSPM_AUTOSYNC_FROM_MADI:
4990         autosync_ref = "MADI Sync";
4991         break;
4992     case HDSPM_AUTOSYNC_FROM_NONE:
4993         autosync_ref = "Input not valid";
4994         break;
4995     default:
4996         autosync_ref = "---";
4997         break;
4998     }
4999     snd_iprintf(buffer,
5000         "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
5001         autosync_ref, hdspm_external_sample_rate(hdspm),
5002         (status & HDSPM_madiFreqMask) >> 22,
5003         (status2 & HDSPM_wcFreqMask) >> 5);
5004 
5005     snd_iprintf(buffer, "Input: %s, Mode=%s\n",
5006         (status & HDSPM_AB_int) ? "Coax" : "Optical",
5007         (status & HDSPM_RX_64ch) ? "64 channels" :
5008         "56 channels");
5009 
5010     /* call readout function for TCO specific status */
5011     snd_hdspm_proc_read_tco(entry, buffer);
5012 
5013     snd_iprintf(buffer, "\n");
5014 }
5015 
5016 static void
5017 snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
5018               struct snd_info_buffer *buffer)
5019 {
5020     struct hdspm *hdspm = entry->private_data;
5021     unsigned int status;
5022     unsigned int status2;
5023     unsigned int timecode;
5024     unsigned int wcLock, wcSync;
5025     int pref_syncref;
5026     char *autosync_ref;
5027     int x;
5028 
5029     status = hdspm_read(hdspm, HDSPM_statusRegister);
5030     status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
5031     timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
5032 
5033     snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
5034             hdspm->card_name, hdspm->card->number + 1,
5035             hdspm->firmware_rev);
5036 
5037     snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
5038             hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
5039 
5040     snd_iprintf(buffer, "--- System ---\n");
5041 
5042     snd_iprintf(buffer,
5043             "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
5044             status & HDSPM_audioIRQPending,
5045             (status & HDSPM_midi0IRQPending) ? 1 : 0,
5046             (status & HDSPM_midi1IRQPending) ? 1 : 0,
5047             hdspm->irq_count);
5048     snd_iprintf(buffer,
5049             "HW pointer: id = %d, rawptr = %d (%d->%d) "
5050             "estimated= %ld (bytes)\n",
5051             ((status & HDSPM_BufferID) ? 1 : 0),
5052             (status & HDSPM_BufferPositionMask),
5053             (status & HDSPM_BufferPositionMask) %
5054             (2 * (int)hdspm->period_bytes),
5055             ((status & HDSPM_BufferPositionMask) - 64) %
5056             (2 * (int)hdspm->period_bytes),
5057             (long) hdspm_hw_pointer(hdspm) * 4);
5058 
5059     snd_iprintf(buffer,
5060             "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
5061             hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
5062             hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
5063             hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
5064             hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
5065     snd_iprintf(buffer,
5066             "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
5067             hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
5068             hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
5069     snd_iprintf(buffer,
5070             "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
5071             "status2=0x%x\n",
5072             hdspm->control_register, hdspm->control2_register,
5073             status, status2);
5074 
5075     snd_iprintf(buffer, "--- Settings ---\n");
5076 
5077     x = hdspm_get_latency(hdspm);
5078 
5079     snd_iprintf(buffer,
5080             "Size (Latency): %d samples (2 periods of %lu bytes)\n",
5081             x, (unsigned long) hdspm->period_bytes);
5082 
5083     snd_iprintf(buffer, "Line out: %s\n",
5084             (hdspm->
5085              control_register & HDSPM_LineOut) ? "on " : "off");
5086 
5087     snd_iprintf(buffer,
5088             "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5089             (hdspm->
5090              control_register & HDSPM_clr_tms) ? "on" : "off",
5091             (hdspm->
5092              control_register & HDSPM_Emphasis) ? "on" : "off",
5093             (hdspm->
5094              control_register & HDSPM_Dolby) ? "on" : "off");
5095 
5096 
5097     pref_syncref = hdspm_pref_sync_ref(hdspm);
5098     if (pref_syncref == 0)
5099         snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5100     else
5101         snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5102                 pref_syncref);
5103 
5104     snd_iprintf(buffer, "System Clock Frequency: %d\n",
5105             hdspm->system_sample_rate);
5106 
5107     snd_iprintf(buffer, "Double speed: %s\n",
5108             hdspm->control_register & HDSPM_DS_DoubleWire?
5109             "Double wire" : "Single wire");
5110     snd_iprintf(buffer, "Quad speed: %s\n",
5111             hdspm->control_register & HDSPM_QS_DoubleWire?
5112             "Double wire" :
5113             hdspm->control_register & HDSPM_QS_QuadWire?
5114             "Quad wire" : "Single wire");
5115 
5116     snd_iprintf(buffer, "--- Status:\n");
5117 
5118     wcLock = status & HDSPM_AES32_wcLock;
5119     wcSync = wcLock && (status & HDSPM_AES32_wcSync);
5120 
5121     snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
5122             (wcLock) ? (wcSync ? "Sync   " : "Lock   ") : "No Lock",
5123             HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5124 
5125     for (x = 0; x < 8; x++) {
5126         snd_iprintf(buffer, "AES%d: %s  Frequency: %d\n",
5127                 x+1,
5128                 (status2 & (HDSPM_LockAES >> x)) ?
5129                 "Sync   " : "No Lock",
5130                 HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5131     }
5132 
5133     switch (hdspm_autosync_ref(hdspm)) {
5134     case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5135         autosync_ref = "None"; break;
5136     case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5137         autosync_ref = "Word Clock"; break;
5138     case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5139         autosync_ref = "AES1"; break;
5140     case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5141         autosync_ref = "AES2"; break;
5142     case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5143         autosync_ref = "AES3"; break;
5144     case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5145         autosync_ref = "AES4"; break;
5146     case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5147         autosync_ref = "AES5"; break;
5148     case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5149         autosync_ref = "AES6"; break;
5150     case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5151         autosync_ref = "AES7"; break;
5152     case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5153         autosync_ref = "AES8"; break;
5154     case HDSPM_AES32_AUTOSYNC_FROM_TCO:
5155         autosync_ref = "TCO"; break;
5156     case HDSPM_AES32_AUTOSYNC_FROM_SYNC_IN:
5157         autosync_ref = "Sync In"; break;
5158     default:
5159         autosync_ref = "---"; break;
5160     }
5161     snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5162 
5163     /* call readout function for TCO specific status */
5164     snd_hdspm_proc_read_tco(entry, buffer);
5165 
5166     snd_iprintf(buffer, "\n");
5167 }
5168 
5169 static void
5170 snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5171              struct snd_info_buffer *buffer)
5172 {
5173     struct hdspm *hdspm = entry->private_data;
5174     unsigned int status1, status2, status3, i;
5175     unsigned int lock, sync;
5176 
5177     status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5178     status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5179     status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5180 
5181     snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5182     snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5183     snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5184 
5185 
5186     snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5187 
5188     snd_iprintf(buffer, "Clock mode      : %s\n",
5189         (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5190     snd_iprintf(buffer, "System frequency: %d Hz\n",
5191         hdspm_get_system_sample_rate(hdspm));
5192 
5193     snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5194 
5195     lock = 0x1;
5196     sync = 0x100;
5197 
5198     for (i = 0; i < 8; i++) {
5199         snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5200                 i,
5201                 (status1 & lock) ? 1 : 0,
5202                 (status1 & sync) ? 1 : 0,
5203                 texts_freq[(status2 >> (i * 4)) & 0xF]);
5204 
5205         lock = lock<<1;
5206         sync = sync<<1;
5207     }
5208 
5209     snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5210             (status1 & 0x1000000) ? 1 : 0,
5211             (status1 & 0x2000000) ? 1 : 0,
5212             texts_freq[(status1 >> 16) & 0xF]);
5213 
5214     snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5215             (status1 & 0x4000000) ? 1 : 0,
5216             (status1 & 0x8000000) ? 1 : 0,
5217             texts_freq[(status1 >> 20) & 0xF]);
5218 
5219     snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5220             (status3 & 0x400) ? 1 : 0,
5221             (status3 & 0x800) ? 1 : 0,
5222             texts_freq[(status2 >> 12) & 0xF]);
5223 
5224 }
5225 
5226 #ifdef CONFIG_SND_DEBUG
5227 static void
5228 snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5229               struct snd_info_buffer *buffer)
5230 {
5231     struct hdspm *hdspm = entry->private_data;
5232 
5233     int j,i;
5234 
5235     for (i = 0; i < 256 /* 1024*64 */; i += j) {
5236         snd_iprintf(buffer, "0x%08X: ", i);
5237         for (j = 0; j < 16; j += 4)
5238             snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5239         snd_iprintf(buffer, "\n");
5240     }
5241 }
5242 #endif
5243 
5244 
5245 static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5246               struct snd_info_buffer *buffer)
5247 {
5248     struct hdspm *hdspm = entry->private_data;
5249     int i;
5250 
5251     snd_iprintf(buffer, "# generated by hdspm\n");
5252 
5253     for (i = 0; i < hdspm->max_channels_in; i++) {
5254         snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5255     }
5256 }
5257 
5258 static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5259               struct snd_info_buffer *buffer)
5260 {
5261     struct hdspm *hdspm = entry->private_data;
5262     int i;
5263 
5264     snd_iprintf(buffer, "# generated by hdspm\n");
5265 
5266     for (i = 0; i < hdspm->max_channels_out; i++) {
5267         snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5268     }
5269 }
5270 
5271 
5272 static void snd_hdspm_proc_init(struct hdspm *hdspm)
5273 {
5274     void (*read)(struct snd_info_entry *, struct snd_info_buffer *) = NULL;
5275 
5276     switch (hdspm->io_type) {
5277     case AES32:
5278         read = snd_hdspm_proc_read_aes32;
5279         break;
5280     case MADI:
5281         read = snd_hdspm_proc_read_madi;
5282         break;
5283     case MADIface:
5284         /* read = snd_hdspm_proc_read_madiface; */
5285         break;
5286     case RayDAT:
5287         read = snd_hdspm_proc_read_raydat;
5288         break;
5289     case AIO:
5290         break;
5291     }
5292 
5293     snd_card_ro_proc_new(hdspm->card, "hdspm", hdspm, read);
5294     snd_card_ro_proc_new(hdspm->card, "ports.in", hdspm,
5295                  snd_hdspm_proc_ports_in);
5296     snd_card_ro_proc_new(hdspm->card, "ports.out", hdspm,
5297                  snd_hdspm_proc_ports_out);
5298 
5299 #ifdef CONFIG_SND_DEBUG
5300     /* debug file to read all hdspm registers */
5301     snd_card_ro_proc_new(hdspm->card, "debug", hdspm,
5302                  snd_hdspm_proc_read_debug);
5303 #endif
5304 }
5305 
5306 /*------------------------------------------------------------
5307    hdspm intitialize
5308  ------------------------------------------------------------*/
5309 
5310 static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5311 {
5312     /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5313        hold it (e.g. during module initialization).
5314        */
5315 
5316     /* set defaults:       */
5317 
5318     hdspm->settings_register = 0;
5319 
5320     switch (hdspm->io_type) {
5321     case MADI:
5322     case MADIface:
5323         hdspm->control_register =
5324             0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5325         break;
5326 
5327     case RayDAT:
5328     case AIO:
5329         hdspm->settings_register = 0x1 + 0x1000;
5330         /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5331          * line_out */
5332         hdspm->control_register =
5333             0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5334         break;
5335 
5336     case AES32:
5337         hdspm->control_register =
5338             HDSPM_ClockModeMaster | /* Master Clock Mode on */
5339             hdspm_encode_latency(7) | /* latency max=8192samples */
5340             HDSPM_SyncRef0 |    /* AES1 is syncclock */
5341             HDSPM_LineOut | /* Analog output in */
5342             HDSPM_Professional;  /* Professional mode */
5343         break;
5344     }
5345 
5346     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5347 
5348     if (AES32 == hdspm->io_type) {
5349         /* No control2 register for AES32 */
5350 #ifdef SNDRV_BIG_ENDIAN
5351         hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5352 #else
5353         hdspm->control2_register = 0;
5354 #endif
5355 
5356         hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5357     }
5358     hdspm_compute_period_size(hdspm);
5359 
5360     /* silence everything */
5361 
5362     all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5363 
5364     if (hdspm_is_raydat_or_aio(hdspm))
5365         hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5366 
5367     /* set a default rate so that the channel map is set up. */
5368     hdspm_set_rate(hdspm, 48000, 1);
5369 
5370     return 0;
5371 }
5372 
5373 
5374 /*------------------------------------------------------------
5375    interrupt
5376  ------------------------------------------------------------*/
5377 
5378 static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5379 {
5380     struct hdspm *hdspm = (struct hdspm *) dev_id;
5381     unsigned int status;
5382     int i, audio, midi, schedule = 0;
5383     /* cycles_t now; */
5384 
5385     status = hdspm_read(hdspm, HDSPM_statusRegister);
5386 
5387     audio = status & HDSPM_audioIRQPending;
5388     midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5389             HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5390 
5391     /* now = get_cycles(); */
5392     /*
5393      *   LAT_2..LAT_0 period  counter (win)  counter (mac)
5394      *          6       4096   ~256053425     ~514672358
5395      *          5       2048   ~128024983     ~257373821
5396      *          4       1024    ~64023706     ~128718089
5397      *          3        512    ~32005945      ~64385999
5398      *          2        256    ~16003039      ~32260176
5399      *          1        128     ~7998738      ~16194507
5400      *          0         64     ~3998231       ~8191558
5401      */
5402     /*
5403       dev_info(hdspm->card->dev, "snd_hdspm_interrupt %llu @ %llx\n",
5404        now-hdspm->last_interrupt, status & 0xFFC0);
5405        hdspm->last_interrupt = now;
5406     */
5407 
5408     if (!audio && !midi)
5409         return IRQ_NONE;
5410 
5411     hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5412     hdspm->irq_count++;
5413 
5414 
5415     if (audio) {
5416         if (hdspm->capture_substream)
5417             snd_pcm_period_elapsed(hdspm->capture_substream);
5418 
5419         if (hdspm->playback_substream)
5420             snd_pcm_period_elapsed(hdspm->playback_substream);
5421     }
5422 
5423     if (midi) {
5424         i = 0;
5425         while (i < hdspm->midiPorts) {
5426             if ((hdspm_read(hdspm,
5427                 hdspm->midi[i].statusIn) & 0xff) &&
5428                     (status & hdspm->midi[i].irq)) {
5429                 /* we disable interrupts for this input until
5430                  * processing is done
5431                  */
5432                 hdspm->control_register &= ~hdspm->midi[i].ie;
5433                 hdspm_write(hdspm, HDSPM_controlRegister,
5434                         hdspm->control_register);
5435                 hdspm->midi[i].pending = 1;
5436                 schedule = 1;
5437             }
5438 
5439             i++;
5440         }
5441 
5442         if (schedule)
5443             queue_work(system_highpri_wq, &hdspm->midi_work);
5444     }
5445 
5446     return IRQ_HANDLED;
5447 }
5448 
5449 /*------------------------------------------------------------
5450    pcm interface
5451   ------------------------------------------------------------*/
5452 
5453 
5454 static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5455                           *substream)
5456 {
5457     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5458     return hdspm_hw_pointer(hdspm);
5459 }
5460 
5461 
5462 static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5463 {
5464     struct snd_pcm_runtime *runtime = substream->runtime;
5465     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5466     struct snd_pcm_substream *other;
5467 
5468     if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5469         other = hdspm->capture_substream;
5470     else
5471         other = hdspm->playback_substream;
5472 
5473     if (hdspm->running)
5474         runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5475     else
5476         runtime->status->hw_ptr = 0;
5477     if (other) {
5478         struct snd_pcm_substream *s;
5479         struct snd_pcm_runtime *oruntime = other->runtime;
5480         snd_pcm_group_for_each_entry(s, substream) {
5481             if (s == other) {
5482                 oruntime->status->hw_ptr =
5483                     runtime->status->hw_ptr;
5484                 break;
5485             }
5486         }
5487     }
5488     return 0;
5489 }
5490 
5491 static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5492                    struct snd_pcm_hw_params *params)
5493 {
5494     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5495     int err;
5496     int i;
5497     pid_t this_pid;
5498     pid_t other_pid;
5499 
5500     spin_lock_irq(&hdspm->lock);
5501 
5502     if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5503         this_pid = hdspm->playback_pid;
5504         other_pid = hdspm->capture_pid;
5505     } else {
5506         this_pid = hdspm->capture_pid;
5507         other_pid = hdspm->playback_pid;
5508     }
5509 
5510     if (other_pid > 0 && this_pid != other_pid) {
5511 
5512         /* The other stream is open, and not by the same
5513            task as this one. Make sure that the parameters
5514            that matter are the same.
5515            */
5516 
5517         if (params_rate(params) != hdspm->system_sample_rate) {
5518             spin_unlock_irq(&hdspm->lock);
5519             _snd_pcm_hw_param_setempty(params,
5520                     SNDRV_PCM_HW_PARAM_RATE);
5521             return -EBUSY;
5522         }
5523 
5524         if (params_period_size(params) != hdspm->period_bytes / 4) {
5525             spin_unlock_irq(&hdspm->lock);
5526             _snd_pcm_hw_param_setempty(params,
5527                     SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5528             return -EBUSY;
5529         }
5530 
5531     }
5532     /* We're fine. */
5533     spin_unlock_irq(&hdspm->lock);
5534 
5535     /* how to make sure that the rate matches an externally-set one ?   */
5536 
5537     spin_lock_irq(&hdspm->lock);
5538     err = hdspm_set_rate(hdspm, params_rate(params), 0);
5539     if (err < 0) {
5540         dev_info(hdspm->card->dev, "err on hdspm_set_rate: %d\n", err);
5541         spin_unlock_irq(&hdspm->lock);
5542         _snd_pcm_hw_param_setempty(params,
5543                 SNDRV_PCM_HW_PARAM_RATE);
5544         return err;
5545     }
5546     spin_unlock_irq(&hdspm->lock);
5547 
5548     err = hdspm_set_interrupt_interval(hdspm,
5549             params_period_size(params));
5550     if (err < 0) {
5551         dev_info(hdspm->card->dev,
5552              "err on hdspm_set_interrupt_interval: %d\n", err);
5553         _snd_pcm_hw_param_setempty(params,
5554                 SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5555         return err;
5556     }
5557 
5558     /* Memory allocation, takashi's method, dont know if we should
5559      * spinlock
5560      */
5561     /* malloc all buffer even if not enabled to get sure */
5562     /* Update for MADI rev 204: we need to allocate for all channels,
5563      * otherwise it doesn't work at 96kHz */
5564 
5565     err =
5566         snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5567     if (err < 0) {
5568         dev_info(hdspm->card->dev,
5569              "err on snd_pcm_lib_malloc_pages: %d\n", err);
5570         return err;
5571     }
5572 
5573     if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5574 
5575         for (i = 0; i < params_channels(params); ++i) {
5576             int c = hdspm->channel_map_out[i];
5577 
5578             if (c < 0)
5579                 continue;      /* just make sure */
5580             hdspm_set_channel_dma_addr(hdspm, substream,
5581                            HDSPM_pageAddressBufferOut,
5582                            c);
5583             snd_hdspm_enable_out(hdspm, c, 1);
5584         }
5585 
5586         hdspm->playback_buffer =
5587             (unsigned char *) substream->runtime->dma_area;
5588         dev_dbg(hdspm->card->dev,
5589             "Allocated sample buffer for playback at %p\n",
5590                 hdspm->playback_buffer);
5591     } else {
5592         for (i = 0; i < params_channels(params); ++i) {
5593             int c = hdspm->channel_map_in[i];
5594 
5595             if (c < 0)
5596                 continue;
5597             hdspm_set_channel_dma_addr(hdspm, substream,
5598                            HDSPM_pageAddressBufferIn,
5599                            c);
5600             snd_hdspm_enable_in(hdspm, c, 1);
5601         }
5602 
5603         hdspm->capture_buffer =
5604             (unsigned char *) substream->runtime->dma_area;
5605         dev_dbg(hdspm->card->dev,
5606             "Allocated sample buffer for capture at %p\n",
5607                 hdspm->capture_buffer);
5608     }
5609 
5610     /*
5611        dev_dbg(hdspm->card->dev,
5612        "Allocated sample buffer for %s at 0x%08X\n",
5613        substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5614        "playback" : "capture",
5615        snd_pcm_sgbuf_get_addr(substream, 0));
5616        */
5617     /*
5618        dev_dbg(hdspm->card->dev,
5619        "set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5620        substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5621        "playback" : "capture",
5622        params_rate(params), params_channels(params),
5623        params_buffer_size(params));
5624        */
5625 
5626 
5627     /*  For AES cards, the float format bit is the same as the
5628      *  preferred sync reference. Since we don't want to break
5629      *  sync settings, we have to skip the remaining part of this
5630      *  function.
5631      */
5632     if (hdspm->io_type == AES32) {
5633         return 0;
5634     }
5635 
5636 
5637     /* Switch to native float format if requested */
5638     if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5639         if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5640             dev_info(hdspm->card->dev,
5641                  "Switching to native 32bit LE float format.\n");
5642 
5643         hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5644     } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5645         if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5646             dev_info(hdspm->card->dev,
5647                  "Switching to native 32bit LE integer format.\n");
5648 
5649         hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5650     }
5651     hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5652 
5653     return 0;
5654 }
5655 
5656 static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5657 {
5658     int i;
5659     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5660 
5661     if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5662         /* Just disable all channels. The saving when disabling a */
5663         /* smaller set is not worth the trouble. */
5664         for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
5665             snd_hdspm_enable_out(hdspm, i, 0);
5666 
5667         hdspm->playback_buffer = NULL;
5668     } else {
5669         for (i = 0; i < HDSPM_MAX_CHANNELS; ++i)
5670             snd_hdspm_enable_in(hdspm, i, 0);
5671 
5672         hdspm->capture_buffer = NULL;
5673     }
5674 
5675     snd_pcm_lib_free_pages(substream);
5676 
5677     return 0;
5678 }
5679 
5680 
5681 static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5682         struct snd_pcm_channel_info *info)
5683 {
5684     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5685     unsigned int channel = info->channel;
5686 
5687     if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5688         if (snd_BUG_ON(channel >= hdspm->max_channels_out)) {
5689             dev_info(hdspm->card->dev,
5690                  "snd_hdspm_channel_info: output channel out of range (%d)\n",
5691                  channel);
5692             return -EINVAL;
5693         }
5694 
5695         channel = array_index_nospec(channel, hdspm->max_channels_out);
5696         if (hdspm->channel_map_out[channel] < 0) {
5697             dev_info(hdspm->card->dev,
5698                  "snd_hdspm_channel_info: output channel %d mapped out\n",
5699                  channel);
5700             return -EINVAL;
5701         }
5702 
5703         info->offset = hdspm->channel_map_out[channel] *
5704             HDSPM_CHANNEL_BUFFER_BYTES;
5705     } else {
5706         if (snd_BUG_ON(channel >= hdspm->max_channels_in)) {
5707             dev_info(hdspm->card->dev,
5708                  "snd_hdspm_channel_info: input channel out of range (%d)\n",
5709                  channel);
5710             return -EINVAL;
5711         }
5712 
5713         channel = array_index_nospec(channel, hdspm->max_channels_in);
5714         if (hdspm->channel_map_in[channel] < 0) {
5715             dev_info(hdspm->card->dev,
5716                  "snd_hdspm_channel_info: input channel %d mapped out\n",
5717                  channel);
5718             return -EINVAL;
5719         }
5720 
5721         info->offset = hdspm->channel_map_in[channel] *
5722             HDSPM_CHANNEL_BUFFER_BYTES;
5723     }
5724 
5725     info->first = 0;
5726     info->step = 32;
5727     return 0;
5728 }
5729 
5730 
5731 static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5732         unsigned int cmd, void *arg)
5733 {
5734     switch (cmd) {
5735     case SNDRV_PCM_IOCTL1_RESET:
5736         return snd_hdspm_reset(substream);
5737 
5738     case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5739         {
5740             struct snd_pcm_channel_info *info = arg;
5741             return snd_hdspm_channel_info(substream, info);
5742         }
5743     default:
5744         break;
5745     }
5746 
5747     return snd_pcm_lib_ioctl(substream, cmd, arg);
5748 }
5749 
5750 static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5751 {
5752     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5753     struct snd_pcm_substream *other;
5754     int running;
5755 
5756     spin_lock(&hdspm->lock);
5757     running = hdspm->running;
5758     switch (cmd) {
5759     case SNDRV_PCM_TRIGGER_START:
5760         running |= 1 << substream->stream;
5761         break;
5762     case SNDRV_PCM_TRIGGER_STOP:
5763         running &= ~(1 << substream->stream);
5764         break;
5765     default:
5766         snd_BUG();
5767         spin_unlock(&hdspm->lock);
5768         return -EINVAL;
5769     }
5770     if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5771         other = hdspm->capture_substream;
5772     else
5773         other = hdspm->playback_substream;
5774 
5775     if (other) {
5776         struct snd_pcm_substream *s;
5777         snd_pcm_group_for_each_entry(s, substream) {
5778             if (s == other) {
5779                 snd_pcm_trigger_done(s, substream);
5780                 if (cmd == SNDRV_PCM_TRIGGER_START)
5781                     running |= 1 << s->stream;
5782                 else
5783                     running &= ~(1 << s->stream);
5784                 goto _ok;
5785             }
5786         }
5787         if (cmd == SNDRV_PCM_TRIGGER_START) {
5788             if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5789                     && substream->stream ==
5790                     SNDRV_PCM_STREAM_CAPTURE)
5791                 hdspm_silence_playback(hdspm);
5792         } else {
5793             if (running &&
5794                 substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5795                 hdspm_silence_playback(hdspm);
5796         }
5797     } else {
5798         if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5799             hdspm_silence_playback(hdspm);
5800     }
5801 _ok:
5802     snd_pcm_trigger_done(substream, substream);
5803     if (!hdspm->running && running)
5804         hdspm_start_audio(hdspm);
5805     else if (hdspm->running && !running)
5806         hdspm_stop_audio(hdspm);
5807     hdspm->running = running;
5808     spin_unlock(&hdspm->lock);
5809 
5810     return 0;
5811 }
5812 
5813 static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5814 {
5815     return 0;
5816 }
5817 
5818 static const struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5819     .info = (SNDRV_PCM_INFO_MMAP |
5820          SNDRV_PCM_INFO_MMAP_VALID |
5821          SNDRV_PCM_INFO_NONINTERLEAVED |
5822          SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5823     .formats = SNDRV_PCM_FMTBIT_S32_LE,
5824     .rates = (SNDRV_PCM_RATE_32000 |
5825           SNDRV_PCM_RATE_44100 |
5826           SNDRV_PCM_RATE_48000 |
5827           SNDRV_PCM_RATE_64000 |
5828           SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5829           SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5830     .rate_min = 32000,
5831     .rate_max = 192000,
5832     .channels_min = 1,
5833     .channels_max = HDSPM_MAX_CHANNELS,
5834     .buffer_bytes_max =
5835         HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5836     .period_bytes_min = (32 * 4),
5837     .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5838     .periods_min = 2,
5839     .periods_max = 512,
5840     .fifo_size = 0
5841 };
5842 
5843 static const struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5844     .info = (SNDRV_PCM_INFO_MMAP |
5845          SNDRV_PCM_INFO_MMAP_VALID |
5846          SNDRV_PCM_INFO_NONINTERLEAVED |
5847          SNDRV_PCM_INFO_SYNC_START),
5848     .formats = SNDRV_PCM_FMTBIT_S32_LE,
5849     .rates = (SNDRV_PCM_RATE_32000 |
5850           SNDRV_PCM_RATE_44100 |
5851           SNDRV_PCM_RATE_48000 |
5852           SNDRV_PCM_RATE_64000 |
5853           SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5854           SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5855     .rate_min = 32000,
5856     .rate_max = 192000,
5857     .channels_min = 1,
5858     .channels_max = HDSPM_MAX_CHANNELS,
5859     .buffer_bytes_max =
5860         HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5861     .period_bytes_min = (32 * 4),
5862     .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5863     .periods_min = 2,
5864     .periods_max = 512,
5865     .fifo_size = 0
5866 };
5867 
5868 static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5869                        struct snd_pcm_hw_rule *rule)
5870 {
5871     struct hdspm *hdspm = rule->private;
5872     struct snd_interval *c =
5873         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5874     struct snd_interval *r =
5875         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5876 
5877     if (r->min > 96000 && r->max <= 192000) {
5878         struct snd_interval t = {
5879             .min = hdspm->qs_in_channels,
5880             .max = hdspm->qs_in_channels,
5881             .integer = 1,
5882         };
5883         return snd_interval_refine(c, &t);
5884     } else if (r->min > 48000 && r->max <= 96000) {
5885         struct snd_interval t = {
5886             .min = hdspm->ds_in_channels,
5887             .max = hdspm->ds_in_channels,
5888             .integer = 1,
5889         };
5890         return snd_interval_refine(c, &t);
5891     } else if (r->max < 64000) {
5892         struct snd_interval t = {
5893             .min = hdspm->ss_in_channels,
5894             .max = hdspm->ss_in_channels,
5895             .integer = 1,
5896         };
5897         return snd_interval_refine(c, &t);
5898     }
5899 
5900     return 0;
5901 }
5902 
5903 static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5904                        struct snd_pcm_hw_rule * rule)
5905 {
5906     struct hdspm *hdspm = rule->private;
5907     struct snd_interval *c =
5908         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5909     struct snd_interval *r =
5910         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5911 
5912     if (r->min > 96000 && r->max <= 192000) {
5913         struct snd_interval t = {
5914             .min = hdspm->qs_out_channels,
5915             .max = hdspm->qs_out_channels,
5916             .integer = 1,
5917         };
5918         return snd_interval_refine(c, &t);
5919     } else if (r->min > 48000 && r->max <= 96000) {
5920         struct snd_interval t = {
5921             .min = hdspm->ds_out_channels,
5922             .max = hdspm->ds_out_channels,
5923             .integer = 1,
5924         };
5925         return snd_interval_refine(c, &t);
5926     } else if (r->max < 64000) {
5927         struct snd_interval t = {
5928             .min = hdspm->ss_out_channels,
5929             .max = hdspm->ss_out_channels,
5930             .integer = 1,
5931         };
5932         return snd_interval_refine(c, &t);
5933     } else {
5934     }
5935     return 0;
5936 }
5937 
5938 static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5939                        struct snd_pcm_hw_rule * rule)
5940 {
5941     struct hdspm *hdspm = rule->private;
5942     struct snd_interval *c =
5943         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5944     struct snd_interval *r =
5945         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5946 
5947     if (c->min >= hdspm->ss_in_channels) {
5948         struct snd_interval t = {
5949             .min = 32000,
5950             .max = 48000,
5951             .integer = 1,
5952         };
5953         return snd_interval_refine(r, &t);
5954     } else if (c->max <= hdspm->qs_in_channels) {
5955         struct snd_interval t = {
5956             .min = 128000,
5957             .max = 192000,
5958             .integer = 1,
5959         };
5960         return snd_interval_refine(r, &t);
5961     } else if (c->max <= hdspm->ds_in_channels) {
5962         struct snd_interval t = {
5963             .min = 64000,
5964             .max = 96000,
5965             .integer = 1,
5966         };
5967         return snd_interval_refine(r, &t);
5968     }
5969 
5970     return 0;
5971 }
5972 static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5973                        struct snd_pcm_hw_rule *rule)
5974 {
5975     struct hdspm *hdspm = rule->private;
5976     struct snd_interval *c =
5977         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5978     struct snd_interval *r =
5979         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5980 
5981     if (c->min >= hdspm->ss_out_channels) {
5982         struct snd_interval t = {
5983             .min = 32000,
5984             .max = 48000,
5985             .integer = 1,
5986         };
5987         return snd_interval_refine(r, &t);
5988     } else if (c->max <= hdspm->qs_out_channels) {
5989         struct snd_interval t = {
5990             .min = 128000,
5991             .max = 192000,
5992             .integer = 1,
5993         };
5994         return snd_interval_refine(r, &t);
5995     } else if (c->max <= hdspm->ds_out_channels) {
5996         struct snd_interval t = {
5997             .min = 64000,
5998             .max = 96000,
5999             .integer = 1,
6000         };
6001         return snd_interval_refine(r, &t);
6002     }
6003 
6004     return 0;
6005 }
6006 
6007 static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
6008                       struct snd_pcm_hw_rule *rule)
6009 {
6010     unsigned int list[3];
6011     struct hdspm *hdspm = rule->private;
6012     struct snd_interval *c = hw_param_interval(params,
6013             SNDRV_PCM_HW_PARAM_CHANNELS);
6014 
6015     list[0] = hdspm->qs_in_channels;
6016     list[1] = hdspm->ds_in_channels;
6017     list[2] = hdspm->ss_in_channels;
6018     return snd_interval_list(c, 3, list, 0);
6019 }
6020 
6021 static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
6022                       struct snd_pcm_hw_rule *rule)
6023 {
6024     unsigned int list[3];
6025     struct hdspm *hdspm = rule->private;
6026     struct snd_interval *c = hw_param_interval(params,
6027             SNDRV_PCM_HW_PARAM_CHANNELS);
6028 
6029     list[0] = hdspm->qs_out_channels;
6030     list[1] = hdspm->ds_out_channels;
6031     list[2] = hdspm->ss_out_channels;
6032     return snd_interval_list(c, 3, list, 0);
6033 }
6034 
6035 
6036 static const unsigned int hdspm_aes32_sample_rates[] = {
6037     32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
6038 };
6039 
6040 static const struct snd_pcm_hw_constraint_list
6041 hdspm_hw_constraints_aes32_sample_rates = {
6042     .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
6043     .list = hdspm_aes32_sample_rates,
6044     .mask = 0
6045 };
6046 
6047 static int snd_hdspm_open(struct snd_pcm_substream *substream)
6048 {
6049     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6050     struct snd_pcm_runtime *runtime = substream->runtime;
6051     bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
6052 
6053     spin_lock_irq(&hdspm->lock);
6054     snd_pcm_set_sync(substream);
6055     runtime->hw = (playback) ? snd_hdspm_playback_subinfo :
6056         snd_hdspm_capture_subinfo;
6057 
6058     if (playback) {
6059         if (!hdspm->capture_substream)
6060             hdspm_stop_audio(hdspm);
6061 
6062         hdspm->playback_pid = current->pid;
6063         hdspm->playback_substream = substream;
6064     } else {
6065         if (!hdspm->playback_substream)
6066             hdspm_stop_audio(hdspm);
6067 
6068         hdspm->capture_pid = current->pid;
6069         hdspm->capture_substream = substream;
6070     }
6071 
6072     spin_unlock_irq(&hdspm->lock);
6073 
6074     snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6075     snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6076 
6077     switch (hdspm->io_type) {
6078     case AIO:
6079     case RayDAT:
6080         snd_pcm_hw_constraint_minmax(runtime,
6081                          SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6082                          32, 4096);
6083         /* RayDAT & AIO have a fixed buffer of 16384 samples per channel */
6084         snd_pcm_hw_constraint_single(runtime,
6085                          SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6086                          16384);
6087         break;
6088 
6089     default:
6090         snd_pcm_hw_constraint_minmax(runtime,
6091                          SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6092                          64, 8192);
6093         snd_pcm_hw_constraint_single(runtime,
6094                          SNDRV_PCM_HW_PARAM_PERIODS, 2);
6095         break;
6096     }
6097 
6098     if (AES32 == hdspm->io_type) {
6099         runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6100         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6101                 &hdspm_hw_constraints_aes32_sample_rates);
6102     } else {
6103         snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6104                 (playback ?
6105                  snd_hdspm_hw_rule_rate_out_channels :
6106                  snd_hdspm_hw_rule_rate_in_channels), hdspm,
6107                 SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6108     }
6109 
6110     snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6111             (playback ? snd_hdspm_hw_rule_out_channels :
6112              snd_hdspm_hw_rule_in_channels), hdspm,
6113             SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6114 
6115     snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6116             (playback ? snd_hdspm_hw_rule_out_channels_rate :
6117              snd_hdspm_hw_rule_in_channels_rate), hdspm,
6118             SNDRV_PCM_HW_PARAM_RATE, -1);
6119 
6120     return 0;
6121 }
6122 
6123 static int snd_hdspm_release(struct snd_pcm_substream *substream)
6124 {
6125     struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6126     bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
6127 
6128     spin_lock_irq(&hdspm->lock);
6129 
6130     if (playback) {
6131         hdspm->playback_pid = -1;
6132         hdspm->playback_substream = NULL;
6133     } else {
6134         hdspm->capture_pid = -1;
6135         hdspm->capture_substream = NULL;
6136     }
6137 
6138     spin_unlock_irq(&hdspm->lock);
6139 
6140     return 0;
6141 }
6142 
6143 static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6144 {
6145     /* we have nothing to initialize but the call is required */
6146     return 0;
6147 }
6148 
6149 static inline int copy_u32_le(void __user *dest, void __iomem *src)
6150 {
6151     u32 val = readl(src);
6152     return copy_to_user(dest, &val, 4);
6153 }
6154 
6155 static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6156         unsigned int cmd, unsigned long arg)
6157 {
6158     void __user *argp = (void __user *)arg;
6159     struct hdspm *hdspm = hw->private_data;
6160     struct hdspm_mixer_ioctl mixer;
6161     struct hdspm_config info;
6162     struct hdspm_status status;
6163     struct hdspm_version hdspm_version;
6164     struct hdspm_peak_rms *levels;
6165     struct hdspm_ltc ltc;
6166     unsigned int statusregister;
6167     long unsigned int s;
6168     int i = 0;
6169 
6170     switch (cmd) {
6171 
6172     case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6173         levels = &hdspm->peak_rms;
6174         for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6175             levels->input_peaks[i] =
6176                 readl(hdspm->iobase +
6177                         HDSPM_MADI_INPUT_PEAK + i*4);
6178             levels->playback_peaks[i] =
6179                 readl(hdspm->iobase +
6180                         HDSPM_MADI_PLAYBACK_PEAK + i*4);
6181             levels->output_peaks[i] =
6182                 readl(hdspm->iobase +
6183                         HDSPM_MADI_OUTPUT_PEAK + i*4);
6184 
6185             levels->input_rms[i] =
6186                 ((uint64_t) readl(hdspm->iobase +
6187                     HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6188                 (uint64_t) readl(hdspm->iobase +
6189                         HDSPM_MADI_INPUT_RMS_L + i*4);
6190             levels->playback_rms[i] =
6191                 ((uint64_t)readl(hdspm->iobase +
6192                     HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6193                 (uint64_t)readl(hdspm->iobase +
6194                     HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6195             levels->output_rms[i] =
6196                 ((uint64_t)readl(hdspm->iobase +
6197                     HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6198                 (uint64_t)readl(hdspm->iobase +
6199                         HDSPM_MADI_OUTPUT_RMS_L + i*4);
6200         }
6201 
6202         if (hdspm->system_sample_rate > 96000) {
6203             levels->speed = qs;
6204         } else if (hdspm->system_sample_rate > 48000) {
6205             levels->speed = ds;
6206         } else {
6207             levels->speed = ss;
6208         }
6209         levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6210 
6211         s = copy_to_user(argp, levels, sizeof(*levels));
6212         if (0 != s) {
6213             /* dev_err(hdspm->card->dev, "copy_to_user(.., .., %lu): %lu
6214              [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6215              */
6216             return -EFAULT;
6217         }
6218         break;
6219 
6220     case SNDRV_HDSPM_IOCTL_GET_LTC:
6221         ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6222         i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6223         if (i & HDSPM_TCO1_LTC_Input_valid) {
6224             switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6225                 HDSPM_TCO1_LTC_Format_MSB)) {
6226             case 0:
6227                 ltc.format = fps_24;
6228                 break;
6229             case HDSPM_TCO1_LTC_Format_LSB:
6230                 ltc.format = fps_25;
6231                 break;
6232             case HDSPM_TCO1_LTC_Format_MSB:
6233                 ltc.format = fps_2997;
6234                 break;
6235             default:
6236                 ltc.format = fps_30;
6237                 break;
6238             }
6239             if (i & HDSPM_TCO1_set_drop_frame_flag) {
6240                 ltc.frame = drop_frame;
6241             } else {
6242                 ltc.frame = full_frame;
6243             }
6244         } else {
6245             ltc.format = format_invalid;
6246             ltc.frame = frame_invalid;
6247         }
6248         if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6249             ltc.input_format = ntsc;
6250         } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6251             ltc.input_format = pal;
6252         } else {
6253             ltc.input_format = no_video;
6254         }
6255 
6256         s = copy_to_user(argp, &ltc, sizeof(ltc));
6257         if (0 != s) {
6258             /*
6259               dev_err(hdspm->card->dev, "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6260             return -EFAULT;
6261         }
6262 
6263         break;
6264 
6265     case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6266 
6267         memset(&info, 0, sizeof(info));
6268         spin_lock_irq(&hdspm->lock);
6269         info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6270         info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6271 
6272         info.system_sample_rate = hdspm->system_sample_rate;
6273         info.autosync_sample_rate =
6274             hdspm_external_sample_rate(hdspm);
6275         info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6276         info.clock_source = hdspm_clock_source(hdspm);
6277         info.autosync_ref = hdspm_autosync_ref(hdspm);
6278         info.line_out = hdspm_toggle_setting(hdspm, HDSPM_LineOut);
6279         info.passthru = 0;
6280         spin_unlock_irq(&hdspm->lock);
6281         if (copy_to_user(argp, &info, sizeof(info)))
6282             return -EFAULT;
6283         break;
6284 
6285     case SNDRV_HDSPM_IOCTL_GET_STATUS:
6286         memset(&status, 0, sizeof(status));
6287 
6288         status.card_type = hdspm->io_type;
6289 
6290         status.autosync_source = hdspm_autosync_ref(hdspm);
6291 
6292         status.card_clock = 110069313433624ULL;
6293         status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6294 
6295         switch (hdspm->io_type) {
6296         case MADI:
6297         case MADIface:
6298             status.card_specific.madi.sync_wc =
6299                 hdspm_wc_sync_check(hdspm);
6300             status.card_specific.madi.sync_madi =
6301                 hdspm_madi_sync_check(hdspm);
6302             status.card_specific.madi.sync_tco =
6303                 hdspm_tco_sync_check(hdspm);
6304             status.card_specific.madi.sync_in =
6305                 hdspm_sync_in_sync_check(hdspm);
6306 
6307             statusregister =
6308                 hdspm_read(hdspm, HDSPM_statusRegister);
6309             status.card_specific.madi.madi_input =
6310                 (statusregister & HDSPM_AB_int) ? 1 : 0;
6311             status.card_specific.madi.channel_format =
6312                 (statusregister & HDSPM_RX_64ch) ? 1 : 0;
6313             /* TODO: Mac driver sets it when f_s>48kHz */
6314             status.card_specific.madi.frame_format = 0;
6315             break;
6316 
6317         default:
6318             break;
6319         }
6320 
6321         if (copy_to_user(argp, &status, sizeof(status)))
6322             return -EFAULT;
6323 
6324 
6325         break;
6326 
6327     case SNDRV_HDSPM_IOCTL_GET_VERSION:
6328         memset(&hdspm_version, 0, sizeof(hdspm_version));
6329 
6330         hdspm_version.card_type = hdspm->io_type;
6331         strscpy(hdspm_version.cardname, hdspm->card_name,
6332                 sizeof(hdspm_version.cardname));
6333         hdspm_version.serial = hdspm->serial;
6334         hdspm_version.firmware_rev = hdspm->firmware_rev;
6335         hdspm_version.addons = 0;
6336         if (hdspm->tco)
6337             hdspm_version.addons |= HDSPM_ADDON_TCO;
6338 
6339         if (copy_to_user(argp, &hdspm_version,
6340                     sizeof(hdspm_version)))
6341             return -EFAULT;
6342         break;
6343 
6344     case SNDRV_HDSPM_IOCTL_GET_MIXER:
6345         if (copy_from_user(&mixer, argp, sizeof(mixer)))
6346             return -EFAULT;
6347         if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6348                  sizeof(*mixer.mixer)))
6349             return -EFAULT;
6350         break;
6351 
6352     default:
6353         return -EINVAL;
6354     }
6355     return 0;
6356 }
6357 
6358 static const struct snd_pcm_ops snd_hdspm_ops = {
6359     .open = snd_hdspm_open,
6360     .close = snd_hdspm_release,
6361     .ioctl = snd_hdspm_ioctl,
6362     .hw_params = snd_hdspm_hw_params,
6363     .hw_free = snd_hdspm_hw_free,
6364     .prepare = snd_hdspm_prepare,
6365     .trigger = snd_hdspm_trigger,
6366     .pointer = snd_hdspm_hw_pointer,
6367 };
6368 
6369 static int snd_hdspm_create_hwdep(struct snd_card *card,
6370                   struct hdspm *hdspm)
6371 {
6372     struct snd_hwdep *hw;
6373     int err;
6374 
6375     err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6376     if (err < 0)
6377         return err;
6378 
6379     hdspm->hwdep = hw;
6380     hw->private_data = hdspm;
6381     strcpy(hw->name, "HDSPM hwdep interface");
6382 
6383     hw->ops.open = snd_hdspm_hwdep_dummy_op;
6384     hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6385     hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl;
6386     hw->ops.release = snd_hdspm_hwdep_dummy_op;
6387 
6388     return 0;
6389 }
6390 
6391 
6392 /*------------------------------------------------------------
6393    memory interface
6394  ------------------------------------------------------------*/
6395 static int snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6396 {
6397     struct snd_pcm *pcm;
6398     size_t wanted;
6399 
6400     pcm = hdspm->pcm;
6401 
6402     wanted = HDSPM_DMA_AREA_BYTES;
6403 
6404     snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
6405                           &hdspm->pci->dev,
6406                           wanted, wanted);
6407     dev_dbg(hdspm->card->dev, " Preallocated %zd Bytes\n", wanted);
6408     return 0;
6409 }
6410 
6411 /* Inform the card what DMA addresses to use for the indicated channel. */
6412 /* Each channel got 16 4K pages allocated for DMA transfers. */
6413 static void hdspm_set_channel_dma_addr(struct hdspm *hdspm,
6414                        struct snd_pcm_substream *substream,
6415                        unsigned int reg, int channel)
6416 {
6417     int i;
6418 
6419     for (i = channel * 16; i < channel * 16 + 16; i++)
6420         hdspm_write(hdspm, reg + 4 * i,
6421                 snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6422 }
6423 
6424 
6425 /* ------------- ALSA Devices ---------------------------- */
6426 static int snd_hdspm_create_pcm(struct snd_card *card,
6427                 struct hdspm *hdspm)
6428 {
6429     struct snd_pcm *pcm;
6430     int err;
6431 
6432     err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6433     if (err < 0)
6434         return err;
6435 
6436     hdspm->pcm = pcm;
6437     pcm->private_data = hdspm;
6438     strcpy(pcm->name, hdspm->card_name);
6439 
6440     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6441             &snd_hdspm_ops);
6442     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6443             &snd_hdspm_ops);
6444 
6445     pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6446 
6447     err = snd_hdspm_preallocate_memory(hdspm);
6448     if (err < 0)
6449         return err;
6450 
6451     return 0;
6452 }
6453 
6454 static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6455 {
6456     int i;
6457 
6458     for (i = 0; i < hdspm->midiPorts; i++)
6459         snd_hdspm_flush_midi_input(hdspm, i);
6460 }
6461 
6462 static int snd_hdspm_create_alsa_devices(struct snd_card *card,
6463                      struct hdspm *hdspm)
6464 {
6465     int err, i;
6466 
6467     dev_dbg(card->dev, "Create card...\n");
6468     err = snd_hdspm_create_pcm(card, hdspm);
6469     if (err < 0)
6470         return err;
6471 
6472     i = 0;
6473     while (i < hdspm->midiPorts) {
6474         err = snd_hdspm_create_midi(card, hdspm, i);
6475         if (err < 0) {
6476             return err;
6477         }
6478         i++;
6479     }
6480 
6481     err = snd_hdspm_create_controls(card, hdspm);
6482     if (err < 0)
6483         return err;
6484 
6485     err = snd_hdspm_create_hwdep(card, hdspm);
6486     if (err < 0)
6487         return err;
6488 
6489     dev_dbg(card->dev, "proc init...\n");
6490     snd_hdspm_proc_init(hdspm);
6491 
6492     hdspm->system_sample_rate = -1;
6493     hdspm->last_external_sample_rate = -1;
6494     hdspm->last_internal_sample_rate = -1;
6495     hdspm->playback_pid = -1;
6496     hdspm->capture_pid = -1;
6497     hdspm->capture_substream = NULL;
6498     hdspm->playback_substream = NULL;
6499 
6500     dev_dbg(card->dev, "Set defaults...\n");
6501     err = snd_hdspm_set_defaults(hdspm);
6502     if (err < 0)
6503         return err;
6504 
6505     dev_dbg(card->dev, "Update mixer controls...\n");
6506     hdspm_update_simple_mixer_controls(hdspm);
6507 
6508     dev_dbg(card->dev, "Initializing complete?\n");
6509 
6510     err = snd_card_register(card);
6511     if (err < 0) {
6512         dev_err(card->dev, "error registering card\n");
6513         return err;
6514     }
6515 
6516     dev_dbg(card->dev, "... yes now\n");
6517 
6518     return 0;
6519 }
6520 
6521 static int snd_hdspm_create(struct snd_card *card,
6522                 struct hdspm *hdspm)
6523 {
6524 
6525     struct pci_dev *pci = hdspm->pci;
6526     int err;
6527     unsigned long io_extent;
6528 
6529     hdspm->irq = -1;
6530     hdspm->card = card;
6531 
6532     spin_lock_init(&hdspm->lock);
6533     INIT_WORK(&hdspm->midi_work, hdspm_midi_work);
6534 
6535     pci_read_config_word(hdspm->pci,
6536             PCI_CLASS_REVISION, &hdspm->firmware_rev);
6537 
6538     strcpy(card->mixername, "Xilinx FPGA");
6539     strcpy(card->driver, "HDSPM");
6540 
6541     switch (hdspm->firmware_rev) {
6542     case HDSPM_RAYDAT_REV:
6543         hdspm->io_type = RayDAT;
6544         hdspm->card_name = "RME RayDAT";
6545         hdspm->midiPorts = 2;
6546         break;
6547     case HDSPM_AIO_REV:
6548         hdspm->io_type = AIO;
6549         hdspm->card_name = "RME AIO";
6550         hdspm->midiPorts = 1;
6551         break;
6552     case HDSPM_MADIFACE_REV:
6553         hdspm->io_type = MADIface;
6554         hdspm->card_name = "RME MADIface";
6555         hdspm->midiPorts = 1;
6556         break;
6557     default:
6558         if ((hdspm->firmware_rev == 0xf0) ||
6559             ((hdspm->firmware_rev >= 0xe6) &&
6560                     (hdspm->firmware_rev <= 0xea))) {
6561             hdspm->io_type = AES32;
6562             hdspm->card_name = "RME AES32";
6563             hdspm->midiPorts = 2;
6564         } else if ((hdspm->firmware_rev == 0xd2) ||
6565             ((hdspm->firmware_rev >= 0xc8)  &&
6566                 (hdspm->firmware_rev <= 0xcf))) {
6567             hdspm->io_type = MADI;
6568             hdspm->card_name = "RME MADI";
6569             hdspm->midiPorts = 3;
6570         } else {
6571             dev_err(card->dev,
6572                 "unknown firmware revision %x\n",
6573                 hdspm->firmware_rev);
6574             return -ENODEV;
6575         }
6576     }
6577 
6578     err = pcim_enable_device(pci);
6579     if (err < 0)
6580         return err;
6581 
6582     pci_set_master(hdspm->pci);
6583 
6584     err = pcim_iomap_regions(pci, 1 << 0, "hdspm");
6585     if (err < 0)
6586         return err;
6587 
6588     hdspm->port = pci_resource_start(pci, 0);
6589     io_extent = pci_resource_len(pci, 0);
6590     hdspm->iobase = pcim_iomap_table(pci)[0];
6591     dev_dbg(card->dev, "remapped region (0x%lx) 0x%lx-0x%lx\n",
6592             (unsigned long)hdspm->iobase, hdspm->port,
6593             hdspm->port + io_extent - 1);
6594 
6595     if (devm_request_irq(&pci->dev, pci->irq, snd_hdspm_interrupt,
6596                  IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6597         dev_err(card->dev, "unable to use IRQ %d\n", pci->irq);
6598         return -EBUSY;
6599     }
6600 
6601     dev_dbg(card->dev, "use IRQ %d\n", pci->irq);
6602 
6603     hdspm->irq = pci->irq;
6604     card->sync_irq = hdspm->irq;
6605 
6606     dev_dbg(card->dev, "kmalloc Mixer memory of %zd Bytes\n",
6607         sizeof(*hdspm->mixer));
6608     hdspm->mixer = devm_kzalloc(&pci->dev, sizeof(*hdspm->mixer), GFP_KERNEL);
6609     if (!hdspm->mixer)
6610         return -ENOMEM;
6611 
6612     hdspm->port_names_in = NULL;
6613     hdspm->port_names_out = NULL;
6614 
6615     switch (hdspm->io_type) {
6616     case AES32:
6617         hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6618         hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6619         hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6620 
6621         hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6622             channel_map_aes32;
6623         hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6624             channel_map_aes32;
6625         hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6626             channel_map_aes32;
6627         hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6628             texts_ports_aes32;
6629         hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6630             texts_ports_aes32;
6631         hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6632             texts_ports_aes32;
6633 
6634         hdspm->max_channels_out = hdspm->max_channels_in =
6635             AES32_CHANNELS;
6636         hdspm->port_names_in = hdspm->port_names_out =
6637             texts_ports_aes32;
6638         hdspm->channel_map_in = hdspm->channel_map_out =
6639             channel_map_aes32;
6640 
6641         break;
6642 
6643     case MADI:
6644     case MADIface:
6645         hdspm->ss_in_channels = hdspm->ss_out_channels =
6646             MADI_SS_CHANNELS;
6647         hdspm->ds_in_channels = hdspm->ds_out_channels =
6648             MADI_DS_CHANNELS;
6649         hdspm->qs_in_channels = hdspm->qs_out_channels =
6650             MADI_QS_CHANNELS;
6651 
6652         hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6653             channel_map_unity_ss;
6654         hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6655             channel_map_unity_ss;
6656         hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6657             channel_map_unity_ss;
6658 
6659         hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6660             texts_ports_madi;
6661         hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6662             texts_ports_madi;
6663         hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6664             texts_ports_madi;
6665         break;
6666 
6667     case AIO:
6668         hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6669         hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6670         hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6671         hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6672         hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6673         hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6674 
6675         if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6676             dev_info(card->dev, "AEB input board found\n");
6677             hdspm->ss_in_channels += 4;
6678             hdspm->ds_in_channels += 4;
6679             hdspm->qs_in_channels += 4;
6680         }
6681 
6682         if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBO_D)) {
6683             dev_info(card->dev, "AEB output board found\n");
6684             hdspm->ss_out_channels += 4;
6685             hdspm->ds_out_channels += 4;
6686             hdspm->qs_out_channels += 4;
6687         }
6688 
6689         hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6690         hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6691         hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6692 
6693         hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6694         hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6695         hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6696 
6697         hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6698         hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6699         hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6700         hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6701         hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6702         hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6703 
6704         break;
6705 
6706     case RayDAT:
6707         hdspm->ss_in_channels = hdspm->ss_out_channels =
6708             RAYDAT_SS_CHANNELS;
6709         hdspm->ds_in_channels = hdspm->ds_out_channels =
6710             RAYDAT_DS_CHANNELS;
6711         hdspm->qs_in_channels = hdspm->qs_out_channels =
6712             RAYDAT_QS_CHANNELS;
6713 
6714         hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6715         hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6716 
6717         hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6718             channel_map_raydat_ss;
6719         hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6720             channel_map_raydat_ds;
6721         hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6722             channel_map_raydat_qs;
6723         hdspm->channel_map_in = hdspm->channel_map_out =
6724             channel_map_raydat_ss;
6725 
6726         hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6727             texts_ports_raydat_ss;
6728         hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6729             texts_ports_raydat_ds;
6730         hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6731             texts_ports_raydat_qs;
6732 
6733 
6734         break;
6735 
6736     }
6737 
6738     /* TCO detection */
6739     switch (hdspm->io_type) {
6740     case AIO:
6741     case RayDAT:
6742         if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6743                 HDSPM_s2_tco_detect) {
6744             hdspm->midiPorts++;
6745             hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL);
6746             if (hdspm->tco)
6747                 hdspm_tco_write(hdspm);
6748 
6749             dev_info(card->dev, "AIO/RayDAT TCO module found\n");
6750         } else {
6751             hdspm->tco = NULL;
6752         }
6753         break;
6754 
6755     case MADI:
6756     case AES32:
6757         if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6758             hdspm->midiPorts++;
6759             hdspm->tco = kzalloc(sizeof(*hdspm->tco), GFP_KERNEL);
6760             if (hdspm->tco)
6761                 hdspm_tco_write(hdspm);
6762 
6763             dev_info(card->dev, "MADI/AES TCO module found\n");
6764         } else {
6765             hdspm->tco = NULL;
6766         }
6767         break;
6768 
6769     default:
6770         hdspm->tco = NULL;
6771     }
6772 
6773     /* texts */
6774     switch (hdspm->io_type) {
6775     case AES32:
6776         if (hdspm->tco) {
6777             hdspm->texts_autosync = texts_autosync_aes_tco;
6778             hdspm->texts_autosync_items =
6779                 ARRAY_SIZE(texts_autosync_aes_tco);
6780         } else {
6781             hdspm->texts_autosync = texts_autosync_aes;
6782             hdspm->texts_autosync_items =
6783                 ARRAY_SIZE(texts_autosync_aes);
6784         }
6785         break;
6786 
6787     case MADI:
6788         if (hdspm->tco) {
6789             hdspm->texts_autosync = texts_autosync_madi_tco;
6790             hdspm->texts_autosync_items = 4;
6791         } else {
6792             hdspm->texts_autosync = texts_autosync_madi;
6793             hdspm->texts_autosync_items = 3;
6794         }
6795         break;
6796 
6797     case MADIface:
6798 
6799         break;
6800 
6801     case RayDAT:
6802         if (hdspm->tco) {
6803             hdspm->texts_autosync = texts_autosync_raydat_tco;
6804             hdspm->texts_autosync_items = 9;
6805         } else {
6806             hdspm->texts_autosync = texts_autosync_raydat;
6807             hdspm->texts_autosync_items = 8;
6808         }
6809         break;
6810 
6811     case AIO:
6812         if (hdspm->tco) {
6813             hdspm->texts_autosync = texts_autosync_aio_tco;
6814             hdspm->texts_autosync_items = 6;
6815         } else {
6816             hdspm->texts_autosync = texts_autosync_aio;
6817             hdspm->texts_autosync_items = 5;
6818         }
6819         break;
6820 
6821     }
6822 
6823     if (hdspm->io_type != MADIface) {
6824         hdspm->serial = (hdspm_read(hdspm,
6825                 HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6826         /* id contains either a user-provided value or the default
6827          * NULL. If it's the default, we're safe to
6828          * fill card->id with the serial number.
6829          *
6830          * If the serial number is 0xFFFFFF, then we're dealing with
6831          * an old PCI revision that comes without a sane number. In
6832          * this case, we don't set card->id to avoid collisions
6833          * when running with multiple cards.
6834          */
6835         if (!id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
6836             snprintf(card->id, sizeof(card->id),
6837                  "HDSPMx%06x", hdspm->serial);
6838             snd_card_set_id(card, card->id);
6839         }
6840     }
6841 
6842     dev_dbg(card->dev, "create alsa devices.\n");
6843     err = snd_hdspm_create_alsa_devices(card, hdspm);
6844     if (err < 0)
6845         return err;
6846 
6847     snd_hdspm_initialize_midi_flush(hdspm);
6848 
6849     return 0;
6850 }
6851 
6852 
6853 static void snd_hdspm_card_free(struct snd_card *card)
6854 {
6855     struct hdspm *hdspm = card->private_data;
6856 
6857     if (hdspm->port) {
6858         cancel_work_sync(&hdspm->midi_work);
6859 
6860         /* stop th audio, and cancel all interrupts */
6861         hdspm->control_register &=
6862             ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6863               HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6864               HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6865         hdspm_write(hdspm, HDSPM_controlRegister,
6866                 hdspm->control_register);
6867     }
6868 }
6869 
6870 
6871 static int snd_hdspm_probe(struct pci_dev *pci,
6872                const struct pci_device_id *pci_id)
6873 {
6874     static int dev;
6875     struct hdspm *hdspm;
6876     struct snd_card *card;
6877     int err;
6878 
6879     if (dev >= SNDRV_CARDS)
6880         return -ENODEV;
6881     if (!enable[dev]) {
6882         dev++;
6883         return -ENOENT;
6884     }
6885 
6886     err = snd_devm_card_new(&pci->dev, index[dev], id[dev],
6887                 THIS_MODULE, sizeof(*hdspm), &card);
6888     if (err < 0)
6889         return err;
6890 
6891     hdspm = card->private_data;
6892     card->private_free = snd_hdspm_card_free;
6893     hdspm->dev = dev;
6894     hdspm->pci = pci;
6895 
6896     err = snd_hdspm_create(card, hdspm);
6897     if (err < 0)
6898         goto error;
6899 
6900     if (hdspm->io_type != MADIface) {
6901         snprintf(card->shortname, sizeof(card->shortname), "%s_%x",
6902             hdspm->card_name, hdspm->serial);
6903         snprintf(card->longname, sizeof(card->longname),
6904              "%s S/N 0x%x at 0x%lx, irq %d",
6905              hdspm->card_name, hdspm->serial,
6906              hdspm->port, hdspm->irq);
6907     } else {
6908         snprintf(card->shortname, sizeof(card->shortname), "%s",
6909              hdspm->card_name);
6910         snprintf(card->longname, sizeof(card->longname),
6911              "%s at 0x%lx, irq %d",
6912              hdspm->card_name, hdspm->port, hdspm->irq);
6913     }
6914 
6915     err = snd_card_register(card);
6916     if (err < 0)
6917         goto error;
6918 
6919     pci_set_drvdata(pci, card);
6920 
6921     dev++;
6922     return 0;
6923 
6924  error:
6925     snd_card_free(card);
6926     return err;
6927 }
6928 
6929 static struct pci_driver hdspm_driver = {
6930     .name = KBUILD_MODNAME,
6931     .id_table = snd_hdspm_ids,
6932     .probe = snd_hdspm_probe,
6933 };
6934 
6935 module_pci_driver(hdspm_driver);