xref: /openbmc/linux/include/sound/ak4xxx-adda.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
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