2005-04-16 15:20:36 -07:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* recmgr . c - - Recording manager for emu10k1 driver
* Copyright 1999 , 2000 Creative Labs , Inc .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Date Author Summary of changes
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* October 20 , 1999 Bertrand Lee base code release
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* 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 the Free Software Foundation ; either version 2 of
* the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public
* License along with this program ; if not , write to the Free
* Software Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 ,
* USA .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
2005-11-30 23:47:05 -05:00
# include <linux/delay.h>
2005-04-16 15:20:36 -07:00
# include "8010.h"
# include "recmgr.h"
void emu10k1_reset_record ( struct emu10k1_card * card , struct wavein_buffer * buffer )
{
DPF ( 2 , " emu10k1_reset_record() \n " ) ;
sblive_writeptr ( card , buffer - > sizereg , 0 , ADCBS_BUFSIZE_NONE ) ;
sblive_writeptr ( card , buffer - > sizereg , 0 , buffer - > sizeregval ) ;
while ( sblive_readptr ( card , buffer - > idxreg , 0 ) )
udelay ( 5 ) ;
}
void emu10k1_start_record ( struct emu10k1_card * card , struct wavein_buffer * buffer )
{
DPF ( 2 , " emu10k1_start_record() \n " ) ;
if ( buffer - > adcctl )
sblive_writeptr ( card , ADCCR , 0 , buffer - > adcctl ) ;
}
void emu10k1_stop_record ( struct emu10k1_card * card , struct wavein_buffer * buffer )
{
DPF ( 2 , " emu10k1_stop_record() \n " ) ;
/* Disable record transfer */
if ( buffer - > adcctl )
sblive_writeptr ( card , ADCCR , 0 , 0 ) ;
}
void emu10k1_set_record_src ( struct emu10k1_card * card , struct wiinst * wiinst )
{
struct wavein_buffer * buffer = & wiinst - > buffer ;
DPF ( 2 , " emu10k1_set_record_src() \n " ) ;
switch ( wiinst - > recsrc ) {
case WAVERECORD_AC97 :
DPF ( 2 , " recording source: AC97 \n " ) ;
buffer - > sizereg = ADCBS ;
buffer - > addrreg = ADCBA ;
buffer - > idxreg = card - > is_audigy ? A_ADCIDX_IDX : ADCIDX_IDX ;
switch ( wiinst - > format . samplingrate ) {
case 0xBB80 :
buffer - > adcctl = ADCCR_SAMPLERATE_48 ;
break ;
case 0xAC44 :
buffer - > adcctl = ADCCR_SAMPLERATE_44 ;
break ;
case 0x7D00 :
buffer - > adcctl = ADCCR_SAMPLERATE_32 ;
break ;
case 0x5DC0 :
buffer - > adcctl = ADCCR_SAMPLERATE_24 ;
break ;
case 0x5622 :
buffer - > adcctl = ADCCR_SAMPLERATE_22 ;
break ;
case 0x3E80 :
buffer - > adcctl = ADCCR_SAMPLERATE_16 ;
break ;
// FIXME: audigy supports 12kHz recording
/*
case ? ? ? ? :
buffer - > adcctl = A_ADCCR_SAMPLERATE_12 ;
break ;
*/
case 0x2B11 :
buffer - > adcctl = card - > is_audigy ? A_ADCCR_SAMPLERATE_11 : ADCCR_SAMPLERATE_11 ;
break ;
case 0x1F40 :
buffer - > adcctl = card - > is_audigy ? A_ADCCR_SAMPLERATE_8 : ADCCR_SAMPLERATE_8 ;
break ;
default :
BUG ( ) ;
break ;
}
buffer - > adcctl | = card - > is_audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE ;
if ( wiinst - > format . channels = = 2 )
buffer - > adcctl | = card - > is_audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE ;
break ;
case WAVERECORD_MIC :
DPF ( 2 , " recording source: MIC \n " ) ;
buffer - > sizereg = MICBS ;
buffer - > addrreg = MICBA ;
buffer - > idxreg = MICIDX_IDX ;
buffer - > adcctl = 0 ;
break ;
case WAVERECORD_FX :
DPF ( 2 , " recording source: FX \n " ) ;
buffer - > sizereg = FXBS ;
buffer - > addrreg = FXBA ;
buffer - > idxreg = FXIDX_IDX ;
buffer - > adcctl = 0 ;
sblive_writeptr ( card , FXWC , 0 , wiinst - > fxwc ) ;
break ;
default :
BUG ( ) ;
break ;
}
DPD ( 2 , " bus addx: %#lx \n " , ( unsigned long ) buffer - > dma_handle ) ;
sblive_writeptr ( card , buffer - > addrreg , 0 , ( u32 ) buffer - > dma_handle ) ;
}