1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Driver for Digigram VX soundcards |
4 | * |
5 | * DSP commands |
6 | * |
7 | * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> |
8 | */ |
9 | |
10 | #include <sound/core.h> |
11 | #include <sound/pcm.h> |
12 | #include <sound/vx_core.h> |
13 | #include "vx_cmd.h" |
14 | |
15 | /* |
16 | * Array of DSP commands |
17 | */ |
18 | static const struct vx_cmd_info vx_dsp_cmds[] = { |
19 | [CMD_VERSION] = { 0x010000, 2, RMH_SSIZE_FIXED, 1 }, |
20 | [CMD_SUPPORTED] = { .opcode: 0x020000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
21 | [CMD_TEST_IT] = { .opcode: 0x040000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
22 | [CMD_SEND_IRQA] = { .opcode: 0x070001, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
23 | [CMD_IBL] = { .opcode: 0x080000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 4 }, |
24 | [CMD_ASYNC] = { .opcode: 0x0A0000, .length: 1, .st_type: RMH_SSIZE_ARG, .st_length: 0 }, |
25 | [CMD_RES_PIPE] = { .opcode: 0x400000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
26 | [CMD_FREE_PIPE] = { .opcode: 0x410000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
27 | [CMD_CONF_PIPE] = { .opcode: 0x42A101, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
28 | [CMD_ABORT_CONF_PIPE] = { .opcode: 0x42A100, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
29 | [CMD_PARAM_OUTPUT_PIPE] = { .opcode: 0x43A000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
30 | [CMD_STOP_PIPE] = { .opcode: 0x470004, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
31 | [CMD_PIPE_STATE] = { .opcode: 0x480000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
32 | [CMD_PIPE_SPL_COUNT] = { .opcode: 0x49A000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
33 | [CMD_CAN_START_PIPE] = { .opcode: 0x4b0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
34 | [CMD_SIZE_HBUFFER] = { .opcode: 0x4C0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
35 | [CMD_START_STREAM] = { .opcode: 0x80A000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
36 | [CMD_START_ONE_STREAM] = { .opcode: 0x800000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
37 | [CMD_PAUSE_STREAM] = { .opcode: 0x81A000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
38 | [CMD_PAUSE_ONE_STREAM] = { .opcode: 0x810000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
39 | [CMD_STREAM_OUT_LEVEL_ADJUST] = { .opcode: 0x828000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
40 | [CMD_STOP_STREAM] = { .opcode: 0x830000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
41 | [CMD_FORMAT_STREAM_OUT] = { .opcode: 0x868000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
42 | [CMD_FORMAT_STREAM_IN] = { .opcode: 0x878800, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
43 | [CMD_GET_STREAM_STATE] = { .opcode: 0x890001, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
44 | [CMD_DROP_BYTES_AWAY] = { .opcode: 0x8A8000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
45 | [CMD_GET_REMAINING_BYTES] = { .opcode: 0x8D0800, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
46 | [CMD_CONNECT_AUDIO] = { .opcode: 0xC10000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
47 | [CMD_AUDIO_LEVEL_ADJUST] = { .opcode: 0xC2A000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
48 | [CMD_AUDIO_VU_PIC_METER] = { .opcode: 0xC3A003, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
49 | [CMD_GET_AUDIO_LEVELS] = { .opcode: 0xC4A000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
50 | [CMD_GET_NOTIFY_EVENT] = { .opcode: 0x4D0000, .length: 1, .st_type: RMH_SSIZE_ARG, .st_length: 0 }, |
51 | [CMD_INFO_NOTIFIED] = { .opcode: 0x0B0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
52 | [CMD_ACCESS_IO_FCT] = { .opcode: 0x098000, .length: 1, .st_type: RMH_SSIZE_ARG, .st_length: 0 }, |
53 | [CMD_STATUS_R_BUFFERS] = { .opcode: 0x440000, .length: 1, .st_type: RMH_SSIZE_ARG, .st_length: 0 }, |
54 | [CMD_UPDATE_R_BUFFERS] = { .opcode: 0x848000, .length: 4, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
55 | [CMD_LOAD_EFFECT_CONTEXT] = { .opcode: 0x0c8000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
56 | [CMD_EFFECT_ONE_PIPE] = { .opcode: 0x458000, .length: 0, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
57 | [CMD_MODIFY_CLOCK] = { .opcode: 0x0d0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
58 | [CMD_STREAM1_OUT_SET_N_LEVELS] ={ .opcode: 0x858000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
59 | [CMD_PURGE_STREAM_DCMDS] = { .opcode: 0x8b8000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
60 | [CMD_NOTIFY_PIPE_TIME] = { .opcode: 0x4e0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
61 | [CMD_LOAD_EFFECT_CONTEXT_PACKET] = { .opcode: 0x0c8000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
62 | [CMD_RELIC_R_BUFFER] = { .opcode: 0x8e0800, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 1 }, |
63 | [CMD_RESYNC_AUDIO_INPUTS] = { .opcode: 0x0e0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
64 | [CMD_NOTIFY_STREAM_TIME] = { .opcode: 0x8f0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
65 | [CMD_STREAM_SAMPLE_COUNT] = { .opcode: 0x900000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
66 | [CMD_CONFIG_TIME_CODE] = { .opcode: 0x050000, .length: 2, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
67 | [CMD_GET_TIME_CODE] = { .opcode: 0x060000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 5 }, |
68 | [CMD_MANAGE_SIGNAL] = { .opcode: 0x0f0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
69 | [CMD_PARAMETER_STREAM_OUT] = { .opcode: 0x91A000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
70 | [CMD_READ_BOARD_FREQ] = { .opcode: 0x030000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 2 }, |
71 | [CMD_GET_STREAM_LEVELS] = { .opcode: 0x8c0000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 3 }, |
72 | [CMD_PURGE_PIPE_DCMDS] = { .opcode: 0x4f8000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
73 | // [CMD_SET_STREAM_OUT_EFFECTS] = { 0x888000, 34, RMH_SSIZE_FIXED, 0 }, |
74 | // [CMD_GET_STREAM_OUT_EFFECTS] = { 0x928000, 2, RMH_SSIZE_FIXED, 32 }, |
75 | [CMD_CONNECT_MONITORING] = { .opcode: 0xC00000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
76 | [CMD_STREAM2_OUT_SET_N_LEVELS] = { .opcode: 0x938000, .length: 3, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
77 | [CMD_CANCEL_R_BUFFERS] = { .opcode: 0x948000, .length: 4, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
78 | [CMD_NOTIFY_END_OF_BUFFER] = { .opcode: 0x950000, .length: 1, .st_type: RMH_SSIZE_FIXED, .st_length: 0 }, |
79 | [CMD_GET_STREAM_VU_METER] = { .opcode: 0x95A000, .length: 2, .st_type: RMH_SSIZE_ARG, .st_length: 0 }, |
80 | }; |
81 | |
82 | /** |
83 | * vx_init_rmh - initialize the RMH instance |
84 | * @rmh: the rmh pointer to be initialized |
85 | * @cmd: the rmh command to be set |
86 | */ |
87 | void vx_init_rmh(struct vx_rmh *rmh, unsigned int cmd) |
88 | { |
89 | if (snd_BUG_ON(cmd >= CMD_LAST_INDEX)) |
90 | return; |
91 | rmh->LgCmd = vx_dsp_cmds[cmd].length; |
92 | rmh->LgStat = vx_dsp_cmds[cmd].st_length; |
93 | rmh->DspStat = vx_dsp_cmds[cmd].st_type; |
94 | rmh->Cmd[0] = vx_dsp_cmds[cmd].opcode; |
95 | } |
96 | |
97 | |