1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Copyright (c) 1999 by Uros Bizjak <uros@kss-loka.si> 41da177e4SLinus Torvalds * Takashi Iwai <tiwai@suse.de> 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * SB16ASP/AWE32 CSP control 71da177e4SLinus Torvalds */ 8674e95caSDavid Howells #ifndef __SOUND_SB16_CSP_H 9674e95caSDavid Howells #define __SOUND_SB16_CSP_H 101da177e4SLinus Torvalds 11a1ce3928SDavid Howells #include <sound/sb.h> 12a1ce3928SDavid Howells #include <sound/hwdep.h> 13de66d53eSClemens Ladisch #include <linux/firmware.h> 14674e95caSDavid Howells #include <uapi/sound/sb16_csp.h> 151da177e4SLinus Torvalds 16029d64b0STakashi Iwai struct snd_sb_csp; 171da177e4SLinus Torvalds 18de66d53eSClemens Ladisch /* indices for the known CSP programs */ 19de66d53eSClemens Ladisch enum { 20de66d53eSClemens Ladisch CSP_PROGRAM_MULAW, 21de66d53eSClemens Ladisch CSP_PROGRAM_ALAW, 22de66d53eSClemens Ladisch CSP_PROGRAM_ADPCM_INIT, 23de66d53eSClemens Ladisch CSP_PROGRAM_ADPCM_PLAYBACK, 24de66d53eSClemens Ladisch CSP_PROGRAM_ADPCM_CAPTURE, 25de66d53eSClemens Ladisch 26de66d53eSClemens Ladisch CSP_PROGRAM_COUNT 27de66d53eSClemens Ladisch }; 28de66d53eSClemens Ladisch 291da177e4SLinus Torvalds /* 301da177e4SLinus Torvalds * CSP operators 311da177e4SLinus Torvalds */ 32029d64b0STakashi Iwai struct snd_sb_csp_ops { 33029d64b0STakashi Iwai int (*csp_use) (struct snd_sb_csp * p); 34029d64b0STakashi Iwai int (*csp_unuse) (struct snd_sb_csp * p); 35e5d3765bSTakashi Iwai int (*csp_autoload) (struct snd_sb_csp * p, snd_pcm_format_t pcm_sfmt, int play_rec_mode); 36029d64b0STakashi Iwai int (*csp_start) (struct snd_sb_csp * p, int sample_width, int channels); 37029d64b0STakashi Iwai int (*csp_stop) (struct snd_sb_csp * p); 38029d64b0STakashi Iwai int (*csp_qsound_transfer) (struct snd_sb_csp * p); 39029d64b0STakashi Iwai }; 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds /* 421da177e4SLinus Torvalds * CSP private data 431da177e4SLinus Torvalds */ 441da177e4SLinus Torvalds struct snd_sb_csp { 45029d64b0STakashi Iwai struct snd_sb *chip; /* SB16 DSP */ 461da177e4SLinus Torvalds int used; /* usage flag - exclusive */ 471da177e4SLinus Torvalds char codec_name[16]; /* name of codec */ 481da177e4SLinus Torvalds unsigned short func_nr; /* function number */ 491da177e4SLinus Torvalds unsigned int acc_format; /* accepted PCM formats */ 501da177e4SLinus Torvalds int acc_channels; /* accepted channels */ 511da177e4SLinus Torvalds int acc_width; /* accepted sample width */ 521da177e4SLinus Torvalds int acc_rates; /* accepted sample rates */ 531da177e4SLinus Torvalds int mode; /* MODE */ 541da177e4SLinus Torvalds int run_channels; /* current CSP channels */ 551da177e4SLinus Torvalds int run_width; /* current sample width */ 561da177e4SLinus Torvalds int version; /* CSP version (0x10 - 0x1f) */ 571da177e4SLinus Torvalds int running; /* running state */ 581da177e4SLinus Torvalds 59029d64b0STakashi Iwai struct snd_sb_csp_ops ops; /* operators */ 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds spinlock_t q_lock; /* locking */ 621da177e4SLinus Torvalds int q_enabled; /* enabled flag */ 631da177e4SLinus Torvalds int qpos_left; /* left position */ 641da177e4SLinus Torvalds int qpos_right; /* right position */ 651da177e4SLinus Torvalds int qpos_changed; /* position changed flag */ 661da177e4SLinus Torvalds 67029d64b0STakashi Iwai struct snd_kcontrol *qsound_switch; 68029d64b0STakashi Iwai struct snd_kcontrol *qsound_space; 691da177e4SLinus Torvalds 708b7547f9SIngo Molnar struct mutex access_mutex; /* locking */ 71de66d53eSClemens Ladisch 72de66d53eSClemens Ladisch const struct firmware *csp_programs[CSP_PROGRAM_COUNT]; 731da177e4SLinus Torvalds }; 741da177e4SLinus Torvalds 75029d64b0STakashi Iwai int snd_sb_csp_new(struct snd_sb *chip, int device, struct snd_hwdep ** rhwdep); 761da177e4SLinus Torvalds #endif /* __SOUND_SB16_CSP */ 77