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
*
2007-10-15 11:50:19 +04:00
* Copyright ( c ) 2000 Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
*
* 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 ;
2007-05-19 19:21:04 +04:00
char * switch_name ; /* mixer switch*/
2006-08-30 18:49:54 +04:00
} ;
/* ADC labels and channels */
struct snd_akm4xxx_adc_channel {
char * name ; /* capture gain volume label */
char * switch_name ; /* capture switch */
unsigned int num_channels ;
2006-10-04 20:04:10 +04:00
char * selector_name ; /* capture source select label */
const char * * input_names ; /* capture source names (NULL terminated) */
2006-08-30 18:49:54 +04:00
} ;
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 ,
2007-12-03 14:44:28 +03:00
SND_AK5365 , NON_AKM
2005-04-17 02:20:36 +04:00
} type ;
2006-08-30 18:49:54 +04:00
/* (array) information of combined codecs */
2007-01-29 17:27:56 +03:00
const struct snd_akm4xxx_dac_channel * dac_info ;
const struct snd_akm4xxx_adc_channel * adc_info ;
2006-08-30 18:49:54 +04:00
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 */