cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

oxygen.c (23231B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * C-Media CMI8788 driver for C-Media's reference design and similar models
      4 *
      5 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
      6 */
      7
      8/*
      9 * CMI8788:
     10 *
     11 *   SPI 0 -> 1st AK4396 (front)
     12 *   SPI 1 -> 2nd AK4396 (surround)
     13 *   SPI 2 -> 3rd AK4396 (center/LFE)
     14 *   SPI 3 -> WM8785
     15 *   SPI 4 -> 4th AK4396 (back)
     16 *
     17 *   GPIO 0 -> DFS0 of AK5385
     18 *   GPIO 1 -> DFS1 of AK5385
     19 *
     20 * X-Meridian models:
     21 *   GPIO 4 -> enable extension S/PDIF input
     22 *   GPIO 6 -> enable on-board S/PDIF input
     23 *
     24 * Claro models:
     25 *   GPIO 6 -> S/PDIF from optical (0) or coaxial (1) input
     26 *   GPIO 8 -> enable headphone amplifier
     27 *
     28 * CM9780:
     29 *
     30 *   LINE_OUT -> input of ADC
     31 *
     32 *   AUX_IN <- aux
     33 *   CD_IN  <- CD
     34 *   MIC_IN <- mic
     35 *
     36 *   GPO 0 -> route line-in (0) or AC97 output (1) to ADC input
     37 */
     38
     39#include <linux/delay.h>
     40#include <linux/mutex.h>
     41#include <linux/pci.h>
     42#include <linux/module.h>
     43#include <sound/ac97_codec.h>
     44#include <sound/control.h>
     45#include <sound/core.h>
     46#include <sound/info.h>
     47#include <sound/initval.h>
     48#include <sound/pcm.h>
     49#include <sound/pcm_params.h>
     50#include <sound/tlv.h>
     51#include "oxygen.h"
     52#include "xonar_dg.h"
     53#include "ak4396.h"
     54#include "wm8785.h"
     55
     56MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
     57MODULE_DESCRIPTION("C-Media CMI8788 driver");
     58MODULE_LICENSE("GPL v2");
     59
     60static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
     61static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
     62static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
     63
     64module_param_array(index, int, NULL, 0444);
     65MODULE_PARM_DESC(index, "card index");
     66module_param_array(id, charp, NULL, 0444);
     67MODULE_PARM_DESC(id, "ID string");
     68module_param_array(enable, bool, NULL, 0444);
     69MODULE_PARM_DESC(enable, "enable card");
     70
     71enum {
     72	MODEL_CMEDIA_REF,
     73	MODEL_MERIDIAN,
     74	MODEL_MERIDIAN_2G,
     75	MODEL_CLARO,
     76	MODEL_CLARO_HALO,
     77	MODEL_FANTASIA,
     78	MODEL_SERENADE,
     79	MODEL_2CH_OUTPUT,
     80	MODEL_HG2PCI,
     81	MODEL_XONAR_DG,
     82	MODEL_XONAR_DGX,
     83};
     84
     85static const struct pci_device_id oxygen_ids[] = {
     86	/* C-Media's reference design */
     87	{ OXYGEN_PCI_SUBID(0x10b0, 0x0216), .driver_data = MODEL_CMEDIA_REF },
     88	{ OXYGEN_PCI_SUBID(0x10b0, 0x0217), .driver_data = MODEL_CMEDIA_REF },
     89	{ OXYGEN_PCI_SUBID(0x10b0, 0x0218), .driver_data = MODEL_CMEDIA_REF },
     90	{ OXYGEN_PCI_SUBID(0x10b0, 0x0219), .driver_data = MODEL_CMEDIA_REF },
     91	{ OXYGEN_PCI_SUBID(0x13f6, 0x0001), .driver_data = MODEL_CMEDIA_REF },
     92	{ OXYGEN_PCI_SUBID(0x13f6, 0x0010), .driver_data = MODEL_CMEDIA_REF },
     93	{ OXYGEN_PCI_SUBID(0x13f6, 0x8788), .driver_data = MODEL_CMEDIA_REF },
     94	{ OXYGEN_PCI_SUBID(0x147a, 0xa017), .driver_data = MODEL_CMEDIA_REF },
     95	{ OXYGEN_PCI_SUBID(0x1a58, 0x0910), .driver_data = MODEL_CMEDIA_REF },
     96	/* Asus Xonar DG */
     97	{ OXYGEN_PCI_SUBID(0x1043, 0x8467), .driver_data = MODEL_XONAR_DG },
     98	/* Asus Xonar DGX */
     99	{ OXYGEN_PCI_SUBID(0x1043, 0x8521), .driver_data = MODEL_XONAR_DGX },
    100	/* PCI 2.0 HD Audio */
    101	{ OXYGEN_PCI_SUBID(0x13f6, 0x8782), .driver_data = MODEL_2CH_OUTPUT },
    102	/* Kuroutoshikou CMI8787-HG2PCI */
    103	{ OXYGEN_PCI_SUBID(0x13f6, 0xffff), .driver_data = MODEL_HG2PCI },
    104	/* TempoTec HiFier Fantasia */
    105	{ OXYGEN_PCI_SUBID(0x14c3, 0x1710), .driver_data = MODEL_FANTASIA },
    106	/* TempoTec HiFier Serenade */
    107	{ OXYGEN_PCI_SUBID(0x14c3, 0x1711), .driver_data = MODEL_SERENADE },
    108	/* AuzenTech X-Meridian */
    109	{ OXYGEN_PCI_SUBID(0x415a, 0x5431), .driver_data = MODEL_MERIDIAN },
    110	/* AuzenTech X-Meridian 2G */
    111	{ OXYGEN_PCI_SUBID(0x5431, 0x017a), .driver_data = MODEL_MERIDIAN_2G },
    112	/* HT-Omega Claro */
    113	{ OXYGEN_PCI_SUBID(0x7284, 0x9761), .driver_data = MODEL_CLARO },
    114	/* HT-Omega Claro halo */
    115	{ OXYGEN_PCI_SUBID(0x7284, 0x9781), .driver_data = MODEL_CLARO_HALO },
    116	{ }
    117};
    118MODULE_DEVICE_TABLE(pci, oxygen_ids);
    119
    120
    121#define GPIO_AK5385_DFS_MASK	0x0003
    122#define GPIO_AK5385_DFS_NORMAL	0x0000
    123#define GPIO_AK5385_DFS_DOUBLE	0x0001
    124#define GPIO_AK5385_DFS_QUAD	0x0002
    125
    126#define GPIO_MERIDIAN_DIG_MASK	0x0050
    127#define GPIO_MERIDIAN_DIG_EXT	0x0010
    128#define GPIO_MERIDIAN_DIG_BOARD	0x0040
    129
    130#define GPIO_CLARO_DIG_COAX	0x0040
    131#define GPIO_CLARO_HP		0x0100
    132
    133struct generic_data {
    134	unsigned int dacs;
    135	u8 ak4396_regs[4][5];
    136	u16 wm8785_regs[3];
    137};
    138
    139static void ak4396_write(struct oxygen *chip, unsigned int codec,
    140			 u8 reg, u8 value)
    141{
    142	/* maps ALSA channel pair number to SPI output */
    143	static const u8 codec_spi_map[4] = {
    144		0, 1, 2, 4
    145	};
    146	struct generic_data *data = chip->model_data;
    147
    148	oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER |
    149			 OXYGEN_SPI_DATA_LENGTH_2 |
    150			 OXYGEN_SPI_CLOCK_160 |
    151			 (codec_spi_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
    152			 OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
    153			 AK4396_WRITE | (reg << 8) | value);
    154	data->ak4396_regs[codec][reg] = value;
    155}
    156
    157static void ak4396_write_cached(struct oxygen *chip, unsigned int codec,
    158				u8 reg, u8 value)
    159{
    160	struct generic_data *data = chip->model_data;
    161
    162	if (value != data->ak4396_regs[codec][reg])
    163		ak4396_write(chip, codec, reg, value);
    164}
    165
    166static void wm8785_write(struct oxygen *chip, u8 reg, unsigned int value)
    167{
    168	struct generic_data *data = chip->model_data;
    169
    170	oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER |
    171			 OXYGEN_SPI_DATA_LENGTH_2 |
    172			 OXYGEN_SPI_CLOCK_160 |
    173			 (3 << OXYGEN_SPI_CODEC_SHIFT) |
    174			 OXYGEN_SPI_CEN_LATCH_CLOCK_LO,
    175			 (reg << 9) | value);
    176	if (reg < ARRAY_SIZE(data->wm8785_regs))
    177		data->wm8785_regs[reg] = value;
    178}
    179
    180static void ak4396_registers_init(struct oxygen *chip)
    181{
    182	struct generic_data *data = chip->model_data;
    183	unsigned int i;
    184
    185	for (i = 0; i < data->dacs; ++i) {
    186		ak4396_write(chip, i, AK4396_CONTROL_1,
    187			     AK4396_DIF_24_MSB | AK4396_RSTN);
    188		ak4396_write(chip, i, AK4396_CONTROL_2,
    189			     data->ak4396_regs[0][AK4396_CONTROL_2]);
    190		ak4396_write(chip, i, AK4396_CONTROL_3,
    191			     AK4396_PCM);
    192		ak4396_write(chip, i, AK4396_LCH_ATT,
    193			     chip->dac_volume[i * 2]);
    194		ak4396_write(chip, i, AK4396_RCH_ATT,
    195			     chip->dac_volume[i * 2 + 1]);
    196	}
    197}
    198
    199static void ak4396_init(struct oxygen *chip)
    200{
    201	struct generic_data *data = chip->model_data;
    202
    203	data->dacs = chip->model.dac_channels_pcm / 2;
    204	data->ak4396_regs[0][AK4396_CONTROL_2] =
    205		AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL;
    206	ak4396_registers_init(chip);
    207	snd_component_add(chip->card, "AK4396");
    208}
    209
    210static void ak5385_init(struct oxygen *chip)
    211{
    212	oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_AK5385_DFS_MASK);
    213	oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_AK5385_DFS_MASK);
    214	snd_component_add(chip->card, "AK5385");
    215}
    216
    217static void wm8785_registers_init(struct oxygen *chip)
    218{
    219	struct generic_data *data = chip->model_data;
    220
    221	wm8785_write(chip, WM8785_R7, 0);
    222	wm8785_write(chip, WM8785_R0, data->wm8785_regs[0]);
    223	wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]);
    224}
    225
    226static void wm8785_init(struct oxygen *chip)
    227{
    228	struct generic_data *data = chip->model_data;
    229
    230	data->wm8785_regs[0] =
    231		WM8785_MCR_SLAVE | WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST;
    232	data->wm8785_regs[2] = WM8785_HPFR | WM8785_HPFL;
    233	wm8785_registers_init(chip);
    234	snd_component_add(chip->card, "WM8785");
    235}
    236
    237static void generic_init(struct oxygen *chip)
    238{
    239	ak4396_init(chip);
    240	wm8785_init(chip);
    241}
    242
    243static void meridian_init(struct oxygen *chip)
    244{
    245	oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
    246			  GPIO_MERIDIAN_DIG_MASK);
    247	oxygen_write16_masked(chip, OXYGEN_GPIO_DATA,
    248			      GPIO_MERIDIAN_DIG_BOARD, GPIO_MERIDIAN_DIG_MASK);
    249	ak4396_init(chip);
    250	ak5385_init(chip);
    251}
    252
    253static void claro_enable_hp(struct oxygen *chip)
    254{
    255	msleep(300);
    256	oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_HP);
    257	oxygen_set_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_HP);
    258}
    259
    260static void claro_init(struct oxygen *chip)
    261{
    262	oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_DIG_COAX);
    263	oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_DIG_COAX);
    264	ak4396_init(chip);
    265	wm8785_init(chip);
    266	claro_enable_hp(chip);
    267}
    268
    269static void claro_halo_init(struct oxygen *chip)
    270{
    271	oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_DIG_COAX);
    272	oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_DIG_COAX);
    273	ak4396_init(chip);
    274	ak5385_init(chip);
    275	claro_enable_hp(chip);
    276}
    277
    278static void fantasia_init(struct oxygen *chip)
    279{
    280	ak4396_init(chip);
    281	snd_component_add(chip->card, "CS5340");
    282}
    283
    284static void stereo_output_init(struct oxygen *chip)
    285{
    286	ak4396_init(chip);
    287}
    288
    289static void generic_cleanup(struct oxygen *chip)
    290{
    291}
    292
    293static void claro_disable_hp(struct oxygen *chip)
    294{
    295	oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_HP);
    296}
    297
    298static void claro_cleanup(struct oxygen *chip)
    299{
    300	claro_disable_hp(chip);
    301}
    302
    303static void claro_suspend(struct oxygen *chip)
    304{
    305	claro_disable_hp(chip);
    306}
    307
    308static void generic_resume(struct oxygen *chip)
    309{
    310	ak4396_registers_init(chip);
    311	wm8785_registers_init(chip);
    312}
    313
    314static void meridian_resume(struct oxygen *chip)
    315{
    316	ak4396_registers_init(chip);
    317}
    318
    319static void claro_resume(struct oxygen *chip)
    320{
    321	ak4396_registers_init(chip);
    322	claro_enable_hp(chip);
    323}
    324
    325static void stereo_resume(struct oxygen *chip)
    326{
    327	ak4396_registers_init(chip);
    328}
    329
    330static void set_ak4396_params(struct oxygen *chip,
    331			      struct snd_pcm_hw_params *params)
    332{
    333	struct generic_data *data = chip->model_data;
    334	unsigned int i;
    335	u8 value;
    336
    337	value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_DFS_MASK;
    338	if (params_rate(params) <= 54000)
    339		value |= AK4396_DFS_NORMAL;
    340	else if (params_rate(params) <= 108000)
    341		value |= AK4396_DFS_DOUBLE;
    342	else
    343		value |= AK4396_DFS_QUAD;
    344
    345	msleep(1); /* wait for the new MCLK to become stable */
    346
    347	if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) {
    348		for (i = 0; i < data->dacs; ++i) {
    349			ak4396_write(chip, i, AK4396_CONTROL_1,
    350				     AK4396_DIF_24_MSB);
    351			ak4396_write(chip, i, AK4396_CONTROL_2, value);
    352			ak4396_write(chip, i, AK4396_CONTROL_1,
    353				     AK4396_DIF_24_MSB | AK4396_RSTN);
    354		}
    355	}
    356}
    357
    358static void update_ak4396_volume(struct oxygen *chip)
    359{
    360	struct generic_data *data = chip->model_data;
    361	unsigned int i;
    362
    363	for (i = 0; i < data->dacs; ++i) {
    364		ak4396_write_cached(chip, i, AK4396_LCH_ATT,
    365				    chip->dac_volume[i * 2]);
    366		ak4396_write_cached(chip, i, AK4396_RCH_ATT,
    367				    chip->dac_volume[i * 2 + 1]);
    368	}
    369}
    370
    371static void update_ak4396_mute(struct oxygen *chip)
    372{
    373	struct generic_data *data = chip->model_data;
    374	unsigned int i;
    375	u8 value;
    376
    377	value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE;
    378	if (chip->dac_mute)
    379		value |= AK4396_SMUTE;
    380	for (i = 0; i < data->dacs; ++i)
    381		ak4396_write_cached(chip, i, AK4396_CONTROL_2, value);
    382}
    383
    384static void set_wm8785_params(struct oxygen *chip,
    385			      struct snd_pcm_hw_params *params)
    386{
    387	struct generic_data *data = chip->model_data;
    388	unsigned int value;
    389
    390	value = WM8785_MCR_SLAVE | WM8785_FORMAT_LJUST;
    391	if (params_rate(params) <= 48000)
    392		value |= WM8785_OSR_SINGLE;
    393	else if (params_rate(params) <= 96000)
    394		value |= WM8785_OSR_DOUBLE;
    395	else
    396		value |= WM8785_OSR_QUAD;
    397	if (value != data->wm8785_regs[0]) {
    398		wm8785_write(chip, WM8785_R7, 0);
    399		wm8785_write(chip, WM8785_R0, value);
    400		wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]);
    401	}
    402}
    403
    404static void set_ak5385_params(struct oxygen *chip,
    405			      struct snd_pcm_hw_params *params)
    406{
    407	unsigned int value;
    408
    409	if (params_rate(params) <= 54000)
    410		value = GPIO_AK5385_DFS_NORMAL;
    411	else if (params_rate(params) <= 108000)
    412		value = GPIO_AK5385_DFS_DOUBLE;
    413	else
    414		value = GPIO_AK5385_DFS_QUAD;
    415	oxygen_write16_masked(chip, OXYGEN_GPIO_DATA,
    416			      value, GPIO_AK5385_DFS_MASK);
    417}
    418
    419static void set_no_params(struct oxygen *chip, struct snd_pcm_hw_params *params)
    420{
    421}
    422
    423static int rolloff_info(struct snd_kcontrol *ctl,
    424			struct snd_ctl_elem_info *info)
    425{
    426	static const char *const names[2] = {
    427		"Sharp Roll-off", "Slow Roll-off"
    428	};
    429
    430	return snd_ctl_enum_info(info, 1, 2, names);
    431}
    432
    433static int rolloff_get(struct snd_kcontrol *ctl,
    434		       struct snd_ctl_elem_value *value)
    435{
    436	struct oxygen *chip = ctl->private_data;
    437	struct generic_data *data = chip->model_data;
    438
    439	value->value.enumerated.item[0] =
    440		(data->ak4396_regs[0][AK4396_CONTROL_2] & AK4396_SLOW) != 0;
    441	return 0;
    442}
    443
    444static int rolloff_put(struct snd_kcontrol *ctl,
    445		       struct snd_ctl_elem_value *value)
    446{
    447	struct oxygen *chip = ctl->private_data;
    448	struct generic_data *data = chip->model_data;
    449	unsigned int i;
    450	int changed;
    451	u8 reg;
    452
    453	mutex_lock(&chip->mutex);
    454	reg = data->ak4396_regs[0][AK4396_CONTROL_2];
    455	if (value->value.enumerated.item[0])
    456		reg |= AK4396_SLOW;
    457	else
    458		reg &= ~AK4396_SLOW;
    459	changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2];
    460	if (changed) {
    461		for (i = 0; i < data->dacs; ++i)
    462			ak4396_write(chip, i, AK4396_CONTROL_2, reg);
    463	}
    464	mutex_unlock(&chip->mutex);
    465	return changed;
    466}
    467
    468static const struct snd_kcontrol_new rolloff_control = {
    469	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    470	.name = "DAC Filter Playback Enum",
    471	.info = rolloff_info,
    472	.get = rolloff_get,
    473	.put = rolloff_put,
    474};
    475
    476static int hpf_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
    477{
    478	static const char *const names[2] = {
    479		"None", "High-pass Filter"
    480	};
    481
    482	return snd_ctl_enum_info(info, 1, 2, names);
    483}
    484
    485static int hpf_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
    486{
    487	struct oxygen *chip = ctl->private_data;
    488	struct generic_data *data = chip->model_data;
    489
    490	value->value.enumerated.item[0] =
    491		(data->wm8785_regs[WM8785_R2] & WM8785_HPFR) != 0;
    492	return 0;
    493}
    494
    495static int hpf_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
    496{
    497	struct oxygen *chip = ctl->private_data;
    498	struct generic_data *data = chip->model_data;
    499	unsigned int reg;
    500	int changed;
    501
    502	mutex_lock(&chip->mutex);
    503	reg = data->wm8785_regs[WM8785_R2] & ~(WM8785_HPFR | WM8785_HPFL);
    504	if (value->value.enumerated.item[0])
    505		reg |= WM8785_HPFR | WM8785_HPFL;
    506	changed = reg != data->wm8785_regs[WM8785_R2];
    507	if (changed)
    508		wm8785_write(chip, WM8785_R2, reg);
    509	mutex_unlock(&chip->mutex);
    510	return changed;
    511}
    512
    513static const struct snd_kcontrol_new hpf_control = {
    514	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    515	.name = "ADC Filter Capture Enum",
    516	.info = hpf_info,
    517	.get = hpf_get,
    518	.put = hpf_put,
    519};
    520
    521static int meridian_dig_source_info(struct snd_kcontrol *ctl,
    522				    struct snd_ctl_elem_info *info)
    523{
    524	static const char *const names[2] = { "On-board", "Extension" };
    525
    526	return snd_ctl_enum_info(info, 1, 2, names);
    527}
    528
    529static int claro_dig_source_info(struct snd_kcontrol *ctl,
    530				 struct snd_ctl_elem_info *info)
    531{
    532	static const char *const names[2] = { "Optical", "Coaxial" };
    533
    534	return snd_ctl_enum_info(info, 1, 2, names);
    535}
    536
    537static int meridian_dig_source_get(struct snd_kcontrol *ctl,
    538				   struct snd_ctl_elem_value *value)
    539{
    540	struct oxygen *chip = ctl->private_data;
    541
    542	value->value.enumerated.item[0] =
    543		!!(oxygen_read16(chip, OXYGEN_GPIO_DATA) &
    544		   GPIO_MERIDIAN_DIG_EXT);
    545	return 0;
    546}
    547
    548static int claro_dig_source_get(struct snd_kcontrol *ctl,
    549				struct snd_ctl_elem_value *value)
    550{
    551	struct oxygen *chip = ctl->private_data;
    552
    553	value->value.enumerated.item[0] =
    554		!!(oxygen_read16(chip, OXYGEN_GPIO_DATA) &
    555		   GPIO_CLARO_DIG_COAX);
    556	return 0;
    557}
    558
    559static int meridian_dig_source_put(struct snd_kcontrol *ctl,
    560				   struct snd_ctl_elem_value *value)
    561{
    562	struct oxygen *chip = ctl->private_data;
    563	u16 old_reg, new_reg;
    564	int changed;
    565
    566	mutex_lock(&chip->mutex);
    567	old_reg = oxygen_read16(chip, OXYGEN_GPIO_DATA);
    568	new_reg = old_reg & ~GPIO_MERIDIAN_DIG_MASK;
    569	if (value->value.enumerated.item[0] == 0)
    570		new_reg |= GPIO_MERIDIAN_DIG_BOARD;
    571	else
    572		new_reg |= GPIO_MERIDIAN_DIG_EXT;
    573	changed = new_reg != old_reg;
    574	if (changed)
    575		oxygen_write16(chip, OXYGEN_GPIO_DATA, new_reg);
    576	mutex_unlock(&chip->mutex);
    577	return changed;
    578}
    579
    580static int claro_dig_source_put(struct snd_kcontrol *ctl,
    581				struct snd_ctl_elem_value *value)
    582{
    583	struct oxygen *chip = ctl->private_data;
    584	u16 old_reg, new_reg;
    585	int changed;
    586
    587	mutex_lock(&chip->mutex);
    588	old_reg = oxygen_read16(chip, OXYGEN_GPIO_DATA);
    589	new_reg = old_reg & ~GPIO_CLARO_DIG_COAX;
    590	if (value->value.enumerated.item[0])
    591		new_reg |= GPIO_CLARO_DIG_COAX;
    592	changed = new_reg != old_reg;
    593	if (changed)
    594		oxygen_write16(chip, OXYGEN_GPIO_DATA, new_reg);
    595	mutex_unlock(&chip->mutex);
    596	return changed;
    597}
    598
    599static const struct snd_kcontrol_new meridian_dig_source_control = {
    600	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    601	.name = "IEC958 Source Capture Enum",
    602	.info = meridian_dig_source_info,
    603	.get = meridian_dig_source_get,
    604	.put = meridian_dig_source_put,
    605};
    606
    607static const struct snd_kcontrol_new claro_dig_source_control = {
    608	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    609	.name = "IEC958 Source Capture Enum",
    610	.info = claro_dig_source_info,
    611	.get = claro_dig_source_get,
    612	.put = claro_dig_source_put,
    613};
    614
    615static int generic_mixer_init(struct oxygen *chip)
    616{
    617	return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip));
    618}
    619
    620static int generic_wm8785_mixer_init(struct oxygen *chip)
    621{
    622	int err;
    623
    624	err = generic_mixer_init(chip);
    625	if (err < 0)
    626		return err;
    627	err = snd_ctl_add(chip->card, snd_ctl_new1(&hpf_control, chip));
    628	if (err < 0)
    629		return err;
    630	return 0;
    631}
    632
    633static int meridian_mixer_init(struct oxygen *chip)
    634{
    635	int err;
    636
    637	err = generic_mixer_init(chip);
    638	if (err < 0)
    639		return err;
    640	err = snd_ctl_add(chip->card,
    641			  snd_ctl_new1(&meridian_dig_source_control, chip));
    642	if (err < 0)
    643		return err;
    644	return 0;
    645}
    646
    647static int claro_mixer_init(struct oxygen *chip)
    648{
    649	int err;
    650
    651	err = generic_wm8785_mixer_init(chip);
    652	if (err < 0)
    653		return err;
    654	err = snd_ctl_add(chip->card,
    655			  snd_ctl_new1(&claro_dig_source_control, chip));
    656	if (err < 0)
    657		return err;
    658	return 0;
    659}
    660
    661static int claro_halo_mixer_init(struct oxygen *chip)
    662{
    663	int err;
    664
    665	err = generic_mixer_init(chip);
    666	if (err < 0)
    667		return err;
    668	err = snd_ctl_add(chip->card,
    669			  snd_ctl_new1(&claro_dig_source_control, chip));
    670	if (err < 0)
    671		return err;
    672	return 0;
    673}
    674
    675static void dump_ak4396_registers(struct oxygen *chip,
    676				  struct snd_info_buffer *buffer)
    677{
    678	struct generic_data *data = chip->model_data;
    679	unsigned int dac, i;
    680
    681	for (dac = 0; dac < data->dacs; ++dac) {
    682		snd_iprintf(buffer, "\nAK4396 %u:", dac + 1);
    683		for (i = 0; i < 5; ++i)
    684			snd_iprintf(buffer, " %02x", data->ak4396_regs[dac][i]);
    685	}
    686	snd_iprintf(buffer, "\n");
    687}
    688
    689static void dump_wm8785_registers(struct oxygen *chip,
    690				  struct snd_info_buffer *buffer)
    691{
    692	struct generic_data *data = chip->model_data;
    693	unsigned int i;
    694
    695	snd_iprintf(buffer, "\nWM8785:");
    696	for (i = 0; i < 3; ++i)
    697		snd_iprintf(buffer, " %03x", data->wm8785_regs[i]);
    698	snd_iprintf(buffer, "\n");
    699}
    700
    701static void dump_oxygen_registers(struct oxygen *chip,
    702				  struct snd_info_buffer *buffer)
    703{
    704	dump_ak4396_registers(chip, buffer);
    705	dump_wm8785_registers(chip, buffer);
    706}
    707
    708static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0);
    709
    710static const struct oxygen_model model_generic = {
    711	.shortname = "C-Media CMI8788",
    712	.longname = "C-Media Oxygen HD Audio",
    713	.chip = "CMI8788",
    714	.init = generic_init,
    715	.mixer_init = generic_wm8785_mixer_init,
    716	.cleanup = generic_cleanup,
    717	.resume = generic_resume,
    718	.set_dac_params = set_ak4396_params,
    719	.set_adc_params = set_wm8785_params,
    720	.update_dac_volume = update_ak4396_volume,
    721	.update_dac_mute = update_ak4396_mute,
    722	.dump_registers = dump_oxygen_registers,
    723	.dac_tlv = ak4396_db_scale,
    724	.model_data_size = sizeof(struct generic_data),
    725	.device_config = PLAYBACK_0_TO_I2S |
    726			 PLAYBACK_1_TO_SPDIF |
    727			 PLAYBACK_2_TO_AC97_1 |
    728			 CAPTURE_0_FROM_I2S_1 |
    729			 CAPTURE_1_FROM_SPDIF |
    730			 CAPTURE_2_FROM_AC97_1 |
    731			 AC97_CD_INPUT,
    732	.dac_channels_pcm = 8,
    733	.dac_channels_mixer = 8,
    734	.dac_volume_min = 0,
    735	.dac_volume_max = 255,
    736	.function_flags = OXYGEN_FUNCTION_SPI |
    737			  OXYGEN_FUNCTION_ENABLE_SPI_4_5,
    738	.dac_mclks = OXYGEN_MCLKS(256, 128, 128),
    739	.adc_mclks = OXYGEN_MCLKS(256, 256, 128),
    740	.dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
    741	.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
    742};
    743
    744static int get_oxygen_model(struct oxygen *chip,
    745			    const struct pci_device_id *id)
    746{
    747	static const char *const names[] = {
    748		[MODEL_MERIDIAN]	= "AuzenTech X-Meridian",
    749		[MODEL_MERIDIAN_2G]	= "AuzenTech X-Meridian 2G",
    750		[MODEL_CLARO]		= "HT-Omega Claro",
    751		[MODEL_CLARO_HALO]	= "HT-Omega Claro halo",
    752		[MODEL_FANTASIA]	= "TempoTec HiFier Fantasia",
    753		[MODEL_SERENADE]	= "TempoTec HiFier Serenade",
    754		[MODEL_HG2PCI]		= "CMI8787-HG2PCI",
    755		[MODEL_XONAR_DG]        = "Xonar DG",
    756		[MODEL_XONAR_DGX]       = "Xonar DGX",
    757	};
    758
    759	chip->model = model_generic;
    760	switch (id->driver_data) {
    761	case MODEL_MERIDIAN:
    762	case MODEL_MERIDIAN_2G:
    763		chip->model.init = meridian_init;
    764		chip->model.mixer_init = meridian_mixer_init;
    765		chip->model.resume = meridian_resume;
    766		chip->model.set_adc_params = set_ak5385_params;
    767		chip->model.dump_registers = dump_ak4396_registers;
    768		chip->model.device_config = PLAYBACK_0_TO_I2S |
    769					    PLAYBACK_1_TO_SPDIF |
    770					    CAPTURE_0_FROM_I2S_2 |
    771					    CAPTURE_1_FROM_SPDIF;
    772		if (id->driver_data == MODEL_MERIDIAN)
    773			chip->model.device_config |= AC97_CD_INPUT;
    774		break;
    775	case MODEL_CLARO:
    776		chip->model.init = claro_init;
    777		chip->model.mixer_init = claro_mixer_init;
    778		chip->model.cleanup = claro_cleanup;
    779		chip->model.suspend = claro_suspend;
    780		chip->model.resume = claro_resume;
    781		break;
    782	case MODEL_CLARO_HALO:
    783		chip->model.init = claro_halo_init;
    784		chip->model.mixer_init = claro_halo_mixer_init;
    785		chip->model.cleanup = claro_cleanup;
    786		chip->model.suspend = claro_suspend;
    787		chip->model.resume = claro_resume;
    788		chip->model.set_adc_params = set_ak5385_params;
    789		chip->model.dump_registers = dump_ak4396_registers;
    790		chip->model.device_config = PLAYBACK_0_TO_I2S |
    791					    PLAYBACK_1_TO_SPDIF |
    792					    CAPTURE_0_FROM_I2S_2 |
    793					    CAPTURE_1_FROM_SPDIF;
    794		break;
    795	case MODEL_FANTASIA:
    796	case MODEL_SERENADE:
    797	case MODEL_2CH_OUTPUT:
    798	case MODEL_HG2PCI:
    799		chip->model.shortname = "C-Media CMI8787";
    800		chip->model.chip = "CMI8787";
    801		if (id->driver_data == MODEL_FANTASIA)
    802			chip->model.init = fantasia_init;
    803		else
    804			chip->model.init = stereo_output_init;
    805		chip->model.resume = stereo_resume;
    806		chip->model.mixer_init = generic_mixer_init;
    807		chip->model.set_adc_params = set_no_params;
    808		chip->model.dump_registers = dump_ak4396_registers;
    809		chip->model.device_config = PLAYBACK_0_TO_I2S |
    810					    PLAYBACK_1_TO_SPDIF;
    811		if (id->driver_data == MODEL_FANTASIA) {
    812			chip->model.device_config |= CAPTURE_0_FROM_I2S_1;
    813			chip->model.adc_mclks = OXYGEN_MCLKS(256, 128, 128);
    814		}
    815		chip->model.dac_channels_pcm = 2;
    816		chip->model.dac_channels_mixer = 2;
    817		break;
    818	case MODEL_XONAR_DG:
    819	case MODEL_XONAR_DGX:
    820		chip->model = model_xonar_dg;
    821		break;
    822	}
    823	if (id->driver_data == MODEL_MERIDIAN ||
    824	    id->driver_data == MODEL_MERIDIAN_2G ||
    825	    id->driver_data == MODEL_CLARO_HALO) {
    826		chip->model.misc_flags = OXYGEN_MISC_MIDI;
    827		chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT;
    828	}
    829	if (id->driver_data < ARRAY_SIZE(names) && names[id->driver_data])
    830		chip->model.shortname = names[id->driver_data];
    831	return 0;
    832}
    833
    834static int generic_oxygen_probe(struct pci_dev *pci,
    835				const struct pci_device_id *pci_id)
    836{
    837	static int dev;
    838	int err;
    839
    840	if (dev >= SNDRV_CARDS)
    841		return -ENODEV;
    842	if (!enable[dev]) {
    843		++dev;
    844		return -ENOENT;
    845	}
    846	err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE,
    847			       oxygen_ids, get_oxygen_model);
    848	if (err >= 0)
    849		++dev;
    850	return err;
    851}
    852
    853static struct pci_driver oxygen_driver = {
    854	.name = KBUILD_MODNAME,
    855	.id_table = oxygen_ids,
    856	.probe = generic_oxygen_probe,
    857#ifdef CONFIG_PM_SLEEP
    858	.driver = {
    859		.pm = &oxygen_pci_pm,
    860	},
    861#endif
    862};
    863
    864module_pci_driver(oxygen_driver);