Update of /cvsroot/alsa/alsa-kernel/pci/cs46xx In directory sc8-pr-cvs1:/tmp/cvs-serv10706
Modified Files: cs46xx_lib.c cs46xx_lib.h dsp_spos.c dsp_spos_scb_lib.c Log Message: updates by Benny Sjostrand: - Added the cwcdma DSP firmware module - Fixed a minor bug in cs46xx_iec958_pre_open(...) - in cs46xx_dsp_enable_spdif_hw(...), disable SPDIF hw before enabling, this seems to help solving the synchronization issue - Some changes in cs46xx_dsp_create_pcm_channel(...) and cs46xx_dsp_create_src_task_scb(...) to adapt to the new DSP firmware. Index: cs46xx_lib.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/cs46xx/cs46xx_lib.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- cs46xx_lib.c 28 Feb 2003 16:30:14 -0000 1.51 +++ cs46xx_lib.c 3 Mar 2003 11:33:00 -0000 1.52 @@ -321,6 +321,7 @@ #include "imgs/cwcasync.h" #include "imgs/cwcsnoop.h" #include "imgs/cwcbinhack.h" +#include "imgs/cwcdma.h" int snd_cs46xx_clear_BA1(cs46xx_t *chip, unsigned long offset, @@ -3165,6 +3166,11 @@ if (cs46xx_dsp_load_module(chip, &cwcbinhack_module) < 0) { snd_printk(KERN_ERR "image download error [cwcbinhack]\n"); + return -EIO; + } + + if (cs46xx_dsp_load_module(chip, &cwcdma_module) < 0) { + snd_printk(KERN_ERR "image download error [cwcdma]\n"); return -EIO; } Index: cs46xx_lib.h =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/cs46xx/cs46xx_lib.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- cs46xx_lib.h 9 Dec 2002 11:26:07 -0000 1.10 +++ cs46xx_lib.h 3 Mar 2003 11:33:01 -0000 1.11 @@ -156,7 +156,8 @@ u16 src_buffer_addr, u16 src_delay_buffer_addr,u32 dest, dsp_scb_descriptor_t * parent_scb, - int scb_child_type); + int scb_child_type, + int pass_through); dsp_scb_descriptor_t * cs46xx_dsp_create_mix_only_scb(cs46xx_t * chip,char * scb_name, u16 mix_buffer_addr,u32 dest, dsp_scb_descriptor_t * parent_scb, Index: dsp_spos.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/cs46xx/dsp_spos.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- dsp_spos.c 6 Feb 2003 16:17:34 -0000 1.18 +++ dsp_spos.c 3 Mar 2003 11:33:01 -0000 1.19 @@ -1371,11 +1371,11 @@ /* SPDIF input sampel rate converter */ src_task_scb = cs46xx_dsp_create_src_task_scb(chip,"SrcTaskSCB_SPDIFI", - 48000, + ins->spdif_in_sample_rate, SRC_OUTPUT_BUF1, SRC_DELAY_BUF1,SRCTASK_SCB_ADDR, master_mix_scb, - SCB_ON_PARENT_SUBLIST_SCB); + SCB_ON_PARENT_SUBLIST_SCB,0); if (!src_task_scb) goto _fail_end; @@ -1564,9 +1564,32 @@ return 0; } + +static void cs46xx_dsp_disable_spdif_hw (cs46xx_t *chip) +{ + dsp_spos_instance_t * ins = chip->dsp_spos_instance; + + /* set SPDIF output FIFO slot */ + snd_cs46xx_pokeBA0(chip, BA0_ASER_FADDR, 0); + + /* SPDIF output MASTER ENABLE */ + cs46xx_poke_via_dsp (chip,SP_SPDOUT_CONTROL, 0); + + /* right and left validate bit */ + /*cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, ins->spdif_csuv_default);*/ + cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, 0x0); + + /* monitor state */ + ins->spdif_status_out &= ~DSP_SPDIF_STATUS_HW_ENABLED; +} + int cs46xx_dsp_enable_spdif_hw (cs46xx_t *chip) { dsp_spos_instance_t * ins = chip->dsp_spos_instance; + + /* if hw-ctrl already enabled, turn off to reset logic ... */ + cs46xx_dsp_disable_spdif_hw (chip); + udelay(50); /* set SPDIF output FIFO slot */ snd_cs46xx_pokeBA0(chip, BA0_ASER_FADDR, ( 0x8000 | ((SP_SPDOUT_FIFO >> 4) << 4) )); Index: dsp_spos_scb_lib.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/cs46xx/dsp_spos_scb_lib.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- dsp_spos_scb_lib.c 26 Feb 2003 08:45:58 -0000 1.19 +++ dsp_spos_scb_lib.c 3 Mar 2003 11:33:01 -0000 1.20 @@ -584,7 +584,8 @@ u16 src_buffer_addr, u16 src_delay_buffer_addr,u32 dest, dsp_scb_descriptor_t * parent_scb, - int scb_child_type) + int scb_child_type, + int pass_through) { dsp_spos_instance_t * ins = chip->dsp_spos_instance; @@ -659,10 +660,22 @@ /* clear buffers */ _dsp_clear_sample_buffer (chip,src_buffer_addr,8); _dsp_clear_sample_buffer (chip,src_delay_buffer_addr,32); - - scb = _dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb, - dest,ins->s16_up,parent_scb, - scb_child_type); + + if (pass_through) { + /* wont work with any other rate than + the native DSP rate */ + snd_assert (rate = 48000); + + scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb, + dest,"DMAREADER",parent_scb, + scb_child_type); + } else { + scb = _dsp_create_generic_scb(chip,scb_name,(u32 *)&src_task_scb, + dest,ins->s16_up,parent_scb, + scb_child_type); + } + + } return scb; @@ -835,10 +848,10 @@ RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_16, 0, - 0,input_scb->address, + /* 0xD */ 0,input_scb->address, { - 0x8000,0x8000, - 0x8000,0x8000 + /* 0xE */ 0x8000,0x8000, + /* 0xF */ 0x8000,0x8000 } }; @@ -1134,9 +1147,9 @@ dsp_scb_descriptor_t * src_scb = NULL,* pcm_scb, * mixer_scb = NULL; dsp_scb_descriptor_t * src_parent_scb = NULL; - /*dsp_scb_descriptor_t * pcm_parent_scb;*/ + /* dsp_scb_descriptor_t * pcm_parent_scb; */ char scb_name[DSP_MAX_SCB_NAME]; - int i,pcm_index = -1, insert_point, src_index = -1; + int i,pcm_index = -1, insert_point, src_index = -1,pass_through = 0; unsigned long flags; switch (pcm_channel_id) { @@ -1163,7 +1176,8 @@ alter the raw data stream ...) */ if (sample_rate == 48000) { snd_printdd ("IEC958 pass through\n"); - src_parent_scb = ins->asynch_tx_scb; + /* Hack to bypass creating a new SRC */ + pass_through = 1; } break; default: @@ -1216,18 +1230,16 @@ snd_assert (src_index != -1,return NULL); /* we need to create a new SRC SCB */ - if (src_parent_scb == NULL) { - if (mixer_scb->sub_list_ptr == ins->the_null_scb) { - src_parent_scb = mixer_scb; - insert_point = SCB_ON_PARENT_SUBLIST_SCB; - } else { - src_parent_scb = find_next_free_scb(chip,mixer_scb->sub_list_ptr); - insert_point = SCB_ON_PARENT_NEXT_SCB; - } - } else insert_point = SCB_ON_PARENT_NEXT_SCB; + if (mixer_scb->sub_list_ptr == ins->the_null_scb) { + src_parent_scb = mixer_scb; + insert_point = SCB_ON_PARENT_SUBLIST_SCB; + } else { + src_parent_scb = find_next_free_scb(chip,mixer_scb->sub_list_ptr); + insert_point = SCB_ON_PARENT_NEXT_SCB; + } snprintf (scb_name,DSP_MAX_SCB_NAME,"SrcTask_SCB%d",src_index); - + snd_printdd( "dsp_spos: creating SRC \"%s\"\n",scb_name); src_scb = cs46xx_dsp_create_src_task_scb(chip,scb_name, sample_rate, @@ -1236,7 +1248,8 @@ /* 0x400 - 0x600 source SCBs */ 0x400 + (src_index * 0x10) , src_parent_scb, - insert_point); + insert_point, + pass_through); if (!src_scb) { snd_printk (KERN_ERR "dsp_spos: failed to create SRCtaskSCB\n"); @@ -1268,19 +1281,6 @@ snd_printk (KERN_ERR "dsp_spos: failed to create PCMreaderSCB\n"); return NULL; } - - if (pcm_channel_id == DSP_IEC958_CHANNEL && sample_rate == 48000) { - snd_assert (ins->spdif_pcm_input_scb == NULL); - - /* a hack to make the skip the SRC and pass the stream - directly to the SPDIF task */ - ins->spdif_pcm_input_scb = - cs46xx_dsp_create_pcm_serial_input_scb(chip,"PCMSerialInput_PCM", - PCMSERIALINII_SCB_ADDR, - pcm_scb, - ins->asynch_tx_scb, - SCB_ON_PARENT_SUBLIST_SCB); - } spin_lock_irqsave(&chip->reg_lock, flags); ins->pcm_channels[pcm_index].sample_rate = sample_rate; @@ -1625,7 +1625,7 @@ } /* if not enabled already */ - if (ins->spdif_status_out & DSP_SPDIF_STATUS_HW_ENABLED) { + if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_HW_ENABLED) ) { cs46xx_dsp_enable_spdif_hw (chip); } @@ -1669,7 +1669,6 @@ _dsp_clear_sample_buffer(chip,SPDIFO_IP_OUTPUT_BUFFER1,256); /* restore state */ - if ( ins->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED ) { cs46xx_dsp_enable_spdif_out (chip); } ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog