Lines Matching full:p
39 #define CSP__HEADER CSP_HDR_VALUE('C', 'S', 'P', ' ')
79 static int snd_sb_csp_riff_load(struct snd_sb_csp * p,
81 static int snd_sb_csp_unload(struct snd_sb_csp * p);
82 static int snd_sb_csp_load_user(struct snd_sb_csp * p, const unsigned char __user *buf, int size, i…
83 static int snd_sb_csp_autoload(struct snd_sb_csp * p, snd_pcm_format_t pcm_sfmt, int play_rec_mode);
84 static int snd_sb_csp_check_version(struct snd_sb_csp * p);
86 static int snd_sb_csp_use(struct snd_sb_csp * p);
87 static int snd_sb_csp_unuse(struct snd_sb_csp * p);
88 static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channels);
89 static int snd_sb_csp_stop(struct snd_sb_csp * p);
90 static int snd_sb_csp_pause(struct snd_sb_csp * p);
91 static int snd_sb_csp_restart(struct snd_sb_csp * p);
93 static int snd_sb_qsound_build(struct snd_sb_csp * p);
94 static void snd_sb_qsound_destroy(struct snd_sb_csp * p);
95 static int snd_sb_csp_qsound_transfer(struct snd_sb_csp * p);
97 static int init_proc_entry(struct snd_sb_csp * p, int device);
105 struct snd_sb_csp *p; in snd_sb_csp_new() local
120 p = kzalloc(sizeof(*p), GFP_KERNEL); in snd_sb_csp_new()
121 if (!p) { in snd_sb_csp_new()
125 p->chip = chip; in snd_sb_csp_new()
126 p->version = version; in snd_sb_csp_new()
129 p->ops.csp_use = snd_sb_csp_use; in snd_sb_csp_new()
130 p->ops.csp_unuse = snd_sb_csp_unuse; in snd_sb_csp_new()
131 p->ops.csp_autoload = snd_sb_csp_autoload; in snd_sb_csp_new()
132 p->ops.csp_start = snd_sb_csp_start; in snd_sb_csp_new()
133 p->ops.csp_stop = snd_sb_csp_stop; in snd_sb_csp_new()
134 p->ops.csp_qsound_transfer = snd_sb_csp_qsound_transfer; in snd_sb_csp_new()
136 mutex_init(&p->access_mutex); in snd_sb_csp_new()
139 hw->private_data = p; in snd_sb_csp_new()
148 init_proc_entry(p, device); in snd_sb_csp_new()
160 struct snd_sb_csp *p = hwdep->private_data; in snd_sb_csp_free() local
161 if (p) { in snd_sb_csp_free()
162 if (p->running & SNDRV_SB_CSP_ST_RUNNING) in snd_sb_csp_free()
163 snd_sb_csp_stop(p); in snd_sb_csp_free()
164 for (i = 0; i < ARRAY_SIZE(p->csp_programs); ++i) in snd_sb_csp_free()
165 release_firmware(p->csp_programs[i]); in snd_sb_csp_free()
166 kfree(p); in snd_sb_csp_free()
177 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_open() local
178 return (snd_sb_csp_use(p)); in snd_sb_csp_open()
186 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_ioctl() local
191 if (snd_BUG_ON(!p)) in snd_sb_csp_ioctl()
194 if (snd_sb_csp_check_version(p)) in snd_sb_csp_ioctl()
201 *info.codec_name = *p->codec_name; in snd_sb_csp_ioctl()
202 info.func_nr = p->func_nr; in snd_sb_csp_ioctl()
203 info.acc_format = p->acc_format; in snd_sb_csp_ioctl()
204 info.acc_channels = p->acc_channels; in snd_sb_csp_ioctl()
205 info.acc_width = p->acc_width; in snd_sb_csp_ioctl()
206 info.acc_rates = p->acc_rates; in snd_sb_csp_ioctl()
207 info.csp_mode = p->mode; in snd_sb_csp_ioctl()
208 info.run_channels = p->run_channels; in snd_sb_csp_ioctl()
209 info.run_width = p->run_width; in snd_sb_csp_ioctl()
210 info.version = p->version; in snd_sb_csp_ioctl()
211 info.state = p->running; in snd_sb_csp_ioctl()
220 err = (p->running & SNDRV_SB_CSP_ST_RUNNING ? in snd_sb_csp_ioctl()
221 -EBUSY : snd_sb_csp_riff_load(p, (struct snd_sb_csp_microcode __user *) arg)); in snd_sb_csp_ioctl()
224 err = (p->running & SNDRV_SB_CSP_ST_RUNNING ? in snd_sb_csp_ioctl()
225 -EBUSY : snd_sb_csp_unload(p)); in snd_sb_csp_ioctl()
233 err = snd_sb_csp_start(p, start_info.sample_width, start_info.channels); in snd_sb_csp_ioctl()
236 err = snd_sb_csp_stop(p); in snd_sb_csp_ioctl()
239 err = snd_sb_csp_pause(p); in snd_sb_csp_ioctl()
242 err = snd_sb_csp_restart(p); in snd_sb_csp_ioctl()
257 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_release() local
258 return (snd_sb_csp_unuse(p)); in snd_sb_csp_release()
266 static int snd_sb_csp_use(struct snd_sb_csp * p) in snd_sb_csp_use() argument
268 mutex_lock(&p->access_mutex); in snd_sb_csp_use()
269 if (p->used) { in snd_sb_csp_use()
270 mutex_unlock(&p->access_mutex); in snd_sb_csp_use()
273 p->used++; in snd_sb_csp_use()
274 mutex_unlock(&p->access_mutex); in snd_sb_csp_use()
283 static int snd_sb_csp_unuse(struct snd_sb_csp * p) in snd_sb_csp_unuse() argument
285 mutex_lock(&p->access_mutex); in snd_sb_csp_unuse()
286 p->used--; in snd_sb_csp_unuse()
287 mutex_unlock(&p->access_mutex); in snd_sb_csp_unuse()
296 static int snd_sb_csp_riff_load(struct snd_sb_csp * p, in snd_sb_csp_riff_load() argument
300 struct device *dev = p->chip->card->dev; in snd_sb_csp_riff_load()
356 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_riff_load()
357 snd_sb_qsound_destroy(p); in snd_sb_csp_riff_load()
360 p->running = 0; in snd_sb_csp_riff_load()
361 p->mode = 0; in snd_sb_csp_riff_load()
374 err = snd_sb_csp_load_user(p, data_ptr, le32_to_cpu(code_h.len), in snd_sb_csp_riff_load()
389 err = snd_sb_csp_load_user(p, data_ptr, in snd_sb_csp_riff_load()
395 strscpy(p->codec_name, info.codec_name, sizeof(p->codec_name)); in snd_sb_csp_riff_load()
396 p->func_nr = func_nr; in snd_sb_csp_riff_load()
397 p->mode = le16_to_cpu(funcdesc_h.flags_play_rec); in snd_sb_csp_riff_load()
401 if (snd_sb_qsound_build(p) == 0) in snd_sb_csp_riff_load()
403 p->mode = SNDRV_SB_CSP_MODE_QSOUND; in snd_sb_csp_riff_load()
405 p->acc_format = 0; in snd_sb_csp_riff_load()
408 p->acc_format = SNDRV_PCM_FMTBIT_A_LAW; in snd_sb_csp_riff_load()
411 p->acc_format = SNDRV_PCM_FMTBIT_MU_LAW; in snd_sb_csp_riff_load()
415 p->acc_format = SNDRV_PCM_FMTBIT_IMA_ADPCM; in snd_sb_csp_riff_load()
419 p->acc_format = 0; in snd_sb_csp_riff_load()
423 p->acc_format = SNDRV_PCM_FMTBIT_SPECIAL; in snd_sb_csp_riff_load()
426 p->acc_format = p->acc_width = p->acc_rates = 0; in snd_sb_csp_riff_load()
427 p->mode = 0; in snd_sb_csp_riff_load()
433 p->acc_channels = le16_to_cpu(funcdesc_h.flags_stereo_mono); in snd_sb_csp_riff_load()
434 p->acc_width = le16_to_cpu(funcdesc_h.flags_16bit_8bit); in snd_sb_csp_riff_load()
435 p->acc_rates = le16_to_cpu(funcdesc_h.flags_rates); in snd_sb_csp_riff_load()
438 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_riff_load()
439 set_mode_register(p->chip, 0xfc); in snd_sb_csp_riff_load()
440 set_mode_register(p->chip, 0x00); in snd_sb_csp_riff_load()
441 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_riff_load()
444 p->running = SNDRV_SB_CSP_ST_LOADED; /* set LOADED flag */ in snd_sb_csp_riff_load()
455 static int snd_sb_csp_unload(struct snd_sb_csp * p) in snd_sb_csp_unload() argument
457 if (p->running & SNDRV_SB_CSP_ST_RUNNING) in snd_sb_csp_unload()
459 if (!(p->running & SNDRV_SB_CSP_ST_LOADED)) in snd_sb_csp_unload()
463 p->acc_format = 0; in snd_sb_csp_unload()
464 p->acc_channels = p->acc_width = p->acc_rates = 0; in snd_sb_csp_unload()
466 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_unload()
467 snd_sb_qsound_destroy(p); in snd_sb_csp_unload()
470 p->running = 0; in snd_sb_csp_unload()
471 p->mode = 0; in snd_sb_csp_unload()
599 static int snd_sb_csp_check_version(struct snd_sb_csp * p) in snd_sb_csp_check_version() argument
601 if (p->version < 0x10 || p->version > 0x1f) { in snd_sb_csp_check_version()
602 dev_dbg(p->chip->card->dev, in snd_sb_csp_check_version()
604 __func__, p->version); in snd_sb_csp_check_version()
613 static int snd_sb_csp_load(struct snd_sb_csp * p, const unsigned char *buf, int size, int load_flag… in snd_sb_csp_load() argument
620 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_load()
621 snd_sbdsp_command(p->chip, 0x01); /* CSP download command */ in snd_sb_csp_load()
622 if (snd_sbdsp_get_byte(p->chip)) { in snd_sb_csp_load()
623 dev_dbg(p->chip->card->dev, "%s: Download command failed\n", __func__); in snd_sb_csp_load()
627 snd_sbdsp_command(p->chip, (unsigned char)(size - 1)); in snd_sb_csp_load()
629 snd_sbdsp_command(p->chip, (unsigned char)((size - 1) >> 8)); in snd_sb_csp_load()
633 if (!snd_sbdsp_command(p->chip, *buf++)) in snd_sb_csp_load()
636 if (snd_sbdsp_get_byte(p->chip)) in snd_sb_csp_load()
643 snd_sbdsp_command(p->chip, 0x03); in snd_sb_csp_load()
644 status = snd_sbdsp_get_byte(p->chip); in snd_sb_csp_load()
650 dev_dbg(p->chip->card->dev, in snd_sb_csp_load()
661 spin_lock(&p->chip->mixer_lock); in snd_sb_csp_load()
662 status = snd_sbmixer_read(p->chip, SB_DSP4_DMASETUP); in snd_sb_csp_load()
663 spin_unlock(&p->chip->mixer_lock); in snd_sb_csp_load()
665 err = (set_codec_parameter(p->chip, 0xaa, 0x00) || in snd_sb_csp_load()
666 set_codec_parameter(p->chip, 0xff, 0x00)); in snd_sb_csp_load()
667 snd_sbdsp_reset(p->chip); /* really! */ in snd_sb_csp_load()
670 set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_load()
671 set_mode_register(p->chip, 0x70); /* 70 = RUN */ in snd_sb_csp_load()
677 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_load()
681 static int snd_sb_csp_load_user(struct snd_sb_csp * p, const unsigned char __user *buf, int size, i… in snd_sb_csp_load_user() argument
690 err = snd_sb_csp_load(p, kbuf, size, load_flags); in snd_sb_csp_load_user()
696 static int snd_sb_csp_firmware_load(struct snd_sb_csp *p, int index, int flags) in snd_sb_csp_firmware_load() argument
708 program = p->csp_programs[index]; in snd_sb_csp_firmware_load()
711 p->chip->card->dev); in snd_sb_csp_firmware_load()
714 p->csp_programs[index] = program; in snd_sb_csp_firmware_load()
716 return snd_sb_csp_load(p, program->data, program->size, flags); in snd_sb_csp_firmware_load()
721 * return 0 if CSP is loaded and ready to run (p->running != 0)
723 static int snd_sb_csp_autoload(struct snd_sb_csp * p, snd_pcm_format_t pcm_sfmt, int play_rec_mode) in snd_sb_csp_autoload() argument
729 if (p->running & (SNDRV_SB_CSP_ST_RUNNING | SNDRV_SB_CSP_ST_LOADED)) in snd_sb_csp_autoload()
733 if (((1U << (__force int)pcm_sfmt) & p->acc_format) && (play_rec_mode & p->mode)) { in snd_sb_csp_autoload()
734 p->running = SNDRV_SB_CSP_ST_AUTO; in snd_sb_csp_autoload()
738 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_MULAW, 0); in snd_sb_csp_autoload()
739 p->acc_format = SNDRV_PCM_FMTBIT_MU_LAW; in snd_sb_csp_autoload()
740 p->mode = SNDRV_SB_CSP_MODE_DSP_READ | SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
743 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_ALAW, 0); in snd_sb_csp_autoload()
744 p->acc_format = SNDRV_PCM_FMTBIT_A_LAW; in snd_sb_csp_autoload()
745 p->mode = SNDRV_SB_CSP_MODE_DSP_READ | SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
748 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_ADPCM_INIT, in snd_sb_csp_autoload()
754 (p, CSP_PROGRAM_ADPCM_PLAYBACK, 0); in snd_sb_csp_autoload()
755 p->mode = SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
758 (p, CSP_PROGRAM_ADPCM_CAPTURE, 0); in snd_sb_csp_autoload()
759 p->mode = SNDRV_SB_CSP_MODE_DSP_READ; in snd_sb_csp_autoload()
761 p->acc_format = SNDRV_PCM_FMTBIT_IMA_ADPCM; in snd_sb_csp_autoload()
765 if (p->running & SNDRV_SB_CSP_ST_AUTO) { in snd_sb_csp_autoload()
766 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_autoload()
767 set_mode_register(p->chip, 0xfc); in snd_sb_csp_autoload()
768 set_mode_register(p->chip, 0x00); in snd_sb_csp_autoload()
769 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_autoload()
770 p->running = 0; /* clear autoloaded flag */ in snd_sb_csp_autoload()
775 p->acc_format = 0; in snd_sb_csp_autoload()
776 p->acc_channels = p->acc_width = p->acc_rates = 0; in snd_sb_csp_autoload()
778 p->running = 0; /* clear autoloaded flag */ in snd_sb_csp_autoload()
779 p->mode = 0; in snd_sb_csp_autoload()
782 p->running = SNDRV_SB_CSP_ST_AUTO; /* set autoloaded flag */ in snd_sb_csp_autoload()
783 p->acc_width = SNDRV_SB_CSP_SAMPLE_16BIT; /* only 16 bit data */ in snd_sb_csp_autoload()
784 p->acc_channels = SNDRV_SB_CSP_MONO | SNDRV_SB_CSP_STEREO; in snd_sb_csp_autoload()
785 p->acc_rates = SNDRV_SB_CSP_RATE_ALL; /* HW codecs accept all rates */ in snd_sb_csp_autoload()
789 return (p->running & SNDRV_SB_CSP_ST_AUTO) ? 0 : -ENXIO; in snd_sb_csp_autoload()
795 static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channels) in snd_sb_csp_start() argument
797 struct device *dev = p->chip->card->dev; in snd_sb_csp_start()
803 if (!(p->running & (SNDRV_SB_CSP_ST_LOADED | SNDRV_SB_CSP_ST_AUTO))) { in snd_sb_csp_start()
807 if (p->running & SNDRV_SB_CSP_ST_RUNNING) { in snd_sb_csp_start()
811 if (!(sample_width & p->acc_width)) { in snd_sb_csp_start()
815 if (!(channels & p->acc_channels)) { in snd_sb_csp_start()
821 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
822 mixL = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV); in snd_sb_csp_start()
823 mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1); in snd_sb_csp_start()
824 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7); in snd_sb_csp_start()
825 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7); in snd_sb_csp_start()
826 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
828 spin_lock(&p->chip->reg_lock); in snd_sb_csp_start()
829 set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_start()
830 set_mode_register(p->chip, 0x70); /* 70 = RUN */ in snd_sb_csp_start()
838 if (set_codec_parameter(p->chip, 0x81, s_type)) { in snd_sb_csp_start()
842 if (set_codec_parameter(p->chip, 0x80, 0x00)) { in snd_sb_csp_start()
846 p->run_width = sample_width; in snd_sb_csp_start()
847 p->run_channels = channels; in snd_sb_csp_start()
849 p->running |= SNDRV_SB_CSP_ST_RUNNING; in snd_sb_csp_start()
851 if (p->mode & SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_start()
852 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_start()
854 set_codec_parameter(p->chip, 0x00, 0xff); in snd_sb_csp_start()
855 set_codec_parameter(p->chip, 0x01, 0xff); in snd_sb_csp_start()
856 p->running |= SNDRV_SB_CSP_ST_QSOUND; in snd_sb_csp_start()
858 snd_sb_csp_qsound_transfer(p); in snd_sb_csp_start()
863 spin_unlock(&p->chip->reg_lock); in snd_sb_csp_start()
866 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
867 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL); in snd_sb_csp_start()
868 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR); in snd_sb_csp_start()
869 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
877 static int snd_sb_csp_stop(struct snd_sb_csp * p) in snd_sb_csp_stop() argument
883 if (!(p->running & SNDRV_SB_CSP_ST_RUNNING)) in snd_sb_csp_stop()
887 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
888 mixL = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV); in snd_sb_csp_stop()
889 mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1); in snd_sb_csp_stop()
890 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7); in snd_sb_csp_stop()
891 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7); in snd_sb_csp_stop()
892 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
894 spin_lock(&p->chip->reg_lock); in snd_sb_csp_stop()
895 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in snd_sb_csp_stop()
896 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_stop()
898 set_codec_parameter(p->chip, 0x00, 0x00); in snd_sb_csp_stop()
899 set_codec_parameter(p->chip, 0x01, 0x00); in snd_sb_csp_stop()
901 p->running &= ~SNDRV_SB_CSP_ST_QSOUND; in snd_sb_csp_stop()
903 result = set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_stop()
904 spin_unlock(&p->chip->reg_lock); in snd_sb_csp_stop()
907 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
908 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL); in snd_sb_csp_stop()
909 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR); in snd_sb_csp_stop()
910 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
913 p->running &= ~(SNDRV_SB_CSP_ST_PAUSED | SNDRV_SB_CSP_ST_RUNNING); in snd_sb_csp_stop()
920 static int snd_sb_csp_pause(struct snd_sb_csp * p) in snd_sb_csp_pause() argument
925 if (!(p->running & SNDRV_SB_CSP_ST_RUNNING)) in snd_sb_csp_pause()
928 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_pause()
929 result = set_codec_parameter(p->chip, 0x80, 0xff); in snd_sb_csp_pause()
930 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_pause()
932 p->running |= SNDRV_SB_CSP_ST_PAUSED; in snd_sb_csp_pause()
940 static int snd_sb_csp_restart(struct snd_sb_csp * p) in snd_sb_csp_restart() argument
945 if (!(p->running & SNDRV_SB_CSP_ST_PAUSED)) in snd_sb_csp_restart()
948 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_restart()
949 result = set_codec_parameter(p->chip, 0x80, 0x00); in snd_sb_csp_restart()
950 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_restart()
952 p->running &= ~SNDRV_SB_CSP_ST_PAUSED; in snd_sb_csp_restart()
967 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_switch_get() local
969 ucontrol->value.integer.value[0] = p->q_enabled ? 1 : 0; in snd_sb_qsound_switch_get()
975 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_switch_put() local
981 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_switch_put()
982 change = p->q_enabled != nval; in snd_sb_qsound_switch_put()
983 p->q_enabled = nval; in snd_sb_qsound_switch_put()
984 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_switch_put()
999 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_space_get() local
1002 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_space_get()
1003 ucontrol->value.integer.value[0] = p->qpos_left; in snd_sb_qsound_space_get()
1004 ucontrol->value.integer.value[1] = p->qpos_right; in snd_sb_qsound_space_get()
1005 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_space_get()
1011 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_space_put() local
1022 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_space_put()
1023 change = p->qpos_left != nval1 || p->qpos_right != nval2; in snd_sb_qsound_space_put()
1024 p->qpos_left = nval1; in snd_sb_qsound_space_put()
1025 p->qpos_right = nval2; in snd_sb_qsound_space_put()
1026 p->qpos_changed = change; in snd_sb_qsound_space_put()
1027 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_space_put()
1047 static int snd_sb_qsound_build(struct snd_sb_csp * p) in snd_sb_qsound_build() argument
1053 if (snd_BUG_ON(!p)) in snd_sb_qsound_build()
1056 card = p->chip->card; in snd_sb_qsound_build()
1057 p->qpos_left = p->qpos_right = SNDRV_SB_CSP_QSOUND_MAX_RIGHT / 2; in snd_sb_qsound_build()
1058 p->qpos_changed = 0; in snd_sb_qsound_build()
1060 spin_lock_init(&p->q_lock); in snd_sb_qsound_build()
1062 kctl = snd_ctl_new1(&snd_sb_qsound_switch, p); in snd_sb_qsound_build()
1066 p->qsound_switch = kctl; in snd_sb_qsound_build()
1067 kctl = snd_ctl_new1(&snd_sb_qsound_space, p); in snd_sb_qsound_build()
1071 p->qsound_space = kctl; in snd_sb_qsound_build()
1076 snd_sb_qsound_destroy(p); in snd_sb_qsound_build()
1080 static void snd_sb_qsound_destroy(struct snd_sb_csp * p) in snd_sb_qsound_destroy() argument
1085 if (snd_BUG_ON(!p)) in snd_sb_qsound_destroy()
1088 card = p->chip->card; in snd_sb_qsound_destroy()
1090 snd_ctl_remove(card, p->qsound_switch); in snd_sb_qsound_destroy()
1091 p->qsound_switch = NULL; in snd_sb_qsound_destroy()
1092 snd_ctl_remove(card, p->qsound_space); in snd_sb_qsound_destroy()
1093 p->qsound_space = NULL; in snd_sb_qsound_destroy()
1096 spin_lock_irqsave (&p->q_lock, flags); in snd_sb_qsound_destroy()
1097 p->qpos_changed = 0; in snd_sb_qsound_destroy()
1098 spin_unlock_irqrestore (&p->q_lock, flags); in snd_sb_qsound_destroy()
1105 static int snd_sb_csp_qsound_transfer(struct snd_sb_csp * p) in snd_sb_csp_qsound_transfer() argument
1109 spin_lock(&p->q_lock); in snd_sb_csp_qsound_transfer()
1110 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in snd_sb_csp_qsound_transfer()
1111 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_qsound_transfer()
1113 set_codec_parameter(p->chip, 0x00, p->qpos_left); in snd_sb_csp_qsound_transfer()
1114 set_codec_parameter(p->chip, 0x02, 0x00); in snd_sb_csp_qsound_transfer()
1116 set_codec_parameter(p->chip, 0x00, p->qpos_right); in snd_sb_csp_qsound_transfer()
1117 set_codec_parameter(p->chip, 0x03, 0x00); in snd_sb_csp_qsound_transfer()
1120 p->qpos_changed = 0; in snd_sb_csp_qsound_transfer()
1121 spin_unlock(&p->q_lock); in snd_sb_csp_qsound_transfer()
1130 static int init_proc_entry(struct snd_sb_csp * p, int device) in init_proc_entry() argument
1135 snd_card_ro_proc_new(p->chip->card, name, p, info_read); in init_proc_entry()
1141 struct snd_sb_csp *p = entry->private_data; in info_read() local
1143 …snd_iprintf(buffer, "Creative Signal Processor [v%d.%d]\n", (p->version >> 4), (p->version & 0x0f)… in info_read()
1144 snd_iprintf(buffer, "State: %cx%c%c%c\n", ((p->running & SNDRV_SB_CSP_ST_QSOUND) ? 'Q' : '-'), in info_read()
1145 ((p->running & SNDRV_SB_CSP_ST_PAUSED) ? 'P' : '-'), in info_read()
1146 ((p->running & SNDRV_SB_CSP_ST_RUNNING) ? 'R' : '-'), in info_read()
1147 ((p->running & SNDRV_SB_CSP_ST_LOADED) ? 'L' : '-')); in info_read()
1148 if (p->running & SNDRV_SB_CSP_ST_LOADED) { in info_read()
1149 snd_iprintf(buffer, "Codec: %s [func #%d]\n", p->codec_name, p->func_nr); in info_read()
1151 if (p->acc_rates == SNDRV_SB_CSP_RATE_ALL) { in info_read()
1155 ((p->acc_rates & SNDRV_SB_CSP_RATE_8000) ? "8000Hz " : ""), in info_read()
1156 ((p->acc_rates & SNDRV_SB_CSP_RATE_11025) ? "11025Hz " : ""), in info_read()
1157 ((p->acc_rates & SNDRV_SB_CSP_RATE_22050) ? "22050Hz " : ""), in info_read()
1158 ((p->acc_rates & SNDRV_SB_CSP_RATE_44100) ? "44100Hz" : "")); in info_read()
1160 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in info_read()
1162 str_enabled_disabled(p->q_enabled)); in info_read()
1165 p->acc_format, in info_read()
1166 ((p->acc_width & SNDRV_SB_CSP_SAMPLE_16BIT) ? "16bit" : "-"), in info_read()
1167 ((p->acc_width & SNDRV_SB_CSP_SAMPLE_8BIT) ? "8bit" : "-"), in info_read()
1168 ((p->acc_channels & SNDRV_SB_CSP_MONO) ? "mono" : "-"), in info_read()
1169 ((p->acc_channels & SNDRV_SB_CSP_STEREO) ? "stereo" : "-"), in info_read()
1170 ((p->mode & SNDRV_SB_CSP_MODE_DSP_WRITE) ? "playback" : "-"), in info_read()
1171 ((p->mode & SNDRV_SB_CSP_MODE_DSP_READ) ? "capture" : "-")); in info_read()
1174 if (p->running & SNDRV_SB_CSP_ST_AUTO) { in info_read()
1177 if (p->running & SNDRV_SB_CSP_ST_RUNNING) { in info_read()
1179 ((p->run_width & SNDRV_SB_CSP_SAMPLE_16BIT) ? 16 : 8), in info_read()
1180 ((p->run_channels & SNDRV_SB_CSP_MONO) ? "mono" : "stereo")); in info_read()
1182 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in info_read()
1184 p->qpos_left, p->qpos_right); in info_read()