Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 #ifndef __SOUND_AK4XXX_ADDA_H
0003 #define __SOUND_AK4XXX_ADDA_H
0004 
0005 /*
0006  *   ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
0007  *   AD and DA converters
0008  *
0009  *  Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
0010  */      
0011 
0012 #ifndef AK4XXX_MAX_CHIPS
0013 #define AK4XXX_MAX_CHIPS    4
0014 #endif
0015 
0016 struct snd_akm4xxx;
0017 
0018 struct snd_ak4xxx_ops {
0019     void (*lock)(struct snd_akm4xxx *ak, int chip);
0020     void (*unlock)(struct snd_akm4xxx *ak, int chip);
0021     void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg,
0022               unsigned char val);
0023     void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate);
0024 };
0025 
0026 #define AK4XXX_IMAGE_SIZE   (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */
0027 
0028 /* DAC label and channels */
0029 struct snd_akm4xxx_dac_channel {
0030     char *name;     /* mixer volume name */
0031     unsigned int num_channels;
0032     char *switch_name;      /* mixer switch*/
0033 };
0034 
0035 /* ADC labels and channels */
0036 struct snd_akm4xxx_adc_channel {
0037     char *name;     /* capture gain volume label */
0038     char *switch_name;  /* capture switch */
0039     unsigned int num_channels;
0040     char *selector_name;    /* capture source select label */
0041     const char **input_names; /* capture source names (NULL terminated) */
0042 };
0043 
0044 struct snd_akm4xxx {
0045     struct snd_card *card;
0046     unsigned int num_adcs;          /* AK4524 or AK4528 ADCs */
0047     unsigned int num_dacs;          /* AK4524 or AK4528 DACs */
0048     unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */
0049     unsigned char volumes[AK4XXX_IMAGE_SIZE]; /* saved volume values */
0050     unsigned long private_value[AK4XXX_MAX_CHIPS];  /* helper for driver */
0051     void *private_data[AK4XXX_MAX_CHIPS];       /* helper for driver */
0052     /* template should fill the following fields */
0053     unsigned int idx_offset;        /* control index offset */
0054     enum {
0055         SND_AK4524, SND_AK4528, SND_AK4529,
0056         SND_AK4355, SND_AK4358, SND_AK4381,
0057         SND_AK5365, SND_AK4620,
0058     } type;
0059 
0060     /* (array) information of combined codecs */
0061     const struct snd_akm4xxx_dac_channel *dac_info;
0062     const struct snd_akm4xxx_adc_channel *adc_info;
0063 
0064     struct snd_ak4xxx_ops ops;
0065     unsigned int num_chips;
0066     unsigned int total_regs;
0067     const char *name;
0068 };
0069 
0070 void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
0071                unsigned char val);
0072 void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state);
0073 void snd_akm4xxx_init(struct snd_akm4xxx *ak);
0074 int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak);
0075 
0076 #define snd_akm4xxx_get(ak,chip,reg) \
0077     (ak)->images[(chip) * 16 + (reg)]
0078 #define snd_akm4xxx_set(ak,chip,reg,val) \
0079     ((ak)->images[(chip) * 16 + (reg)] = (val))
0080 #define snd_akm4xxx_get_vol(ak,chip,reg) \
0081     (ak)->volumes[(chip) * 16 + (reg)]
0082 #define snd_akm4xxx_set_vol(ak,chip,reg,val) \
0083     ((ak)->volumes[(chip) * 16 + (reg)] = (val))
0084 
0085 #endif /* __SOUND_AK4XXX_ADDA_H */