]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - sound/soc/codecs/tas5713.h
Added driver for HiFiBerry Amp amplifier add-on board
[mirror_ubuntu-artful-kernel.git] / sound / soc / codecs / tas5713.h
1 /*
2 * ASoC Driver for TAS5713
3 *
4 * Author: Sebastian Eickhoff <basti.eickhoff@googlemail.com>
5 * Copyright 2014
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 */
16
17 #ifndef _TAS5713_H
18 #define _TAS5713_H
19
20
21 // TAS5713 I2C-bus register addresses
22
23 #define TAS5713_CLOCK_CTRL 0x00
24 #define TAS5713_DEVICE_ID 0x01
25 #define TAS5713_ERROR_STATUS 0x02
26 #define TAS5713_SYSTEM_CTRL1 0x03
27 #define TAS5713_SERIAL_DATA_INTERFACE 0x04
28 #define TAS5713_SYSTEM_CTRL2 0x05
29 #define TAS5713_SOFT_MUTE 0x06
30 #define TAS5713_VOL_MASTER 0x07
31 #define TAS5713_VOL_CH1 0x08
32 #define TAS5713_VOL_CH2 0x09
33 #define TAS5713_VOL_HEADPHONE 0x0A
34 #define TAS5713_VOL_CONFIG 0x0E
35 #define TAS5713_MODULATION_LIMIT 0x10
36 #define TAS5713_IC_DLY_CH1 0x11
37 #define TAS5713_IC_DLY_CH2 0x12
38 #define TAS5713_IC_DLY_CH3 0x13
39 #define TAS5713_IC_DLY_CH4 0x14
40
41 #define TAS5713_START_STOP_PERIOD 0x1A
42 #define TAS5713_OSC_TRIM 0x1B
43 #define TAS5713_BKND_ERR 0x1C
44
45 #define TAS5713_INPUT_MUX 0x20
46 #define TAS5713_SRC_SELECT_CH4 0x21
47 #define TAS5713_PWM_MUX 0x25
48
49 #define TAS5713_CH1_BQ0 0x29
50 #define TAS5713_CH1_BQ1 0x2A
51 #define TAS5713_CH1_BQ2 0x2B
52 #define TAS5713_CH1_BQ3 0x2C
53 #define TAS5713_CH1_BQ4 0x2D
54 #define TAS5713_CH1_BQ5 0x2E
55 #define TAS5713_CH1_BQ6 0x2F
56 #define TAS5713_CH1_BQ7 0x58
57 #define TAS5713_CH1_BQ8 0x59
58
59 #define TAS5713_CH2_BQ0 0x30
60 #define TAS5713_CH2_BQ1 0x31
61 #define TAS5713_CH2_BQ2 0x32
62 #define TAS5713_CH2_BQ3 0x33
63 #define TAS5713_CH2_BQ4 0x34
64 #define TAS5713_CH2_BQ5 0x35
65 #define TAS5713_CH2_BQ6 0x36
66 #define TAS5713_CH2_BQ7 0x5C
67 #define TAS5713_CH2_BQ8 0x5D
68
69 #define TAS5713_CH4_BQ0 0x5A
70 #define TAS5713_CH4_BQ1 0x5B
71 #define TAS5713_CH3_BQ0 0x5E
72 #define TAS5713_CH3_BQ1 0x5F
73
74 #define TAS5713_DRC1_SOFTENING_FILTER_ALPHA_OMEGA 0x3B
75 #define TAS5713_DRC1_ATTACK_RELEASE_RATE 0x3C
76 #define TAS5713_DRC2_SOFTENING_FILTER_ALPHA_OMEGA 0x3E
77 #define TAS5713_DRC2_ATTACK_RELEASE_RATE 0x3F
78 #define TAS5713_DRC1_ATTACK_RELEASE_THRES 0x40
79 #define TAS5713_DRC2_ATTACK_RELEASE_THRES 0x43
80 #define TAS5713_DRC_CTRL 0x46
81
82 #define TAS5713_BANK_SW_CTRL 0x50
83 #define TAS5713_CH1_OUTPUT_MIXER 0x51
84 #define TAS5713_CH2_OUTPUT_MIXER 0x52
85 #define TAS5713_CH1_INPUT_MIXER 0x53
86 #define TAS5713_CH2_INPUT_MIXER 0x54
87 #define TAS5713_OUTPUT_POST_SCALE 0x56
88 #define TAS5713_OUTPUT_PRESCALE 0x57
89
90 #define TAS5713_IDF_POST_SCALE 0x62
91
92 #define TAS5713_CH1_INLINE_MIXER 0x70
93 #define TAS5713_CH1_INLINE_DRC_EN_MIXER 0x71
94 #define TAS5713_CH1_R_CHANNEL_MIXER 0x72
95 #define TAS5713_CH1_L_CHANNEL_MIXER 0x73
96 #define TAS5713_CH2_INLINE_MIXER 0x74
97 #define TAS5713_CH2_INLINE_DRC_EN_MIXER 0x75
98 #define TAS5713_CH2_L_CHANNEL_MIXER 0x76
99 #define TAS5713_CH2_R_CHANNEL_MIXER 0x77
100
101 #define TAS5713_UPDATE_DEV_ADDR_KEY 0xF8
102 #define TAS5713_UPDATE_DEV_ADDR_REG 0xF9
103
104 #define TAS5713_REGISTER_COUNT 0x46
105 #define TAS5713_MAX_REGISTER 0xF9
106
107
108 // Bitmasks for registers
109 #define TAS5713_SOFT_MUTE_ALL 0x07
110
111
112
113 struct tas5713_init_command {
114 const int size;
115 const char *const data;
116 };
117
118 static const struct tas5713_init_command tas5713_init_sequence[] = {
119
120 // Trim oscillator
121 { .size = 2, .data = "\x1B\x00" },
122 // System control register 1 (0x03): block DC
123 { .size = 2, .data = "\x03\x80" },
124 // Mute everything
125 { .size = 2, .data = "\x05\x40" },
126 // Modulation limit register (0x10): 97.7%
127 { .size = 2, .data = "\x10\x02" },
128 // Interchannel delay registers
129 // (0x11, 0x12, 0x13, and 0x14): BD mode
130 { .size = 2, .data = "\x11\xB8" },
131 { .size = 2, .data = "\x12\x60" },
132 { .size = 2, .data = "\x13\xA0" },
133 { .size = 2, .data = "\x14\x48" },
134 // PWM shutdown group register (0x19): no shutdown
135 { .size = 2, .data = "\x19\x00" },
136 // Input multiplexer register (0x20): BD mode
137 { .size = 2, .data = "\x20\x00\x89\x77\x72" },
138 // PWM output mux register (0x25)
139 // Channel 1 --> OUTA, channel 1 neg --> OUTB
140 // Channel 2 --> OUTC, channel 2 neg --> OUTD
141 { .size = 5, .data = "\x25\x01\x02\x13\x45" },
142 // DRC control (0x46): DRC off
143 { .size = 5, .data = "\x46\x00\x00\x00\x00" },
144 // BKND_ERR register (0x1C): 299ms reset period
145 { .size = 2, .data = "\x1C\x07" },
146 // Mute channel 3
147 { .size = 2, .data = "\x0A\xFF" },
148 // Volume configuration register (0x0E): volume slew 512 steps
149 { .size = 2, .data = "\x0E\x90" },
150 // Clock control register (0x00): 44/48kHz, MCLK=64xfs
151 { .size = 2, .data = "\x00\x60" },
152 // Bank switch and eq control (0x50): no bank switching
153 { .size = 5, .data = "\x50\x00\x00\x00\x00" },
154 // Volume registers (0x07, 0x08, 0x09, 0x0A)
155 { .size = 2, .data = "\x07\x20" },
156 { .size = 2, .data = "\x08\x30" },
157 { .size = 2, .data = "\x09\x30" },
158 { .size = 2, .data = "\x0A\xFF" },
159 // 0x72, 0x73, 0x76, 0x77 input mixer:
160 // no intermix between channels
161 { .size = 5, .data = "\x72\x00\x00\x00\x00" },
162 { .size = 5, .data = "\x73\x00\x80\x00\x00" },
163 { .size = 5, .data = "\x76\x00\x00\x00\x00" },
164 { .size = 5, .data = "\x77\x00\x80\x00\x00" },
165 // 0x70, 0x71, 0x74, 0x75 inline DRC mixer:
166 // no inline DRC inmix
167 { .size = 5, .data = "\x70\x00\x80\x00\x00" },
168 { .size = 5, .data = "\x71\x00\x00\x00\x00" },
169 { .size = 5, .data = "\x74\x00\x80\x00\x00" },
170 { .size = 5, .data = "\x75\x00\x00\x00\x00" },
171 // 0x56, 0x57 Output scale
172 { .size = 5, .data = "\x56\x00\x80\x00\x00" },
173 { .size = 5, .data = "\x57\x00\x02\x00\x00" },
174 // 0x3B, 0x3c
175 { .size = 9, .data = "\x3B\x00\x08\x00\x00\x00\x78\x00\x00" },
176 { .size = 9, .data = "\x3C\x00\x00\x01\x00\xFF\xFF\xFF\x00" },
177 { .size = 9, .data = "\x3E\x00\x08\x00\x00\x00\x78\x00\x00" },
178 { .size = 9, .data = "\x3F\x00\x00\x01\x00\xFF\xFF\xFF\x00" },
179 { .size = 9, .data = "\x40\x00\x00\x01\x00\xFF\xFF\xFF\x00" },
180 { .size = 9, .data = "\x43\x00\x00\x01\x00\xFF\xFF\xFF\x00" },
181 // 0x51, 0x52: output mixer
182 { .size = 9, .data = "\x51\x00\x80\x00\x00\x00\x00\x00\x00" },
183 { .size = 9, .data = "\x52\x00\x80\x00\x00\x00\x00\x00\x00" },
184 // PEQ defaults
185 { .size = 21, .data = "\x29\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
186 { .size = 21, .data = "\x2A\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
187 { .size = 21, .data = "\x2B\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
188 { .size = 21, .data = "\x2C\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
189 { .size = 21, .data = "\x2D\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
190 { .size = 21, .data = "\x2E\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
191 { .size = 21, .data = "\x2F\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
192 { .size = 21, .data = "\x30\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
193 { .size = 21, .data = "\x31\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
194 { .size = 21, .data = "\x32\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
195 { .size = 21, .data = "\x33\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
196 { .size = 21, .data = "\x34\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
197 { .size = 21, .data = "\x35\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
198 { .size = 21, .data = "\x36\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
199 { .size = 21, .data = "\x58\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
200 { .size = 21, .data = "\x59\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
201 { .size = 21, .data = "\x5C\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
202 { .size = 21, .data = "\x5D\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
203 { .size = 21, .data = "\x5E\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
204 { .size = 21, .data = "\x5F\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
205 { .size = 21, .data = "\x5A\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
206 { .size = 21, .data = "\x5B\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" },
207 };
208
209
210 #endif /* _TAS5713_H */