1/*
2 *  Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si>
3 *                        Takashi Iwai <tiwai@suse.de>
4 *
5 *  SB16ASP/AWE32 CSP control
6 *
7 *   This program is free software; you can redistribute it and/or modify
8 *   it under the terms of the GNU General Public License as published by
9 *   the Free Software Foundation; either version 2 of the License, or
10 *   (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 *
21 */
22#ifndef __SOUND_SB16_CSP_H
23#define __SOUND_SB16_CSP_H
24
25#include <sound/sb.h>
26#include <sound/hwdep.h>
27#include <linux/firmware.h>
28#include <uapi/sound/sb16_csp.h>
29
30struct snd_sb_csp;
31
32/* indices for the known CSP programs */
33enum {
34	CSP_PROGRAM_MULAW,
35	CSP_PROGRAM_ALAW,
36	CSP_PROGRAM_ADPCM_INIT,
37	CSP_PROGRAM_ADPCM_PLAYBACK,
38	CSP_PROGRAM_ADPCM_CAPTURE,
39
40	CSP_PROGRAM_COUNT
41};
42
43/*
44 * CSP operators
45 */
46struct snd_sb_csp_ops {
47	int (*csp_use) (struct snd_sb_csp * p);
48	int (*csp_unuse) (struct snd_sb_csp * p);
49	int (*csp_autoload) (struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode);
50	int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels);
51	int (*csp_stop) (struct snd_sb_csp * p);
52	int (*csp_qsound_transfer) (struct snd_sb_csp * p);
53};
54
55/*
56 * CSP private data
57 */
58struct snd_sb_csp {
59	struct snd_sb *chip;		/* SB16 DSP */
60	int used;		/* usage flag - exclusive */
61	char codec_name[16];	/* name of codec */
62	unsigned short func_nr;	/* function number */
63	unsigned int acc_format;	/* accepted PCM formats */
64	int acc_channels;	/* accepted channels */
65	int acc_width;		/* accepted sample width */
66	int acc_rates;		/* accepted sample rates */
67	int mode;		/* MODE */
68	int run_channels;	/* current CSP channels */
69	int run_width;		/* current sample width */
70	int version;		/* CSP version (0x10 - 0x1f) */
71	int running;		/* running state */
72
73	struct snd_sb_csp_ops ops;	/* operators */
74
75	spinlock_t q_lock;	/* locking */
76	int q_enabled;		/* enabled flag */
77	int qpos_left;		/* left position */
78	int qpos_right;		/* right position */
79	int qpos_changed;	/* position changed flag */
80
81	struct snd_kcontrol *qsound_switch;
82	struct snd_kcontrol *qsound_space;
83
84	struct mutex access_mutex;	/* locking */
85
86	const struct firmware *csp_programs[CSP_PROGRAM_COUNT];
87};
88
89int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep);
90#endif /* __SOUND_SB16_CSP */
91