1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun #ifndef __SOUND_AK4XXX_ADDA_H 3*4882a593Smuzhiyun #define __SOUND_AK4XXX_ADDA_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381 7*4882a593Smuzhiyun * AD and DA converters 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz> 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef AK4XXX_MAX_CHIPS 13*4882a593Smuzhiyun #define AK4XXX_MAX_CHIPS 4 14*4882a593Smuzhiyun #endif 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct snd_akm4xxx; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct snd_ak4xxx_ops { 19*4882a593Smuzhiyun void (*lock)(struct snd_akm4xxx *ak, int chip); 20*4882a593Smuzhiyun void (*unlock)(struct snd_akm4xxx *ak, int chip); 21*4882a593Smuzhiyun void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, 22*4882a593Smuzhiyun unsigned char val); 23*4882a593Smuzhiyun void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate); 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define AK4XXX_IMAGE_SIZE (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* DAC label and channels */ 29*4882a593Smuzhiyun struct snd_akm4xxx_dac_channel { 30*4882a593Smuzhiyun char *name; /* mixer volume name */ 31*4882a593Smuzhiyun unsigned int num_channels; 32*4882a593Smuzhiyun char *switch_name; /* mixer switch*/ 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* ADC labels and channels */ 36*4882a593Smuzhiyun struct snd_akm4xxx_adc_channel { 37*4882a593Smuzhiyun char *name; /* capture gain volume label */ 38*4882a593Smuzhiyun char *switch_name; /* capture switch */ 39*4882a593Smuzhiyun unsigned int num_channels; 40*4882a593Smuzhiyun char *selector_name; /* capture source select label */ 41*4882a593Smuzhiyun const char **input_names; /* capture source names (NULL terminated) */ 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct snd_akm4xxx { 45*4882a593Smuzhiyun struct snd_card *card; 46*4882a593Smuzhiyun unsigned int num_adcs; /* AK4524 or AK4528 ADCs */ 47*4882a593Smuzhiyun unsigned int num_dacs; /* AK4524 or AK4528 DACs */ 48*4882a593Smuzhiyun unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */ 49*4882a593Smuzhiyun unsigned char volumes[AK4XXX_IMAGE_SIZE]; /* saved volume values */ 50*4882a593Smuzhiyun unsigned long private_value[AK4XXX_MAX_CHIPS]; /* helper for driver */ 51*4882a593Smuzhiyun void *private_data[AK4XXX_MAX_CHIPS]; /* helper for driver */ 52*4882a593Smuzhiyun /* template should fill the following fields */ 53*4882a593Smuzhiyun unsigned int idx_offset; /* control index offset */ 54*4882a593Smuzhiyun enum { 55*4882a593Smuzhiyun SND_AK4524, SND_AK4528, SND_AK4529, 56*4882a593Smuzhiyun SND_AK4355, SND_AK4358, SND_AK4381, 57*4882a593Smuzhiyun SND_AK5365, SND_AK4620, 58*4882a593Smuzhiyun } type; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* (array) information of combined codecs */ 61*4882a593Smuzhiyun const struct snd_akm4xxx_dac_channel *dac_info; 62*4882a593Smuzhiyun const struct snd_akm4xxx_adc_channel *adc_info; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct snd_ak4xxx_ops ops; 65*4882a593Smuzhiyun unsigned int num_chips; 66*4882a593Smuzhiyun unsigned int total_regs; 67*4882a593Smuzhiyun const char *name; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, 71*4882a593Smuzhiyun unsigned char val); 72*4882a593Smuzhiyun void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state); 73*4882a593Smuzhiyun void snd_akm4xxx_init(struct snd_akm4xxx *ak); 74*4882a593Smuzhiyun int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak); 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define snd_akm4xxx_get(ak,chip,reg) \ 77*4882a593Smuzhiyun (ak)->images[(chip) * 16 + (reg)] 78*4882a593Smuzhiyun #define snd_akm4xxx_set(ak,chip,reg,val) \ 79*4882a593Smuzhiyun ((ak)->images[(chip) * 16 + (reg)] = (val)) 80*4882a593Smuzhiyun #define snd_akm4xxx_get_vol(ak,chip,reg) \ 81*4882a593Smuzhiyun (ak)->volumes[(chip) * 16 + (reg)] 82*4882a593Smuzhiyun #define snd_akm4xxx_set_vol(ak,chip,reg,val) \ 83*4882a593Smuzhiyun ((ak)->volumes[(chip) * 16 + (reg)] = (val)) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #endif /* __SOUND_AK4XXX_ADDA_H */ 86