This is what I believe is left to make the secondary CODEC work on the Santa Cruz, but I got no way to test it.
Peter: can you please test it and tell me about the results Here is the patch against CVS, basically just the same code from the Cirrus work adapted to ALSA. diff -Naur ../cvs_ref/alsa-kernel/include/cs46xx.h alsa-kernel/include/cs46xx.h --- ../cvs_ref/alsa-kernel/include/cs46xx.h Thu Aug 1 14:29:31 2002 +++ alsa-kernel/include/cs46xx.h Fri Aug 2 21:38:37 2002 @@ -195,6 +195,81 @@ #define BA1_FRSC 0x00030038 #define BA1_OMNI_MEM 0x000E0000 + + + +/* + * The following define the offsets of the AC97 shadow registers, which appear + * as a virtual extension to the base address register zero memory range. + */ +#define AC97_REG_OFFSET_MASK 0x0000007EL +#define AC97_CODEC_NUMBER_MASK 0x00003000L + +#define BA0_AC97_RESET 0x00001000L +#define BA0_AC97_MASTER_VOLUME 0x00001002L +#define BA0_AC97_HEADPHONE_VOLUME 0x00001004L +#define BA0_AC97_MASTER_VOLUME_MONO 0x00001006L +#define BA0_AC97_MASTER_TONE 0x00001008L +#define BA0_AC97_PC_BEEP_VOLUME 0x0000100AL +#define BA0_AC97_PHONE_VOLUME 0x0000100CL +#define BA0_AC97_MIC_VOLUME 0x0000100EL +#define BA0_AC97_LINE_IN_VOLUME 0x00001010L +#define BA0_AC97_CD_VOLUME 0x00001012L +#define BA0_AC97_VIDEO_VOLUME 0x00001014L +#define BA0_AC97_AUX_VOLUME 0x00001016L +#define BA0_AC97_PCM_OUT_VOLUME 0x00001018L +#define BA0_AC97_RECORD_SELECT 0x0000101AL +#define BA0_AC97_RECORD_GAIN 0x0000101CL +#define BA0_AC97_RECORD_GAIN_MIC 0x0000101EL +#define BA0_AC97_GENERAL_PURPOSE 0x00001020L +#define BA0_AC97_3D_CONTROL 0x00001022L +#define BA0_AC97_MODEM_RATE 0x00001024L +#define BA0_AC97_POWERDOWN 0x00001026L +#define BA0_AC97_EXT_AUDIO_ID 0x00001028L +#define BA0_AC97_EXT_AUDIO_POWER 0x0000102AL +#define BA0_AC97_PCM_FRONT_DAC_RATE 0x0000102CL +#define BA0_AC97_PCM_SURR_DAC_RATE 0x0000102EL +#define BA0_AC97_PCM_LFE_DAC_RATE 0x00001030L +#define BA0_AC97_PCM_LR_ADC_RATE 0x00001032L +#define BA0_AC97_MIC_ADC_RATE 0x00001034L +#define BA0_AC97_6CH_VOL_C_LFE 0x00001036L +#define BA0_AC97_6CH_VOL_SURROUND 0x00001038L +#define BA0_AC97_RESERVED_3A 0x0000103AL +#define BA0_AC97_EXT_MODEM_ID 0x0000103CL +#define BA0_AC97_EXT_MODEM_POWER 0x0000103EL +#define BA0_AC97_LINE1_CODEC_RATE 0x00001040L +#define BA0_AC97_LINE2_CODEC_RATE 0x00001042L +#define BA0_AC97_HANDSET_CODEC_RATE 0x00001044L +#define BA0_AC97_LINE1_CODEC_LEVEL 0x00001046L +#define BA0_AC97_LINE2_CODEC_LEVEL 0x00001048L +#define BA0_AC97_HANDSET_CODEC_LEVEL 0x0000104AL +#define BA0_AC97_GPIO_PIN_CONFIG 0x0000104CL +#define BA0_AC97_GPIO_PIN_TYPE 0x0000104EL +#define BA0_AC97_GPIO_PIN_STICKY 0x00001050L +#define BA0_AC97_GPIO_PIN_WAKEUP 0x00001052L +#define BA0_AC97_GPIO_PIN_STATUS 0x00001054L +#define BA0_AC97_MISC_MODEM_AFE_STAT 0x00001056L +#define BA0_AC97_RESERVED_58 0x00001058L +#define BA0_AC97_CRYSTAL_REV_N_FAB_ID 0x0000105AL +#define BA0_AC97_TEST_AND_MISC_CTRL 0x0000105CL +#define BA0_AC97_AC_MODE 0x0000105EL +#define BA0_AC97_MISC_CRYSTAL_CONTROL 0x00001060L +#define BA0_AC97_LINE1_HYPRID_CTRL 0x00001062L +#define BA0_AC97_VENDOR_RESERVED_64 0x00001064L +#define BA0_AC97_VENDOR_RESERVED_66 0x00001066L +#define BA0_AC97_SPDIF_CONTROL 0x00001068L +#define BA0_AC97_VENDOR_RESERVED_6A 0x0000106AL +#define BA0_AC97_VENDOR_RESERVED_6C 0x0000106CL +#define BA0_AC97_VENDOR_RESERVED_6E 0x0000106EL +#define BA0_AC97_VENDOR_RESERVED_70 0x00001070L +#define BA0_AC97_VENDOR_RESERVED_72 0x00001072L +#define BA0_AC97_VENDOR_RESERVED_74 0x00001074L +#define BA0_AC97_CAL_ADDRESS 0x00001076L +#define BA0_AC97_CAL_DATA 0x00001078L +#define BA0_AC97_VENDOR_RESERVED_7A 0x0000107AL +#define BA0_AC97_VENDOR_ID1 0x0000107CL +#define BA0_AC97_VENDOR_ID2 0x0000107EL + /* * The following defines are for the flags in the host interrupt status * register. diff -Naur ../cvs_ref/alsa-kernel/pci/cs46xx/Makefile alsa-kernel/pci/cs46xx/Makefile --- ../cvs_ref/alsa-kernel/pci/cs46xx/Makefile Thu Aug 1 11:26:32 2002 +++ alsa-kernel/pci/cs46xx/Makefile Fri Aug 2 00:10:52 2002 @@ -4,9 +4,9 @@ # snd-cs46xx-objs := cs46xx.o cs46xx_lib.o -ifeq ($(CONFIG_SND_CS46XX_NEW_DSP),y) +#ifeq ($(CONFIG_SND_CS46XX_NEW_DSP),y) snd-cs46xx-objs += dsp_spos.o dsp_spos_scb_lib.o -endif +#endif # Toplevel Module Dependency obj-$(CONFIG_SND_CS46XX) += snd-cs46xx.o diff -Naur ../cvs_ref/alsa-kernel/pci/cs46xx/cs46xx_lib.c alsa-kernel/pci/cs46xx/cs46xx_lib.c --- ../cvs_ref/alsa-kernel/pci/cs46xx/cs46xx_lib.c Thu Aug 1 14:30:52 2002 +++ alsa-kernel/pci/cs46xx/cs46xx_lib.c Fri Aug 2 21:29:08 2002 @@ -8,11 +8,11 @@ * -- * * TODO: - * We need a DSP code to support multichannel outputs and S/PDIF. - * Unfortunately, it seems that Cirrus Logic, Inc. is not willing - * to provide us sufficient information about the DSP processor, - * so we can't update the driver. + * SPDIF input. + * Secondary CODEC on some soundcards * + * NOTE: with CONFIG_SND_CS46XX_NEW_DSP unset uses old DSP image (which is default + * configuration), no SPDIF, no secondary codec, no multi channel PCM. But known to work. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -334,7 +334,6 @@ #ifdef CONFIG_SND_CS46XX_NEW_DSP -// #include "imgs/cwcemb80.h" #include "imgs/cwc4630.h" #include "imgs/cwcasync.h" #include "imgs/cwcsnoop.h" @@ -880,8 +879,6 @@ switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: - if (substream->runtime->periods != CS46XX_FRAGS) - snd_cs46xx_playback_transfer(substream, 0); #ifdef CONFIG_SND_CS46XX_NEW_DSP if (cpcm->pcm_channel->unlinked) cs46xx_dsp_pcm_link(chip,cpcm->pcm_channel); @@ -892,6 +889,8 @@ snd_cs46xx_poke(chip, BA1_PCTL, chip->play_ctl | tmp); } #endif + if (substream->runtime->periods != CS46XX_FRAGS) + snd_cs46xx_playback_transfer(substream, 0); break; case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: @@ -2447,6 +2446,106 @@ { } + +#ifdef CONFIG_SND_CS46XX_NEW_DSP +static int voyetra_setup_eapd_slot(cs46xx_t *chip) +{ + int i; + u32 idx; + u16 modem_power,pin_config,logic_type,valid_slots,status; + + snd_printd ("cs46xx: cs46xx_setup_eapd_slot()+\n"); + /* + * Clear PRA. The Bonzo chip will be used for GPIO not for modem + * stuff. + */ + if(chip->nr_ac97_codecs != 2) + { + snd_printk (KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() - no secondary codec configured\n"); + return -EINVAL; + } + + modem_power = snd_cs46xx_codec_read (chip, + BA0_AC97_EXT_MODEM_POWER, + CS46XX_SECONDARY_CODEC_INDEX); + modem_power &=0xFEFF; + + snd_cs46xx_codec_write(chip, + BA0_AC97_EXT_MODEM_POWER, modem_power, + CS46XX_SECONDARY_CODEC_INDEX); + + /* + * Set GPIO pin's 7 and 8 so that they are configured for output. + */ + pin_config = snd_cs46xx_codec_read (chip, + BA0_AC97_GPIO_PIN_CONFIG, + CS46XX_SECONDARY_CODEC_INDEX); + pin_config &=0x27F; + + snd_cs46xx_codec_write(chip, + BA0_AC97_GPIO_PIN_CONFIG, pin_config, + CS46XX_SECONDARY_CODEC_INDEX); + + /* + * Set GPIO pin's 7 and 8 so that they are compatible with CMOS logic. + */ + + logic_type = snd_cs46xx_codec_read(chip, BA0_AC97_GPIO_PIN_TYPE, + CS46XX_SECONDARY_CODEC_INDEX); + logic_type &=0x27F; + snd_cs46xx_codec_write (chip, BA0_AC97_GPIO_PIN_TYPE, logic_type, + CS46XX_SECONDARY_CODEC_INDEX); + + valid_slots = snd_cs46xx_peekBA0(chip, BA0_ACOSV); + valid_slots |= 0x200; + snd_cs46xx_pokeBA0(chip, BA0_ACOSV, valid_slots); + + /* + * Fill slots 12 with the correct value for the GPIO pins. + */ + for(idx = 0x90; idx <= 0x9F; idx++) { + + /* + * Initialize the fifo so that bits 7 and 8 are on. + * + * Remember that the GPIO pins in bonzo are shifted by 4 bits to + * the left. 0x1800 corresponds to bits 7 and 8. + */ + snd_cs46xx_pokeBA0(chip, BA0_SERBWP, 0x1800); + + /* + * Make sure the previous FIFO write operation has completed. + */ + for(i = 0; i < 5; i++){ + status = snd_cs46xx_peekBA0(chip, BA0_SERBST); + + if( !(status & SERBST_WBSY) ) { + break; + } + mdelay(100); + } + + if(status & SERBST_WBSY) { + snd_printk( KERN_ERR "cs46xx: cs46xx_setup_eapd_slot() " \ + "Failure to write the GPIO pins for slot 12.\n"); + return -EINVAL; + } + + /* + * Write the serial port FIFO index. + */ + snd_cs46xx_pokeBA0(chip, BA0_SERBAD, idx); + + /* + * Tell the serial port to load the new value into the FIFO location. + */ + snd_cs46xx_pokeBA0(chip, BA0_SERBCM, SERBCM_WRC); + } + + return 0; +} +#endif + /* * Crystal EAPD mode */ @@ -2477,6 +2576,12 @@ snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->eapd_switch->id); } + +#ifdef CONFIG_SND_CS46XX_NEW_DSP + if (chip->amplifier && !old) { + voyetra_setup_eapd_slot(chip); + } +#endif } diff -Naur ../cvs_ref/alsa-kernel/pci/cs46xx/dsp_spos.c alsa-kernel/pci/cs46xx/dsp_spos.c --- ../cvs_ref/alsa-kernel/pci/cs46xx/dsp_spos.c Thu Aug 1 14:30:53 2002 +++ alsa-kernel/pci/cs46xx/dsp_spos.c Fri Aug 2 00:09:15 2002 @@ -766,18 +766,6 @@ snd_iprintf(buffer,"\n"); } -#if 0 -static void snd_ac97_proc_regs_read_main(ac97_t *ac97, snd_info_buffer_t * buffer, int subidx) -{ - int reg, val; - - for (reg = 0; reg < 0x80; reg += 2) { - val = snd_ac97_read(ac97, reg); - snd_iprintf(buffer, "%i:%02x = %04x\n", subidx, reg, val); - } -} -#endif - int cs46xx_dsp_proc_init (snd_card_t * card, cs46xx_t *chip) { snd_info_entry_t *entry; ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel