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