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