162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
462306a36Sopenharmony_ci *                        Takashi Iwai <tiwai@suse.de>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  SB16ASP/AWE32 CSP control
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef __SOUND_SB16_CSP_H
962306a36Sopenharmony_ci#define __SOUND_SB16_CSP_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <sound/sb.h>
1262306a36Sopenharmony_ci#include <sound/hwdep.h>
1362306a36Sopenharmony_ci#include <linux/firmware.h>
1462306a36Sopenharmony_ci#include <uapi/sound/sb16_csp.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct snd_sb_csp;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* indices for the known CSP programs */
1962306a36Sopenharmony_cienum {
2062306a36Sopenharmony_ci	CSP_PROGRAM_MULAW,
2162306a36Sopenharmony_ci	CSP_PROGRAM_ALAW,
2262306a36Sopenharmony_ci	CSP_PROGRAM_ADPCM_INIT,
2362306a36Sopenharmony_ci	CSP_PROGRAM_ADPCM_PLAYBACK,
2462306a36Sopenharmony_ci	CSP_PROGRAM_ADPCM_CAPTURE,
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	CSP_PROGRAM_COUNT
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/*
3062306a36Sopenharmony_ci * CSP operators
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_cistruct snd_sb_csp_ops {
3362306a36Sopenharmony_ci	int (*csp_use) (struct snd_sb_csp * p);
3462306a36Sopenharmony_ci	int (*csp_unuse) (struct snd_sb_csp * p);
3562306a36Sopenharmony_ci	int (*csp_autoload) (struct snd_sb_csp * p, snd_pcm_format_t pcm_sfmt, int play_rec_mode);
3662306a36Sopenharmony_ci	int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels);
3762306a36Sopenharmony_ci	int (*csp_stop) (struct snd_sb_csp * p);
3862306a36Sopenharmony_ci	int (*csp_qsound_transfer) (struct snd_sb_csp * p);
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/*
4262306a36Sopenharmony_ci * CSP private data
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_cistruct snd_sb_csp {
4562306a36Sopenharmony_ci	struct snd_sb *chip;		/* SB16 DSP */
4662306a36Sopenharmony_ci	int used;		/* usage flag - exclusive */
4762306a36Sopenharmony_ci	char codec_name[16];	/* name of codec */
4862306a36Sopenharmony_ci	unsigned short func_nr;	/* function number */
4962306a36Sopenharmony_ci	unsigned int acc_format;	/* accepted PCM formats */
5062306a36Sopenharmony_ci	int acc_channels;	/* accepted channels */
5162306a36Sopenharmony_ci	int acc_width;		/* accepted sample width */
5262306a36Sopenharmony_ci	int acc_rates;		/* accepted sample rates */
5362306a36Sopenharmony_ci	int mode;		/* MODE */
5462306a36Sopenharmony_ci	int run_channels;	/* current CSP channels */
5562306a36Sopenharmony_ci	int run_width;		/* current sample width */
5662306a36Sopenharmony_ci	int version;		/* CSP version (0x10 - 0x1f) */
5762306a36Sopenharmony_ci	int running;		/* running state */
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	struct snd_sb_csp_ops ops;	/* operators */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	spinlock_t q_lock;	/* locking */
6262306a36Sopenharmony_ci	int q_enabled;		/* enabled flag */
6362306a36Sopenharmony_ci	int qpos_left;		/* left position */
6462306a36Sopenharmony_ci	int qpos_right;		/* right position */
6562306a36Sopenharmony_ci	int qpos_changed;	/* position changed flag */
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	struct snd_kcontrol *qsound_switch;
6862306a36Sopenharmony_ci	struct snd_kcontrol *qsound_space;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	struct mutex access_mutex;	/* locking */
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	const struct firmware *csp_programs[CSP_PROGRAM_COUNT];
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciint snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep);
7662306a36Sopenharmony_ci#endif /* __SOUND_SB16_CSP */
77