162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef __SOUND_AK4XXX_ADDA_H
362306a36Sopenharmony_ci#define __SOUND_AK4XXX_ADDA_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci *   ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4381
762306a36Sopenharmony_ci *   AD and DA converters
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *	Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef AK4XXX_MAX_CHIPS
1362306a36Sopenharmony_ci#define AK4XXX_MAX_CHIPS	4
1462306a36Sopenharmony_ci#endif
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct snd_akm4xxx;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct snd_ak4xxx_ops {
1962306a36Sopenharmony_ci	void (*lock)(struct snd_akm4xxx *ak, int chip);
2062306a36Sopenharmony_ci	void (*unlock)(struct snd_akm4xxx *ak, int chip);
2162306a36Sopenharmony_ci	void (*write)(struct snd_akm4xxx *ak, int chip, unsigned char reg,
2262306a36Sopenharmony_ci		      unsigned char val);
2362306a36Sopenharmony_ci	void (*set_rate_val)(struct snd_akm4xxx *ak, unsigned int rate);
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define AK4XXX_IMAGE_SIZE	(AK4XXX_MAX_CHIPS * 16)	/* 64 bytes */
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* DAC label and channels */
2962306a36Sopenharmony_cistruct snd_akm4xxx_dac_channel {
3062306a36Sopenharmony_ci	char *name;		/* mixer volume name */
3162306a36Sopenharmony_ci	unsigned int num_channels;
3262306a36Sopenharmony_ci	char *switch_name;		/* mixer switch*/
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* ADC labels and channels */
3662306a36Sopenharmony_cistruct snd_akm4xxx_adc_channel {
3762306a36Sopenharmony_ci	char *name;		/* capture gain volume label */
3862306a36Sopenharmony_ci	char *switch_name;	/* capture switch */
3962306a36Sopenharmony_ci	unsigned int num_channels;
4062306a36Sopenharmony_ci	char *selector_name;	/* capture source select label */
4162306a36Sopenharmony_ci	const char **input_names; /* capture source names (NULL terminated) */
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct snd_akm4xxx {
4562306a36Sopenharmony_ci	struct snd_card *card;
4662306a36Sopenharmony_ci	unsigned int num_adcs;			/* AK4524 or AK4528 ADCs */
4762306a36Sopenharmony_ci	unsigned int num_dacs;			/* AK4524 or AK4528 DACs */
4862306a36Sopenharmony_ci	unsigned char images[AK4XXX_IMAGE_SIZE]; /* saved register image */
4962306a36Sopenharmony_ci	unsigned char volumes[AK4XXX_IMAGE_SIZE]; /* saved volume values */
5062306a36Sopenharmony_ci	unsigned long private_value[AK4XXX_MAX_CHIPS];	/* helper for driver */
5162306a36Sopenharmony_ci	void *private_data[AK4XXX_MAX_CHIPS];		/* helper for driver */
5262306a36Sopenharmony_ci	/* template should fill the following fields */
5362306a36Sopenharmony_ci	unsigned int idx_offset;		/* control index offset */
5462306a36Sopenharmony_ci	enum {
5562306a36Sopenharmony_ci		SND_AK4524, SND_AK4528, SND_AK4529,
5662306a36Sopenharmony_ci		SND_AK4355, SND_AK4358, SND_AK4381,
5762306a36Sopenharmony_ci		SND_AK5365, SND_AK4620,
5862306a36Sopenharmony_ci	} type;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	/* (array) information of combined codecs */
6162306a36Sopenharmony_ci	const struct snd_akm4xxx_dac_channel *dac_info;
6262306a36Sopenharmony_ci	const struct snd_akm4xxx_adc_channel *adc_info;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	struct snd_ak4xxx_ops ops;
6562306a36Sopenharmony_ci	unsigned int num_chips;
6662306a36Sopenharmony_ci	unsigned int total_regs;
6762306a36Sopenharmony_ci	const char *name;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_civoid snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
7162306a36Sopenharmony_ci		       unsigned char val);
7262306a36Sopenharmony_civoid snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state);
7362306a36Sopenharmony_civoid snd_akm4xxx_init(struct snd_akm4xxx *ak);
7462306a36Sopenharmony_ciint snd_akm4xxx_build_controls(struct snd_akm4xxx *ak);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#define snd_akm4xxx_get(ak,chip,reg) \
7762306a36Sopenharmony_ci	(ak)->images[(chip) * 16 + (reg)]
7862306a36Sopenharmony_ci#define snd_akm4xxx_set(ak,chip,reg,val) \
7962306a36Sopenharmony_ci	((ak)->images[(chip) * 16 + (reg)] = (val))
8062306a36Sopenharmony_ci#define snd_akm4xxx_get_vol(ak,chip,reg) \
8162306a36Sopenharmony_ci	(ak)->volumes[(chip) * 16 + (reg)]
8262306a36Sopenharmony_ci#define snd_akm4xxx_set_vol(ak,chip,reg,val) \
8362306a36Sopenharmony_ci	((ak)->volumes[(chip) * 16 + (reg)] = (val))
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#endif /* __SOUND_AK4XXX_ADDA_H */
86