linux/sound/pci/rme9652/hdspm.c
<<
>>
Prefs
   1/*
   2 *   ALSA driver for RME Hammerfall DSP MADI audio interface(s)
   3 *
   4 *      Copyright (c) 2003 Winfried Ritsch (IEM)
   5 *      code based on hdsp.c   Paul Davis
   6 *                             Marcus Andersson
   7 *                             Thomas Charbonnel
   8 *      Modified 2006-06-01 for AES32 support by Remy Bruno
   9 *                                               <remy.bruno@trinnov.com>
  10 *
  11 *      Modified 2009-04-13 for proper metering by Florian Faber
  12 *                                               <faber@faberman.de>
  13 *
  14 *      Modified 2009-04-14 for native float support by Florian Faber
  15 *                                               <faber@faberman.de>
  16 *
  17 *      Modified 2009-04-26 fixed bug in rms metering by Florian Faber
  18 *                                               <faber@faberman.de>
  19 *
  20 *      Modified 2009-04-30 added hw serial number support by Florian Faber
  21 *
  22 *      Modified 2011-01-14 added S/PDIF input on RayDATs by Adrian Knoth
  23 *
  24 *      Modified 2011-01-25 variable period sizes on RayDAT/AIO by Adrian Knoth
  25 *
  26 *   This program is free software; you can redistribute it and/or modify
  27 *   it under the terms of the GNU General Public License as published by
  28 *   the Free Software Foundation; either version 2 of the License, or
  29 *   (at your option) any later version.
  30 *
  31 *   This program is distributed in the hope that it will be useful,
  32 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  33 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  34 *   GNU General Public License for more details.
  35 *
  36 *   You should have received a copy of the GNU General Public License
  37 *   along with this program; if not, write to the Free Software
  38 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  39 *
  40 */
  41#include <linux/init.h>
  42#include <linux/delay.h>
  43#include <linux/interrupt.h>
  44#include <linux/module.h>
  45#include <linux/slab.h>
  46#include <linux/pci.h>
  47#include <linux/math64.h>
  48#include <asm/io.h>
  49
  50#include <sound/core.h>
  51#include <sound/control.h>
  52#include <sound/pcm.h>
  53#include <sound/pcm_params.h>
  54#include <sound/info.h>
  55#include <sound/asoundef.h>
  56#include <sound/rawmidi.h>
  57#include <sound/hwdep.h>
  58#include <sound/initval.h>
  59
  60#include <sound/hdspm.h>
  61
  62static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;        /* Index 0-MAX */
  63static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;         /* ID for this card */
  64static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
  65
  66module_param_array(index, int, NULL, 0444);
  67MODULE_PARM_DESC(index, "Index value for RME HDSPM interface.");
  68
  69module_param_array(id, charp, NULL, 0444);
  70MODULE_PARM_DESC(id, "ID string for RME HDSPM interface.");
  71
  72module_param_array(enable, bool, NULL, 0444);
  73MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards.");
  74
  75
  76MODULE_AUTHOR
  77(
  78        "Winfried Ritsch <ritsch_AT_iem.at>, "
  79        "Paul Davis <paul@linuxaudiosystems.com>, "
  80        "Marcus Andersson, Thomas Charbonnel <thomas@undata.org>, "
  81        "Remy Bruno <remy.bruno@trinnov.com>, "
  82        "Florian Faber <faberman@linuxproaudio.org>, "
  83        "Adrian Knoth <adi@drcomp.erfurt.thur.de>"
  84);
  85MODULE_DESCRIPTION("RME HDSPM");
  86MODULE_LICENSE("GPL");
  87MODULE_SUPPORTED_DEVICE("{{RME HDSPM-MADI}}");
  88
  89/* --- Write registers. ---
  90  These are defined as byte-offsets from the iobase value.  */
  91
  92#define HDSPM_WR_SETTINGS             0
  93#define HDSPM_outputBufferAddress    32
  94#define HDSPM_inputBufferAddress     36
  95#define HDSPM_controlRegister        64
  96#define HDSPM_interruptConfirmation  96
  97#define HDSPM_control2Reg            256  /* not in specs ???????? */
  98#define HDSPM_freqReg                256  /* for AES32 */
  99#define HDSPM_midiDataOut0           352  /* just believe in old code */
 100#define HDSPM_midiDataOut1           356
 101#define HDSPM_eeprom_wr              384  /* for AES32 */
 102
 103/* DMA enable for 64 channels, only Bit 0 is relevant */
 104#define HDSPM_outputEnableBase       512  /* 512-767  input  DMA */
 105#define HDSPM_inputEnableBase        768  /* 768-1023 output DMA */
 106
 107/* 16 page addresses for each of the 64 channels DMA buffer in and out
 108   (each 64k=16*4k) Buffer must be 4k aligned (which is default i386 ????) */
 109#define HDSPM_pageAddressBufferOut       8192
 110#define HDSPM_pageAddressBufferIn        (HDSPM_pageAddressBufferOut+64*16*4)
 111
 112#define HDSPM_MADI_mixerBase    32768   /* 32768-65535 for 2x64x64 Fader */
 113
 114#define HDSPM_MATRIX_MIXER_SIZE  8192   /* = 2*64*64 * 4 Byte => 32kB */
 115
 116/* --- Read registers. ---
 117   These are defined as byte-offsets from the iobase value */
 118#define HDSPM_statusRegister    0
 119/*#define HDSPM_statusRegister2  96 */
 120/* after RME Windows driver sources, status2 is 4-byte word # 48 = word at
 121 * offset 192, for AES32 *and* MADI
 122 * => need to check that offset 192 is working on MADI */
 123#define HDSPM_statusRegister2  192
 124#define HDSPM_timecodeRegister 128
 125
 126/* AIO, RayDAT */
 127#define HDSPM_RD_STATUS_0 0
 128#define HDSPM_RD_STATUS_1 64
 129#define HDSPM_RD_STATUS_2 128
 130#define HDSPM_RD_STATUS_3 192
 131
 132#define HDSPM_RD_TCO           256
 133#define HDSPM_RD_PLL_FREQ      512
 134#define HDSPM_WR_TCO           128
 135
 136#define HDSPM_TCO1_TCO_lock                     0x00000001
 137#define HDSPM_TCO1_WCK_Input_Range_LSB          0x00000002
 138#define HDSPM_TCO1_WCK_Input_Range_MSB          0x00000004
 139#define HDSPM_TCO1_LTC_Input_valid              0x00000008
 140#define HDSPM_TCO1_WCK_Input_valid              0x00000010
 141#define HDSPM_TCO1_Video_Input_Format_NTSC      0x00000020
 142#define HDSPM_TCO1_Video_Input_Format_PAL       0x00000040
 143
 144#define HDSPM_TCO1_set_TC                       0x00000100
 145#define HDSPM_TCO1_set_drop_frame_flag          0x00000200
 146#define HDSPM_TCO1_LTC_Format_LSB               0x00000400
 147#define HDSPM_TCO1_LTC_Format_MSB               0x00000800
 148
 149#define HDSPM_TCO2_TC_run                       0x00010000
 150#define HDSPM_TCO2_WCK_IO_ratio_LSB             0x00020000
 151#define HDSPM_TCO2_WCK_IO_ratio_MSB             0x00040000
 152#define HDSPM_TCO2_set_num_drop_frames_LSB      0x00080000
 153#define HDSPM_TCO2_set_num_drop_frames_MSB      0x00100000
 154#define HDSPM_TCO2_set_jam_sync                 0x00200000
 155#define HDSPM_TCO2_set_flywheel                 0x00400000
 156
 157#define HDSPM_TCO2_set_01_4                     0x01000000
 158#define HDSPM_TCO2_set_pull_down                0x02000000
 159#define HDSPM_TCO2_set_pull_up                  0x04000000
 160#define HDSPM_TCO2_set_freq                     0x08000000
 161#define HDSPM_TCO2_set_term_75R                 0x10000000
 162#define HDSPM_TCO2_set_input_LSB                0x20000000
 163#define HDSPM_TCO2_set_input_MSB                0x40000000
 164#define HDSPM_TCO2_set_freq_from_app            0x80000000
 165
 166
 167#define HDSPM_midiDataOut0    352
 168#define HDSPM_midiDataOut1    356
 169#define HDSPM_midiDataOut2    368
 170
 171#define HDSPM_midiDataIn0     360
 172#define HDSPM_midiDataIn1     364
 173#define HDSPM_midiDataIn2     372
 174#define HDSPM_midiDataIn3     376
 175
 176/* status is data bytes in MIDI-FIFO (0-128) */
 177#define HDSPM_midiStatusOut0  384
 178#define HDSPM_midiStatusOut1  388
 179#define HDSPM_midiStatusOut2  400
 180
 181#define HDSPM_midiStatusIn0   392
 182#define HDSPM_midiStatusIn1   396
 183#define HDSPM_midiStatusIn2   404
 184#define HDSPM_midiStatusIn3   408
 185
 186
 187/* the meters are regular i/o-mapped registers, but offset
 188   considerably from the rest. the peak registers are reset
 189   when read; the least-significant 4 bits are full-scale counters;
 190   the actual peak value is in the most-significant 24 bits.
 191*/
 192
 193#define HDSPM_MADI_INPUT_PEAK           4096
 194#define HDSPM_MADI_PLAYBACK_PEAK        4352
 195#define HDSPM_MADI_OUTPUT_PEAK          4608
 196
 197#define HDSPM_MADI_INPUT_RMS_L          6144
 198#define HDSPM_MADI_PLAYBACK_RMS_L       6400
 199#define HDSPM_MADI_OUTPUT_RMS_L         6656
 200
 201#define HDSPM_MADI_INPUT_RMS_H          7168
 202#define HDSPM_MADI_PLAYBACK_RMS_H       7424
 203#define HDSPM_MADI_OUTPUT_RMS_H         7680
 204
 205/* --- Control Register bits --------- */
 206#define HDSPM_Start                (1<<0) /* start engine */
 207
 208#define HDSPM_Latency0             (1<<1) /* buffer size = 2^n */
 209#define HDSPM_Latency1             (1<<2) /* where n is defined */
 210#define HDSPM_Latency2             (1<<3) /* by Latency{2,1,0} */
 211
 212#define HDSPM_ClockModeMaster      (1<<4) /* 1=Master, 0=Autosync */
 213#define HDSPM_c0Master          0x1    /* Master clock bit in settings
 214                                          register [RayDAT, AIO] */
 215
 216#define HDSPM_AudioInterruptEnable (1<<5) /* what do you think ? */
 217
 218#define HDSPM_Frequency0  (1<<6)  /* 0=44.1kHz/88.2kHz 1=48kHz/96kHz */
 219#define HDSPM_Frequency1  (1<<7)  /* 0=32kHz/64kHz */
 220#define HDSPM_DoubleSpeed (1<<8)  /* 0=normal speed, 1=double speed */
 221#define HDSPM_QuadSpeed   (1<<31) /* quad speed bit */
 222
 223#define HDSPM_Professional (1<<9) /* Professional */ /* AES32 ONLY */
 224#define HDSPM_TX_64ch     (1<<10) /* Output 64channel MODE=1,
 225                                     56channelMODE=0 */ /* MADI ONLY*/
 226#define HDSPM_Emphasis    (1<<10) /* Emphasis */ /* AES32 ONLY */
 227
 228#define HDSPM_AutoInp     (1<<11) /* Auto Input (takeover) == Safe Mode,
 229                                     0=off, 1=on  */ /* MADI ONLY */
 230#define HDSPM_Dolby       (1<<11) /* Dolby = "NonAudio" ?? */ /* AES32 ONLY */
 231
 232#define HDSPM_InputSelect0 (1<<14) /* Input select 0= optical, 1=coax
 233                                    * -- MADI ONLY
 234                                    */
 235#define HDSPM_InputSelect1 (1<<15) /* should be 0 */
 236
 237#define HDSPM_SyncRef2     (1<<13)
 238#define HDSPM_SyncRef3     (1<<25)
 239
 240#define HDSPM_SMUX         (1<<18) /* Frame ??? */ /* MADI ONY */
 241#define HDSPM_clr_tms      (1<<19) /* clear track marker, do not use
 242                                      AES additional bits in
 243                                      lower 5 Audiodatabits ??? */
 244#define HDSPM_taxi_reset   (1<<20) /* ??? */ /* MADI ONLY ? */
 245#define HDSPM_WCK48        (1<<20) /* Frame ??? = HDSPM_SMUX */ /* AES32 ONLY */
 246
 247#define HDSPM_Midi0InterruptEnable 0x0400000
 248#define HDSPM_Midi1InterruptEnable 0x0800000
 249#define HDSPM_Midi2InterruptEnable 0x0200000
 250#define HDSPM_Midi3InterruptEnable 0x4000000
 251
 252#define HDSPM_LineOut (1<<24) /* Analog Out on channel 63/64 on=1, mute=0 */
 253#define HDSPe_FLOAT_FORMAT         0x2000000
 254
 255#define HDSPM_DS_DoubleWire (1<<26) /* AES32 ONLY */
 256#define HDSPM_QS_DoubleWire (1<<27) /* AES32 ONLY */
 257#define HDSPM_QS_QuadWire   (1<<28) /* AES32 ONLY */
 258
 259#define HDSPM_wclk_sel (1<<30)
 260
 261/* --- bit helper defines */
 262#define HDSPM_LatencyMask    (HDSPM_Latency0|HDSPM_Latency1|HDSPM_Latency2)
 263#define HDSPM_FrequencyMask  (HDSPM_Frequency0|HDSPM_Frequency1|\
 264                              HDSPM_DoubleSpeed|HDSPM_QuadSpeed)
 265#define HDSPM_InputMask      (HDSPM_InputSelect0|HDSPM_InputSelect1)
 266#define HDSPM_InputOptical   0
 267#define HDSPM_InputCoaxial   (HDSPM_InputSelect0)
 268#define HDSPM_SyncRefMask    (HDSPM_SyncRef0|HDSPM_SyncRef1|\
 269                              HDSPM_SyncRef2|HDSPM_SyncRef3)
 270
 271#define HDSPM_c0_SyncRef0      0x2
 272#define HDSPM_c0_SyncRef1      0x4
 273#define HDSPM_c0_SyncRef2      0x8
 274#define HDSPM_c0_SyncRef3      0x10
 275#define HDSPM_c0_SyncRefMask   (HDSPM_c0_SyncRef0 | HDSPM_c0_SyncRef1 |\
 276                                HDSPM_c0_SyncRef2 | HDSPM_c0_SyncRef3)
 277
 278#define HDSPM_SYNC_FROM_WORD    0       /* Preferred sync reference */
 279#define HDSPM_SYNC_FROM_MADI    1       /* choices - used by "pref_sync_ref" */
 280#define HDSPM_SYNC_FROM_TCO     2
 281#define HDSPM_SYNC_FROM_SYNC_IN 3
 282
 283#define HDSPM_Frequency32KHz    HDSPM_Frequency0
 284#define HDSPM_Frequency44_1KHz  HDSPM_Frequency1
 285#define HDSPM_Frequency48KHz   (HDSPM_Frequency1|HDSPM_Frequency0)
 286#define HDSPM_Frequency64KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency0)
 287#define HDSPM_Frequency88_2KHz (HDSPM_DoubleSpeed|HDSPM_Frequency1)
 288#define HDSPM_Frequency96KHz   (HDSPM_DoubleSpeed|HDSPM_Frequency1|\
 289                                HDSPM_Frequency0)
 290#define HDSPM_Frequency128KHz   (HDSPM_QuadSpeed|HDSPM_Frequency0)
 291#define HDSPM_Frequency176_4KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1)
 292#define HDSPM_Frequency192KHz   (HDSPM_QuadSpeed|HDSPM_Frequency1|\
 293                                 HDSPM_Frequency0)
 294
 295
 296/* Synccheck Status */
 297#define HDSPM_SYNC_CHECK_NO_LOCK 0
 298#define HDSPM_SYNC_CHECK_LOCK    1
 299#define HDSPM_SYNC_CHECK_SYNC    2
 300
 301/* AutoSync References - used by "autosync_ref" control switch */
 302#define HDSPM_AUTOSYNC_FROM_WORD      0
 303#define HDSPM_AUTOSYNC_FROM_MADI      1
 304#define HDSPM_AUTOSYNC_FROM_TCO       2
 305#define HDSPM_AUTOSYNC_FROM_SYNC_IN   3
 306#define HDSPM_AUTOSYNC_FROM_NONE      4
 307
 308/* Possible sources of MADI input */
 309#define HDSPM_OPTICAL 0         /* optical   */
 310#define HDSPM_COAXIAL 1         /* BNC */
 311
 312#define hdspm_encode_latency(x)       (((x)<<1) & HDSPM_LatencyMask)
 313#define hdspm_decode_latency(x)       ((((x) & HDSPM_LatencyMask)>>1))
 314
 315#define hdspm_encode_in(x) (((x)&0x3)<<14)
 316#define hdspm_decode_in(x) (((x)>>14)&0x3)
 317
 318/* --- control2 register bits --- */
 319#define HDSPM_TMS             (1<<0)
 320#define HDSPM_TCK             (1<<1)
 321#define HDSPM_TDI             (1<<2)
 322#define HDSPM_JTAG            (1<<3)
 323#define HDSPM_PWDN            (1<<4)
 324#define HDSPM_PROGRAM         (1<<5)
 325#define HDSPM_CONFIG_MODE_0   (1<<6)
 326#define HDSPM_CONFIG_MODE_1   (1<<7)
 327/*#define HDSPM_VERSION_BIT     (1<<8) not defined any more*/
 328#define HDSPM_BIGENDIAN_MODE  (1<<9)
 329#define HDSPM_RD_MULTIPLE     (1<<10)
 330
 331/* --- Status Register bits --- */ /* MADI ONLY */ /* Bits defined here and
 332     that do not conflict with specific bits for AES32 seem to be valid also
 333     for the AES32
 334 */
 335#define HDSPM_audioIRQPending    (1<<0) /* IRQ is high and pending */
 336#define HDSPM_RX_64ch            (1<<1) /* Input 64chan. MODE=1, 56chn MODE=0 */
 337#define HDSPM_AB_int             (1<<2) /* InputChannel Opt=0, Coax=1
 338                                         * (like inp0)
 339                                         */
 340
 341#define HDSPM_madiLock           (1<<3) /* MADI Locked =1, no=0 */
 342#define HDSPM_madiSync          (1<<18) /* MADI is in sync */
 343
 344#define HDSPM_tcoLock    0x00000020 /* Optional TCO locked status FOR HDSPe MADI! */
 345#define HDSPM_tcoSync    0x10000000 /* Optional TCO sync status */
 346
 347#define HDSPM_syncInLock 0x00010000 /* Sync In lock status FOR HDSPe MADI! */
 348#define HDSPM_syncInSync 0x00020000 /* Sync In sync status FOR HDSPe MADI! */
 349
 350#define HDSPM_BufferPositionMask 0x000FFC0 /* Bit 6..15 : h/w buffer pointer */
 351                        /* since 64byte accurate, last 6 bits are not used */
 352
 353
 354
 355#define HDSPM_DoubleSpeedStatus (1<<19) /* (input) card in double speed */
 356
 357#define HDSPM_madiFreq0         (1<<22) /* system freq 0=error */
 358#define HDSPM_madiFreq1         (1<<23) /* 1=32, 2=44.1 3=48 */
 359#define HDSPM_madiFreq2         (1<<24) /* 4=64, 5=88.2 6=96 */
 360#define HDSPM_madiFreq3         (1<<25) /* 7=128, 8=176.4 9=192 */
 361
 362#define HDSPM_BufferID          (1<<26) /* (Double)Buffer ID toggles with
 363                                         * Interrupt
 364                                         */
 365#define HDSPM_tco_detect         0x08000000
 366#define HDSPM_tco_lock           0x20000000
 367
 368#define HDSPM_s2_tco_detect      0x00000040
 369#define HDSPM_s2_AEBO_D          0x00000080
 370#define HDSPM_s2_AEBI_D          0x00000100
 371
 372
 373#define HDSPM_midi0IRQPending    0x40000000
 374#define HDSPM_midi1IRQPending    0x80000000
 375#define HDSPM_midi2IRQPending    0x20000000
 376#define HDSPM_midi2IRQPendingAES 0x00000020
 377#define HDSPM_midi3IRQPending    0x00200000
 378
 379/* --- status bit helpers */
 380#define HDSPM_madiFreqMask  (HDSPM_madiFreq0|HDSPM_madiFreq1|\
 381                             HDSPM_madiFreq2|HDSPM_madiFreq3)
 382#define HDSPM_madiFreq32    (HDSPM_madiFreq0)
 383#define HDSPM_madiFreq44_1  (HDSPM_madiFreq1)
 384#define HDSPM_madiFreq48    (HDSPM_madiFreq0|HDSPM_madiFreq1)
 385#define HDSPM_madiFreq64    (HDSPM_madiFreq2)
 386#define HDSPM_madiFreq88_2  (HDSPM_madiFreq0|HDSPM_madiFreq2)
 387#define HDSPM_madiFreq96    (HDSPM_madiFreq1|HDSPM_madiFreq2)
 388#define HDSPM_madiFreq128   (HDSPM_madiFreq0|HDSPM_madiFreq1|HDSPM_madiFreq2)
 389#define HDSPM_madiFreq176_4 (HDSPM_madiFreq3)
 390#define HDSPM_madiFreq192   (HDSPM_madiFreq3|HDSPM_madiFreq0)
 391
 392/* Status2 Register bits */ /* MADI ONLY */
 393
 394#define HDSPM_version0 (1<<0)   /* not really defined but I guess */
 395#define HDSPM_version1 (1<<1)   /* in former cards it was ??? */
 396#define HDSPM_version2 (1<<2)
 397
 398#define HDSPM_wcLock (1<<3)     /* Wordclock is detected and locked */
 399#define HDSPM_wcSync (1<<4)     /* Wordclock is in sync with systemclock */
 400
 401#define HDSPM_wc_freq0 (1<<5)   /* input freq detected via autosync  */
 402#define HDSPM_wc_freq1 (1<<6)   /* 001=32, 010==44.1, 011=48, */
 403#define HDSPM_wc_freq2 (1<<7)   /* 100=64, 101=88.2, 110=96, */
 404/* missing Bit   for               111=128, 1000=176.4, 1001=192 */
 405
 406#define HDSPM_SyncRef0 0x10000  /* Sync Reference */
 407#define HDSPM_SyncRef1 0x20000
 408
 409#define HDSPM_SelSyncRef0 (1<<8)        /* AutoSync Source */
 410#define HDSPM_SelSyncRef1 (1<<9)        /* 000=word, 001=MADI, */
 411#define HDSPM_SelSyncRef2 (1<<10)       /* 111=no valid signal */
 412
 413#define HDSPM_wc_valid (HDSPM_wcLock|HDSPM_wcSync)
 414
 415#define HDSPM_wcFreqMask  (HDSPM_wc_freq0|HDSPM_wc_freq1|HDSPM_wc_freq2)
 416#define HDSPM_wcFreq32    (HDSPM_wc_freq0)
 417#define HDSPM_wcFreq44_1  (HDSPM_wc_freq1)
 418#define HDSPM_wcFreq48    (HDSPM_wc_freq0|HDSPM_wc_freq1)
 419#define HDSPM_wcFreq64    (HDSPM_wc_freq2)
 420#define HDSPM_wcFreq88_2  (HDSPM_wc_freq0|HDSPM_wc_freq2)
 421#define HDSPM_wcFreq96    (HDSPM_wc_freq1|HDSPM_wc_freq2)
 422
 423#define HDSPM_status1_F_0 0x0400000
 424#define HDSPM_status1_F_1 0x0800000
 425#define HDSPM_status1_F_2 0x1000000
 426#define HDSPM_status1_F_3 0x2000000
 427#define HDSPM_status1_freqMask (HDSPM_status1_F_0|HDSPM_status1_F_1|HDSPM_status1_F_2|HDSPM_status1_F_3)
 428
 429
 430#define HDSPM_SelSyncRefMask       (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
 431                                    HDSPM_SelSyncRef2)
 432#define HDSPM_SelSyncRef_WORD      0
 433#define HDSPM_SelSyncRef_MADI      (HDSPM_SelSyncRef0)
 434#define HDSPM_SelSyncRef_TCO       (HDSPM_SelSyncRef1)
 435#define HDSPM_SelSyncRef_SyncIn    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1)
 436#define HDSPM_SelSyncRef_NVALID    (HDSPM_SelSyncRef0|HDSPM_SelSyncRef1|\
 437                                    HDSPM_SelSyncRef2)
 438
 439/*
 440   For AES32, bits for status, status2 and timecode are different
 441*/
 442/* status */
 443#define HDSPM_AES32_wcLock      0x0200000
 444#define HDSPM_AES32_wcFreq_bit  22
 445/* (status >> HDSPM_AES32_wcFreq_bit) & 0xF gives WC frequency (cf function
 446  HDSPM_bit2freq */
 447#define HDSPM_AES32_syncref_bit  16
 448/* (status >> HDSPM_AES32_syncref_bit) & 0xF gives sync source */
 449
 450#define HDSPM_AES32_AUTOSYNC_FROM_WORD 0
 451#define HDSPM_AES32_AUTOSYNC_FROM_AES1 1
 452#define HDSPM_AES32_AUTOSYNC_FROM_AES2 2
 453#define HDSPM_AES32_AUTOSYNC_FROM_AES3 3
 454#define HDSPM_AES32_AUTOSYNC_FROM_AES4 4
 455#define HDSPM_AES32_AUTOSYNC_FROM_AES5 5
 456#define HDSPM_AES32_AUTOSYNC_FROM_AES6 6
 457#define HDSPM_AES32_AUTOSYNC_FROM_AES7 7
 458#define HDSPM_AES32_AUTOSYNC_FROM_AES8 8
 459#define HDSPM_AES32_AUTOSYNC_FROM_NONE 9
 460
 461/*  status2 */
 462/* HDSPM_LockAES_bit is given by HDSPM_LockAES >> (AES# - 1) */
 463#define HDSPM_LockAES   0x80
 464#define HDSPM_LockAES1  0x80
 465#define HDSPM_LockAES2  0x40
 466#define HDSPM_LockAES3  0x20
 467#define HDSPM_LockAES4  0x10
 468#define HDSPM_LockAES5  0x8
 469#define HDSPM_LockAES6  0x4
 470#define HDSPM_LockAES7  0x2
 471#define HDSPM_LockAES8  0x1
 472/*
 473   Timecode
 474   After windows driver sources, bits 4*i to 4*i+3 give the input frequency on
 475   AES i+1
 476 bits 3210
 477      0001  32kHz
 478      0010  44.1kHz
 479      0011  48kHz
 480      0100  64kHz
 481      0101  88.2kHz
 482      0110  96kHz
 483      0111  128kHz
 484      1000  176.4kHz
 485      1001  192kHz
 486  NB: Timecode register doesn't seem to work on AES32 card revision 230
 487*/
 488
 489/* Mixer Values */
 490#define UNITY_GAIN          32768       /* = 65536/2 */
 491#define MINUS_INFINITY_GAIN 0
 492
 493/* Number of channels for different Speed Modes */
 494#define MADI_SS_CHANNELS       64
 495#define MADI_DS_CHANNELS       32
 496#define MADI_QS_CHANNELS       16
 497
 498#define RAYDAT_SS_CHANNELS     36
 499#define RAYDAT_DS_CHANNELS     20
 500#define RAYDAT_QS_CHANNELS     12
 501
 502#define AIO_IN_SS_CHANNELS        14
 503#define AIO_IN_DS_CHANNELS        10
 504#define AIO_IN_QS_CHANNELS        8
 505#define AIO_OUT_SS_CHANNELS        16
 506#define AIO_OUT_DS_CHANNELS        12
 507#define AIO_OUT_QS_CHANNELS        10
 508
 509#define AES32_CHANNELS          16
 510
 511/* the size of a substream (1 mono data stream) */
 512#define HDSPM_CHANNEL_BUFFER_SAMPLES  (16*1024)
 513#define HDSPM_CHANNEL_BUFFER_BYTES    (4*HDSPM_CHANNEL_BUFFER_SAMPLES)
 514
 515/* the size of the area we need to allocate for DMA transfers. the
 516   size is the same regardless of the number of channels, and
 517   also the latency to use.
 518   for one direction !!!
 519*/
 520#define HDSPM_DMA_AREA_BYTES (HDSPM_MAX_CHANNELS * HDSPM_CHANNEL_BUFFER_BYTES)
 521#define HDSPM_DMA_AREA_KILOBYTES (HDSPM_DMA_AREA_BYTES/1024)
 522
 523#define HDSPM_RAYDAT_REV        211
 524#define HDSPM_AIO_REV           212
 525#define HDSPM_MADIFACE_REV      213
 526
 527/* speed factor modes */
 528#define HDSPM_SPEED_SINGLE 0
 529#define HDSPM_SPEED_DOUBLE 1
 530#define HDSPM_SPEED_QUAD   2
 531
 532/* names for speed modes */
 533static char *hdspm_speed_names[] = { "single", "double", "quad" };
 534
 535static char *texts_autosync_aes_tco[] = { "Word Clock",
 536                                          "AES1", "AES2", "AES3", "AES4",
 537                                          "AES5", "AES6", "AES7", "AES8",
 538                                          "TCO" };
 539static char *texts_autosync_aes[] = { "Word Clock",
 540                                      "AES1", "AES2", "AES3", "AES4",
 541                                      "AES5", "AES6", "AES7", "AES8" };
 542static char *texts_autosync_madi_tco[] = { "Word Clock",
 543                                           "MADI", "TCO", "Sync In" };
 544static char *texts_autosync_madi[] = { "Word Clock",
 545                                       "MADI", "Sync In" };
 546
 547static char *texts_autosync_raydat_tco[] = {
 548        "Word Clock",
 549        "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
 550        "AES", "SPDIF", "TCO", "Sync In"
 551};
 552static char *texts_autosync_raydat[] = {
 553        "Word Clock",
 554        "ADAT 1", "ADAT 2", "ADAT 3", "ADAT 4",
 555        "AES", "SPDIF", "Sync In"
 556};
 557static char *texts_autosync_aio_tco[] = {
 558        "Word Clock",
 559        "ADAT", "AES", "SPDIF", "TCO", "Sync In"
 560};
 561static char *texts_autosync_aio[] = { "Word Clock",
 562                                      "ADAT", "AES", "SPDIF", "Sync In" };
 563
 564static char *texts_freq[] = {
 565        "No Lock",
 566        "32 kHz",
 567        "44.1 kHz",
 568        "48 kHz",
 569        "64 kHz",
 570        "88.2 kHz",
 571        "96 kHz",
 572        "128 kHz",
 573        "176.4 kHz",
 574        "192 kHz"
 575};
 576
 577static char *texts_ports_madi[] = {
 578        "MADI.1", "MADI.2", "MADI.3", "MADI.4", "MADI.5", "MADI.6",
 579        "MADI.7", "MADI.8", "MADI.9", "MADI.10", "MADI.11", "MADI.12",
 580        "MADI.13", "MADI.14", "MADI.15", "MADI.16", "MADI.17", "MADI.18",
 581        "MADI.19", "MADI.20", "MADI.21", "MADI.22", "MADI.23", "MADI.24",
 582        "MADI.25", "MADI.26", "MADI.27", "MADI.28", "MADI.29", "MADI.30",
 583        "MADI.31", "MADI.32", "MADI.33", "MADI.34", "MADI.35", "MADI.36",
 584        "MADI.37", "MADI.38", "MADI.39", "MADI.40", "MADI.41", "MADI.42",
 585        "MADI.43", "MADI.44", "MADI.45", "MADI.46", "MADI.47", "MADI.48",
 586        "MADI.49", "MADI.50", "MADI.51", "MADI.52", "MADI.53", "MADI.54",
 587        "MADI.55", "MADI.56", "MADI.57", "MADI.58", "MADI.59", "MADI.60",
 588        "MADI.61", "MADI.62", "MADI.63", "MADI.64",
 589};
 590
 591
 592static char *texts_ports_raydat_ss[] = {
 593        "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4", "ADAT1.5", "ADAT1.6",
 594        "ADAT1.7", "ADAT1.8", "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
 595        "ADAT2.5", "ADAT2.6", "ADAT2.7", "ADAT2.8", "ADAT3.1", "ADAT3.2",
 596        "ADAT3.3", "ADAT3.4", "ADAT3.5", "ADAT3.6", "ADAT3.7", "ADAT3.8",
 597        "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4", "ADAT4.5", "ADAT4.6",
 598        "ADAT4.7", "ADAT4.8",
 599        "AES.L", "AES.R",
 600        "SPDIF.L", "SPDIF.R"
 601};
 602
 603static char *texts_ports_raydat_ds[] = {
 604        "ADAT1.1", "ADAT1.2", "ADAT1.3", "ADAT1.4",
 605        "ADAT2.1", "ADAT2.2", "ADAT2.3", "ADAT2.4",
 606        "ADAT3.1", "ADAT3.2", "ADAT3.3", "ADAT3.4",
 607        "ADAT4.1", "ADAT4.2", "ADAT4.3", "ADAT4.4",
 608        "AES.L", "AES.R",
 609        "SPDIF.L", "SPDIF.R"
 610};
 611
 612static char *texts_ports_raydat_qs[] = {
 613        "ADAT1.1", "ADAT1.2",
 614        "ADAT2.1", "ADAT2.2",
 615        "ADAT3.1", "ADAT3.2",
 616        "ADAT4.1", "ADAT4.2",
 617        "AES.L", "AES.R",
 618        "SPDIF.L", "SPDIF.R"
 619};
 620
 621
 622static char *texts_ports_aio_in_ss[] = {
 623        "Analogue.L", "Analogue.R",
 624        "AES.L", "AES.R",
 625        "SPDIF.L", "SPDIF.R",
 626        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
 627        "ADAT.7", "ADAT.8"
 628};
 629
 630static char *texts_ports_aio_out_ss[] = {
 631        "Analogue.L", "Analogue.R",
 632        "AES.L", "AES.R",
 633        "SPDIF.L", "SPDIF.R",
 634        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4", "ADAT.5", "ADAT.6",
 635        "ADAT.7", "ADAT.8",
 636        "Phone.L", "Phone.R"
 637};
 638
 639static char *texts_ports_aio_in_ds[] = {
 640        "Analogue.L", "Analogue.R",
 641        "AES.L", "AES.R",
 642        "SPDIF.L", "SPDIF.R",
 643        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4"
 644};
 645
 646static char *texts_ports_aio_out_ds[] = {
 647        "Analogue.L", "Analogue.R",
 648        "AES.L", "AES.R",
 649        "SPDIF.L", "SPDIF.R",
 650        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
 651        "Phone.L", "Phone.R"
 652};
 653
 654static char *texts_ports_aio_in_qs[] = {
 655        "Analogue.L", "Analogue.R",
 656        "AES.L", "AES.R",
 657        "SPDIF.L", "SPDIF.R",
 658        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4"
 659};
 660
 661static char *texts_ports_aio_out_qs[] = {
 662        "Analogue.L", "Analogue.R",
 663        "AES.L", "AES.R",
 664        "SPDIF.L", "SPDIF.R",
 665        "ADAT.1", "ADAT.2", "ADAT.3", "ADAT.4",
 666        "Phone.L", "Phone.R"
 667};
 668
 669static char *texts_ports_aes32[] = {
 670        "AES.1", "AES.2", "AES.3", "AES.4", "AES.5", "AES.6", "AES.7",
 671        "AES.8", "AES.9.", "AES.10", "AES.11", "AES.12", "AES.13", "AES.14",
 672        "AES.15", "AES.16"
 673};
 674
 675/* These tables map the ALSA channels 1..N to the channels that we
 676   need to use in order to find the relevant channel buffer. RME
 677   refers to this kind of mapping as between "the ADAT channel and
 678   the DMA channel." We index it using the logical audio channel,
 679   and the value is the DMA channel (i.e. channel buffer number)
 680   where the data for that channel can be read/written from/to.
 681*/
 682
 683static char channel_map_unity_ss[HDSPM_MAX_CHANNELS] = {
 684        0, 1, 2, 3, 4, 5, 6, 7,
 685        8, 9, 10, 11, 12, 13, 14, 15,
 686        16, 17, 18, 19, 20, 21, 22, 23,
 687        24, 25, 26, 27, 28, 29, 30, 31,
 688        32, 33, 34, 35, 36, 37, 38, 39,
 689        40, 41, 42, 43, 44, 45, 46, 47,
 690        48, 49, 50, 51, 52, 53, 54, 55,
 691        56, 57, 58, 59, 60, 61, 62, 63
 692};
 693
 694static char channel_map_raydat_ss[HDSPM_MAX_CHANNELS] = {
 695        4, 5, 6, 7, 8, 9, 10, 11,       /* ADAT 1 */
 696        12, 13, 14, 15, 16, 17, 18, 19, /* ADAT 2 */
 697        20, 21, 22, 23, 24, 25, 26, 27, /* ADAT 3 */
 698        28, 29, 30, 31, 32, 33, 34, 35, /* ADAT 4 */
 699        0, 1,                   /* AES */
 700        2, 3,                   /* SPDIF */
 701        -1, -1, -1, -1,
 702        -1, -1, -1, -1, -1, -1, -1, -1,
 703        -1, -1, -1, -1, -1, -1, -1, -1,
 704        -1, -1, -1, -1, -1, -1, -1, -1,
 705};
 706
 707static char channel_map_raydat_ds[HDSPM_MAX_CHANNELS] = {
 708        4, 5, 6, 7,             /* ADAT 1 */
 709        8, 9, 10, 11,           /* ADAT 2 */
 710        12, 13, 14, 15,         /* ADAT 3 */
 711        16, 17, 18, 19,         /* ADAT 4 */
 712        0, 1,                   /* AES */
 713        2, 3,                   /* SPDIF */
 714        -1, -1, -1, -1,
 715        -1, -1, -1, -1, -1, -1, -1, -1,
 716        -1, -1, -1, -1, -1, -1, -1, -1,
 717        -1, -1, -1, -1, -1, -1, -1, -1,
 718        -1, -1, -1, -1, -1, -1, -1, -1,
 719        -1, -1, -1, -1, -1, -1, -1, -1,
 720};
 721
 722static char channel_map_raydat_qs[HDSPM_MAX_CHANNELS] = {
 723        4, 5,                   /* ADAT 1 */
 724        6, 7,                   /* ADAT 2 */
 725        8, 9,                   /* ADAT 3 */
 726        10, 11,                 /* ADAT 4 */
 727        0, 1,                   /* AES */
 728        2, 3,                   /* SPDIF */
 729        -1, -1, -1, -1,
 730        -1, -1, -1, -1, -1, -1, -1, -1,
 731        -1, -1, -1, -1, -1, -1, -1, -1,
 732        -1, -1, -1, -1, -1, -1, -1, -1,
 733        -1, -1, -1, -1, -1, -1, -1, -1,
 734        -1, -1, -1, -1, -1, -1, -1, -1,
 735        -1, -1, -1, -1, -1, -1, -1, -1,
 736};
 737
 738static char channel_map_aio_in_ss[HDSPM_MAX_CHANNELS] = {
 739        0, 1,                   /* line in */
 740        8, 9,                   /* aes in, */
 741        10, 11,                 /* spdif in */
 742        12, 13, 14, 15, 16, 17, 18, 19, /* ADAT in */
 743        -1, -1,
 744        -1, -1, -1, -1, -1, -1, -1, -1,
 745        -1, -1, -1, -1, -1, -1, -1, -1,
 746        -1, -1, -1, -1, -1, -1, -1, -1,
 747        -1, -1, -1, -1, -1, -1, -1, -1,
 748        -1, -1, -1, -1, -1, -1, -1, -1,
 749        -1, -1, -1, -1, -1, -1, -1, -1,
 750};
 751
 752static char channel_map_aio_out_ss[HDSPM_MAX_CHANNELS] = {
 753        0, 1,                   /* line out */
 754        8, 9,                   /* aes out */
 755        10, 11,                 /* spdif out */
 756        12, 13, 14, 15, 16, 17, 18, 19, /* ADAT out */
 757        6, 7,                   /* phone out */
 758        -1, -1, -1, -1, -1, -1, -1, -1,
 759        -1, -1, -1, -1, -1, -1, -1, -1,
 760        -1, -1, -1, -1, -1, -1, -1, -1,
 761        -1, -1, -1, -1, -1, -1, -1, -1,
 762        -1, -1, -1, -1, -1, -1, -1, -1,
 763        -1, -1, -1, -1, -1, -1, -1, -1,
 764};
 765
 766static char channel_map_aio_in_ds[HDSPM_MAX_CHANNELS] = {
 767        0, 1,                   /* line in */
 768        8, 9,                   /* aes in */
 769        10, 11,                 /* spdif in */
 770        12, 14, 16, 18,         /* adat in */
 771        -1, -1, -1, -1, -1, -1,
 772        -1, -1, -1, -1, -1, -1, -1, -1,
 773        -1, -1, -1, -1, -1, -1, -1, -1,
 774        -1, -1, -1, -1, -1, -1, -1, -1,
 775        -1, -1, -1, -1, -1, -1, -1, -1,
 776        -1, -1, -1, -1, -1, -1, -1, -1,
 777        -1, -1, -1, -1, -1, -1, -1, -1
 778};
 779
 780static char channel_map_aio_out_ds[HDSPM_MAX_CHANNELS] = {
 781        0, 1,                   /* line out */
 782        8, 9,                   /* aes out */
 783        10, 11,                 /* spdif out */
 784        12, 14, 16, 18,         /* adat out */
 785        6, 7,                   /* phone out */
 786        -1, -1, -1, -1,
 787        -1, -1, -1, -1, -1, -1, -1, -1,
 788        -1, -1, -1, -1, -1, -1, -1, -1,
 789        -1, -1, -1, -1, -1, -1, -1, -1,
 790        -1, -1, -1, -1, -1, -1, -1, -1,
 791        -1, -1, -1, -1, -1, -1, -1, -1,
 792        -1, -1, -1, -1, -1, -1, -1, -1
 793};
 794
 795static char channel_map_aio_in_qs[HDSPM_MAX_CHANNELS] = {
 796        0, 1,                   /* line in */
 797        8, 9,                   /* aes in */
 798        10, 11,                 /* spdif in */
 799        12, 16,                 /* adat in */
 800        -1, -1, -1, -1, -1, -1, -1, -1,
 801        -1, -1, -1, -1, -1, -1, -1, -1,
 802        -1, -1, -1, -1, -1, -1, -1, -1,
 803        -1, -1, -1, -1, -1, -1, -1, -1,
 804        -1, -1, -1, -1, -1, -1, -1, -1,
 805        -1, -1, -1, -1, -1, -1, -1, -1,
 806        -1, -1, -1, -1, -1, -1, -1, -1
 807};
 808
 809static char channel_map_aio_out_qs[HDSPM_MAX_CHANNELS] = {
 810        0, 1,                   /* line out */
 811        8, 9,                   /* aes out */
 812        10, 11,                 /* spdif out */
 813        12, 16,                 /* adat out */
 814        6, 7,                   /* phone out */
 815        -1, -1, -1, -1, -1, -1,
 816        -1, -1, -1, -1, -1, -1, -1, -1,
 817        -1, -1, -1, -1, -1, -1, -1, -1,
 818        -1, -1, -1, -1, -1, -1, -1, -1,
 819        -1, -1, -1, -1, -1, -1, -1, -1,
 820        -1, -1, -1, -1, -1, -1, -1, -1,
 821        -1, -1, -1, -1, -1, -1, -1, -1
 822};
 823
 824static char channel_map_aes32[HDSPM_MAX_CHANNELS] = {
 825        0, 1, 2, 3, 4, 5, 6, 7,
 826        8, 9, 10, 11, 12, 13, 14, 15,
 827        -1, -1, -1, -1, -1, -1, -1, -1,
 828        -1, -1, -1, -1, -1, -1, -1, -1,
 829        -1, -1, -1, -1, -1, -1, -1, -1,
 830        -1, -1, -1, -1, -1, -1, -1, -1,
 831        -1, -1, -1, -1, -1, -1, -1, -1,
 832        -1, -1, -1, -1, -1, -1, -1, -1
 833};
 834
 835struct hdspm_midi {
 836        struct hdspm *hdspm;
 837        int id;
 838        struct snd_rawmidi *rmidi;
 839        struct snd_rawmidi_substream *input;
 840        struct snd_rawmidi_substream *output;
 841        char istimer;           /* timer in use */
 842        struct timer_list timer;
 843        spinlock_t lock;
 844        int pending;
 845        int dataIn;
 846        int statusIn;
 847        int dataOut;
 848        int statusOut;
 849        int ie;
 850        int irq;
 851};
 852
 853struct hdspm_tco {
 854        int input;
 855        int framerate;
 856        int wordclock;
 857        int samplerate;
 858        int pull;
 859        int term; /* 0 = off, 1 = on */
 860};
 861
 862struct hdspm {
 863        spinlock_t lock;
 864        /* only one playback and/or capture stream */
 865        struct snd_pcm_substream *capture_substream;
 866        struct snd_pcm_substream *playback_substream;
 867
 868        char *card_name;             /* for procinfo */
 869        unsigned short firmware_rev; /* dont know if relevant (yes if AES32)*/
 870
 871        uint8_t io_type;
 872
 873        int monitor_outs;       /* set up monitoring outs init flag */
 874
 875        u32 control_register;   /* cached value */
 876        u32 control2_register;  /* cached value */
 877        u32 settings_register;
 878
 879        struct hdspm_midi midi[4];
 880        struct tasklet_struct midi_tasklet;
 881
 882        size_t period_bytes;
 883        unsigned char ss_in_channels;
 884        unsigned char ds_in_channels;
 885        unsigned char qs_in_channels;
 886        unsigned char ss_out_channels;
 887        unsigned char ds_out_channels;
 888        unsigned char qs_out_channels;
 889
 890        unsigned char max_channels_in;
 891        unsigned char max_channels_out;
 892
 893        signed char *channel_map_in;
 894        signed char *channel_map_out;
 895
 896        signed char *channel_map_in_ss, *channel_map_in_ds, *channel_map_in_qs;
 897        signed char *channel_map_out_ss, *channel_map_out_ds, *channel_map_out_qs;
 898
 899        char **port_names_in;
 900        char **port_names_out;
 901
 902        char **port_names_in_ss, **port_names_in_ds, **port_names_in_qs;
 903        char **port_names_out_ss, **port_names_out_ds, **port_names_out_qs;
 904
 905        unsigned char *playback_buffer; /* suitably aligned address */
 906        unsigned char *capture_buffer;  /* suitably aligned address */
 907
 908        pid_t capture_pid;      /* process id which uses capture */
 909        pid_t playback_pid;     /* process id which uses capture */
 910        int running;            /* running status */
 911
 912        int last_external_sample_rate;  /* samplerate mystic ... */
 913        int last_internal_sample_rate;
 914        int system_sample_rate;
 915
 916        int dev;                /* Hardware vars... */
 917        int irq;
 918        unsigned long port;
 919        void __iomem *iobase;
 920
 921        int irq_count;          /* for debug */
 922        int midiPorts;
 923
 924        struct snd_card *card;  /* one card */
 925        struct snd_pcm *pcm;            /* has one pcm */
 926        struct snd_hwdep *hwdep;        /* and a hwdep for additional ioctl */
 927        struct pci_dev *pci;    /* and an pci info */
 928
 929        /* Mixer vars */
 930        /* fast alsa mixer */
 931        struct snd_kcontrol *playback_mixer_ctls[HDSPM_MAX_CHANNELS];
 932        /* but input to much, so not used */
 933        struct snd_kcontrol *input_mixer_ctls[HDSPM_MAX_CHANNELS];
 934        /* full mixer accessible over mixer ioctl or hwdep-device */
 935        struct hdspm_mixer *mixer;
 936
 937        struct hdspm_tco *tco;  /* NULL if no TCO detected */
 938
 939        char **texts_autosync;
 940        int texts_autosync_items;
 941
 942        cycles_t last_interrupt;
 943
 944        unsigned int serial;
 945
 946        struct hdspm_peak_rms peak_rms;
 947};
 948
 949
 950static DEFINE_PCI_DEVICE_TABLE(snd_hdspm_ids) = {
 951        {
 952         .vendor = PCI_VENDOR_ID_XILINX,
 953         .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
 954         .subvendor = PCI_ANY_ID,
 955         .subdevice = PCI_ANY_ID,
 956         .class = 0,
 957         .class_mask = 0,
 958         .driver_data = 0},
 959        {0,}
 960};
 961
 962MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
 963
 964/* prototypes */
 965static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
 966                                                   struct hdspm * hdspm);
 967static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
 968                                          struct hdspm * hdspm);
 969
 970static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
 971static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
 972static int hdspm_autosync_ref(struct hdspm *hdspm);
 973static int snd_hdspm_set_defaults(struct hdspm *hdspm);
 974static void hdspm_set_sgbuf(struct hdspm *hdspm,
 975                            struct snd_pcm_substream *substream,
 976                             unsigned int reg, int channels);
 977
 978static inline int HDSPM_bit2freq(int n)
 979{
 980        static const int bit2freq_tab[] = {
 981                0, 32000, 44100, 48000, 64000, 88200,
 982                96000, 128000, 176400, 192000 };
 983        if (n < 1 || n > 9)
 984                return 0;
 985        return bit2freq_tab[n];
 986}
 987
 988/* Write/read to/from HDSPM with Adresses in Bytes
 989   not words but only 32Bit writes are allowed */
 990
 991static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
 992                               unsigned int val)
 993{
 994        writel(val, hdspm->iobase + reg);
 995}
 996
 997static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
 998{
 999        return readl(hdspm->iobase + reg);
1000}
1001
1002/* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1003   mixer is write only on hardware so we have to cache him for read
1004   each fader is a u32, but uses only the first 16 bit */
1005
1006static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1007                                     unsigned int in)
1008{
1009        if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1010                return 0;
1011
1012        return hdspm->mixer->ch[chan].in[in];
1013}
1014
1015static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1016                                     unsigned int pb)
1017{
1018        if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1019                return 0;
1020        return hdspm->mixer->ch[chan].pb[pb];
1021}
1022
1023static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1024                                      unsigned int in, unsigned short data)
1025{
1026        if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1027                return -1;
1028
1029        hdspm_write(hdspm,
1030                    HDSPM_MADI_mixerBase +
1031                    ((in + 128 * chan) * sizeof(u32)),
1032                    (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1033        return 0;
1034}
1035
1036static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1037                                      unsigned int pb, unsigned short data)
1038{
1039        if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1040                return -1;
1041
1042        hdspm_write(hdspm,
1043                    HDSPM_MADI_mixerBase +
1044                    ((64 + pb + 128 * chan) * sizeof(u32)),
1045                    (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1046        return 0;
1047}
1048
1049
1050/* enable DMA for specific channels, now available for DSP-MADI */
1051static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1052{
1053        hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1054}
1055
1056static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1057{
1058        hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1059}
1060
1061/* check if same process is writing and reading */
1062static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1063{
1064        unsigned long flags;
1065        int ret = 1;
1066
1067        spin_lock_irqsave(&hdspm->lock, flags);
1068        if ((hdspm->playback_pid != hdspm->capture_pid) &&
1069            (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1070                ret = 0;
1071        }
1072        spin_unlock_irqrestore(&hdspm->lock, flags);
1073        return ret;
1074}
1075
1076/* check for external sample rate */
1077static int hdspm_external_sample_rate(struct hdspm *hdspm)
1078{
1079        unsigned int status, status2, timecode;
1080        int syncref, rate = 0, rate_bits;
1081
1082        switch (hdspm->io_type) {
1083        case AES32:
1084                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1085                status = hdspm_read(hdspm, HDSPM_statusRegister);
1086                timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
1087
1088                syncref = hdspm_autosync_ref(hdspm);
1089
1090                if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
1091                                status & HDSPM_AES32_wcLock)
1092                        return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF);
1093
1094                if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
1095                                syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
1096                                status2 & (HDSPM_LockAES >>
1097                                (syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)))
1098                        return HDSPM_bit2freq((timecode >> (4*(syncref-HDSPM_AES32_AUTOSYNC_FROM_AES1))) & 0xF);
1099                return 0;
1100                break;
1101
1102        case MADIface:
1103                status = hdspm_read(hdspm, HDSPM_statusRegister);
1104
1105                if (!(status & HDSPM_madiLock)) {
1106                        rate = 0;  /* no lock */
1107                } else {
1108                        switch (status & (HDSPM_status1_freqMask)) {
1109                        case HDSPM_status1_F_0*1:
1110                                rate = 32000; break;
1111                        case HDSPM_status1_F_0*2:
1112                                rate = 44100; break;
1113                        case HDSPM_status1_F_0*3:
1114                                rate = 48000; break;
1115                        case HDSPM_status1_F_0*4:
1116                                rate = 64000; break;
1117                        case HDSPM_status1_F_0*5:
1118                                rate = 88200; break;
1119                        case HDSPM_status1_F_0*6:
1120                                rate = 96000; break;
1121                        case HDSPM_status1_F_0*7:
1122                                rate = 128000; break;
1123                        case HDSPM_status1_F_0*8:
1124                                rate = 176400; break;
1125                        case HDSPM_status1_F_0*9:
1126                                rate = 192000; break;
1127                        default:
1128                                rate = 0; break;
1129                        }
1130                }
1131
1132                break;
1133
1134        case MADI:
1135        case AIO:
1136        case RayDAT:
1137                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1138                status = hdspm_read(hdspm, HDSPM_statusRegister);
1139                rate = 0;
1140
1141                /* if wordclock has synced freq and wordclock is valid */
1142                if ((status2 & HDSPM_wcLock) != 0 &&
1143                                (status2 & HDSPM_SelSyncRef0) == 0) {
1144
1145                        rate_bits = status2 & HDSPM_wcFreqMask;
1146
1147
1148                        switch (rate_bits) {
1149                        case HDSPM_wcFreq32:
1150                                rate = 32000;
1151                                break;
1152                        case HDSPM_wcFreq44_1:
1153                                rate = 44100;
1154                                break;
1155                        case HDSPM_wcFreq48:
1156                                rate = 48000;
1157                                break;
1158                        case HDSPM_wcFreq64:
1159                                rate = 64000;
1160                                break;
1161                        case HDSPM_wcFreq88_2:
1162                                rate = 88200;
1163                                break;
1164                        case HDSPM_wcFreq96:
1165                                rate = 96000;
1166                                break;
1167                        default:
1168                                rate = 0;
1169                                break;
1170                        }
1171                }
1172
1173                /* if rate detected and Syncref is Word than have it,
1174                 * word has priority to MADI
1175                 */
1176                if (rate != 0 &&
1177                (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1178                        return rate;
1179
1180                /* maybe a madi input (which is taken if sel sync is madi) */
1181                if (status & HDSPM_madiLock) {
1182                        rate_bits = status & HDSPM_madiFreqMask;
1183
1184                        switch (rate_bits) {
1185                        case HDSPM_madiFreq32:
1186                                rate = 32000;
1187                                break;
1188                        case HDSPM_madiFreq44_1:
1189                                rate = 44100;
1190                                break;
1191                        case HDSPM_madiFreq48:
1192                                rate = 48000;
1193                                break;
1194                        case HDSPM_madiFreq64:
1195                                rate = 64000;
1196                                break;
1197                        case HDSPM_madiFreq88_2:
1198                                rate = 88200;
1199                                break;
1200                        case HDSPM_madiFreq96:
1201                                rate = 96000;
1202                                break;
1203                        case HDSPM_madiFreq128:
1204                                rate = 128000;
1205                                break;
1206                        case HDSPM_madiFreq176_4:
1207                                rate = 176400;
1208                                break;
1209                        case HDSPM_madiFreq192:
1210                                rate = 192000;
1211                                break;
1212                        default:
1213                                rate = 0;
1214                                break;
1215                        }
1216
1217                        /* QS and DS rates normally can not be detected
1218                         * automatically by the card. Only exception is MADI
1219                         * in 96k frame mode.
1220                         *
1221                         * So if we read SS values (32 .. 48k), check for
1222                         * user-provided DS/QS bits in the control register
1223                         * and multiply the base frequency accordingly.
1224                         */
1225                        if (rate <= 48000) {
1226                                if (hdspm->control_register & HDSPM_QuadSpeed)
1227                                        rate *= 4;
1228                                else if (hdspm->control_register &
1229                                                HDSPM_DoubleSpeed)
1230                                        rate *= 2;
1231                        }
1232                }
1233                break;
1234        }
1235
1236        return rate;
1237}
1238
1239/* return latency in samples per period */
1240static int hdspm_get_latency(struct hdspm *hdspm)
1241{
1242        int n;
1243
1244        n = hdspm_decode_latency(hdspm->control_register);
1245
1246        /* Special case for new RME cards with 32 samples period size.
1247         * The three latency bits in the control register
1248         * (HDSP_LatencyMask) encode latency values of 64 samples as
1249         * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1250         * denotes 8192 samples, but on new cards like RayDAT or AIO,
1251         * it corresponds to 32 samples.
1252         */
1253        if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1254                n = -1;
1255
1256        return 1 << (n + 6);
1257}
1258
1259/* Latency function */
1260static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1261{
1262        hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1263}
1264
1265
1266static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1267{
1268        int position;
1269
1270        position = hdspm_read(hdspm, HDSPM_statusRegister);
1271
1272        switch (hdspm->io_type) {
1273        case RayDAT:
1274        case AIO:
1275                position &= HDSPM_BufferPositionMask;
1276                position /= 4; /* Bytes per sample */
1277                break;
1278        default:
1279                position = (position & HDSPM_BufferID) ?
1280                        (hdspm->period_bytes / 4) : 0;
1281        }
1282
1283        return position;
1284}
1285
1286
1287static inline void hdspm_start_audio(struct hdspm * s)
1288{
1289        s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1290        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1291}
1292
1293static inline void hdspm_stop_audio(struct hdspm * s)
1294{
1295        s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1296        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1297}
1298
1299/* should I silence all or only opened ones ? doit all for first even is 4MB*/
1300static void hdspm_silence_playback(struct hdspm *hdspm)
1301{
1302        int i;
1303        int n = hdspm->period_bytes;
1304        void *buf = hdspm->playback_buffer;
1305
1306        if (buf == NULL)
1307                return;
1308
1309        for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1310                memset(buf, 0, n);
1311                buf += HDSPM_CHANNEL_BUFFER_BYTES;
1312        }
1313}
1314
1315static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1316{
1317        int n;
1318
1319        spin_lock_irq(&s->lock);
1320
1321        if (32 == frames) {
1322                /* Special case for new RME cards like RayDAT/AIO which
1323                 * support period sizes of 32 samples. Since latency is
1324                 * encoded in the three bits of HDSP_LatencyMask, we can only
1325                 * have values from 0 .. 7. While 0 still means 64 samples and
1326                 * 6 represents 4096 samples on all cards, 7 represents 8192
1327                 * on older cards and 32 samples on new cards.
1328                 *
1329                 * In other words, period size in samples is calculated by
1330                 * 2^(n+6) with n ranging from 0 .. 7.
1331                 */
1332                n = 7;
1333        } else {
1334                frames >>= 7;
1335                n = 0;
1336                while (frames) {
1337                        n++;
1338                        frames >>= 1;
1339                }
1340        }
1341
1342        s->control_register &= ~HDSPM_LatencyMask;
1343        s->control_register |= hdspm_encode_latency(n);
1344
1345        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1346
1347        hdspm_compute_period_size(s);
1348
1349        spin_unlock_irq(&s->lock);
1350
1351        return 0;
1352}
1353
1354static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1355{
1356        u64 freq_const;
1357
1358        if (period == 0)
1359                return 0;
1360
1361        switch (hdspm->io_type) {
1362        case MADI:
1363        case AES32:
1364                freq_const = 110069313433624ULL;
1365                break;
1366        case RayDAT:
1367        case AIO:
1368                freq_const = 104857600000000ULL;
1369                break;
1370        case MADIface:
1371                freq_const = 131072000000000ULL;
1372                break;
1373        default:
1374                snd_BUG();
1375                return 0;
1376        }
1377
1378        return div_u64(freq_const, period);
1379}
1380
1381
1382static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1383{
1384        u64 n;
1385
1386        if (rate >= 112000)
1387                rate /= 4;
1388        else if (rate >= 56000)
1389                rate /= 2;
1390
1391        switch (hdspm->io_type) {
1392        case MADIface:
1393                n = 131072000000000ULL;  /* 125 MHz */
1394                break;
1395        case MADI:
1396        case AES32:
1397                n = 110069313433624ULL;  /* 105 MHz */
1398                break;
1399        case RayDAT:
1400        case AIO:
1401                n = 104857600000000ULL;  /* 100 MHz */
1402                break;
1403        default:
1404                snd_BUG();
1405                return;
1406        }
1407
1408        n = div_u64(n, rate);
1409        /* n should be less than 2^32 for being written to FREQ register */
1410        snd_BUG_ON(n >> 32);
1411        hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1412}
1413
1414/* dummy set rate lets see what happens */
1415static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1416{
1417        int current_rate;
1418        int rate_bits;
1419        int not_set = 0;
1420        int current_speed, target_speed;
1421
1422        /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1423           it (e.g. during module initialization).
1424         */
1425
1426        if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1427
1428                /* SLAVE --- */
1429                if (called_internally) {
1430
1431                        /* request from ctl or card initialization
1432                           just make a warning an remember setting
1433                           for future master mode switching */
1434
1435                        snd_printk(KERN_WARNING "HDSPM: "
1436                                   "Warning: device is not running "
1437                                   "as a clock master.\n");
1438                        not_set = 1;
1439                } else {
1440
1441                        /* hw_param request while in AutoSync mode */
1442                        int external_freq =
1443                            hdspm_external_sample_rate(hdspm);
1444
1445                        if (hdspm_autosync_ref(hdspm) ==
1446                            HDSPM_AUTOSYNC_FROM_NONE) {
1447
1448                                snd_printk(KERN_WARNING "HDSPM: "
1449                                           "Detected no Externel Sync \n");
1450                                not_set = 1;
1451
1452                        } else if (rate != external_freq) {
1453
1454                                snd_printk(KERN_WARNING "HDSPM: "
1455                                           "Warning: No AutoSync source for "
1456                                           "requested rate\n");
1457                                not_set = 1;
1458                        }
1459                }
1460        }
1461
1462        current_rate = hdspm->system_sample_rate;
1463
1464        /* Changing between Singe, Double and Quad speed is not
1465           allowed if any substreams are open. This is because such a change
1466           causes a shift in the location of the DMA buffers and a reduction
1467           in the number of available buffers.
1468
1469           Note that a similar but essentially insoluble problem exists for
1470           externally-driven rate changes. All we can do is to flag rate
1471           changes in the read/write routines.
1472         */
1473
1474        if (current_rate <= 48000)
1475                current_speed = HDSPM_SPEED_SINGLE;
1476        else if (current_rate <= 96000)
1477                current_speed = HDSPM_SPEED_DOUBLE;
1478        else
1479                current_speed = HDSPM_SPEED_QUAD;
1480
1481        if (rate <= 48000)
1482                target_speed = HDSPM_SPEED_SINGLE;
1483        else if (rate <= 96000)
1484                target_speed = HDSPM_SPEED_DOUBLE;
1485        else
1486                target_speed = HDSPM_SPEED_QUAD;
1487
1488        switch (rate) {
1489        case 32000:
1490                rate_bits = HDSPM_Frequency32KHz;
1491                break;
1492        case 44100:
1493                rate_bits = HDSPM_Frequency44_1KHz;
1494                break;
1495        case 48000:
1496                rate_bits = HDSPM_Frequency48KHz;
1497                break;
1498        case 64000:
1499                rate_bits = HDSPM_Frequency64KHz;
1500                break;
1501        case 88200:
1502                rate_bits = HDSPM_Frequency88_2KHz;
1503                break;
1504        case 96000:
1505                rate_bits = HDSPM_Frequency96KHz;
1506                break;
1507        case 128000:
1508                rate_bits = HDSPM_Frequency128KHz;
1509                break;
1510        case 176400:
1511                rate_bits = HDSPM_Frequency176_4KHz;
1512                break;
1513        case 192000:
1514                rate_bits = HDSPM_Frequency192KHz;
1515                break;
1516        default:
1517                return -EINVAL;
1518        }
1519
1520        if (current_speed != target_speed
1521            && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1522                snd_printk
1523                    (KERN_ERR "HDSPM: "
1524                     "cannot change from %s speed to %s speed mode "
1525                     "(capture PID = %d, playback PID = %d)\n",
1526                     hdspm_speed_names[current_speed],
1527                     hdspm_speed_names[target_speed],
1528                     hdspm->capture_pid, hdspm->playback_pid);
1529                return -EBUSY;
1530        }
1531
1532        hdspm->control_register &= ~HDSPM_FrequencyMask;
1533        hdspm->control_register |= rate_bits;
1534        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1535
1536        /* For AES32, need to set DDS value in FREQ register
1537           For MADI, also apparently */
1538        hdspm_set_dds_value(hdspm, rate);
1539
1540        if (AES32 == hdspm->io_type && rate != current_rate)
1541                hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1542
1543        hdspm->system_sample_rate = rate;
1544
1545        if (rate <= 48000) {
1546                hdspm->channel_map_in = hdspm->channel_map_in_ss;
1547                hdspm->channel_map_out = hdspm->channel_map_out_ss;
1548                hdspm->max_channels_in = hdspm->ss_in_channels;
1549                hdspm->max_channels_out = hdspm->ss_out_channels;
1550                hdspm->port_names_in = hdspm->port_names_in_ss;
1551                hdspm->port_names_out = hdspm->port_names_out_ss;
1552        } else if (rate <= 96000) {
1553                hdspm->channel_map_in = hdspm->channel_map_in_ds;
1554                hdspm->channel_map_out = hdspm->channel_map_out_ds;
1555                hdspm->max_channels_in = hdspm->ds_in_channels;
1556                hdspm->max_channels_out = hdspm->ds_out_channels;
1557                hdspm->port_names_in = hdspm->port_names_in_ds;
1558                hdspm->port_names_out = hdspm->port_names_out_ds;
1559        } else {
1560                hdspm->channel_map_in = hdspm->channel_map_in_qs;
1561                hdspm->channel_map_out = hdspm->channel_map_out_qs;
1562                hdspm->max_channels_in = hdspm->qs_in_channels;
1563                hdspm->max_channels_out = hdspm->qs_out_channels;
1564                hdspm->port_names_in = hdspm->port_names_in_qs;
1565                hdspm->port_names_out = hdspm->port_names_out_qs;
1566        }
1567
1568        if (not_set != 0)
1569                return -1;
1570
1571        return 0;
1572}
1573
1574/* mainly for init to 0 on load */
1575static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1576{
1577        int i, j;
1578        unsigned int gain;
1579
1580        if (sgain > UNITY_GAIN)
1581                gain = UNITY_GAIN;
1582        else if (sgain < 0)
1583                gain = 0;
1584        else
1585                gain = sgain;
1586
1587        for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1588                for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1589                        hdspm_write_in_gain(hdspm, i, j, gain);
1590                        hdspm_write_pb_gain(hdspm, i, j, gain);
1591                }
1592}
1593
1594/*----------------------------------------------------------------------------
1595   MIDI
1596  ----------------------------------------------------------------------------*/
1597
1598static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1599                                                      int id)
1600{
1601        /* the hardware already does the relevant bit-mask with 0xff */
1602        return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1603}
1604
1605static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1606                                              int val)
1607{
1608        /* the hardware already does the relevant bit-mask with 0xff */
1609        return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1610}
1611
1612static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1613{
1614        return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1615}
1616
1617static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1618{
1619        int fifo_bytes_used;
1620
1621        fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1622
1623        if (fifo_bytes_used < 128)
1624                return  128 - fifo_bytes_used;
1625        else
1626                return 0;
1627}
1628
1629static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1630{
1631        while (snd_hdspm_midi_input_available (hdspm, id))
1632                snd_hdspm_midi_read_byte (hdspm, id);
1633}
1634
1635static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1636{
1637        unsigned long flags;
1638        int n_pending;
1639        int to_write;
1640        int i;
1641        unsigned char buf[128];
1642
1643        /* Output is not interrupt driven */
1644
1645        spin_lock_irqsave (&hmidi->lock, flags);
1646        if (hmidi->output &&
1647            !snd_rawmidi_transmit_empty (hmidi->output)) {
1648                n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1649                                                            hmidi->id);
1650                if (n_pending > 0) {
1651                        if (n_pending > (int)sizeof (buf))
1652                                n_pending = sizeof (buf);
1653
1654                        to_write = snd_rawmidi_transmit (hmidi->output, buf,
1655                                                         n_pending);
1656                        if (to_write > 0) {
1657                                for (i = 0; i < to_write; ++i)
1658                                        snd_hdspm_midi_write_byte (hmidi->hdspm,
1659                                                                   hmidi->id,
1660                                                                   buf[i]);
1661                        }
1662                }
1663        }
1664        spin_unlock_irqrestore (&hmidi->lock, flags);
1665        return 0;
1666}
1667
1668static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1669{
1670        unsigned char buf[128]; /* this buffer is designed to match the MIDI
1671                                 * input FIFO size
1672                                 */
1673        unsigned long flags;
1674        int n_pending;
1675        int i;
1676
1677        spin_lock_irqsave (&hmidi->lock, flags);
1678        n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1679        if (n_pending > 0) {
1680                if (hmidi->input) {
1681                        if (n_pending > (int)sizeof (buf))
1682                                n_pending = sizeof (buf);
1683                        for (i = 0; i < n_pending; ++i)
1684                                buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1685                                                                   hmidi->id);
1686                        if (n_pending)
1687                                snd_rawmidi_receive (hmidi->input, buf,
1688                                                     n_pending);
1689                } else {
1690                        /* flush the MIDI input FIFO */
1691                        while (n_pending--)
1692                                snd_hdspm_midi_read_byte (hmidi->hdspm,
1693                                                          hmidi->id);
1694                }
1695        }
1696        hmidi->pending = 0;
1697        spin_unlock_irqrestore(&hmidi->lock, flags);
1698
1699        spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1700        hmidi->hdspm->control_register |= hmidi->ie;
1701        hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1702                    hmidi->hdspm->control_register);
1703        spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1704
1705        return snd_hdspm_midi_output_write (hmidi);
1706}
1707
1708static void
1709snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1710{
1711        struct hdspm *hdspm;
1712        struct hdspm_midi *hmidi;
1713        unsigned long flags;
1714
1715        hmidi = substream->rmidi->private_data;
1716        hdspm = hmidi->hdspm;
1717
1718        spin_lock_irqsave (&hdspm->lock, flags);
1719        if (up) {
1720                if (!(hdspm->control_register & hmidi->ie)) {
1721                        snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1722                        hdspm->control_register |= hmidi->ie;
1723                }
1724        } else {
1725                hdspm->control_register &= ~hmidi->ie;
1726        }
1727
1728        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1729        spin_unlock_irqrestore (&hdspm->lock, flags);
1730}
1731
1732static void snd_hdspm_midi_output_timer(unsigned long data)
1733{
1734        struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1735        unsigned long flags;
1736
1737        snd_hdspm_midi_output_write(hmidi);
1738        spin_lock_irqsave (&hmidi->lock, flags);
1739
1740        /* this does not bump hmidi->istimer, because the
1741           kernel automatically removed the timer when it
1742           expired, and we are now adding it back, thus
1743           leaving istimer wherever it was set before.
1744        */
1745
1746        if (hmidi->istimer) {
1747                hmidi->timer.expires = 1 + jiffies;
1748                add_timer(&hmidi->timer);
1749        }
1750
1751        spin_unlock_irqrestore (&hmidi->lock, flags);
1752}
1753
1754static void
1755snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1756{
1757        struct hdspm_midi *hmidi;
1758        unsigned long flags;
1759
1760        hmidi = substream->rmidi->private_data;
1761        spin_lock_irqsave (&hmidi->lock, flags);
1762        if (up) {
1763                if (!hmidi->istimer) {
1764                        init_timer(&hmidi->timer);
1765                        hmidi->timer.function = snd_hdspm_midi_output_timer;
1766                        hmidi->timer.data = (unsigned long) hmidi;
1767                        hmidi->timer.expires = 1 + jiffies;
1768                        add_timer(&hmidi->timer);
1769                        hmidi->istimer++;
1770                }
1771        } else {
1772                if (hmidi->istimer && --hmidi->istimer <= 0)
1773                        del_timer (&hmidi->timer);
1774        }
1775        spin_unlock_irqrestore (&hmidi->lock, flags);
1776        if (up)
1777                snd_hdspm_midi_output_write(hmidi);
1778}
1779
1780static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1781{
1782        struct hdspm_midi *hmidi;
1783
1784        hmidi = substream->rmidi->private_data;
1785        spin_lock_irq (&hmidi->lock);
1786        snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1787        hmidi->input = substream;
1788        spin_unlock_irq (&hmidi->lock);
1789
1790        return 0;
1791}
1792
1793static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1794{
1795        struct hdspm_midi *hmidi;
1796
1797        hmidi = substream->rmidi->private_data;
1798        spin_lock_irq (&hmidi->lock);
1799        hmidi->output = substream;
1800        spin_unlock_irq (&hmidi->lock);
1801
1802        return 0;
1803}
1804
1805static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1806{
1807        struct hdspm_midi *hmidi;
1808
1809        snd_hdspm_midi_input_trigger (substream, 0);
1810
1811        hmidi = substream->rmidi->private_data;
1812        spin_lock_irq (&hmidi->lock);
1813        hmidi->input = NULL;
1814        spin_unlock_irq (&hmidi->lock);
1815
1816        return 0;
1817}
1818
1819static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1820{
1821        struct hdspm_midi *hmidi;
1822
1823        snd_hdspm_midi_output_trigger (substream, 0);
1824
1825        hmidi = substream->rmidi->private_data;
1826        spin_lock_irq (&hmidi->lock);
1827        hmidi->output = NULL;
1828        spin_unlock_irq (&hmidi->lock);
1829
1830        return 0;
1831}
1832
1833static struct snd_rawmidi_ops snd_hdspm_midi_output =
1834{
1835        .open =         snd_hdspm_midi_output_open,
1836        .close =        snd_hdspm_midi_output_close,
1837        .trigger =      snd_hdspm_midi_output_trigger,
1838};
1839
1840static struct snd_rawmidi_ops snd_hdspm_midi_input =
1841{
1842        .open =         snd_hdspm_midi_input_open,
1843        .close =        snd_hdspm_midi_input_close,
1844        .trigger =      snd_hdspm_midi_input_trigger,
1845};
1846
1847static int __devinit snd_hdspm_create_midi (struct snd_card *card,
1848                                            struct hdspm *hdspm, int id)
1849{
1850        int err;
1851        char buf[32];
1852
1853        hdspm->midi[id].id = id;
1854        hdspm->midi[id].hdspm = hdspm;
1855        spin_lock_init (&hdspm->midi[id].lock);
1856
1857        if (0 == id) {
1858                if (MADIface == hdspm->io_type) {
1859                        /* MIDI-over-MADI on HDSPe MADIface */
1860                        hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
1861                        hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
1862                        hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
1863                        hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
1864                        hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
1865                        hdspm->midi[0].irq = HDSPM_midi2IRQPending;
1866                } else {
1867                        hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
1868                        hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
1869                        hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
1870                        hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
1871                        hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
1872                        hdspm->midi[0].irq = HDSPM_midi0IRQPending;
1873                }
1874        } else if (1 == id) {
1875                hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
1876                hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
1877                hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
1878                hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
1879                hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
1880                hdspm->midi[1].irq = HDSPM_midi1IRQPending;
1881        } else if ((2 == id) && (MADI == hdspm->io_type)) {
1882                /* MIDI-over-MADI on HDSPe MADI */
1883                hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1884                hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1885                hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
1886                hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
1887                hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1888                hdspm->midi[2].irq = HDSPM_midi2IRQPending;
1889        } else if (2 == id) {
1890                /* TCO MTC, read only */
1891                hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1892                hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1893                hdspm->midi[2].dataOut = -1;
1894                hdspm->midi[2].statusOut = -1;
1895                hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1896                hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
1897        } else if (3 == id) {
1898                /* TCO MTC on HDSPe MADI */
1899                hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
1900                hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
1901                hdspm->midi[3].dataOut = -1;
1902                hdspm->midi[3].statusOut = -1;
1903                hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
1904                hdspm->midi[3].irq = HDSPM_midi3IRQPending;
1905        }
1906
1907        if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
1908                                        (MADIface == hdspm->io_type)))) {
1909                if ((id == 0) && (MADIface == hdspm->io_type)) {
1910                        sprintf(buf, "%s MIDIoverMADI", card->shortname);
1911                } else if ((id == 2) && (MADI == hdspm->io_type)) {
1912                        sprintf(buf, "%s MIDIoverMADI", card->shortname);
1913                } else {
1914                        sprintf(buf, "%s MIDI %d", card->shortname, id+1);
1915                }
1916                err = snd_rawmidi_new(card, buf, id, 1, 1,
1917                                &hdspm->midi[id].rmidi);
1918                if (err < 0)
1919                        return err;
1920
1921                sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d",
1922                                card->id, id+1);
1923                hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1924
1925                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1926                                SNDRV_RAWMIDI_STREAM_OUTPUT,
1927                                &snd_hdspm_midi_output);
1928                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1929                                SNDRV_RAWMIDI_STREAM_INPUT,
1930                                &snd_hdspm_midi_input);
1931
1932                hdspm->midi[id].rmidi->info_flags |=
1933                        SNDRV_RAWMIDI_INFO_OUTPUT |
1934                        SNDRV_RAWMIDI_INFO_INPUT |
1935                        SNDRV_RAWMIDI_INFO_DUPLEX;
1936        } else {
1937                /* TCO MTC, read only */
1938                sprintf(buf, "%s MTC %d", card->shortname, id+1);
1939                err = snd_rawmidi_new(card, buf, id, 1, 1,
1940                                &hdspm->midi[id].rmidi);
1941                if (err < 0)
1942                        return err;
1943
1944                sprintf(hdspm->midi[id].rmidi->name,
1945                                "%s MTC %d", card->id, id+1);
1946                hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1947
1948                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1949                                SNDRV_RAWMIDI_STREAM_INPUT,
1950                                &snd_hdspm_midi_input);
1951
1952                hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
1953        }
1954
1955        return 0;
1956}
1957
1958
1959static void hdspm_midi_tasklet(unsigned long arg)
1960{
1961        struct hdspm *hdspm = (struct hdspm *)arg;
1962        int i = 0;
1963
1964        while (i < hdspm->midiPorts) {
1965                if (hdspm->midi[i].pending)
1966                        snd_hdspm_midi_input_read(&hdspm->midi[i]);
1967
1968                i++;
1969        }
1970}
1971
1972
1973/*-----------------------------------------------------------------------------
1974  Status Interface
1975  ----------------------------------------------------------------------------*/
1976
1977/* get the system sample rate which is set */
1978
1979
1980/**
1981 * Calculate the real sample rate from the
1982 * current DDS value.
1983 **/
1984static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
1985{
1986        unsigned int period, rate;
1987
1988        period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
1989        rate = hdspm_calc_dds_value(hdspm, period);
1990
1991        return rate;
1992}
1993
1994
1995#define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
1996{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1997  .name = xname, \
1998  .index = xindex, \
1999  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2000  .info = snd_hdspm_info_system_sample_rate, \
2001  .get = snd_hdspm_get_system_sample_rate \
2002}
2003
2004static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2005                                             struct snd_ctl_elem_info *uinfo)
2006{
2007        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2008        uinfo->count = 1;
2009        uinfo->value.integer.min = 27000;
2010        uinfo->value.integer.max = 207000;
2011        uinfo->value.integer.step = 1;
2012        return 0;
2013}
2014
2015
2016static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2017                                            struct snd_ctl_elem_value *
2018                                            ucontrol)
2019{
2020        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2021
2022        ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2023        return 0;
2024}
2025
2026
2027/**
2028 * Returns the WordClock sample rate class for the given card.
2029 **/
2030static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2031{
2032        int status;
2033
2034        switch (hdspm->io_type) {
2035        case RayDAT:
2036        case AIO:
2037                status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2038                return (status >> 16) & 0xF;
2039                break;
2040        default:
2041                break;
2042        }
2043
2044
2045        return 0;
2046}
2047
2048
2049/**
2050 * Returns the TCO sample rate class for the given card.
2051 **/
2052static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2053{
2054        int status;
2055
2056        if (hdspm->tco) {
2057                switch (hdspm->io_type) {
2058                case RayDAT:
2059                case AIO:
2060                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2061                        return (status >> 20) & 0xF;
2062                        break;
2063                default:
2064                        break;
2065                }
2066        }
2067
2068        return 0;
2069}
2070
2071
2072/**
2073 * Returns the SYNC_IN sample rate class for the given card.
2074 **/
2075static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2076{
2077        int status;
2078
2079        if (hdspm->tco) {
2080                switch (hdspm->io_type) {
2081                case RayDAT:
2082                case AIO:
2083                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2084                        return (status >> 12) & 0xF;
2085                        break;
2086                default:
2087                        break;
2088                }
2089        }
2090
2091        return 0;
2092}
2093
2094
2095/**
2096 * Returns the sample rate class for input source <idx> for
2097 * 'new style' cards like the AIO and RayDAT.
2098 **/
2099static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2100{
2101        int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2102
2103        return (status >> (idx*4)) & 0xF;
2104}
2105
2106
2107
2108#define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2109{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2110        .name = xname, \
2111        .private_value = xindex, \
2112        .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2113        .info = snd_hdspm_info_autosync_sample_rate, \
2114        .get = snd_hdspm_get_autosync_sample_rate \
2115}
2116
2117
2118static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2119                                               struct snd_ctl_elem_info *uinfo)
2120{
2121        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2122        uinfo->count = 1;
2123        uinfo->value.enumerated.items = 10;
2124
2125        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2126                uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
2127        strcpy(uinfo->value.enumerated.name,
2128                        texts_freq[uinfo->value.enumerated.item]);
2129        return 0;
2130}
2131
2132
2133static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2134                                              struct snd_ctl_elem_value *
2135                                              ucontrol)
2136{
2137        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2138
2139        switch (hdspm->io_type) {
2140        case RayDAT:
2141                switch (kcontrol->private_value) {
2142                case 0:
2143                        ucontrol->value.enumerated.item[0] =
2144                                hdspm_get_wc_sample_rate(hdspm);
2145                        break;
2146                case 7:
2147                        ucontrol->value.enumerated.item[0] =
2148                                hdspm_get_tco_sample_rate(hdspm);
2149                        break;
2150                case 8:
2151                        ucontrol->value.enumerated.item[0] =
2152                                hdspm_get_sync_in_sample_rate(hdspm);
2153                        break;
2154                default:
2155                        ucontrol->value.enumerated.item[0] =
2156                                hdspm_get_s1_sample_rate(hdspm,
2157                                                kcontrol->private_value-1);
2158                }
2159
2160        case AIO:
2161                switch (kcontrol->private_value) {
2162                case 0: /* WC */
2163                        ucontrol->value.enumerated.item[0] =
2164                                hdspm_get_wc_sample_rate(hdspm);
2165                        break;
2166                case 4: /* TCO */
2167                        ucontrol->value.enumerated.item[0] =
2168                                hdspm_get_tco_sample_rate(hdspm);
2169                        break;
2170                case 5: /* SYNC_IN */
2171                        ucontrol->value.enumerated.item[0] =
2172                                hdspm_get_sync_in_sample_rate(hdspm);
2173                        break;
2174                default:
2175                        ucontrol->value.enumerated.item[0] =
2176                                hdspm_get_s1_sample_rate(hdspm,
2177                                                ucontrol->id.index-1);
2178                }
2179
2180        case AES32:
2181
2182                switch (kcontrol->private_value) {
2183                case 0: /* WC */
2184                        ucontrol->value.enumerated.item[0] =
2185                                hdspm_get_wc_sample_rate(hdspm);
2186                        break;
2187                case 9: /* TCO */
2188                        ucontrol->value.enumerated.item[0] =
2189                                hdspm_get_tco_sample_rate(hdspm);
2190                        break;
2191                case 10: /* SYNC_IN */
2192                        ucontrol->value.enumerated.item[0] =
2193                                hdspm_get_sync_in_sample_rate(hdspm);
2194                        break;
2195                default: /* AES1 to AES8 */
2196                        ucontrol->value.enumerated.item[0] =
2197                                hdspm_get_s1_sample_rate(hdspm,
2198                                                kcontrol->private_value-1);
2199                        break;
2200
2201                }
2202        default:
2203                break;
2204        }
2205
2206        return 0;
2207}
2208
2209
2210#define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2211{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2212        .name = xname, \
2213        .index = xindex, \
2214        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2215                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2216        .info = snd_hdspm_info_system_clock_mode, \
2217        .get = snd_hdspm_get_system_clock_mode, \
2218        .put = snd_hdspm_put_system_clock_mode, \
2219}
2220
2221
2222/**
2223 * Returns the system clock mode for the given card.
2224 * @returns 0 - master, 1 - slave
2225 **/
2226static int hdspm_system_clock_mode(struct hdspm *hdspm)
2227{
2228        switch (hdspm->io_type) {
2229        case AIO:
2230        case RayDAT:
2231                if (hdspm->settings_register & HDSPM_c0Master)
2232                        return 0;
2233                break;
2234
2235        default:
2236                if (hdspm->control_register & HDSPM_ClockModeMaster)
2237                        return 0;
2238        }
2239
2240        return 1;
2241}
2242
2243
2244/**
2245 * Sets the system clock mode.
2246 * @param mode 0 - master, 1 - slave
2247 **/
2248static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2249{
2250        switch (hdspm->io_type) {
2251        case AIO:
2252        case RayDAT:
2253                if (0 == mode)
2254                        hdspm->settings_register |= HDSPM_c0Master;
2255                else
2256                        hdspm->settings_register &= ~HDSPM_c0Master;
2257
2258                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2259                break;
2260
2261        default:
2262                if (0 == mode)
2263                        hdspm->control_register |= HDSPM_ClockModeMaster;
2264                else
2265                        hdspm->control_register &= ~HDSPM_ClockModeMaster;
2266
2267                hdspm_write(hdspm, HDSPM_controlRegister,
2268                                hdspm->control_register);
2269        }
2270}
2271
2272
2273static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2274                                            struct snd_ctl_elem_info *uinfo)
2275{
2276        static char *texts[] = { "Master", "AutoSync" };
2277
2278        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2279        uinfo->count = 1;
2280        uinfo->value.enumerated.items = 2;
2281        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2282                uinfo->value.enumerated.item =
2283                    uinfo->value.enumerated.items - 1;
2284        strcpy(uinfo->value.enumerated.name,
2285               texts[uinfo->value.enumerated.item]);
2286        return 0;
2287}
2288
2289static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2290                                           struct snd_ctl_elem_value *ucontrol)
2291{
2292        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2293
2294        ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2295        return 0;
2296}
2297
2298static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2299                                           struct snd_ctl_elem_value *ucontrol)
2300{
2301        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2302        int val;
2303
2304        if (!snd_hdspm_use_is_exclusive(hdspm))
2305                return -EBUSY;
2306
2307        val = ucontrol->value.enumerated.item[0];
2308        if (val < 0)
2309                val = 0;
2310        else if (val > 1)
2311                val = 1;
2312
2313        hdspm_set_system_clock_mode(hdspm, val);
2314
2315        return 0;
2316}
2317
2318
2319#define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2320{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2321        .name = xname, \
2322        .index = xindex, \
2323        .info = snd_hdspm_info_clock_source, \
2324        .get = snd_hdspm_get_clock_source, \
2325        .put = snd_hdspm_put_clock_source \
2326}
2327
2328
2329static int hdspm_clock_source(struct hdspm * hdspm)
2330{
2331        switch (hdspm->system_sample_rate) {
2332        case 32000: return 0;
2333        case 44100: return 1;
2334        case 48000: return 2;
2335        case 64000: return 3;
2336        case 88200: return 4;
2337        case 96000: return 5;
2338        case 128000: return 6;
2339        case 176400: return 7;
2340        case 192000: return 8;
2341        }
2342
2343        return -1;
2344}
2345
2346static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2347{
2348        int rate;
2349        switch (mode) {
2350        case 0:
2351                rate = 32000; break;
2352        case 1:
2353                rate = 44100; break;
2354        case 2:
2355                rate = 48000; break;
2356        case 3:
2357                rate = 64000; break;
2358        case 4:
2359                rate = 88200; break;
2360        case 5:
2361                rate = 96000; break;
2362        case 6:
2363                rate = 128000; break;
2364        case 7:
2365                rate = 176400; break;
2366        case 8:
2367                rate = 192000; break;
2368        default:
2369                rate = 48000;
2370        }
2371        hdspm_set_rate(hdspm, rate, 1);
2372        return 0;
2373}
2374
2375static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2376                                       struct snd_ctl_elem_info *uinfo)
2377{
2378        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2379        uinfo->count = 1;
2380        uinfo->value.enumerated.items = 9;
2381
2382        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2383                uinfo->value.enumerated.item =
2384                    uinfo->value.enumerated.items - 1;
2385
2386        strcpy(uinfo->value.enumerated.name,
2387               texts_freq[uinfo->value.enumerated.item+1]);
2388
2389        return 0;
2390}
2391
2392static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2393                                      struct snd_ctl_elem_value *ucontrol)
2394{
2395        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2396
2397        ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2398        return 0;
2399}
2400
2401static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2402                                      struct snd_ctl_elem_value *ucontrol)
2403{
2404        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2405        int change;
2406        int val;
2407
2408        if (!snd_hdspm_use_is_exclusive(hdspm))
2409                return -EBUSY;
2410        val = ucontrol->value.enumerated.item[0];
2411        if (val < 0)
2412                val = 0;
2413        if (val > 9)
2414                val = 9;
2415        spin_lock_irq(&hdspm->lock);
2416        if (val != hdspm_clock_source(hdspm))
2417                change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2418        else
2419                change = 0;
2420        spin_unlock_irq(&hdspm->lock);
2421        return change;
2422}
2423
2424
2425#define HDSPM_PREF_SYNC_REF(xname, xindex) \
2426{.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2427        .name = xname, \
2428        .index = xindex, \
2429        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2430                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2431        .info = snd_hdspm_info_pref_sync_ref, \
2432        .get = snd_hdspm_get_pref_sync_ref, \
2433        .put = snd_hdspm_put_pref_sync_ref \
2434}
2435
2436
2437/**
2438 * Returns the current preferred sync reference setting.
2439 * The semantics of the return value are depending on the
2440 * card, please see the comments for clarification.
2441 **/
2442static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2443{
2444        switch (hdspm->io_type) {
2445        case AES32:
2446                switch (hdspm->control_register & HDSPM_SyncRefMask) {
2447                case 0: return 0;  /* WC */
2448                case HDSPM_SyncRef0: return 1; /* AES 1 */
2449                case HDSPM_SyncRef1: return 2; /* AES 2 */
2450                case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2451                case HDSPM_SyncRef2: return 4; /* AES 4 */
2452                case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2453                case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2454                case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2455                                                    return 7; /* AES 7 */
2456                case HDSPM_SyncRef3: return 8; /* AES 8 */
2457                case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2458                }
2459                break;
2460
2461        case MADI:
2462        case MADIface:
2463                if (hdspm->tco) {
2464                        switch (hdspm->control_register & HDSPM_SyncRefMask) {
2465                        case 0: return 0;  /* WC */
2466                        case HDSPM_SyncRef0: return 1;  /* MADI */
2467                        case HDSPM_SyncRef1: return 2;  /* TCO */
2468                        case HDSPM_SyncRef1+HDSPM_SyncRef0:
2469                                             return 3;  /* SYNC_IN */
2470                        }
2471                } else {
2472                        switch (hdspm->control_register & HDSPM_SyncRefMask) {
2473                        case 0: return 0;  /* WC */
2474                        case HDSPM_SyncRef0: return 1;  /* MADI */
2475                        case HDSPM_SyncRef1+HDSPM_SyncRef0:
2476                                             return 2;  /* SYNC_IN */
2477                        }
2478                }
2479                break;
2480
2481        case RayDAT:
2482                if (hdspm->tco) {
2483                        switch ((hdspm->settings_register &
2484                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2485                        case 0: return 0;  /* WC */
2486                        case 3: return 1;  /* ADAT 1 */
2487                        case 4: return 2;  /* ADAT 2 */
2488                        case 5: return 3;  /* ADAT 3 */
2489                        case 6: return 4;  /* ADAT 4 */
2490                        case 1: return 5;  /* AES */
2491                        case 2: return 6;  /* SPDIF */
2492                        case 9: return 7;  /* TCO */
2493                        case 10: return 8; /* SYNC_IN */
2494                        }
2495                } else {
2496                        switch ((hdspm->settings_register &
2497                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2498                        case 0: return 0;  /* WC */
2499                        case 3: return 1;  /* ADAT 1 */
2500                        case 4: return 2;  /* ADAT 2 */
2501                        case 5: return 3;  /* ADAT 3 */
2502                        case 6: return 4;  /* ADAT 4 */
2503                        case 1: return 5;  /* AES */
2504                        case 2: return 6;  /* SPDIF */
2505                        case 10: return 7; /* SYNC_IN */
2506                        }
2507                }
2508
2509                break;
2510
2511        case AIO:
2512                if (hdspm->tco) {
2513                        switch ((hdspm->settings_register &
2514                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2515                        case 0: return 0;  /* WC */
2516                        case 3: return 1;  /* ADAT */
2517                        case 1: return 2;  /* AES */
2518                        case 2: return 3;  /* SPDIF */
2519                        case 9: return 4;  /* TCO */
2520                        case 10: return 5; /* SYNC_IN */
2521                        }
2522                } else {
2523                        switch ((hdspm->settings_register &
2524                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2525                        case 0: return 0;  /* WC */
2526                        case 3: return 1;  /* ADAT */
2527                        case 1: return 2;  /* AES */
2528                        case 2: return 3;  /* SPDIF */
2529                        case 10: return 4; /* SYNC_IN */
2530                        }
2531                }
2532
2533                break;
2534        }
2535
2536        return -1;
2537}
2538
2539
2540/**
2541 * Set the preferred sync reference to <pref>. The semantics
2542 * of <pref> are depending on the card type, see the comments
2543 * for clarification.
2544 **/
2545static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2546{
2547        int p = 0;
2548
2549        switch (hdspm->io_type) {
2550        case AES32:
2551                hdspm->control_register &= ~HDSPM_SyncRefMask;
2552                switch (pref) {
2553                case 0: /* WC  */
2554                        break;
2555                case 1: /* AES 1 */
2556                        hdspm->control_register |= HDSPM_SyncRef0;
2557                        break;
2558                case 2: /* AES 2 */
2559                        hdspm->control_register |= HDSPM_SyncRef1;
2560                        break;
2561                case 3: /* AES 3 */
2562                        hdspm->control_register |=
2563                                HDSPM_SyncRef1+HDSPM_SyncRef0;
2564                        break;
2565                case 4: /* AES 4 */
2566                        hdspm->control_register |= HDSPM_SyncRef2;
2567                        break;
2568                case 5: /* AES 5 */
2569                        hdspm->control_register |=
2570                                HDSPM_SyncRef2+HDSPM_SyncRef0;
2571                        break;
2572                case 6: /* AES 6 */
2573                        hdspm->control_register |=
2574                                HDSPM_SyncRef2+HDSPM_SyncRef1;
2575                        break;
2576                case 7: /* AES 7 */
2577                        hdspm->control_register |=
2578                                HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2579                        break;
2580                case 8: /* AES 8 */
2581                        hdspm->control_register |= HDSPM_SyncRef3;
2582                        break;
2583                case 9: /* TCO */
2584                        hdspm->control_register |=
2585                                HDSPM_SyncRef3+HDSPM_SyncRef0;
2586                        break;
2587                default:
2588                        return -1;
2589                }
2590
2591                break;
2592
2593        case MADI:
2594        case MADIface:
2595                hdspm->control_register &= ~HDSPM_SyncRefMask;
2596                if (hdspm->tco) {
2597                        switch (pref) {
2598                        case 0: /* WC */
2599                                break;
2600                        case 1: /* MADI */
2601                                hdspm->control_register |= HDSPM_SyncRef0;
2602                                break;
2603                        case 2: /* TCO */
2604                                hdspm->control_register |= HDSPM_SyncRef1;
2605                                break;
2606                        case 3: /* SYNC_IN */
2607                                hdspm->control_register |=
2608                                        HDSPM_SyncRef0+HDSPM_SyncRef1;
2609                                break;
2610                        default:
2611                                return -1;
2612                        }
2613                } else {
2614                        switch (pref) {
2615                        case 0: /* WC */
2616                                break;
2617                        case 1: /* MADI */
2618                                hdspm->control_register |= HDSPM_SyncRef0;
2619                                break;
2620                        case 2: /* SYNC_IN */
2621                                hdspm->control_register |=
2622                                        HDSPM_SyncRef0+HDSPM_SyncRef1;
2623                                break;
2624                        default:
2625                                return -1;
2626                        }
2627                }
2628
2629                break;
2630
2631        case RayDAT:
2632                if (hdspm->tco) {
2633                        switch (pref) {
2634                        case 0: p = 0; break;  /* WC */
2635                        case 1: p = 3; break;  /* ADAT 1 */
2636                        case 2: p = 4; break;  /* ADAT 2 */
2637                        case 3: p = 5; break;  /* ADAT 3 */
2638                        case 4: p = 6; break;  /* ADAT 4 */
2639                        case 5: p = 1; break;  /* AES */
2640                        case 6: p = 2; break;  /* SPDIF */
2641                        case 7: p = 9; break;  /* TCO */
2642                        case 8: p = 10; break; /* SYNC_IN */
2643                        default: return -1;
2644                        }
2645                } else {
2646                        switch (pref) {
2647                        case 0: p = 0; break;  /* WC */
2648                        case 1: p = 3; break;  /* ADAT 1 */
2649                        case 2: p = 4; break;  /* ADAT 2 */
2650                        case 3: p = 5; break;  /* ADAT 3 */
2651                        case 4: p = 6; break;  /* ADAT 4 */
2652                        case 5: p = 1; break;  /* AES */
2653                        case 6: p = 2; break;  /* SPDIF */
2654                        case 7: p = 10; break; /* SYNC_IN */
2655                        default: return -1;
2656                        }
2657                }
2658                break;
2659
2660        case AIO:
2661                if (hdspm->tco) {
2662                        switch (pref) {
2663                        case 0: p = 0; break;  /* WC */
2664                        case 1: p = 3; break;  /* ADAT */
2665                        case 2: p = 1; break;  /* AES */
2666                        case 3: p = 2; break;  /* SPDIF */
2667                        case 4: p = 9; break;  /* TCO */
2668                        case 5: p = 10; break; /* SYNC_IN */
2669                        default: return -1;
2670                        }
2671                } else {
2672                        switch (pref) {
2673                        case 0: p = 0; break;  /* WC */
2674                        case 1: p = 3; break;  /* ADAT */
2675                        case 2: p = 1; break;  /* AES */
2676                        case 3: p = 2; break;  /* SPDIF */
2677                        case 4: p = 10; break; /* SYNC_IN */
2678                        default: return -1;
2679                        }
2680                }
2681                break;
2682        }
2683
2684        switch (hdspm->io_type) {
2685        case RayDAT:
2686        case AIO:
2687                hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2688                hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2689                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2690                break;
2691
2692        case MADI:
2693        case MADIface:
2694        case AES32:
2695                hdspm_write(hdspm, HDSPM_controlRegister,
2696                                hdspm->control_register);
2697        }
2698
2699        return 0;
2700}
2701
2702
2703static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2704                                        struct snd_ctl_elem_info *uinfo)
2705{
2706        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2707
2708        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2709        uinfo->count = 1;
2710        uinfo->value.enumerated.items = hdspm->texts_autosync_items;
2711
2712        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2713                uinfo->value.enumerated.item =
2714                        uinfo->value.enumerated.items - 1;
2715
2716        strcpy(uinfo->value.enumerated.name,
2717                        hdspm->texts_autosync[uinfo->value.enumerated.item]);
2718
2719        return 0;
2720}
2721
2722static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2723                                       struct snd_ctl_elem_value *ucontrol)
2724{
2725        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2726        int psf = hdspm_pref_sync_ref(hdspm);
2727
2728        if (psf >= 0) {
2729                ucontrol->value.enumerated.item[0] = psf;
2730                return 0;
2731        }
2732
2733        return -1;
2734}
2735
2736static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2737                                       struct snd_ctl_elem_value *ucontrol)
2738{
2739        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2740        int val, change = 0;
2741
2742        if (!snd_hdspm_use_is_exclusive(hdspm))
2743                return -EBUSY;
2744
2745        val = ucontrol->value.enumerated.item[0];
2746
2747        if (val < 0)
2748                val = 0;
2749        else if (val >= hdspm->texts_autosync_items)
2750                val = hdspm->texts_autosync_items-1;
2751
2752        spin_lock_irq(&hdspm->lock);
2753        if (val != hdspm_pref_sync_ref(hdspm))
2754                change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
2755
2756        spin_unlock_irq(&hdspm->lock);
2757        return change;
2758}
2759
2760
2761#define HDSPM_AUTOSYNC_REF(xname, xindex) \
2762{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2763  .name = xname, \
2764  .index = xindex, \
2765  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2766  .info = snd_hdspm_info_autosync_ref, \
2767  .get = snd_hdspm_get_autosync_ref, \
2768}
2769
2770static int hdspm_autosync_ref(struct hdspm *hdspm)
2771{
2772        if (AES32 == hdspm->io_type) {
2773                unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
2774                unsigned int syncref =
2775                        (status >> HDSPM_AES32_syncref_bit) & 0xF;
2776                if (syncref == 0)
2777                        return HDSPM_AES32_AUTOSYNC_FROM_WORD;
2778                if (syncref <= 8)
2779                        return syncref;
2780                return HDSPM_AES32_AUTOSYNC_FROM_NONE;
2781        } else if (MADI == hdspm->io_type) {
2782                /* This looks at the autosync selected sync reference */
2783                unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2784
2785                switch (status2 & HDSPM_SelSyncRefMask) {
2786                case HDSPM_SelSyncRef_WORD:
2787                        return HDSPM_AUTOSYNC_FROM_WORD;
2788                case HDSPM_SelSyncRef_MADI:
2789                        return HDSPM_AUTOSYNC_FROM_MADI;
2790                case HDSPM_SelSyncRef_TCO:
2791                        return HDSPM_AUTOSYNC_FROM_TCO;
2792                case HDSPM_SelSyncRef_SyncIn:
2793                        return HDSPM_AUTOSYNC_FROM_SYNC_IN;
2794                case HDSPM_SelSyncRef_NVALID:
2795                        return HDSPM_AUTOSYNC_FROM_NONE;
2796                default:
2797                        return 0;
2798                }
2799
2800        }
2801        return 0;
2802}
2803
2804
2805static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
2806                                       struct snd_ctl_elem_info *uinfo)
2807{
2808        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2809
2810        if (AES32 == hdspm->io_type) {
2811                static char *texts[] = { "WordClock", "AES1", "AES2", "AES3",
2812                        "AES4", "AES5", "AES6", "AES7", "AES8", "None"};
2813
2814                uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2815                uinfo->count = 1;
2816                uinfo->value.enumerated.items = 10;
2817                if (uinfo->value.enumerated.item >=
2818                    uinfo->value.enumerated.items)
2819                        uinfo->value.enumerated.item =
2820                                uinfo->value.enumerated.items - 1;
2821                strcpy(uinfo->value.enumerated.name,
2822                                texts[uinfo->value.enumerated.item]);
2823        } else if (MADI == hdspm->io_type) {
2824                static char *texts[] = {"Word Clock", "MADI", "TCO",
2825                        "Sync In", "None" };
2826
2827                uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2828                uinfo->count = 1;
2829                uinfo->value.enumerated.items = 5;
2830                if (uinfo->value.enumerated.item >=
2831                                uinfo->value.enumerated.items)
2832                        uinfo->value.enumerated.item =
2833                                uinfo->value.enumerated.items - 1;
2834                strcpy(uinfo->value.enumerated.name,
2835                                texts[uinfo->value.enumerated.item]);
2836        }
2837        return 0;
2838}
2839
2840static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
2841                                      struct snd_ctl_elem_value *ucontrol)
2842{
2843        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2844
2845        ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
2846        return 0;
2847}
2848
2849
2850#define HDSPM_LINE_OUT(xname, xindex) \
2851{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2852  .name = xname, \
2853  .index = xindex, \
2854  .info = snd_hdspm_info_line_out, \
2855  .get = snd_hdspm_get_line_out, \
2856  .put = snd_hdspm_put_line_out \
2857}
2858
2859static int hdspm_line_out(struct hdspm * hdspm)
2860{
2861        return (hdspm->control_register & HDSPM_LineOut) ? 1 : 0;
2862}
2863
2864
2865static int hdspm_set_line_output(struct hdspm * hdspm, int out)
2866{
2867        if (out)
2868                hdspm->control_register |= HDSPM_LineOut;
2869        else
2870                hdspm->control_register &= ~HDSPM_LineOut;
2871        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2872
2873        return 0;
2874}
2875
2876#define snd_hdspm_info_line_out         snd_ctl_boolean_mono_info
2877
2878static int snd_hdspm_get_line_out(struct snd_kcontrol *kcontrol,
2879                                  struct snd_ctl_elem_value *ucontrol)
2880{
2881        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2882
2883        spin_lock_irq(&hdspm->lock);
2884        ucontrol->value.integer.value[0] = hdspm_line_out(hdspm);
2885        spin_unlock_irq(&hdspm->lock);
2886        return 0;
2887}
2888
2889static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,
2890                                  struct snd_ctl_elem_value *ucontrol)
2891{
2892        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2893        int change;
2894        unsigned int val;
2895
2896        if (!snd_hdspm_use_is_exclusive(hdspm))
2897                return -EBUSY;
2898        val = ucontrol->value.integer.value[0] & 1;
2899        spin_lock_irq(&hdspm->lock);
2900        change = (int) val != hdspm_line_out(hdspm);
2901        hdspm_set_line_output(hdspm, val);
2902        spin_unlock_irq(&hdspm->lock);
2903        return change;
2904}
2905
2906
2907#define HDSPM_TX_64(xname, xindex) \
2908{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2909  .name = xname, \
2910  .index = xindex, \
2911  .info = snd_hdspm_info_tx_64, \
2912  .get = snd_hdspm_get_tx_64, \
2913  .put = snd_hdspm_put_tx_64 \
2914}
2915
2916static int hdspm_tx_64(struct hdspm * hdspm)
2917{
2918        return (hdspm->control_register & HDSPM_TX_64ch) ? 1 : 0;
2919}
2920
2921static int hdspm_set_tx_64(struct hdspm * hdspm, int out)
2922{
2923        if (out)
2924                hdspm->control_register |= HDSPM_TX_64ch;
2925        else
2926                hdspm->control_register &= ~HDSPM_TX_64ch;
2927        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2928
2929        return 0;
2930}
2931
2932#define snd_hdspm_info_tx_64            snd_ctl_boolean_mono_info
2933
2934static int snd_hdspm_get_tx_64(struct snd_kcontrol *kcontrol,
2935                               struct snd_ctl_elem_value *ucontrol)
2936{
2937        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2938
2939        spin_lock_irq(&hdspm->lock);
2940        ucontrol->value.integer.value[0] = hdspm_tx_64(hdspm);
2941        spin_unlock_irq(&hdspm->lock);
2942        return 0;
2943}
2944
2945static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,
2946                               struct snd_ctl_elem_value *ucontrol)
2947{
2948        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2949        int change;
2950        unsigned int val;
2951
2952        if (!snd_hdspm_use_is_exclusive(hdspm))
2953                return -EBUSY;
2954        val = ucontrol->value.integer.value[0] & 1;
2955        spin_lock_irq(&hdspm->lock);
2956        change = (int) val != hdspm_tx_64(hdspm);
2957        hdspm_set_tx_64(hdspm, val);
2958        spin_unlock_irq(&hdspm->lock);
2959        return change;
2960}
2961
2962
2963#define HDSPM_C_TMS(xname, xindex) \
2964{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2965  .name = xname, \
2966  .index = xindex, \
2967  .info = snd_hdspm_info_c_tms, \
2968  .get = snd_hdspm_get_c_tms, \
2969  .put = snd_hdspm_put_c_tms \
2970}
2971
2972static int hdspm_c_tms(struct hdspm * hdspm)
2973{
2974        return (hdspm->control_register & HDSPM_clr_tms) ? 1 : 0;
2975}
2976
2977static int hdspm_set_c_tms(struct hdspm * hdspm, int out)
2978{
2979        if (out)
2980                hdspm->control_register |= HDSPM_clr_tms;
2981        else
2982                hdspm->control_register &= ~HDSPM_clr_tms;
2983        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2984
2985        return 0;
2986}
2987
2988#define snd_hdspm_info_c_tms            snd_ctl_boolean_mono_info
2989
2990static int snd_hdspm_get_c_tms(struct snd_kcontrol *kcontrol,
2991                               struct snd_ctl_elem_value *ucontrol)
2992{
2993        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2994
2995        spin_lock_irq(&hdspm->lock);
2996        ucontrol->value.integer.value[0] = hdspm_c_tms(hdspm);
2997        spin_unlock_irq(&hdspm->lock);
2998        return 0;
2999}
3000
3001static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,
3002                               struct snd_ctl_elem_value *ucontrol)
3003{
3004        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3005        int change;
3006        unsigned int val;
3007
3008        if (!snd_hdspm_use_is_exclusive(hdspm))
3009                return -EBUSY;
3010        val = ucontrol->value.integer.value[0] & 1;
3011        spin_lock_irq(&hdspm->lock);
3012        change = (int) val != hdspm_c_tms(hdspm);
3013        hdspm_set_c_tms(hdspm, val);
3014        spin_unlock_irq(&hdspm->lock);
3015        return change;
3016}
3017
3018
3019#define HDSPM_SAFE_MODE(xname, xindex) \
3020{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3021  .name = xname, \
3022  .index = xindex, \
3023  .info = snd_hdspm_info_safe_mode, \
3024  .get = snd_hdspm_get_safe_mode, \
3025  .put = snd_hdspm_put_safe_mode \
3026}
3027
3028static int hdspm_safe_mode(struct hdspm * hdspm)
3029{
3030        return (hdspm->control_register & HDSPM_AutoInp) ? 1 : 0;
3031}
3032
3033static int hdspm_set_safe_mode(struct hdspm * hdspm, int out)
3034{
3035        if (out)
3036                hdspm->control_register |= HDSPM_AutoInp;
3037        else
3038                hdspm->control_register &= ~HDSPM_AutoInp;
3039        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3040
3041        return 0;
3042}
3043
3044#define snd_hdspm_info_safe_mode        snd_ctl_boolean_mono_info
3045
3046static int snd_hdspm_get_safe_mode(struct snd_kcontrol *kcontrol,
3047                                   struct snd_ctl_elem_value *ucontrol)
3048{
3049        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3050
3051        spin_lock_irq(&hdspm->lock);
3052        ucontrol->value.integer.value[0] = hdspm_safe_mode(hdspm);
3053        spin_unlock_irq(&hdspm->lock);
3054        return 0;
3055}
3056
3057static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,
3058                                   struct snd_ctl_elem_value *ucontrol)
3059{
3060        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3061        int change;
3062        unsigned int val;
3063
3064        if (!snd_hdspm_use_is_exclusive(hdspm))
3065                return -EBUSY;
3066        val = ucontrol->value.integer.value[0] & 1;
3067        spin_lock_irq(&hdspm->lock);
3068        change = (int) val != hdspm_safe_mode(hdspm);
3069        hdspm_set_safe_mode(hdspm, val);
3070        spin_unlock_irq(&hdspm->lock);
3071        return change;
3072}
3073
3074
3075#define HDSPM_EMPHASIS(xname, xindex) \
3076{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3077  .name = xname, \
3078  .index = xindex, \
3079  .info = snd_hdspm_info_emphasis, \
3080  .get = snd_hdspm_get_emphasis, \
3081  .put = snd_hdspm_put_emphasis \
3082}
3083
3084static int hdspm_emphasis(struct hdspm * hdspm)
3085{
3086        return (hdspm->control_register & HDSPM_Emphasis) ? 1 : 0;
3087}
3088
3089static int hdspm_set_emphasis(struct hdspm * hdspm, int emp)
3090{
3091        if (emp)
3092                hdspm->control_register |= HDSPM_Emphasis;
3093        else
3094                hdspm->control_register &= ~HDSPM_Emphasis;
3095        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3096
3097        return 0;
3098}
3099
3100#define snd_hdspm_info_emphasis         snd_ctl_boolean_mono_info
3101
3102static int snd_hdspm_get_emphasis(struct snd_kcontrol *kcontrol,
3103                                  struct snd_ctl_elem_value *ucontrol)
3104{
3105        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3106
3107        spin_lock_irq(&hdspm->lock);
3108        ucontrol->value.enumerated.item[0] = hdspm_emphasis(hdspm);
3109        spin_unlock_irq(&hdspm->lock);
3110        return 0;
3111}
3112
3113static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,
3114                                  struct snd_ctl_elem_value *ucontrol)
3115{
3116        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3117        int change;
3118        unsigned int val;
3119
3120        if (!snd_hdspm_use_is_exclusive(hdspm))
3121                return -EBUSY;
3122        val = ucontrol->value.integer.value[0] & 1;
3123        spin_lock_irq(&hdspm->lock);
3124        change = (int) val != hdspm_emphasis(hdspm);
3125        hdspm_set_emphasis(hdspm, val);
3126        spin_unlock_irq(&hdspm->lock);
3127        return change;
3128}
3129
3130
3131#define HDSPM_DOLBY(xname, xindex) \
3132{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3133  .name = xname, \
3134  .index = xindex, \
3135  .info = snd_hdspm_info_dolby, \
3136  .get = snd_hdspm_get_dolby, \
3137  .put = snd_hdspm_put_dolby \
3138}
3139
3140static int hdspm_dolby(struct hdspm * hdspm)
3141{
3142        return (hdspm->control_register & HDSPM_Dolby) ? 1 : 0;
3143}
3144
3145static int hdspm_set_dolby(struct hdspm * hdspm, int dol)
3146{
3147        if (dol)
3148                hdspm->control_register |= HDSPM_Dolby;
3149        else
3150                hdspm->control_register &= ~HDSPM_Dolby;
3151        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3152
3153        return 0;
3154}
3155
3156#define snd_hdspm_info_dolby            snd_ctl_boolean_mono_info
3157
3158static int snd_hdspm_get_dolby(struct snd_kcontrol *kcontrol,
3159                               struct snd_ctl_elem_value *ucontrol)
3160{
3161        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3162
3163        spin_lock_irq(&hdspm->lock);
3164        ucontrol->value.enumerated.item[0] = hdspm_dolby(hdspm);
3165        spin_unlock_irq(&hdspm->lock);
3166        return 0;
3167}
3168
3169static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,
3170                               struct snd_ctl_elem_value *ucontrol)
3171{
3172        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3173        int change;
3174        unsigned int val;
3175
3176        if (!snd_hdspm_use_is_exclusive(hdspm))
3177                return -EBUSY;
3178        val = ucontrol->value.integer.value[0] & 1;
3179        spin_lock_irq(&hdspm->lock);
3180        change = (int) val != hdspm_dolby(hdspm);
3181        hdspm_set_dolby(hdspm, val);
3182        spin_unlock_irq(&hdspm->lock);
3183        return change;
3184}
3185
3186
3187#define HDSPM_PROFESSIONAL(xname, xindex) \
3188{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3189  .name = xname, \
3190  .index = xindex, \
3191  .info = snd_hdspm_info_professional, \
3192  .get = snd_hdspm_get_professional, \
3193  .put = snd_hdspm_put_professional \
3194}
3195
3196static int hdspm_professional(struct hdspm * hdspm)
3197{
3198        return (hdspm->control_register & HDSPM_Professional) ? 1 : 0;
3199}
3200
3201static int hdspm_set_professional(struct hdspm * hdspm, int dol)
3202{
3203        if (dol)
3204                hdspm->control_register |= HDSPM_Professional;
3205        else
3206                hdspm->control_register &= ~HDSPM_Professional;
3207        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3208
3209        return 0;
3210}
3211
3212#define snd_hdspm_info_professional     snd_ctl_boolean_mono_info
3213
3214static int snd_hdspm_get_professional(struct snd_kcontrol *kcontrol,
3215                                      struct snd_ctl_elem_value *ucontrol)
3216{
3217        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3218
3219        spin_lock_irq(&hdspm->lock);
3220        ucontrol->value.enumerated.item[0] = hdspm_professional(hdspm);
3221        spin_unlock_irq(&hdspm->lock);
3222        return 0;
3223}
3224
3225static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,
3226                                      struct snd_ctl_elem_value *ucontrol)
3227{
3228        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3229        int change;
3230        unsigned int val;
3231
3232        if (!snd_hdspm_use_is_exclusive(hdspm))
3233                return -EBUSY;
3234        val = ucontrol->value.integer.value[0] & 1;
3235        spin_lock_irq(&hdspm->lock);
3236        change = (int) val != hdspm_professional(hdspm);
3237        hdspm_set_professional(hdspm, val);
3238        spin_unlock_irq(&hdspm->lock);
3239        return change;
3240}
3241
3242#define HDSPM_INPUT_SELECT(xname, xindex) \
3243{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3244  .name = xname, \
3245  .index = xindex, \
3246  .info = snd_hdspm_info_input_select, \
3247  .get = snd_hdspm_get_input_select, \
3248  .put = snd_hdspm_put_input_select \
3249}
3250
3251static int hdspm_input_select(struct hdspm * hdspm)
3252{
3253        return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3254}
3255
3256static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3257{
3258        if (out)
3259                hdspm->control_register |= HDSPM_InputSelect0;
3260        else
3261                hdspm->control_register &= ~HDSPM_InputSelect0;
3262        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3263
3264        return 0;
3265}
3266
3267static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3268                                       struct snd_ctl_elem_info *uinfo)
3269{
3270        static char *texts[] = { "optical", "coaxial" };
3271
3272        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3273        uinfo->count = 1;
3274        uinfo->value.enumerated.items = 2;
3275
3276        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3277                uinfo->value.enumerated.item =
3278                    uinfo->value.enumerated.items - 1;
3279        strcpy(uinfo->value.enumerated.name,
3280               texts[uinfo->value.enumerated.item]);
3281
3282        return 0;
3283}
3284
3285static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3286                                      struct snd_ctl_elem_value *ucontrol)
3287{
3288        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3289
3290        spin_lock_irq(&hdspm->lock);
3291        ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3292        spin_unlock_irq(&hdspm->lock);
3293        return 0;
3294}
3295
3296static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3297                                      struct snd_ctl_elem_value *ucontrol)
3298{
3299        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3300        int change;
3301        unsigned int val;
3302
3303        if (!snd_hdspm_use_is_exclusive(hdspm))
3304                return -EBUSY;
3305        val = ucontrol->value.integer.value[0] & 1;
3306        spin_lock_irq(&hdspm->lock);
3307        change = (int) val != hdspm_input_select(hdspm);
3308        hdspm_set_input_select(hdspm, val);
3309        spin_unlock_irq(&hdspm->lock);
3310        return change;
3311}
3312
3313
3314#define HDSPM_DS_WIRE(xname, xindex) \
3315{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3316  .name = xname, \
3317  .index = xindex, \
3318  .info = snd_hdspm_info_ds_wire, \
3319  .get = snd_hdspm_get_ds_wire, \
3320  .put = snd_hdspm_put_ds_wire \
3321}
3322
3323static int hdspm_ds_wire(struct hdspm * hdspm)
3324{
3325        return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3326}
3327
3328static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3329{
3330        if (ds)
3331                hdspm->control_register |= HDSPM_DS_DoubleWire;
3332        else
3333                hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3334        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3335
3336        return 0;
3337}
3338
3339static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3340                                  struct snd_ctl_elem_info *uinfo)
3341{
3342        static char *texts[] = { "Single", "Double" };
3343
3344        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3345        uinfo->count = 1;
3346        uinfo->value.enumerated.items = 2;
3347
3348        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3349                uinfo->value.enumerated.item =
3350                    uinfo->value.enumerated.items - 1;
3351        strcpy(uinfo->value.enumerated.name,
3352               texts[uinfo->value.enumerated.item]);
3353
3354        return 0;
3355}
3356
3357static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3358                                 struct snd_ctl_elem_value *ucontrol)
3359{
3360        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3361
3362        spin_lock_irq(&hdspm->lock);
3363        ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3364        spin_unlock_irq(&hdspm->lock);
3365        return 0;
3366}
3367
3368static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3369                                 struct snd_ctl_elem_value *ucontrol)
3370{
3371        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3372        int change;
3373        unsigned int val;
3374
3375        if (!snd_hdspm_use_is_exclusive(hdspm))
3376                return -EBUSY;
3377        val = ucontrol->value.integer.value[0] & 1;
3378        spin_lock_irq(&hdspm->lock);
3379        change = (int) val != hdspm_ds_wire(hdspm);
3380        hdspm_set_ds_wire(hdspm, val);
3381        spin_unlock_irq(&hdspm->lock);
3382        return change;
3383}
3384
3385
3386#define HDSPM_QS_WIRE(xname, xindex) \
3387{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3388  .name = xname, \
3389  .index = xindex, \
3390  .info = snd_hdspm_info_qs_wire, \
3391  .get = snd_hdspm_get_qs_wire, \
3392  .put = snd_hdspm_put_qs_wire \
3393}
3394
3395static int hdspm_qs_wire(struct hdspm * hdspm)
3396{
3397        if (hdspm->control_register & HDSPM_QS_DoubleWire)
3398                return 1;
3399        if (hdspm->control_register & HDSPM_QS_QuadWire)
3400                return 2;
3401        return 0;
3402}
3403
3404static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3405{
3406        hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3407        switch (mode) {
3408        case 0:
3409                break;
3410        case 1:
3411                hdspm->control_register |= HDSPM_QS_DoubleWire;
3412                break;
3413        case 2:
3414                hdspm->control_register |= HDSPM_QS_QuadWire;
3415                break;
3416        }
3417        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3418
3419        return 0;
3420}
3421
3422static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3423                                       struct snd_ctl_elem_info *uinfo)
3424{
3425        static char *texts[] = { "Single", "Double", "Quad" };
3426
3427        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3428        uinfo->count = 1;
3429        uinfo->value.enumerated.items = 3;
3430
3431        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3432                uinfo->value.enumerated.item =
3433                    uinfo->value.enumerated.items - 1;
3434        strcpy(uinfo->value.enumerated.name,
3435               texts[uinfo->value.enumerated.item]);
3436
3437        return 0;
3438}
3439
3440static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3441                                      struct snd_ctl_elem_value *ucontrol)
3442{
3443        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3444
3445        spin_lock_irq(&hdspm->lock);
3446        ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3447        spin_unlock_irq(&hdspm->lock);
3448        return 0;
3449}
3450
3451static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3452                                      struct snd_ctl_elem_value *ucontrol)
3453{
3454        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3455        int change;
3456        int val;
3457
3458        if (!snd_hdspm_use_is_exclusive(hdspm))
3459                return -EBUSY;
3460        val = ucontrol->value.integer.value[0];
3461        if (val < 0)
3462                val = 0;
3463        if (val > 2)
3464                val = 2;
3465        spin_lock_irq(&hdspm->lock);
3466        change = val != hdspm_qs_wire(hdspm);
3467        hdspm_set_qs_wire(hdspm, val);
3468        spin_unlock_irq(&hdspm->lock);
3469        return change;
3470}
3471
3472#define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3473{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3474        .name = xname, \
3475        .index = xindex, \
3476        .info = snd_hdspm_info_madi_speedmode, \
3477        .get = snd_hdspm_get_madi_speedmode, \
3478        .put = snd_hdspm_put_madi_speedmode \
3479}
3480
3481static int hdspm_madi_speedmode(struct hdspm *hdspm)
3482{
3483        if (hdspm->control_register & HDSPM_QuadSpeed)
3484                return 2;
3485        if (hdspm->control_register & HDSPM_DoubleSpeed)
3486                return 1;
3487        return 0;
3488}
3489
3490static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3491{
3492        hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3493        switch (mode) {
3494        case 0:
3495                break;
3496        case 1:
3497                hdspm->control_register |= HDSPM_DoubleSpeed;
3498                break;
3499        case 2:
3500                hdspm->control_register |= HDSPM_QuadSpeed;
3501                break;
3502        }
3503        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3504
3505        return 0;
3506}
3507
3508static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3509                                       struct snd_ctl_elem_info *uinfo)
3510{
3511        static char *texts[] = { "Single", "Double", "Quad" };
3512
3513        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3514        uinfo->count = 1;
3515        uinfo->value.enumerated.items = 3;
3516
3517        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3518                uinfo->value.enumerated.item =
3519                    uinfo->value.enumerated.items - 1;
3520        strcpy(uinfo->value.enumerated.name,
3521               texts[uinfo->value.enumerated.item]);
3522
3523        return 0;
3524}
3525
3526static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3527                                      struct snd_ctl_elem_value *ucontrol)
3528{
3529        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3530
3531        spin_lock_irq(&hdspm->lock);
3532        ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3533        spin_unlock_irq(&hdspm->lock);
3534        return 0;
3535}
3536
3537static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3538                                      struct snd_ctl_elem_value *ucontrol)
3539{
3540        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3541        int change;
3542        int val;
3543
3544        if (!snd_hdspm_use_is_exclusive(hdspm))
3545                return -EBUSY;
3546        val = ucontrol->value.integer.value[0];
3547        if (val < 0)
3548                val = 0;
3549        if (val > 2)
3550                val = 2;
3551        spin_lock_irq(&hdspm->lock);
3552        change = val != hdspm_madi_speedmode(hdspm);
3553        hdspm_set_madi_speedmode(hdspm, val);
3554        spin_unlock_irq(&hdspm->lock);
3555        return change;
3556}
3557
3558#define HDSPM_MIXER(xname, xindex) \
3559{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3560  .name = xname, \
3561  .index = xindex, \
3562  .device = 0, \
3563  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3564                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3565  .info = snd_hdspm_info_mixer, \
3566  .get = snd_hdspm_get_mixer, \
3567  .put = snd_hdspm_put_mixer \
3568}
3569
3570static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3571                                struct snd_ctl_elem_info *uinfo)
3572{
3573        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3574        uinfo->count = 3;
3575        uinfo->value.integer.min = 0;
3576        uinfo->value.integer.max = 65535;
3577        uinfo->value.integer.step = 1;
3578        return 0;
3579}
3580
3581static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3582                               struct snd_ctl_elem_value *ucontrol)
3583{
3584        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3585        int source;
3586        int destination;
3587
3588        source = ucontrol->value.integer.value[0];
3589        if (source < 0)
3590                source = 0;
3591        else if (source >= 2 * HDSPM_MAX_CHANNELS)
3592                source = 2 * HDSPM_MAX_CHANNELS - 1;
3593
3594        destination = ucontrol->value.integer.value[1];
3595        if (destination < 0)
3596                destination = 0;
3597        else if (destination >= HDSPM_MAX_CHANNELS)
3598                destination = HDSPM_MAX_CHANNELS - 1;
3599
3600        spin_lock_irq(&hdspm->lock);
3601        if (source >= HDSPM_MAX_CHANNELS)
3602                ucontrol->value.integer.value[2] =
3603                    hdspm_read_pb_gain(hdspm, destination,
3604                                       source - HDSPM_MAX_CHANNELS);
3605        else
3606                ucontrol->value.integer.value[2] =
3607                    hdspm_read_in_gain(hdspm, destination, source);
3608
3609        spin_unlock_irq(&hdspm->lock);
3610
3611        return 0;
3612}
3613
3614static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3615                               struct snd_ctl_elem_value *ucontrol)
3616{
3617        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3618        int change;
3619        int source;
3620        int destination;
3621        int gain;
3622
3623        if (!snd_hdspm_use_is_exclusive(hdspm))
3624                return -EBUSY;
3625
3626        source = ucontrol->value.integer.value[0];
3627        destination = ucontrol->value.integer.value[1];
3628
3629        if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3630                return -1;
3631        if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3632                return -1;
3633
3634        gain = ucontrol->value.integer.value[2];
3635
3636        spin_lock_irq(&hdspm->lock);
3637
3638        if (source >= HDSPM_MAX_CHANNELS)
3639                change = gain != hdspm_read_pb_gain(hdspm, destination,
3640                                                    source -
3641                                                    HDSPM_MAX_CHANNELS);
3642        else
3643                change = gain != hdspm_read_in_gain(hdspm, destination,
3644                                                    source);
3645
3646        if (change) {
3647                if (source >= HDSPM_MAX_CHANNELS)
3648                        hdspm_write_pb_gain(hdspm, destination,
3649                                            source - HDSPM_MAX_CHANNELS,
3650                                            gain);
3651                else
3652                        hdspm_write_in_gain(hdspm, destination, source,
3653                                            gain);
3654        }
3655        spin_unlock_irq(&hdspm->lock);
3656
3657        return change;
3658}
3659
3660/* The simple mixer control(s) provide gain control for the
3661   basic 1:1 mappings of playback streams to output
3662   streams.
3663*/
3664
3665#define HDSPM_PLAYBACK_MIXER \
3666{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3667  .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3668                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3669  .info = snd_hdspm_info_playback_mixer, \
3670  .get = snd_hdspm_get_playback_mixer, \
3671  .put = snd_hdspm_put_playback_mixer \
3672}
3673
3674static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3675                                         struct snd_ctl_elem_info *uinfo)
3676{
3677        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3678        uinfo->count = 1;
3679        uinfo->value.integer.min = 0;
3680        uinfo->value.integer.max = 64;
3681        uinfo->value.integer.step = 1;
3682        return 0;
3683}
3684
3685static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3686                                        struct snd_ctl_elem_value *ucontrol)
3687{
3688        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3689        int channel;
3690
3691        channel = ucontrol->id.index - 1;
3692
3693        if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3694                return -EINVAL;
3695
3696        spin_lock_irq(&hdspm->lock);
3697        ucontrol->value.integer.value[0] =
3698          (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3699        spin_unlock_irq(&hdspm->lock);
3700
3701        return 0;
3702}
3703
3704static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3705                                        struct snd_ctl_elem_value *ucontrol)
3706{
3707        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3708        int change;
3709        int channel;
3710        int gain;
3711
3712        if (!snd_hdspm_use_is_exclusive(hdspm))
3713                return -EBUSY;
3714
3715        channel = ucontrol->id.index - 1;
3716
3717        if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3718                return -EINVAL;
3719
3720        gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3721
3722        spin_lock_irq(&hdspm->lock);
3723        change =
3724            gain != hdspm_read_pb_gain(hdspm, channel,
3725                                       channel);
3726        if (change)
3727                hdspm_write_pb_gain(hdspm, channel, channel,
3728                                    gain);
3729        spin_unlock_irq(&hdspm->lock);
3730        return change;
3731}
3732
3733#define HDSPM_SYNC_CHECK(xname, xindex) \
3734{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3735        .name = xname, \
3736        .private_value = xindex, \
3737        .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3738        .info = snd_hdspm_info_sync_check, \
3739        .get = snd_hdspm_get_sync_check \
3740}
3741
3742
3743static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3744                                     struct snd_ctl_elem_info *uinfo)
3745{
3746        static char *texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3747        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3748        uinfo->count = 1;
3749        uinfo->value.enumerated.items = 4;
3750        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3751                uinfo->value.enumerated.item =
3752                        uinfo->value.enumerated.items - 1;
3753        strcpy(uinfo->value.enumerated.name,
3754                        texts[uinfo->value.enumerated.item]);
3755        return 0;
3756}
3757
3758static int hdspm_wc_sync_check(struct hdspm *hdspm)
3759{
3760        int status, status2;
3761
3762        switch (hdspm->io_type) {
3763        case AES32:
3764                status = hdspm_read(hdspm, HDSPM_statusRegister);
3765                if (status & HDSPM_wcSync)
3766                        return 2;
3767                else if (status & HDSPM_wcLock)
3768                        return 1;
3769                return 0;
3770                break;
3771
3772        case MADI:
3773                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3774                if (status2 & HDSPM_wcLock) {
3775                        if (status2 & HDSPM_wcSync)
3776                                return 2;
3777                        else
3778                                return 1;
3779                }
3780                return 0;
3781                break;
3782
3783        case RayDAT:
3784        case AIO:
3785                status = hdspm_read(hdspm, HDSPM_statusRegister);
3786
3787                if (status & 0x2000000)
3788                        return 2;
3789                else if (status & 0x1000000)
3790                        return 1;
3791                return 0;
3792
3793                break;
3794
3795        case MADIface:
3796                break;
3797        }
3798
3799
3800        return 3;
3801}
3802
3803
3804static int hdspm_madi_sync_check(struct hdspm *hdspm)
3805{
3806        int status = hdspm_read(hdspm, HDSPM_statusRegister);
3807        if (status & HDSPM_madiLock) {
3808                if (status & HDSPM_madiSync)
3809                        return 2;
3810                else
3811                        return 1;
3812        }
3813        return 0;
3814}
3815
3816
3817static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3818{
3819        int status, lock, sync;
3820
3821        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3822
3823        lock = (status & (0x1<<idx)) ? 1 : 0;
3824        sync = (status & (0x100<<idx)) ? 1 : 0;
3825
3826        if (lock && sync)
3827                return 2;
3828        else if (lock)
3829                return 1;
3830        return 0;
3831}
3832
3833
3834static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3835{
3836        int status, lock = 0, sync = 0;
3837
3838        switch (hdspm->io_type) {
3839        case RayDAT:
3840        case AIO:
3841                status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3842                lock = (status & 0x400) ? 1 : 0;
3843                sync = (status & 0x800) ? 1 : 0;
3844                break;
3845
3846        case MADI:
3847        case AES32:
3848                status = hdspm_read(hdspm, HDSPM_statusRegister2);
3849                lock = (status & HDSPM_syncInLock) ? 1 : 0;
3850                sync = (status & HDSPM_syncInSync) ? 1 : 0;
3851                break;
3852
3853        case MADIface:
3854                break;
3855        }
3856
3857        if (lock && sync)
3858                return 2;
3859        else if (lock)
3860                return 1;
3861
3862        return 0;
3863}
3864
3865static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3866{
3867        int status2, lock, sync;
3868        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3869
3870        lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3871        sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3872
3873        if (sync)
3874                return 2;
3875        else if (lock)
3876                return 1;
3877        return 0;
3878}
3879
3880
3881static int hdspm_tco_sync_check(struct hdspm *hdspm)
3882{
3883        int status;
3884
3885        if (hdspm->tco) {
3886                switch (hdspm->io_type) {
3887                case MADI:
3888                case AES32:
3889                        status = hdspm_read(hdspm, HDSPM_statusRegister);
3890                        if (status & HDSPM_tcoLock) {
3891                                if (status & HDSPM_tcoSync)
3892                                        return 2;
3893                                else
3894                                        return 1;
3895                        }
3896                        return 0;
3897
3898                        break;
3899
3900                case RayDAT:
3901                case AIO:
3902                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3903
3904                        if (status & 0x8000000)
3905                                return 2; /* Sync */
3906                        if (status & 0x4000000)
3907                                return 1; /* Lock */
3908                        return 0; /* No signal */
3909                        break;
3910
3911                default:
3912                        break;
3913                }
3914        }
3915
3916        return 3; /* N/A */
3917}
3918
3919
3920static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3921                                    struct snd_ctl_elem_value *ucontrol)
3922{
3923        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3924        int val = -1;
3925
3926        switch (hdspm->io_type) {
3927        case RayDAT:
3928                switch (kcontrol->private_value) {
3929                case 0: /* WC */
3930                        val = hdspm_wc_sync_check(hdspm); break;
3931                case 7: /* TCO */
3932                        val = hdspm_tco_sync_check(hdspm); break;
3933                case 8: /* SYNC IN */
3934                        val = hdspm_sync_in_sync_check(hdspm); break;
3935                default:
3936                        val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3937                }
3938
3939        case AIO:
3940                switch (kcontrol->private_value) {
3941                case 0: /* WC */
3942                        val = hdspm_wc_sync_check(hdspm); break;
3943                case 4: /* TCO */
3944                        val = hdspm_tco_sync_check(hdspm); break;
3945                case 5: /* SYNC IN */
3946                        val = hdspm_sync_in_sync_check(hdspm); break;
3947                default:
3948                        val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3949                }
3950
3951        case MADI:
3952                switch (kcontrol->private_value) {
3953                case 0: /* WC */
3954                        val = hdspm_wc_sync_check(hdspm); break;
3955                case 1: /* MADI */
3956                        val = hdspm_madi_sync_check(hdspm); break;
3957                case 2: /* TCO */
3958                        val = hdspm_tco_sync_check(hdspm); break;
3959                case 3: /* SYNC_IN */
3960                        val = hdspm_sync_in_sync_check(hdspm); break;
3961                }
3962
3963        case MADIface:
3964                val = hdspm_madi_sync_check(hdspm); /* MADI */
3965                break;
3966
3967        case AES32:
3968                switch (kcontrol->private_value) {
3969                case 0: /* WC */
3970                        val = hdspm_wc_sync_check(hdspm); break;
3971                case 9: /* TCO */
3972                        val = hdspm_tco_sync_check(hdspm); break;
3973                case 10 /* SYNC IN */:
3974                        val = hdspm_sync_in_sync_check(hdspm); break;
3975                default: /* AES1 to AES8 */
3976                         val = hdspm_aes_sync_check(hdspm,
3977                                         kcontrol->private_value-1);
3978                }
3979
3980        }
3981
3982        if (-1 == val)
3983                val = 3;
3984
3985        ucontrol->value.enumerated.item[0] = val;
3986        return 0;
3987}
3988
3989
3990
3991/**
3992 * TCO controls
3993 **/
3994static void hdspm_tco_write(struct hdspm *hdspm)
3995{
3996        unsigned int tc[4] = { 0, 0, 0, 0};
3997
3998        switch (hdspm->tco->input) {
3999        case 0:
4000                tc[2] |= HDSPM_TCO2_set_input_MSB;
4001                break;
4002        case 1:
4003                tc[2] |= HDSPM_TCO2_set_input_LSB;
4004                break;
4005        default:
4006                break;
4007        }
4008
4009        switch (hdspm->tco->framerate) {
4010        case 1:
4011                tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4012                break;
4013        case 2:
4014                tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4015                break;
4016        case 3:
4017                tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4018                        HDSPM_TCO1_set_drop_frame_flag;
4019                break;
4020        case 4:
4021                tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4022                        HDSPM_TCO1_LTC_Format_MSB;
4023                break;
4024        case 5:
4025                tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4026                        HDSPM_TCO1_LTC_Format_MSB +
4027                        HDSPM_TCO1_set_drop_frame_flag;
4028                break;
4029        default:
4030                break;
4031        }
4032
4033        switch (hdspm->tco->wordclock) {
4034        case 1:
4035                tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4036                break;
4037        case 2:
4038                tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4039                break;
4040        default:
4041                break;
4042        }
4043
4044        switch (hdspm->tco->samplerate) {
4045        case 1:
4046                tc[2] |= HDSPM_TCO2_set_freq;
4047                break;
4048        case 2:
4049                tc[2] |= HDSPM_TCO2_set_freq_from_app;
4050                break;
4051        default:
4052                break;
4053        }
4054
4055        switch (hdspm->tco->pull) {
4056        case 1:
4057                tc[2] |= HDSPM_TCO2_set_pull_up;
4058                break;
4059        case 2:
4060                tc[2] |= HDSPM_TCO2_set_pull_down;
4061                break;
4062        case 3:
4063                tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4064                break;
4065        case 4:
4066                tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4067                break;
4068        default:
4069                break;
4070        }
4071
4072        if (1 == hdspm->tco->term) {
4073                tc[2] |= HDSPM_TCO2_set_term_75R;
4074        }
4075
4076        hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4077        hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4078        hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4079        hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4080}
4081
4082
4083#define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4084{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4085        .name = xname, \
4086        .index = xindex, \
4087        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4088                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4089        .info = snd_hdspm_info_tco_sample_rate, \
4090        .get = snd_hdspm_get_tco_sample_rate, \
4091        .put = snd_hdspm_put_tco_sample_rate \
4092}
4093
4094static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4095                                          struct snd_ctl_elem_info *uinfo)
4096{
4097        static char *texts[] = { "44.1 kHz", "48 kHz" };
4098        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4099        uinfo->count = 1;
4100        uinfo->value.enumerated.items = 2;
4101
4102        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4103                uinfo->value.enumerated.item =
4104                        uinfo->value.enumerated.items - 1;
4105
4106        strcpy(uinfo->value.enumerated.name,
4107                        texts[uinfo->value.enumerated.item]);
4108
4109        return 0;
4110}
4111
4112static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4113                                      struct snd_ctl_elem_value *ucontrol)
4114{
4115        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4116
4117        ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4118
4119        return 0;
4120}
4121
4122static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4123                                         struct snd_ctl_elem_value *ucontrol)
4124{
4125        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4126
4127        if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4128                hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4129
4130                hdspm_tco_write(hdspm);
4131
4132                return 1;
4133        }
4134
4135        return 0;
4136}
4137
4138
4139#define HDSPM_TCO_PULL(xname, xindex) \
4140{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4141        .name = xname, \
4142        .index = xindex, \
4143        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4144                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4145        .info = snd_hdspm_info_tco_pull, \
4146        .get = snd_hdspm_get_tco_pull, \
4147        .put = snd_hdspm_put_tco_pull \
4148}
4149
4150static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4151                                   struct snd_ctl_elem_info *uinfo)
4152{
4153        static char *texts[] = { "0", "+ 0.1 %", "- 0.1 %", "+ 4 %", "- 4 %" };
4154        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4155        uinfo->count = 1;
4156        uinfo->value.enumerated.items = 5;
4157
4158        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4159                uinfo->value.enumerated.item =
4160                        uinfo->value.enumerated.items - 1;
4161
4162        strcpy(uinfo->value.enumerated.name,
4163                        texts[uinfo->value.enumerated.item]);
4164
4165        return 0;
4166}
4167
4168static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4169                                  struct snd_ctl_elem_value *ucontrol)
4170{
4171        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4172
4173        ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4174
4175        return 0;
4176}
4177
4178static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4179                                  struct snd_ctl_elem_value *ucontrol)
4180{
4181        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4182
4183        if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4184                hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4185
4186                hdspm_tco_write(hdspm);
4187
4188                return 1;
4189        }
4190
4191        return 0;
4192}
4193
4194#define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4195{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4196        .name = xname, \
4197        .index = xindex, \
4198        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4199                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4200        .info = snd_hdspm_info_tco_wck_conversion, \
4201        .get = snd_hdspm_get_tco_wck_conversion, \
4202        .put = snd_hdspm_put_tco_wck_conversion \
4203}
4204
4205static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4206                                             struct snd_ctl_elem_info *uinfo)
4207{
4208        static char *texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4209        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4210        uinfo->count = 1;
4211        uinfo->value.enumerated.items = 3;
4212
4213        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4214                uinfo->value.enumerated.item =
4215                        uinfo->value.enumerated.items - 1;
4216
4217        strcpy(uinfo->value.enumerated.name,
4218                        texts[uinfo->value.enumerated.item]);
4219
4220        return 0;
4221}
4222
4223static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4224                                            struct snd_ctl_elem_value *ucontrol)
4225{
4226        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4227
4228        ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4229
4230        return 0;
4231}
4232
4233static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4234                                            struct snd_ctl_elem_value *ucontrol)
4235{
4236        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4237
4238        if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4239                hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4240
4241                hdspm_tco_write(hdspm);
4242
4243                return 1;
4244        }
4245
4246        return 0;
4247}
4248
4249
4250#define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4251{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4252        .name = xname, \
4253        .index = xindex, \
4254        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4255                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4256        .info = snd_hdspm_info_tco_frame_rate, \
4257        .get = snd_hdspm_get_tco_frame_rate, \
4258        .put = snd_hdspm_put_tco_frame_rate \
4259}
4260
4261static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4262                                          struct snd_ctl_elem_info *uinfo)
4263{
4264        static char *texts[] = { "24 fps", "25 fps", "29.97fps",
4265                "29.97 dfps", "30 fps", "30 dfps" };
4266        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4267        uinfo->count = 1;
4268        uinfo->value.enumerated.items = 6;
4269
4270        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4271                uinfo->value.enumerated.item =
4272                        uinfo->value.enumerated.items - 1;
4273
4274        strcpy(uinfo->value.enumerated.name,
4275                        texts[uinfo->value.enumerated.item]);
4276
4277        return 0;
4278}
4279
4280static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4281                                        struct snd_ctl_elem_value *ucontrol)
4282{
4283        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4284
4285        ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4286
4287        return 0;
4288}
4289
4290static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4291                                        struct snd_ctl_elem_value *ucontrol)
4292{
4293        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4294
4295        if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4296                hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4297
4298                hdspm_tco_write(hdspm);
4299
4300                return 1;
4301        }
4302
4303        return 0;
4304}
4305
4306
4307#define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4308{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4309        .name = xname, \
4310        .index = xindex, \
4311        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4312                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4313        .info = snd_hdspm_info_tco_sync_source, \
4314        .get = snd_hdspm_get_tco_sync_source, \
4315        .put = snd_hdspm_put_tco_sync_source \
4316}
4317
4318static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4319                                          struct snd_ctl_elem_info *uinfo)
4320{
4321        static char *texts[] = { "LTC", "Video", "WCK" };
4322        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4323        uinfo->count = 1;
4324        uinfo->value.enumerated.items = 3;
4325
4326        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4327                uinfo->value.enumerated.item =
4328                        uinfo->value.enumerated.items - 1;
4329
4330        strcpy(uinfo->value.enumerated.name,
4331                        texts[uinfo->value.enumerated.item]);
4332
4333        return 0;
4334}
4335
4336static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4337                                         struct snd_ctl_elem_value *ucontrol)
4338{
4339        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4340
4341        ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4342
4343        return 0;
4344}
4345
4346static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4347                                         struct snd_ctl_elem_value *ucontrol)
4348{
4349        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4350
4351        if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4352                hdspm->tco->input = ucontrol->value.enumerated.item[0];
4353
4354                hdspm_tco_write(hdspm);
4355
4356                return 1;
4357        }
4358
4359        return 0;
4360}
4361
4362
4363#define HDSPM_TCO_WORD_TERM(xname, xindex) \
4364{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4365        .name = xname, \
4366        .index = xindex, \
4367        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4368                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4369        .info = snd_hdspm_info_tco_word_term, \
4370        .get = snd_hdspm_get_tco_word_term, \
4371        .put = snd_hdspm_put_tco_word_term \
4372}
4373
4374static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4375                                        struct snd_ctl_elem_info *uinfo)
4376{
4377        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4378        uinfo->count = 1;
4379        uinfo->value.integer.min = 0;
4380        uinfo->value.integer.max = 1;
4381
4382        return 0;
4383}
4384
4385
4386static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4387                                       struct snd_ctl_elem_value *ucontrol)
4388{
4389        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4390
4391        ucontrol->value.enumerated.item[0] = hdspm->tco->term;
4392
4393        return 0;
4394}
4395
4396
4397static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4398                                       struct snd_ctl_elem_value *ucontrol)
4399{
4400        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4401
4402        if (hdspm->tco->term != ucontrol->value.enumerated.item[0]) {
4403                hdspm->tco->term = ucontrol->value.enumerated.item[0];
4404
4405                hdspm_tco_write(hdspm);
4406
4407                return 1;
4408        }
4409
4410        return 0;
4411}
4412
4413
4414
4415
4416static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4417        HDSPM_MIXER("Mixer", 0),
4418        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4419        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4420        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4421        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4422        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4423        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4424        HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4425        HDSPM_SYNC_CHECK("TCO SyncCHeck", 2),
4426        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4427        HDSPM_LINE_OUT("Line Out", 0),
4428        HDSPM_TX_64("TX 64 channels mode", 0),
4429        HDSPM_C_TMS("Clear Track Marker", 0),
4430        HDSPM_SAFE_MODE("Safe Mode", 0),
4431        HDSPM_INPUT_SELECT("Input Select", 0),
4432        HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4433};
4434
4435
4436static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4437        HDSPM_MIXER("Mixer", 0),
4438        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4439        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4440        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4441        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4442        HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4443        HDSPM_TX_64("TX 64 channels mode", 0),
4444        HDSPM_C_TMS("Clear Track Marker", 0),
4445        HDSPM_SAFE_MODE("Safe Mode", 0),
4446        HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4447};
4448
4449static struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4450        HDSPM_MIXER("Mixer", 0),
4451        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4452        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4453        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4454        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4455        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4456        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4457        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4458        HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4459        HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4460        HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4461        HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4462        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4463        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4464        HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4465        HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4466        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4467        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4468        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5)
4469
4470                /*
4471                   HDSPM_INPUT_SELECT("Input Select", 0),
4472                   HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4473                   HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4474                   HDSPM_SPDIF_IN("SPDIF In", 0);
4475                   HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4476                   HDSPM_INPUT_LEVEL("Input Level", 0);
4477                   HDSPM_OUTPUT_LEVEL("Output Level", 0);
4478                   HDSPM_PHONES("Phones", 0);
4479                   */
4480};
4481
4482static struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4483        HDSPM_MIXER("Mixer", 0),
4484        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4485        HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4486        HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4487        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4488        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4489        HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4490        HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4491        HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4492        HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4493        HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4494        HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4495        HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4496        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4497        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4498        HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4499        HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4500        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4501        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4502        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4503        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4504        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4505        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8)
4506};
4507
4508static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4509        HDSPM_MIXER("Mixer", 0),
4510        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4511        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4512        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4513        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4514        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4515        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4516        HDSPM_SYNC_CHECK("WC Sync Check", 0),
4517        HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4518        HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4519        HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4520        HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4521        HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4522        HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4523        HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4524        HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4525        HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4526        HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4527        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4528        HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4529        HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4530        HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4531        HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4532        HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4533        HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4534        HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4535        HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4536        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4537        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4538        HDSPM_LINE_OUT("Line Out", 0),
4539        HDSPM_EMPHASIS("Emphasis", 0),
4540        HDSPM_DOLBY("Non Audio", 0),
4541        HDSPM_PROFESSIONAL("Professional", 0),
4542        HDSPM_C_TMS("Clear Track Marker", 0),
4543        HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4544        HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4545};
4546
4547
4548
4549/* Control elements for the optional TCO module */
4550static struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4551        HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4552        HDSPM_TCO_PULL("TCO Pull", 0),
4553        HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4554        HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4555        HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4556        HDSPM_TCO_WORD_TERM("TCO Word Term", 0)
4557};
4558
4559
4560static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4561
4562
4563static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4564{
4565        int i;
4566
4567        for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4568                if (hdspm->system_sample_rate > 48000) {
4569                        hdspm->playback_mixer_ctls[i]->vd[0].access =
4570                                SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4571                                SNDRV_CTL_ELEM_ACCESS_READ |
4572                                SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4573                } else {
4574                        hdspm->playback_mixer_ctls[i]->vd[0].access =
4575                                SNDRV_CTL_ELEM_ACCESS_READWRITE |
4576                                SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4577                }
4578                snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4579                                SNDRV_CTL_EVENT_MASK_INFO,
4580                                &hdspm->playback_mixer_ctls[i]->id);
4581        }
4582
4583        return 0;
4584}
4585
4586
4587static int snd_hdspm_create_controls(struct snd_card *card,
4588                                        struct hdspm *hdspm)
4589{
4590        unsigned int idx, limit;
4591        int err;
4592        struct snd_kcontrol *kctl;
4593        struct snd_kcontrol_new *list = NULL;
4594
4595        switch (hdspm->io_type) {
4596        case MADI:
4597                list = snd_hdspm_controls_madi;
4598                limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4599                break;
4600        case MADIface:
4601                list = snd_hdspm_controls_madiface;
4602                limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4603                break;
4604        case AIO:
4605                list = snd_hdspm_controls_aio;
4606                limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4607                break;
4608        case RayDAT:
4609                list = snd_hdspm_controls_raydat;
4610                limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4611                break;
4612        case AES32:
4613                list = snd_hdspm_controls_aes32;
4614                limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4615                break;
4616        }
4617
4618        if (NULL != list) {
4619                for (idx = 0; idx < limit; idx++) {
4620                        err = snd_ctl_add(card,
4621                                        snd_ctl_new1(&list[idx], hdspm));
4622                        if (err < 0)
4623                                return err;
4624                }
4625        }
4626
4627
4628        /* create simple 1:1 playback mixer controls */
4629        snd_hdspm_playback_mixer.name = "Chn";
4630        if (hdspm->system_sample_rate >= 128000) {
4631                limit = hdspm->qs_out_channels;
4632        } else if (hdspm->system_sample_rate >= 64000) {
4633                limit = hdspm->ds_out_channels;
4634        } else {
4635                limit = hdspm->ss_out_channels;
4636        }
4637        for (idx = 0; idx < limit; ++idx) {
4638                snd_hdspm_playback_mixer.index = idx + 1;
4639                kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4640                err = snd_ctl_add(card, kctl);
4641                if (err < 0)
4642                        return err;
4643                hdspm->playback_mixer_ctls[idx] = kctl;
4644        }
4645
4646
4647        if (hdspm->tco) {
4648                /* add tco control elements */
4649                list = snd_hdspm_controls_tco;
4650                limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4651                for (idx = 0; idx < limit; idx++) {
4652                        err = snd_ctl_add(card,
4653                                        snd_ctl_new1(&list[idx], hdspm));
4654                        if (err < 0)
4655                                return err;
4656                }
4657        }
4658
4659        return 0;
4660}
4661
4662/*------------------------------------------------------------
4663   /proc interface
4664 ------------------------------------------------------------*/
4665
4666static void
4667snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
4668                         struct snd_info_buffer *buffer)
4669{
4670        struct hdspm *hdspm = entry->private_data;
4671        unsigned int status, status2, control, freq;
4672
4673        char *pref_sync_ref;
4674        char *autosync_ref;
4675        char *system_clock_mode;
4676        char *insel;
4677        int x, x2;
4678
4679        /* TCO stuff */
4680        int a, ltc, frames, seconds, minutes, hours;
4681        unsigned int period;
4682        u64 freq_const = 0;
4683        u32 rate;
4684
4685        status = hdspm_read(hdspm, HDSPM_statusRegister);
4686        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4687        control = hdspm->control_register;
4688        freq = hdspm_read(hdspm, HDSPM_timecodeRegister);
4689
4690        snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4691                        hdspm->card_name, hdspm->card->number + 1,
4692                        hdspm->firmware_rev,
4693                        (status2 & HDSPM_version0) |
4694                        (status2 & HDSPM_version1) | (status2 &
4695                                HDSPM_version2));
4696
4697        snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4698                        (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4699                        hdspm->serial);
4700
4701        snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4702                        hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4703
4704        snd_iprintf(buffer, "--- System ---\n");
4705
4706        snd_iprintf(buffer,
4707                "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4708                status & HDSPM_audioIRQPending,
4709                (status & HDSPM_midi0IRQPending) ? 1 : 0,
4710                (status & HDSPM_midi1IRQPending) ? 1 : 0,
4711                hdspm->irq_count);
4712        snd_iprintf(buffer,
4713                "HW pointer: id = %d, rawptr = %d (%d->%d) "
4714                "estimated= %ld (bytes)\n",
4715                ((status & HDSPM_BufferID) ? 1 : 0),
4716                (status & HDSPM_BufferPositionMask),
4717                (status & HDSPM_BufferPositionMask) %
4718                (2 * (int)hdspm->period_bytes),
4719                ((status & HDSPM_BufferPositionMask) - 64) %
4720                (2 * (int)hdspm->period_bytes),
4721                (long) hdspm_hw_pointer(hdspm) * 4);
4722
4723        snd_iprintf(buffer,
4724                "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4725                hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4726                hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4727                hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4728                hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4729        snd_iprintf(buffer,
4730                "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4731                hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4732                hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4733        snd_iprintf(buffer,
4734                "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4735                "status2=0x%x\n",
4736                hdspm->control_register, hdspm->control2_register,
4737                status, status2);
4738        if (status & HDSPM_tco_detect) {
4739                snd_iprintf(buffer, "TCO module detected.\n");
4740                a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4741                if (a & HDSPM_TCO1_LTC_Input_valid) {
4742                        snd_iprintf(buffer, "  LTC valid, ");
4743                        switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4744                                                HDSPM_TCO1_LTC_Format_MSB)) {
4745                        case 0:
4746                                snd_iprintf(buffer, "24 fps, ");
4747                                break;
4748                        case HDSPM_TCO1_LTC_Format_LSB:
4749                                snd_iprintf(buffer, "25 fps, ");
4750                                break;
4751                        case HDSPM_TCO1_LTC_Format_MSB:
4752                                snd_iprintf(buffer, "29.97 fps, ");
4753                                break;
4754                        default:
4755                                snd_iprintf(buffer, "30 fps, ");
4756                                break;
4757                        }
4758                        if (a & HDSPM_TCO1_set_drop_frame_flag) {
4759                                snd_iprintf(buffer, "drop frame\n");
4760                        } else {
4761                                snd_iprintf(buffer, "full frame\n");
4762                        }
4763                } else {
4764                        snd_iprintf(buffer, "  no LTC\n");
4765                }
4766                if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4767                        snd_iprintf(buffer, "  Video: NTSC\n");
4768                } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4769                        snd_iprintf(buffer, "  Video: PAL\n");
4770                } else {
4771                        snd_iprintf(buffer, "  No video\n");
4772                }
4773                if (a & HDSPM_TCO1_TCO_lock) {
4774                        snd_iprintf(buffer, "  Sync: lock\n");
4775                } else {
4776                        snd_iprintf(buffer, "  Sync: no lock\n");
4777                }
4778
4779                switch (hdspm->io_type) {
4780                case MADI:
4781                case AES32:
4782                        freq_const = 110069313433624ULL;
4783                        break;
4784                case RayDAT:
4785                case AIO:
4786                        freq_const = 104857600000000ULL;
4787                        break;
4788                case MADIface:
4789                        break; /* no TCO possible */
4790                }
4791
4792                period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4793                snd_iprintf(buffer, "    period: %u\n", period);
4794
4795
4796                /* rate = freq_const/period; */
4797                rate = div_u64(freq_const, period);
4798
4799                if (control & HDSPM_QuadSpeed) {
4800                        rate *= 4;
4801                } else if (control & HDSPM_DoubleSpeed) {
4802                        rate *= 2;
4803                }
4804
4805                snd_iprintf(buffer, "  Frequency: %u Hz\n",
4806                                (unsigned int) rate);
4807
4808                ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4809                frames = ltc & 0xF;
4810                ltc >>= 4;
4811                frames += (ltc & 0x3) * 10;
4812                ltc >>= 4;
4813                seconds = ltc & 0xF;
4814                ltc >>= 4;
4815                seconds += (ltc & 0x7) * 10;
4816                ltc >>= 4;
4817                minutes = ltc & 0xF;
4818                ltc >>= 4;
4819                minutes += (ltc & 0x7) * 10;
4820                ltc >>= 4;
4821                hours = ltc & 0xF;
4822                ltc >>= 4;
4823                hours += (ltc & 0x3) * 10;
4824                snd_iprintf(buffer,
4825                        "  LTC In: %02d:%02d:%02d:%02d\n",
4826                        hours, minutes, seconds, frames);
4827
4828        } else {
4829                snd_iprintf(buffer, "No TCO module detected.\n");
4830        }
4831
4832        snd_iprintf(buffer, "--- Settings ---\n");
4833
4834        x = hdspm_get_latency(hdspm);
4835
4836        snd_iprintf(buffer,
4837                "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4838                x, (unsigned long) hdspm->period_bytes);
4839
4840        snd_iprintf(buffer, "Line out: %s\n",
4841                (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4842
4843        switch (hdspm->control_register & HDSPM_InputMask) {
4844        case HDSPM_InputOptical:
4845                insel = "Optical";
4846                break;
4847        case HDSPM_InputCoaxial:
4848                insel = "Coaxial";
4849                break;
4850        default:
4851                insel = "Unkown";
4852        }
4853
4854        snd_iprintf(buffer,
4855                "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4856                "Auto Input %s\n",
4857                (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4858                (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4859                (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4860
4861
4862        if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4863                system_clock_mode = "AutoSync";
4864        else
4865                system_clock_mode = "Master";
4866        snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4867
4868        switch (hdspm_pref_sync_ref(hdspm)) {
4869        case HDSPM_SYNC_FROM_WORD:
4870                pref_sync_ref = "Word Clock";
4871                break;
4872        case HDSPM_SYNC_FROM_MADI:
4873                pref_sync_ref = "MADI Sync";
4874                break;
4875        case HDSPM_SYNC_FROM_TCO:
4876                pref_sync_ref = "TCO";
4877                break;
4878        case HDSPM_SYNC_FROM_SYNC_IN:
4879                pref_sync_ref = "Sync In";
4880                break;
4881        default:
4882                pref_sync_ref = "XXXX Clock";
4883                break;
4884        }
4885        snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4886                        pref_sync_ref);
4887
4888        snd_iprintf(buffer, "System Clock Frequency: %d\n",
4889                        hdspm->system_sample_rate);
4890
4891
4892        snd_iprintf(buffer, "--- Status:\n");
4893
4894        x = status & HDSPM_madiSync;
4895        x2 = status2 & HDSPM_wcSync;
4896
4897        snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4898                        (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4899                        "NoLock",
4900                        (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4901                        "NoLock");
4902
4903        switch (hdspm_autosync_ref(hdspm)) {
4904        case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4905                autosync_ref = "Sync In";
4906                break;
4907        case HDSPM_AUTOSYNC_FROM_TCO:
4908                autosync_ref = "TCO";
4909                break;
4910        case HDSPM_AUTOSYNC_FROM_WORD:
4911                autosync_ref = "Word Clock";
4912                break;
4913        case HDSPM_AUTOSYNC_FROM_MADI:
4914                autosync_ref = "MADI Sync";
4915                break;
4916        case HDSPM_AUTOSYNC_FROM_NONE:
4917                autosync_ref = "Input not valid";
4918                break;
4919        default:
4920                autosync_ref = "---";
4921                break;
4922        }
4923        snd_iprintf(buffer,
4924                "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
4925                autosync_ref, hdspm_external_sample_rate(hdspm),
4926                (status & HDSPM_madiFreqMask) >> 22,
4927                (status2 & HDSPM_wcFreqMask) >> 5);
4928
4929        snd_iprintf(buffer, "Input: %s, Mode=%s\n",
4930                (status & HDSPM_AB_int) ? "Coax" : "Optical",
4931                (status & HDSPM_RX_64ch) ? "64 channels" :
4932                "56 channels");
4933
4934        snd_iprintf(buffer, "\n");
4935}
4936
4937static void
4938snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
4939                          struct snd_info_buffer *buffer)
4940{
4941        struct hdspm *hdspm = entry->private_data;
4942        unsigned int status;
4943        unsigned int status2;
4944        unsigned int timecode;
4945        int pref_syncref;
4946        char *autosync_ref;
4947        int x;
4948
4949        status = hdspm_read(hdspm, HDSPM_statusRegister);
4950        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4951        timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
4952
4953        snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
4954                    hdspm->card_name, hdspm->card->number + 1,
4955                    hdspm->firmware_rev);
4956
4957        snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4958                    hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4959
4960        snd_iprintf(buffer, "--- System ---\n");
4961
4962        snd_iprintf(buffer,
4963                    "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4964                    status & HDSPM_audioIRQPending,
4965                    (status & HDSPM_midi0IRQPending) ? 1 : 0,
4966                    (status & HDSPM_midi1IRQPending) ? 1 : 0,
4967                    hdspm->irq_count);
4968        snd_iprintf(buffer,
4969                    "HW pointer: id = %d, rawptr = %d (%d->%d) "
4970                    "estimated= %ld (bytes)\n",
4971                    ((status & HDSPM_BufferID) ? 1 : 0),
4972                    (status & HDSPM_BufferPositionMask),
4973                    (status & HDSPM_BufferPositionMask) %
4974                    (2 * (int)hdspm->period_bytes),
4975                    ((status & HDSPM_BufferPositionMask) - 64) %
4976                    (2 * (int)hdspm->period_bytes),
4977                    (long) hdspm_hw_pointer(hdspm) * 4);
4978
4979        snd_iprintf(buffer,
4980                    "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4981                    hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4982                    hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4983                    hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4984                    hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4985        snd_iprintf(buffer,
4986                    "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4987                    hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4988                    hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4989        snd_iprintf(buffer,
4990                    "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4991                    "status2=0x%x\n",
4992                    hdspm->control_register, hdspm->control2_register,
4993                    status, status2);
4994
4995        snd_iprintf(buffer, "--- Settings ---\n");
4996
4997        x = hdspm_get_latency(hdspm);
4998
4999        snd_iprintf(buffer,
5000                    "Size (Latency): %d samples (2 periods of %lu bytes)\n",
5001                    x, (unsigned long) hdspm->period_bytes);
5002
5003        snd_iprintf(buffer, "Line out: %s\n",
5004                    (hdspm->
5005                     control_register & HDSPM_LineOut) ? "on " : "off");
5006
5007        snd_iprintf(buffer,
5008                    "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5009                    (hdspm->
5010                     control_register & HDSPM_clr_tms) ? "on" : "off",
5011                    (hdspm->
5012                     control_register & HDSPM_Emphasis) ? "on" : "off",
5013                    (hdspm->
5014                     control_register & HDSPM_Dolby) ? "on" : "off");
5015
5016
5017        pref_syncref = hdspm_pref_sync_ref(hdspm);
5018        if (pref_syncref == 0)
5019                snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5020        else
5021                snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5022                                pref_syncref);
5023
5024        snd_iprintf(buffer, "System Clock Frequency: %d\n",
5025                    hdspm->system_sample_rate);
5026
5027        snd_iprintf(buffer, "Double speed: %s\n",
5028                        hdspm->control_register & HDSPM_DS_DoubleWire?
5029                        "Double wire" : "Single wire");
5030        snd_iprintf(buffer, "Quad speed: %s\n",
5031                        hdspm->control_register & HDSPM_QS_DoubleWire?
5032                        "Double wire" :
5033                        hdspm->control_register & HDSPM_QS_QuadWire?
5034                        "Quad wire" : "Single wire");
5035
5036        snd_iprintf(buffer, "--- Status:\n");
5037
5038        snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
5039                    (status & HDSPM_AES32_wcLock) ? "Sync   " : "No Lock",
5040                    HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5041
5042        for (x = 0; x < 8; x++) {
5043                snd_iprintf(buffer, "AES%d: %s  Frequency: %d\n",
5044                            x+1,
5045                            (status2 & (HDSPM_LockAES >> x)) ?
5046                            "Sync   " : "No Lock",
5047                            HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5048        }
5049
5050        switch (hdspm_autosync_ref(hdspm)) {
5051        case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5052                autosync_ref = "None"; break;
5053        case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5054                autosync_ref = "Word Clock"; break;
5055        case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5056                autosync_ref = "AES1"; break;
5057        case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5058                autosync_ref = "AES2"; break;
5059        case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5060                autosync_ref = "AES3"; break;
5061        case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5062                autosync_ref = "AES4"; break;
5063        case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5064                autosync_ref = "AES5"; break;
5065        case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5066                autosync_ref = "AES6"; break;
5067        case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5068                autosync_ref = "AES7"; break;
5069        case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5070                autosync_ref = "AES8"; break;
5071        default:
5072                autosync_ref = "---"; break;
5073        }
5074        snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5075
5076        snd_iprintf(buffer, "\n");
5077}
5078
5079static void
5080snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5081                         struct snd_info_buffer *buffer)
5082{
5083        struct hdspm *hdspm = entry->private_data;
5084        unsigned int status1, status2, status3, control, i;
5085        unsigned int lock, sync;
5086
5087        status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5088        status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5089        status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5090
5091        control = hdspm->control_register;
5092
5093        snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5094        snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5095        snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5096
5097
5098        snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5099
5100        snd_iprintf(buffer, "Clock mode      : %s\n",
5101                (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5102        snd_iprintf(buffer, "System frequency: %d Hz\n",
5103                hdspm_get_system_sample_rate(hdspm));
5104
5105        snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5106
5107        lock = 0x1;
5108        sync = 0x100;
5109
5110        for (i = 0; i < 8; i++) {
5111                snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5112                                i,
5113                                (status1 & lock) ? 1 : 0,
5114                                (status1 & sync) ? 1 : 0,
5115                                texts_freq[(status2 >> (i * 4)) & 0xF]);
5116
5117                lock = lock<<1;
5118                sync = sync<<1;
5119        }
5120
5121        snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5122                        (status1 & 0x1000000) ? 1 : 0,
5123                        (status1 & 0x2000000) ? 1 : 0,
5124                        texts_freq[(status1 >> 16) & 0xF]);
5125
5126        snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5127                        (status1 & 0x4000000) ? 1 : 0,
5128                        (status1 & 0x8000000) ? 1 : 0,
5129                        texts_freq[(status1 >> 20) & 0xF]);
5130
5131        snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5132                        (status3 & 0x400) ? 1 : 0,
5133                        (status3 & 0x800) ? 1 : 0,
5134                        texts_freq[(status2 >> 12) & 0xF]);
5135
5136}
5137
5138#ifdef CONFIG_SND_DEBUG
5139static void
5140snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5141                          struct snd_info_buffer *buffer)
5142{
5143        struct hdspm *hdspm = entry->private_data;
5144
5145        int j,i;
5146
5147        for (i = 0; i < 256 /* 1024*64 */; i += j) {
5148                snd_iprintf(buffer, "0x%08X: ", i);
5149                for (j = 0; j < 16; j += 4)
5150                        snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5151                snd_iprintf(buffer, "\n");
5152        }
5153}
5154#endif
5155
5156
5157static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5158                          struct snd_info_buffer *buffer)
5159{
5160        struct hdspm *hdspm = entry->private_data;
5161        int i;
5162
5163        snd_iprintf(buffer, "# generated by hdspm\n");
5164
5165        for (i = 0; i < hdspm->max_channels_in; i++) {
5166                snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5167        }
5168}
5169
5170static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5171                          struct snd_info_buffer *buffer)
5172{
5173        struct hdspm *hdspm = entry->private_data;
5174        int i;
5175
5176        snd_iprintf(buffer, "# generated by hdspm\n");
5177
5178        for (i = 0; i < hdspm->max_channels_out; i++) {
5179                snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5180        }
5181}
5182
5183
5184static void __devinit snd_hdspm_proc_init(struct hdspm *hdspm)
5185{
5186        struct snd_info_entry *entry;
5187
5188        if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) {
5189                switch (hdspm->io_type) {
5190                case AES32:
5191                        snd_info_set_text_ops(entry, hdspm,
5192                                        snd_hdspm_proc_read_aes32);
5193                        break;
5194                case MADI:
5195                        snd_info_set_text_ops(entry, hdspm,
5196                                        snd_hdspm_proc_read_madi);
5197                        break;
5198                case MADIface:
5199                        /* snd_info_set_text_ops(entry, hdspm,
5200                         snd_hdspm_proc_read_madiface); */
5201                        break;
5202                case RayDAT:
5203                        snd_info_set_text_ops(entry, hdspm,
5204                                        snd_hdspm_proc_read_raydat);
5205                        break;
5206                case AIO:
5207                        break;
5208                }
5209        }
5210
5211        if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) {
5212                snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in);
5213        }
5214
5215        if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) {
5216                snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out);
5217        }
5218
5219#ifdef CONFIG_SND_DEBUG
5220        /* debug file to read all hdspm registers */
5221        if (!snd_card_proc_new(hdspm->card, "debug", &entry))
5222                snd_info_set_text_ops(entry, hdspm,
5223                                snd_hdspm_proc_read_debug);
5224#endif
5225}
5226
5227/*------------------------------------------------------------
5228   hdspm intitialize
5229 ------------------------------------------------------------*/
5230
5231static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5232{
5233        /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5234           hold it (e.g. during module initialization).
5235           */
5236
5237        /* set defaults:       */
5238
5239        hdspm->settings_register = 0;
5240
5241        switch (hdspm->io_type) {
5242        case MADI:
5243        case MADIface:
5244                hdspm->control_register =
5245                        0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5246                break;
5247
5248        case RayDAT:
5249        case AIO:
5250                hdspm->settings_register = 0x1 + 0x1000;
5251                /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5252                 * line_out */
5253                hdspm->control_register =
5254                        0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5255                break;
5256
5257        case AES32:
5258                hdspm->control_register =
5259                        HDSPM_ClockModeMaster | /* Master Cloack Mode on */
5260                        hdspm_encode_latency(7) | /* latency max=8192samples */
5261                        HDSPM_SyncRef0 |        /* AES1 is syncclock */
5262                        HDSPM_LineOut | /* Analog output in */
5263                        HDSPM_Professional;  /* Professional mode */
5264                break;
5265        }
5266
5267        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5268
5269        if (AES32 == hdspm->io_type) {
5270                /* No control2 register for AES32 */
5271#ifdef SNDRV_BIG_ENDIAN
5272                hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5273#else
5274                hdspm->control2_register = 0;
5275#endif
5276
5277                hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5278        }
5279        hdspm_compute_period_size(hdspm);
5280
5281        /* silence everything */
5282
5283        all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5284
5285        if (hdspm->io_type == AIO || hdspm->io_type == RayDAT) {
5286                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5287        }
5288
5289        /* set a default rate so that the channel map is set up. */
5290        hdspm_set_rate(hdspm, 48000, 1);
5291
5292        return 0;
5293}
5294
5295
5296/*------------------------------------------------------------
5297   interrupt
5298 ------------------------------------------------------------*/
5299
5300static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5301{
5302        struct hdspm *hdspm = (struct hdspm *) dev_id;
5303        unsigned int status;
5304        int i, audio, midi, schedule = 0;
5305        /* cycles_t now; */
5306
5307        status = hdspm_read(hdspm, HDSPM_statusRegister);
5308
5309        audio = status & HDSPM_audioIRQPending;
5310        midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5311                        HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5312
5313        /* now = get_cycles(); */
5314        /**
5315         *   LAT_2..LAT_0 period  counter (win)  counter (mac)
5316         *          6       4096   ~256053425     ~514672358
5317         *          5       2048   ~128024983     ~257373821
5318         *          4       1024    ~64023706     ~128718089
5319         *          3        512    ~32005945      ~64385999
5320         *          2        256    ~16003039      ~32260176
5321         *          1        128     ~7998738      ~16194507
5322         *          0         64     ~3998231       ~8191558
5323         **/
5324        /*
5325           snd_printk(KERN_INFO "snd_hdspm_interrupt %llu @ %llx\n",
5326           now-hdspm->last_interrupt, status & 0xFFC0);
5327           hdspm->last_interrupt = now;
5328        */
5329
5330        if (!audio && !midi)
5331                return IRQ_NONE;
5332
5333        hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5334        hdspm->irq_count++;
5335
5336
5337        if (audio) {
5338                if (hdspm->capture_substream)
5339                        snd_pcm_period_elapsed(hdspm->capture_substream);
5340
5341                if (hdspm->playback_substream)
5342                        snd_pcm_period_elapsed(hdspm->playback_substream);
5343        }
5344
5345        if (midi) {
5346                i = 0;
5347                while (i < hdspm->midiPorts) {
5348                        if ((hdspm_read(hdspm,
5349                                hdspm->midi[i].statusIn) & 0xff) &&
5350                                        (status & hdspm->midi[i].irq)) {
5351                                /* we disable interrupts for this input until
5352                                 * processing is done
5353                                 */
5354                                hdspm->control_register &= ~hdspm->midi[i].ie;
5355                                hdspm_write(hdspm, HDSPM_controlRegister,
5356                                                hdspm->control_register);
5357                                hdspm->midi[i].pending = 1;
5358                                schedule = 1;
5359                        }
5360
5361                        i++;
5362                }
5363
5364                if (schedule)
5365                        tasklet_hi_schedule(&hdspm->midi_tasklet);
5366        }
5367
5368        return IRQ_HANDLED;
5369}
5370
5371/*------------------------------------------------------------
5372   pcm interface
5373  ------------------------------------------------------------*/
5374
5375
5376static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5377                                              *substream)
5378{
5379        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5380        return hdspm_hw_pointer(hdspm);
5381}
5382
5383
5384static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5385{
5386        struct snd_pcm_runtime *runtime = substream->runtime;
5387        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5388        struct snd_pcm_substream *other;
5389
5390        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5391                other = hdspm->capture_substream;
5392        else
5393                other = hdspm->playback_substream;
5394
5395        if (hdspm->running)
5396                runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5397        else
5398                runtime->status->hw_ptr = 0;
5399        if (other) {
5400                struct snd_pcm_substream *s;
5401                struct snd_pcm_runtime *oruntime = other->runtime;
5402                snd_pcm_group_for_each_entry(s, substream) {
5403                        if (s == other) {
5404                                oruntime->status->hw_ptr =
5405                                        runtime->status->hw_ptr;
5406                                break;
5407                        }
5408                }
5409        }
5410        return 0;
5411}
5412
5413static int snd_hdspm_hw_params(struct snd_pcm_substream *substream,
5414                               struct snd_pcm_hw_params *params)
5415{
5416        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5417        int err;
5418        int i;
5419        pid_t this_pid;
5420        pid_t other_pid;
5421
5422        spin_lock_irq(&hdspm->lock);
5423
5424        if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5425                this_pid = hdspm->playback_pid;
5426                other_pid = hdspm->capture_pid;
5427        } else {
5428                this_pid = hdspm->capture_pid;
5429                other_pid = hdspm->playback_pid;
5430        }
5431
5432        if (other_pid > 0 && this_pid != other_pid) {
5433
5434                /* The other stream is open, and not by the same
5435                   task as this one. Make sure that the parameters
5436                   that matter are the same.
5437                   */
5438
5439                if (params_rate(params) != hdspm->system_sample_rate) {
5440                        spin_unlock_irq(&hdspm->lock);
5441                        _snd_pcm_hw_param_setempty(params,
5442                                        SNDRV_PCM_HW_PARAM_RATE);
5443                        return -EBUSY;
5444                }
5445
5446                if (params_period_size(params) != hdspm->period_bytes / 4) {
5447                        spin_unlock_irq(&hdspm->lock);
5448                        _snd_pcm_hw_param_setempty(params,
5449                                        SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5450                        return -EBUSY;
5451                }
5452
5453        }
5454        /* We're fine. */
5455        spin_unlock_irq(&hdspm->lock);
5456
5457        /* how to make sure that the rate matches an externally-set one ?   */
5458
5459        spin_lock_irq(&hdspm->lock);
5460        err = hdspm_set_rate(hdspm, params_rate(params), 0);
5461        if (err < 0) {
5462                snd_printk(KERN_INFO "err on hdspm_set_rate: %d\n", err);
5463                spin_unlock_irq(&hdspm->lock);
5464                _snd_pcm_hw_param_setempty(params,
5465                                SNDRV_PCM_HW_PARAM_RATE);
5466                return err;
5467        }
5468        spin_unlock_irq(&hdspm->lock);
5469
5470        err = hdspm_set_interrupt_interval(hdspm,
5471                        params_period_size(params));
5472        if (err < 0) {
5473                snd_printk(KERN_INFO "err on hdspm_set_interrupt_interval: %d\n", err);
5474                _snd_pcm_hw_param_setempty(params,
5475                                SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5476                return err;
5477        }
5478
5479        /* Memory allocation, takashi's method, dont know if we should
5480         * spinlock
5481         */
5482        /* malloc all buffer even if not enabled to get sure */
5483        /* Update for MADI rev 204: we need to allocate for all channels,
5484         * otherwise it doesn't work at 96kHz */
5485
5486        err =
5487                snd_pcm_lib_malloc_pages(substream, HDSPM_DMA_AREA_BYTES);
5488        if (err < 0) {
5489                snd_printk(KERN_INFO "err on snd_pcm_lib_malloc_pages: %d\n", err);
5490                return err;
5491        }
5492
5493        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5494
5495                hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferOut,
5496                                params_channels(params));
5497
5498                for (i = 0; i < params_channels(params); ++i)
5499                        snd_hdspm_enable_out(hdspm, i, 1);
5500
5501                hdspm->playback_buffer =
5502                        (unsigned char *) substream->runtime->dma_area;
5503                snd_printdd("Allocated sample buffer for playback at %p\n",
5504                                hdspm->playback_buffer);
5505        } else {
5506                hdspm_set_sgbuf(hdspm, substream, HDSPM_pageAddressBufferIn,
5507                                params_channels(params));
5508
5509                for (i = 0; i < params_channels(params); ++i)
5510                        snd_hdspm_enable_in(hdspm, i, 1);
5511
5512                hdspm->capture_buffer =
5513                        (unsigned char *) substream->runtime->dma_area;
5514                snd_printdd("Allocated sample buffer for capture at %p\n",
5515                                hdspm->capture_buffer);
5516        }
5517
5518        /*
5519           snd_printdd("Allocated sample buffer for %s at 0x%08X\n",
5520           substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5521           "playback" : "capture",
5522           snd_pcm_sgbuf_get_addr(substream, 0));
5523           */
5524        /*
5525           snd_printdd("set_hwparams: %s %d Hz, %d channels, bs = %d\n",
5526           substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
5527           "playback" : "capture",
5528           params_rate(params), params_channels(params),
5529           params_buffer_size(params));
5530           */
5531
5532
5533        /* Switch to native float format if requested */
5534        if (SNDRV_PCM_FORMAT_FLOAT_LE == params_format(params)) {
5535                if (!(hdspm->control_register & HDSPe_FLOAT_FORMAT))
5536                        snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE float format.\n");
5537
5538                hdspm->control_register |= HDSPe_FLOAT_FORMAT;
5539        } else if (SNDRV_PCM_FORMAT_S32_LE == params_format(params)) {
5540                if (hdspm->control_register & HDSPe_FLOAT_FORMAT)
5541                        snd_printk(KERN_INFO "hdspm: Switching to native 32bit LE integer format.\n");
5542
5543                hdspm->control_register &= ~HDSPe_FLOAT_FORMAT;
5544        }
5545        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5546
5547        return 0;
5548}
5549
5550static int snd_hdspm_hw_free(struct snd_pcm_substream *substream)
5551{
5552        int i;
5553        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5554
5555        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5556
5557                /* params_channels(params) should be enough,
5558                   but to get sure in case of error */
5559                for (i = 0; i < hdspm->max_channels_out; ++i)
5560                        snd_hdspm_enable_out(hdspm, i, 0);
5561
5562                hdspm->playback_buffer = NULL;
5563        } else {
5564                for (i = 0; i < hdspm->max_channels_in; ++i)
5565                        snd_hdspm_enable_in(hdspm, i, 0);
5566
5567                hdspm->capture_buffer = NULL;
5568
5569        }
5570
5571        snd_pcm_lib_free_pages(substream);
5572
5573        return 0;
5574}
5575
5576
5577static int snd_hdspm_channel_info(struct snd_pcm_substream *substream,
5578                struct snd_pcm_channel_info *info)
5579{
5580        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5581
5582        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5583                if (snd_BUG_ON(info->channel >= hdspm->max_channels_out)) {
5584                        snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel out of range (%d)\n", info->channel);
5585                        return -EINVAL;
5586                }
5587
5588                if (hdspm->channel_map_out[info->channel] < 0) {
5589                        snd_printk(KERN_INFO "snd_hdspm_channel_info: output channel %d mapped out\n", info->channel);
5590                        return -EINVAL;
5591                }
5592
5593                info->offset = hdspm->channel_map_out[info->channel] *
5594                        HDSPM_CHANNEL_BUFFER_BYTES;
5595        } else {
5596                if (snd_BUG_ON(info->channel >= hdspm->max_channels_in)) {
5597                        snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel out of range (%d)\n", info->channel);
5598                        return -EINVAL;
5599                }
5600
5601                if (hdspm->channel_map_in[info->channel] < 0) {
5602                        snd_printk(KERN_INFO "snd_hdspm_channel_info: input channel %d mapped out\n", info->channel);
5603                        return -EINVAL;
5604                }
5605
5606                info->offset = hdspm->channel_map_in[info->channel] *
5607                        HDSPM_CHANNEL_BUFFER_BYTES;
5608        }
5609
5610        info->first = 0;
5611        info->step = 32;
5612        return 0;
5613}
5614
5615
5616static int snd_hdspm_ioctl(struct snd_pcm_substream *substream,
5617                unsigned int cmd, void *arg)
5618{
5619        switch (cmd) {
5620        case SNDRV_PCM_IOCTL1_RESET:
5621                return snd_hdspm_reset(substream);
5622
5623        case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
5624                {
5625                        struct snd_pcm_channel_info *info = arg;
5626                        return snd_hdspm_channel_info(substream, info);
5627                }
5628        default:
5629                break;
5630        }
5631
5632        return snd_pcm_lib_ioctl(substream, cmd, arg);
5633}
5634
5635static int snd_hdspm_trigger(struct snd_pcm_substream *substream, int cmd)
5636{
5637        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5638        struct snd_pcm_substream *other;
5639        int running;
5640
5641        spin_lock(&hdspm->lock);
5642        running = hdspm->running;
5643        switch (cmd) {
5644        case SNDRV_PCM_TRIGGER_START:
5645                running |= 1 << substream->stream;
5646                break;
5647        case SNDRV_PCM_TRIGGER_STOP:
5648                running &= ~(1 << substream->stream);
5649                break;
5650        default:
5651                snd_BUG();
5652                spin_unlock(&hdspm->lock);
5653                return -EINVAL;
5654        }
5655        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5656                other = hdspm->capture_substream;
5657        else
5658                other = hdspm->playback_substream;
5659
5660        if (other) {
5661                struct snd_pcm_substream *s;
5662                snd_pcm_group_for_each_entry(s, substream) {
5663                        if (s == other) {
5664                                snd_pcm_trigger_done(s, substream);
5665                                if (cmd == SNDRV_PCM_TRIGGER_START)
5666                                        running |= 1 << s->stream;
5667                                else
5668                                        running &= ~(1 << s->stream);
5669                                goto _ok;
5670                        }
5671                }
5672                if (cmd == SNDRV_PCM_TRIGGER_START) {
5673                        if (!(running & (1 << SNDRV_PCM_STREAM_PLAYBACK))
5674                                        && substream->stream ==
5675                                        SNDRV_PCM_STREAM_CAPTURE)
5676                                hdspm_silence_playback(hdspm);
5677                } else {
5678                        if (running &&
5679                                substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5680                                hdspm_silence_playback(hdspm);
5681                }
5682        } else {
5683                if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
5684                        hdspm_silence_playback(hdspm);
5685        }
5686_ok:
5687        snd_pcm_trigger_done(substream, substream);
5688        if (!hdspm->running && running)
5689                hdspm_start_audio(hdspm);
5690        else if (hdspm->running && !running)
5691                hdspm_stop_audio(hdspm);
5692        hdspm->running = running;
5693        spin_unlock(&hdspm->lock);
5694
5695        return 0;
5696}
5697
5698static int snd_hdspm_prepare(struct snd_pcm_substream *substream)
5699{
5700        return 0;
5701}
5702
5703static struct snd_pcm_hardware snd_hdspm_playback_subinfo = {
5704        .info = (SNDRV_PCM_INFO_MMAP |
5705                 SNDRV_PCM_INFO_MMAP_VALID |
5706                 SNDRV_PCM_INFO_NONINTERLEAVED |
5707                 SNDRV_PCM_INFO_SYNC_START | SNDRV_PCM_INFO_DOUBLE),
5708        .formats = SNDRV_PCM_FMTBIT_S32_LE,
5709        .rates = (SNDRV_PCM_RATE_32000 |
5710                  SNDRV_PCM_RATE_44100 |
5711                  SNDRV_PCM_RATE_48000 |
5712                  SNDRV_PCM_RATE_64000 |
5713                  SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5714                  SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 ),
5715        .rate_min = 32000,
5716        .rate_max = 192000,
5717        .channels_min = 1,
5718        .channels_max = HDSPM_MAX_CHANNELS,
5719        .buffer_bytes_max =
5720            HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5721        .period_bytes_min = (32 * 4),
5722        .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5723        .periods_min = 2,
5724        .periods_max = 512,
5725        .fifo_size = 0
5726};
5727
5728static struct snd_pcm_hardware snd_hdspm_capture_subinfo = {
5729        .info = (SNDRV_PCM_INFO_MMAP |
5730                 SNDRV_PCM_INFO_MMAP_VALID |
5731                 SNDRV_PCM_INFO_NONINTERLEAVED |
5732                 SNDRV_PCM_INFO_SYNC_START),
5733        .formats = SNDRV_PCM_FMTBIT_S32_LE,
5734        .rates = (SNDRV_PCM_RATE_32000 |
5735                  SNDRV_PCM_RATE_44100 |
5736                  SNDRV_PCM_RATE_48000 |
5737                  SNDRV_PCM_RATE_64000 |
5738                  SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
5739                  SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000),
5740        .rate_min = 32000,
5741        .rate_max = 192000,
5742        .channels_min = 1,
5743        .channels_max = HDSPM_MAX_CHANNELS,
5744        .buffer_bytes_max =
5745            HDSPM_CHANNEL_BUFFER_BYTES * HDSPM_MAX_CHANNELS,
5746        .period_bytes_min = (32 * 4),
5747        .period_bytes_max = (8192 * 4) * HDSPM_MAX_CHANNELS,
5748        .periods_min = 2,
5749        .periods_max = 512,
5750        .fifo_size = 0
5751};
5752
5753static int snd_hdspm_hw_rule_in_channels_rate(struct snd_pcm_hw_params *params,
5754                                           struct snd_pcm_hw_rule *rule)
5755{
5756        struct hdspm *hdspm = rule->private;
5757        struct snd_interval *c =
5758            hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5759        struct snd_interval *r =
5760            hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5761
5762        if (r->min > 96000 && r->max <= 192000) {
5763                struct snd_interval t = {
5764                        .min = hdspm->qs_in_channels,
5765                        .max = hdspm->qs_in_channels,
5766                        .integer = 1,
5767                };
5768                return snd_interval_refine(c, &t);
5769        } else if (r->min > 48000 && r->max <= 96000) {
5770                struct snd_interval t = {
5771                        .min = hdspm->ds_in_channels,
5772                        .max = hdspm->ds_in_channels,
5773                        .integer = 1,
5774                };
5775                return snd_interval_refine(c, &t);
5776        } else if (r->max < 64000) {
5777                struct snd_interval t = {
5778                        .min = hdspm->ss_in_channels,
5779                        .max = hdspm->ss_in_channels,
5780                        .integer = 1,
5781                };
5782                return snd_interval_refine(c, &t);
5783        }
5784
5785        return 0;
5786}
5787
5788static int snd_hdspm_hw_rule_out_channels_rate(struct snd_pcm_hw_params *params,
5789                                           struct snd_pcm_hw_rule * rule)
5790{
5791        struct hdspm *hdspm = rule->private;
5792        struct snd_interval *c =
5793            hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5794        struct snd_interval *r =
5795            hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5796
5797        if (r->min > 96000 && r->max <= 192000) {
5798                struct snd_interval t = {
5799                        .min = hdspm->qs_out_channels,
5800                        .max = hdspm->qs_out_channels,
5801                        .integer = 1,
5802                };
5803                return snd_interval_refine(c, &t);
5804        } else if (r->min > 48000 && r->max <= 96000) {
5805                struct snd_interval t = {
5806                        .min = hdspm->ds_out_channels,
5807                        .max = hdspm->ds_out_channels,
5808                        .integer = 1,
5809                };
5810                return snd_interval_refine(c, &t);
5811        } else if (r->max < 64000) {
5812                struct snd_interval t = {
5813                        .min = hdspm->ss_out_channels,
5814                        .max = hdspm->ss_out_channels,
5815                        .integer = 1,
5816                };
5817                return snd_interval_refine(c, &t);
5818        } else {
5819        }
5820        return 0;
5821}
5822
5823static int snd_hdspm_hw_rule_rate_in_channels(struct snd_pcm_hw_params *params,
5824                                           struct snd_pcm_hw_rule * rule)
5825{
5826        struct hdspm *hdspm = rule->private;
5827        struct snd_interval *c =
5828            hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5829        struct snd_interval *r =
5830            hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5831
5832        if (c->min >= hdspm->ss_in_channels) {
5833                struct snd_interval t = {
5834                        .min = 32000,
5835                        .max = 48000,
5836                        .integer = 1,
5837                };
5838                return snd_interval_refine(r, &t);
5839        } else if (c->max <= hdspm->qs_in_channels) {
5840                struct snd_interval t = {
5841                        .min = 128000,
5842                        .max = 192000,
5843                        .integer = 1,
5844                };
5845                return snd_interval_refine(r, &t);
5846        } else if (c->max <= hdspm->ds_in_channels) {
5847                struct snd_interval t = {
5848                        .min = 64000,
5849                        .max = 96000,
5850                        .integer = 1,
5851                };
5852                return snd_interval_refine(r, &t);
5853        }
5854
5855        return 0;
5856}
5857static int snd_hdspm_hw_rule_rate_out_channels(struct snd_pcm_hw_params *params,
5858                                           struct snd_pcm_hw_rule *rule)
5859{
5860        struct hdspm *hdspm = rule->private;
5861        struct snd_interval *c =
5862            hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
5863        struct snd_interval *r =
5864            hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
5865
5866        if (c->min >= hdspm->ss_out_channels) {
5867                struct snd_interval t = {
5868                        .min = 32000,
5869                        .max = 48000,
5870                        .integer = 1,
5871                };
5872                return snd_interval_refine(r, &t);
5873        } else if (c->max <= hdspm->qs_out_channels) {
5874                struct snd_interval t = {
5875                        .min = 128000,
5876                        .max = 192000,
5877                        .integer = 1,
5878                };
5879                return snd_interval_refine(r, &t);
5880        } else if (c->max <= hdspm->ds_out_channels) {
5881                struct snd_interval t = {
5882                        .min = 64000,
5883                        .max = 96000,
5884                        .integer = 1,
5885                };
5886                return snd_interval_refine(r, &t);
5887        }
5888
5889        return 0;
5890}
5891
5892static int snd_hdspm_hw_rule_in_channels(struct snd_pcm_hw_params *params,
5893                                      struct snd_pcm_hw_rule *rule)
5894{
5895        unsigned int list[3];
5896        struct hdspm *hdspm = rule->private;
5897        struct snd_interval *c = hw_param_interval(params,
5898                        SNDRV_PCM_HW_PARAM_CHANNELS);
5899
5900        list[0] = hdspm->qs_in_channels;
5901        list[1] = hdspm->ds_in_channels;
5902        list[2] = hdspm->ss_in_channels;
5903        return snd_interval_list(c, 3, list, 0);
5904}
5905
5906static int snd_hdspm_hw_rule_out_channels(struct snd_pcm_hw_params *params,
5907                                      struct snd_pcm_hw_rule *rule)
5908{
5909        unsigned int list[3];
5910        struct hdspm *hdspm = rule->private;
5911        struct snd_interval *c = hw_param_interval(params,
5912                        SNDRV_PCM_HW_PARAM_CHANNELS);
5913
5914        list[0] = hdspm->qs_out_channels;
5915        list[1] = hdspm->ds_out_channels;
5916        list[2] = hdspm->ss_out_channels;
5917        return snd_interval_list(c, 3, list, 0);
5918}
5919
5920
5921static unsigned int hdspm_aes32_sample_rates[] = {
5922        32000, 44100, 48000, 64000, 88200, 96000, 128000, 176400, 192000
5923};
5924
5925static struct snd_pcm_hw_constraint_list
5926hdspm_hw_constraints_aes32_sample_rates = {
5927        .count = ARRAY_SIZE(hdspm_aes32_sample_rates),
5928        .list = hdspm_aes32_sample_rates,
5929        .mask = 0
5930};
5931
5932static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
5933{
5934        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5935        struct snd_pcm_runtime *runtime = substream->runtime;
5936
5937        spin_lock_irq(&hdspm->lock);
5938
5939        snd_pcm_set_sync(substream);
5940
5941
5942        runtime->hw = snd_hdspm_playback_subinfo;
5943
5944        if (hdspm->capture_substream == NULL)
5945                hdspm_stop_audio(hdspm);
5946
5947        hdspm->playback_pid = current->pid;
5948        hdspm->playback_substream = substream;
5949
5950        spin_unlock_irq(&hdspm->lock);
5951
5952        snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
5953        snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
5954
5955        switch (hdspm->io_type) {
5956        case AIO:
5957        case RayDAT:
5958                snd_pcm_hw_constraint_minmax(runtime,
5959                                             SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
5960                                             32, 4096);
5961                /* RayDAT & AIO have a fixed buffer of 16384 samples per channel */
5962                snd_pcm_hw_constraint_minmax(runtime,
5963                                             SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
5964                                             16384, 16384);
5965                break;
5966
5967        default:
5968                snd_pcm_hw_constraint_minmax(runtime,
5969                                             SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
5970                                             64, 8192);
5971                break;
5972        }
5973
5974        if (AES32 == hdspm->io_type) {
5975                runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
5976                snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
5977                                &hdspm_hw_constraints_aes32_sample_rates);
5978        } else {
5979                snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
5980                                snd_hdspm_hw_rule_rate_out_channels, hdspm,
5981                                SNDRV_PCM_HW_PARAM_CHANNELS, -1);
5982        }
5983
5984        snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
5985                        snd_hdspm_hw_rule_out_channels, hdspm,
5986                        SNDRV_PCM_HW_PARAM_CHANNELS, -1);
5987
5988        snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
5989                        snd_hdspm_hw_rule_out_channels_rate, hdspm,
5990                        SNDRV_PCM_HW_PARAM_RATE, -1);
5991
5992        return 0;
5993}
5994
5995static int snd_hdspm_playback_release(struct snd_pcm_substream *substream)
5996{
5997        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5998
5999        spin_lock_irq(&hdspm->lock);
6000
6001        hdspm->playback_pid = -1;
6002        hdspm->playback_substream = NULL;
6003
6004        spin_unlock_irq(&hdspm->lock);
6005
6006        return 0;
6007}
6008
6009
6010static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
6011{
6012        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6013        struct snd_pcm_runtime *runtime = substream->runtime;
6014
6015        spin_lock_irq(&hdspm->lock);
6016        snd_pcm_set_sync(substream);
6017        runtime->hw = snd_hdspm_capture_subinfo;
6018
6019        if (hdspm->playback_substream == NULL)
6020                hdspm_stop_audio(hdspm);
6021
6022        hdspm->capture_pid = current->pid;
6023        hdspm->capture_substream = substream;
6024
6025        spin_unlock_irq(&hdspm->lock);
6026
6027        snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
6028        snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
6029
6030        switch (hdspm->io_type) {
6031        case AIO:
6032        case RayDAT:
6033                snd_pcm_hw_constraint_minmax(runtime,
6034                                             SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6035                                             32, 4096);
6036                snd_pcm_hw_constraint_minmax(runtime,
6037                                             SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
6038                                             16384, 16384);
6039                break;
6040
6041        default:
6042                snd_pcm_hw_constraint_minmax(runtime,
6043                                             SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
6044                                             64, 8192);
6045                break;
6046        }
6047
6048        if (AES32 == hdspm->io_type) {
6049                runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
6050                snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6051                                &hdspm_hw_constraints_aes32_sample_rates);
6052        } else {
6053                snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
6054                                snd_hdspm_hw_rule_rate_in_channels, hdspm,
6055                                SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6056        }
6057
6058        snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6059                        snd_hdspm_hw_rule_in_channels, hdspm,
6060                        SNDRV_PCM_HW_PARAM_CHANNELS, -1);
6061
6062        snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
6063                        snd_hdspm_hw_rule_in_channels_rate, hdspm,
6064                        SNDRV_PCM_HW_PARAM_RATE, -1);
6065
6066        return 0;
6067}
6068
6069static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
6070{
6071        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
6072
6073        spin_lock_irq(&hdspm->lock);
6074
6075        hdspm->capture_pid = -1;
6076        hdspm->capture_substream = NULL;
6077
6078        spin_unlock_irq(&hdspm->lock);
6079        return 0;
6080}
6081
6082static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file)
6083{
6084        /* we have nothing to initialize but the call is required */
6085        return 0;
6086}
6087
6088static inline int copy_u32_le(void __user *dest, void __iomem *src)
6089{
6090        u32 val = readl(src);
6091        return copy_to_user(dest, &val, 4);
6092}
6093
6094static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
6095                unsigned int cmd, unsigned long arg)
6096{
6097        void __user *argp = (void __user *)arg;
6098        struct hdspm *hdspm = hw->private_data;
6099        struct hdspm_mixer_ioctl mixer;
6100        struct hdspm_config info;
6101        struct hdspm_status status;
6102        struct hdspm_version hdspm_version;
6103        struct hdspm_peak_rms *levels;
6104        struct hdspm_ltc ltc;
6105        unsigned int statusregister;
6106        long unsigned int s;
6107        int i = 0;
6108
6109        switch (cmd) {
6110
6111        case SNDRV_HDSPM_IOCTL_GET_PEAK_RMS:
6112                levels = &hdspm->peak_rms;
6113                for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
6114                        levels->input_peaks[i] =
6115                                readl(hdspm->iobase +
6116                                                HDSPM_MADI_INPUT_PEAK + i*4);
6117                        levels->playback_peaks[i] =
6118                                readl(hdspm->iobase +
6119                                                HDSPM_MADI_PLAYBACK_PEAK + i*4);
6120                        levels->output_peaks[i] =
6121                                readl(hdspm->iobase +
6122                                                HDSPM_MADI_OUTPUT_PEAK + i*4);
6123
6124                        levels->input_rms[i] =
6125                                ((uint64_t) readl(hdspm->iobase +
6126                                        HDSPM_MADI_INPUT_RMS_H + i*4) << 32) |
6127                                (uint64_t) readl(hdspm->iobase +
6128                                                HDSPM_MADI_INPUT_RMS_L + i*4);
6129                        levels->playback_rms[i] =
6130                                ((uint64_t)readl(hdspm->iobase +
6131                                        HDSPM_MADI_PLAYBACK_RMS_H+i*4) << 32) |
6132                                (uint64_t)readl(hdspm->iobase +
6133                                        HDSPM_MADI_PLAYBACK_RMS_L + i*4);
6134                        levels->output_rms[i] =
6135                                ((uint64_t)readl(hdspm->iobase +
6136                                        HDSPM_MADI_OUTPUT_RMS_H + i*4) << 32) |
6137                                (uint64_t)readl(hdspm->iobase +
6138                                                HDSPM_MADI_OUTPUT_RMS_L + i*4);
6139                }
6140
6141                if (hdspm->system_sample_rate > 96000) {
6142                        levels->speed = qs;
6143                } else if (hdspm->system_sample_rate > 48000) {
6144                        levels->speed = ds;
6145                } else {
6146                        levels->speed = ss;
6147                }
6148                levels->status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
6149
6150                s = copy_to_user(argp, levels, sizeof(struct hdspm_peak_rms));
6151                if (0 != s) {
6152                        /* snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu
6153                         [Levels]\n", sizeof(struct hdspm_peak_rms), s);
6154                         */
6155                        return -EFAULT;
6156                }
6157                break;
6158
6159        case SNDRV_HDSPM_IOCTL_GET_LTC:
6160                ltc.ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
6161                i = hdspm_read(hdspm, HDSPM_RD_TCO + 4);
6162                if (i & HDSPM_TCO1_LTC_Input_valid) {
6163                        switch (i & (HDSPM_TCO1_LTC_Format_LSB |
6164                                HDSPM_TCO1_LTC_Format_MSB)) {
6165                        case 0:
6166                                ltc.format = fps_24;
6167                                break;
6168                        case HDSPM_TCO1_LTC_Format_LSB:
6169                                ltc.format = fps_25;
6170                                break;
6171                        case HDSPM_TCO1_LTC_Format_MSB:
6172                                ltc.format = fps_2997;
6173                                break;
6174                        default:
6175                                ltc.format = 30;
6176                                break;
6177                        }
6178                        if (i & HDSPM_TCO1_set_drop_frame_flag) {
6179                                ltc.frame = drop_frame;
6180                        } else {
6181                                ltc.frame = full_frame;
6182                        }
6183                } else {
6184                        ltc.format = format_invalid;
6185                        ltc.frame = frame_invalid;
6186                }
6187                if (i & HDSPM_TCO1_Video_Input_Format_NTSC) {
6188                        ltc.input_format = ntsc;
6189                } else if (i & HDSPM_TCO1_Video_Input_Format_PAL) {
6190                        ltc.input_format = pal;
6191                } else {
6192                        ltc.input_format = no_video;
6193                }
6194
6195                s = copy_to_user(argp, &ltc, sizeof(struct hdspm_ltc));
6196                if (0 != s) {
6197                        /*
6198                         snd_printk(KERN_ERR "copy_to_user(.., .., %lu): %lu [LTC]\n", sizeof(struct hdspm_ltc), s); */
6199                        return -EFAULT;
6200                }
6201
6202                break;
6203
6204        case SNDRV_HDSPM_IOCTL_GET_CONFIG:
6205
6206                memset(&info, 0, sizeof(info));
6207                spin_lock_irq(&hdspm->lock);
6208                info.pref_sync_ref = hdspm_pref_sync_ref(hdspm);
6209                info.wordclock_sync_check = hdspm_wc_sync_check(hdspm);
6210
6211                info.system_sample_rate = hdspm->system_sample_rate;
6212                info.autosync_sample_rate =
6213                        hdspm_external_sample_rate(hdspm);
6214                info.system_clock_mode = hdspm_system_clock_mode(hdspm);
6215                info.clock_source = hdspm_clock_source(hdspm);
6216                info.autosync_ref = hdspm_autosync_ref(hdspm);
6217                info.line_out = hdspm_line_out(hdspm);
6218                info.passthru = 0;
6219                spin_unlock_irq(&hdspm->lock);
6220                if (copy_to_user(argp, &info, sizeof(info)))
6221                        return -EFAULT;
6222                break;
6223
6224        case SNDRV_HDSPM_IOCTL_GET_STATUS:
6225                memset(&status, 0, sizeof(status));
6226
6227                status.card_type = hdspm->io_type;
6228
6229                status.autosync_source = hdspm_autosync_ref(hdspm);
6230
6231                status.card_clock = 110069313433624ULL;
6232                status.master_period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
6233
6234                switch (hdspm->io_type) {
6235                case MADI:
6236                case MADIface:
6237                        status.card_specific.madi.sync_wc =
6238                                hdspm_wc_sync_check(hdspm);
6239                        status.card_specific.madi.sync_madi =
6240                                hdspm_madi_sync_check(hdspm);
6241                        status.card_specific.madi.sync_tco =
6242                                hdspm_tco_sync_check(hdspm);
6243                        status.card_specific.madi.sync_in =
6244                                hdspm_sync_in_sync_check(hdspm);
6245
6246                        statusregister =
6247                                hdspm_read(hdspm, HDSPM_statusRegister);
6248                        status.card_specific.madi.madi_input =
6249                                (statusregister & HDSPM_AB_int) ? 1 : 0;
6250                        status.card_specific.madi.channel_format =
6251                                (statusregister & HDSPM_RX_64ch) ? 1 : 0;
6252                        /* TODO: Mac driver sets it when f_s>48kHz */
6253                        status.card_specific.madi.frame_format = 0;
6254
6255                default:
6256                        break;
6257                }
6258
6259                if (copy_to_user(argp, &status, sizeof(status)))
6260                        return -EFAULT;
6261
6262
6263                break;
6264
6265        case SNDRV_HDSPM_IOCTL_GET_VERSION:
6266                memset(&hdspm_version, 0, sizeof(hdspm_version));
6267
6268                hdspm_version.card_type = hdspm->io_type;
6269                strncpy(hdspm_version.cardname, hdspm->card_name,
6270                                sizeof(hdspm_version.cardname));
6271                hdspm_version.serial = hdspm->serial;
6272                hdspm_version.firmware_rev = hdspm->firmware_rev;
6273                hdspm_version.addons = 0;
6274                if (hdspm->tco)
6275                        hdspm_version.addons |= HDSPM_ADDON_TCO;
6276
6277                if (copy_to_user(argp, &hdspm_version,
6278                                        sizeof(hdspm_version)))
6279                        return -EFAULT;
6280                break;
6281
6282        case SNDRV_HDSPM_IOCTL_GET_MIXER:
6283                if (copy_from_user(&mixer, argp, sizeof(mixer)))
6284                        return -EFAULT;
6285                if (copy_to_user((void __user *)mixer.mixer, hdspm->mixer,
6286                                        sizeof(struct hdspm_mixer)))
6287                        return -EFAULT;
6288                break;
6289
6290        default:
6291                return -EINVAL;
6292        }
6293        return 0;
6294}
6295
6296static struct snd_pcm_ops snd_hdspm_playback_ops = {
6297        .open = snd_hdspm_playback_open,
6298        .close = snd_hdspm_playback_release,
6299        .ioctl = snd_hdspm_ioctl,
6300        .hw_params = snd_hdspm_hw_params,
6301        .hw_free = snd_hdspm_hw_free,
6302        .prepare = snd_hdspm_prepare,
6303        .trigger = snd_hdspm_trigger,
6304        .pointer = snd_hdspm_hw_pointer,
6305        .page = snd_pcm_sgbuf_ops_page,
6306};
6307
6308static struct snd_pcm_ops snd_hdspm_capture_ops = {
6309        .open = snd_hdspm_capture_open,
6310        .close = snd_hdspm_capture_release,
6311        .ioctl = snd_hdspm_ioctl,
6312        .hw_params = snd_hdspm_hw_params,
6313        .hw_free = snd_hdspm_hw_free,
6314        .prepare = snd_hdspm_prepare,
6315        .trigger = snd_hdspm_trigger,
6316        .pointer = snd_hdspm_hw_pointer,
6317        .page = snd_pcm_sgbuf_ops_page,
6318};
6319
6320static int __devinit snd_hdspm_create_hwdep(struct snd_card *card,
6321                                            struct hdspm * hdspm)
6322{
6323        struct snd_hwdep *hw;
6324        int err;
6325
6326        err = snd_hwdep_new(card, "HDSPM hwdep", 0, &hw);
6327        if (err < 0)
6328                return err;
6329
6330        hdspm->hwdep = hw;
6331        hw->private_data = hdspm;
6332        strcpy(hw->name, "HDSPM hwdep interface");
6333
6334        hw->ops.open = snd_hdspm_hwdep_dummy_op;
6335        hw->ops.ioctl = snd_hdspm_hwdep_ioctl;
6336        hw->ops.ioctl_compat = snd_hdspm_hwdep_ioctl;
6337        hw->ops.release = snd_hdspm_hwdep_dummy_op;
6338
6339        return 0;
6340}
6341
6342
6343/*------------------------------------------------------------
6344   memory interface
6345 ------------------------------------------------------------*/
6346static int __devinit snd_hdspm_preallocate_memory(struct hdspm *hdspm)
6347{
6348        int err;
6349        struct snd_pcm *pcm;
6350        size_t wanted;
6351
6352        pcm = hdspm->pcm;
6353
6354        wanted = HDSPM_DMA_AREA_BYTES;
6355
6356        err =
6357             snd_pcm_lib_preallocate_pages_for_all(pcm,
6358                                                   SNDRV_DMA_TYPE_DEV_SG,
6359                                                   snd_dma_pci_data(hdspm->pci),
6360                                                   wanted,
6361                                                   wanted);
6362        if (err < 0) {
6363                snd_printdd("Could not preallocate %zd Bytes\n", wanted);
6364
6365                return err;
6366        } else
6367                snd_printdd(" Preallocated %zd Bytes\n", wanted);
6368
6369        return 0;
6370}
6371
6372
6373static void hdspm_set_sgbuf(struct hdspm *hdspm,
6374                            struct snd_pcm_substream *substream,
6375                             unsigned int reg, int channels)
6376{
6377        int i;
6378
6379        /* continuous memory segment */
6380        for (i = 0; i < (channels * 16); i++)
6381                hdspm_write(hdspm, reg + 4 * i,
6382                                snd_pcm_sgbuf_get_addr(substream, 4096 * i));
6383}
6384
6385
6386/* ------------- ALSA Devices ---------------------------- */
6387static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
6388                                          struct hdspm *hdspm)
6389{
6390        struct snd_pcm *pcm;
6391        int err;
6392
6393        err = snd_pcm_new(card, hdspm->card_name, 0, 1, 1, &pcm);
6394        if (err < 0)
6395                return err;
6396
6397        hdspm->pcm = pcm;
6398        pcm->private_data = hdspm;
6399        strcpy(pcm->name, hdspm->card_name);
6400
6401        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
6402                        &snd_hdspm_playback_ops);
6403        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
6404                        &snd_hdspm_capture_ops);
6405
6406        pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
6407
6408        err = snd_hdspm_preallocate_memory(hdspm);
6409        if (err < 0)
6410                return err;
6411
6412        return 0;
6413}
6414
6415static inline void snd_hdspm_initialize_midi_flush(struct hdspm * hdspm)
6416{
6417        int i;
6418
6419        for (i = 0; i < hdspm->midiPorts; i++)
6420                snd_hdspm_flush_midi_input(hdspm, i);
6421}
6422
6423static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
6424                                                   struct hdspm * hdspm)
6425{
6426        int err, i;
6427
6428        snd_printdd("Create card...\n");
6429        err = snd_hdspm_create_pcm(card, hdspm);
6430        if (err < 0)
6431                return err;
6432
6433        i = 0;
6434        while (i < hdspm->midiPorts) {
6435                err = snd_hdspm_create_midi(card, hdspm, i);
6436                if (err < 0) {
6437                        return err;
6438                }
6439                i++;
6440        }
6441
6442        err = snd_hdspm_create_controls(card, hdspm);
6443        if (err < 0)
6444                return err;
6445
6446        err = snd_hdspm_create_hwdep(card, hdspm);
6447        if (err < 0)
6448                return err;
6449
6450        snd_printdd("proc init...\n");
6451        snd_hdspm_proc_init(hdspm);
6452
6453        hdspm->system_sample_rate = -1;
6454        hdspm->last_external_sample_rate = -1;
6455        hdspm->last_internal_sample_rate = -1;
6456        hdspm->playback_pid = -1;
6457        hdspm->capture_pid = -1;
6458        hdspm->capture_substream = NULL;
6459        hdspm->playback_substream = NULL;
6460
6461        snd_printdd("Set defaults...\n");
6462        err = snd_hdspm_set_defaults(hdspm);
6463        if (err < 0)
6464                return err;
6465
6466        snd_printdd("Update mixer controls...\n");
6467        hdspm_update_simple_mixer_controls(hdspm);
6468
6469        snd_printdd("Initializeing complete ???\n");
6470
6471        err = snd_card_register(card);
6472        if (err < 0) {
6473                snd_printk(KERN_ERR "HDSPM: error registering card\n");
6474                return err;
6475        }
6476
6477        snd_printdd("... yes now\n");
6478
6479        return 0;
6480}
6481
6482static int __devinit snd_hdspm_create(struct snd_card *card,
6483                struct hdspm *hdspm) {
6484
6485        struct pci_dev *pci = hdspm->pci;
6486        int err;
6487        unsigned long io_extent;
6488
6489        hdspm->irq = -1;
6490        hdspm->card = card;
6491
6492        spin_lock_init(&hdspm->lock);
6493
6494        pci_read_config_word(hdspm->pci,
6495                        PCI_CLASS_REVISION, &hdspm->firmware_rev);
6496
6497        strcpy(card->mixername, "Xilinx FPGA");
6498        strcpy(card->driver, "HDSPM");
6499
6500        switch (hdspm->firmware_rev) {
6501        case HDSPM_RAYDAT_REV:
6502                hdspm->io_type = RayDAT;
6503                hdspm->card_name = "RME RayDAT";
6504                hdspm->midiPorts = 2;
6505                break;
6506        case HDSPM_AIO_REV:
6507                hdspm->io_type = AIO;
6508                hdspm->card_name = "RME AIO";
6509                hdspm->midiPorts = 1;
6510                break;
6511        case HDSPM_MADIFACE_REV:
6512                hdspm->io_type = MADIface;
6513                hdspm->card_name = "RME MADIface";
6514                hdspm->midiPorts = 1;
6515                break;
6516        default:
6517                if ((hdspm->firmware_rev == 0xf0) ||
6518                        ((hdspm->firmware_rev >= 0xe6) &&
6519                                        (hdspm->firmware_rev <= 0xea))) {
6520                        hdspm->io_type = AES32;
6521                        hdspm->card_name = "RME AES32";
6522                        hdspm->midiPorts = 2;
6523                } else if ((hdspm->firmware_rev == 0xd2) ||
6524                        ((hdspm->firmware_rev >= 0xc8)  &&
6525                                (hdspm->firmware_rev <= 0xcf))) {
6526                        hdspm->io_type = MADI;
6527                        hdspm->card_name = "RME MADI";
6528                        hdspm->midiPorts = 3;
6529                } else {
6530                        snd_printk(KERN_ERR
6531                                "HDSPM: unknown firmware revision %x\n",
6532                                hdspm->firmware_rev);
6533                        return -ENODEV;
6534                }
6535        }
6536
6537        err = pci_enable_device(pci);
6538        if (err < 0)
6539                return err;
6540
6541        pci_set_master(hdspm->pci);
6542
6543        err = pci_request_regions(pci, "hdspm");
6544        if (err < 0)
6545                return err;
6546
6547        hdspm->port = pci_resource_start(pci, 0);
6548        io_extent = pci_resource_len(pci, 0);
6549
6550        snd_printdd("grabbed memory region 0x%lx-0x%lx\n",
6551                        hdspm->port, hdspm->port + io_extent - 1);
6552
6553        hdspm->iobase = ioremap_nocache(hdspm->port, io_extent);
6554        if (!hdspm->iobase) {
6555                snd_printk(KERN_ERR "HDSPM: "
6556                                "unable to remap region 0x%lx-0x%lx\n",
6557                                hdspm->port, hdspm->port + io_extent - 1);
6558                return -EBUSY;
6559        }
6560        snd_printdd("remapped region (0x%lx) 0x%lx-0x%lx\n",
6561                        (unsigned long)hdspm->iobase, hdspm->port,
6562                        hdspm->port + io_extent - 1);
6563
6564        if (request_irq(pci->irq, snd_hdspm_interrupt,
6565                        IRQF_SHARED, KBUILD_MODNAME, hdspm)) {
6566                snd_printk(KERN_ERR "HDSPM: unable to use IRQ %d\n", pci->irq);
6567                return -EBUSY;
6568        }
6569
6570        snd_printdd("use IRQ %d\n", pci->irq);
6571
6572        hdspm->irq = pci->irq;
6573
6574        snd_printdd("kmalloc Mixer memory of %zd Bytes\n",
6575                        sizeof(struct hdspm_mixer));
6576        hdspm->mixer = kzalloc(sizeof(struct hdspm_mixer), GFP_KERNEL);
6577        if (!hdspm->mixer) {
6578                snd_printk(KERN_ERR "HDSPM: "
6579                                "unable to kmalloc Mixer memory of %d Bytes\n",
6580                                (int)sizeof(struct hdspm_mixer));
6581                return err;
6582        }
6583
6584        hdspm->port_names_in = NULL;
6585        hdspm->port_names_out = NULL;
6586
6587        switch (hdspm->io_type) {
6588        case AES32:
6589                hdspm->ss_in_channels = hdspm->ss_out_channels = AES32_CHANNELS;
6590                hdspm->ds_in_channels = hdspm->ds_out_channels = AES32_CHANNELS;
6591                hdspm->qs_in_channels = hdspm->qs_out_channels = AES32_CHANNELS;
6592
6593                hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6594                        channel_map_aes32;
6595                hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6596                        channel_map_aes32;
6597                hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6598                        channel_map_aes32;
6599                hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6600                        texts_ports_aes32;
6601                hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6602                        texts_ports_aes32;
6603                hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6604                        texts_ports_aes32;
6605
6606                hdspm->max_channels_out = hdspm->max_channels_in =
6607                        AES32_CHANNELS;
6608                hdspm->port_names_in = hdspm->port_names_out =
6609                        texts_ports_aes32;
6610                hdspm->channel_map_in = hdspm->channel_map_out =
6611                        channel_map_aes32;
6612
6613                break;
6614
6615        case MADI:
6616        case MADIface:
6617                hdspm->ss_in_channels = hdspm->ss_out_channels =
6618                        MADI_SS_CHANNELS;
6619                hdspm->ds_in_channels = hdspm->ds_out_channels =
6620                        MADI_DS_CHANNELS;
6621                hdspm->qs_in_channels = hdspm->qs_out_channels =
6622                        MADI_QS_CHANNELS;
6623
6624                hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6625                        channel_map_unity_ss;
6626                hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6627                        channel_map_unity_ss;
6628                hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6629                        channel_map_unity_ss;
6630
6631                hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6632                        texts_ports_madi;
6633                hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6634                        texts_ports_madi;
6635                hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6636                        texts_ports_madi;
6637                break;
6638
6639        case AIO:
6640                if (0 == (hdspm_read(hdspm, HDSPM_statusRegister2) & HDSPM_s2_AEBI_D)) {
6641                        snd_printk(KERN_INFO "HDSPM: AEB input board found, but not supported\n");
6642                }
6643
6644                hdspm->ss_in_channels = AIO_IN_SS_CHANNELS;
6645                hdspm->ds_in_channels = AIO_IN_DS_CHANNELS;
6646                hdspm->qs_in_channels = AIO_IN_QS_CHANNELS;
6647                hdspm->ss_out_channels = AIO_OUT_SS_CHANNELS;
6648                hdspm->ds_out_channels = AIO_OUT_DS_CHANNELS;
6649                hdspm->qs_out_channels = AIO_OUT_QS_CHANNELS;
6650
6651                hdspm->channel_map_out_ss = channel_map_aio_out_ss;
6652                hdspm->channel_map_out_ds = channel_map_aio_out_ds;
6653                hdspm->channel_map_out_qs = channel_map_aio_out_qs;
6654
6655                hdspm->channel_map_in_ss = channel_map_aio_in_ss;
6656                hdspm->channel_map_in_ds = channel_map_aio_in_ds;
6657                hdspm->channel_map_in_qs = channel_map_aio_in_qs;
6658
6659                hdspm->port_names_in_ss = texts_ports_aio_in_ss;
6660                hdspm->port_names_out_ss = texts_ports_aio_out_ss;
6661                hdspm->port_names_in_ds = texts_ports_aio_in_ds;
6662                hdspm->port_names_out_ds = texts_ports_aio_out_ds;
6663                hdspm->port_names_in_qs = texts_ports_aio_in_qs;
6664                hdspm->port_names_out_qs = texts_ports_aio_out_qs;
6665
6666                break;
6667
6668        case RayDAT:
6669                hdspm->ss_in_channels = hdspm->ss_out_channels =
6670                        RAYDAT_SS_CHANNELS;
6671                hdspm->ds_in_channels = hdspm->ds_out_channels =
6672                        RAYDAT_DS_CHANNELS;
6673                hdspm->qs_in_channels = hdspm->qs_out_channels =
6674                        RAYDAT_QS_CHANNELS;
6675
6676                hdspm->max_channels_in = RAYDAT_SS_CHANNELS;
6677                hdspm->max_channels_out = RAYDAT_SS_CHANNELS;
6678
6679                hdspm->channel_map_in_ss = hdspm->channel_map_out_ss =
6680                        channel_map_raydat_ss;
6681                hdspm->channel_map_in_ds = hdspm->channel_map_out_ds =
6682                        channel_map_raydat_ds;
6683                hdspm->channel_map_in_qs = hdspm->channel_map_out_qs =
6684                        channel_map_raydat_qs;
6685                hdspm->channel_map_in = hdspm->channel_map_out =
6686                        channel_map_raydat_ss;
6687
6688                hdspm->port_names_in_ss = hdspm->port_names_out_ss =
6689                        texts_ports_raydat_ss;
6690                hdspm->port_names_in_ds = hdspm->port_names_out_ds =
6691                        texts_ports_raydat_ds;
6692                hdspm->port_names_in_qs = hdspm->port_names_out_qs =
6693                        texts_ports_raydat_qs;
6694
6695
6696                break;
6697
6698        }
6699
6700        /* TCO detection */
6701        switch (hdspm->io_type) {
6702        case AIO:
6703        case RayDAT:
6704                if (hdspm_read(hdspm, HDSPM_statusRegister2) &
6705                                HDSPM_s2_tco_detect) {
6706                        hdspm->midiPorts++;
6707                        hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6708                                        GFP_KERNEL);
6709                        if (NULL != hdspm->tco) {
6710                                hdspm_tco_write(hdspm);
6711                        }
6712                        snd_printk(KERN_INFO "HDSPM: AIO/RayDAT TCO module found\n");
6713                } else {
6714                        hdspm->tco = NULL;
6715                }
6716                break;
6717
6718        case MADI:
6719                if (hdspm_read(hdspm, HDSPM_statusRegister) & HDSPM_tco_detect) {
6720                        hdspm->midiPorts++;
6721                        hdspm->tco = kzalloc(sizeof(struct hdspm_tco),
6722                                        GFP_KERNEL);
6723                        if (NULL != hdspm->tco) {
6724                                hdspm_tco_write(hdspm);
6725                        }
6726                        snd_printk(KERN_INFO "HDSPM: MADI TCO module found\n");
6727                } else {
6728                        hdspm->tco = NULL;
6729                }
6730                break;
6731
6732        default:
6733                hdspm->tco = NULL;
6734        }
6735
6736        /* texts */
6737        switch (hdspm->io_type) {
6738        case AES32:
6739                if (hdspm->tco) {
6740                        hdspm->texts_autosync = texts_autosync_aes_tco;
6741                        hdspm->texts_autosync_items = 10;
6742                } else {
6743                        hdspm->texts_autosync = texts_autosync_aes;
6744                        hdspm->texts_autosync_items = 9;
6745                }
6746                break;
6747
6748        case MADI:
6749                if (hdspm->tco) {
6750                        hdspm->texts_autosync = texts_autosync_madi_tco;
6751                        hdspm->texts_autosync_items = 4;
6752                } else {
6753                        hdspm->texts_autosync = texts_autosync_madi;
6754                        hdspm->texts_autosync_items = 3;
6755                }
6756                break;
6757
6758        case MADIface:
6759
6760                break;
6761
6762        case RayDAT:
6763                if (hdspm->tco) {
6764                        hdspm->texts_autosync = texts_autosync_raydat_tco;
6765                        hdspm->texts_autosync_items = 9;
6766                } else {
6767                        hdspm->texts_autosync = texts_autosync_raydat;
6768                        hdspm->texts_autosync_items = 8;
6769                }
6770                break;
6771
6772        case AIO:
6773                if (hdspm->tco) {
6774                        hdspm->texts_autosync = texts_autosync_aio_tco;
6775                        hdspm->texts_autosync_items = 6;
6776                } else {
6777                        hdspm->texts_autosync = texts_autosync_aio;
6778                        hdspm->texts_autosync_items = 5;
6779                }
6780                break;
6781
6782        }
6783
6784        tasklet_init(&hdspm->midi_tasklet,
6785                        hdspm_midi_tasklet, (unsigned long) hdspm);
6786
6787
6788        if (hdspm->io_type != MADIface) {
6789                hdspm->serial = (hdspm_read(hdspm,
6790                                HDSPM_midiStatusIn0)>>8) & 0xFFFFFF;
6791                /* id contains either a user-provided value or the default
6792                 * NULL. If it's the default, we're safe to
6793                 * fill card->id with the serial number.
6794                 *
6795                 * If the serial number is 0xFFFFFF, then we're dealing with
6796                 * an old PCI revision that comes without a sane number. In
6797                 * this case, we don't set card->id to avoid collisions
6798                 * when running with multiple cards.
6799                 */
6800                if (NULL == id[hdspm->dev] && hdspm->serial != 0xFFFFFF) {
6801                        sprintf(card->id, "HDSPMx%06x", hdspm->serial);
6802                        snd_card_set_id(card, card->id);
6803                }
6804        }
6805
6806        snd_printdd("create alsa devices.\n");
6807        err = snd_hdspm_create_alsa_devices(card, hdspm);
6808        if (err < 0)
6809                return err;
6810
6811        snd_hdspm_initialize_midi_flush(hdspm);
6812
6813        return 0;
6814}
6815
6816
6817static int snd_hdspm_free(struct hdspm * hdspm)
6818{
6819
6820        if (hdspm->port) {
6821
6822                /* stop th audio, and cancel all interrupts */
6823                hdspm->control_register &=
6824                    ~(HDSPM_Start | HDSPM_AudioInterruptEnable |
6825                      HDSPM_Midi0InterruptEnable | HDSPM_Midi1InterruptEnable |
6826                      HDSPM_Midi2InterruptEnable | HDSPM_Midi3InterruptEnable);
6827                hdspm_write(hdspm, HDSPM_controlRegister,
6828                            hdspm->control_register);
6829        }
6830
6831        if (hdspm->irq >= 0)
6832                free_irq(hdspm->irq, (void *) hdspm);
6833
6834        kfree(hdspm->mixer);
6835
6836        if (hdspm->iobase)
6837                iounmap(hdspm->iobase);
6838
6839        if (hdspm->port)
6840                pci_release_regions(hdspm->pci);
6841
6842        pci_disable_device(hdspm->pci);
6843        return 0;
6844}
6845
6846
6847static void snd_hdspm_card_free(struct snd_card *card)
6848{
6849        struct hdspm *hdspm = card->private_data;
6850
6851        if (hdspm)
6852                snd_hdspm_free(hdspm);
6853}
6854
6855
6856static int __devinit snd_hdspm_probe(struct pci_dev *pci,
6857                                     const struct pci_device_id *pci_id)
6858{
6859        static int dev;
6860        struct hdspm *hdspm;
6861        struct snd_card *card;
6862        int err;
6863
6864        if (dev >= SNDRV_CARDS)
6865                return -ENODEV;
6866        if (!enable[dev]) {
6867                dev++;
6868                return -ENOENT;
6869        }
6870
6871        err = snd_card_create(index[dev], id[dev],
6872                        THIS_MODULE, sizeof(struct hdspm), &card);
6873        if (err < 0)
6874                return err;
6875
6876        hdspm = card->private_data;
6877        card->private_free = snd_hdspm_card_free;
6878        hdspm->dev = dev;
6879        hdspm->pci = pci;
6880
6881        snd_card_set_dev(card, &pci->dev);
6882
6883        err = snd_hdspm_create(card, hdspm);
6884        if (err < 0) {
6885                snd_card_free(card);
6886                return err;
6887        }
6888
6889        if (hdspm->io_type != MADIface) {
6890                sprintf(card->shortname, "%s_%x",
6891                        hdspm->card_name,
6892                        hdspm->serial);
6893                sprintf(card->longname, "%s S/N 0x%x at 0x%lx, irq %d",
6894                        hdspm->card_name,
6895                        hdspm->serial,
6896                        hdspm->port, hdspm->irq);
6897        } else {
6898                sprintf(card->shortname, "%s", hdspm->card_name);
6899                sprintf(card->longname, "%s at 0x%lx, irq %d",
6900                                hdspm->card_name, hdspm->port, hdspm->irq);
6901        }
6902
6903        err = snd_card_register(card);
6904        if (err < 0) {
6905                snd_card_free(card);
6906                return err;
6907        }
6908
6909        pci_set_drvdata(pci, card);
6910
6911        dev++;
6912        return 0;
6913}
6914
6915static void __devexit snd_hdspm_remove(struct pci_dev *pci)
6916{
6917        snd_card_free(pci_get_drvdata(pci));
6918        pci_set_drvdata(pci, NULL);
6919}
6920
6921static struct pci_driver driver = {
6922        .name = KBUILD_MODNAME,
6923        .id_table = snd_hdspm_ids,
6924        .probe = snd_hdspm_probe,
6925        .remove = __devexit_p(snd_hdspm_remove),
6926};
6927
6928
6929static int __init alsa_card_hdspm_init(void)
6930{
6931        return pci_register_driver(&driver);
6932}
6933
6934static void __exit alsa_card_hdspm_exit(void)
6935{
6936        pci_unregister_driver(&driver);
6937}
6938
6939module_init(alsa_card_hdspm_init)
6940module_exit(alsa_card_hdspm_exit)
6941