Lines Matching refs:p
92 static int snd_sb_csp_riff_load(struct snd_sb_csp * p,
94 static int snd_sb_csp_unload(struct snd_sb_csp * p);
95 static int snd_sb_csp_load_user(struct snd_sb_csp * p, const unsigned char __user *buf, int size, i…
96 static int snd_sb_csp_autoload(struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode);
97 static int snd_sb_csp_check_version(struct snd_sb_csp * p);
99 static int snd_sb_csp_use(struct snd_sb_csp * p);
100 static int snd_sb_csp_unuse(struct snd_sb_csp * p);
101 static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channels);
102 static int snd_sb_csp_stop(struct snd_sb_csp * p);
103 static int snd_sb_csp_pause(struct snd_sb_csp * p);
104 static int snd_sb_csp_restart(struct snd_sb_csp * p);
106 static int snd_sb_qsound_build(struct snd_sb_csp * p);
107 static void snd_sb_qsound_destroy(struct snd_sb_csp * p);
108 static int snd_sb_csp_qsound_transfer(struct snd_sb_csp * p);
110 static int init_proc_entry(struct snd_sb_csp * p, int device);
118 struct snd_sb_csp *p; in snd_sb_csp_new() local
132 if ((p = kzalloc(sizeof(*p), GFP_KERNEL)) == NULL) { in snd_sb_csp_new()
136 p->chip = chip; in snd_sb_csp_new()
137 p->version = version; in snd_sb_csp_new()
140 p->ops.csp_use = snd_sb_csp_use; in snd_sb_csp_new()
141 p->ops.csp_unuse = snd_sb_csp_unuse; in snd_sb_csp_new()
142 p->ops.csp_autoload = snd_sb_csp_autoload; in snd_sb_csp_new()
143 p->ops.csp_start = snd_sb_csp_start; in snd_sb_csp_new()
144 p->ops.csp_stop = snd_sb_csp_stop; in snd_sb_csp_new()
145 p->ops.csp_qsound_transfer = snd_sb_csp_qsound_transfer; in snd_sb_csp_new()
147 mutex_init(&p->access_mutex); in snd_sb_csp_new()
150 hw->private_data = p; in snd_sb_csp_new()
159 init_proc_entry(p, device); in snd_sb_csp_new()
171 struct snd_sb_csp *p = hwdep->private_data; in snd_sb_csp_free() local
172 if (p) { in snd_sb_csp_free()
173 if (p->running & SNDRV_SB_CSP_ST_RUNNING) in snd_sb_csp_free()
174 snd_sb_csp_stop(p); in snd_sb_csp_free()
175 for (i = 0; i < ARRAY_SIZE(p->csp_programs); ++i) in snd_sb_csp_free()
176 release_firmware(p->csp_programs[i]); in snd_sb_csp_free()
177 kfree(p); in snd_sb_csp_free()
188 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_open() local
189 return (snd_sb_csp_use(p)); in snd_sb_csp_open()
197 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_ioctl() local
202 if (snd_BUG_ON(!p)) in snd_sb_csp_ioctl()
205 if (snd_sb_csp_check_version(p)) in snd_sb_csp_ioctl()
212 *info.codec_name = *p->codec_name; in snd_sb_csp_ioctl()
213 info.func_nr = p->func_nr; in snd_sb_csp_ioctl()
214 info.acc_format = p->acc_format; in snd_sb_csp_ioctl()
215 info.acc_channels = p->acc_channels; in snd_sb_csp_ioctl()
216 info.acc_width = p->acc_width; in snd_sb_csp_ioctl()
217 info.acc_rates = p->acc_rates; in snd_sb_csp_ioctl()
218 info.csp_mode = p->mode; in snd_sb_csp_ioctl()
219 info.run_channels = p->run_channels; in snd_sb_csp_ioctl()
220 info.run_width = p->run_width; in snd_sb_csp_ioctl()
221 info.version = p->version; in snd_sb_csp_ioctl()
222 info.state = p->running; in snd_sb_csp_ioctl()
231 err = (p->running & SNDRV_SB_CSP_ST_RUNNING ? in snd_sb_csp_ioctl()
232 -EBUSY : snd_sb_csp_riff_load(p, (struct snd_sb_csp_microcode __user *) arg)); in snd_sb_csp_ioctl()
235 err = (p->running & SNDRV_SB_CSP_ST_RUNNING ? in snd_sb_csp_ioctl()
236 -EBUSY : snd_sb_csp_unload(p)); in snd_sb_csp_ioctl()
244 err = snd_sb_csp_start(p, start_info.sample_width, start_info.channels); in snd_sb_csp_ioctl()
247 err = snd_sb_csp_stop(p); in snd_sb_csp_ioctl()
250 err = snd_sb_csp_pause(p); in snd_sb_csp_ioctl()
253 err = snd_sb_csp_restart(p); in snd_sb_csp_ioctl()
268 struct snd_sb_csp *p = hw->private_data; in snd_sb_csp_release() local
269 return (snd_sb_csp_unuse(p)); in snd_sb_csp_release()
277 static int snd_sb_csp_use(struct snd_sb_csp * p) in snd_sb_csp_use() argument
279 mutex_lock(&p->access_mutex); in snd_sb_csp_use()
280 if (p->used) { in snd_sb_csp_use()
281 mutex_unlock(&p->access_mutex); in snd_sb_csp_use()
284 p->used++; in snd_sb_csp_use()
285 mutex_unlock(&p->access_mutex); in snd_sb_csp_use()
294 static int snd_sb_csp_unuse(struct snd_sb_csp * p) in snd_sb_csp_unuse() argument
296 mutex_lock(&p->access_mutex); in snd_sb_csp_unuse()
297 p->used--; in snd_sb_csp_unuse()
298 mutex_unlock(&p->access_mutex); in snd_sb_csp_unuse()
307 static int snd_sb_csp_riff_load(struct snd_sb_csp * p, in snd_sb_csp_riff_load() argument
366 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_riff_load()
367 snd_sb_qsound_destroy(p); in snd_sb_csp_riff_load()
370 p->running = 0; in snd_sb_csp_riff_load()
371 p->mode = 0; in snd_sb_csp_riff_load()
384 err = snd_sb_csp_load_user(p, data_ptr, le32_to_cpu(code_h.len), in snd_sb_csp_riff_load()
399 err = snd_sb_csp_load_user(p, data_ptr, in snd_sb_csp_riff_load()
405 strlcpy(p->codec_name, info.codec_name, sizeof(p->codec_name)); in snd_sb_csp_riff_load()
406 p->func_nr = func_nr; in snd_sb_csp_riff_load()
407 p->mode = le16_to_cpu(funcdesc_h.flags_play_rec); in snd_sb_csp_riff_load()
411 if (snd_sb_qsound_build(p) == 0) in snd_sb_csp_riff_load()
413 p->mode = SNDRV_SB_CSP_MODE_QSOUND; in snd_sb_csp_riff_load()
415 p->acc_format = 0; in snd_sb_csp_riff_load()
418 p->acc_format = SNDRV_PCM_FMTBIT_A_LAW; in snd_sb_csp_riff_load()
421 p->acc_format = SNDRV_PCM_FMTBIT_MU_LAW; in snd_sb_csp_riff_load()
425 p->acc_format = SNDRV_PCM_FMTBIT_IMA_ADPCM; in snd_sb_csp_riff_load()
429 p->acc_format = 0; in snd_sb_csp_riff_load()
433 p->acc_format = SNDRV_PCM_FMTBIT_SPECIAL; in snd_sb_csp_riff_load()
436 p->acc_format = p->acc_width = p->acc_rates = 0; in snd_sb_csp_riff_load()
437 p->mode = 0; in snd_sb_csp_riff_load()
443 p->acc_channels = le16_to_cpu(funcdesc_h.flags_stereo_mono); in snd_sb_csp_riff_load()
444 p->acc_width = le16_to_cpu(funcdesc_h.flags_16bit_8bit); in snd_sb_csp_riff_load()
445 p->acc_rates = le16_to_cpu(funcdesc_h.flags_rates); in snd_sb_csp_riff_load()
448 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_riff_load()
449 set_mode_register(p->chip, 0xfc); in snd_sb_csp_riff_load()
450 set_mode_register(p->chip, 0x00); in snd_sb_csp_riff_load()
451 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_riff_load()
454 p->running = SNDRV_SB_CSP_ST_LOADED; /* set LOADED flag */ in snd_sb_csp_riff_load()
465 static int snd_sb_csp_unload(struct snd_sb_csp * p) in snd_sb_csp_unload() argument
467 if (p->running & SNDRV_SB_CSP_ST_RUNNING) in snd_sb_csp_unload()
469 if (!(p->running & SNDRV_SB_CSP_ST_LOADED)) in snd_sb_csp_unload()
473 p->acc_format = 0; in snd_sb_csp_unload()
474 p->acc_channels = p->acc_width = p->acc_rates = 0; in snd_sb_csp_unload()
476 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_unload()
477 snd_sb_qsound_destroy(p); in snd_sb_csp_unload()
480 p->running = 0; in snd_sb_csp_unload()
481 p->mode = 0; in snd_sb_csp_unload()
609 static int snd_sb_csp_check_version(struct snd_sb_csp * p) in snd_sb_csp_check_version() argument
611 if (p->version < 0x10 || p->version > 0x1f) { in snd_sb_csp_check_version()
612 snd_printd("%s: Invalid CSP version: 0x%x\n", __func__, p->version); in snd_sb_csp_check_version()
621 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
628 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_load()
629 snd_sbdsp_command(p->chip, 0x01); /* CSP download command */ in snd_sb_csp_load()
630 if (snd_sbdsp_get_byte(p->chip)) { in snd_sb_csp_load()
635 snd_sbdsp_command(p->chip, (unsigned char)(size - 1)); in snd_sb_csp_load()
637 snd_sbdsp_command(p->chip, (unsigned char)((size - 1) >> 8)); in snd_sb_csp_load()
641 if (!snd_sbdsp_command(p->chip, *buf++)) in snd_sb_csp_load()
644 if (snd_sbdsp_get_byte(p->chip)) in snd_sb_csp_load()
651 snd_sbdsp_command(p->chip, 0x03); in snd_sb_csp_load()
652 status = snd_sbdsp_get_byte(p->chip); in snd_sb_csp_load()
667 spin_lock(&p->chip->mixer_lock); in snd_sb_csp_load()
668 status = snd_sbmixer_read(p->chip, SB_DSP4_DMASETUP); in snd_sb_csp_load()
669 spin_unlock(&p->chip->mixer_lock); in snd_sb_csp_load()
671 err = (set_codec_parameter(p->chip, 0xaa, 0x00) || in snd_sb_csp_load()
672 set_codec_parameter(p->chip, 0xff, 0x00)); in snd_sb_csp_load()
673 snd_sbdsp_reset(p->chip); /* really! */ in snd_sb_csp_load()
676 set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_load()
677 set_mode_register(p->chip, 0x70); /* 70 = RUN */ in snd_sb_csp_load()
683 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_load()
687 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
696 err = snd_sb_csp_load(p, kbuf, size, load_flags); in snd_sb_csp_load_user()
702 static int snd_sb_csp_firmware_load(struct snd_sb_csp *p, int index, int flags) in snd_sb_csp_firmware_load() argument
714 program = p->csp_programs[index]; in snd_sb_csp_firmware_load()
717 p->chip->card->dev); in snd_sb_csp_firmware_load()
720 p->csp_programs[index] = program; in snd_sb_csp_firmware_load()
722 return snd_sb_csp_load(p, program->data, program->size, flags); in snd_sb_csp_firmware_load()
729 static int snd_sb_csp_autoload(struct snd_sb_csp * p, int pcm_sfmt, int play_rec_mode) in snd_sb_csp_autoload() argument
735 if (p->running & (SNDRV_SB_CSP_ST_RUNNING | SNDRV_SB_CSP_ST_LOADED)) in snd_sb_csp_autoload()
739 if (((1 << pcm_sfmt) & p->acc_format) && (play_rec_mode & p->mode)) { in snd_sb_csp_autoload()
740 p->running = SNDRV_SB_CSP_ST_AUTO; in snd_sb_csp_autoload()
744 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_MULAW, 0); in snd_sb_csp_autoload()
745 p->acc_format = SNDRV_PCM_FMTBIT_MU_LAW; in snd_sb_csp_autoload()
746 p->mode = SNDRV_SB_CSP_MODE_DSP_READ | SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
749 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_ALAW, 0); in snd_sb_csp_autoload()
750 p->acc_format = SNDRV_PCM_FMTBIT_A_LAW; in snd_sb_csp_autoload()
751 p->mode = SNDRV_SB_CSP_MODE_DSP_READ | SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
754 err = snd_sb_csp_firmware_load(p, CSP_PROGRAM_ADPCM_INIT, in snd_sb_csp_autoload()
760 (p, CSP_PROGRAM_ADPCM_PLAYBACK, 0); in snd_sb_csp_autoload()
761 p->mode = SNDRV_SB_CSP_MODE_DSP_WRITE; in snd_sb_csp_autoload()
764 (p, CSP_PROGRAM_ADPCM_CAPTURE, 0); in snd_sb_csp_autoload()
765 p->mode = SNDRV_SB_CSP_MODE_DSP_READ; in snd_sb_csp_autoload()
767 p->acc_format = SNDRV_PCM_FMTBIT_IMA_ADPCM; in snd_sb_csp_autoload()
771 if (p->running & SNDRV_SB_CSP_ST_AUTO) { in snd_sb_csp_autoload()
772 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_autoload()
773 set_mode_register(p->chip, 0xfc); in snd_sb_csp_autoload()
774 set_mode_register(p->chip, 0x00); in snd_sb_csp_autoload()
775 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_autoload()
776 p->running = 0; /* clear autoloaded flag */ in snd_sb_csp_autoload()
781 p->acc_format = 0; in snd_sb_csp_autoload()
782 p->acc_channels = p->acc_width = p->acc_rates = 0; in snd_sb_csp_autoload()
784 p->running = 0; /* clear autoloaded flag */ in snd_sb_csp_autoload()
785 p->mode = 0; in snd_sb_csp_autoload()
788 p->running = SNDRV_SB_CSP_ST_AUTO; /* set autoloaded flag */ in snd_sb_csp_autoload()
789 p->acc_width = SNDRV_SB_CSP_SAMPLE_16BIT; /* only 16 bit data */ in snd_sb_csp_autoload()
790 p->acc_channels = SNDRV_SB_CSP_MONO | SNDRV_SB_CSP_STEREO; in snd_sb_csp_autoload()
791 p->acc_rates = SNDRV_SB_CSP_RATE_ALL; /* HW codecs accept all rates */ in snd_sb_csp_autoload()
795 return (p->running & SNDRV_SB_CSP_ST_AUTO) ? 0 : -ENXIO; in snd_sb_csp_autoload()
801 static int snd_sb_csp_start(struct snd_sb_csp * p, int sample_width, int channels) in snd_sb_csp_start() argument
808 if (!(p->running & (SNDRV_SB_CSP_ST_LOADED | SNDRV_SB_CSP_ST_AUTO))) { in snd_sb_csp_start()
812 if (p->running & SNDRV_SB_CSP_ST_RUNNING) { in snd_sb_csp_start()
816 if (!(sample_width & p->acc_width)) { in snd_sb_csp_start()
820 if (!(channels & p->acc_channels)) { in snd_sb_csp_start()
826 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
827 mixL = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV); in snd_sb_csp_start()
828 mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1); in snd_sb_csp_start()
829 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7); in snd_sb_csp_start()
830 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7); in snd_sb_csp_start()
832 spin_lock(&p->chip->reg_lock); in snd_sb_csp_start()
833 set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_start()
834 set_mode_register(p->chip, 0x70); /* 70 = RUN */ in snd_sb_csp_start()
842 if (set_codec_parameter(p->chip, 0x81, s_type)) { in snd_sb_csp_start()
846 if (set_codec_parameter(p->chip, 0x80, 0x00)) { in snd_sb_csp_start()
850 p->run_width = sample_width; in snd_sb_csp_start()
851 p->run_channels = channels; in snd_sb_csp_start()
853 p->running |= SNDRV_SB_CSP_ST_RUNNING; in snd_sb_csp_start()
855 if (p->mode & SNDRV_SB_CSP_MODE_QSOUND) { in snd_sb_csp_start()
856 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_start()
858 set_codec_parameter(p->chip, 0x00, 0xff); in snd_sb_csp_start()
859 set_codec_parameter(p->chip, 0x01, 0xff); in snd_sb_csp_start()
860 p->running |= SNDRV_SB_CSP_ST_QSOUND; in snd_sb_csp_start()
862 snd_sb_csp_qsound_transfer(p); in snd_sb_csp_start()
867 spin_unlock(&p->chip->reg_lock); in snd_sb_csp_start()
870 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL); in snd_sb_csp_start()
871 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR); in snd_sb_csp_start()
872 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_start()
880 static int snd_sb_csp_stop(struct snd_sb_csp * p) in snd_sb_csp_stop() argument
886 if (!(p->running & SNDRV_SB_CSP_ST_RUNNING)) in snd_sb_csp_stop()
890 spin_lock_irqsave(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
891 mixL = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV); in snd_sb_csp_stop()
892 mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1); in snd_sb_csp_stop()
893 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7); in snd_sb_csp_stop()
894 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7); in snd_sb_csp_stop()
896 spin_lock(&p->chip->reg_lock); in snd_sb_csp_stop()
897 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in snd_sb_csp_stop()
898 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_stop()
900 set_codec_parameter(p->chip, 0x00, 0x00); in snd_sb_csp_stop()
901 set_codec_parameter(p->chip, 0x01, 0x00); in snd_sb_csp_stop()
903 p->running &= ~SNDRV_SB_CSP_ST_QSOUND; in snd_sb_csp_stop()
905 result = set_mode_register(p->chip, 0xc0); /* c0 = STOP */ in snd_sb_csp_stop()
906 spin_unlock(&p->chip->reg_lock); in snd_sb_csp_stop()
909 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL); in snd_sb_csp_stop()
910 snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR); in snd_sb_csp_stop()
911 spin_unlock_irqrestore(&p->chip->mixer_lock, flags); in snd_sb_csp_stop()
914 p->running &= ~(SNDRV_SB_CSP_ST_PAUSED | SNDRV_SB_CSP_ST_RUNNING); in snd_sb_csp_stop()
921 static int snd_sb_csp_pause(struct snd_sb_csp * p) in snd_sb_csp_pause() argument
926 if (!(p->running & SNDRV_SB_CSP_ST_RUNNING)) in snd_sb_csp_pause()
929 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_pause()
930 result = set_codec_parameter(p->chip, 0x80, 0xff); in snd_sb_csp_pause()
931 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_pause()
933 p->running |= SNDRV_SB_CSP_ST_PAUSED; in snd_sb_csp_pause()
941 static int snd_sb_csp_restart(struct snd_sb_csp * p) in snd_sb_csp_restart() argument
946 if (!(p->running & SNDRV_SB_CSP_ST_PAUSED)) in snd_sb_csp_restart()
949 spin_lock_irqsave(&p->chip->reg_lock, flags); in snd_sb_csp_restart()
950 result = set_codec_parameter(p->chip, 0x80, 0x00); in snd_sb_csp_restart()
951 spin_unlock_irqrestore(&p->chip->reg_lock, flags); in snd_sb_csp_restart()
953 p->running &= ~SNDRV_SB_CSP_ST_PAUSED; in snd_sb_csp_restart()
968 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_switch_get() local
970 ucontrol->value.integer.value[0] = p->q_enabled ? 1 : 0; in snd_sb_qsound_switch_get()
976 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_switch_put() local
982 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_switch_put()
983 change = p->q_enabled != nval; in snd_sb_qsound_switch_put()
984 p->q_enabled = nval; in snd_sb_qsound_switch_put()
985 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_switch_put()
1000 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_space_get() local
1003 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_space_get()
1004 ucontrol->value.integer.value[0] = p->qpos_left; in snd_sb_qsound_space_get()
1005 ucontrol->value.integer.value[1] = p->qpos_right; in snd_sb_qsound_space_get()
1006 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_space_get()
1012 struct snd_sb_csp *p = snd_kcontrol_chip(kcontrol); in snd_sb_qsound_space_put() local
1023 spin_lock_irqsave(&p->q_lock, flags); in snd_sb_qsound_space_put()
1024 change = p->qpos_left != nval1 || p->qpos_right != nval2; in snd_sb_qsound_space_put()
1025 p->qpos_left = nval1; in snd_sb_qsound_space_put()
1026 p->qpos_right = nval2; in snd_sb_qsound_space_put()
1027 p->qpos_changed = change; in snd_sb_qsound_space_put()
1028 spin_unlock_irqrestore(&p->q_lock, flags); in snd_sb_qsound_space_put()
1048 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 if ((err = snd_ctl_add(card, p->qsound_switch = snd_ctl_new1(&snd_sb_qsound_switch, p))) < 0) in snd_sb_qsound_build()
1064 if ((err = snd_ctl_add(card, p->qsound_space = snd_ctl_new1(&snd_sb_qsound_space, p))) < 0) in snd_sb_qsound_build()
1070 snd_sb_qsound_destroy(p); in snd_sb_qsound_build()
1074 static void snd_sb_qsound_destroy(struct snd_sb_csp * p) in snd_sb_qsound_destroy() argument
1079 if (snd_BUG_ON(!p)) in snd_sb_qsound_destroy()
1082 card = p->chip->card; in snd_sb_qsound_destroy()
1085 if (p->qsound_switch) in snd_sb_qsound_destroy()
1086 snd_ctl_remove(card, p->qsound_switch); in snd_sb_qsound_destroy()
1087 if (p->qsound_space) in snd_sb_qsound_destroy()
1088 snd_ctl_remove(card, p->qsound_space); in snd_sb_qsound_destroy()
1092 spin_lock_irqsave (&p->q_lock, flags); in snd_sb_qsound_destroy()
1093 p->qpos_changed = 0; in snd_sb_qsound_destroy()
1094 spin_unlock_irqrestore (&p->q_lock, flags); in snd_sb_qsound_destroy()
1101 static int snd_sb_csp_qsound_transfer(struct snd_sb_csp * p) in snd_sb_csp_qsound_transfer() argument
1105 spin_lock(&p->q_lock); in snd_sb_csp_qsound_transfer()
1106 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in snd_sb_csp_qsound_transfer()
1107 set_codec_parameter(p->chip, 0xe0, 0x01); in snd_sb_csp_qsound_transfer()
1109 set_codec_parameter(p->chip, 0x00, p->qpos_left); in snd_sb_csp_qsound_transfer()
1110 set_codec_parameter(p->chip, 0x02, 0x00); in snd_sb_csp_qsound_transfer()
1112 set_codec_parameter(p->chip, 0x00, p->qpos_right); in snd_sb_csp_qsound_transfer()
1113 set_codec_parameter(p->chip, 0x03, 0x00); in snd_sb_csp_qsound_transfer()
1116 p->qpos_changed = 0; in snd_sb_csp_qsound_transfer()
1117 spin_unlock(&p->q_lock); in snd_sb_csp_qsound_transfer()
1126 static int init_proc_entry(struct snd_sb_csp * p, int device) in init_proc_entry() argument
1131 if (! snd_card_proc_new(p->chip->card, name, &entry)) in init_proc_entry()
1132 snd_info_set_text_ops(entry, p, info_read); in init_proc_entry()
1138 struct snd_sb_csp *p = entry->private_data; in info_read() local
1140 …snd_iprintf(buffer, "Creative Signal Processor [v%d.%d]\n", (p->version >> 4), (p->version & 0x0f)… in info_read()
1141 snd_iprintf(buffer, "State: %cx%c%c%c\n", ((p->running & SNDRV_SB_CSP_ST_QSOUND) ? 'Q' : '-'), in info_read()
1142 ((p->running & SNDRV_SB_CSP_ST_PAUSED) ? 'P' : '-'), in info_read()
1143 ((p->running & SNDRV_SB_CSP_ST_RUNNING) ? 'R' : '-'), in info_read()
1144 ((p->running & SNDRV_SB_CSP_ST_LOADED) ? 'L' : '-')); in info_read()
1145 if (p->running & SNDRV_SB_CSP_ST_LOADED) { in info_read()
1146 snd_iprintf(buffer, "Codec: %s [func #%d]\n", p->codec_name, p->func_nr); in info_read()
1148 if (p->acc_rates == SNDRV_SB_CSP_RATE_ALL) { in info_read()
1152 ((p->acc_rates & SNDRV_SB_CSP_RATE_8000) ? "8000Hz " : ""), in info_read()
1153 ((p->acc_rates & SNDRV_SB_CSP_RATE_11025) ? "11025Hz " : ""), in info_read()
1154 ((p->acc_rates & SNDRV_SB_CSP_RATE_22050) ? "22050Hz " : ""), in info_read()
1155 ((p->acc_rates & SNDRV_SB_CSP_RATE_44100) ? "44100Hz" : "")); in info_read()
1157 if (p->mode == SNDRV_SB_CSP_MODE_QSOUND) { in info_read()
1159 p->q_enabled ? "en" : "dis"); in info_read()
1162 p->acc_format, in info_read()
1163 ((p->acc_width & SNDRV_SB_CSP_SAMPLE_16BIT) ? "16bit" : "-"), in info_read()
1164 ((p->acc_width & SNDRV_SB_CSP_SAMPLE_8BIT) ? "8bit" : "-"), in info_read()
1165 ((p->acc_channels & SNDRV_SB_CSP_MONO) ? "mono" : "-"), in info_read()
1166 ((p->acc_channels & SNDRV_SB_CSP_STEREO) ? "stereo" : "-"), in info_read()
1167 ((p->mode & SNDRV_SB_CSP_MODE_DSP_WRITE) ? "playback" : "-"), in info_read()
1168 ((p->mode & SNDRV_SB_CSP_MODE_DSP_READ) ? "capture" : "-")); in info_read()
1171 if (p->running & SNDRV_SB_CSP_ST_AUTO) { in info_read()
1174 if (p->running & SNDRV_SB_CSP_ST_RUNNING) { in info_read()
1176 ((p->run_width & SNDRV_SB_CSP_SAMPLE_16BIT) ? 16 : 8), in info_read()
1177 ((p->run_channels & SNDRV_SB_CSP_MONO) ? "mono" : "stereo")); in info_read()
1179 if (p->running & SNDRV_SB_CSP_ST_QSOUND) { in info_read()
1181 p->qpos_left, p->qpos_right); in info_read()