static void xonar_stx_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_FAST); data->anti_pop_delay = 100; data->dacs = 1; data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; data->ext_power_reg = OXYGEN_GPI_DATA; data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; data->ext_power_bit = GPI_DX_EXT_POWER; data->pcm1796_oversampling = PCM1796_OS_64; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); xonar_common_init(chip); snd_component_add(chip->card, "PCM1792A"); snd_component_add(chip->card, "CS5381"); }
static void xonar_d1_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; data->anti_pop_delay = 800; data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; data->cs4362a_fm = CS4362A_FM_SINGLE | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; if (data->model == MODEL_DX) { data->ext_power_reg = OXYGEN_GPI_DATA; data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; data->ext_power_bit = GPI_DX_EXT_POWER; } oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_FAST); cs43xx_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); xonar_common_init(chip); snd_component_add(chip->card, "CS4398"); snd_component_add(chip->card, "CS4362A"); snd_component_add(chip->card, "CS5361"); }
static void xonar_hdav_init(struct oxygen *chip) { struct xonar_hdav *data = chip->model_data; oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_STANDARD); data->pcm179x.generic.anti_pop_delay = 100; data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE; data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA; data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER; data->pcm179x.dacs = chip->model.dac_channels_mixer / 2; data->pcm179x.h6 = chip->model.dac_channels_mixer > 2; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_HDAV_MAGIC | GPIO_INPUT_ROUTE); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE); xonar_init_cs53x1(chip); xonar_init_ext_power(chip); xonar_hdmi_init(chip, &data->hdmi); xonar_enable_output(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void xonar_d2_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; data->anti_pop_delay = 300; data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; data->pcm1796_oversampling = PCM1796_OS_64; if (data->model == MODEL_D2X) { data->ext_power_reg = OXYGEN_GPIO_DATA; data->ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; data->ext_power_bit = GPIO_D2X_EXT_POWER; oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER); } pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); xonar_common_init(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void xonar_d2_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; unsigned int i; data->anti_pop_delay = 300; data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; for (i = 0; i < 4; ++i) { pcm1796_write(chip, i, 18, PCM1796_MUTE | PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD); pcm1796_write(chip, i, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1); pcm1796_write(chip, i, 20, PCM1796_OS_64); pcm1796_write(chip, i, 21, 0); pcm1796_write(chip, i, 16, 0x0f); /* set ATL/ATR after ATLD */ pcm1796_write(chip, i, 17, 0x0f); } oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); xonar_common_init(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void xonar_dx_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; data->anti_pop_delay = 800; data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; data->ext_power_reg = OXYGEN_GPI_DATA; data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; data->ext_power_bit = GPI_DX_EXT_POWER; oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_FAST); /* set CPEN (control port mode) and power down */ cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN); cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); /* configure */ cs4398_write(chip, 2, CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST); cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L); cs4398_write(chip, 4, CS4398_MUTEP_LOW | CS4398_PAMUTE); cs4398_write(chip, 5, 0xfe); cs4398_write(chip, 6, 0xfe); cs4398_write(chip, 7, CS4398_RMP_DN | CS4398_RMP_UP | CS4398_ZERO_CROSS | CS4398_SOFT_RAMP); cs4362a_write(chip, 0x02, CS4362A_DIF_LJUST); cs4362a_write(chip, 0x03, CS4362A_MUTEC_6 | CS4362A_AMUTE | CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP); cs4362a_write(chip, 0x04, CS4362A_RMP_DN | CS4362A_DEM_NONE); cs4362a_write(chip, 0x05, 0); cs4362a_write(chip, 0x06, CS4362A_FM_SINGLE | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); cs4362a_write(chip, 0x07, 0x7f | CS4362A_MUTE); cs4362a_write(chip, 0x08, 0x7f | CS4362A_MUTE); cs4362a_write(chip, 0x09, CS4362A_FM_SINGLE | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); cs4362a_write(chip, 0x0a, 0x7f | CS4362A_MUTE); cs4362a_write(chip, 0x0b, 0x7f | CS4362A_MUTE); cs4362a_write(chip, 0x0c, CS4362A_FM_SINGLE | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); cs4362a_write(chip, 0x0d, 0x7f | CS4362A_MUTE); cs4362a_write(chip, 0x0e, 0x7f | CS4362A_MUTE); /* clear power down */ cs4398_write(chip, 8, CS4398_CPEN); cs4362a_write(chip, 0x01, CS4362A_CPEN); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); xonar_common_init(chip); snd_component_add(chip->card, "CS4398"); snd_component_add(chip->card, "CS4362A"); snd_component_add(chip->card, "CS5361"); }
static void cs4245_init(struct oxygen *chip) { struct dg *data = chip->model_data; /* save the initial state: codec version, registers */ cs4245_shadow_control(chip, CS4245_SAVE_TO_SHADOW); /* * Power up the CODEC internals, enable soft ramp & zero cross, work in * async. mode, enable aux output from DAC. Invert DAC output as in the * Windows driver. */ data->cs4245_shadow[CS4245_POWER_CTRL] = 0; data->cs4245_shadow[CS4245_SIGNAL_SEL] = CS4245_A_OUT_SEL_DAC | CS4245_ASYNCH; data->cs4245_shadow[CS4245_DAC_CTRL_1] = CS4245_DAC_FM_SINGLE | CS4245_DAC_DIF_LJUST; data->cs4245_shadow[CS4245_DAC_CTRL_2] = CS4245_DAC_SOFT | CS4245_DAC_ZERO | CS4245_INVERT_DAC; data->cs4245_shadow[CS4245_ADC_CTRL] = CS4245_ADC_FM_SINGLE | CS4245_ADC_DIF_LJUST; data->cs4245_shadow[CS4245_ANALOG_IN] = CS4245_PGA_SOFT | CS4245_PGA_ZERO; data->cs4245_shadow[CS4245_PGA_B_CTRL] = 0; data->cs4245_shadow[CS4245_PGA_A_CTRL] = 0; data->cs4245_shadow[CS4245_DAC_A_CTRL] = 8; data->cs4245_shadow[CS4245_DAC_B_CTRL] = 8; cs4245_shadow_control(chip, CS4245_LOAD_FROM_SHADOW); snd_component_add(chip->card, "CS4245"); }
int snd_gf1_new_mixer(struct snd_gus_card * gus) { struct snd_card *card; unsigned int idx, max; int err; snd_assert(gus != NULL, return -EINVAL); card = gus->card; snd_assert(card != NULL, return -EINVAL); if (gus->ics_flag) snd_component_add(card, "ICS2101"); if (card->mixername[0] == '\0') { strcpy(card->mixername, gus->ics_flag ? "GF1,ICS2101" : "GF1"); } else { if (gus->ics_flag) strcat(card->mixername, ",ICS2101"); strcat(card->mixername, ",GF1"); } if (!gus->ics_flag) { max = gus->ess_flag ? 1 : ARRAY_SIZE(snd_gf1_controls); for (idx = 0; idx < max; idx++) { if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_gf1_controls[idx], gus))) < 0) return err; } } else { for (idx = 0; idx < ARRAY_SIZE(snd_ics_controls); idx++) { if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_ics_controls[idx], gus))) < 0) return err; } } return 0; }
static void xonar_d1_init(struct oxygen *chip) { struct xonar_cs43xx *data = chip->model_data; data->generic.anti_pop_delay = 800; data->generic.output_enable_bit = GPIO_D1_OUTPUT_ENABLE; data->cs4398_regs[2] = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; data->cs4398_regs[4] = CS4398_MUTEP_LOW | CS4398_MUTE_B | CS4398_MUTE_A | CS4398_PAMUTE; data->cs4398_regs[5] = 60 * 2; data->cs4398_regs[6] = 60 * 2; data->cs4398_regs[7] = CS4398_RMP_DN | CS4398_RMP_UP | CS4398_ZERO_CROSS | CS4398_SOFT_RAMP; data->cs4362a_regs[4] = CS4362A_RMP_DN | CS4362A_DEM_NONE; data->cs4362a_regs[6] = CS4362A_FM_SINGLE | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; data->cs4362a_regs[7] = 60 | CS4362A_MUTE; data->cs4362a_regs[8] = 60 | CS4362A_MUTE; data->cs4362a_regs[9] = data->cs4362a_regs[6]; data->cs4362a_regs[10] = 60 | CS4362A_MUTE; data->cs4362a_regs[11] = 60 | CS4362A_MUTE; data->cs4362a_regs[12] = data->cs4362a_regs[6]; data->cs4362a_regs[13] = 60 | CS4362A_MUTE; data->cs4362a_regs[14] = 60 | CS4362A_MUTE; oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_FAST); cs43xx_registers_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); xonar_init_cs53x1(chip); xonar_enable_output(chip); snd_component_add(chip->card, "CS4398"); snd_component_add(chip->card, "CS4362A"); snd_component_add(chip->card, "CS5361"); }
static void ak4396_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; ak4396_registers_init(chip); snd_component_add(chip->card, "AK4396"); }
static void wm8785_init(struct oxygen *chip) { wm8785_write(chip, WM8785_R7, 0); wm8785_write(chip, WM8785_R0, WM8785_MCR_SLAVE | WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST); wm8785_write(chip, WM8785_R1, WM8785_WL_24); snd_component_add(chip->card, "WM8785"); }
static void xonar_d2_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; data->anti_pop_delay = 300; data->dacs = 4; data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; data->pcm1796_oversampling = PCM1796_OS_64; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); xonar_common_init(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void wm8785_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; data->saved_wm8785_registers[0] = WM8785_MCR_SLAVE | WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST; data->saved_wm8785_registers[1] = WM8785_WL_24; wm8785_registers_init(chip); snd_component_add(chip->card, "WM8785"); }
static void ak4396_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; data->dacs = chip->model.dac_channels_pcm / 2; data->ak4396_regs[0][AK4396_CONTROL_2] = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; ak4396_registers_init(chip); snd_component_add(chip->card, "AK4396"); }
static void xonar_d2_init(struct oxygen *chip) { struct xonar_pcm179x *data = chip->model_data; data->generic.anti_pop_delay = 300; data->generic.output_enable_bit = GPIO_D2_OUTPUT_ENABLE; data->dacs = 4; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); xonar_init_cs53x1(chip); xonar_enable_output(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void xonar_st_init_common(struct oxygen *chip) { struct xonar_pcm179x *data = chip->model_data; data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE; data->dacs = chip->model.dac_channels_mixer / 2; data->hp_gain_offset = 2*-18; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_MAGIC | GPIO_ST_HP); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); xonar_init_cs53x1(chip); xonar_enable_output(chip); snd_component_add(chip->card, "PCM1792A"); snd_component_add(chip->card, "CS5381"); }
static void xonar_hdav_init(struct oxygen *chip) { struct xonar_data *data = chip->model_data; u8 param; oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, OXYGEN_2WIRE_LENGTH_8 | OXYGEN_2WIRE_INTERRUPT_MASK | OXYGEN_2WIRE_SPEED_FAST); data->anti_pop_delay = 100; data->dacs = chip->model.private_data == MODEL_HDAV_H6 ? 4 : 1; data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; data->ext_power_reg = OXYGEN_GPI_DATA; data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; data->ext_power_bit = GPI_DX_EXT_POWER; data->pcm1796_oversampling = PCM1796_OS_64; pcm1796_init(chip); oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DX_INPUT_ROUTE); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_INPUT_ROUTE); oxygen_reset_uart(chip); param = 0; hdmi_write_command(chip, 0x61, 1, ¶m); param = 1; hdmi_write_command(chip, 0x74, 1, ¶m); data->hdmi_params[1] = IEC958_AES3_CON_FS_48000; data->hdmi_params[4] = 1; hdmi_write_command(chip, 0x54, 5, data->hdmi_params); xonar_common_init(chip); snd_component_add(chip->card, "PCM1796"); snd_component_add(chip->card, "CS5381"); }
static void ak4396_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; unsigned int i; data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; for (i = 0; i < 4; ++i) { ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); ak4396_write(chip, i, AK4396_CONTROL_2, data->ak4396_ctl2); ak4396_write(chip, i, AK4396_CONTROL_3, AK4396_PCM); ak4396_write(chip, i, AK4396_LCH_ATT, 0); ak4396_write(chip, i, AK4396_RCH_ATT, 0); } snd_component_add(chip->card, "AK4396"); }
static void xonar_st_init(struct oxygen *chip) { struct xonar_pcm179x *data = chip->model_data; data->has_cs2000 = 1; data->cs2000_fun_cfg_1 = CS2000_REF_CLK_DIV_1; oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_I2S | OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); xonar_st_init_i2c(chip); cs2000_registers_init(chip); xonar_st_init_common(chip); snd_component_add(chip->card, "CS2000"); }
static void cs4245_init(struct oxygen *chip) { struct dg *data = chip->model_data; data->cs4245_regs[CS4245_DAC_CTRL_1] = CS4245_DAC_FM_SINGLE | CS4245_DAC_DIF_LJUST; data->cs4245_regs[CS4245_ADC_CTRL] = CS4245_ADC_FM_SINGLE | CS4245_ADC_DIF_LJUST; data->cs4245_regs[CS4245_SIGNAL_SEL] = CS4245_A_OUT_SEL_HIZ | CS4245_ASYNCH; data->cs4245_regs[CS4245_PGA_B_CTRL] = 0; data->cs4245_regs[CS4245_PGA_A_CTRL] = 0; data->cs4245_regs[CS4245_ANALOG_IN] = CS4245_PGA_SOFT | CS4245_PGA_ZERO | CS4245_SEL_INPUT_4; data->cs4245_regs[CS4245_DAC_A_CTRL] = 0; data->cs4245_regs[CS4245_DAC_B_CTRL] = 0; cs4245_registers_init(chip); snd_component_add(chip->card, "CS4245"); }
static void xonar_st_init(struct oxygen *chip) { struct xonar_pcm179x *data = chip->model_data; data->generic.anti_pop_delay = 100; data->h6 = chip->model.dac_channels_mixer > 2; data->has_cs2000 = 1; data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1; data->broken_i2c = true; oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_I2S | OXYGEN_I2S_MCLK(data->h6 ? MCLK_256 : MCLK_512) | OXYGEN_I2S_BITS_16 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); xonar_st_init_i2c(chip); cs2000_registers_init(chip); xonar_st_init_common(chip); snd_component_add(chip->card, "CS2000"); }
int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, const struct oxygen_model *model, unsigned long driver_data) { struct snd_card *card; struct oxygen *chip; int err; card = snd_card_new(index, id, model->owner, sizeof *chip + model->model_data_size); if (!card) return -ENOMEM; chip = card->private_data; chip->card = card; chip->pci = pci; chip->irq = -1; chip->model = *model; chip->model_data = chip + 1; spin_lock_init(&chip->reg_lock); mutex_init(&chip->mutex); INIT_WORK(&chip->spdif_input_bits_work, oxygen_spdif_input_bits_changed); INIT_WORK(&chip->gpio_work, oxygen_gpio_changed); init_waitqueue_head(&chip->ac97_waitqueue); err = pci_enable_device(pci); if (err < 0) goto err_card; err = pci_request_regions(pci, model->chip); if (err < 0) { snd_printk(KERN_ERR "cannot reserve PCI resources\n"); goto err_pci_enable; } if (!(pci_resource_flags(pci, 0) & IORESOURCE_IO) || pci_resource_len(pci, 0) < OXYGEN_IO_SIZE) { snd_printk(KERN_ERR "invalid PCI I/O range\n"); err = -ENXIO; goto err_pci_regions; } chip->addr = pci_resource_start(pci, 0); pci_set_master(pci); snd_card_set_dev(card, &pci->dev); card->private_free = oxygen_card_free; if (chip->model.probe) { err = chip->model.probe(chip, driver_data); if (err < 0) goto err_card; } oxygen_init(chip); chip->model.init(chip); err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED, chip->model.chip, chip); if (err < 0) { snd_printk(KERN_ERR "cannot grab interrupt %d\n", pci->irq); goto err_card; } chip->irq = pci->irq; strcpy(card->driver, chip->model.chip); strcpy(card->shortname, chip->model.shortname); sprintf(card->longname, "%s (rev %u) at %#lx, irq %i", chip->model.longname, chip->revision, chip->addr, chip->irq); strcpy(card->mixername, chip->model.chip); snd_component_add(card, chip->model.chip); err = oxygen_pcm_init(chip); if (err < 0) goto err_card; err = oxygen_mixer_init(chip); if (err < 0) goto err_card; if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) { unsigned int info_flags = MPU401_INFO_INTEGRATED; if (chip->model.device_config & MIDI_OUTPUT) info_flags |= MPU401_INFO_OUTPUT; if (chip->model.device_config & MIDI_INPUT) info_flags |= MPU401_INFO_INPUT; err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI, chip->addr + OXYGEN_MPU401, info_flags, 0, 0, &chip->midi); if (err < 0) goto err_card; } oxygen_proc_init(chip); spin_lock_irq(&chip->reg_lock); if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_DETECT; if (chip->has_ac97_0 | chip->has_ac97_1) chip->interrupt_mask |= OXYGEN_INT_AC97; oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); spin_unlock_irq(&chip->reg_lock); err = snd_card_register(card); if (err < 0) goto err_card; pci_set_drvdata(pci, card); return 0; err_pci_regions: pci_release_regions(pci); err_pci_enable: pci_disable_device(pci); err_card: snd_card_free(card); return err; }
/* * Alsa Constructor - Component probe */ int tm6000_audio_init(struct tm6000_core *dev) { struct snd_card *card; struct snd_tm6000_card *chip; int rc; static int devnr; char component[14]; struct snd_pcm *pcm; if (!dev) return 0; if (devnr >= SNDRV_CARDS) return -ENODEV; if (!enable[devnr]) return -ENOENT; rc = snd_card_create(index[devnr], "tm6000", THIS_MODULE, 0, &card); if (rc < 0) { snd_printk(KERN_ERR "cannot create card instance %d\n", devnr); return rc; } strcpy(card->driver, "tm6000-alsa"); strcpy(card->shortname, "TM5600/60x0"); sprintf(card->longname, "TM5600/60x0 Audio at bus %d device %d", dev->udev->bus->busnum, dev->udev->devnum); sprintf(component, "USB%04x:%04x", le16_to_cpu(dev->udev->descriptor.idVendor), le16_to_cpu(dev->udev->descriptor.idProduct)); snd_component_add(card, component); snd_card_set_dev(card, &dev->udev->dev); chip = kzalloc(sizeof(struct snd_tm6000_card), GFP_KERNEL); if (!chip) { rc = -ENOMEM; goto error; } chip->core = dev; chip->card = card; dev->adev = chip; spin_lock_init(&chip->reg_lock); rc = snd_pcm_new(card, "TM6000 Audio", 0, 0, 1, &pcm); if (rc < 0) goto error_chip; pcm->info_flags = 0; pcm->private_data = chip; strcpy(pcm->name, "Trident TM5600/60x0"); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_tm6000_pcm_ops); INIT_WORK(&dev->wq_trigger, audio_trigger); rc = snd_card_register(card); if (rc < 0) goto error_chip; dprintk(1,"Registered audio driver for %s\n", card->longname); return 0; error_chip: kfree(chip); dev->adev = NULL; error: snd_card_free(card); return rc; }
int snd_tea6330t_update_mixer(struct snd_card *card, struct snd_i2c_bus *bus, int equalizer, int fader) { struct snd_i2c_device *device; struct tea6330t *tea; struct snd_kcontrol_new *knew; unsigned int idx; int err = -ENOMEM; u8 default_treble, default_bass; unsigned char bytes[7]; tea = kzalloc(sizeof(*tea), GFP_KERNEL); if (tea == NULL) return -ENOMEM; if ((err = snd_i2c_device_create(bus, "TEA6330T", TEA6330T_ADDR, &device)) < 0) { kfree(tea); return err; } tea->device = device; tea->bus = bus; tea->equalizer = equalizer; tea->fader = fader; device->private_data = tea; device->private_free = snd_tea6330_free; snd_i2c_lock(bus); /* turn fader off and handle equalizer */ tea->regs[TEA6330T_SADDR_FADER] = 0x3f; tea->regs[TEA6330T_SADDR_AUDIO_SWITCH] = equalizer ? 0 : TEA6330T_EQN; /* initialize mixer */ if (!tea->equalizer) { tea->max_bass = 9; tea->max_treble = 8; default_bass = 3 + 4; tea->bass = 4; default_treble = 3 + 4; tea->treble = 4; } else { tea->max_bass = 5; tea->max_treble = 0; default_bass = 7 + 4; tea->bass = 4; default_treble = 3; tea->treble = 0; } tea->mleft = tea->mright = 0x14; tea->regs[TEA6330T_SADDR_BASS] = default_bass; tea->regs[TEA6330T_SADDR_TREBLE] = default_treble; /* compose I2C message and put the hardware to initial state */ bytes[0] = TEA6330T_SADDR_VOLUME_LEFT; for (idx = 0; idx < 6; idx++) bytes[idx+1] = tea->regs[idx]; if ((err = snd_i2c_sendbytes(device, bytes, 7)) < 0) goto __error; strcat(card->mixername, ",TEA6330T"); if ((err = snd_component_add(card, "TEA6330T")) < 0) goto __error; for (idx = 0; idx < ARRAY_SIZE(snd_tea6330t_controls); idx++) { knew = &snd_tea6330t_controls[idx]; if (tea->treble == 0 && !strcmp(knew->name, "Tone Control - Treble")) continue; if ((err = snd_ctl_add(card, snd_ctl_new1(knew, tea))) < 0) goto __error; } snd_i2c_unlock(bus); return 0; __error: snd_i2c_unlock(bus); snd_i2c_device_free(device); return err; }
static int __init snd_gusextreme_probe(int dev) { static int possible_ess_irqs[] = {5, 9, 10, 7, -1}; static int possible_ess_dmas[] = {1, 3, 0, -1}; static int possible_gf1_irqs[] = {5, 11, 12, 9, 7, 15, 3, -1}; static int possible_gf1_dmas[] = {5, 6, 7, 1, 3, -1}; int xgf1_irq, xgf1_dma, xess_irq, xmpu_irq, xess_dma; snd_card_t *card; struct snd_gusextreme *acard; snd_gus_card_t *gus; es1688_t *es1688; opl3_t *opl3; int err; card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); if (card == NULL) return -ENOMEM; acard = (struct snd_gusextreme *)card->private_data; xgf1_irq = gf1_irq[dev]; if (xgf1_irq == SNDRV_AUTO_IRQ) { if ((xgf1_irq = snd_legacy_find_free_irq(possible_gf1_irqs)) < 0) { snd_printk("unable to find a free IRQ for GF1\n"); err = -EBUSY; goto out; } } xess_irq = irq[dev]; if (xess_irq == SNDRV_AUTO_IRQ) { if ((xess_irq = snd_legacy_find_free_irq(possible_ess_irqs)) < 0) { snd_printk("unable to find a free IRQ for ES1688\n"); err = -EBUSY; goto out; } } if (mpu_port[dev] == SNDRV_AUTO_PORT) mpu_port[dev] = 0; xmpu_irq = mpu_irq[dev]; if (xmpu_irq > 15) xmpu_irq = -1; xgf1_dma = dma1[dev]; if (xgf1_dma == SNDRV_AUTO_DMA) { if ((xgf1_dma = snd_legacy_find_free_dma(possible_gf1_dmas)) < 0) { snd_printk("unable to find a free DMA for GF1\n"); err = -EBUSY; goto out; } } xess_dma = dma8[dev]; if (xess_dma == SNDRV_AUTO_DMA) { if ((xess_dma = snd_legacy_find_free_dma(possible_ess_dmas)) < 0) { snd_printk("unable to find a free DMA for ES1688\n"); err = -EBUSY; goto out; } } if ((err = snd_es1688_create(card, port[dev], mpu_port[dev], xess_irq, xmpu_irq, xess_dma, ES1688_HW_1688, &es1688)) < 0) goto out; if (gf1_port[dev] < 0) gf1_port[dev] = port[dev] + 0x20; if ((err = snd_gus_create(card, gf1_port[dev], xgf1_irq, xgf1_dma, -1, 0, channels[dev], pcm_channels[dev], 0, &gus)) < 0) goto out; if ((err = snd_gusextreme_detect(dev, card, gus, es1688)) < 0) goto out; snd_gusextreme_init(dev, gus); if ((err = snd_gus_initialize(gus)) < 0) goto out; if (!gus->ess_flag) { snd_printdd("GUS Extreme soundcard was not detected at 0x%lx\n", gus->gf1.port); err = -ENODEV; goto out; } if ((err = snd_es1688_pcm(es1688, 0, NULL)) < 0) goto out; if ((err = snd_es1688_mixer(es1688)) < 0) goto out; snd_component_add(card, "ES1688"); if (pcm_channels[dev] > 0) { if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) goto out; } if ((err = snd_gf1_new_mixer(gus)) < 0) goto out; if ((err = snd_gusextreme_mixer(es1688)) < 0) goto out; if (snd_opl3_create(card, es1688->port, es1688->port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) { printk(KERN_ERR "gusextreme: opl3 not detected at 0x%lx\n", es1688->port); } else { if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0) goto out; } if (es1688->mpu_port >= 0x300 && (err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, xmpu_irq, SA_INTERRUPT, NULL)) < 0) goto out; sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, irq %i&%i, dma %i&%i", es1688->port, xgf1_irq, xess_irq, xgf1_dma, xess_dma); if ((err = snd_card_register(card)) < 0) goto out; snd_gusextreme_cards[dev] = card; return 0; out: snd_card_free(card); return err; }
static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n) { struct snd_card *card; struct snd_gus_card *gus; struct snd_es1688 *es1688; struct snd_opl3 *opl3; int error; error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); if (error < 0) return error; if (mpu_port[n] == SNDRV_AUTO_PORT) mpu_port[n] = 0; if (mpu_irq[n] > 15) mpu_irq[n] = -1; error = snd_gusextreme_es1688_create(card, dev, n, &es1688); if (error < 0) goto out; if (gf1_port[n] < 0) gf1_port[n] = es1688->port + 0x20; error = snd_gusextreme_gus_card_create(card, dev, n, &gus); if (error < 0) goto out; error = snd_gusextreme_detect(gus, es1688); if (error < 0) goto out; gus->joystick_dac = joystick_dac[n]; error = snd_gus_initialize(gus); if (error < 0) goto out; error = -ENODEV; if (!gus->ess_flag) { dev_err(dev, "GUS Extreme soundcard was not " "detected at 0x%lx\n", gus->gf1.port); goto out; } gus->codec_flag = 1; error = snd_es1688_pcm(es1688, 0, NULL); if (error < 0) goto out; error = snd_es1688_mixer(es1688); if (error < 0) goto out; snd_component_add(card, "ES1688"); if (pcm_channels[n] > 0) { error = snd_gf1_pcm_new(gus, 1, 1, NULL); if (error < 0) goto out; } error = snd_gf1_new_mixer(gus); if (error < 0) goto out; error = snd_gusextreme_mixer(es1688); if (error < 0) goto out; if (snd_opl3_create(card, es1688->port, es1688->port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) dev_warn(dev, "opl3 not detected at 0x%lx\n", es1688->port); else { error = snd_opl3_hwdep_new(opl3, 0, 2, NULL); if (error < 0) goto out; } if (es1688->mpu_port >= 0x300) { error = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, mpu_irq[n], IRQF_DISABLED, NULL); if (error < 0) goto out; } sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, " "irq %i&%i, dma %i&%i", es1688->port, gus->gf1.irq, es1688->irq, gus->gf1.dma1, es1688->dma8); snd_card_set_dev(card, dev); error = snd_card_register(card); if (error < 0) goto out; dev_set_drvdata(dev, card); return 0; out: snd_card_free(card); return error; }
static void fantasia_init(struct oxygen *chip) { ak4396_init(chip); snd_component_add(chip->card, "CS5340"); }
static int __init snd_gusextreme_probe(struct platform_device *pdev) { int dev = pdev->id; static int possible_ess_irqs[] = {5, 9, 10, 7, -1}; static int possible_ess_dmas[] = {1, 3, 0, -1}; static int possible_gf1_irqs[] = {5, 11, 12, 9, 7, 15, 3, -1}; static int possible_gf1_dmas[] = {5, 6, 7, 1, 3, -1}; int xgf1_irq, xgf1_dma, xess_irq, xmpu_irq, xess_dma; struct snd_card *card; struct snd_gus_card *gus; struct snd_es1688 *es1688; struct snd_opl3 *opl3; int err; card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); if (card == NULL) return -ENOMEM; xgf1_irq = gf1_irq[dev]; if (xgf1_irq == SNDRV_AUTO_IRQ) { if ((xgf1_irq = snd_legacy_find_free_irq(possible_gf1_irqs)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ for GF1\n"); err = -EBUSY; goto out; } } xess_irq = irq[dev]; if (xess_irq == SNDRV_AUTO_IRQ) { if ((xess_irq = snd_legacy_find_free_irq(possible_ess_irqs)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free IRQ for ES1688\n"); err = -EBUSY; goto out; } } if (mpu_port[dev] == SNDRV_AUTO_PORT) mpu_port[dev] = 0; xmpu_irq = mpu_irq[dev]; if (xmpu_irq > 15) xmpu_irq = -1; xgf1_dma = dma1[dev]; if (xgf1_dma == SNDRV_AUTO_DMA) { if ((xgf1_dma = snd_legacy_find_free_dma(possible_gf1_dmas)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA for GF1\n"); err = -EBUSY; goto out; } } xess_dma = dma8[dev]; if (xess_dma == SNDRV_AUTO_DMA) { if ((xess_dma = snd_legacy_find_free_dma(possible_ess_dmas)) < 0) { snd_printk(KERN_ERR PFX "unable to find a free DMA for ES1688\n"); err = -EBUSY; goto out; } } if (port[dev] != SNDRV_AUTO_PORT) { err = snd_es1688_create(card, port[dev], mpu_port[dev], xess_irq, xmpu_irq, xess_dma, ES1688_HW_1688, &es1688); } else { /* auto-probe legacy ports */ static unsigned long possible_ports[] = {0x220, 0x240, 0x260}; int i; for (i = 0; i < ARRAY_SIZE(possible_ports); i++) { err = snd_es1688_create(card, possible_ports[i], mpu_port[dev], xess_irq, xmpu_irq, xess_dma, ES1688_HW_1688, &es1688); if (err >= 0) { port[dev] = possible_ports[i]; break; } } } if (err < 0) goto out; if (gf1_port[dev] < 0) gf1_port[dev] = port[dev] + 0x20; if ((err = snd_gus_create(card, gf1_port[dev], xgf1_irq, xgf1_dma, -1, 0, channels[dev], pcm_channels[dev], 0, &gus)) < 0) goto out; if ((err = snd_gusextreme_detect(dev, card, gus, es1688)) < 0) goto out; snd_gusextreme_init(dev, gus); if ((err = snd_gus_initialize(gus)) < 0) goto out; if (!gus->ess_flag) { snd_printk(KERN_ERR PFX "GUS Extreme soundcard was not detected at 0x%lx\n", gus->gf1.port); err = -ENODEV; goto out; } if ((err = snd_es1688_pcm(es1688, 0, NULL)) < 0) goto out; if ((err = snd_es1688_mixer(es1688)) < 0) goto out; snd_component_add(card, "ES1688"); if (pcm_channels[dev] > 0) { if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) goto out; } if ((err = snd_gf1_new_mixer(gus)) < 0) goto out; if ((err = snd_gusextreme_mixer(es1688)) < 0) goto out; if (snd_opl3_create(card, es1688->port, es1688->port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) { printk(KERN_ERR PFX "gusextreme: opl3 not detected at 0x%lx\n", es1688->port); } else { if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0) goto out; } if (es1688->mpu_port >= 0x300 && (err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, xmpu_irq, IRQF_DISABLED, NULL)) < 0) goto out; sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, irq %i&%i, dma %i&%i", es1688->port, xgf1_irq, xess_irq, xgf1_dma, xess_dma); snd_card_set_dev(card, &pdev->dev); if ((err = snd_card_register(card)) < 0) goto out; platform_set_drvdata(pdev, card); return 0; out: snd_card_free(card); return err; }
static void ak5385_init(struct oxygen *chip) { oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_AK5385_DFS_MASK); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_AK5385_DFS_MASK); snd_component_add(chip->card, "AK5385"); }