blob: f4c29a2e32e82efd22f02338b4fcee24f7b899f6 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
/* SPDX-License-Identifier: GPL-2.0 */
/* Hewlett-Packard Harmony audio driver
* Copyright (C) 2004, Kyle McMartin <kyle@parisc-linux.org>
*/
#ifndef __HARMONY_H__
#define __HARMONY_H__
struct harmony_buffer {
unsigned long addr;
int buf;
int count;
int size;
int coherent;
};
struct snd_harmony {
int irq;
unsigned long hpa; /* hard physical address */
void __iomem *iobase; /* remapped io address */
struct parisc_device *dev;
struct {
u32 gain;
u32 rate;
u32 format;
u32 stereo;
int playing;
int capturing;
} st;
struct snd_dma_device dma; /* playback/capture */
struct harmony_buffer pbuf;
struct harmony_buffer cbuf;
struct snd_dma_buffer gdma; /* graveyard */
struct snd_dma_buffer sdma; /* silence */
struct {
unsigned long play_intr;
unsigned long rec_intr;
unsigned long graveyard_intr;
unsigned long silence_intr;
} stats;
struct snd_pcm *pcm;
struct snd_card *card;
struct snd_pcm_substream *psubs;
struct snd_pcm_substream *csubs;
struct snd_info_entry *proc;
spinlock_t lock;
spinlock_t mixer_lock;
};
#define MAX_PCM_DEVICES 1
#define MAX_PCM_SUBSTREAMS 4
#define MAX_MIDI_DEVICES 0
#define HARMONY_SIZE 64
#define BUF_SIZE PAGE_SIZE
#define MAX_BUFS 16
#define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE)
#define PLAYBACK_BUFS MAX_BUFS
#define RECORD_BUFS MAX_BUFS
#define GRAVEYARD_BUFS 1
#define GRAVEYARD_BUFSZ (GRAVEYARD_BUFS*BUF_SIZE)
#define SILENCE_BUFS 1
#define SILENCE_BUFSZ (SILENCE_BUFS*BUF_SIZE)
#define HARMONY_ID 0x000
#define HARMONY_RESET 0x004
#define HARMONY_CNTL 0x008
#define HARMONY_GAINCTL 0x00c
#define HARMONY_PNXTADD 0x010
#define HARMONY_PCURADD 0x014
#define HARMONY_RNXTADD 0x018
#define HARMONY_RCURADD 0x01c
#define HARMONY_DSTATUS 0x020
#define HARMONY_OV 0x024
#define HARMONY_PIO 0x028
#define HARMONY_DIAG 0x03c
#define HARMONY_CNTL_C 0x80000000
#define HARMONY_CNTL_ST 0x00000020
#define HARMONY_CNTL_44100 0x00000015 /* HARMONY_SR_44KHZ */
#define HARMONY_CNTL_8000 0x00000008 /* HARMONY_SR_8KHZ */
#define HARMONY_DSTATUS_ID 0x00000000 /* interrupts off */
#define HARMONY_DSTATUS_PN 0x00000200 /* playback fill */
#define HARMONY_DSTATUS_RN 0x00000002 /* record fill */
#define HARMONY_DSTATUS_IE 0x80000000 /* interrupts on */
#define HARMONY_DF_16BIT_LINEAR 0x00000000
#define HARMONY_DF_8BIT_ULAW 0x00000001
#define HARMONY_DF_8BIT_ALAW 0x00000002
#define HARMONY_SS_MONO 0x00000000
#define HARMONY_SS_STEREO 0x00000001
#define HARMONY_GAIN_SILENCE 0x01F00FFF
#define HARMONY_GAIN_DEFAULT 0x01F00FFF
#define HARMONY_GAIN_HE_SHIFT 27 /* headphones enabled */
#define HARMONY_GAIN_HE_MASK (1 << HARMONY_GAIN_HE_SHIFT)
#define HARMONY_GAIN_LE_SHIFT 26 /* line-out enabled */
#define HARMONY_GAIN_LE_MASK (1 << HARMONY_GAIN_LE_SHIFT)
#define HARMONY_GAIN_SE_SHIFT 25 /* internal-speaker enabled */
#define HARMONY_GAIN_SE_MASK (1 << HARMONY_GAIN_SE_SHIFT)
#define HARMONY_GAIN_IS_SHIFT 24 /* input select - 0 for line, 1 for mic */
#define HARMONY_GAIN_IS_MASK (1 << HARMONY_GAIN_IS_SHIFT)
/* monitor attenuation */
#define HARMONY_GAIN_MA 0x0f
#define HARMONY_GAIN_MA_SHIFT 20
#define HARMONY_GAIN_MA_MASK (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT)
/* input gain */
#define HARMONY_GAIN_IN 0x0f
#define HARMONY_GAIN_LI_SHIFT 16
#define HARMONY_GAIN_LI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT)
#define HARMONY_GAIN_RI_SHIFT 12
#define HARMONY_GAIN_RI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT)
/* output gain (master volume) */
#define HARMONY_GAIN_OUT 0x3f
#define HARMONY_GAIN_LO_SHIFT 6
#define HARMONY_GAIN_LO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT)
#define HARMONY_GAIN_RO_SHIFT 0
#define HARMONY_GAIN_RO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_RO_SHIFT)
#define HARMONY_MAX_OUT (HARMONY_GAIN_RO_MASK >> HARMONY_GAIN_RO_SHIFT)
#define HARMONY_MAX_IN (HARMONY_GAIN_RI_MASK >> HARMONY_GAIN_RI_SHIFT)
#define HARMONY_MAX_MON (HARMONY_GAIN_MA_MASK >> HARMONY_GAIN_MA_SHIFT)
#define HARMONY_SR_8KHZ 0x08
#define HARMONY_SR_16KHZ 0x09
#define HARMONY_SR_27KHZ 0x0A
#define HARMONY_SR_32KHZ 0x0B
#define HARMONY_SR_48KHZ 0x0E
#define HARMONY_SR_9KHZ 0x0F
#define HARMONY_SR_5KHZ 0x10
#define HARMONY_SR_11KHZ 0x11
#define HARMONY_SR_18KHZ 0x12
#define HARMONY_SR_22KHZ 0x13
#define HARMONY_SR_37KHZ 0x14
#define HARMONY_SR_44KHZ 0x15
#define HARMONY_SR_33KHZ 0x16
#define HARMONY_SR_6KHZ 0x17
#endif /* __HARMONY_H__ */
|