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