sound: oxygen: add stereo upmixing to center/LFE channels
[safe/jmp/linux-2.6] / sound / pci / oxygen / xonar_cs43xx.c
1 /*
2  * card driver for models with CS4398/CS4362A DACs (Xonar D1/DX)
3  *
4  * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5  *
6  *
7  *  This driver is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License, version 2.
9  *
10  *  This driver is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this driver; if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 /*
20  * Xonar D1/DX
21  * -----------
22  *
23  * CMI8788:
24  *
25  * I²C <-> CS4398 (front)
26  *     <-> CS4362A (surround, center/LFE, back)
27  *
28  * GPI 0 <- external power present (DX only)
29  *
30  * GPIO 0 -> enable output to speakers
31  * GPIO 1 -> enable front panel I/O
32  * GPIO 2 -> M0 of CS5361
33  * GPIO 3 -> M1 of CS5361
34  * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
35  *
36  * CS4398:
37  *
38  * AD0 <- 1
39  * AD1 <- 1
40  *
41  * CS4362A:
42  *
43  * AD0 <- 0
44  */
45
46 #include <linux/pci.h>
47 #include <linux/delay.h>
48 #include <sound/ac97_codec.h>
49 #include <sound/control.h>
50 #include <sound/core.h>
51 #include <sound/pcm.h>
52 #include <sound/pcm_params.h>
53 #include <sound/tlv.h>
54 #include "xonar.h"
55 #include "cs4398.h"
56 #include "cs4362a.h"
57
58 #define GPI_EXT_POWER           0x01
59 #define GPIO_D1_OUTPUT_ENABLE   0x0001
60 #define GPIO_D1_FRONT_PANEL     0x0002
61 #define GPIO_D1_INPUT_ROUTE     0x0100
62
63 #define I2C_DEVICE_CS4398       0x9e    /* 10011, AD1=1, AD0=1, /W=0 */
64 #define I2C_DEVICE_CS4362A      0x30    /* 001100, AD0=0, /W=0 */
65
66 struct xonar_cs43xx {
67         struct xonar_generic generic;
68         u8 cs4398_fm;
69         u8 cs4362a_fm;
70         u8 cs4362a_fm_c;
71 };
72
73 static void cs4398_write(struct oxygen *chip, u8 reg, u8 value)
74 {
75         oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value);
76 }
77
78 static void cs4362a_write(struct oxygen *chip, u8 reg, u8 value)
79 {
80         oxygen_write_i2c(chip, I2C_DEVICE_CS4362A, reg, value);
81 }
82
83 static void update_cs4362a_volumes(struct oxygen *chip)
84 {
85         u8 mute;
86
87         mute = chip->dac_mute ? CS4362A_MUTE : 0;
88         cs4362a_write(chip, 7, (127 - chip->dac_volume[2]) | mute);
89         cs4362a_write(chip, 8, (127 - chip->dac_volume[3]) | mute);
90         cs4362a_write(chip, 10, (127 - chip->dac_volume[4]) | mute);
91         cs4362a_write(chip, 11, (127 - chip->dac_volume[5]) | mute);
92         cs4362a_write(chip, 13, (127 - chip->dac_volume[6]) | mute);
93         cs4362a_write(chip, 14, (127 - chip->dac_volume[7]) | mute);
94 }
95
96 static void update_cs43xx_volume(struct oxygen *chip)
97 {
98         cs4398_write(chip, 5, (127 - chip->dac_volume[0]) * 2);
99         cs4398_write(chip, 6, (127 - chip->dac_volume[1]) * 2);
100         update_cs4362a_volumes(chip);
101 }
102
103 static void update_cs43xx_mute(struct oxygen *chip)
104 {
105         u8 reg;
106
107         reg = CS4398_MUTEP_LOW | CS4398_PAMUTE;
108         if (chip->dac_mute)
109                 reg |= CS4398_MUTE_B | CS4398_MUTE_A;
110         cs4398_write(chip, 4, reg);
111         update_cs4362a_volumes(chip);
112 }
113
114 static void cs43xx_init(struct oxygen *chip)
115 {
116         struct xonar_cs43xx *data = chip->model_data;
117
118         /* set CPEN (control port mode) and power down */
119         cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN);
120         cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN);
121         /* configure */
122         cs4398_write(chip, 2, data->cs4398_fm);
123         cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L);
124         cs4398_write(chip, 7, CS4398_RMP_DN | CS4398_RMP_UP |
125                      CS4398_ZERO_CROSS | CS4398_SOFT_RAMP);
126         cs4362a_write(chip, 0x02, CS4362A_DIF_LJUST);
127         cs4362a_write(chip, 0x03, CS4362A_MUTEC_6 | CS4362A_AMUTE |
128                       CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP);
129         cs4362a_write(chip, 0x04, CS4362A_RMP_DN | CS4362A_DEM_NONE);
130         cs4362a_write(chip, 0x05, 0);
131         cs4362a_write(chip, 0x06, data->cs4362a_fm);
132         cs4362a_write(chip, 0x09, data->cs4362a_fm_c);
133         cs4362a_write(chip, 0x0c, data->cs4362a_fm);
134         update_cs43xx_volume(chip);
135         update_cs43xx_mute(chip);
136         /* clear power down */
137         cs4398_write(chip, 8, CS4398_CPEN);
138         cs4362a_write(chip, 0x01, CS4362A_CPEN);
139 }
140
141 static void xonar_d1_init(struct oxygen *chip)
142 {
143         struct xonar_cs43xx *data = chip->model_data;
144
145         data->generic.anti_pop_delay = 800;
146         data->generic.output_enable_bit = GPIO_D1_OUTPUT_ENABLE;
147         data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST;
148         data->cs4362a_fm = CS4362A_FM_SINGLE |
149                 CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
150         data->cs4362a_fm_c = data->cs4362a_fm;
151
152         oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS,
153                        OXYGEN_2WIRE_LENGTH_8 |
154                        OXYGEN_2WIRE_INTERRUPT_MASK |
155                        OXYGEN_2WIRE_SPEED_FAST);
156
157         cs43xx_init(chip);
158
159         oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
160                           GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE);
161         oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA,
162                             GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE);
163
164         xonar_init_cs53x1(chip);
165         xonar_enable_output(chip);
166
167         snd_component_add(chip->card, "CS4398");
168         snd_component_add(chip->card, "CS4362A");
169         snd_component_add(chip->card, "CS5361");
170 }
171
172 static void xonar_dx_init(struct oxygen *chip)
173 {
174         struct xonar_cs43xx *data = chip->model_data;
175
176         data->generic.ext_power_reg = OXYGEN_GPI_DATA;
177         data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
178         data->generic.ext_power_bit = GPI_EXT_POWER;
179         xonar_init_ext_power(chip);
180         xonar_d1_init(chip);
181 }
182
183 static void xonar_d1_cleanup(struct oxygen *chip)
184 {
185         xonar_disable_output(chip);
186         cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN);
187         oxygen_clear_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC);
188 }
189
190 static void xonar_d1_suspend(struct oxygen *chip)
191 {
192         xonar_d1_cleanup(chip);
193 }
194
195 static void xonar_d1_resume(struct oxygen *chip)
196 {
197         oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC);
198         msleep(1);
199         cs43xx_init(chip);
200         xonar_enable_output(chip);
201 }
202
203 static void set_cs43xx_params(struct oxygen *chip,
204                               struct snd_pcm_hw_params *params)
205 {
206         struct xonar_cs43xx *data = chip->model_data;
207         u8 cs4398_fm, cs4362a_fm;
208
209         if (params_rate(params) <= 50000) {
210                 cs4398_fm = CS4398_FM_SINGLE;
211                 cs4362a_fm = CS4362A_FM_SINGLE;
212         } else if (params_rate(params) <= 100000) {
213                 cs4398_fm = CS4398_FM_DOUBLE;
214                 cs4362a_fm = CS4362A_FM_DOUBLE;
215         } else {
216                 cs4398_fm = CS4398_FM_QUAD;
217                 cs4362a_fm = CS4362A_FM_QUAD;
218         }
219         data->cs4398_fm = CS4398_DEM_NONE | CS4398_DIF_LJUST | cs4398_fm;
220         data->cs4362a_fm =
221                 (data->cs4362a_fm & ~CS4362A_FM_MASK) | cs4362a_fm;
222         data->cs4362a_fm_c =
223                 (data->cs4362a_fm_c & ~CS4362A_FM_MASK) | cs4362a_fm;
224         cs4398_write(chip, 2, data->cs4398_fm);
225         cs4362a_write(chip, 0x06, data->cs4362a_fm);
226         cs4362a_write(chip, 0x09, data->cs4362a_fm_c);
227         cs4362a_write(chip, 0x0c, data->cs4362a_fm);
228 }
229
230 static void update_cs43xx_center_lfe_mix(struct oxygen *chip, bool mixed)
231 {
232         struct xonar_cs43xx *data = chip->model_data;
233
234         data->cs4362a_fm_c &= ~CS4362A_ATAPI_MASK;
235         if (mixed)
236                 data->cs4362a_fm_c |= CS4362A_ATAPI_B_LR | CS4362A_ATAPI_A_LR;
237         else
238                 data->cs4362a_fm_c |= CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
239         cs4362a_write(chip, 0x09, data->cs4362a_fm_c);
240 }
241
242 static const struct snd_kcontrol_new front_panel_switch = {
243         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
244         .name = "Front Panel Switch",
245         .info = snd_ctl_boolean_mono_info,
246         .get = xonar_gpio_bit_switch_get,
247         .put = xonar_gpio_bit_switch_put,
248         .private_value = GPIO_D1_FRONT_PANEL,
249 };
250
251 static void xonar_d1_line_mic_ac97_switch(struct oxygen *chip,
252                                           unsigned int reg, unsigned int mute)
253 {
254         if (reg == AC97_LINE) {
255                 spin_lock_irq(&chip->reg_lock);
256                 oxygen_write16_masked(chip, OXYGEN_GPIO_DATA,
257                                       mute ? GPIO_D1_INPUT_ROUTE : 0,
258                                       GPIO_D1_INPUT_ROUTE);
259                 spin_unlock_irq(&chip->reg_lock);
260         }
261 }
262
263 static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -6000, 100, 0);
264
265 static int xonar_d1_control_filter(struct snd_kcontrol_new *template)
266 {
267         if (!strncmp(template->name, "CD Capture ", 11))
268                 return 1; /* no CD input */
269         return 0;
270 }
271
272 static int xonar_d1_mixer_init(struct oxygen *chip)
273 {
274         return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip));
275 }
276
277 static const struct oxygen_model model_xonar_d1 = {
278         .longname = "Asus Virtuoso 100",
279         .chip = "AV200",
280         .init = xonar_d1_init,
281         .control_filter = xonar_d1_control_filter,
282         .mixer_init = xonar_d1_mixer_init,
283         .cleanup = xonar_d1_cleanup,
284         .suspend = xonar_d1_suspend,
285         .resume = xonar_d1_resume,
286         .set_dac_params = set_cs43xx_params,
287         .set_adc_params = xonar_set_cs53x1_params,
288         .update_dac_volume = update_cs43xx_volume,
289         .update_dac_mute = update_cs43xx_mute,
290         .update_center_lfe_mix = update_cs43xx_center_lfe_mix,
291         .ac97_switch = xonar_d1_line_mic_ac97_switch,
292         .dac_tlv = cs4362a_db_scale,
293         .model_data_size = sizeof(struct xonar_cs43xx),
294         .device_config = PLAYBACK_0_TO_I2S |
295                          PLAYBACK_1_TO_SPDIF |
296                          CAPTURE_0_FROM_I2S_2,
297         .dac_channels = 8,
298         .dac_volume_min = 127 - 60,
299         .dac_volume_max = 127,
300         .function_flags = OXYGEN_FUNCTION_2WIRE,
301         .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
302         .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
303 };
304
305 int __devinit get_xonar_cs43xx_model(struct oxygen *chip,
306                                      const struct pci_device_id *id)
307 {
308         switch (id->subdevice) {
309         case 0x834f:
310                 chip->model = model_xonar_d1;
311                 chip->model.shortname = "Xonar D1";
312                 break;
313         case 0x8275:
314         case 0x8327:
315                 chip->model = model_xonar_d1;
316                 chip->model.shortname = "Xonar DX";
317                 chip->model.init = xonar_dx_init;
318                 break;
319         default:
320                 return -EINVAL;
321         }
322         return 0;
323 }