1d5ac70f0Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2d5ac70f0Sopenharmony_ci#ifndef __SOUND_HDSPM_H
3d5ac70f0Sopenharmony_ci#define __SOUND_HDSPM_H
4d5ac70f0Sopenharmony_ci/*
5d5ac70f0Sopenharmony_ci *   Copyright (C) 2003 Winfried Ritsch (IEM)
6d5ac70f0Sopenharmony_ci *   based on hdsp.h from Thomas Charbonnel (thomas@undata.org)
7d5ac70f0Sopenharmony_ci *
8d5ac70f0Sopenharmony_ci *
9d5ac70f0Sopenharmony_ci *   This program is free software; you can redistribute it and/or modify
10d5ac70f0Sopenharmony_ci *   it under the terms of the GNU General Public License as published by
11d5ac70f0Sopenharmony_ci *   the Free Software Foundation; either version 2 of the License, or
12d5ac70f0Sopenharmony_ci *   (at your option) any later version.
13d5ac70f0Sopenharmony_ci *
14d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
15d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
16d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17d5ac70f0Sopenharmony_ci *   GNU General Public License for more details.
18d5ac70f0Sopenharmony_ci *
19d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU General Public License
20d5ac70f0Sopenharmony_ci *   along with this program; if not, write to the Free Software
21d5ac70f0Sopenharmony_ci *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22d5ac70f0Sopenharmony_ci */
23d5ac70f0Sopenharmony_ci
24d5ac70f0Sopenharmony_ci#ifdef __linux__
25d5ac70f0Sopenharmony_ci#include <linux/types.h>
26d5ac70f0Sopenharmony_ci#endif
27d5ac70f0Sopenharmony_ci
28d5ac70f0Sopenharmony_ci/* Maximum channels is 64 even on 56Mode you have 64playbacks to matrix */
29d5ac70f0Sopenharmony_ci#define HDSPM_MAX_CHANNELS      64
30d5ac70f0Sopenharmony_ci
31d5ac70f0Sopenharmony_cienum hdspm_io_type {
32d5ac70f0Sopenharmony_ci	MADI,
33d5ac70f0Sopenharmony_ci	MADIface,
34d5ac70f0Sopenharmony_ci	AIO,
35d5ac70f0Sopenharmony_ci	AES32,
36d5ac70f0Sopenharmony_ci	RayDAT
37d5ac70f0Sopenharmony_ci};
38d5ac70f0Sopenharmony_ci
39d5ac70f0Sopenharmony_cienum hdspm_speed {
40d5ac70f0Sopenharmony_ci	ss,
41d5ac70f0Sopenharmony_ci	ds,
42d5ac70f0Sopenharmony_ci	qs
43d5ac70f0Sopenharmony_ci};
44d5ac70f0Sopenharmony_ci
45d5ac70f0Sopenharmony_ci/* -------------------- IOCTL Peak/RMS Meters -------------------- */
46d5ac70f0Sopenharmony_ci
47d5ac70f0Sopenharmony_cistruct hdspm_peak_rms {
48d5ac70f0Sopenharmony_ci	__u32 input_peaks[64];
49d5ac70f0Sopenharmony_ci	__u32 playback_peaks[64];
50d5ac70f0Sopenharmony_ci	__u32 output_peaks[64];
51d5ac70f0Sopenharmony_ci
52d5ac70f0Sopenharmony_ci	__u64 input_rms[64];
53d5ac70f0Sopenharmony_ci	__u64 playback_rms[64];
54d5ac70f0Sopenharmony_ci	__u64 output_rms[64];
55d5ac70f0Sopenharmony_ci
56d5ac70f0Sopenharmony_ci	__u8 speed; /* enum {ss, ds, qs} */
57d5ac70f0Sopenharmony_ci	int status2;
58d5ac70f0Sopenharmony_ci};
59d5ac70f0Sopenharmony_ci
60d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS \
61d5ac70f0Sopenharmony_ci	_IOR('H', 0x42, struct hdspm_peak_rms)
62d5ac70f0Sopenharmony_ci
63d5ac70f0Sopenharmony_ci/* ------------ CONFIG block IOCTL ---------------------- */
64d5ac70f0Sopenharmony_ci
65d5ac70f0Sopenharmony_cistruct hdspm_config {
66d5ac70f0Sopenharmony_ci	unsigned char pref_sync_ref;
67d5ac70f0Sopenharmony_ci	unsigned char wordclock_sync_check;
68d5ac70f0Sopenharmony_ci	unsigned char madi_sync_check;
69d5ac70f0Sopenharmony_ci	unsigned int system_sample_rate;
70d5ac70f0Sopenharmony_ci	unsigned int autosync_sample_rate;
71d5ac70f0Sopenharmony_ci	unsigned char system_clock_mode;
72d5ac70f0Sopenharmony_ci	unsigned char clock_source;
73d5ac70f0Sopenharmony_ci	unsigned char autosync_ref;
74d5ac70f0Sopenharmony_ci	unsigned char line_out;
75d5ac70f0Sopenharmony_ci	unsigned int passthru;
76d5ac70f0Sopenharmony_ci	unsigned int analog_out;
77d5ac70f0Sopenharmony_ci};
78d5ac70f0Sopenharmony_ci
79d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_CONFIG \
80d5ac70f0Sopenharmony_ci	_IOR('H', 0x41, struct hdspm_config)
81d5ac70f0Sopenharmony_ci
82d5ac70f0Sopenharmony_ci/*
83d5ac70f0Sopenharmony_ci * If there's a TCO (TimeCode Option) board installed,
84d5ac70f0Sopenharmony_ci * there are further options and status data available.
85d5ac70f0Sopenharmony_ci * The hdspm_ltc structure contains the current SMPTE
86d5ac70f0Sopenharmony_ci * timecode and some status information and can be
87d5ac70f0Sopenharmony_ci * obtained via SNDRV_HDSPM_IOCTL_GET_LTC or in the
88d5ac70f0Sopenharmony_ci * hdspm_status struct.
89d5ac70f0Sopenharmony_ci */
90d5ac70f0Sopenharmony_ci
91d5ac70f0Sopenharmony_cienum hdspm_ltc_format {
92d5ac70f0Sopenharmony_ci	format_invalid,
93d5ac70f0Sopenharmony_ci	fps_24,
94d5ac70f0Sopenharmony_ci	fps_25,
95d5ac70f0Sopenharmony_ci	fps_2997,
96d5ac70f0Sopenharmony_ci	fps_30
97d5ac70f0Sopenharmony_ci};
98d5ac70f0Sopenharmony_ci
99d5ac70f0Sopenharmony_cienum hdspm_ltc_frame {
100d5ac70f0Sopenharmony_ci	frame_invalid,
101d5ac70f0Sopenharmony_ci	drop_frame,
102d5ac70f0Sopenharmony_ci	full_frame
103d5ac70f0Sopenharmony_ci};
104d5ac70f0Sopenharmony_ci
105d5ac70f0Sopenharmony_cienum hdspm_ltc_input_format {
106d5ac70f0Sopenharmony_ci	ntsc,
107d5ac70f0Sopenharmony_ci	pal,
108d5ac70f0Sopenharmony_ci	no_video
109d5ac70f0Sopenharmony_ci};
110d5ac70f0Sopenharmony_ci
111d5ac70f0Sopenharmony_cistruct hdspm_ltc {
112d5ac70f0Sopenharmony_ci	unsigned int ltc;
113d5ac70f0Sopenharmony_ci
114d5ac70f0Sopenharmony_ci	enum hdspm_ltc_format format;
115d5ac70f0Sopenharmony_ci	enum hdspm_ltc_frame frame;
116d5ac70f0Sopenharmony_ci	enum hdspm_ltc_input_format input_format;
117d5ac70f0Sopenharmony_ci};
118d5ac70f0Sopenharmony_ci
119d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
120d5ac70f0Sopenharmony_ci
121d5ac70f0Sopenharmony_ci/*
122d5ac70f0Sopenharmony_ci * The status data reflects the device's current state
123d5ac70f0Sopenharmony_ci * as determined by the card's configuration and
124d5ac70f0Sopenharmony_ci * connection status.
125d5ac70f0Sopenharmony_ci */
126d5ac70f0Sopenharmony_ci
127d5ac70f0Sopenharmony_cienum hdspm_sync {
128d5ac70f0Sopenharmony_ci	hdspm_sync_no_lock = 0,
129d5ac70f0Sopenharmony_ci	hdspm_sync_lock = 1,
130d5ac70f0Sopenharmony_ci	hdspm_sync_sync = 2
131d5ac70f0Sopenharmony_ci};
132d5ac70f0Sopenharmony_ci
133d5ac70f0Sopenharmony_cienum hdspm_madi_input {
134d5ac70f0Sopenharmony_ci	hdspm_input_optical = 0,
135d5ac70f0Sopenharmony_ci	hdspm_input_coax = 1
136d5ac70f0Sopenharmony_ci};
137d5ac70f0Sopenharmony_ci
138d5ac70f0Sopenharmony_cienum hdspm_madi_channel_format {
139d5ac70f0Sopenharmony_ci	hdspm_format_ch_64 = 0,
140d5ac70f0Sopenharmony_ci	hdspm_format_ch_56 = 1
141d5ac70f0Sopenharmony_ci};
142d5ac70f0Sopenharmony_ci
143d5ac70f0Sopenharmony_cienum hdspm_madi_frame_format {
144d5ac70f0Sopenharmony_ci	hdspm_frame_48 = 0,
145d5ac70f0Sopenharmony_ci	hdspm_frame_96 = 1
146d5ac70f0Sopenharmony_ci};
147d5ac70f0Sopenharmony_ci
148d5ac70f0Sopenharmony_cienum hdspm_syncsource {
149d5ac70f0Sopenharmony_ci	syncsource_wc = 0,
150d5ac70f0Sopenharmony_ci	syncsource_madi = 1,
151d5ac70f0Sopenharmony_ci	syncsource_tco = 2,
152d5ac70f0Sopenharmony_ci	syncsource_sync = 3,
153d5ac70f0Sopenharmony_ci	syncsource_none = 4
154d5ac70f0Sopenharmony_ci};
155d5ac70f0Sopenharmony_ci
156d5ac70f0Sopenharmony_cistruct hdspm_status {
157d5ac70f0Sopenharmony_ci	__u8 card_type; /* enum hdspm_io_type */
158d5ac70f0Sopenharmony_ci	enum hdspm_syncsource autosync_source;
159d5ac70f0Sopenharmony_ci
160d5ac70f0Sopenharmony_ci	__u64 card_clock;
161d5ac70f0Sopenharmony_ci	__u32 master_period;
162d5ac70f0Sopenharmony_ci
163d5ac70f0Sopenharmony_ci	union {
164d5ac70f0Sopenharmony_ci		struct {
165d5ac70f0Sopenharmony_ci			__u8 sync_wc; /* enum hdspm_sync */
166d5ac70f0Sopenharmony_ci			__u8 sync_madi; /* enum hdspm_sync */
167d5ac70f0Sopenharmony_ci			__u8 sync_tco; /* enum hdspm_sync */
168d5ac70f0Sopenharmony_ci			__u8 sync_in; /* enum hdspm_sync */
169d5ac70f0Sopenharmony_ci			__u8 madi_input; /* enum hdspm_madi_input */
170d5ac70f0Sopenharmony_ci			__u8 channel_format; /* enum hdspm_madi_channel_format */
171d5ac70f0Sopenharmony_ci			__u8 frame_format; /* enum hdspm_madi_frame_format */
172d5ac70f0Sopenharmony_ci		} madi;
173d5ac70f0Sopenharmony_ci	} card_specific;
174d5ac70f0Sopenharmony_ci};
175d5ac70f0Sopenharmony_ci
176d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_STATUS \
177d5ac70f0Sopenharmony_ci	_IOR('H', 0x47, struct hdspm_status)
178d5ac70f0Sopenharmony_ci
179d5ac70f0Sopenharmony_ci/*
180d5ac70f0Sopenharmony_ci * Get information about the card and its add-ons.
181d5ac70f0Sopenharmony_ci */
182d5ac70f0Sopenharmony_ci
183d5ac70f0Sopenharmony_ci#define HDSPM_ADDON_TCO 1
184d5ac70f0Sopenharmony_ci
185d5ac70f0Sopenharmony_cistruct hdspm_version {
186d5ac70f0Sopenharmony_ci	__u8 card_type; /* enum hdspm_io_type */
187d5ac70f0Sopenharmony_ci	char cardname[20];
188d5ac70f0Sopenharmony_ci	unsigned int serial;
189d5ac70f0Sopenharmony_ci	unsigned short firmware_rev;
190d5ac70f0Sopenharmony_ci	int addons;
191d5ac70f0Sopenharmony_ci};
192d5ac70f0Sopenharmony_ci
193d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
194d5ac70f0Sopenharmony_ci
195d5ac70f0Sopenharmony_ci/* ------------- get Matrix Mixer IOCTL --------------- */
196d5ac70f0Sopenharmony_ci
197d5ac70f0Sopenharmony_ci/* MADI mixer: 64inputs+64playback in 64outputs = 8192 => *4Byte =
198d5ac70f0Sopenharmony_ci * 32768 Bytes
199d5ac70f0Sopenharmony_ci */
200d5ac70f0Sopenharmony_ci
201d5ac70f0Sopenharmony_ci/* organisation is 64 channelfader in a continuous memory block */
202d5ac70f0Sopenharmony_ci/* equivalent to hardware definition, maybe for future feature of mmap of
203d5ac70f0Sopenharmony_ci * them
204d5ac70f0Sopenharmony_ci */
205d5ac70f0Sopenharmony_ci/* each of 64 outputs has 64 infader and 64 outfader:
206d5ac70f0Sopenharmony_ci   Ins to Outs mixer[out].in[in], Outstreams to Outs mixer[out].pb[pb] */
207d5ac70f0Sopenharmony_ci
208d5ac70f0Sopenharmony_ci#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
209d5ac70f0Sopenharmony_ci
210d5ac70f0Sopenharmony_cistruct hdspm_channelfader {
211d5ac70f0Sopenharmony_ci	unsigned int in[HDSPM_MIXER_CHANNELS];
212d5ac70f0Sopenharmony_ci	unsigned int pb[HDSPM_MIXER_CHANNELS];
213d5ac70f0Sopenharmony_ci};
214d5ac70f0Sopenharmony_ci
215d5ac70f0Sopenharmony_cistruct hdspm_mixer {
216d5ac70f0Sopenharmony_ci	struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
217d5ac70f0Sopenharmony_ci};
218d5ac70f0Sopenharmony_ci
219d5ac70f0Sopenharmony_cistruct hdspm_mixer_ioctl {
220d5ac70f0Sopenharmony_ci	struct hdspm_mixer *mixer;
221d5ac70f0Sopenharmony_ci};
222d5ac70f0Sopenharmony_ci
223d5ac70f0Sopenharmony_ci/* use indirect access due to the limit of ioctl bit size */
224d5ac70f0Sopenharmony_ci#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
225d5ac70f0Sopenharmony_ci
226d5ac70f0Sopenharmony_ci#endif
227