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 int 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        struct hdspm_peak_rms peak_rms;
 945};
 946
 947
 948static DEFINE_PCI_DEVICE_TABLE(snd_hdspm_ids) = {
 949        {
 950         .vendor = PCI_VENDOR_ID_XILINX,
 951         .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
 952         .subvendor = PCI_ANY_ID,
 953         .subdevice = PCI_ANY_ID,
 954         .class = 0,
 955         .class_mask = 0,
 956         .driver_data = 0},
 957        {0,}
 958};
 959
 960MODULE_DEVICE_TABLE(pci, snd_hdspm_ids);
 961
 962/* prototypes */
 963static int __devinit snd_hdspm_create_alsa_devices(struct snd_card *card,
 964                                                   struct hdspm * hdspm);
 965static int __devinit snd_hdspm_create_pcm(struct snd_card *card,
 966                                          struct hdspm * hdspm);
 967
 968static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
 969static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
 970static int hdspm_autosync_ref(struct hdspm *hdspm);
 971static int snd_hdspm_set_defaults(struct hdspm *hdspm);
 972static void hdspm_set_sgbuf(struct hdspm *hdspm,
 973                            struct snd_pcm_substream *substream,
 974                             unsigned int reg, int channels);
 975
 976static inline int HDSPM_bit2freq(int n)
 977{
 978        static const int bit2freq_tab[] = {
 979                0, 32000, 44100, 48000, 64000, 88200,
 980                96000, 128000, 176400, 192000 };
 981        if (n < 1 || n > 9)
 982                return 0;
 983        return bit2freq_tab[n];
 984}
 985
 986/* Write/read to/from HDSPM with Adresses in Bytes
 987   not words but only 32Bit writes are allowed */
 988
 989static inline void hdspm_write(struct hdspm * hdspm, unsigned int reg,
 990                               unsigned int val)
 991{
 992        writel(val, hdspm->iobase + reg);
 993}
 994
 995static inline unsigned int hdspm_read(struct hdspm * hdspm, unsigned int reg)
 996{
 997        return readl(hdspm->iobase + reg);
 998}
 999
1000/* for each output channel (chan) I have an Input (in) and Playback (pb) Fader
1001   mixer is write only on hardware so we have to cache him for read
1002   each fader is a u32, but uses only the first 16 bit */
1003
1004static inline int hdspm_read_in_gain(struct hdspm * hdspm, unsigned int chan,
1005                                     unsigned int in)
1006{
1007        if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1008                return 0;
1009
1010        return hdspm->mixer->ch[chan].in[in];
1011}
1012
1013static inline int hdspm_read_pb_gain(struct hdspm * hdspm, unsigned int chan,
1014                                     unsigned int pb)
1015{
1016        if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1017                return 0;
1018        return hdspm->mixer->ch[chan].pb[pb];
1019}
1020
1021static int hdspm_write_in_gain(struct hdspm *hdspm, unsigned int chan,
1022                                      unsigned int in, unsigned short data)
1023{
1024        if (chan >= HDSPM_MIXER_CHANNELS || in >= HDSPM_MIXER_CHANNELS)
1025                return -1;
1026
1027        hdspm_write(hdspm,
1028                    HDSPM_MADI_mixerBase +
1029                    ((in + 128 * chan) * sizeof(u32)),
1030                    (hdspm->mixer->ch[chan].in[in] = data & 0xFFFF));
1031        return 0;
1032}
1033
1034static int hdspm_write_pb_gain(struct hdspm *hdspm, unsigned int chan,
1035                                      unsigned int pb, unsigned short data)
1036{
1037        if (chan >= HDSPM_MIXER_CHANNELS || pb >= HDSPM_MIXER_CHANNELS)
1038                return -1;
1039
1040        hdspm_write(hdspm,
1041                    HDSPM_MADI_mixerBase +
1042                    ((64 + pb + 128 * chan) * sizeof(u32)),
1043                    (hdspm->mixer->ch[chan].pb[pb] = data & 0xFFFF));
1044        return 0;
1045}
1046
1047
1048/* enable DMA for specific channels, now available for DSP-MADI */
1049static inline void snd_hdspm_enable_in(struct hdspm * hdspm, int i, int v)
1050{
1051        hdspm_write(hdspm, HDSPM_inputEnableBase + (4 * i), v);
1052}
1053
1054static inline void snd_hdspm_enable_out(struct hdspm * hdspm, int i, int v)
1055{
1056        hdspm_write(hdspm, HDSPM_outputEnableBase + (4 * i), v);
1057}
1058
1059/* check if same process is writing and reading */
1060static int snd_hdspm_use_is_exclusive(struct hdspm *hdspm)
1061{
1062        unsigned long flags;
1063        int ret = 1;
1064
1065        spin_lock_irqsave(&hdspm->lock, flags);
1066        if ((hdspm->playback_pid != hdspm->capture_pid) &&
1067            (hdspm->playback_pid >= 0) && (hdspm->capture_pid >= 0)) {
1068                ret = 0;
1069        }
1070        spin_unlock_irqrestore(&hdspm->lock, flags);
1071        return ret;
1072}
1073
1074/* check for external sample rate */
1075static int hdspm_external_sample_rate(struct hdspm *hdspm)
1076{
1077        unsigned int status, status2, timecode;
1078        int syncref, rate = 0, rate_bits;
1079
1080        switch (hdspm->io_type) {
1081        case AES32:
1082                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1083                status = hdspm_read(hdspm, HDSPM_statusRegister);
1084                timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
1085
1086                syncref = hdspm_autosync_ref(hdspm);
1087
1088                if (syncref == HDSPM_AES32_AUTOSYNC_FROM_WORD &&
1089                                status & HDSPM_AES32_wcLock)
1090                        return HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF);
1091
1092                if (syncref >= HDSPM_AES32_AUTOSYNC_FROM_AES1 &&
1093                                syncref <= HDSPM_AES32_AUTOSYNC_FROM_AES8 &&
1094                                status2 & (HDSPM_LockAES >>
1095                                (syncref - HDSPM_AES32_AUTOSYNC_FROM_AES1)))
1096                        return HDSPM_bit2freq((timecode >> (4*(syncref-HDSPM_AES32_AUTOSYNC_FROM_AES1))) & 0xF);
1097                return 0;
1098                break;
1099
1100        case MADIface:
1101                status = hdspm_read(hdspm, HDSPM_statusRegister);
1102
1103                if (!(status & HDSPM_madiLock)) {
1104                        rate = 0;  /* no lock */
1105                } else {
1106                        switch (status & (HDSPM_status1_freqMask)) {
1107                        case HDSPM_status1_F_0*1:
1108                                rate = 32000; break;
1109                        case HDSPM_status1_F_0*2:
1110                                rate = 44100; break;
1111                        case HDSPM_status1_F_0*3:
1112                                rate = 48000; break;
1113                        case HDSPM_status1_F_0*4:
1114                                rate = 64000; break;
1115                        case HDSPM_status1_F_0*5:
1116                                rate = 88200; break;
1117                        case HDSPM_status1_F_0*6:
1118                                rate = 96000; break;
1119                        case HDSPM_status1_F_0*7:
1120                                rate = 128000; break;
1121                        case HDSPM_status1_F_0*8:
1122                                rate = 176400; break;
1123                        case HDSPM_status1_F_0*9:
1124                                rate = 192000; break;
1125                        default:
1126                                rate = 0; break;
1127                        }
1128                }
1129
1130                break;
1131
1132        case MADI:
1133        case AIO:
1134        case RayDAT:
1135                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
1136                status = hdspm_read(hdspm, HDSPM_statusRegister);
1137                rate = 0;
1138
1139                /* if wordclock has synced freq and wordclock is valid */
1140                if ((status2 & HDSPM_wcLock) != 0 &&
1141                                (status2 & HDSPM_SelSyncRef0) == 0) {
1142
1143                        rate_bits = status2 & HDSPM_wcFreqMask;
1144
1145
1146                        switch (rate_bits) {
1147                        case HDSPM_wcFreq32:
1148                                rate = 32000;
1149                                break;
1150                        case HDSPM_wcFreq44_1:
1151                                rate = 44100;
1152                                break;
1153                        case HDSPM_wcFreq48:
1154                                rate = 48000;
1155                                break;
1156                        case HDSPM_wcFreq64:
1157                                rate = 64000;
1158                                break;
1159                        case HDSPM_wcFreq88_2:
1160                                rate = 88200;
1161                                break;
1162                        case HDSPM_wcFreq96:
1163                                rate = 96000;
1164                                break;
1165                        default:
1166                                rate = 0;
1167                                break;
1168                        }
1169                }
1170
1171                /* if rate detected and Syncref is Word than have it,
1172                 * word has priority to MADI
1173                 */
1174                if (rate != 0 &&
1175                (status2 & HDSPM_SelSyncRefMask) == HDSPM_SelSyncRef_WORD)
1176                        return rate;
1177
1178                /* maybe a madi input (which is taken if sel sync is madi) */
1179                if (status & HDSPM_madiLock) {
1180                        rate_bits = status & HDSPM_madiFreqMask;
1181
1182                        switch (rate_bits) {
1183                        case HDSPM_madiFreq32:
1184                                rate = 32000;
1185                                break;
1186                        case HDSPM_madiFreq44_1:
1187                                rate = 44100;
1188                                break;
1189                        case HDSPM_madiFreq48:
1190                                rate = 48000;
1191                                break;
1192                        case HDSPM_madiFreq64:
1193                                rate = 64000;
1194                                break;
1195                        case HDSPM_madiFreq88_2:
1196                                rate = 88200;
1197                                break;
1198                        case HDSPM_madiFreq96:
1199                                rate = 96000;
1200                                break;
1201                        case HDSPM_madiFreq128:
1202                                rate = 128000;
1203                                break;
1204                        case HDSPM_madiFreq176_4:
1205                                rate = 176400;
1206                                break;
1207                        case HDSPM_madiFreq192:
1208                                rate = 192000;
1209                                break;
1210                        default:
1211                                rate = 0;
1212                                break;
1213                        }
1214
1215                        /* QS and DS rates normally can not be detected
1216                         * automatically by the card. Only exception is MADI
1217                         * in 96k frame mode.
1218                         *
1219                         * So if we read SS values (32 .. 48k), check for
1220                         * user-provided DS/QS bits in the control register
1221                         * and multiply the base frequency accordingly.
1222                         */
1223                        if (rate <= 48000) {
1224                                if (hdspm->control_register & HDSPM_QuadSpeed)
1225                                        rate *= 4;
1226                                else if (hdspm->control_register &
1227                                                HDSPM_DoubleSpeed)
1228                                        rate *= 2;
1229                        }
1230                }
1231                break;
1232        }
1233
1234        return rate;
1235}
1236
1237/* return latency in samples per period */
1238static int hdspm_get_latency(struct hdspm *hdspm)
1239{
1240        int n;
1241
1242        n = hdspm_decode_latency(hdspm->control_register);
1243
1244        /* Special case for new RME cards with 32 samples period size.
1245         * The three latency bits in the control register
1246         * (HDSP_LatencyMask) encode latency values of 64 samples as
1247         * 0, 128 samples as 1 ... 4096 samples as 6. For old cards, 7
1248         * denotes 8192 samples, but on new cards like RayDAT or AIO,
1249         * it corresponds to 32 samples.
1250         */
1251        if ((7 == n) && (RayDAT == hdspm->io_type || AIO == hdspm->io_type))
1252                n = -1;
1253
1254        return 1 << (n + 6);
1255}
1256
1257/* Latency function */
1258static inline void hdspm_compute_period_size(struct hdspm *hdspm)
1259{
1260        hdspm->period_bytes = 4 * hdspm_get_latency(hdspm);
1261}
1262
1263
1264static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
1265{
1266        int position;
1267
1268        position = hdspm_read(hdspm, HDSPM_statusRegister);
1269
1270        switch (hdspm->io_type) {
1271        case RayDAT:
1272        case AIO:
1273                position &= HDSPM_BufferPositionMask;
1274                position /= 4; /* Bytes per sample */
1275                break;
1276        default:
1277                position = (position & HDSPM_BufferID) ?
1278                        (hdspm->period_bytes / 4) : 0;
1279        }
1280
1281        return position;
1282}
1283
1284
1285static inline void hdspm_start_audio(struct hdspm * s)
1286{
1287        s->control_register |= (HDSPM_AudioInterruptEnable | HDSPM_Start);
1288        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1289}
1290
1291static inline void hdspm_stop_audio(struct hdspm * s)
1292{
1293        s->control_register &= ~(HDSPM_Start | HDSPM_AudioInterruptEnable);
1294        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1295}
1296
1297/* should I silence all or only opened ones ? doit all for first even is 4MB*/
1298static void hdspm_silence_playback(struct hdspm *hdspm)
1299{
1300        int i;
1301        int n = hdspm->period_bytes;
1302        void *buf = hdspm->playback_buffer;
1303
1304        if (buf == NULL)
1305                return;
1306
1307        for (i = 0; i < HDSPM_MAX_CHANNELS; i++) {
1308                memset(buf, 0, n);
1309                buf += HDSPM_CHANNEL_BUFFER_BYTES;
1310        }
1311}
1312
1313static int hdspm_set_interrupt_interval(struct hdspm *s, unsigned int frames)
1314{
1315        int n;
1316
1317        spin_lock_irq(&s->lock);
1318
1319        if (32 == frames) {
1320                /* Special case for new RME cards like RayDAT/AIO which
1321                 * support period sizes of 32 samples. Since latency is
1322                 * encoded in the three bits of HDSP_LatencyMask, we can only
1323                 * have values from 0 .. 7. While 0 still means 64 samples and
1324                 * 6 represents 4096 samples on all cards, 7 represents 8192
1325                 * on older cards and 32 samples on new cards.
1326                 *
1327                 * In other words, period size in samples is calculated by
1328                 * 2^(n+6) with n ranging from 0 .. 7.
1329                 */
1330                n = 7;
1331        } else {
1332                frames >>= 7;
1333                n = 0;
1334                while (frames) {
1335                        n++;
1336                        frames >>= 1;
1337                }
1338        }
1339
1340        s->control_register &= ~HDSPM_LatencyMask;
1341        s->control_register |= hdspm_encode_latency(n);
1342
1343        hdspm_write(s, HDSPM_controlRegister, s->control_register);
1344
1345        hdspm_compute_period_size(s);
1346
1347        spin_unlock_irq(&s->lock);
1348
1349        return 0;
1350}
1351
1352static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
1353{
1354        u64 freq_const;
1355
1356        if (period == 0)
1357                return 0;
1358
1359        switch (hdspm->io_type) {
1360        case MADI:
1361        case AES32:
1362                freq_const = 110069313433624ULL;
1363                break;
1364        case RayDAT:
1365        case AIO:
1366                freq_const = 104857600000000ULL;
1367                break;
1368        case MADIface:
1369                freq_const = 131072000000000ULL;
1370                break;
1371        default:
1372                snd_BUG();
1373                return 0;
1374        }
1375
1376        return div_u64(freq_const, period);
1377}
1378
1379
1380static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
1381{
1382        u64 n;
1383
1384        if (rate >= 112000)
1385                rate /= 4;
1386        else if (rate >= 56000)
1387                rate /= 2;
1388
1389        switch (hdspm->io_type) {
1390        case MADIface:
1391                n = 131072000000000ULL;  /* 125 MHz */
1392                break;
1393        case MADI:
1394        case AES32:
1395                n = 110069313433624ULL;  /* 105 MHz */
1396                break;
1397        case RayDAT:
1398        case AIO:
1399                n = 104857600000000ULL;  /* 100 MHz */
1400                break;
1401        default:
1402                snd_BUG();
1403                return;
1404        }
1405
1406        n = div_u64(n, rate);
1407        /* n should be less than 2^32 for being written to FREQ register */
1408        snd_BUG_ON(n >> 32);
1409        hdspm_write(hdspm, HDSPM_freqReg, (u32)n);
1410}
1411
1412/* dummy set rate lets see what happens */
1413static int hdspm_set_rate(struct hdspm * hdspm, int rate, int called_internally)
1414{
1415        int current_rate;
1416        int rate_bits;
1417        int not_set = 0;
1418        int current_speed, target_speed;
1419
1420        /* ASSUMPTION: hdspm->lock is either set, or there is no need for
1421           it (e.g. during module initialization).
1422         */
1423
1424        if (!(hdspm->control_register & HDSPM_ClockModeMaster)) {
1425
1426                /* SLAVE --- */
1427                if (called_internally) {
1428
1429                        /* request from ctl or card initialization
1430                           just make a warning an remember setting
1431                           for future master mode switching */
1432
1433                        snd_printk(KERN_WARNING "HDSPM: "
1434                                   "Warning: device is not running "
1435                                   "as a clock master.\n");
1436                        not_set = 1;
1437                } else {
1438
1439                        /* hw_param request while in AutoSync mode */
1440                        int external_freq =
1441                            hdspm_external_sample_rate(hdspm);
1442
1443                        if (hdspm_autosync_ref(hdspm) ==
1444                            HDSPM_AUTOSYNC_FROM_NONE) {
1445
1446                                snd_printk(KERN_WARNING "HDSPM: "
1447                                           "Detected no Externel Sync \n");
1448                                not_set = 1;
1449
1450                        } else if (rate != external_freq) {
1451
1452                                snd_printk(KERN_WARNING "HDSPM: "
1453                                           "Warning: No AutoSync source for "
1454                                           "requested rate\n");
1455                                not_set = 1;
1456                        }
1457                }
1458        }
1459
1460        current_rate = hdspm->system_sample_rate;
1461
1462        /* Changing between Singe, Double and Quad speed is not
1463           allowed if any substreams are open. This is because such a change
1464           causes a shift in the location of the DMA buffers and a reduction
1465           in the number of available buffers.
1466
1467           Note that a similar but essentially insoluble problem exists for
1468           externally-driven rate changes. All we can do is to flag rate
1469           changes in the read/write routines.
1470         */
1471
1472        if (current_rate <= 48000)
1473                current_speed = HDSPM_SPEED_SINGLE;
1474        else if (current_rate <= 96000)
1475                current_speed = HDSPM_SPEED_DOUBLE;
1476        else
1477                current_speed = HDSPM_SPEED_QUAD;
1478
1479        if (rate <= 48000)
1480                target_speed = HDSPM_SPEED_SINGLE;
1481        else if (rate <= 96000)
1482                target_speed = HDSPM_SPEED_DOUBLE;
1483        else
1484                target_speed = HDSPM_SPEED_QUAD;
1485
1486        switch (rate) {
1487        case 32000:
1488                rate_bits = HDSPM_Frequency32KHz;
1489                break;
1490        case 44100:
1491                rate_bits = HDSPM_Frequency44_1KHz;
1492                break;
1493        case 48000:
1494                rate_bits = HDSPM_Frequency48KHz;
1495                break;
1496        case 64000:
1497                rate_bits = HDSPM_Frequency64KHz;
1498                break;
1499        case 88200:
1500                rate_bits = HDSPM_Frequency88_2KHz;
1501                break;
1502        case 96000:
1503                rate_bits = HDSPM_Frequency96KHz;
1504                break;
1505        case 128000:
1506                rate_bits = HDSPM_Frequency128KHz;
1507                break;
1508        case 176400:
1509                rate_bits = HDSPM_Frequency176_4KHz;
1510                break;
1511        case 192000:
1512                rate_bits = HDSPM_Frequency192KHz;
1513                break;
1514        default:
1515                return -EINVAL;
1516        }
1517
1518        if (current_speed != target_speed
1519            && (hdspm->capture_pid >= 0 || hdspm->playback_pid >= 0)) {
1520                snd_printk
1521                    (KERN_ERR "HDSPM: "
1522                     "cannot change from %s speed to %s speed mode "
1523                     "(capture PID = %d, playback PID = %d)\n",
1524                     hdspm_speed_names[current_speed],
1525                     hdspm_speed_names[target_speed],
1526                     hdspm->capture_pid, hdspm->playback_pid);
1527                return -EBUSY;
1528        }
1529
1530        hdspm->control_register &= ~HDSPM_FrequencyMask;
1531        hdspm->control_register |= rate_bits;
1532        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1533
1534        /* For AES32, need to set DDS value in FREQ register
1535           For MADI, also apparently */
1536        hdspm_set_dds_value(hdspm, rate);
1537
1538        if (AES32 == hdspm->io_type && rate != current_rate)
1539                hdspm_write(hdspm, HDSPM_eeprom_wr, 0);
1540
1541        hdspm->system_sample_rate = rate;
1542
1543        if (rate <= 48000) {
1544                hdspm->channel_map_in = hdspm->channel_map_in_ss;
1545                hdspm->channel_map_out = hdspm->channel_map_out_ss;
1546                hdspm->max_channels_in = hdspm->ss_in_channels;
1547                hdspm->max_channels_out = hdspm->ss_out_channels;
1548                hdspm->port_names_in = hdspm->port_names_in_ss;
1549                hdspm->port_names_out = hdspm->port_names_out_ss;
1550        } else if (rate <= 96000) {
1551                hdspm->channel_map_in = hdspm->channel_map_in_ds;
1552                hdspm->channel_map_out = hdspm->channel_map_out_ds;
1553                hdspm->max_channels_in = hdspm->ds_in_channels;
1554                hdspm->max_channels_out = hdspm->ds_out_channels;
1555                hdspm->port_names_in = hdspm->port_names_in_ds;
1556                hdspm->port_names_out = hdspm->port_names_out_ds;
1557        } else {
1558                hdspm->channel_map_in = hdspm->channel_map_in_qs;
1559                hdspm->channel_map_out = hdspm->channel_map_out_qs;
1560                hdspm->max_channels_in = hdspm->qs_in_channels;
1561                hdspm->max_channels_out = hdspm->qs_out_channels;
1562                hdspm->port_names_in = hdspm->port_names_in_qs;
1563                hdspm->port_names_out = hdspm->port_names_out_qs;
1564        }
1565
1566        if (not_set != 0)
1567                return -1;
1568
1569        return 0;
1570}
1571
1572/* mainly for init to 0 on load */
1573static void all_in_all_mixer(struct hdspm * hdspm, int sgain)
1574{
1575        int i, j;
1576        unsigned int gain;
1577
1578        if (sgain > UNITY_GAIN)
1579                gain = UNITY_GAIN;
1580        else if (sgain < 0)
1581                gain = 0;
1582        else
1583                gain = sgain;
1584
1585        for (i = 0; i < HDSPM_MIXER_CHANNELS; i++)
1586                for (j = 0; j < HDSPM_MIXER_CHANNELS; j++) {
1587                        hdspm_write_in_gain(hdspm, i, j, gain);
1588                        hdspm_write_pb_gain(hdspm, i, j, gain);
1589                }
1590}
1591
1592/*----------------------------------------------------------------------------
1593   MIDI
1594  ----------------------------------------------------------------------------*/
1595
1596static inline unsigned char snd_hdspm_midi_read_byte (struct hdspm *hdspm,
1597                                                      int id)
1598{
1599        /* the hardware already does the relevant bit-mask with 0xff */
1600        return hdspm_read(hdspm, hdspm->midi[id].dataIn);
1601}
1602
1603static inline void snd_hdspm_midi_write_byte (struct hdspm *hdspm, int id,
1604                                              int val)
1605{
1606        /* the hardware already does the relevant bit-mask with 0xff */
1607        return hdspm_write(hdspm, hdspm->midi[id].dataOut, val);
1608}
1609
1610static inline int snd_hdspm_midi_input_available (struct hdspm *hdspm, int id)
1611{
1612        return hdspm_read(hdspm, hdspm->midi[id].statusIn) & 0xFF;
1613}
1614
1615static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
1616{
1617        int fifo_bytes_used;
1618
1619        fifo_bytes_used = hdspm_read(hdspm, hdspm->midi[id].statusOut) & 0xFF;
1620
1621        if (fifo_bytes_used < 128)
1622                return  128 - fifo_bytes_used;
1623        else
1624                return 0;
1625}
1626
1627static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
1628{
1629        while (snd_hdspm_midi_input_available (hdspm, id))
1630                snd_hdspm_midi_read_byte (hdspm, id);
1631}
1632
1633static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)
1634{
1635        unsigned long flags;
1636        int n_pending;
1637        int to_write;
1638        int i;
1639        unsigned char buf[128];
1640
1641        /* Output is not interrupt driven */
1642
1643        spin_lock_irqsave (&hmidi->lock, flags);
1644        if (hmidi->output &&
1645            !snd_rawmidi_transmit_empty (hmidi->output)) {
1646                n_pending = snd_hdspm_midi_output_possible (hmidi->hdspm,
1647                                                            hmidi->id);
1648                if (n_pending > 0) {
1649                        if (n_pending > (int)sizeof (buf))
1650                                n_pending = sizeof (buf);
1651
1652                        to_write = snd_rawmidi_transmit (hmidi->output, buf,
1653                                                         n_pending);
1654                        if (to_write > 0) {
1655                                for (i = 0; i < to_write; ++i)
1656                                        snd_hdspm_midi_write_byte (hmidi->hdspm,
1657                                                                   hmidi->id,
1658                                                                   buf[i]);
1659                        }
1660                }
1661        }
1662        spin_unlock_irqrestore (&hmidi->lock, flags);
1663        return 0;
1664}
1665
1666static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
1667{
1668        unsigned char buf[128]; /* this buffer is designed to match the MIDI
1669                                 * input FIFO size
1670                                 */
1671        unsigned long flags;
1672        int n_pending;
1673        int i;
1674
1675        spin_lock_irqsave (&hmidi->lock, flags);
1676        n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
1677        if (n_pending > 0) {
1678                if (hmidi->input) {
1679                        if (n_pending > (int)sizeof (buf))
1680                                n_pending = sizeof (buf);
1681                        for (i = 0; i < n_pending; ++i)
1682                                buf[i] = snd_hdspm_midi_read_byte (hmidi->hdspm,
1683                                                                   hmidi->id);
1684                        if (n_pending)
1685                                snd_rawmidi_receive (hmidi->input, buf,
1686                                                     n_pending);
1687                } else {
1688                        /* flush the MIDI input FIFO */
1689                        while (n_pending--)
1690                                snd_hdspm_midi_read_byte (hmidi->hdspm,
1691                                                          hmidi->id);
1692                }
1693        }
1694        hmidi->pending = 0;
1695        spin_unlock_irqrestore(&hmidi->lock, flags);
1696
1697        spin_lock_irqsave(&hmidi->hdspm->lock, flags);
1698        hmidi->hdspm->control_register |= hmidi->ie;
1699        hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
1700                    hmidi->hdspm->control_register);
1701        spin_unlock_irqrestore(&hmidi->hdspm->lock, flags);
1702
1703        return snd_hdspm_midi_output_write (hmidi);
1704}
1705
1706static void
1707snd_hdspm_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
1708{
1709        struct hdspm *hdspm;
1710        struct hdspm_midi *hmidi;
1711        unsigned long flags;
1712
1713        hmidi = substream->rmidi->private_data;
1714        hdspm = hmidi->hdspm;
1715
1716        spin_lock_irqsave (&hdspm->lock, flags);
1717        if (up) {
1718                if (!(hdspm->control_register & hmidi->ie)) {
1719                        snd_hdspm_flush_midi_input (hdspm, hmidi->id);
1720                        hdspm->control_register |= hmidi->ie;
1721                }
1722        } else {
1723                hdspm->control_register &= ~hmidi->ie;
1724        }
1725
1726        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
1727        spin_unlock_irqrestore (&hdspm->lock, flags);
1728}
1729
1730static void snd_hdspm_midi_output_timer(unsigned long data)
1731{
1732        struct hdspm_midi *hmidi = (struct hdspm_midi *) data;
1733        unsigned long flags;
1734
1735        snd_hdspm_midi_output_write(hmidi);
1736        spin_lock_irqsave (&hmidi->lock, flags);
1737
1738        /* this does not bump hmidi->istimer, because the
1739           kernel automatically removed the timer when it
1740           expired, and we are now adding it back, thus
1741           leaving istimer wherever it was set before.
1742        */
1743
1744        if (hmidi->istimer) {
1745                hmidi->timer.expires = 1 + jiffies;
1746                add_timer(&hmidi->timer);
1747        }
1748
1749        spin_unlock_irqrestore (&hmidi->lock, flags);
1750}
1751
1752static void
1753snd_hdspm_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
1754{
1755        struct hdspm_midi *hmidi;
1756        unsigned long flags;
1757
1758        hmidi = substream->rmidi->private_data;
1759        spin_lock_irqsave (&hmidi->lock, flags);
1760        if (up) {
1761                if (!hmidi->istimer) {
1762                        init_timer(&hmidi->timer);
1763                        hmidi->timer.function = snd_hdspm_midi_output_timer;
1764                        hmidi->timer.data = (unsigned long) hmidi;
1765                        hmidi->timer.expires = 1 + jiffies;
1766                        add_timer(&hmidi->timer);
1767                        hmidi->istimer++;
1768                }
1769        } else {
1770                if (hmidi->istimer && --hmidi->istimer <= 0)
1771                        del_timer (&hmidi->timer);
1772        }
1773        spin_unlock_irqrestore (&hmidi->lock, flags);
1774        if (up)
1775                snd_hdspm_midi_output_write(hmidi);
1776}
1777
1778static int snd_hdspm_midi_input_open(struct snd_rawmidi_substream *substream)
1779{
1780        struct hdspm_midi *hmidi;
1781
1782        hmidi = substream->rmidi->private_data;
1783        spin_lock_irq (&hmidi->lock);
1784        snd_hdspm_flush_midi_input (hmidi->hdspm, hmidi->id);
1785        hmidi->input = substream;
1786        spin_unlock_irq (&hmidi->lock);
1787
1788        return 0;
1789}
1790
1791static int snd_hdspm_midi_output_open(struct snd_rawmidi_substream *substream)
1792{
1793        struct hdspm_midi *hmidi;
1794
1795        hmidi = substream->rmidi->private_data;
1796        spin_lock_irq (&hmidi->lock);
1797        hmidi->output = substream;
1798        spin_unlock_irq (&hmidi->lock);
1799
1800        return 0;
1801}
1802
1803static int snd_hdspm_midi_input_close(struct snd_rawmidi_substream *substream)
1804{
1805        struct hdspm_midi *hmidi;
1806
1807        snd_hdspm_midi_input_trigger (substream, 0);
1808
1809        hmidi = substream->rmidi->private_data;
1810        spin_lock_irq (&hmidi->lock);
1811        hmidi->input = NULL;
1812        spin_unlock_irq (&hmidi->lock);
1813
1814        return 0;
1815}
1816
1817static int snd_hdspm_midi_output_close(struct snd_rawmidi_substream *substream)
1818{
1819        struct hdspm_midi *hmidi;
1820
1821        snd_hdspm_midi_output_trigger (substream, 0);
1822
1823        hmidi = substream->rmidi->private_data;
1824        spin_lock_irq (&hmidi->lock);
1825        hmidi->output = NULL;
1826        spin_unlock_irq (&hmidi->lock);
1827
1828        return 0;
1829}
1830
1831static struct snd_rawmidi_ops snd_hdspm_midi_output =
1832{
1833        .open =         snd_hdspm_midi_output_open,
1834        .close =        snd_hdspm_midi_output_close,
1835        .trigger =      snd_hdspm_midi_output_trigger,
1836};
1837
1838static struct snd_rawmidi_ops snd_hdspm_midi_input =
1839{
1840        .open =         snd_hdspm_midi_input_open,
1841        .close =        snd_hdspm_midi_input_close,
1842        .trigger =      snd_hdspm_midi_input_trigger,
1843};
1844
1845static int __devinit snd_hdspm_create_midi (struct snd_card *card,
1846                                            struct hdspm *hdspm, int id)
1847{
1848        int err;
1849        char buf[32];
1850
1851        hdspm->midi[id].id = id;
1852        hdspm->midi[id].hdspm = hdspm;
1853        spin_lock_init (&hdspm->midi[id].lock);
1854
1855        if (0 == id) {
1856                if (MADIface == hdspm->io_type) {
1857                        /* MIDI-over-MADI on HDSPe MADIface */
1858                        hdspm->midi[0].dataIn = HDSPM_midiDataIn2;
1859                        hdspm->midi[0].statusIn = HDSPM_midiStatusIn2;
1860                        hdspm->midi[0].dataOut = HDSPM_midiDataOut2;
1861                        hdspm->midi[0].statusOut = HDSPM_midiStatusOut2;
1862                        hdspm->midi[0].ie = HDSPM_Midi2InterruptEnable;
1863                        hdspm->midi[0].irq = HDSPM_midi2IRQPending;
1864                } else {
1865                        hdspm->midi[0].dataIn = HDSPM_midiDataIn0;
1866                        hdspm->midi[0].statusIn = HDSPM_midiStatusIn0;
1867                        hdspm->midi[0].dataOut = HDSPM_midiDataOut0;
1868                        hdspm->midi[0].statusOut = HDSPM_midiStatusOut0;
1869                        hdspm->midi[0].ie = HDSPM_Midi0InterruptEnable;
1870                        hdspm->midi[0].irq = HDSPM_midi0IRQPending;
1871                }
1872        } else if (1 == id) {
1873                hdspm->midi[1].dataIn = HDSPM_midiDataIn1;
1874                hdspm->midi[1].statusIn = HDSPM_midiStatusIn1;
1875                hdspm->midi[1].dataOut = HDSPM_midiDataOut1;
1876                hdspm->midi[1].statusOut = HDSPM_midiStatusOut1;
1877                hdspm->midi[1].ie = HDSPM_Midi1InterruptEnable;
1878                hdspm->midi[1].irq = HDSPM_midi1IRQPending;
1879        } else if ((2 == id) && (MADI == hdspm->io_type)) {
1880                /* MIDI-over-MADI on HDSPe MADI */
1881                hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1882                hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1883                hdspm->midi[2].dataOut = HDSPM_midiDataOut2;
1884                hdspm->midi[2].statusOut = HDSPM_midiStatusOut2;
1885                hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1886                hdspm->midi[2].irq = HDSPM_midi2IRQPending;
1887        } else if (2 == id) {
1888                /* TCO MTC, read only */
1889                hdspm->midi[2].dataIn = HDSPM_midiDataIn2;
1890                hdspm->midi[2].statusIn = HDSPM_midiStatusIn2;
1891                hdspm->midi[2].dataOut = -1;
1892                hdspm->midi[2].statusOut = -1;
1893                hdspm->midi[2].ie = HDSPM_Midi2InterruptEnable;
1894                hdspm->midi[2].irq = HDSPM_midi2IRQPendingAES;
1895        } else if (3 == id) {
1896                /* TCO MTC on HDSPe MADI */
1897                hdspm->midi[3].dataIn = HDSPM_midiDataIn3;
1898                hdspm->midi[3].statusIn = HDSPM_midiStatusIn3;
1899                hdspm->midi[3].dataOut = -1;
1900                hdspm->midi[3].statusOut = -1;
1901                hdspm->midi[3].ie = HDSPM_Midi3InterruptEnable;
1902                hdspm->midi[3].irq = HDSPM_midi3IRQPending;
1903        }
1904
1905        if ((id < 2) || ((2 == id) && ((MADI == hdspm->io_type) ||
1906                                        (MADIface == hdspm->io_type)))) {
1907                if ((id == 0) && (MADIface == hdspm->io_type)) {
1908                        sprintf(buf, "%s MIDIoverMADI", card->shortname);
1909                } else if ((id == 2) && (MADI == hdspm->io_type)) {
1910                        sprintf(buf, "%s MIDIoverMADI", card->shortname);
1911                } else {
1912                        sprintf(buf, "%s MIDI %d", card->shortname, id+1);
1913                }
1914                err = snd_rawmidi_new(card, buf, id, 1, 1,
1915                                &hdspm->midi[id].rmidi);
1916                if (err < 0)
1917                        return err;
1918
1919                sprintf(hdspm->midi[id].rmidi->name, "%s MIDI %d",
1920                                card->id, id+1);
1921                hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1922
1923                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1924                                SNDRV_RAWMIDI_STREAM_OUTPUT,
1925                                &snd_hdspm_midi_output);
1926                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1927                                SNDRV_RAWMIDI_STREAM_INPUT,
1928                                &snd_hdspm_midi_input);
1929
1930                hdspm->midi[id].rmidi->info_flags |=
1931                        SNDRV_RAWMIDI_INFO_OUTPUT |
1932                        SNDRV_RAWMIDI_INFO_INPUT |
1933                        SNDRV_RAWMIDI_INFO_DUPLEX;
1934        } else {
1935                /* TCO MTC, read only */
1936                sprintf(buf, "%s MTC %d", card->shortname, id+1);
1937                err = snd_rawmidi_new(card, buf, id, 1, 1,
1938                                &hdspm->midi[id].rmidi);
1939                if (err < 0)
1940                        return err;
1941
1942                sprintf(hdspm->midi[id].rmidi->name,
1943                                "%s MTC %d", card->id, id+1);
1944                hdspm->midi[id].rmidi->private_data = &hdspm->midi[id];
1945
1946                snd_rawmidi_set_ops(hdspm->midi[id].rmidi,
1947                                SNDRV_RAWMIDI_STREAM_INPUT,
1948                                &snd_hdspm_midi_input);
1949
1950                hdspm->midi[id].rmidi->info_flags |= SNDRV_RAWMIDI_INFO_INPUT;
1951        }
1952
1953        return 0;
1954}
1955
1956
1957static void hdspm_midi_tasklet(unsigned long arg)
1958{
1959        struct hdspm *hdspm = (struct hdspm *)arg;
1960        int i = 0;
1961
1962        while (i < hdspm->midiPorts) {
1963                if (hdspm->midi[i].pending)
1964                        snd_hdspm_midi_input_read(&hdspm->midi[i]);
1965
1966                i++;
1967        }
1968}
1969
1970
1971/*-----------------------------------------------------------------------------
1972  Status Interface
1973  ----------------------------------------------------------------------------*/
1974
1975/* get the system sample rate which is set */
1976
1977
1978/**
1979 * Calculate the real sample rate from the
1980 * current DDS value.
1981 **/
1982static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
1983{
1984        unsigned int period, rate;
1985
1986        period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
1987        rate = hdspm_calc_dds_value(hdspm, period);
1988
1989        return rate;
1990}
1991
1992
1993#define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
1994{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1995  .name = xname, \
1996  .index = xindex, \
1997  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
1998  .info = snd_hdspm_info_system_sample_rate, \
1999  .get = snd_hdspm_get_system_sample_rate \
2000}
2001
2002static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
2003                                             struct snd_ctl_elem_info *uinfo)
2004{
2005        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2006        uinfo->count = 1;
2007        uinfo->value.integer.min = 27000;
2008        uinfo->value.integer.max = 207000;
2009        uinfo->value.integer.step = 1;
2010        return 0;
2011}
2012
2013
2014static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
2015                                            struct snd_ctl_elem_value *
2016                                            ucontrol)
2017{
2018        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2019
2020        ucontrol->value.integer.value[0] = hdspm_get_system_sample_rate(hdspm);
2021        return 0;
2022}
2023
2024
2025/**
2026 * Returns the WordClock sample rate class for the given card.
2027 **/
2028static int hdspm_get_wc_sample_rate(struct hdspm *hdspm)
2029{
2030        int status;
2031
2032        switch (hdspm->io_type) {
2033        case RayDAT:
2034        case AIO:
2035                status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2036                return (status >> 16) & 0xF;
2037                break;
2038        default:
2039                break;
2040        }
2041
2042
2043        return 0;
2044}
2045
2046
2047/**
2048 * Returns the TCO sample rate class for the given card.
2049 **/
2050static int hdspm_get_tco_sample_rate(struct hdspm *hdspm)
2051{
2052        int status;
2053
2054        if (hdspm->tco) {
2055                switch (hdspm->io_type) {
2056                case RayDAT:
2057                case AIO:
2058                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
2059                        return (status >> 20) & 0xF;
2060                        break;
2061                default:
2062                        break;
2063                }
2064        }
2065
2066        return 0;
2067}
2068
2069
2070/**
2071 * Returns the SYNC_IN sample rate class for the given card.
2072 **/
2073static int hdspm_get_sync_in_sample_rate(struct hdspm *hdspm)
2074{
2075        int status;
2076
2077        if (hdspm->tco) {
2078                switch (hdspm->io_type) {
2079                case RayDAT:
2080                case AIO:
2081                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2082                        return (status >> 12) & 0xF;
2083                        break;
2084                default:
2085                        break;
2086                }
2087        }
2088
2089        return 0;
2090}
2091
2092
2093/**
2094 * Returns the sample rate class for input source <idx> for
2095 * 'new style' cards like the AIO and RayDAT.
2096 **/
2097static int hdspm_get_s1_sample_rate(struct hdspm *hdspm, unsigned int idx)
2098{
2099        int status = hdspm_read(hdspm, HDSPM_RD_STATUS_2);
2100
2101        return (status >> (idx*4)) & 0xF;
2102}
2103
2104
2105
2106#define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
2107{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2108        .name = xname, \
2109        .private_value = xindex, \
2110        .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2111        .info = snd_hdspm_info_autosync_sample_rate, \
2112        .get = snd_hdspm_get_autosync_sample_rate \
2113}
2114
2115
2116static int snd_hdspm_info_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2117                                               struct snd_ctl_elem_info *uinfo)
2118{
2119        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2120        uinfo->count = 1;
2121        uinfo->value.enumerated.items = 10;
2122
2123        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2124                uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
2125        strcpy(uinfo->value.enumerated.name,
2126                        texts_freq[uinfo->value.enumerated.item]);
2127        return 0;
2128}
2129
2130
2131static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
2132                                              struct snd_ctl_elem_value *
2133                                              ucontrol)
2134{
2135        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2136
2137        switch (hdspm->io_type) {
2138        case RayDAT:
2139                switch (kcontrol->private_value) {
2140                case 0:
2141                        ucontrol->value.enumerated.item[0] =
2142                                hdspm_get_wc_sample_rate(hdspm);
2143                        break;
2144                case 7:
2145                        ucontrol->value.enumerated.item[0] =
2146                                hdspm_get_tco_sample_rate(hdspm);
2147                        break;
2148                case 8:
2149                        ucontrol->value.enumerated.item[0] =
2150                                hdspm_get_sync_in_sample_rate(hdspm);
2151                        break;
2152                default:
2153                        ucontrol->value.enumerated.item[0] =
2154                                hdspm_get_s1_sample_rate(hdspm,
2155                                                kcontrol->private_value-1);
2156                }
2157
2158        case AIO:
2159                switch (kcontrol->private_value) {
2160                case 0: /* WC */
2161                        ucontrol->value.enumerated.item[0] =
2162                                hdspm_get_wc_sample_rate(hdspm);
2163                        break;
2164                case 4: /* TCO */
2165                        ucontrol->value.enumerated.item[0] =
2166                                hdspm_get_tco_sample_rate(hdspm);
2167                        break;
2168                case 5: /* SYNC_IN */
2169                        ucontrol->value.enumerated.item[0] =
2170                                hdspm_get_sync_in_sample_rate(hdspm);
2171                        break;
2172                default:
2173                        ucontrol->value.enumerated.item[0] =
2174                                hdspm_get_s1_sample_rate(hdspm,
2175                                                ucontrol->id.index-1);
2176                }
2177
2178        case AES32:
2179
2180                switch (kcontrol->private_value) {
2181                case 0: /* WC */
2182                        ucontrol->value.enumerated.item[0] =
2183                                hdspm_get_wc_sample_rate(hdspm);
2184                        break;
2185                case 9: /* TCO */
2186                        ucontrol->value.enumerated.item[0] =
2187                                hdspm_get_tco_sample_rate(hdspm);
2188                        break;
2189                case 10: /* SYNC_IN */
2190                        ucontrol->value.enumerated.item[0] =
2191                                hdspm_get_sync_in_sample_rate(hdspm);
2192                        break;
2193                default: /* AES1 to AES8 */
2194                        ucontrol->value.enumerated.item[0] =
2195                                hdspm_get_s1_sample_rate(hdspm,
2196                                                kcontrol->private_value-1);
2197                        break;
2198
2199                }
2200        default:
2201                break;
2202        }
2203
2204        return 0;
2205}
2206
2207
2208#define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \
2209{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2210        .name = xname, \
2211        .index = xindex, \
2212        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2213                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2214        .info = snd_hdspm_info_system_clock_mode, \
2215        .get = snd_hdspm_get_system_clock_mode, \
2216        .put = snd_hdspm_put_system_clock_mode, \
2217}
2218
2219
2220/**
2221 * Returns the system clock mode for the given card.
2222 * @returns 0 - master, 1 - slave
2223 **/
2224static int hdspm_system_clock_mode(struct hdspm *hdspm)
2225{
2226        switch (hdspm->io_type) {
2227        case AIO:
2228        case RayDAT:
2229                if (hdspm->settings_register & HDSPM_c0Master)
2230                        return 0;
2231                break;
2232
2233        default:
2234                if (hdspm->control_register & HDSPM_ClockModeMaster)
2235                        return 0;
2236        }
2237
2238        return 1;
2239}
2240
2241
2242/**
2243 * Sets the system clock mode.
2244 * @param mode 0 - master, 1 - slave
2245 **/
2246static void hdspm_set_system_clock_mode(struct hdspm *hdspm, int mode)
2247{
2248        switch (hdspm->io_type) {
2249        case AIO:
2250        case RayDAT:
2251                if (0 == mode)
2252                        hdspm->settings_register |= HDSPM_c0Master;
2253                else
2254                        hdspm->settings_register &= ~HDSPM_c0Master;
2255
2256                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2257                break;
2258
2259        default:
2260                if (0 == mode)
2261                        hdspm->control_register |= HDSPM_ClockModeMaster;
2262                else
2263                        hdspm->control_register &= ~HDSPM_ClockModeMaster;
2264
2265                hdspm_write(hdspm, HDSPM_controlRegister,
2266                                hdspm->control_register);
2267        }
2268}
2269
2270
2271static int snd_hdspm_info_system_clock_mode(struct snd_kcontrol *kcontrol,
2272                                            struct snd_ctl_elem_info *uinfo)
2273{
2274        static char *texts[] = { "Master", "AutoSync" };
2275
2276        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2277        uinfo->count = 1;
2278        uinfo->value.enumerated.items = 2;
2279        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2280                uinfo->value.enumerated.item =
2281                    uinfo->value.enumerated.items - 1;
2282        strcpy(uinfo->value.enumerated.name,
2283               texts[uinfo->value.enumerated.item]);
2284        return 0;
2285}
2286
2287static int snd_hdspm_get_system_clock_mode(struct snd_kcontrol *kcontrol,
2288                                           struct snd_ctl_elem_value *ucontrol)
2289{
2290        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2291
2292        ucontrol->value.enumerated.item[0] = hdspm_system_clock_mode(hdspm);
2293        return 0;
2294}
2295
2296static int snd_hdspm_put_system_clock_mode(struct snd_kcontrol *kcontrol,
2297                                           struct snd_ctl_elem_value *ucontrol)
2298{
2299        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2300        int val;
2301
2302        if (!snd_hdspm_use_is_exclusive(hdspm))
2303                return -EBUSY;
2304
2305        val = ucontrol->value.enumerated.item[0];
2306        if (val < 0)
2307                val = 0;
2308        else if (val > 1)
2309                val = 1;
2310
2311        hdspm_set_system_clock_mode(hdspm, val);
2312
2313        return 0;
2314}
2315
2316
2317#define HDSPM_INTERNAL_CLOCK(xname, xindex) \
2318{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2319        .name = xname, \
2320        .index = xindex, \
2321        .info = snd_hdspm_info_clock_source, \
2322        .get = snd_hdspm_get_clock_source, \
2323        .put = snd_hdspm_put_clock_source \
2324}
2325
2326
2327static int hdspm_clock_source(struct hdspm * hdspm)
2328{
2329        switch (hdspm->system_sample_rate) {
2330        case 32000: return 0;
2331        case 44100: return 1;
2332        case 48000: return 2;
2333        case 64000: return 3;
2334        case 88200: return 4;
2335        case 96000: return 5;
2336        case 128000: return 6;
2337        case 176400: return 7;
2338        case 192000: return 8;
2339        }
2340
2341        return -1;
2342}
2343
2344static int hdspm_set_clock_source(struct hdspm * hdspm, int mode)
2345{
2346        int rate;
2347        switch (mode) {
2348        case 0:
2349                rate = 32000; break;
2350        case 1:
2351                rate = 44100; break;
2352        case 2:
2353                rate = 48000; break;
2354        case 3:
2355                rate = 64000; break;
2356        case 4:
2357                rate = 88200; break;
2358        case 5:
2359                rate = 96000; break;
2360        case 6:
2361                rate = 128000; break;
2362        case 7:
2363                rate = 176400; break;
2364        case 8:
2365                rate = 192000; break;
2366        default:
2367                rate = 48000;
2368        }
2369        hdspm_set_rate(hdspm, rate, 1);
2370        return 0;
2371}
2372
2373static int snd_hdspm_info_clock_source(struct snd_kcontrol *kcontrol,
2374                                       struct snd_ctl_elem_info *uinfo)
2375{
2376        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2377        uinfo->count = 1;
2378        uinfo->value.enumerated.items = 9;
2379
2380        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2381                uinfo->value.enumerated.item =
2382                    uinfo->value.enumerated.items - 1;
2383
2384        strcpy(uinfo->value.enumerated.name,
2385               texts_freq[uinfo->value.enumerated.item+1]);
2386
2387        return 0;
2388}
2389
2390static int snd_hdspm_get_clock_source(struct snd_kcontrol *kcontrol,
2391                                      struct snd_ctl_elem_value *ucontrol)
2392{
2393        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2394
2395        ucontrol->value.enumerated.item[0] = hdspm_clock_source(hdspm);
2396        return 0;
2397}
2398
2399static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
2400                                      struct snd_ctl_elem_value *ucontrol)
2401{
2402        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2403        int change;
2404        int val;
2405
2406        if (!snd_hdspm_use_is_exclusive(hdspm))
2407                return -EBUSY;
2408        val = ucontrol->value.enumerated.item[0];
2409        if (val < 0)
2410                val = 0;
2411        if (val > 9)
2412                val = 9;
2413        spin_lock_irq(&hdspm->lock);
2414        if (val != hdspm_clock_source(hdspm))
2415                change = (hdspm_set_clock_source(hdspm, val) == 0) ? 1 : 0;
2416        else
2417                change = 0;
2418        spin_unlock_irq(&hdspm->lock);
2419        return change;
2420}
2421
2422
2423#define HDSPM_PREF_SYNC_REF(xname, xindex) \
2424{.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2425        .name = xname, \
2426        .index = xindex, \
2427        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
2428                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
2429        .info = snd_hdspm_info_pref_sync_ref, \
2430        .get = snd_hdspm_get_pref_sync_ref, \
2431        .put = snd_hdspm_put_pref_sync_ref \
2432}
2433
2434
2435/**
2436 * Returns the current preferred sync reference setting.
2437 * The semantics of the return value are depending on the
2438 * card, please see the comments for clarification.
2439 **/
2440static int hdspm_pref_sync_ref(struct hdspm * hdspm)
2441{
2442        switch (hdspm->io_type) {
2443        case AES32:
2444                switch (hdspm->control_register & HDSPM_SyncRefMask) {
2445                case 0: return 0;  /* WC */
2446                case HDSPM_SyncRef0: return 1; /* AES 1 */
2447                case HDSPM_SyncRef1: return 2; /* AES 2 */
2448                case HDSPM_SyncRef1+HDSPM_SyncRef0: return 3; /* AES 3 */
2449                case HDSPM_SyncRef2: return 4; /* AES 4 */
2450                case HDSPM_SyncRef2+HDSPM_SyncRef0: return 5; /* AES 5 */
2451                case HDSPM_SyncRef2+HDSPM_SyncRef1: return 6; /* AES 6 */
2452                case HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0:
2453                                                    return 7; /* AES 7 */
2454                case HDSPM_SyncRef3: return 8; /* AES 8 */
2455                case HDSPM_SyncRef3+HDSPM_SyncRef0: return 9; /* TCO */
2456                }
2457                break;
2458
2459        case MADI:
2460        case MADIface:
2461                if (hdspm->tco) {
2462                        switch (hdspm->control_register & HDSPM_SyncRefMask) {
2463                        case 0: return 0;  /* WC */
2464                        case HDSPM_SyncRef0: return 1;  /* MADI */
2465                        case HDSPM_SyncRef1: return 2;  /* TCO */
2466                        case HDSPM_SyncRef1+HDSPM_SyncRef0:
2467                                             return 3;  /* SYNC_IN */
2468                        }
2469                } else {
2470                        switch (hdspm->control_register & HDSPM_SyncRefMask) {
2471                        case 0: return 0;  /* WC */
2472                        case HDSPM_SyncRef0: return 1;  /* MADI */
2473                        case HDSPM_SyncRef1+HDSPM_SyncRef0:
2474                                             return 2;  /* SYNC_IN */
2475                        }
2476                }
2477                break;
2478
2479        case RayDAT:
2480                if (hdspm->tco) {
2481                        switch ((hdspm->settings_register &
2482                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2483                        case 0: return 0;  /* WC */
2484                        case 3: return 1;  /* ADAT 1 */
2485                        case 4: return 2;  /* ADAT 2 */
2486                        case 5: return 3;  /* ADAT 3 */
2487                        case 6: return 4;  /* ADAT 4 */
2488                        case 1: return 5;  /* AES */
2489                        case 2: return 6;  /* SPDIF */
2490                        case 9: return 7;  /* TCO */
2491                        case 10: return 8; /* SYNC_IN */
2492                        }
2493                } else {
2494                        switch ((hdspm->settings_register &
2495                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2496                        case 0: return 0;  /* WC */
2497                        case 3: return 1;  /* ADAT 1 */
2498                        case 4: return 2;  /* ADAT 2 */
2499                        case 5: return 3;  /* ADAT 3 */
2500                        case 6: return 4;  /* ADAT 4 */
2501                        case 1: return 5;  /* AES */
2502                        case 2: return 6;  /* SPDIF */
2503                        case 10: return 7; /* SYNC_IN */
2504                        }
2505                }
2506
2507                break;
2508
2509        case AIO:
2510                if (hdspm->tco) {
2511                        switch ((hdspm->settings_register &
2512                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2513                        case 0: return 0;  /* WC */
2514                        case 3: return 1;  /* ADAT */
2515                        case 1: return 2;  /* AES */
2516                        case 2: return 3;  /* SPDIF */
2517                        case 9: return 4;  /* TCO */
2518                        case 10: return 5; /* SYNC_IN */
2519                        }
2520                } else {
2521                        switch ((hdspm->settings_register &
2522                                HDSPM_c0_SyncRefMask) / HDSPM_c0_SyncRef0) {
2523                        case 0: return 0;  /* WC */
2524                        case 3: return 1;  /* ADAT */
2525                        case 1: return 2;  /* AES */
2526                        case 2: return 3;  /* SPDIF */
2527                        case 10: return 4; /* SYNC_IN */
2528                        }
2529                }
2530
2531                break;
2532        }
2533
2534        return -1;
2535}
2536
2537
2538/**
2539 * Set the preferred sync reference to <pref>. The semantics
2540 * of <pref> are depending on the card type, see the comments
2541 * for clarification.
2542 **/
2543static int hdspm_set_pref_sync_ref(struct hdspm * hdspm, int pref)
2544{
2545        int p = 0;
2546
2547        switch (hdspm->io_type) {
2548        case AES32:
2549                hdspm->control_register &= ~HDSPM_SyncRefMask;
2550                switch (pref) {
2551                case 0: /* WC  */
2552                        break;
2553                case 1: /* AES 1 */
2554                        hdspm->control_register |= HDSPM_SyncRef0;
2555                        break;
2556                case 2: /* AES 2 */
2557                        hdspm->control_register |= HDSPM_SyncRef1;
2558                        break;
2559                case 3: /* AES 3 */
2560                        hdspm->control_register |=
2561                                HDSPM_SyncRef1+HDSPM_SyncRef0;
2562                        break;
2563                case 4: /* AES 4 */
2564                        hdspm->control_register |= HDSPM_SyncRef2;
2565                        break;
2566                case 5: /* AES 5 */
2567                        hdspm->control_register |=
2568                                HDSPM_SyncRef2+HDSPM_SyncRef0;
2569                        break;
2570                case 6: /* AES 6 */
2571                        hdspm->control_register |=
2572                                HDSPM_SyncRef2+HDSPM_SyncRef1;
2573                        break;
2574                case 7: /* AES 7 */
2575                        hdspm->control_register |=
2576                                HDSPM_SyncRef2+HDSPM_SyncRef1+HDSPM_SyncRef0;
2577                        break;
2578                case 8: /* AES 8 */
2579                        hdspm->control_register |= HDSPM_SyncRef3;
2580                        break;
2581                case 9: /* TCO */
2582                        hdspm->control_register |=
2583                                HDSPM_SyncRef3+HDSPM_SyncRef0;
2584                        break;
2585                default:
2586                        return -1;
2587                }
2588
2589                break;
2590
2591        case MADI:
2592        case MADIface:
2593                hdspm->control_register &= ~HDSPM_SyncRefMask;
2594                if (hdspm->tco) {
2595                        switch (pref) {
2596                        case 0: /* WC */
2597                                break;
2598                        case 1: /* MADI */
2599                                hdspm->control_register |= HDSPM_SyncRef0;
2600                                break;
2601                        case 2: /* TCO */
2602                                hdspm->control_register |= HDSPM_SyncRef1;
2603                                break;
2604                        case 3: /* SYNC_IN */
2605                                hdspm->control_register |=
2606                                        HDSPM_SyncRef0+HDSPM_SyncRef1;
2607                                break;
2608                        default:
2609                                return -1;
2610                        }
2611                } else {
2612                        switch (pref) {
2613                        case 0: /* WC */
2614                                break;
2615                        case 1: /* MADI */
2616                                hdspm->control_register |= HDSPM_SyncRef0;
2617                                break;
2618                        case 2: /* SYNC_IN */
2619                                hdspm->control_register |=
2620                                        HDSPM_SyncRef0+HDSPM_SyncRef1;
2621                                break;
2622                        default:
2623                                return -1;
2624                        }
2625                }
2626
2627                break;
2628
2629        case RayDAT:
2630                if (hdspm->tco) {
2631                        switch (pref) {
2632                        case 0: p = 0; break;  /* WC */
2633                        case 1: p = 3; break;  /* ADAT 1 */
2634                        case 2: p = 4; break;  /* ADAT 2 */
2635                        case 3: p = 5; break;  /* ADAT 3 */
2636                        case 4: p = 6; break;  /* ADAT 4 */
2637                        case 5: p = 1; break;  /* AES */
2638                        case 6: p = 2; break;  /* SPDIF */
2639                        case 7: p = 9; break;  /* TCO */
2640                        case 8: p = 10; break; /* SYNC_IN */
2641                        default: return -1;
2642                        }
2643                } else {
2644                        switch (pref) {
2645                        case 0: p = 0; break;  /* WC */
2646                        case 1: p = 3; break;  /* ADAT 1 */
2647                        case 2: p = 4; break;  /* ADAT 2 */
2648                        case 3: p = 5; break;  /* ADAT 3 */
2649                        case 4: p = 6; break;  /* ADAT 4 */
2650                        case 5: p = 1; break;  /* AES */
2651                        case 6: p = 2; break;  /* SPDIF */
2652                        case 7: p = 10; break; /* SYNC_IN */
2653                        default: return -1;
2654                        }
2655                }
2656                break;
2657
2658        case AIO:
2659                if (hdspm->tco) {
2660                        switch (pref) {
2661                        case 0: p = 0; break;  /* WC */
2662                        case 1: p = 3; break;  /* ADAT */
2663                        case 2: p = 1; break;  /* AES */
2664                        case 3: p = 2; break;  /* SPDIF */
2665                        case 4: p = 9; break;  /* TCO */
2666                        case 5: p = 10; break; /* SYNC_IN */
2667                        default: return -1;
2668                        }
2669                } else {
2670                        switch (pref) {
2671                        case 0: p = 0; break;  /* WC */
2672                        case 1: p = 3; break;  /* ADAT */
2673                        case 2: p = 1; break;  /* AES */
2674                        case 3: p = 2; break;  /* SPDIF */
2675                        case 4: p = 10; break; /* SYNC_IN */
2676                        default: return -1;
2677                        }
2678                }
2679                break;
2680        }
2681
2682        switch (hdspm->io_type) {
2683        case RayDAT:
2684        case AIO:
2685                hdspm->settings_register &= ~HDSPM_c0_SyncRefMask;
2686                hdspm->settings_register |= HDSPM_c0_SyncRef0 * p;
2687                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
2688                break;
2689
2690        case MADI:
2691        case MADIface:
2692        case AES32:
2693                hdspm_write(hdspm, HDSPM_controlRegister,
2694                                hdspm->control_register);
2695        }
2696
2697        return 0;
2698}
2699
2700
2701static int snd_hdspm_info_pref_sync_ref(struct snd_kcontrol *kcontrol,
2702                                        struct snd_ctl_elem_info *uinfo)
2703{
2704        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2705
2706        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2707        uinfo->count = 1;
2708        uinfo->value.enumerated.items = hdspm->texts_autosync_items;
2709
2710        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
2711                uinfo->value.enumerated.item =
2712                        uinfo->value.enumerated.items - 1;
2713
2714        strcpy(uinfo->value.enumerated.name,
2715                        hdspm->texts_autosync[uinfo->value.enumerated.item]);
2716
2717        return 0;
2718}
2719
2720static int snd_hdspm_get_pref_sync_ref(struct snd_kcontrol *kcontrol,
2721                                       struct snd_ctl_elem_value *ucontrol)
2722{
2723        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2724        int psf = hdspm_pref_sync_ref(hdspm);
2725
2726        if (psf >= 0) {
2727                ucontrol->value.enumerated.item[0] = psf;
2728                return 0;
2729        }
2730
2731        return -1;
2732}
2733
2734static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
2735                                       struct snd_ctl_elem_value *ucontrol)
2736{
2737        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2738        int val, change = 0;
2739
2740        if (!snd_hdspm_use_is_exclusive(hdspm))
2741                return -EBUSY;
2742
2743        val = ucontrol->value.enumerated.item[0];
2744
2745        if (val < 0)
2746                val = 0;
2747        else if (val >= hdspm->texts_autosync_items)
2748                val = hdspm->texts_autosync_items-1;
2749
2750        spin_lock_irq(&hdspm->lock);
2751        if (val != hdspm_pref_sync_ref(hdspm))
2752                change = (0 == hdspm_set_pref_sync_ref(hdspm, val)) ? 1 : 0;
2753
2754        spin_unlock_irq(&hdspm->lock);
2755        return change;
2756}
2757
2758
2759#define HDSPM_AUTOSYNC_REF(xname, xindex) \
2760{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2761  .name = xname, \
2762  .index = xindex, \
2763  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
2764  .info = snd_hdspm_info_autosync_ref, \
2765  .get = snd_hdspm_get_autosync_ref, \
2766}
2767
2768static int hdspm_autosync_ref(struct hdspm *hdspm)
2769{
2770        if (AES32 == hdspm->io_type) {
2771                unsigned int status = hdspm_read(hdspm, HDSPM_statusRegister);
2772                unsigned int syncref =
2773                        (status >> HDSPM_AES32_syncref_bit) & 0xF;
2774                if (syncref == 0)
2775                        return HDSPM_AES32_AUTOSYNC_FROM_WORD;
2776                if (syncref <= 8)
2777                        return syncref;
2778                return HDSPM_AES32_AUTOSYNC_FROM_NONE;
2779        } else if (MADI == hdspm->io_type) {
2780                /* This looks at the autosync selected sync reference */
2781                unsigned int status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
2782
2783                switch (status2 & HDSPM_SelSyncRefMask) {
2784                case HDSPM_SelSyncRef_WORD:
2785                        return HDSPM_AUTOSYNC_FROM_WORD;
2786                case HDSPM_SelSyncRef_MADI:
2787                        return HDSPM_AUTOSYNC_FROM_MADI;
2788                case HDSPM_SelSyncRef_TCO:
2789                        return HDSPM_AUTOSYNC_FROM_TCO;
2790                case HDSPM_SelSyncRef_SyncIn:
2791                        return HDSPM_AUTOSYNC_FROM_SYNC_IN;
2792                case HDSPM_SelSyncRef_NVALID:
2793                        return HDSPM_AUTOSYNC_FROM_NONE;
2794                default:
2795                        return 0;
2796                }
2797
2798        }
2799        return 0;
2800}
2801
2802
2803static int snd_hdspm_info_autosync_ref(struct snd_kcontrol *kcontrol,
2804                                       struct snd_ctl_elem_info *uinfo)
2805{
2806        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2807
2808        if (AES32 == hdspm->io_type) {
2809                static char *texts[] = { "WordClock", "AES1", "AES2", "AES3",
2810                        "AES4", "AES5", "AES6", "AES7", "AES8", "None"};
2811
2812                uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2813                uinfo->count = 1;
2814                uinfo->value.enumerated.items = 10;
2815                if (uinfo->value.enumerated.item >=
2816                    uinfo->value.enumerated.items)
2817                        uinfo->value.enumerated.item =
2818                                uinfo->value.enumerated.items - 1;
2819                strcpy(uinfo->value.enumerated.name,
2820                                texts[uinfo->value.enumerated.item]);
2821        } else if (MADI == hdspm->io_type) {
2822                static char *texts[] = {"Word Clock", "MADI", "TCO",
2823                        "Sync In", "None" };
2824
2825                uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2826                uinfo->count = 1;
2827                uinfo->value.enumerated.items = 5;
2828                if (uinfo->value.enumerated.item >=
2829                                uinfo->value.enumerated.items)
2830                        uinfo->value.enumerated.item =
2831                                uinfo->value.enumerated.items - 1;
2832                strcpy(uinfo->value.enumerated.name,
2833                                texts[uinfo->value.enumerated.item]);
2834        }
2835        return 0;
2836}
2837
2838static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
2839                                      struct snd_ctl_elem_value *ucontrol)
2840{
2841        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2842
2843        ucontrol->value.enumerated.item[0] = hdspm_autosync_ref(hdspm);
2844        return 0;
2845}
2846
2847
2848#define HDSPM_LINE_OUT(xname, xindex) \
2849{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2850  .name = xname, \
2851  .index = xindex, \
2852  .info = snd_hdspm_info_line_out, \
2853  .get = snd_hdspm_get_line_out, \
2854  .put = snd_hdspm_put_line_out \
2855}
2856
2857static int hdspm_line_out(struct hdspm * hdspm)
2858{
2859        return (hdspm->control_register & HDSPM_LineOut) ? 1 : 0;
2860}
2861
2862
2863static int hdspm_set_line_output(struct hdspm * hdspm, int out)
2864{
2865        if (out)
2866                hdspm->control_register |= HDSPM_LineOut;
2867        else
2868                hdspm->control_register &= ~HDSPM_LineOut;
2869        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2870
2871        return 0;
2872}
2873
2874#define snd_hdspm_info_line_out         snd_ctl_boolean_mono_info
2875
2876static int snd_hdspm_get_line_out(struct snd_kcontrol *kcontrol,
2877                                  struct snd_ctl_elem_value *ucontrol)
2878{
2879        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2880
2881        spin_lock_irq(&hdspm->lock);
2882        ucontrol->value.integer.value[0] = hdspm_line_out(hdspm);
2883        spin_unlock_irq(&hdspm->lock);
2884        return 0;
2885}
2886
2887static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,
2888                                  struct snd_ctl_elem_value *ucontrol)
2889{
2890        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2891        int change;
2892        unsigned int val;
2893
2894        if (!snd_hdspm_use_is_exclusive(hdspm))
2895                return -EBUSY;
2896        val = ucontrol->value.integer.value[0] & 1;
2897        spin_lock_irq(&hdspm->lock);
2898        change = (int) val != hdspm_line_out(hdspm);
2899        hdspm_set_line_output(hdspm, val);
2900        spin_unlock_irq(&hdspm->lock);
2901        return change;
2902}
2903
2904
2905#define HDSPM_TX_64(xname, xindex) \
2906{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2907  .name = xname, \
2908  .index = xindex, \
2909  .info = snd_hdspm_info_tx_64, \
2910  .get = snd_hdspm_get_tx_64, \
2911  .put = snd_hdspm_put_tx_64 \
2912}
2913
2914static int hdspm_tx_64(struct hdspm * hdspm)
2915{
2916        return (hdspm->control_register & HDSPM_TX_64ch) ? 1 : 0;
2917}
2918
2919static int hdspm_set_tx_64(struct hdspm * hdspm, int out)
2920{
2921        if (out)
2922                hdspm->control_register |= HDSPM_TX_64ch;
2923        else
2924                hdspm->control_register &= ~HDSPM_TX_64ch;
2925        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2926
2927        return 0;
2928}
2929
2930#define snd_hdspm_info_tx_64            snd_ctl_boolean_mono_info
2931
2932static int snd_hdspm_get_tx_64(struct snd_kcontrol *kcontrol,
2933                               struct snd_ctl_elem_value *ucontrol)
2934{
2935        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2936
2937        spin_lock_irq(&hdspm->lock);
2938        ucontrol->value.integer.value[0] = hdspm_tx_64(hdspm);
2939        spin_unlock_irq(&hdspm->lock);
2940        return 0;
2941}
2942
2943static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,
2944                               struct snd_ctl_elem_value *ucontrol)
2945{
2946        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2947        int change;
2948        unsigned int val;
2949
2950        if (!snd_hdspm_use_is_exclusive(hdspm))
2951                return -EBUSY;
2952        val = ucontrol->value.integer.value[0] & 1;
2953        spin_lock_irq(&hdspm->lock);
2954        change = (int) val != hdspm_tx_64(hdspm);
2955        hdspm_set_tx_64(hdspm, val);
2956        spin_unlock_irq(&hdspm->lock);
2957        return change;
2958}
2959
2960
2961#define HDSPM_C_TMS(xname, xindex) \
2962{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2963  .name = xname, \
2964  .index = xindex, \
2965  .info = snd_hdspm_info_c_tms, \
2966  .get = snd_hdspm_get_c_tms, \
2967  .put = snd_hdspm_put_c_tms \
2968}
2969
2970static int hdspm_c_tms(struct hdspm * hdspm)
2971{
2972        return (hdspm->control_register & HDSPM_clr_tms) ? 1 : 0;
2973}
2974
2975static int hdspm_set_c_tms(struct hdspm * hdspm, int out)
2976{
2977        if (out)
2978                hdspm->control_register |= HDSPM_clr_tms;
2979        else
2980                hdspm->control_register &= ~HDSPM_clr_tms;
2981        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
2982
2983        return 0;
2984}
2985
2986#define snd_hdspm_info_c_tms            snd_ctl_boolean_mono_info
2987
2988static int snd_hdspm_get_c_tms(struct snd_kcontrol *kcontrol,
2989                               struct snd_ctl_elem_value *ucontrol)
2990{
2991        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
2992
2993        spin_lock_irq(&hdspm->lock);
2994        ucontrol->value.integer.value[0] = hdspm_c_tms(hdspm);
2995        spin_unlock_irq(&hdspm->lock);
2996        return 0;
2997}
2998
2999static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,
3000                               struct snd_ctl_elem_value *ucontrol)
3001{
3002        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3003        int change;
3004        unsigned int val;
3005
3006        if (!snd_hdspm_use_is_exclusive(hdspm))
3007                return -EBUSY;
3008        val = ucontrol->value.integer.value[0] & 1;
3009        spin_lock_irq(&hdspm->lock);
3010        change = (int) val != hdspm_c_tms(hdspm);
3011        hdspm_set_c_tms(hdspm, val);
3012        spin_unlock_irq(&hdspm->lock);
3013        return change;
3014}
3015
3016
3017#define HDSPM_SAFE_MODE(xname, xindex) \
3018{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3019  .name = xname, \
3020  .index = xindex, \
3021  .info = snd_hdspm_info_safe_mode, \
3022  .get = snd_hdspm_get_safe_mode, \
3023  .put = snd_hdspm_put_safe_mode \
3024}
3025
3026static int hdspm_safe_mode(struct hdspm * hdspm)
3027{
3028        return (hdspm->control_register & HDSPM_AutoInp) ? 1 : 0;
3029}
3030
3031static int hdspm_set_safe_mode(struct hdspm * hdspm, int out)
3032{
3033        if (out)
3034                hdspm->control_register |= HDSPM_AutoInp;
3035        else
3036                hdspm->control_register &= ~HDSPM_AutoInp;
3037        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3038
3039        return 0;
3040}
3041
3042#define snd_hdspm_info_safe_mode        snd_ctl_boolean_mono_info
3043
3044static int snd_hdspm_get_safe_mode(struct snd_kcontrol *kcontrol,
3045                                   struct snd_ctl_elem_value *ucontrol)
3046{
3047        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3048
3049        spin_lock_irq(&hdspm->lock);
3050        ucontrol->value.integer.value[0] = hdspm_safe_mode(hdspm);
3051        spin_unlock_irq(&hdspm->lock);
3052        return 0;
3053}
3054
3055static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,
3056                                   struct snd_ctl_elem_value *ucontrol)
3057{
3058        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3059        int change;
3060        unsigned int val;
3061
3062        if (!snd_hdspm_use_is_exclusive(hdspm))
3063                return -EBUSY;
3064        val = ucontrol->value.integer.value[0] & 1;
3065        spin_lock_irq(&hdspm->lock);
3066        change = (int) val != hdspm_safe_mode(hdspm);
3067        hdspm_set_safe_mode(hdspm, val);
3068        spin_unlock_irq(&hdspm->lock);
3069        return change;
3070}
3071
3072
3073#define HDSPM_EMPHASIS(xname, xindex) \
3074{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3075  .name = xname, \
3076  .index = xindex, \
3077  .info = snd_hdspm_info_emphasis, \
3078  .get = snd_hdspm_get_emphasis, \
3079  .put = snd_hdspm_put_emphasis \
3080}
3081
3082static int hdspm_emphasis(struct hdspm * hdspm)
3083{
3084        return (hdspm->control_register & HDSPM_Emphasis) ? 1 : 0;
3085}
3086
3087static int hdspm_set_emphasis(struct hdspm * hdspm, int emp)
3088{
3089        if (emp)
3090                hdspm->control_register |= HDSPM_Emphasis;
3091        else
3092                hdspm->control_register &= ~HDSPM_Emphasis;
3093        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3094
3095        return 0;
3096}
3097
3098#define snd_hdspm_info_emphasis         snd_ctl_boolean_mono_info
3099
3100static int snd_hdspm_get_emphasis(struct snd_kcontrol *kcontrol,
3101                                  struct snd_ctl_elem_value *ucontrol)
3102{
3103        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3104
3105        spin_lock_irq(&hdspm->lock);
3106        ucontrol->value.enumerated.item[0] = hdspm_emphasis(hdspm);
3107        spin_unlock_irq(&hdspm->lock);
3108        return 0;
3109}
3110
3111static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,
3112                                  struct snd_ctl_elem_value *ucontrol)
3113{
3114        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3115        int change;
3116        unsigned int val;
3117
3118        if (!snd_hdspm_use_is_exclusive(hdspm))
3119                return -EBUSY;
3120        val = ucontrol->value.integer.value[0] & 1;
3121        spin_lock_irq(&hdspm->lock);
3122        change = (int) val != hdspm_emphasis(hdspm);
3123        hdspm_set_emphasis(hdspm, val);
3124        spin_unlock_irq(&hdspm->lock);
3125        return change;
3126}
3127
3128
3129#define HDSPM_DOLBY(xname, xindex) \
3130{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3131  .name = xname, \
3132  .index = xindex, \
3133  .info = snd_hdspm_info_dolby, \
3134  .get = snd_hdspm_get_dolby, \
3135  .put = snd_hdspm_put_dolby \
3136}
3137
3138static int hdspm_dolby(struct hdspm * hdspm)
3139{
3140        return (hdspm->control_register & HDSPM_Dolby) ? 1 : 0;
3141}
3142
3143static int hdspm_set_dolby(struct hdspm * hdspm, int dol)
3144{
3145        if (dol)
3146                hdspm->control_register |= HDSPM_Dolby;
3147        else
3148                hdspm->control_register &= ~HDSPM_Dolby;
3149        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3150
3151        return 0;
3152}
3153
3154#define snd_hdspm_info_dolby            snd_ctl_boolean_mono_info
3155
3156static int snd_hdspm_get_dolby(struct snd_kcontrol *kcontrol,
3157                               struct snd_ctl_elem_value *ucontrol)
3158{
3159        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3160
3161        spin_lock_irq(&hdspm->lock);
3162        ucontrol->value.enumerated.item[0] = hdspm_dolby(hdspm);
3163        spin_unlock_irq(&hdspm->lock);
3164        return 0;
3165}
3166
3167static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,
3168                               struct snd_ctl_elem_value *ucontrol)
3169{
3170        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3171        int change;
3172        unsigned int val;
3173
3174        if (!snd_hdspm_use_is_exclusive(hdspm))
3175                return -EBUSY;
3176        val = ucontrol->value.integer.value[0] & 1;
3177        spin_lock_irq(&hdspm->lock);
3178        change = (int) val != hdspm_dolby(hdspm);
3179        hdspm_set_dolby(hdspm, val);
3180        spin_unlock_irq(&hdspm->lock);
3181        return change;
3182}
3183
3184
3185#define HDSPM_PROFESSIONAL(xname, xindex) \
3186{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3187  .name = xname, \
3188  .index = xindex, \
3189  .info = snd_hdspm_info_professional, \
3190  .get = snd_hdspm_get_professional, \
3191  .put = snd_hdspm_put_professional \
3192}
3193
3194static int hdspm_professional(struct hdspm * hdspm)
3195{
3196        return (hdspm->control_register & HDSPM_Professional) ? 1 : 0;
3197}
3198
3199static int hdspm_set_professional(struct hdspm * hdspm, int dol)
3200{
3201        if (dol)
3202                hdspm->control_register |= HDSPM_Professional;
3203        else
3204                hdspm->control_register &= ~HDSPM_Professional;
3205        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3206
3207        return 0;
3208}
3209
3210#define snd_hdspm_info_professional     snd_ctl_boolean_mono_info
3211
3212static int snd_hdspm_get_professional(struct snd_kcontrol *kcontrol,
3213                                      struct snd_ctl_elem_value *ucontrol)
3214{
3215        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3216
3217        spin_lock_irq(&hdspm->lock);
3218        ucontrol->value.enumerated.item[0] = hdspm_professional(hdspm);
3219        spin_unlock_irq(&hdspm->lock);
3220        return 0;
3221}
3222
3223static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,
3224                                      struct snd_ctl_elem_value *ucontrol)
3225{
3226        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3227        int change;
3228        unsigned int val;
3229
3230        if (!snd_hdspm_use_is_exclusive(hdspm))
3231                return -EBUSY;
3232        val = ucontrol->value.integer.value[0] & 1;
3233        spin_lock_irq(&hdspm->lock);
3234        change = (int) val != hdspm_professional(hdspm);
3235        hdspm_set_professional(hdspm, val);
3236        spin_unlock_irq(&hdspm->lock);
3237        return change;
3238}
3239
3240#define HDSPM_INPUT_SELECT(xname, xindex) \
3241{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3242  .name = xname, \
3243  .index = xindex, \
3244  .info = snd_hdspm_info_input_select, \
3245  .get = snd_hdspm_get_input_select, \
3246  .put = snd_hdspm_put_input_select \
3247}
3248
3249static int hdspm_input_select(struct hdspm * hdspm)
3250{
3251        return (hdspm->control_register & HDSPM_InputSelect0) ? 1 : 0;
3252}
3253
3254static int hdspm_set_input_select(struct hdspm * hdspm, int out)
3255{
3256        if (out)
3257                hdspm->control_register |= HDSPM_InputSelect0;
3258        else
3259                hdspm->control_register &= ~HDSPM_InputSelect0;
3260        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3261
3262        return 0;
3263}
3264
3265static int snd_hdspm_info_input_select(struct snd_kcontrol *kcontrol,
3266                                       struct snd_ctl_elem_info *uinfo)
3267{
3268        static char *texts[] = { "optical", "coaxial" };
3269
3270        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3271        uinfo->count = 1;
3272        uinfo->value.enumerated.items = 2;
3273
3274        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3275                uinfo->value.enumerated.item =
3276                    uinfo->value.enumerated.items - 1;
3277        strcpy(uinfo->value.enumerated.name,
3278               texts[uinfo->value.enumerated.item]);
3279
3280        return 0;
3281}
3282
3283static int snd_hdspm_get_input_select(struct snd_kcontrol *kcontrol,
3284                                      struct snd_ctl_elem_value *ucontrol)
3285{
3286        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3287
3288        spin_lock_irq(&hdspm->lock);
3289        ucontrol->value.enumerated.item[0] = hdspm_input_select(hdspm);
3290        spin_unlock_irq(&hdspm->lock);
3291        return 0;
3292}
3293
3294static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
3295                                      struct snd_ctl_elem_value *ucontrol)
3296{
3297        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3298        int change;
3299        unsigned int val;
3300
3301        if (!snd_hdspm_use_is_exclusive(hdspm))
3302                return -EBUSY;
3303        val = ucontrol->value.integer.value[0] & 1;
3304        spin_lock_irq(&hdspm->lock);
3305        change = (int) val != hdspm_input_select(hdspm);
3306        hdspm_set_input_select(hdspm, val);
3307        spin_unlock_irq(&hdspm->lock);
3308        return change;
3309}
3310
3311
3312#define HDSPM_DS_WIRE(xname, xindex) \
3313{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3314  .name = xname, \
3315  .index = xindex, \
3316  .info = snd_hdspm_info_ds_wire, \
3317  .get = snd_hdspm_get_ds_wire, \
3318  .put = snd_hdspm_put_ds_wire \
3319}
3320
3321static int hdspm_ds_wire(struct hdspm * hdspm)
3322{
3323        return (hdspm->control_register & HDSPM_DS_DoubleWire) ? 1 : 0;
3324}
3325
3326static int hdspm_set_ds_wire(struct hdspm * hdspm, int ds)
3327{
3328        if (ds)
3329                hdspm->control_register |= HDSPM_DS_DoubleWire;
3330        else
3331                hdspm->control_register &= ~HDSPM_DS_DoubleWire;
3332        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3333
3334        return 0;
3335}
3336
3337static int snd_hdspm_info_ds_wire(struct snd_kcontrol *kcontrol,
3338                                  struct snd_ctl_elem_info *uinfo)
3339{
3340        static char *texts[] = { "Single", "Double" };
3341
3342        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3343        uinfo->count = 1;
3344        uinfo->value.enumerated.items = 2;
3345
3346        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3347                uinfo->value.enumerated.item =
3348                    uinfo->value.enumerated.items - 1;
3349        strcpy(uinfo->value.enumerated.name,
3350               texts[uinfo->value.enumerated.item]);
3351
3352        return 0;
3353}
3354
3355static int snd_hdspm_get_ds_wire(struct snd_kcontrol *kcontrol,
3356                                 struct snd_ctl_elem_value *ucontrol)
3357{
3358        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3359
3360        spin_lock_irq(&hdspm->lock);
3361        ucontrol->value.enumerated.item[0] = hdspm_ds_wire(hdspm);
3362        spin_unlock_irq(&hdspm->lock);
3363        return 0;
3364}
3365
3366static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
3367                                 struct snd_ctl_elem_value *ucontrol)
3368{
3369        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3370        int change;
3371        unsigned int val;
3372
3373        if (!snd_hdspm_use_is_exclusive(hdspm))
3374                return -EBUSY;
3375        val = ucontrol->value.integer.value[0] & 1;
3376        spin_lock_irq(&hdspm->lock);
3377        change = (int) val != hdspm_ds_wire(hdspm);
3378        hdspm_set_ds_wire(hdspm, val);
3379        spin_unlock_irq(&hdspm->lock);
3380        return change;
3381}
3382
3383
3384#define HDSPM_QS_WIRE(xname, xindex) \
3385{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3386  .name = xname, \
3387  .index = xindex, \
3388  .info = snd_hdspm_info_qs_wire, \
3389  .get = snd_hdspm_get_qs_wire, \
3390  .put = snd_hdspm_put_qs_wire \
3391}
3392
3393static int hdspm_qs_wire(struct hdspm * hdspm)
3394{
3395        if (hdspm->control_register & HDSPM_QS_DoubleWire)
3396                return 1;
3397        if (hdspm->control_register & HDSPM_QS_QuadWire)
3398                return 2;
3399        return 0;
3400}
3401
3402static int hdspm_set_qs_wire(struct hdspm * hdspm, int mode)
3403{
3404        hdspm->control_register &= ~(HDSPM_QS_DoubleWire | HDSPM_QS_QuadWire);
3405        switch (mode) {
3406        case 0:
3407                break;
3408        case 1:
3409                hdspm->control_register |= HDSPM_QS_DoubleWire;
3410                break;
3411        case 2:
3412                hdspm->control_register |= HDSPM_QS_QuadWire;
3413                break;
3414        }
3415        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3416
3417        return 0;
3418}
3419
3420static int snd_hdspm_info_qs_wire(struct snd_kcontrol *kcontrol,
3421                                       struct snd_ctl_elem_info *uinfo)
3422{
3423        static char *texts[] = { "Single", "Double", "Quad" };
3424
3425        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3426        uinfo->count = 1;
3427        uinfo->value.enumerated.items = 3;
3428
3429        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3430                uinfo->value.enumerated.item =
3431                    uinfo->value.enumerated.items - 1;
3432        strcpy(uinfo->value.enumerated.name,
3433               texts[uinfo->value.enumerated.item]);
3434
3435        return 0;
3436}
3437
3438static int snd_hdspm_get_qs_wire(struct snd_kcontrol *kcontrol,
3439                                      struct snd_ctl_elem_value *ucontrol)
3440{
3441        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3442
3443        spin_lock_irq(&hdspm->lock);
3444        ucontrol->value.enumerated.item[0] = hdspm_qs_wire(hdspm);
3445        spin_unlock_irq(&hdspm->lock);
3446        return 0;
3447}
3448
3449static int snd_hdspm_put_qs_wire(struct snd_kcontrol *kcontrol,
3450                                      struct snd_ctl_elem_value *ucontrol)
3451{
3452        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3453        int change;
3454        int val;
3455
3456        if (!snd_hdspm_use_is_exclusive(hdspm))
3457                return -EBUSY;
3458        val = ucontrol->value.integer.value[0];
3459        if (val < 0)
3460                val = 0;
3461        if (val > 2)
3462                val = 2;
3463        spin_lock_irq(&hdspm->lock);
3464        change = val != hdspm_qs_wire(hdspm);
3465        hdspm_set_qs_wire(hdspm, val);
3466        spin_unlock_irq(&hdspm->lock);
3467        return change;
3468}
3469
3470#define HDSPM_MADI_SPEEDMODE(xname, xindex) \
3471{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3472        .name = xname, \
3473        .index = xindex, \
3474        .info = snd_hdspm_info_madi_speedmode, \
3475        .get = snd_hdspm_get_madi_speedmode, \
3476        .put = snd_hdspm_put_madi_speedmode \
3477}
3478
3479static int hdspm_madi_speedmode(struct hdspm *hdspm)
3480{
3481        if (hdspm->control_register & HDSPM_QuadSpeed)
3482                return 2;
3483        if (hdspm->control_register & HDSPM_DoubleSpeed)
3484                return 1;
3485        return 0;
3486}
3487
3488static int hdspm_set_madi_speedmode(struct hdspm *hdspm, int mode)
3489{
3490        hdspm->control_register &= ~(HDSPM_DoubleSpeed | HDSPM_QuadSpeed);
3491        switch (mode) {
3492        case 0:
3493                break;
3494        case 1:
3495                hdspm->control_register |= HDSPM_DoubleSpeed;
3496                break;
3497        case 2:
3498                hdspm->control_register |= HDSPM_QuadSpeed;
3499                break;
3500        }
3501        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
3502
3503        return 0;
3504}
3505
3506static int snd_hdspm_info_madi_speedmode(struct snd_kcontrol *kcontrol,
3507                                       struct snd_ctl_elem_info *uinfo)
3508{
3509        static char *texts[] = { "Single", "Double", "Quad" };
3510
3511        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3512        uinfo->count = 1;
3513        uinfo->value.enumerated.items = 3;
3514
3515        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3516                uinfo->value.enumerated.item =
3517                    uinfo->value.enumerated.items - 1;
3518        strcpy(uinfo->value.enumerated.name,
3519               texts[uinfo->value.enumerated.item]);
3520
3521        return 0;
3522}
3523
3524static int snd_hdspm_get_madi_speedmode(struct snd_kcontrol *kcontrol,
3525                                      struct snd_ctl_elem_value *ucontrol)
3526{
3527        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3528
3529        spin_lock_irq(&hdspm->lock);
3530        ucontrol->value.enumerated.item[0] = hdspm_madi_speedmode(hdspm);
3531        spin_unlock_irq(&hdspm->lock);
3532        return 0;
3533}
3534
3535static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
3536                                      struct snd_ctl_elem_value *ucontrol)
3537{
3538        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3539        int change;
3540        int val;
3541
3542        if (!snd_hdspm_use_is_exclusive(hdspm))
3543                return -EBUSY;
3544        val = ucontrol->value.integer.value[0];
3545        if (val < 0)
3546                val = 0;
3547        if (val > 2)
3548                val = 2;
3549        spin_lock_irq(&hdspm->lock);
3550        change = val != hdspm_madi_speedmode(hdspm);
3551        hdspm_set_madi_speedmode(hdspm, val);
3552        spin_unlock_irq(&hdspm->lock);
3553        return change;
3554}
3555
3556#define HDSPM_MIXER(xname, xindex) \
3557{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
3558  .name = xname, \
3559  .index = xindex, \
3560  .device = 0, \
3561  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
3562                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3563  .info = snd_hdspm_info_mixer, \
3564  .get = snd_hdspm_get_mixer, \
3565  .put = snd_hdspm_put_mixer \
3566}
3567
3568static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
3569                                struct snd_ctl_elem_info *uinfo)
3570{
3571        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3572        uinfo->count = 3;
3573        uinfo->value.integer.min = 0;
3574        uinfo->value.integer.max = 65535;
3575        uinfo->value.integer.step = 1;
3576        return 0;
3577}
3578
3579static int snd_hdspm_get_mixer(struct snd_kcontrol *kcontrol,
3580                               struct snd_ctl_elem_value *ucontrol)
3581{
3582        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3583        int source;
3584        int destination;
3585
3586        source = ucontrol->value.integer.value[0];
3587        if (source < 0)
3588                source = 0;
3589        else if (source >= 2 * HDSPM_MAX_CHANNELS)
3590                source = 2 * HDSPM_MAX_CHANNELS - 1;
3591
3592        destination = ucontrol->value.integer.value[1];
3593        if (destination < 0)
3594                destination = 0;
3595        else if (destination >= HDSPM_MAX_CHANNELS)
3596                destination = HDSPM_MAX_CHANNELS - 1;
3597
3598        spin_lock_irq(&hdspm->lock);
3599        if (source >= HDSPM_MAX_CHANNELS)
3600                ucontrol->value.integer.value[2] =
3601                    hdspm_read_pb_gain(hdspm, destination,
3602                                       source - HDSPM_MAX_CHANNELS);
3603        else
3604                ucontrol->value.integer.value[2] =
3605                    hdspm_read_in_gain(hdspm, destination, source);
3606
3607        spin_unlock_irq(&hdspm->lock);
3608
3609        return 0;
3610}
3611
3612static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
3613                               struct snd_ctl_elem_value *ucontrol)
3614{
3615        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3616        int change;
3617        int source;
3618        int destination;
3619        int gain;
3620
3621        if (!snd_hdspm_use_is_exclusive(hdspm))
3622                return -EBUSY;
3623
3624        source = ucontrol->value.integer.value[0];
3625        destination = ucontrol->value.integer.value[1];
3626
3627        if (source < 0 || source >= 2 * HDSPM_MAX_CHANNELS)
3628                return -1;
3629        if (destination < 0 || destination >= HDSPM_MAX_CHANNELS)
3630                return -1;
3631
3632        gain = ucontrol->value.integer.value[2];
3633
3634        spin_lock_irq(&hdspm->lock);
3635
3636        if (source >= HDSPM_MAX_CHANNELS)
3637                change = gain != hdspm_read_pb_gain(hdspm, destination,
3638                                                    source -
3639                                                    HDSPM_MAX_CHANNELS);
3640        else
3641                change = gain != hdspm_read_in_gain(hdspm, destination,
3642                                                    source);
3643
3644        if (change) {
3645                if (source >= HDSPM_MAX_CHANNELS)
3646                        hdspm_write_pb_gain(hdspm, destination,
3647                                            source - HDSPM_MAX_CHANNELS,
3648                                            gain);
3649                else
3650                        hdspm_write_in_gain(hdspm, destination, source,
3651                                            gain);
3652        }
3653        spin_unlock_irq(&hdspm->lock);
3654
3655        return change;
3656}
3657
3658/* The simple mixer control(s) provide gain control for the
3659   basic 1:1 mappings of playback streams to output
3660   streams.
3661*/
3662
3663#define HDSPM_PLAYBACK_MIXER \
3664{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3665  .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
3666                 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3667  .info = snd_hdspm_info_playback_mixer, \
3668  .get = snd_hdspm_get_playback_mixer, \
3669  .put = snd_hdspm_put_playback_mixer \
3670}
3671
3672static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
3673                                         struct snd_ctl_elem_info *uinfo)
3674{
3675        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3676        uinfo->count = 1;
3677        uinfo->value.integer.min = 0;
3678        uinfo->value.integer.max = 64;
3679        uinfo->value.integer.step = 1;
3680        return 0;
3681}
3682
3683static int snd_hdspm_get_playback_mixer(struct snd_kcontrol *kcontrol,
3684                                        struct snd_ctl_elem_value *ucontrol)
3685{
3686        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3687        int channel;
3688
3689        channel = ucontrol->id.index - 1;
3690
3691        if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3692                return -EINVAL;
3693
3694        spin_lock_irq(&hdspm->lock);
3695        ucontrol->value.integer.value[0] =
3696          (hdspm_read_pb_gain(hdspm, channel, channel)*64)/UNITY_GAIN;
3697        spin_unlock_irq(&hdspm->lock);
3698
3699        return 0;
3700}
3701
3702static int snd_hdspm_put_playback_mixer(struct snd_kcontrol *kcontrol,
3703                                        struct snd_ctl_elem_value *ucontrol)
3704{
3705        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3706        int change;
3707        int channel;
3708        int gain;
3709
3710        if (!snd_hdspm_use_is_exclusive(hdspm))
3711                return -EBUSY;
3712
3713        channel = ucontrol->id.index - 1;
3714
3715        if (snd_BUG_ON(channel < 0 || channel >= HDSPM_MAX_CHANNELS))
3716                return -EINVAL;
3717
3718        gain = ucontrol->value.integer.value[0]*UNITY_GAIN/64;
3719
3720        spin_lock_irq(&hdspm->lock);
3721        change =
3722            gain != hdspm_read_pb_gain(hdspm, channel,
3723                                       channel);
3724        if (change)
3725                hdspm_write_pb_gain(hdspm, channel, channel,
3726                                    gain);
3727        spin_unlock_irq(&hdspm->lock);
3728        return change;
3729}
3730
3731#define HDSPM_SYNC_CHECK(xname, xindex) \
3732{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3733        .name = xname, \
3734        .private_value = xindex, \
3735        .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
3736        .info = snd_hdspm_info_sync_check, \
3737        .get = snd_hdspm_get_sync_check \
3738}
3739
3740
3741static int snd_hdspm_info_sync_check(struct snd_kcontrol *kcontrol,
3742                                     struct snd_ctl_elem_info *uinfo)
3743{
3744        static char *texts[] = { "No Lock", "Lock", "Sync", "N/A" };
3745        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3746        uinfo->count = 1;
3747        uinfo->value.enumerated.items = 4;
3748        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
3749                uinfo->value.enumerated.item =
3750                        uinfo->value.enumerated.items - 1;
3751        strcpy(uinfo->value.enumerated.name,
3752                        texts[uinfo->value.enumerated.item]);
3753        return 0;
3754}
3755
3756static int hdspm_wc_sync_check(struct hdspm *hdspm)
3757{
3758        int status, status2;
3759
3760        switch (hdspm->io_type) {
3761        case AES32:
3762                status = hdspm_read(hdspm, HDSPM_statusRegister);
3763                if (status & HDSPM_wcSync)
3764                        return 2;
3765                else if (status & HDSPM_wcLock)
3766                        return 1;
3767                return 0;
3768                break;
3769
3770        case MADI:
3771                status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3772                if (status2 & HDSPM_wcLock) {
3773                        if (status2 & HDSPM_wcSync)
3774                                return 2;
3775                        else
3776                                return 1;
3777                }
3778                return 0;
3779                break;
3780
3781        case RayDAT:
3782        case AIO:
3783                status = hdspm_read(hdspm, HDSPM_statusRegister);
3784
3785                if (status & 0x2000000)
3786                        return 2;
3787                else if (status & 0x1000000)
3788                        return 1;
3789                return 0;
3790
3791                break;
3792
3793        case MADIface:
3794                break;
3795        }
3796
3797
3798        return 3;
3799}
3800
3801
3802static int hdspm_madi_sync_check(struct hdspm *hdspm)
3803{
3804        int status = hdspm_read(hdspm, HDSPM_statusRegister);
3805        if (status & HDSPM_madiLock) {
3806                if (status & HDSPM_madiSync)
3807                        return 2;
3808                else
3809                        return 1;
3810        }
3811        return 0;
3812}
3813
3814
3815static int hdspm_s1_sync_check(struct hdspm *hdspm, int idx)
3816{
3817        int status, lock, sync;
3818
3819        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3820
3821        lock = (status & (0x1<<idx)) ? 1 : 0;
3822        sync = (status & (0x100<<idx)) ? 1 : 0;
3823
3824        if (lock && sync)
3825                return 2;
3826        else if (lock)
3827                return 1;
3828        return 0;
3829}
3830
3831
3832static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
3833{
3834        int status, lock = 0, sync = 0;
3835
3836        switch (hdspm->io_type) {
3837        case RayDAT:
3838        case AIO:
3839                status = hdspm_read(hdspm, HDSPM_RD_STATUS_3);
3840                lock = (status & 0x400) ? 1 : 0;
3841                sync = (status & 0x800) ? 1 : 0;
3842                break;
3843
3844        case MADI:
3845        case AES32:
3846                status = hdspm_read(hdspm, HDSPM_statusRegister2);
3847                lock = (status & HDSPM_syncInLock) ? 1 : 0;
3848                sync = (status & HDSPM_syncInSync) ? 1 : 0;
3849                break;
3850
3851        case MADIface:
3852                break;
3853        }
3854
3855        if (lock && sync)
3856                return 2;
3857        else if (lock)
3858                return 1;
3859
3860        return 0;
3861}
3862
3863static int hdspm_aes_sync_check(struct hdspm *hdspm, int idx)
3864{
3865        int status2, lock, sync;
3866        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
3867
3868        lock = (status2 & (0x0080 >> idx)) ? 1 : 0;
3869        sync = (status2 & (0x8000 >> idx)) ? 1 : 0;
3870
3871        if (sync)
3872                return 2;
3873        else if (lock)
3874                return 1;
3875        return 0;
3876}
3877
3878
3879static int hdspm_tco_sync_check(struct hdspm *hdspm)
3880{
3881        int status;
3882
3883        if (hdspm->tco) {
3884                switch (hdspm->io_type) {
3885                case MADI:
3886                case AES32:
3887                        status = hdspm_read(hdspm, HDSPM_statusRegister);
3888                        if (status & HDSPM_tcoLock) {
3889                                if (status & HDSPM_tcoSync)
3890                                        return 2;
3891                                else
3892                                        return 1;
3893                        }
3894                        return 0;
3895
3896                        break;
3897
3898                case RayDAT:
3899                case AIO:
3900                        status = hdspm_read(hdspm, HDSPM_RD_STATUS_1);
3901
3902                        if (status & 0x8000000)
3903                                return 2; /* Sync */
3904                        if (status & 0x4000000)
3905                                return 1; /* Lock */
3906                        return 0; /* No signal */
3907                        break;
3908
3909                default:
3910                        break;
3911                }
3912        }
3913
3914        return 3; /* N/A */
3915}
3916
3917
3918static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3919                                    struct snd_ctl_elem_value *ucontrol)
3920{
3921        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
3922        int val = -1;
3923
3924        switch (hdspm->io_type) {
3925        case RayDAT:
3926                switch (kcontrol->private_value) {
3927                case 0: /* WC */
3928                        val = hdspm_wc_sync_check(hdspm); break;
3929                case 7: /* TCO */
3930                        val = hdspm_tco_sync_check(hdspm); break;
3931                case 8: /* SYNC IN */
3932                        val = hdspm_sync_in_sync_check(hdspm); break;
3933                default:
3934                        val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3935                }
3936
3937        case AIO:
3938                switch (kcontrol->private_value) {
3939                case 0: /* WC */
3940                        val = hdspm_wc_sync_check(hdspm); break;
3941                case 4: /* TCO */
3942                        val = hdspm_tco_sync_check(hdspm); break;
3943                case 5: /* SYNC IN */
3944                        val = hdspm_sync_in_sync_check(hdspm); break;
3945                default:
3946                        val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
3947                }
3948
3949        case MADI:
3950                switch (kcontrol->private_value) {
3951                case 0: /* WC */
3952                        val = hdspm_wc_sync_check(hdspm); break;
3953                case 1: /* MADI */
3954                        val = hdspm_madi_sync_check(hdspm); break;
3955                case 2: /* TCO */
3956                        val = hdspm_tco_sync_check(hdspm); break;
3957                case 3: /* SYNC_IN */
3958                        val = hdspm_sync_in_sync_check(hdspm); break;
3959                }
3960
3961        case MADIface:
3962                val = hdspm_madi_sync_check(hdspm); /* MADI */
3963                break;
3964
3965        case AES32:
3966                switch (kcontrol->private_value) {
3967                case 0: /* WC */
3968                        val = hdspm_wc_sync_check(hdspm); break;
3969                case 9: /* TCO */
3970                        val = hdspm_tco_sync_check(hdspm); break;
3971                case 10 /* SYNC IN */:
3972                        val = hdspm_sync_in_sync_check(hdspm); break;
3973                default: /* AES1 to AES8 */
3974                         val = hdspm_aes_sync_check(hdspm,
3975                                         kcontrol->private_value-1);
3976                }
3977
3978        }
3979
3980        if (-1 == val)
3981                val = 3;
3982
3983        ucontrol->value.enumerated.item[0] = val;
3984        return 0;
3985}
3986
3987
3988
3989/**
3990 * TCO controls
3991 **/
3992static void hdspm_tco_write(struct hdspm *hdspm)
3993{
3994        unsigned int tc[4] = { 0, 0, 0, 0};
3995
3996        switch (hdspm->tco->input) {
3997        case 0:
3998                tc[2] |= HDSPM_TCO2_set_input_MSB;
3999                break;
4000        case 1:
4001                tc[2] |= HDSPM_TCO2_set_input_LSB;
4002                break;
4003        default:
4004                break;
4005        }
4006
4007        switch (hdspm->tco->framerate) {
4008        case 1:
4009                tc[1] |= HDSPM_TCO1_LTC_Format_LSB;
4010                break;
4011        case 2:
4012                tc[1] |= HDSPM_TCO1_LTC_Format_MSB;
4013                break;
4014        case 3:
4015                tc[1] |= HDSPM_TCO1_LTC_Format_MSB +
4016                        HDSPM_TCO1_set_drop_frame_flag;
4017                break;
4018        case 4:
4019                tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4020                        HDSPM_TCO1_LTC_Format_MSB;
4021                break;
4022        case 5:
4023                tc[1] |= HDSPM_TCO1_LTC_Format_LSB +
4024                        HDSPM_TCO1_LTC_Format_MSB +
4025                        HDSPM_TCO1_set_drop_frame_flag;
4026                break;
4027        default:
4028                break;
4029        }
4030
4031        switch (hdspm->tco->wordclock) {
4032        case 1:
4033                tc[2] |= HDSPM_TCO2_WCK_IO_ratio_LSB;
4034                break;
4035        case 2:
4036                tc[2] |= HDSPM_TCO2_WCK_IO_ratio_MSB;
4037                break;
4038        default:
4039                break;
4040        }
4041
4042        switch (hdspm->tco->samplerate) {
4043        case 1:
4044                tc[2] |= HDSPM_TCO2_set_freq;
4045                break;
4046        case 2:
4047                tc[2] |= HDSPM_TCO2_set_freq_from_app;
4048                break;
4049        default:
4050                break;
4051        }
4052
4053        switch (hdspm->tco->pull) {
4054        case 1:
4055                tc[2] |= HDSPM_TCO2_set_pull_up;
4056                break;
4057        case 2:
4058                tc[2] |= HDSPM_TCO2_set_pull_down;
4059                break;
4060        case 3:
4061                tc[2] |= HDSPM_TCO2_set_pull_up + HDSPM_TCO2_set_01_4;
4062                break;
4063        case 4:
4064                tc[2] |= HDSPM_TCO2_set_pull_down + HDSPM_TCO2_set_01_4;
4065                break;
4066        default:
4067                break;
4068        }
4069
4070        if (1 == hdspm->tco->term) {
4071                tc[2] |= HDSPM_TCO2_set_term_75R;
4072        }
4073
4074        hdspm_write(hdspm, HDSPM_WR_TCO, tc[0]);
4075        hdspm_write(hdspm, HDSPM_WR_TCO+4, tc[1]);
4076        hdspm_write(hdspm, HDSPM_WR_TCO+8, tc[2]);
4077        hdspm_write(hdspm, HDSPM_WR_TCO+12, tc[3]);
4078}
4079
4080
4081#define HDSPM_TCO_SAMPLE_RATE(xname, xindex) \
4082{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4083        .name = xname, \
4084        .index = xindex, \
4085        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4086                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4087        .info = snd_hdspm_info_tco_sample_rate, \
4088        .get = snd_hdspm_get_tco_sample_rate, \
4089        .put = snd_hdspm_put_tco_sample_rate \
4090}
4091
4092static int snd_hdspm_info_tco_sample_rate(struct snd_kcontrol *kcontrol,
4093                                          struct snd_ctl_elem_info *uinfo)
4094{
4095        static char *texts[] = { "44.1 kHz", "48 kHz" };
4096        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4097        uinfo->count = 1;
4098        uinfo->value.enumerated.items = 2;
4099
4100        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4101                uinfo->value.enumerated.item =
4102                        uinfo->value.enumerated.items - 1;
4103
4104        strcpy(uinfo->value.enumerated.name,
4105                        texts[uinfo->value.enumerated.item]);
4106
4107        return 0;
4108}
4109
4110static int snd_hdspm_get_tco_sample_rate(struct snd_kcontrol *kcontrol,
4111                                      struct snd_ctl_elem_value *ucontrol)
4112{
4113        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4114
4115        ucontrol->value.enumerated.item[0] = hdspm->tco->samplerate;
4116
4117        return 0;
4118}
4119
4120static int snd_hdspm_put_tco_sample_rate(struct snd_kcontrol *kcontrol,
4121                                         struct snd_ctl_elem_value *ucontrol)
4122{
4123        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4124
4125        if (hdspm->tco->samplerate != ucontrol->value.enumerated.item[0]) {
4126                hdspm->tco->samplerate = ucontrol->value.enumerated.item[0];
4127
4128                hdspm_tco_write(hdspm);
4129
4130                return 1;
4131        }
4132
4133        return 0;
4134}
4135
4136
4137#define HDSPM_TCO_PULL(xname, xindex) \
4138{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4139        .name = xname, \
4140        .index = xindex, \
4141        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4142                SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4143        .info = snd_hdspm_info_tco_pull, \
4144        .get = snd_hdspm_get_tco_pull, \
4145        .put = snd_hdspm_put_tco_pull \
4146}
4147
4148static int snd_hdspm_info_tco_pull(struct snd_kcontrol *kcontrol,
4149                                   struct snd_ctl_elem_info *uinfo)
4150{
4151        static char *texts[] = { "0", "+ 0.1 %", "- 0.1 %", "+ 4 %", "- 4 %" };
4152        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4153        uinfo->count = 1;
4154        uinfo->value.enumerated.items = 5;
4155
4156        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4157                uinfo->value.enumerated.item =
4158                        uinfo->value.enumerated.items - 1;
4159
4160        strcpy(uinfo->value.enumerated.name,
4161                        texts[uinfo->value.enumerated.item]);
4162
4163        return 0;
4164}
4165
4166static int snd_hdspm_get_tco_pull(struct snd_kcontrol *kcontrol,
4167                                  struct snd_ctl_elem_value *ucontrol)
4168{
4169        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4170
4171        ucontrol->value.enumerated.item[0] = hdspm->tco->pull;
4172
4173        return 0;
4174}
4175
4176static int snd_hdspm_put_tco_pull(struct snd_kcontrol *kcontrol,
4177                                  struct snd_ctl_elem_value *ucontrol)
4178{
4179        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4180
4181        if (hdspm->tco->pull != ucontrol->value.enumerated.item[0]) {
4182                hdspm->tco->pull = ucontrol->value.enumerated.item[0];
4183
4184                hdspm_tco_write(hdspm);
4185
4186                return 1;
4187        }
4188
4189        return 0;
4190}
4191
4192#define HDSPM_TCO_WCK_CONVERSION(xname, xindex) \
4193{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4194        .name = xname, \
4195        .index = xindex, \
4196        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4197                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4198        .info = snd_hdspm_info_tco_wck_conversion, \
4199        .get = snd_hdspm_get_tco_wck_conversion, \
4200        .put = snd_hdspm_put_tco_wck_conversion \
4201}
4202
4203static int snd_hdspm_info_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4204                                             struct snd_ctl_elem_info *uinfo)
4205{
4206        static char *texts[] = { "1:1", "44.1 -> 48", "48 -> 44.1" };
4207        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4208        uinfo->count = 1;
4209        uinfo->value.enumerated.items = 3;
4210
4211        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4212                uinfo->value.enumerated.item =
4213                        uinfo->value.enumerated.items - 1;
4214
4215        strcpy(uinfo->value.enumerated.name,
4216                        texts[uinfo->value.enumerated.item]);
4217
4218        return 0;
4219}
4220
4221static int snd_hdspm_get_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4222                                            struct snd_ctl_elem_value *ucontrol)
4223{
4224        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4225
4226        ucontrol->value.enumerated.item[0] = hdspm->tco->wordclock;
4227
4228        return 0;
4229}
4230
4231static int snd_hdspm_put_tco_wck_conversion(struct snd_kcontrol *kcontrol,
4232                                            struct snd_ctl_elem_value *ucontrol)
4233{
4234        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4235
4236        if (hdspm->tco->wordclock != ucontrol->value.enumerated.item[0]) {
4237                hdspm->tco->wordclock = ucontrol->value.enumerated.item[0];
4238
4239                hdspm_tco_write(hdspm);
4240
4241                return 1;
4242        }
4243
4244        return 0;
4245}
4246
4247
4248#define HDSPM_TCO_FRAME_RATE(xname, xindex) \
4249{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4250        .name = xname, \
4251        .index = xindex, \
4252        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4253                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4254        .info = snd_hdspm_info_tco_frame_rate, \
4255        .get = snd_hdspm_get_tco_frame_rate, \
4256        .put = snd_hdspm_put_tco_frame_rate \
4257}
4258
4259static int snd_hdspm_info_tco_frame_rate(struct snd_kcontrol *kcontrol,
4260                                          struct snd_ctl_elem_info *uinfo)
4261{
4262        static char *texts[] = { "24 fps", "25 fps", "29.97fps",
4263                "29.97 dfps", "30 fps", "30 dfps" };
4264        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4265        uinfo->count = 1;
4266        uinfo->value.enumerated.items = 6;
4267
4268        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4269                uinfo->value.enumerated.item =
4270                        uinfo->value.enumerated.items - 1;
4271
4272        strcpy(uinfo->value.enumerated.name,
4273                        texts[uinfo->value.enumerated.item]);
4274
4275        return 0;
4276}
4277
4278static int snd_hdspm_get_tco_frame_rate(struct snd_kcontrol *kcontrol,
4279                                        struct snd_ctl_elem_value *ucontrol)
4280{
4281        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4282
4283        ucontrol->value.enumerated.item[0] = hdspm->tco->framerate;
4284
4285        return 0;
4286}
4287
4288static int snd_hdspm_put_tco_frame_rate(struct snd_kcontrol *kcontrol,
4289                                        struct snd_ctl_elem_value *ucontrol)
4290{
4291        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4292
4293        if (hdspm->tco->framerate != ucontrol->value.enumerated.item[0]) {
4294                hdspm->tco->framerate = ucontrol->value.enumerated.item[0];
4295
4296                hdspm_tco_write(hdspm);
4297
4298                return 1;
4299        }
4300
4301        return 0;
4302}
4303
4304
4305#define HDSPM_TCO_SYNC_SOURCE(xname, xindex) \
4306{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4307        .name = xname, \
4308        .index = xindex, \
4309        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4310                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4311        .info = snd_hdspm_info_tco_sync_source, \
4312        .get = snd_hdspm_get_tco_sync_source, \
4313        .put = snd_hdspm_put_tco_sync_source \
4314}
4315
4316static int snd_hdspm_info_tco_sync_source(struct snd_kcontrol *kcontrol,
4317                                          struct snd_ctl_elem_info *uinfo)
4318{
4319        static char *texts[] = { "LTC", "Video", "WCK" };
4320        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4321        uinfo->count = 1;
4322        uinfo->value.enumerated.items = 3;
4323
4324        if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
4325                uinfo->value.enumerated.item =
4326                        uinfo->value.enumerated.items - 1;
4327
4328        strcpy(uinfo->value.enumerated.name,
4329                        texts[uinfo->value.enumerated.item]);
4330
4331        return 0;
4332}
4333
4334static int snd_hdspm_get_tco_sync_source(struct snd_kcontrol *kcontrol,
4335                                         struct snd_ctl_elem_value *ucontrol)
4336{
4337        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4338
4339        ucontrol->value.enumerated.item[0] = hdspm->tco->input;
4340
4341        return 0;
4342}
4343
4344static int snd_hdspm_put_tco_sync_source(struct snd_kcontrol *kcontrol,
4345                                         struct snd_ctl_elem_value *ucontrol)
4346{
4347        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4348
4349        if (hdspm->tco->input != ucontrol->value.enumerated.item[0]) {
4350                hdspm->tco->input = ucontrol->value.enumerated.item[0];
4351
4352                hdspm_tco_write(hdspm);
4353
4354                return 1;
4355        }
4356
4357        return 0;
4358}
4359
4360
4361#define HDSPM_TCO_WORD_TERM(xname, xindex) \
4362{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4363        .name = xname, \
4364        .index = xindex, \
4365        .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
4366                        SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
4367        .info = snd_hdspm_info_tco_word_term, \
4368        .get = snd_hdspm_get_tco_word_term, \
4369        .put = snd_hdspm_put_tco_word_term \
4370}
4371
4372static int snd_hdspm_info_tco_word_term(struct snd_kcontrol *kcontrol,
4373                                        struct snd_ctl_elem_info *uinfo)
4374{
4375        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
4376        uinfo->count = 1;
4377        uinfo->value.integer.min = 0;
4378        uinfo->value.integer.max = 1;
4379
4380        return 0;
4381}
4382
4383
4384static int snd_hdspm_get_tco_word_term(struct snd_kcontrol *kcontrol,
4385                                       struct snd_ctl_elem_value *ucontrol)
4386{
4387        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4388
4389        ucontrol->value.enumerated.item[0] = hdspm->tco->term;
4390
4391        return 0;
4392}
4393
4394
4395static int snd_hdspm_put_tco_word_term(struct snd_kcontrol *kcontrol,
4396                                       struct snd_ctl_elem_value *ucontrol)
4397{
4398        struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
4399
4400        if (hdspm->tco->term != ucontrol->value.enumerated.item[0]) {
4401                hdspm->tco->term = ucontrol->value.enumerated.item[0];
4402
4403                hdspm_tco_write(hdspm);
4404
4405                return 1;
4406        }
4407
4408        return 0;
4409}
4410
4411
4412
4413
4414static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
4415        HDSPM_MIXER("Mixer", 0),
4416        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4417        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4418        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4419        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4420        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4421        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4422        HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
4423        HDSPM_SYNC_CHECK("TCO SyncCHeck", 2),
4424        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
4425        HDSPM_LINE_OUT("Line Out", 0),
4426        HDSPM_TX_64("TX 64 channels mode", 0),
4427        HDSPM_C_TMS("Clear Track Marker", 0),
4428        HDSPM_SAFE_MODE("Safe Mode", 0),
4429        HDSPM_INPUT_SELECT("Input Select", 0),
4430        HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4431};
4432
4433
4434static struct snd_kcontrol_new snd_hdspm_controls_madiface[] = {
4435        HDSPM_MIXER("Mixer", 0),
4436        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4437        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4438        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4439        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4440        HDSPM_SYNC_CHECK("MADI SyncCheck", 0),
4441        HDSPM_TX_64("TX 64 channels mode", 0),
4442        HDSPM_C_TMS("Clear Track Marker", 0),
4443        HDSPM_SAFE_MODE("Safe Mode", 0),
4444        HDSPM_MADI_SPEEDMODE("MADI Speed Mode", 0)
4445};
4446
4447static struct snd_kcontrol_new snd_hdspm_controls_aio[] = {
4448        HDSPM_MIXER("Mixer", 0),
4449        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4450        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4451        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4452        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4453        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4454        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4455        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4456        HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4457        HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4458        HDSPM_SYNC_CHECK("ADAT SyncCheck", 3),
4459        HDSPM_SYNC_CHECK("TCO SyncCheck", 4),
4460        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 5),
4461        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4462        HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4463        HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4464        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT Frequency", 3),
4465        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 4),
4466        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 5)
4467
4468                /*
4469                   HDSPM_INPUT_SELECT("Input Select", 0),
4470                   HDSPM_SPDIF_OPTICAL("SPDIF Out Optical", 0),
4471                   HDSPM_PROFESSIONAL("SPDIF Out Professional", 0);
4472                   HDSPM_SPDIF_IN("SPDIF In", 0);
4473                   HDSPM_BREAKOUT_CABLE("Breakout Cable", 0);
4474                   HDSPM_INPUT_LEVEL("Input Level", 0);
4475                   HDSPM_OUTPUT_LEVEL("Output Level", 0);
4476                   HDSPM_PHONES("Phones", 0);
4477                   */
4478};
4479
4480static struct snd_kcontrol_new snd_hdspm_controls_raydat[] = {
4481        HDSPM_MIXER("Mixer", 0),
4482        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4483        HDSPM_SYSTEM_CLOCK_MODE("Clock Mode", 0),
4484        HDSPM_PREF_SYNC_REF("Pref Sync Ref", 0),
4485        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4486        HDSPM_SYNC_CHECK("WC SyncCheck", 0),
4487        HDSPM_SYNC_CHECK("AES SyncCheck", 1),
4488        HDSPM_SYNC_CHECK("SPDIF SyncCheck", 2),
4489        HDSPM_SYNC_CHECK("ADAT1 SyncCheck", 3),
4490        HDSPM_SYNC_CHECK("ADAT2 SyncCheck", 4),
4491        HDSPM_SYNC_CHECK("ADAT3 SyncCheck", 5),
4492        HDSPM_SYNC_CHECK("ADAT4 SyncCheck", 6),
4493        HDSPM_SYNC_CHECK("TCO SyncCheck", 7),
4494        HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 8),
4495        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4496        HDSPM_AUTOSYNC_SAMPLE_RATE("AES Frequency", 1),
4497        HDSPM_AUTOSYNC_SAMPLE_RATE("SPDIF Frequency", 2),
4498        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT1 Frequency", 3),
4499        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT2 Frequency", 4),
4500        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT3 Frequency", 5),
4501        HDSPM_AUTOSYNC_SAMPLE_RATE("ADAT4 Frequency", 6),
4502        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 7),
4503        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 8)
4504};
4505
4506static struct snd_kcontrol_new snd_hdspm_controls_aes32[] = {
4507        HDSPM_MIXER("Mixer", 0),
4508        HDSPM_INTERNAL_CLOCK("Internal Clock", 0),
4509        HDSPM_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
4510        HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
4511        HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
4512        HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
4513        HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
4514        HDSPM_SYNC_CHECK("WC Sync Check", 0),
4515        HDSPM_SYNC_CHECK("AES1 Sync Check", 1),
4516        HDSPM_SYNC_CHECK("AES2 Sync Check", 2),
4517        HDSPM_SYNC_CHECK("AES3 Sync Check", 3),
4518        HDSPM_SYNC_CHECK("AES4 Sync Check", 4),
4519        HDSPM_SYNC_CHECK("AES5 Sync Check", 5),
4520        HDSPM_SYNC_CHECK("AES6 Sync Check", 6),
4521        HDSPM_SYNC_CHECK("AES7 Sync Check", 7),
4522        HDSPM_SYNC_CHECK("AES8 Sync Check", 8),
4523        HDSPM_SYNC_CHECK("TCO Sync Check", 9),
4524        HDSPM_SYNC_CHECK("SYNC IN Sync Check", 10),
4525        HDSPM_AUTOSYNC_SAMPLE_RATE("WC Frequency", 0),
4526        HDSPM_AUTOSYNC_SAMPLE_RATE("AES1 Frequency", 1),
4527        HDSPM_AUTOSYNC_SAMPLE_RATE("AES2 Frequency", 2),
4528        HDSPM_AUTOSYNC_SAMPLE_RATE("AES3 Frequency", 3),
4529        HDSPM_AUTOSYNC_SAMPLE_RATE("AES4 Frequency", 4),
4530        HDSPM_AUTOSYNC_SAMPLE_RATE("AES5 Frequency", 5),
4531        HDSPM_AUTOSYNC_SAMPLE_RATE("AES6 Frequency", 6),
4532        HDSPM_AUTOSYNC_SAMPLE_RATE("AES7 Frequency", 7),
4533        HDSPM_AUTOSYNC_SAMPLE_RATE("AES8 Frequency", 8),
4534        HDSPM_AUTOSYNC_SAMPLE_RATE("TCO Frequency", 9),
4535        HDSPM_AUTOSYNC_SAMPLE_RATE("SYNC IN Frequency", 10),
4536        HDSPM_LINE_OUT("Line Out", 0),
4537        HDSPM_EMPHASIS("Emphasis", 0),
4538        HDSPM_DOLBY("Non Audio", 0),
4539        HDSPM_PROFESSIONAL("Professional", 0),
4540        HDSPM_C_TMS("Clear Track Marker", 0),
4541        HDSPM_DS_WIRE("Double Speed Wire Mode", 0),
4542        HDSPM_QS_WIRE("Quad Speed Wire Mode", 0),
4543};
4544
4545
4546
4547/* Control elements for the optional TCO module */
4548static struct snd_kcontrol_new snd_hdspm_controls_tco[] = {
4549        HDSPM_TCO_SAMPLE_RATE("TCO Sample Rate", 0),
4550        HDSPM_TCO_PULL("TCO Pull", 0),
4551        HDSPM_TCO_WCK_CONVERSION("TCO WCK Conversion", 0),
4552        HDSPM_TCO_FRAME_RATE("TCO Frame Rate", 0),
4553        HDSPM_TCO_SYNC_SOURCE("TCO Sync Source", 0),
4554        HDSPM_TCO_WORD_TERM("TCO Word Term", 0)
4555};
4556
4557
4558static struct snd_kcontrol_new snd_hdspm_playback_mixer = HDSPM_PLAYBACK_MIXER;
4559
4560
4561static int hdspm_update_simple_mixer_controls(struct hdspm * hdspm)
4562{
4563        int i;
4564
4565        for (i = hdspm->ds_out_channels; i < hdspm->ss_out_channels; ++i) {
4566                if (hdspm->system_sample_rate > 48000) {
4567                        hdspm->playback_mixer_ctls[i]->vd[0].access =
4568                                SNDRV_CTL_ELEM_ACCESS_INACTIVE |
4569                                SNDRV_CTL_ELEM_ACCESS_READ |
4570                                SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4571                } else {
4572                        hdspm->playback_mixer_ctls[i]->vd[0].access =
4573                                SNDRV_CTL_ELEM_ACCESS_READWRITE |
4574                                SNDRV_CTL_ELEM_ACCESS_VOLATILE;
4575                }
4576                snd_ctl_notify(hdspm->card, SNDRV_CTL_EVENT_MASK_VALUE |
4577                                SNDRV_CTL_EVENT_MASK_INFO,
4578                                &hdspm->playback_mixer_ctls[i]->id);
4579        }
4580
4581        return 0;
4582}
4583
4584
4585static int snd_hdspm_create_controls(struct snd_card *card,
4586                                        struct hdspm *hdspm)
4587{
4588        unsigned int idx, limit;
4589        int err;
4590        struct snd_kcontrol *kctl;
4591        struct snd_kcontrol_new *list = NULL;
4592
4593        switch (hdspm->io_type) {
4594        case MADI:
4595                list = snd_hdspm_controls_madi;
4596                limit = ARRAY_SIZE(snd_hdspm_controls_madi);
4597                break;
4598        case MADIface:
4599                list = snd_hdspm_controls_madiface;
4600                limit = ARRAY_SIZE(snd_hdspm_controls_madiface);
4601                break;
4602        case AIO:
4603                list = snd_hdspm_controls_aio;
4604                limit = ARRAY_SIZE(snd_hdspm_controls_aio);
4605                break;
4606        case RayDAT:
4607                list = snd_hdspm_controls_raydat;
4608                limit = ARRAY_SIZE(snd_hdspm_controls_raydat);
4609                break;
4610        case AES32:
4611                list = snd_hdspm_controls_aes32;
4612                limit = ARRAY_SIZE(snd_hdspm_controls_aes32);
4613                break;
4614        }
4615
4616        if (NULL != list) {
4617                for (idx = 0; idx < limit; idx++) {
4618                        err = snd_ctl_add(card,
4619                                        snd_ctl_new1(&list[idx], hdspm));
4620                        if (err < 0)
4621                                return err;
4622                }
4623        }
4624
4625
4626        /* create simple 1:1 playback mixer controls */
4627        snd_hdspm_playback_mixer.name = "Chn";
4628        if (hdspm->system_sample_rate >= 128000) {
4629                limit = hdspm->qs_out_channels;
4630        } else if (hdspm->system_sample_rate >= 64000) {
4631                limit = hdspm->ds_out_channels;
4632        } else {
4633                limit = hdspm->ss_out_channels;
4634        }
4635        for (idx = 0; idx < limit; ++idx) {
4636                snd_hdspm_playback_mixer.index = idx + 1;
4637                kctl = snd_ctl_new1(&snd_hdspm_playback_mixer, hdspm);
4638                err = snd_ctl_add(card, kctl);
4639                if (err < 0)
4640                        return err;
4641                hdspm->playback_mixer_ctls[idx] = kctl;
4642        }
4643
4644
4645        if (hdspm->tco) {
4646                /* add tco control elements */
4647                list = snd_hdspm_controls_tco;
4648                limit = ARRAY_SIZE(snd_hdspm_controls_tco);
4649                for (idx = 0; idx < limit; idx++) {
4650                        err = snd_ctl_add(card,
4651                                        snd_ctl_new1(&list[idx], hdspm));
4652                        if (err < 0)
4653                                return err;
4654                }
4655        }
4656
4657        return 0;
4658}
4659
4660/*------------------------------------------------------------
4661   /proc interface
4662 ------------------------------------------------------------*/
4663
4664static void
4665snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
4666                         struct snd_info_buffer *buffer)
4667{
4668        struct hdspm *hdspm = entry->private_data;
4669        unsigned int status, status2, control, freq;
4670
4671        char *pref_sync_ref;
4672        char *autosync_ref;
4673        char *system_clock_mode;
4674        char *insel;
4675        int x, x2;
4676
4677        /* TCO stuff */
4678        int a, ltc, frames, seconds, minutes, hours;
4679        unsigned int period;
4680        u64 freq_const = 0;
4681        u32 rate;
4682
4683        status = hdspm_read(hdspm, HDSPM_statusRegister);
4684        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4685        control = hdspm->control_register;
4686        freq = hdspm_read(hdspm, HDSPM_timecodeRegister);
4687
4688        snd_iprintf(buffer, "%s (Card #%d) Rev.%x Status2first3bits: %x\n",
4689                        hdspm->card_name, hdspm->card->number + 1,
4690                        hdspm->firmware_rev,
4691                        (status2 & HDSPM_version0) |
4692                        (status2 & HDSPM_version1) | (status2 &
4693                                HDSPM_version2));
4694
4695        snd_iprintf(buffer, "HW Serial: 0x%06x%06x\n",
4696                        (hdspm_read(hdspm, HDSPM_midiStatusIn1)>>8) & 0xFFFFFF,
4697                        (hdspm_read(hdspm, HDSPM_midiStatusIn0)>>8) & 0xFFFFFF);
4698
4699        snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4700                        hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4701
4702        snd_iprintf(buffer, "--- System ---\n");
4703
4704        snd_iprintf(buffer,
4705                "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4706                status & HDSPM_audioIRQPending,
4707                (status & HDSPM_midi0IRQPending) ? 1 : 0,
4708                (status & HDSPM_midi1IRQPending) ? 1 : 0,
4709                hdspm->irq_count);
4710        snd_iprintf(buffer,
4711                "HW pointer: id = %d, rawptr = %d (%d->%d) "
4712                "estimated= %ld (bytes)\n",
4713                ((status & HDSPM_BufferID) ? 1 : 0),
4714                (status & HDSPM_BufferPositionMask),
4715                (status & HDSPM_BufferPositionMask) %
4716                (2 * (int)hdspm->period_bytes),
4717                ((status & HDSPM_BufferPositionMask) - 64) %
4718                (2 * (int)hdspm->period_bytes),
4719                (long) hdspm_hw_pointer(hdspm) * 4);
4720
4721        snd_iprintf(buffer,
4722                "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4723                hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4724                hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4725                hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4726                hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4727        snd_iprintf(buffer,
4728                "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4729                hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4730                hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4731        snd_iprintf(buffer,
4732                "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4733                "status2=0x%x\n",
4734                hdspm->control_register, hdspm->control2_register,
4735                status, status2);
4736        if (status & HDSPM_tco_detect) {
4737                snd_iprintf(buffer, "TCO module detected.\n");
4738                a = hdspm_read(hdspm, HDSPM_RD_TCO+4);
4739                if (a & HDSPM_TCO1_LTC_Input_valid) {
4740                        snd_iprintf(buffer, "  LTC valid, ");
4741                        switch (a & (HDSPM_TCO1_LTC_Format_LSB |
4742                                                HDSPM_TCO1_LTC_Format_MSB)) {
4743                        case 0:
4744                                snd_iprintf(buffer, "24 fps, ");
4745                                break;
4746                        case HDSPM_TCO1_LTC_Format_LSB:
4747                                snd_iprintf(buffer, "25 fps, ");
4748                                break;
4749                        case HDSPM_TCO1_LTC_Format_MSB:
4750                                snd_iprintf(buffer, "29.97 fps, ");
4751                                break;
4752                        default:
4753                                snd_iprintf(buffer, "30 fps, ");
4754                                break;
4755                        }
4756                        if (a & HDSPM_TCO1_set_drop_frame_flag) {
4757                                snd_iprintf(buffer, "drop frame\n");
4758                        } else {
4759                                snd_iprintf(buffer, "full frame\n");
4760                        }
4761                } else {
4762                        snd_iprintf(buffer, "  no LTC\n");
4763                }
4764                if (a & HDSPM_TCO1_Video_Input_Format_NTSC) {
4765                        snd_iprintf(buffer, "  Video: NTSC\n");
4766                } else if (a & HDSPM_TCO1_Video_Input_Format_PAL) {
4767                        snd_iprintf(buffer, "  Video: PAL\n");
4768                } else {
4769                        snd_iprintf(buffer, "  No video\n");
4770                }
4771                if (a & HDSPM_TCO1_TCO_lock) {
4772                        snd_iprintf(buffer, "  Sync: lock\n");
4773                } else {
4774                        snd_iprintf(buffer, "  Sync: no lock\n");
4775                }
4776
4777                switch (hdspm->io_type) {
4778                case MADI:
4779                case AES32:
4780                        freq_const = 110069313433624ULL;
4781                        break;
4782                case RayDAT:
4783                case AIO:
4784                        freq_const = 104857600000000ULL;
4785                        break;
4786                case MADIface:
4787                        break; /* no TCO possible */
4788                }
4789
4790                period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ);
4791                snd_iprintf(buffer, "    period: %u\n", period);
4792
4793
4794                /* rate = freq_const/period; */
4795                rate = div_u64(freq_const, period);
4796
4797                if (control & HDSPM_QuadSpeed) {
4798                        rate *= 4;
4799                } else if (control & HDSPM_DoubleSpeed) {
4800                        rate *= 2;
4801                }
4802
4803                snd_iprintf(buffer, "  Frequency: %u Hz\n",
4804                                (unsigned int) rate);
4805
4806                ltc = hdspm_read(hdspm, HDSPM_RD_TCO);
4807                frames = ltc & 0xF;
4808                ltc >>= 4;
4809                frames += (ltc & 0x3) * 10;
4810                ltc >>= 4;
4811                seconds = ltc & 0xF;
4812                ltc >>= 4;
4813                seconds += (ltc & 0x7) * 10;
4814                ltc >>= 4;
4815                minutes = ltc & 0xF;
4816                ltc >>= 4;
4817                minutes += (ltc & 0x7) * 10;
4818                ltc >>= 4;
4819                hours = ltc & 0xF;
4820                ltc >>= 4;
4821                hours += (ltc & 0x3) * 10;
4822                snd_iprintf(buffer,
4823                        "  LTC In: %02d:%02d:%02d:%02d\n",
4824                        hours, minutes, seconds, frames);
4825
4826        } else {
4827                snd_iprintf(buffer, "No TCO module detected.\n");
4828        }
4829
4830        snd_iprintf(buffer, "--- Settings ---\n");
4831
4832        x = hdspm_get_latency(hdspm);
4833
4834        snd_iprintf(buffer,
4835                "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4836                x, (unsigned long) hdspm->period_bytes);
4837
4838        snd_iprintf(buffer, "Line out: %s\n",
4839                (hdspm->control_register & HDSPM_LineOut) ? "on " : "off");
4840
4841        switch (hdspm->control_register & HDSPM_InputMask) {
4842        case HDSPM_InputOptical:
4843                insel = "Optical";
4844                break;
4845        case HDSPM_InputCoaxial:
4846                insel = "Coaxial";
4847                break;
4848        default:
4849                insel = "Unkown";
4850        }
4851
4852        snd_iprintf(buffer,
4853                "ClearTrackMarker = %s, Transmit in %s Channel Mode, "
4854                "Auto Input %s\n",
4855                (hdspm->control_register & HDSPM_clr_tms) ? "on" : "off",
4856                (hdspm->control_register & HDSPM_TX_64ch) ? "64" : "56",
4857                (hdspm->control_register & HDSPM_AutoInp) ? "on" : "off");
4858
4859
4860        if (!(hdspm->control_register & HDSPM_ClockModeMaster))
4861                system_clock_mode = "AutoSync";
4862        else
4863                system_clock_mode = "Master";
4864        snd_iprintf(buffer, "AutoSync Reference: %s\n", system_clock_mode);
4865
4866        switch (hdspm_pref_sync_ref(hdspm)) {
4867        case HDSPM_SYNC_FROM_WORD:
4868                pref_sync_ref = "Word Clock";
4869                break;
4870        case HDSPM_SYNC_FROM_MADI:
4871                pref_sync_ref = "MADI Sync";
4872                break;
4873        case HDSPM_SYNC_FROM_TCO:
4874                pref_sync_ref = "TCO";
4875                break;
4876        case HDSPM_SYNC_FROM_SYNC_IN:
4877                pref_sync_ref = "Sync In";
4878                break;
4879        default:
4880                pref_sync_ref = "XXXX Clock";
4881                break;
4882        }
4883        snd_iprintf(buffer, "Preferred Sync Reference: %s\n",
4884                        pref_sync_ref);
4885
4886        snd_iprintf(buffer, "System Clock Frequency: %d\n",
4887                        hdspm->system_sample_rate);
4888
4889
4890        snd_iprintf(buffer, "--- Status:\n");
4891
4892        x = status & HDSPM_madiSync;
4893        x2 = status2 & HDSPM_wcSync;
4894
4895        snd_iprintf(buffer, "Inputs MADI=%s, WordClock=%s\n",
4896                        (status & HDSPM_madiLock) ? (x ? "Sync" : "Lock") :
4897                        "NoLock",
4898                        (status2 & HDSPM_wcLock) ? (x2 ? "Sync" : "Lock") :
4899                        "NoLock");
4900
4901        switch (hdspm_autosync_ref(hdspm)) {
4902        case HDSPM_AUTOSYNC_FROM_SYNC_IN:
4903                autosync_ref = "Sync In";
4904                break;
4905        case HDSPM_AUTOSYNC_FROM_TCO:
4906                autosync_ref = "TCO";
4907                break;
4908        case HDSPM_AUTOSYNC_FROM_WORD:
4909                autosync_ref = "Word Clock";
4910                break;
4911        case HDSPM_AUTOSYNC_FROM_MADI:
4912                autosync_ref = "MADI Sync";
4913                break;
4914        case HDSPM_AUTOSYNC_FROM_NONE:
4915                autosync_ref = "Input not valid";
4916                break;
4917        default:
4918                autosync_ref = "---";
4919                break;
4920        }
4921        snd_iprintf(buffer,
4922                "AutoSync: Reference= %s, Freq=%d (MADI = %d, Word = %d)\n",
4923                autosync_ref, hdspm_external_sample_rate(hdspm),
4924                (status & HDSPM_madiFreqMask) >> 22,
4925                (status2 & HDSPM_wcFreqMask) >> 5);
4926
4927        snd_iprintf(buffer, "Input: %s, Mode=%s\n",
4928                (status & HDSPM_AB_int) ? "Coax" : "Optical",
4929                (status & HDSPM_RX_64ch) ? "64 channels" :
4930                "56 channels");
4931
4932        snd_iprintf(buffer, "\n");
4933}
4934
4935static void
4936snd_hdspm_proc_read_aes32(struct snd_info_entry * entry,
4937                          struct snd_info_buffer *buffer)
4938{
4939        struct hdspm *hdspm = entry->private_data;
4940        unsigned int status;
4941        unsigned int status2;
4942        unsigned int timecode;
4943        int pref_syncref;
4944        char *autosync_ref;
4945        int x;
4946
4947        status = hdspm_read(hdspm, HDSPM_statusRegister);
4948        status2 = hdspm_read(hdspm, HDSPM_statusRegister2);
4949        timecode = hdspm_read(hdspm, HDSPM_timecodeRegister);
4950
4951        snd_iprintf(buffer, "%s (Card #%d) Rev.%x\n",
4952                    hdspm->card_name, hdspm->card->number + 1,
4953                    hdspm->firmware_rev);
4954
4955        snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",
4956                    hdspm->irq, hdspm->port, (unsigned long)hdspm->iobase);
4957
4958        snd_iprintf(buffer, "--- System ---\n");
4959
4960        snd_iprintf(buffer,
4961                    "IRQ Pending: Audio=%d, MIDI0=%d, MIDI1=%d, IRQcount=%d\n",
4962                    status & HDSPM_audioIRQPending,
4963                    (status & HDSPM_midi0IRQPending) ? 1 : 0,
4964                    (status & HDSPM_midi1IRQPending) ? 1 : 0,
4965                    hdspm->irq_count);
4966        snd_iprintf(buffer,
4967                    "HW pointer: id = %d, rawptr = %d (%d->%d) "
4968                    "estimated= %ld (bytes)\n",
4969                    ((status & HDSPM_BufferID) ? 1 : 0),
4970                    (status & HDSPM_BufferPositionMask),
4971                    (status & HDSPM_BufferPositionMask) %
4972                    (2 * (int)hdspm->period_bytes),
4973                    ((status & HDSPM_BufferPositionMask) - 64) %
4974                    (2 * (int)hdspm->period_bytes),
4975                    (long) hdspm_hw_pointer(hdspm) * 4);
4976
4977        snd_iprintf(buffer,
4978                    "MIDI FIFO: Out1=0x%x, Out2=0x%x, In1=0x%x, In2=0x%x \n",
4979                    hdspm_read(hdspm, HDSPM_midiStatusOut0) & 0xFF,
4980                    hdspm_read(hdspm, HDSPM_midiStatusOut1) & 0xFF,
4981                    hdspm_read(hdspm, HDSPM_midiStatusIn0) & 0xFF,
4982                    hdspm_read(hdspm, HDSPM_midiStatusIn1) & 0xFF);
4983        snd_iprintf(buffer,
4984                    "MIDIoverMADI FIFO: In=0x%x, Out=0x%x \n",
4985                    hdspm_read(hdspm, HDSPM_midiStatusIn2) & 0xFF,
4986                    hdspm_read(hdspm, HDSPM_midiStatusOut2) & 0xFF);
4987        snd_iprintf(buffer,
4988                    "Register: ctrl1=0x%x, ctrl2=0x%x, status1=0x%x, "
4989                    "status2=0x%x\n",
4990                    hdspm->control_register, hdspm->control2_register,
4991                    status, status2);
4992
4993        snd_iprintf(buffer, "--- Settings ---\n");
4994
4995        x = hdspm_get_latency(hdspm);
4996
4997        snd_iprintf(buffer,
4998                    "Size (Latency): %d samples (2 periods of %lu bytes)\n",
4999                    x, (unsigned long) hdspm->period_bytes);
5000
5001        snd_iprintf(buffer, "Line out: %s\n",
5002                    (hdspm->
5003                     control_register & HDSPM_LineOut) ? "on " : "off");
5004
5005        snd_iprintf(buffer,
5006                    "ClearTrackMarker %s, Emphasis %s, Dolby %s\n",
5007                    (hdspm->
5008                     control_register & HDSPM_clr_tms) ? "on" : "off",
5009                    (hdspm->
5010                     control_register & HDSPM_Emphasis) ? "on" : "off",
5011                    (hdspm->
5012                     control_register & HDSPM_Dolby) ? "on" : "off");
5013
5014
5015        pref_syncref = hdspm_pref_sync_ref(hdspm);
5016        if (pref_syncref == 0)
5017                snd_iprintf(buffer, "Preferred Sync Reference: Word Clock\n");
5018        else
5019                snd_iprintf(buffer, "Preferred Sync Reference: AES%d\n",
5020                                pref_syncref);
5021
5022        snd_iprintf(buffer, "System Clock Frequency: %d\n",
5023                    hdspm->system_sample_rate);
5024
5025        snd_iprintf(buffer, "Double speed: %s\n",
5026                        hdspm->control_register & HDSPM_DS_DoubleWire?
5027                        "Double wire" : "Single wire");
5028        snd_iprintf(buffer, "Quad speed: %s\n",
5029                        hdspm->control_register & HDSPM_QS_DoubleWire?
5030                        "Double wire" :
5031                        hdspm->control_register & HDSPM_QS_QuadWire?
5032                        "Quad wire" : "Single wire");
5033
5034        snd_iprintf(buffer, "--- Status:\n");
5035
5036        snd_iprintf(buffer, "Word: %s  Frequency: %d\n",
5037                    (status & HDSPM_AES32_wcLock) ? "Sync   " : "No Lock",
5038                    HDSPM_bit2freq((status >> HDSPM_AES32_wcFreq_bit) & 0xF));
5039
5040        for (x = 0; x < 8; x++) {
5041                snd_iprintf(buffer, "AES%d: %s  Frequency: %d\n",
5042                            x+1,
5043                            (status2 & (HDSPM_LockAES >> x)) ?
5044                            "Sync   " : "No Lock",
5045                            HDSPM_bit2freq((timecode >> (4*x)) & 0xF));
5046        }
5047
5048        switch (hdspm_autosync_ref(hdspm)) {
5049        case HDSPM_AES32_AUTOSYNC_FROM_NONE:
5050                autosync_ref = "None"; break;
5051        case HDSPM_AES32_AUTOSYNC_FROM_WORD:
5052                autosync_ref = "Word Clock"; break;
5053        case HDSPM_AES32_AUTOSYNC_FROM_AES1:
5054                autosync_ref = "AES1"; break;
5055        case HDSPM_AES32_AUTOSYNC_FROM_AES2:
5056                autosync_ref = "AES2"; break;
5057        case HDSPM_AES32_AUTOSYNC_FROM_AES3:
5058                autosync_ref = "AES3"; break;
5059        case HDSPM_AES32_AUTOSYNC_FROM_AES4:
5060                autosync_ref = "AES4"; break;
5061        case HDSPM_AES32_AUTOSYNC_FROM_AES5:
5062                autosync_ref = "AES5"; break;
5063        case HDSPM_AES32_AUTOSYNC_FROM_AES6:
5064                autosync_ref = "AES6"; break;
5065        case HDSPM_AES32_AUTOSYNC_FROM_AES7:
5066                autosync_ref = "AES7"; break;
5067        case HDSPM_AES32_AUTOSYNC_FROM_AES8:
5068                autosync_ref = "AES8"; break;
5069        default:
5070                autosync_ref = "---"; break;
5071        }
5072        snd_iprintf(buffer, "AutoSync ref = %s\n", autosync_ref);
5073
5074        snd_iprintf(buffer, "\n");
5075}
5076
5077static void
5078snd_hdspm_proc_read_raydat(struct snd_info_entry *entry,
5079                         struct snd_info_buffer *buffer)
5080{
5081        struct hdspm *hdspm = entry->private_data;
5082        unsigned int status1, status2, status3, control, i;
5083        unsigned int lock, sync;
5084
5085        status1 = hdspm_read(hdspm, HDSPM_RD_STATUS_1); /* s1 */
5086        status2 = hdspm_read(hdspm, HDSPM_RD_STATUS_2); /* freq */
5087        status3 = hdspm_read(hdspm, HDSPM_RD_STATUS_3); /* s2 */
5088
5089        control = hdspm->control_register;
5090
5091        snd_iprintf(buffer, "STATUS1: 0x%08x\n", status1);
5092        snd_iprintf(buffer, "STATUS2: 0x%08x\n", status2);
5093        snd_iprintf(buffer, "STATUS3: 0x%08x\n", status3);
5094
5095
5096        snd_iprintf(buffer, "\n*** CLOCK MODE\n\n");
5097
5098        snd_iprintf(buffer, "Clock mode      : %s\n",
5099                (hdspm_system_clock_mode(hdspm) == 0) ? "master" : "slave");
5100        snd_iprintf(buffer, "System frequency: %d Hz\n",
5101                hdspm_get_system_sample_rate(hdspm));
5102
5103        snd_iprintf(buffer, "\n*** INPUT STATUS\n\n");
5104
5105        lock = 0x1;
5106        sync = 0x100;
5107
5108        for (i = 0; i < 8; i++) {
5109                snd_iprintf(buffer, "s1_input %d: Lock %d, Sync %d, Freq %s\n",
5110                                i,
5111                                (status1 & lock) ? 1 : 0,
5112                                (status1 & sync) ? 1 : 0,
5113                                texts_freq[(status2 >> (i * 4)) & 0xF]);
5114
5115                lock = lock<<1;
5116                sync = sync<<1;
5117        }
5118
5119        snd_iprintf(buffer, "WC input: Lock %d, Sync %d, Freq %s\n",
5120                        (status1 & 0x1000000) ? 1 : 0,
5121                        (status1 & 0x2000000) ? 1 : 0,
5122                        texts_freq[(status1 >> 16) & 0xF]);
5123
5124        snd_iprintf(buffer, "TCO input: Lock %d, Sync %d, Freq %s\n",
5125                        (status1 & 0x4000000) ? 1 : 0,
5126                        (status1 & 0x8000000) ? 1 : 0,
5127                        texts_freq[(status1 >> 20) & 0xF]);
5128
5129        snd_iprintf(buffer, "SYNC IN: Lock %d, Sync %d, Freq %s\n",
5130                        (status3 & 0x400) ? 1 : 0,
5131                        (status3 & 0x800) ? 1 : 0,
5132                        texts_freq[(status2 >> 12) & 0xF]);
5133
5134}
5135
5136#ifdef CONFIG_SND_DEBUG
5137static void
5138snd_hdspm_proc_read_debug(struct snd_info_entry *entry,
5139                          struct snd_info_buffer *buffer)
5140{
5141        struct hdspm *hdspm = entry->private_data;
5142
5143        int j,i;
5144
5145        for (i = 0; i < 256 /* 1024*64 */; i += j) {
5146                snd_iprintf(buffer, "0x%08X: ", i);
5147                for (j = 0; j < 16; j += 4)
5148                        snd_iprintf(buffer, "%08X ", hdspm_read(hdspm, i + j));
5149                snd_iprintf(buffer, "\n");
5150        }
5151}
5152#endif
5153
5154
5155static void snd_hdspm_proc_ports_in(struct snd_info_entry *entry,
5156                          struct snd_info_buffer *buffer)
5157{
5158        struct hdspm *hdspm = entry->private_data;
5159        int i;
5160
5161        snd_iprintf(buffer, "# generated by hdspm\n");
5162
5163        for (i = 0; i < hdspm->max_channels_in; i++) {
5164                snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_in[i]);
5165        }
5166}
5167
5168static void snd_hdspm_proc_ports_out(struct snd_info_entry *entry,
5169                          struct snd_info_buffer *buffer)
5170{
5171        struct hdspm *hdspm = entry->private_data;
5172        int i;
5173
5174        snd_iprintf(buffer, "# generated by hdspm\n");
5175
5176        for (i = 0; i < hdspm->max_channels_out; i++) {
5177                snd_iprintf(buffer, "%d=%s\n", i+1, hdspm->port_names_out[i]);
5178        }
5179}
5180
5181
5182static void __devinit snd_hdspm_proc_init(struct hdspm *hdspm)
5183{
5184        struct snd_info_entry *entry;
5185
5186        if (!snd_card_proc_new(hdspm->card, "hdspm", &entry)) {
5187                switch (hdspm->io_type) {
5188                case AES32:
5189                        snd_info_set_text_ops(entry, hdspm,
5190                                        snd_hdspm_proc_read_aes32);
5191                        break;
5192                case MADI:
5193                        snd_info_set_text_ops(entry, hdspm,
5194                                        snd_hdspm_proc_read_madi);
5195                        break;
5196                case MADIface:
5197                        /* snd_info_set_text_ops(entry, hdspm,
5198                         snd_hdspm_proc_read_madiface); */
5199                        break;
5200                case RayDAT:
5201                        snd_info_set_text_ops(entry, hdspm,
5202                                        snd_hdspm_proc_read_raydat);
5203                        break;
5204                case AIO:
5205                        break;
5206                }
5207        }
5208
5209        if (!snd_card_proc_new(hdspm->card, "ports.in", &entry)) {
5210                snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_in);
5211        }
5212
5213        if (!snd_card_proc_new(hdspm->card, "ports.out", &entry)) {
5214                snd_info_set_text_ops(entry, hdspm, snd_hdspm_proc_ports_out);
5215        }
5216
5217#ifdef CONFIG_SND_DEBUG
5218        /* debug file to read all hdspm registers */
5219        if (!snd_card_proc_new(hdspm->card, "debug", &entry))
5220                snd_info_set_text_ops(entry, hdspm,
5221                                snd_hdspm_proc_read_debug);
5222#endif
5223}
5224
5225/*------------------------------------------------------------
5226   hdspm intitialize
5227 ------------------------------------------------------------*/
5228
5229static int snd_hdspm_set_defaults(struct hdspm * hdspm)
5230{
5231        /* ASSUMPTION: hdspm->lock is either held, or there is no need to
5232           hold it (e.g. during module initialization).
5233           */
5234
5235        /* set defaults:       */
5236
5237        hdspm->settings_register = 0;
5238
5239        switch (hdspm->io_type) {
5240        case MADI:
5241        case MADIface:
5242                hdspm->control_register =
5243                        0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5244                break;
5245
5246        case RayDAT:
5247        case AIO:
5248                hdspm->settings_register = 0x1 + 0x1000;
5249                /* Magic values are: LAT_0, LAT_2, Master, freq1, tx64ch, inp_0,
5250                 * line_out */
5251                hdspm->control_register =
5252                        0x2 + 0x8 + 0x10 + 0x80 + 0x400 + 0x4000 + 0x1000000;
5253                break;
5254
5255        case AES32:
5256                hdspm->control_register =
5257                        HDSPM_ClockModeMaster | /* Master Cloack Mode on */
5258                        hdspm_encode_latency(7) | /* latency max=8192samples */
5259                        HDSPM_SyncRef0 |        /* AES1 is syncclock */
5260                        HDSPM_LineOut | /* Analog output in */
5261                        HDSPM_Professional;  /* Professional mode */
5262                break;
5263        }
5264
5265        hdspm_write(hdspm, HDSPM_controlRegister, hdspm->control_register);
5266
5267        if (AES32 == hdspm->io_type) {
5268                /* No control2 register for AES32 */
5269#ifdef SNDRV_BIG_ENDIAN
5270                hdspm->control2_register = HDSPM_BIGENDIAN_MODE;
5271#else
5272                hdspm->control2_register = 0;
5273#endif
5274
5275                hdspm_write(hdspm, HDSPM_control2Reg, hdspm->control2_register);
5276        }
5277        hdspm_compute_period_size(hdspm);
5278
5279        /* silence everything */
5280
5281        all_in_all_mixer(hdspm, 0 * UNITY_GAIN);
5282
5283        if (hdspm->io_type == AIO || hdspm->io_type == RayDAT) {
5284                hdspm_write(hdspm, HDSPM_WR_SETTINGS, hdspm->settings_register);
5285        }
5286
5287        /* set a default rate so that the channel map is set up. */
5288        hdspm_set_rate(hdspm, 48000, 1);
5289
5290        return 0;
5291}
5292
5293
5294/*------------------------------------------------------------
5295   interrupt
5296 ------------------------------------------------------------*/
5297
5298static irqreturn_t snd_hdspm_interrupt(int irq, void *dev_id)
5299{
5300        struct hdspm *hdspm = (struct hdspm *) dev_id;
5301        unsigned int status;
5302        int i, audio, midi, schedule = 0;
5303        /* cycles_t now; */
5304
5305        status = hdspm_read(hdspm, HDSPM_statusRegister);
5306
5307        audio = status & HDSPM_audioIRQPending;
5308        midi = status & (HDSPM_midi0IRQPending | HDSPM_midi1IRQPending |
5309                        HDSPM_midi2IRQPending | HDSPM_midi3IRQPending);
5310
5311        /* now = get_cycles(); */
5312        /**
5313         *   LAT_2..LAT_0 period  counter (win)  counter (mac)
5314         *          6       4096   ~256053425     ~514672358
5315         *          5       2048   ~128024983     ~257373821
5316         *          4       1024    ~64023706     ~128718089
5317         *          3        512    ~32005945      ~64385999
5318         *          2        256    ~16003039      ~32260176
5319         *          1        128     ~7998738      ~16194507
5320         *          0         64     ~3998231       ~8191558
5321         **/
5322        /*
5323           snd_printk(KERN_INFO "snd_hdspm_interrupt %llu @ %llx\n",
5324           now-hdspm->last_interrupt, status & 0xFFC0);
5325           hdspm->last_interrupt = now;
5326        */
5327
5328        if (!audio && !midi)
5329                return IRQ_NONE;
5330
5331        hdspm_write(hdspm, HDSPM_interruptConfirmation, 0);
5332        hdspm->irq_count++;
5333
5334
5335        if (audio) {
5336                if (hdspm->capture_substream)
5337                        snd_pcm_period_elapsed(hdspm->capture_substream);
5338
5339                if (hdspm->playback_substream)
5340                        snd_pcm_period_elapsed(hdspm->playback_substream);
5341        }
5342
5343        if (midi) {
5344                i = 0;
5345                while (i < hdspm->midiPorts) {
5346                        if ((hdspm_read(hdspm,
5347                                hdspm->midi[i].statusIn) & 0xff) &&
5348                                        (status & hdspm->midi[i].irq)) {
5349                                /* we disable interrupts for this input until
5350                                 * processing is done
5351                                 */
5352                                hdspm->control_register &= ~hdspm->midi[i].ie;
5353                                hdspm_write(hdspm, HDSPM_controlRegister,
5354                                                hdspm->control_register);
5355                                hdspm->midi[i].pending = 1;
5356                                schedule = 1;
5357                        }
5358
5359                        i++;
5360                }
5361
5362                if (schedule)
5363                        tasklet_hi_schedule(&hdspm->midi_tasklet);
5364        }
5365
5366        return IRQ_HANDLED;
5367}
5368
5369/*------------------------------------------------------------
5370   pcm interface
5371  ------------------------------------------------------------*/
5372
5373
5374static snd_pcm_uframes_t snd_hdspm_hw_pointer(struct snd_pcm_substream
5375                                              *substream)
5376{
5377        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5378        return hdspm_hw_pointer(hdspm);
5379}
5380
5381
5382static int snd_hdspm_reset(struct snd_pcm_substream *substream)
5383{
5384        struct snd_pcm_runtime *runtime = substream->runtime;
5385        struct hdspm *hdspm = snd_pcm_substream_chip(substream);
5386        struct snd_pcm_substream *other;
5387
5388        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
5389                other = hdspm->capture_substream;
5390        else
5391                other = hdspm->playback_substream;
5392
5393        if (hdspm->running)
5394                runtime->status->hw_ptr = hdspm_hw_pointer(hdspm);
5395        else
5396                runtime->status->hw_ptr = 0;
5397        if (