root/sound/isa/sb/sb16_main.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. snd_sb16_csp_playback_prepare
  2. snd_sb16_csp_capture_prepare
  3. snd_sb16_csp_update
  4. snd_sb16_csp_playback_open
  5. snd_sb16_csp_playback_close
  6. snd_sb16_csp_capture_open
  7. snd_sb16_csp_capture_close
  8. snd_sb16_setup_rate
  9. snd_sb16_hw_params
  10. snd_sb16_hw_free
  11. snd_sb16_playback_prepare
  12. snd_sb16_playback_trigger
  13. snd_sb16_capture_prepare
  14. snd_sb16_capture_trigger
  15. snd_sb16dsp_interrupt
  16. snd_sb16_playback_pointer
  17. snd_sb16_capture_pointer
  18. snd_sb16_playback_open
  19. snd_sb16_playback_close
  20. snd_sb16_capture_open
  21. snd_sb16_capture_close
  22. snd_sb16_set_dma_mode
  23. snd_sb16_get_dma_mode
  24. snd_sb16_dma_control_info
  25. snd_sb16_dma_control_get
  26. snd_sb16_dma_control_put
  27. snd_sb16dsp_configure
  28. snd_sb16dsp_pcm
  29. snd_sb16dsp_get_pcm_ops

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   4  *  Routines for control of 16-bit SoundBlaster cards and clones
   5  *  Note: This is very ugly hardware which uses one 8-bit DMA channel and
   6  *        second 16-bit DMA channel. Unfortunately 8-bit DMA channel can't
   7  *        transfer 16-bit samples and 16-bit DMA channels can't transfer
   8  *        8-bit samples. This make full duplex more complicated than
   9  *        can be... People, don't buy these soundcards for full 16-bit
  10  *        duplex!!!
  11  *  Note: 16-bit wide is assigned to first direction which made request.
  12  *        With full duplex - playback is preferred with abstract layer.
  13  *
  14  *  Note: Some chip revisions have hardware bug. Changing capture
  15  *        channel from full-duplex 8bit DMA to 16bit DMA will block
  16  *        16bit DMA transfers from DSP chip (capture) until 8bit transfer
  17  *        to DSP chip (playback) starts. This bug can be avoided with
  18  *        "16bit DMA Allocation" setting set to Playback or Capture.
  19  */
  20 
  21 #include <linux/io.h>
  22 #include <asm/dma.h>
  23 #include <linux/init.h>
  24 #include <linux/time.h>
  25 #include <linux/module.h>
  26 #include <sound/core.h>
  27 #include <sound/sb.h>
  28 #include <sound/sb16_csp.h>
  29 #include <sound/mpu401.h>
  30 #include <sound/control.h>
  31 #include <sound/info.h>
  32 
  33 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
  34 MODULE_DESCRIPTION("Routines for control of 16-bit SoundBlaster cards and clones");
  35 MODULE_LICENSE("GPL");
  36 
  37 #define runtime_format_bits(runtime) \
  38         ((unsigned int)pcm_format_to_bits((runtime)->format))
  39 
  40 #ifdef CONFIG_SND_SB16_CSP
  41 static void snd_sb16_csp_playback_prepare(struct snd_sb *chip, struct snd_pcm_runtime *runtime)
  42 {
  43         if (chip->hardware == SB_HW_16CSP) {
  44                 struct snd_sb_csp *csp = chip->csp;
  45 
  46                 if (csp->running & SNDRV_SB_CSP_ST_LOADED) {
  47                         /* manually loaded codec */
  48                         if ((csp->mode & SNDRV_SB_CSP_MODE_DSP_WRITE) &&
  49                             (runtime_format_bits(runtime) == csp->acc_format)) {
  50                                 /* Supported runtime PCM format for playback */
  51                                 if (csp->ops.csp_use(csp) == 0) {
  52                                         /* If CSP was successfully acquired */
  53                                         goto __start_CSP;
  54                                 }
  55                         } else if ((csp->mode & SNDRV_SB_CSP_MODE_QSOUND) && (csp->q_enabled)) {
  56                                 /* QSound decoder is loaded and enabled */
  57                                 if (runtime_format_bits(runtime) & (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 |
  58                                                               SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE)) {
  59                                         /* Only for simple PCM formats */
  60                                         if (csp->ops.csp_use(csp) == 0) {
  61                                                 /* If CSP was successfully acquired */
  62                                                 goto __start_CSP;
  63                                         }
  64                                 }
  65                         }
  66                 } else if (csp->ops.csp_use(csp) == 0) {
  67                         /* Acquire CSP and try to autoload hardware codec */
  68                         if (csp->ops.csp_autoload(csp, runtime->format, SNDRV_SB_CSP_MODE_DSP_WRITE)) {
  69                                 /* Unsupported format, release CSP */
  70                                 csp->ops.csp_unuse(csp);
  71                         } else {
  72                       __start_CSP:
  73                                 /* Try to start CSP */
  74                                 if (csp->ops.csp_start(csp, (chip->mode & SB_MODE_PLAYBACK_16) ?
  75                                                        SNDRV_SB_CSP_SAMPLE_16BIT : SNDRV_SB_CSP_SAMPLE_8BIT,
  76                                                        (runtime->channels > 1) ?
  77                                                        SNDRV_SB_CSP_STEREO : SNDRV_SB_CSP_MONO)) {
  78                                         /* Failed, release CSP */
  79                                         csp->ops.csp_unuse(csp);
  80                                 } else {
  81                                         /* Success, CSP acquired and running */
  82                                         chip->open = SNDRV_SB_CSP_MODE_DSP_WRITE;
  83                                 }
  84                         }
  85                 }
  86         }
  87 }
  88 
  89 static void snd_sb16_csp_capture_prepare(struct snd_sb *chip, struct snd_pcm_runtime *runtime)
  90 {
  91         if (chip->hardware == SB_HW_16CSP) {
  92                 struct snd_sb_csp *csp = chip->csp;
  93 
  94                 if (csp->running & SNDRV_SB_CSP_ST_LOADED) {
  95                         /* manually loaded codec */
  96                         if ((csp->mode & SNDRV_SB_CSP_MODE_DSP_READ) &&
  97                             (runtime_format_bits(runtime) == csp->acc_format)) {
  98                                 /* Supported runtime PCM format for capture */
  99                                 if (csp->ops.csp_use(csp) == 0) {
 100                                         /* If CSP was successfully acquired */
 101                                         goto __start_CSP;
 102                                 }
 103                         }
 104                 } else if (csp->ops.csp_use(csp) == 0) {
 105                         /* Acquire CSP and try to autoload hardware codec */
 106                         if (csp->ops.csp_autoload(csp, runtime->format, SNDRV_SB_CSP_MODE_DSP_READ)) {
 107                                 /* Unsupported format, release CSP */
 108                                 csp->ops.csp_unuse(csp);
 109                         } else {
 110                       __start_CSP:
 111                                 /* Try to start CSP */
 112                                 if (csp->ops.csp_start(csp, (chip->mode & SB_MODE_CAPTURE_16) ?
 113                                                        SNDRV_SB_CSP_SAMPLE_16BIT : SNDRV_SB_CSP_SAMPLE_8BIT,
 114                                                        (runtime->channels > 1) ?
 115                                                        SNDRV_SB_CSP_STEREO : SNDRV_SB_CSP_MONO)) {
 116                                         /* Failed, release CSP */
 117                                         csp->ops.csp_unuse(csp);
 118                                 } else {
 119                                         /* Success, CSP acquired and running */
 120                                         chip->open = SNDRV_SB_CSP_MODE_DSP_READ;
 121                                 }
 122                         }
 123                 }
 124         }
 125 }
 126 
 127 static void snd_sb16_csp_update(struct snd_sb *chip)
 128 {
 129         if (chip->hardware == SB_HW_16CSP) {
 130                 struct snd_sb_csp *csp = chip->csp;
 131 
 132                 if (csp->qpos_changed) {
 133                         spin_lock(&chip->reg_lock);
 134                         csp->ops.csp_qsound_transfer (csp);
 135                         spin_unlock(&chip->reg_lock);
 136                 }
 137         }
 138 }
 139 
 140 static void snd_sb16_csp_playback_open(struct snd_sb *chip, struct snd_pcm_runtime *runtime)
 141 {
 142         /* CSP decoders (QSound excluded) support only 16bit transfers */
 143         if (chip->hardware == SB_HW_16CSP) {
 144                 struct snd_sb_csp *csp = chip->csp;
 145 
 146                 if (csp->running & SNDRV_SB_CSP_ST_LOADED) {
 147                         /* manually loaded codec */
 148                         if (csp->mode & SNDRV_SB_CSP_MODE_DSP_WRITE) {
 149                                 runtime->hw.formats |= csp->acc_format;
 150                         }
 151                 } else {
 152                         /* autoloaded codecs */
 153                         runtime->hw.formats |= SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW |
 154                                                SNDRV_PCM_FMTBIT_IMA_ADPCM;
 155                 }
 156         }
 157 }
 158 
 159 static void snd_sb16_csp_playback_close(struct snd_sb *chip)
 160 {
 161         if ((chip->hardware == SB_HW_16CSP) && (chip->open == SNDRV_SB_CSP_MODE_DSP_WRITE)) {
 162                 struct snd_sb_csp *csp = chip->csp;
 163 
 164                 if (csp->ops.csp_stop(csp) == 0) {
 165                         csp->ops.csp_unuse(csp);
 166                         chip->open = 0;
 167                 }
 168         }
 169 }
 170 
 171 static void snd_sb16_csp_capture_open(struct snd_sb *chip, struct snd_pcm_runtime *runtime)
 172 {
 173         /* CSP coders support only 16bit transfers */
 174         if (chip->hardware == SB_HW_16CSP) {
 175                 struct snd_sb_csp *csp = chip->csp;
 176 
 177                 if (csp->running & SNDRV_SB_CSP_ST_LOADED) {
 178                         /* manually loaded codec */
 179                         if (csp->mode & SNDRV_SB_CSP_MODE_DSP_READ) {
 180                                 runtime->hw.formats |= csp->acc_format;
 181                         }
 182                 } else {
 183                         /* autoloaded codecs */
 184                         runtime->hw.formats |= SNDRV_PCM_FMTBIT_MU_LAW | SNDRV_PCM_FMTBIT_A_LAW |
 185                                                SNDRV_PCM_FMTBIT_IMA_ADPCM;
 186                 }
 187         }
 188 }
 189 
 190 static void snd_sb16_csp_capture_close(struct snd_sb *chip)
 191 {
 192         if ((chip->hardware == SB_HW_16CSP) && (chip->open == SNDRV_SB_CSP_MODE_DSP_READ)) {
 193                 struct snd_sb_csp *csp = chip->csp;
 194 
 195                 if (csp->ops.csp_stop(csp) == 0) {
 196                         csp->ops.csp_unuse(csp);
 197                         chip->open = 0;
 198                 }
 199         }
 200 }
 201 #else
 202 #define snd_sb16_csp_playback_prepare(chip, runtime)    /*nop*/
 203 #define snd_sb16_csp_capture_prepare(chip, runtime)     /*nop*/
 204 #define snd_sb16_csp_update(chip)                       /*nop*/
 205 #define snd_sb16_csp_playback_open(chip, runtime)       /*nop*/
 206 #define snd_sb16_csp_playback_close(chip)               /*nop*/
 207 #define snd_sb16_csp_capture_open(chip, runtime)        /*nop*/
 208 #define snd_sb16_csp_capture_close(chip)                /*nop*/
 209 #endif
 210 
 211 
 212 static void snd_sb16_setup_rate(struct snd_sb *chip,
 213                                 unsigned short rate,
 214                                 int channel)
 215 {
 216         unsigned long flags;
 217 
 218         spin_lock_irqsave(&chip->reg_lock, flags);
 219         if (chip->mode & (channel == SNDRV_PCM_STREAM_PLAYBACK ? SB_MODE_PLAYBACK_16 : SB_MODE_CAPTURE_16))
 220                 snd_sb_ack_16bit(chip);
 221         else
 222                 snd_sb_ack_8bit(chip);
 223         if (!(chip->mode & SB_RATE_LOCK)) {
 224                 chip->locked_rate = rate;
 225                 snd_sbdsp_command(chip, SB_DSP_SAMPLE_RATE_IN);
 226                 snd_sbdsp_command(chip, rate >> 8);
 227                 snd_sbdsp_command(chip, rate & 0xff);
 228                 snd_sbdsp_command(chip, SB_DSP_SAMPLE_RATE_OUT);
 229                 snd_sbdsp_command(chip, rate >> 8);
 230                 snd_sbdsp_command(chip, rate & 0xff);
 231         }
 232         spin_unlock_irqrestore(&chip->reg_lock, flags);
 233 }
 234 
 235 static int snd_sb16_hw_params(struct snd_pcm_substream *substream,
 236                               struct snd_pcm_hw_params *hw_params)
 237 {
 238         return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
 239 }
 240 
 241 static int snd_sb16_hw_free(struct snd_pcm_substream *substream)
 242 {
 243         snd_pcm_lib_free_pages(substream);
 244         return 0;
 245 }
 246 
 247 static int snd_sb16_playback_prepare(struct snd_pcm_substream *substream)
 248 {
 249         unsigned long flags;
 250         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 251         struct snd_pcm_runtime *runtime = substream->runtime;
 252         unsigned char format;
 253         unsigned int size, count, dma;
 254 
 255         snd_sb16_csp_playback_prepare(chip, runtime);
 256         if (snd_pcm_format_unsigned(runtime->format) > 0) {
 257                 format = runtime->channels > 1 ? SB_DSP4_MODE_UNS_STEREO : SB_DSP4_MODE_UNS_MONO;
 258         } else {
 259                 format = runtime->channels > 1 ? SB_DSP4_MODE_SIGN_STEREO : SB_DSP4_MODE_SIGN_MONO;
 260         }
 261 
 262         snd_sb16_setup_rate(chip, runtime->rate, SNDRV_PCM_STREAM_PLAYBACK);
 263         size = chip->p_dma_size = snd_pcm_lib_buffer_bytes(substream);
 264         dma = (chip->mode & SB_MODE_PLAYBACK_8) ? chip->dma8 : chip->dma16;
 265         snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT);
 266 
 267         count = snd_pcm_lib_period_bytes(substream);
 268         spin_lock_irqsave(&chip->reg_lock, flags);
 269         if (chip->mode & SB_MODE_PLAYBACK_16) {
 270                 count >>= 1;
 271                 count--;
 272                 snd_sbdsp_command(chip, SB_DSP4_OUT16_AI);
 273                 snd_sbdsp_command(chip, format);
 274                 snd_sbdsp_command(chip, count & 0xff);
 275                 snd_sbdsp_command(chip, count >> 8);
 276                 snd_sbdsp_command(chip, SB_DSP_DMA16_OFF);
 277         } else {
 278                 count--;
 279                 snd_sbdsp_command(chip, SB_DSP4_OUT8_AI);
 280                 snd_sbdsp_command(chip, format);
 281                 snd_sbdsp_command(chip, count & 0xff);
 282                 snd_sbdsp_command(chip, count >> 8);
 283                 snd_sbdsp_command(chip, SB_DSP_DMA8_OFF);
 284         }
 285         spin_unlock_irqrestore(&chip->reg_lock, flags);
 286         return 0;
 287 }
 288 
 289 static int snd_sb16_playback_trigger(struct snd_pcm_substream *substream,
 290                                      int cmd)
 291 {
 292         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 293         int result = 0;
 294 
 295         spin_lock(&chip->reg_lock);
 296         switch (cmd) {
 297         case SNDRV_PCM_TRIGGER_START:
 298         case SNDRV_PCM_TRIGGER_RESUME:
 299                 chip->mode |= SB_RATE_LOCK_PLAYBACK;
 300                 snd_sbdsp_command(chip, chip->mode & SB_MODE_PLAYBACK_16 ? SB_DSP_DMA16_ON : SB_DSP_DMA8_ON);
 301                 break;
 302         case SNDRV_PCM_TRIGGER_STOP:
 303         case SNDRV_PCM_TRIGGER_SUSPEND:
 304                 snd_sbdsp_command(chip, chip->mode & SB_MODE_PLAYBACK_16 ? SB_DSP_DMA16_OFF : SB_DSP_DMA8_OFF);
 305                 /* next two lines are needed for some types of DSP4 (SB AWE 32 - 4.13) */
 306                 if (chip->mode & SB_RATE_LOCK_CAPTURE)
 307                         snd_sbdsp_command(chip, chip->mode & SB_MODE_CAPTURE_16 ? SB_DSP_DMA16_ON : SB_DSP_DMA8_ON);
 308                 chip->mode &= ~SB_RATE_LOCK_PLAYBACK;
 309                 break;
 310         default:
 311                 result = -EINVAL;
 312         }
 313         spin_unlock(&chip->reg_lock);
 314         return result;
 315 }
 316 
 317 static int snd_sb16_capture_prepare(struct snd_pcm_substream *substream)
 318 {
 319         unsigned long flags;
 320         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 321         struct snd_pcm_runtime *runtime = substream->runtime;
 322         unsigned char format;
 323         unsigned int size, count, dma;
 324 
 325         snd_sb16_csp_capture_prepare(chip, runtime);
 326         if (snd_pcm_format_unsigned(runtime->format) > 0) {
 327                 format = runtime->channels > 1 ? SB_DSP4_MODE_UNS_STEREO : SB_DSP4_MODE_UNS_MONO;
 328         } else {
 329                 format = runtime->channels > 1 ? SB_DSP4_MODE_SIGN_STEREO : SB_DSP4_MODE_SIGN_MONO;
 330         }
 331         snd_sb16_setup_rate(chip, runtime->rate, SNDRV_PCM_STREAM_CAPTURE);
 332         size = chip->c_dma_size = snd_pcm_lib_buffer_bytes(substream);
 333         dma = (chip->mode & SB_MODE_CAPTURE_8) ? chip->dma8 : chip->dma16;
 334         snd_dma_program(dma, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT);
 335 
 336         count = snd_pcm_lib_period_bytes(substream);
 337         spin_lock_irqsave(&chip->reg_lock, flags);
 338         if (chip->mode & SB_MODE_CAPTURE_16) {
 339                 count >>= 1;
 340                 count--;
 341                 snd_sbdsp_command(chip, SB_DSP4_IN16_AI);
 342                 snd_sbdsp_command(chip, format);
 343                 snd_sbdsp_command(chip, count & 0xff);
 344                 snd_sbdsp_command(chip, count >> 8);
 345                 snd_sbdsp_command(chip, SB_DSP_DMA16_OFF);
 346         } else {
 347                 count--;
 348                 snd_sbdsp_command(chip, SB_DSP4_IN8_AI);
 349                 snd_sbdsp_command(chip, format);
 350                 snd_sbdsp_command(chip, count & 0xff);
 351                 snd_sbdsp_command(chip, count >> 8);
 352                 snd_sbdsp_command(chip, SB_DSP_DMA8_OFF);
 353         }
 354         spin_unlock_irqrestore(&chip->reg_lock, flags);
 355         return 0;
 356 }
 357 
 358 static int snd_sb16_capture_trigger(struct snd_pcm_substream *substream,
 359                                     int cmd)
 360 {
 361         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 362         int result = 0;
 363 
 364         spin_lock(&chip->reg_lock);
 365         switch (cmd) {
 366         case SNDRV_PCM_TRIGGER_START:
 367         case SNDRV_PCM_TRIGGER_RESUME:
 368                 chip->mode |= SB_RATE_LOCK_CAPTURE;
 369                 snd_sbdsp_command(chip, chip->mode & SB_MODE_CAPTURE_16 ? SB_DSP_DMA16_ON : SB_DSP_DMA8_ON);
 370                 break;
 371         case SNDRV_PCM_TRIGGER_STOP:
 372         case SNDRV_PCM_TRIGGER_SUSPEND:
 373                 snd_sbdsp_command(chip, chip->mode & SB_MODE_CAPTURE_16 ? SB_DSP_DMA16_OFF : SB_DSP_DMA8_OFF);
 374                 /* next two lines are needed for some types of DSP4 (SB AWE 32 - 4.13) */
 375                 if (chip->mode & SB_RATE_LOCK_PLAYBACK)
 376                         snd_sbdsp_command(chip, chip->mode & SB_MODE_PLAYBACK_16 ? SB_DSP_DMA16_ON : SB_DSP_DMA8_ON);
 377                 chip->mode &= ~SB_RATE_LOCK_CAPTURE;
 378                 break;
 379         default:
 380                 result = -EINVAL;
 381         }
 382         spin_unlock(&chip->reg_lock);
 383         return result;
 384 }
 385 
 386 irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id)
 387 {
 388         struct snd_sb *chip = dev_id;
 389         unsigned char status;
 390         int ok;
 391 
 392         spin_lock(&chip->mixer_lock);
 393         status = snd_sbmixer_read(chip, SB_DSP4_IRQSTATUS);
 394         spin_unlock(&chip->mixer_lock);
 395         if ((status & SB_IRQTYPE_MPUIN) && chip->rmidi_callback)
 396                 chip->rmidi_callback(irq, chip->rmidi->private_data);
 397         if (status & SB_IRQTYPE_8BIT) {
 398                 ok = 0;
 399                 if (chip->mode & SB_MODE_PLAYBACK_8) {
 400                         snd_pcm_period_elapsed(chip->playback_substream);
 401                         snd_sb16_csp_update(chip);
 402                         ok++;
 403                 }
 404                 if (chip->mode & SB_MODE_CAPTURE_8) {
 405                         snd_pcm_period_elapsed(chip->capture_substream);
 406                         ok++;
 407                 }
 408                 spin_lock(&chip->reg_lock);
 409                 if (!ok)
 410                         snd_sbdsp_command(chip, SB_DSP_DMA8_OFF);
 411                 snd_sb_ack_8bit(chip);
 412                 spin_unlock(&chip->reg_lock);
 413         }
 414         if (status & SB_IRQTYPE_16BIT) {
 415                 ok = 0;
 416                 if (chip->mode & SB_MODE_PLAYBACK_16) {
 417                         snd_pcm_period_elapsed(chip->playback_substream);
 418                         snd_sb16_csp_update(chip);
 419                         ok++;
 420                 }
 421                 if (chip->mode & SB_MODE_CAPTURE_16) {
 422                         snd_pcm_period_elapsed(chip->capture_substream);
 423                         ok++;
 424                 }
 425                 spin_lock(&chip->reg_lock);
 426                 if (!ok)
 427                         snd_sbdsp_command(chip, SB_DSP_DMA16_OFF);
 428                 snd_sb_ack_16bit(chip);
 429                 spin_unlock(&chip->reg_lock);
 430         }
 431         return IRQ_HANDLED;
 432 }
 433 
 434 /*
 435 
 436  */
 437 
 438 static snd_pcm_uframes_t snd_sb16_playback_pointer(struct snd_pcm_substream *substream)
 439 {
 440         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 441         unsigned int dma;
 442         size_t ptr;
 443 
 444         dma = (chip->mode & SB_MODE_PLAYBACK_8) ? chip->dma8 : chip->dma16;
 445         ptr = snd_dma_pointer(dma, chip->p_dma_size);
 446         return bytes_to_frames(substream->runtime, ptr);
 447 }
 448 
 449 static snd_pcm_uframes_t snd_sb16_capture_pointer(struct snd_pcm_substream *substream)
 450 {
 451         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 452         unsigned int dma;
 453         size_t ptr;
 454 
 455         dma = (chip->mode & SB_MODE_CAPTURE_8) ? chip->dma8 : chip->dma16;
 456         ptr = snd_dma_pointer(dma, chip->c_dma_size);
 457         return bytes_to_frames(substream->runtime, ptr);
 458 }
 459 
 460 /*
 461 
 462  */
 463 
 464 static const struct snd_pcm_hardware snd_sb16_playback =
 465 {
 466         .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 467                                  SNDRV_PCM_INFO_MMAP_VALID),
 468         .formats =              0,
 469         .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_44100,
 470         .rate_min =             4000,
 471         .rate_max =             44100,
 472         .channels_min =         1,
 473         .channels_max =         2,
 474         .buffer_bytes_max =     (128*1024),
 475         .period_bytes_min =     64,
 476         .period_bytes_max =     (128*1024),
 477         .periods_min =          1,
 478         .periods_max =          1024,
 479         .fifo_size =            0,
 480 };
 481 
 482 static const struct snd_pcm_hardware snd_sb16_capture =
 483 {
 484         .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 485                                  SNDRV_PCM_INFO_MMAP_VALID),
 486         .formats =              0,
 487         .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_44100,
 488         .rate_min =             4000,
 489         .rate_max =             44100,
 490         .channels_min =         1,
 491         .channels_max =         2,
 492         .buffer_bytes_max =     (128*1024),
 493         .period_bytes_min =     64,
 494         .period_bytes_max =     (128*1024),
 495         .periods_min =          1,
 496         .periods_max =          1024,
 497         .fifo_size =            0,
 498 };
 499 
 500 /*
 501  *  open/close
 502  */
 503 
 504 static int snd_sb16_playback_open(struct snd_pcm_substream *substream)
 505 {
 506         unsigned long flags;
 507         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 508         struct snd_pcm_runtime *runtime = substream->runtime;
 509 
 510         spin_lock_irqsave(&chip->open_lock, flags);
 511         if (chip->mode & SB_MODE_PLAYBACK) {
 512                 spin_unlock_irqrestore(&chip->open_lock, flags);
 513                 return -EAGAIN;
 514         }
 515         runtime->hw = snd_sb16_playback;
 516 
 517         /* skip if 16 bit DMA was reserved for capture */
 518         if (chip->force_mode16 & SB_MODE_CAPTURE_16)
 519                 goto __skip_16bit;
 520 
 521         if (chip->dma16 >= 0 && !(chip->mode & SB_MODE_CAPTURE_16)) {
 522                 chip->mode |= SB_MODE_PLAYBACK_16;
 523                 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE;
 524                 /* Vibra16X hack */
 525                 if (chip->dma16 <= 3) {
 526                         runtime->hw.buffer_bytes_max =
 527                         runtime->hw.period_bytes_max = 64 * 1024;
 528                 } else {
 529                         snd_sb16_csp_playback_open(chip, runtime);
 530                 }
 531                 goto __open_ok;
 532         }
 533 
 534       __skip_16bit:
 535         if (chip->dma8 >= 0 && !(chip->mode & SB_MODE_CAPTURE_8)) {
 536                 chip->mode |= SB_MODE_PLAYBACK_8;
 537                 /* DSP v 4.xx can transfer 16bit data through 8bit DMA channel, SBHWPG 2-7 */
 538                 if (chip->dma16 < 0) {
 539                         runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE;
 540                         chip->mode |= SB_MODE_PLAYBACK_16;
 541                 } else {
 542                         runtime->hw.formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8;
 543                 }
 544                 runtime->hw.buffer_bytes_max =
 545                 runtime->hw.period_bytes_max = 64 * 1024;
 546                 goto __open_ok;
 547         }
 548         spin_unlock_irqrestore(&chip->open_lock, flags);
 549         return -EAGAIN;
 550 
 551       __open_ok:
 552         if (chip->hardware == SB_HW_ALS100)
 553                 runtime->hw.rate_max = 48000;
 554         if (chip->hardware == SB_HW_CS5530) {
 555                 runtime->hw.buffer_bytes_max = 32 * 1024;
 556                 runtime->hw.periods_min = 2;
 557                 runtime->hw.rate_min = 44100;
 558         }
 559         if (chip->mode & SB_RATE_LOCK)
 560                 runtime->hw.rate_min = runtime->hw.rate_max = chip->locked_rate;
 561         chip->playback_substream = substream;
 562         spin_unlock_irqrestore(&chip->open_lock, flags);
 563         return 0;
 564 }
 565 
 566 static int snd_sb16_playback_close(struct snd_pcm_substream *substream)
 567 {
 568         unsigned long flags;
 569         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 570 
 571         snd_sb16_csp_playback_close(chip);
 572         spin_lock_irqsave(&chip->open_lock, flags);
 573         chip->playback_substream = NULL;
 574         chip->mode &= ~SB_MODE_PLAYBACK;
 575         spin_unlock_irqrestore(&chip->open_lock, flags);
 576         return 0;
 577 }
 578 
 579 static int snd_sb16_capture_open(struct snd_pcm_substream *substream)
 580 {
 581         unsigned long flags;
 582         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 583         struct snd_pcm_runtime *runtime = substream->runtime;
 584 
 585         spin_lock_irqsave(&chip->open_lock, flags);
 586         if (chip->mode & SB_MODE_CAPTURE) {
 587                 spin_unlock_irqrestore(&chip->open_lock, flags);
 588                 return -EAGAIN;
 589         }
 590         runtime->hw = snd_sb16_capture;
 591 
 592         /* skip if 16 bit DMA was reserved for playback */
 593         if (chip->force_mode16 & SB_MODE_PLAYBACK_16)
 594                 goto __skip_16bit;
 595 
 596         if (chip->dma16 >= 0 && !(chip->mode & SB_MODE_PLAYBACK_16)) {
 597                 chip->mode |= SB_MODE_CAPTURE_16;
 598                 runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE;
 599                 /* Vibra16X hack */
 600                 if (chip->dma16 <= 3) {
 601                         runtime->hw.buffer_bytes_max =
 602                         runtime->hw.period_bytes_max = 64 * 1024;
 603                 } else {
 604                         snd_sb16_csp_capture_open(chip, runtime);
 605                 }
 606                 goto __open_ok;
 607         }
 608 
 609       __skip_16bit:
 610         if (chip->dma8 >= 0 && !(chip->mode & SB_MODE_PLAYBACK_8)) {
 611                 chip->mode |= SB_MODE_CAPTURE_8;
 612                 /* DSP v 4.xx can transfer 16bit data through 8bit DMA channel, SBHWPG 2-7 */
 613                 if (chip->dma16 < 0) {
 614                         runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE;
 615                         chip->mode |= SB_MODE_CAPTURE_16;
 616                 } else {
 617                         runtime->hw.formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8;
 618                 }
 619                 runtime->hw.buffer_bytes_max =
 620                 runtime->hw.period_bytes_max = 64 * 1024;
 621                 goto __open_ok;
 622         }
 623         spin_unlock_irqrestore(&chip->open_lock, flags);
 624         return -EAGAIN;
 625 
 626       __open_ok:
 627         if (chip->hardware == SB_HW_ALS100)
 628                 runtime->hw.rate_max = 48000;
 629         if (chip->hardware == SB_HW_CS5530) {
 630                 runtime->hw.buffer_bytes_max = 32 * 1024;
 631                 runtime->hw.periods_min = 2;
 632                 runtime->hw.rate_min = 44100;
 633         }
 634         if (chip->mode & SB_RATE_LOCK)
 635                 runtime->hw.rate_min = runtime->hw.rate_max = chip->locked_rate;
 636         chip->capture_substream = substream;
 637         spin_unlock_irqrestore(&chip->open_lock, flags);
 638         return 0;
 639 }
 640 
 641 static int snd_sb16_capture_close(struct snd_pcm_substream *substream)
 642 {
 643         unsigned long flags;
 644         struct snd_sb *chip = snd_pcm_substream_chip(substream);
 645 
 646         snd_sb16_csp_capture_close(chip);
 647         spin_lock_irqsave(&chip->open_lock, flags);
 648         chip->capture_substream = NULL;
 649         chip->mode &= ~SB_MODE_CAPTURE;
 650         spin_unlock_irqrestore(&chip->open_lock, flags);
 651         return 0;
 652 }
 653 
 654 /*
 655  *  DMA control interface
 656  */
 657 
 658 static int snd_sb16_set_dma_mode(struct snd_sb *chip, int what)
 659 {
 660         if (chip->dma8 < 0 || chip->dma16 < 0) {
 661                 if (snd_BUG_ON(what))
 662                         return -EINVAL;
 663                 return 0;
 664         }
 665         if (what == 0) {
 666                 chip->force_mode16 = 0;
 667         } else if (what == 1) {
 668                 chip->force_mode16 = SB_MODE_PLAYBACK_16;
 669         } else if (what == 2) {
 670                 chip->force_mode16 = SB_MODE_CAPTURE_16;
 671         } else {
 672                 return -EINVAL;
 673         }
 674         return 0;
 675 }
 676 
 677 static int snd_sb16_get_dma_mode(struct snd_sb *chip)
 678 {
 679         if (chip->dma8 < 0 || chip->dma16 < 0)
 680                 return 0;
 681         switch (chip->force_mode16) {
 682         case SB_MODE_PLAYBACK_16:
 683                 return 1;
 684         case SB_MODE_CAPTURE_16:
 685                 return 2;
 686         default:
 687                 return 0;
 688         }
 689 }
 690 
 691 static int snd_sb16_dma_control_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 692 {
 693         static const char * const texts[3] = {
 694                 "Auto", "Playback", "Capture"
 695         };
 696 
 697         return snd_ctl_enum_info(uinfo, 1, 3, texts);
 698 }
 699 
 700 static int snd_sb16_dma_control_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 701 {
 702         struct snd_sb *chip = snd_kcontrol_chip(kcontrol);
 703         unsigned long flags;
 704         
 705         spin_lock_irqsave(&chip->reg_lock, flags);
 706         ucontrol->value.enumerated.item[0] = snd_sb16_get_dma_mode(chip);
 707         spin_unlock_irqrestore(&chip->reg_lock, flags);
 708         return 0;
 709 }
 710 
 711 static int snd_sb16_dma_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 712 {
 713         struct snd_sb *chip = snd_kcontrol_chip(kcontrol);
 714         unsigned long flags;
 715         unsigned char nval, oval;
 716         int change;
 717         
 718         if ((nval = ucontrol->value.enumerated.item[0]) > 2)
 719                 return -EINVAL;
 720         spin_lock_irqsave(&chip->reg_lock, flags);
 721         oval = snd_sb16_get_dma_mode(chip);
 722         change = nval != oval;
 723         snd_sb16_set_dma_mode(chip, nval);
 724         spin_unlock_irqrestore(&chip->reg_lock, flags);
 725         return change;
 726 }
 727 
 728 static const struct snd_kcontrol_new snd_sb16_dma_control = {
 729         .iface = SNDRV_CTL_ELEM_IFACE_CARD,
 730         .name = "16-bit DMA Allocation",
 731         .info = snd_sb16_dma_control_info,
 732         .get = snd_sb16_dma_control_get,
 733         .put = snd_sb16_dma_control_put
 734 };
 735 
 736 /*
 737  *  Initialization part
 738  */
 739  
 740 int snd_sb16dsp_configure(struct snd_sb * chip)
 741 {
 742         unsigned long flags;
 743         unsigned char irqreg = 0, dmareg = 0, mpureg;
 744         unsigned char realirq, realdma, realmpureg;
 745         /* note: mpu register should be present only on SB16 Vibra soundcards */
 746 
 747         // printk(KERN_DEBUG "codec->irq=%i, codec->dma8=%i, codec->dma16=%i\n", chip->irq, chip->dma8, chip->dma16);
 748         spin_lock_irqsave(&chip->mixer_lock, flags);
 749         mpureg = snd_sbmixer_read(chip, SB_DSP4_MPUSETUP) & ~0x06;
 750         spin_unlock_irqrestore(&chip->mixer_lock, flags);
 751         switch (chip->irq) {
 752         case 2:
 753         case 9:
 754                 irqreg |= SB_IRQSETUP_IRQ9;
 755                 break;
 756         case 5:
 757                 irqreg |= SB_IRQSETUP_IRQ5;
 758                 break;
 759         case 7:
 760                 irqreg |= SB_IRQSETUP_IRQ7;
 761                 break;
 762         case 10:
 763                 irqreg |= SB_IRQSETUP_IRQ10;
 764                 break;
 765         default:
 766                 return -EINVAL;
 767         }
 768         if (chip->dma8 >= 0) {
 769                 switch (chip->dma8) {
 770                 case 0:
 771                         dmareg |= SB_DMASETUP_DMA0;
 772                         break;
 773                 case 1:
 774                         dmareg |= SB_DMASETUP_DMA1;
 775                         break;
 776                 case 3:
 777                         dmareg |= SB_DMASETUP_DMA3;
 778                         break;
 779                 default:
 780                         return -EINVAL;
 781                 }
 782         }
 783         if (chip->dma16 >= 0 && chip->dma16 != chip->dma8) {
 784                 switch (chip->dma16) {
 785                 case 5:
 786                         dmareg |= SB_DMASETUP_DMA5;
 787                         break;
 788                 case 6:
 789                         dmareg |= SB_DMASETUP_DMA6;
 790                         break;
 791                 case 7:
 792                         dmareg |= SB_DMASETUP_DMA7;
 793                         break;
 794                 default:
 795                         return -EINVAL;
 796                 }
 797         }
 798         switch (chip->mpu_port) {
 799         case 0x300:
 800                 mpureg |= 0x04;
 801                 break;
 802         case 0x330:
 803                 mpureg |= 0x00;
 804                 break;
 805         default:
 806                 mpureg |= 0x02; /* disable MPU */
 807         }
 808         spin_lock_irqsave(&chip->mixer_lock, flags);
 809 
 810         snd_sbmixer_write(chip, SB_DSP4_IRQSETUP, irqreg);
 811         realirq = snd_sbmixer_read(chip, SB_DSP4_IRQSETUP);
 812 
 813         snd_sbmixer_write(chip, SB_DSP4_DMASETUP, dmareg);
 814         realdma = snd_sbmixer_read(chip, SB_DSP4_DMASETUP);
 815 
 816         snd_sbmixer_write(chip, SB_DSP4_MPUSETUP, mpureg);
 817         realmpureg = snd_sbmixer_read(chip, SB_DSP4_MPUSETUP);
 818 
 819         spin_unlock_irqrestore(&chip->mixer_lock, flags);
 820         if ((~realirq) & irqreg || (~realdma) & dmareg) {
 821                 snd_printk(KERN_ERR "SB16 [0x%lx]: unable to set DMA & IRQ (PnP device?)\n", chip->port);
 822                 snd_printk(KERN_ERR "SB16 [0x%lx]: wanted: irqreg=0x%x, dmareg=0x%x, mpureg = 0x%x\n", chip->port, realirq, realdma, realmpureg);
 823                 snd_printk(KERN_ERR "SB16 [0x%lx]:    got: irqreg=0x%x, dmareg=0x%x, mpureg = 0x%x\n", chip->port, irqreg, dmareg, mpureg);
 824                 return -ENODEV;
 825         }
 826         return 0;
 827 }
 828 
 829 static const struct snd_pcm_ops snd_sb16_playback_ops = {
 830         .open =         snd_sb16_playback_open,
 831         .close =        snd_sb16_playback_close,
 832         .ioctl =        snd_pcm_lib_ioctl,
 833         .hw_params =    snd_sb16_hw_params,
 834         .hw_free =      snd_sb16_hw_free,
 835         .prepare =      snd_sb16_playback_prepare,
 836         .trigger =      snd_sb16_playback_trigger,
 837         .pointer =      snd_sb16_playback_pointer,
 838 };
 839 
 840 static const struct snd_pcm_ops snd_sb16_capture_ops = {
 841         .open =         snd_sb16_capture_open,
 842         .close =        snd_sb16_capture_close,
 843         .ioctl =        snd_pcm_lib_ioctl,
 844         .hw_params =    snd_sb16_hw_params,
 845         .hw_free =      snd_sb16_hw_free,
 846         .prepare =      snd_sb16_capture_prepare,
 847         .trigger =      snd_sb16_capture_trigger,
 848         .pointer =      snd_sb16_capture_pointer,
 849 };
 850 
 851 int snd_sb16dsp_pcm(struct snd_sb *chip, int device)
 852 {
 853         struct snd_card *card = chip->card;
 854         struct snd_pcm *pcm;
 855         int err;
 856 
 857         if ((err = snd_pcm_new(card, "SB16 DSP", device, 1, 1, &pcm)) < 0)
 858                 return err;
 859         sprintf(pcm->name, "DSP v%i.%i", chip->version >> 8, chip->version & 0xff);
 860         pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
 861         pcm->private_data = chip;
 862         chip->pcm = pcm;
 863 
 864         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sb16_playback_ops);
 865         snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_sb16_capture_ops);
 866 
 867         if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) {
 868                 err = snd_ctl_add(card, snd_ctl_new1(
 869                                         &snd_sb16_dma_control, chip));
 870                 if (err)
 871                         return err;
 872         } else {
 873                 pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX;
 874         }
 875 
 876         snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
 877                                               card->dev,
 878                                               64*1024, 128*1024);
 879         return 0;
 880 }
 881 
 882 const struct snd_pcm_ops *snd_sb16dsp_get_pcm_ops(int direction)
 883 {
 884         return direction == SNDRV_PCM_STREAM_PLAYBACK ?
 885                 &snd_sb16_playback_ops : &snd_sb16_capture_ops;
 886 }
 887 
 888 EXPORT_SYMBOL(snd_sb16dsp_pcm);
 889 EXPORT_SYMBOL(snd_sb16dsp_get_pcm_ops);
 890 EXPORT_SYMBOL(snd_sb16dsp_configure);
 891 EXPORT_SYMBOL(snd_sb16dsp_interrupt);

/* [<][>][^][v][top][bottom][index][help] */