1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds #ifndef __SOUND_AK4XXX_ADDA_H 31da177e4SLinus Torvalds #define __SOUND_AK4XXX_ADDA_H 41da177e4SLinus Torvalds 51da177e4SLinus Torvalds /* 61da177e4SLinus Torvalds * ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381 71da177e4SLinus Torvalds * AD and DA converters 81da177e4SLinus Torvalds * 9c1017a4cSJaroslav Kysela * Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz> 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #ifndef AK4XXX_MAX_CHIPS 131da177e4SLinus Torvalds #define AK4XXX_MAX_CHIPS 4 141da177e4SLinus Torvalds #endif 151da177e4SLinus Torvalds 16dc4cafbaSTakashi Iwai struct snd_akm4xxx; 171da177e4SLinus Torvalds 181da177e4SLinus Torvalds struct snd_ak4xxx_ops { 19dc4cafbaSTakashi Iwai void (*lock)(struct snd_akm4xxx *ak, int chip); 20dc4cafbaSTakashi Iwai void (*unlock)(struct snd_akm4xxx *ak, int chip); 21cb9d24e4STakashi Iwai void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg, 22cb9d24e4STakashi Iwai unsigned char val); 23dc4cafbaSTakashi Iwai void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate); 241da177e4SLinus Torvalds }; 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds #define AK4XXX_IMAGE_SIZE (AK4XXX_MAX_CHIPS * 16) /* 64 bytes */ 271da177e4SLinus Torvalds 28723b2b0dSTakashi Iwai /* DAC label and channels */ 29723b2b0dSTakashi Iwai struct snd_akm4xxx_dac_channel { 30723b2b0dSTakashi Iwai char *name; /* mixer volume name */ 31723b2b0dSTakashi Iwai unsigned int num_channels; 32ea7cfcdfSPavel Hofman char *switch_name; /* mixer switch*/ 33723b2b0dSTakashi Iwai }; 34723b2b0dSTakashi Iwai 35723b2b0dSTakashi Iwai /* ADC labels and channels */ 36723b2b0dSTakashi Iwai struct snd_akm4xxx_adc_channel { 37723b2b0dSTakashi Iwai char *name; /* capture gain volume label */ 38723b2b0dSTakashi Iwai char *switch_name; /* capture switch */ 39723b2b0dSTakashi Iwai unsigned int num_channels; 40a58e7cb1SJochen Voss char *selector_name; /* capture source select label */ 41a58e7cb1SJochen Voss const char **input_names; /* capture source names (NULL terminated) */ 42723b2b0dSTakashi Iwai }; 43723b2b0dSTakashi Iwai 441da177e4SLinus Torvalds struct snd_akm4xxx { 45dc4cafbaSTakashi Iwai struct snd_card *card; 461da177e4SLinus Torvalds unsigned int num_adcs; /* AK4524 or AK4528 ADCs */ 471da177e4SLinus Torvalds unsigned int num_dacs; /* AK4524 or AK4528 DACs */ 481da177e4SLinus Torvalds unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */ 49723b2b0dSTakashi Iwai unsigned char volumes[AK4XXX_IMAGE_SIZE]; /* saved volume values */ 501da177e4SLinus Torvalds unsigned long private_value[AK4XXX_MAX_CHIPS]; /* helper for driver */ 511da177e4SLinus Torvalds void *private_data[AK4XXX_MAX_CHIPS]; /* helper for driver */ 521da177e4SLinus Torvalds /* template should fill the following fields */ 531da177e4SLinus Torvalds unsigned int idx_offset; /* control index offset */ 541da177e4SLinus Torvalds enum { 551da177e4SLinus Torvalds SND_AK4524, SND_AK4528, SND_AK4529, 56683fe153SJochen Voss SND_AK4355, SND_AK4358, SND_AK4381, 578f34692fSPavel Hofman SND_AK5365, SND_AK4620, 581da177e4SLinus Torvalds } type; 59723b2b0dSTakashi Iwai 60723b2b0dSTakashi Iwai /* (array) information of combined codecs */ 61517400cbSTakashi Iwai const struct snd_akm4xxx_dac_channel *dac_info; 62517400cbSTakashi Iwai const struct snd_akm4xxx_adc_channel *adc_info; 63723b2b0dSTakashi Iwai 641da177e4SLinus Torvalds struct snd_ak4xxx_ops ops; 658f34692fSPavel Hofman unsigned int num_chips; 668f34692fSPavel Hofman unsigned int total_regs; 678f34692fSPavel Hofman const char *name; 681da177e4SLinus Torvalds }; 691da177e4SLinus Torvalds 70cb9d24e4STakashi Iwai void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg, 71cb9d24e4STakashi Iwai unsigned char val); 72dc4cafbaSTakashi Iwai void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state); 73dc4cafbaSTakashi Iwai void snd_akm4xxx_init(struct snd_akm4xxx *ak); 74dc4cafbaSTakashi Iwai int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak); 751da177e4SLinus Torvalds 76cb9d24e4STakashi Iwai #define snd_akm4xxx_get(ak,chip,reg) \ 77cb9d24e4STakashi Iwai (ak)->images[(chip) * 16 + (reg)] 78cb9d24e4STakashi Iwai #define snd_akm4xxx_set(ak,chip,reg,val) \ 79cb9d24e4STakashi Iwai ((ak)->images[(chip) * 16 + (reg)] = (val)) 80723b2b0dSTakashi Iwai #define snd_akm4xxx_get_vol(ak,chip,reg) \ 81723b2b0dSTakashi Iwai (ak)->volumes[(chip) * 16 + (reg)] 82723b2b0dSTakashi Iwai #define snd_akm4xxx_set_vol(ak,chip,reg,val) \ 83723b2b0dSTakashi Iwai ((ak)->volumes[(chip) * 16 + (reg)] = (val)) 84723b2b0dSTakashi Iwai 851da177e4SLinus Torvalds #endif /* __SOUND_AK4XXX_ADDA_H */ 86