2005-04-17 02:20:36 +04:00
# ifndef __SOUND_AK4XXX_ADDA_H
# define __SOUND_AK4XXX_ADDA_H
/*
* ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
* AD and DA converters
*
* Copyright ( c ) 2000 Jaroslav Kysela < perex @ suse . cz >
*
* 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
# ifndef AK4XXX_MAX_CHIPS
# define AK4XXX_MAX_CHIPS 4
# endif
2005-11-17 16:19:28 +03:00
struct snd_akm4xxx ;
2005-04-17 02:20:36 +04:00
struct snd_ak4xxx_ops {
2005-11-17 16:19:28 +03:00
void ( * lock ) ( struct snd_akm4xxx * ak , int chip ) ;
void ( * unlock ) ( struct snd_akm4xxx * ak , int chip ) ;
2006-06-27 19:49:12 +04:00
void ( * write ) ( struct snd_akm4xxx * ak , int chip , unsigned char reg ,
unsigned char val ) ;
2005-11-17 16:19:28 +03:00
void ( * set_rate_val ) ( struct snd_akm4xxx * ak , unsigned int rate ) ;
2005-04-17 02:20:36 +04:00
} ;
# define AK4XXX_IMAGE_SIZE (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */
2006-08-30 18:49:54 +04:00
/* DAC label and channels */
struct snd_akm4xxx_dac_channel {
char * name ; /* mixer volume name */
unsigned int num_channels ;
} ;
/* ADC labels and channels */
struct snd_akm4xxx_adc_channel {
char * name ; /* capture gain volume label */
char * switch_name ; /* capture switch */
unsigned int num_channels ;
} ;
2005-04-17 02:20:36 +04:00
struct snd_akm4xxx {
2005-11-17 16:19:28 +03:00
struct snd_card * card ;
2006-06-27 19:49:12 +04:00
unsigned int num_adcs ; /* AK4524 or AK4528 ADCs */
unsigned int num_dacs ; /* AK4524 or AK4528 DACs */
unsigned char images [ AK4XXX_IMAGE_SIZE ] ; /* saved register image */
2006-08-30 18:49:54 +04:00
unsigned char volumes [ AK4XXX_IMAGE_SIZE ] ; /* saved volume values */
2005-04-17 02:20:36 +04:00
unsigned long private_value [ AK4XXX_MAX_CHIPS ] ; /* helper for driver */
void * private_data [ AK4XXX_MAX_CHIPS ] ; /* helper for driver */
/* template should fill the following fields */
2006-06-27 19:49:12 +04:00
unsigned int idx_offset ; /* control index offset */
2005-04-17 02:20:36 +04:00
enum {
SND_AK4524 , SND_AK4528 , SND_AK4529 ,
2006-08-08 23:12:44 +04:00
SND_AK4355 , SND_AK4358 , SND_AK4381 ,
SND_AK5365
2005-04-17 02:20:36 +04:00
} type ;
2006-08-30 18:49:54 +04:00
/* (array) information of combined codecs */
struct snd_akm4xxx_dac_channel * dac_info ;
struct snd_akm4xxx_adc_channel * adc_info ;
2005-04-17 02:20:36 +04:00
struct snd_ak4xxx_ops ops ;
} ;
2006-06-27 19:49:12 +04:00
void snd_akm4xxx_write ( struct snd_akm4xxx * ak , int chip , unsigned char reg ,
unsigned char val ) ;
2005-11-17 16:19:28 +03:00
void snd_akm4xxx_reset ( struct snd_akm4xxx * ak , int state ) ;
void snd_akm4xxx_init ( struct snd_akm4xxx * ak ) ;
int snd_akm4xxx_build_controls ( struct snd_akm4xxx * ak ) ;
2005-04-17 02:20:36 +04:00
2006-06-27 19:49:12 +04:00
# define snd_akm4xxx_get(ak,chip,reg) \
( ak ) - > images [ ( chip ) * 16 + ( reg ) ]
# define snd_akm4xxx_set(ak,chip,reg,val) \
( ( ak ) - > images [ ( chip ) * 16 + ( reg ) ] = ( val ) )
2006-08-30 18:49:54 +04:00
# define snd_akm4xxx_get_vol(ak,chip,reg) \
( ak ) - > volumes [ ( chip ) * 16 + ( reg ) ]
# define snd_akm4xxx_set_vol(ak,chip,reg,val) \
( ( ak ) - > volumes [ ( chip ) * 16 + ( reg ) ] = ( val ) )
2005-04-17 02:20:36 +04:00
# endif /* __SOUND_AK4XXX_ADDA_H */