Merge HEAD from master.kernel.org:/pub/scm/linux/kernel/git/perex/alsa

+2033 -700
+1
Documentation/sound/alsa/ALSA-Configuration.txt
··· 132 132 mpu_irq - IRQ # for MPU-401 UART (PnP setup) 133 133 dma1 - first DMA # for AD1816A chip (PnP setup) 134 134 dma2 - second DMA # for AD1816A chip (PnP setup) 135 + clockfreq - Clock frequency for AD1816A chip (default = 0, 33000Hz) 135 136 136 137 Module supports up to 8 cards, autoprobe and PnP. 137 138
+11 -4
Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl
··· 3422 3422 3423 3423 <para> 3424 3424 The <structfield>iface</structfield> field specifies the type of 3425 - the control, 3426 - <constant>SNDRV_CTL_ELEM_IFACE_XXX</constant>. There are 3427 - <constant>MIXER</constant>, <constant>PCM</constant>, 3428 - <constant>CARD</constant>, etc. 3425 + the control, <constant>SNDRV_CTL_ELEM_IFACE_XXX</constant>, which 3426 + is usually <constant>MIXER</constant>. 3427 + Use <constant>CARD</constant> for global controls that are not 3428 + logically part of the mixer. 3429 + If the control is closely associated with some specific device on 3430 + the sound card, use <constant>HWDEP</constant>, 3431 + <constant>PCM</constant>, <constant>RAWMIDI</constant>, 3432 + <constant>TIMER</constant>, or <constant>SEQUENCER</constant>, and 3433 + specify the device number with the 3434 + <structfield>device</structfield> and 3435 + <structfield>subdevice</structfield> fields. 3429 3436 </para> 3430 3437 3431 3438 <para>
+2
include/linux/sound.h
··· 29 29 * Sound core interface functions 30 30 */ 31 31 32 + struct device; 32 33 extern int register_sound_special(struct file_operations *fops, int unit); 34 + extern int register_sound_special_device(struct file_operations *fops, int unit, struct device *dev); 33 35 extern int register_sound_mixer(struct file_operations *fops, int dev); 34 36 extern int register_sound_midi(struct file_operations *fops, int dev); 35 37 extern int register_sound_dsp(struct file_operations *fops, int dev);
+9
include/sound/ac97_codec.h
··· 26 26 */ 27 27 28 28 #include <linux/bitops.h> 29 + #include <linux/device.h> 29 30 #include "pcm.h" 30 31 #include "control.h" 31 32 #include "info.h" ··· 375 374 #define AC97_HAS_NO_PC_BEEP (1<<12) /* no PC Beep volume */ 376 375 #define AC97_HAS_NO_VIDEO (1<<13) /* no Video volume */ 377 376 #define AC97_HAS_NO_CD (1<<14) /* no CD volume */ 377 + #define AC97_HAS_NO_MIC (1<<15) /* no MIC volume */ 378 + #define AC97_HAS_NO_TONE (1<<16) /* no Tone volume */ 379 + #define AC97_HAS_NO_STD_PCM (1<<17) /* no standard AC97 PCM volume and mute */ 378 380 379 381 /* rates indexes */ 380 382 #define AC97_RATES_FRONT_DAC 0 ··· 524 520 /* jack-sharing info */ 525 521 unsigned char indep_surround; 526 522 unsigned char channel_mode; 523 + struct device dev; 527 524 }; 528 525 529 526 /* conditions */ ··· 604 599 unsigned short mask; 605 600 const char **texts; 606 601 }; 602 + 603 + /* ad hoc AC97 device driver access */ 604 + extern struct bus_type ac97_bus_type; 605 + 607 606 #endif /* __SOUND_AC97_CODEC_H */
+1
include/sound/ad1816a.h
··· 138 138 spinlock_t lock; 139 139 140 140 unsigned short mode; 141 + unsigned int clock_freq; 141 142 142 143 snd_card_t *card; 143 144 snd_pcm_t *pcm;
+5 -1
include/sound/asound.h
··· 560 560 * Timer section - /dev/snd/timer 561 561 */ 562 562 563 - #define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 4) 563 + #define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 5) 564 564 565 565 enum sndrv_timer_class { 566 566 SNDRV_TIMER_CLASS_NONE = -1, ··· 693 693 SNDRV_TIMER_EVENT_CONTINUE, /* val = resolution in ns */ 694 694 SNDRV_TIMER_EVENT_PAUSE, /* val = 0 */ 695 695 SNDRV_TIMER_EVENT_EARLY, /* val = 0, early event */ 696 + SNDRV_TIMER_EVENT_SUSPEND, /* val = 0 */ 697 + SNDRV_TIMER_EVENT_RESUME, /* val = resolution in ns */ 696 698 /* master timer events for slave timer instances */ 697 699 SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10, 698 700 SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10, 699 701 SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10, 700 702 SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10, 703 + SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10, 704 + SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10, 701 705 }; 702 706 703 707 struct sndrv_timer_tread {
+1 -1
include/sound/cs46xx.h
··· 1748 1748 int snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t **rpcm); 1749 1749 int snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t **rpcm); 1750 1750 int snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t **rpcm); 1751 - int snd_cs46xx_mixer(cs46xx_t *chip); 1751 + int snd_cs46xx_mixer(cs46xx_t *chip, int spdif_device); 1752 1752 int snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rmidi); 1753 1753 int snd_cs46xx_start_dsp(cs46xx_t *chip); 1754 1754 int snd_cs46xx_gameport(cs46xx_t *chip);
+1 -1
include/sound/emu10k1.h
··· 1178 1178 int snd_p16v_mixer(emu10k1_t * emu); 1179 1179 int snd_emu10k1_pcm_multi(emu10k1_t * emu, int device, snd_pcm_t ** rpcm); 1180 1180 int snd_emu10k1_fx8010_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm); 1181 - int snd_emu10k1_mixer(emu10k1_t * emu); 1181 + int snd_emu10k1_mixer(emu10k1_t * emu, int pcm_device, int multi_device); 1182 1182 int snd_emu10k1_timer(emu10k1_t * emu, int device); 1183 1183 int snd_emu10k1_fx8010_new(emu10k1_t *emu, int device, snd_hwdep_t ** rhwdep); 1184 1184
+4 -4
include/sound/gus.h
··· 512 512 513 513 extern void snd_gf1_write8(snd_gus_card_t * gus, unsigned char reg, unsigned char data); 514 514 extern unsigned char snd_gf1_look8(snd_gus_card_t * gus, unsigned char reg); 515 - extern inline unsigned char snd_gf1_read8(snd_gus_card_t * gus, unsigned char reg) 515 + static inline unsigned char snd_gf1_read8(snd_gus_card_t * gus, unsigned char reg) 516 516 { 517 517 return snd_gf1_look8(gus, reg | 0x80); 518 518 } 519 519 extern void snd_gf1_write16(snd_gus_card_t * gus, unsigned char reg, unsigned int data); 520 520 extern unsigned short snd_gf1_look16(snd_gus_card_t * gus, unsigned char reg); 521 - extern inline unsigned short snd_gf1_read16(snd_gus_card_t * gus, unsigned char reg) 521 + static inline unsigned short snd_gf1_read16(snd_gus_card_t * gus, unsigned char reg) 522 522 { 523 523 return snd_gf1_look16(gus, reg | 0x80); 524 524 } ··· 532 532 extern void snd_gf1_i_write8(snd_gus_card_t * gus, unsigned char reg, unsigned char data); 533 533 extern unsigned char snd_gf1_i_look8(snd_gus_card_t * gus, unsigned char reg); 534 534 extern void snd_gf1_i_write16(snd_gus_card_t * gus, unsigned char reg, unsigned int data); 535 - extern inline unsigned char snd_gf1_i_read8(snd_gus_card_t * gus, unsigned char reg) 535 + static inline unsigned char snd_gf1_i_read8(snd_gus_card_t * gus, unsigned char reg) 536 536 { 537 537 return snd_gf1_i_look8(gus, reg | 0x80); 538 538 } 539 539 extern unsigned short snd_gf1_i_look16(snd_gus_card_t * gus, unsigned char reg); 540 - extern inline unsigned short snd_gf1_i_read16(snd_gus_card_t * gus, unsigned char reg) 540 + static inline unsigned short snd_gf1_i_read16(snd_gus_card_t * gus, unsigned char reg) 541 541 { 542 542 return snd_gf1_i_look16(gus, reg | 0x80); 543 543 }
-1
include/sound/pcm.h
··· 379 379 unsigned int dma_buf_id; 380 380 size_t dma_max; 381 381 /* -- hardware operations -- */ 382 - unsigned int open_flag: 1; /* lowlevel device has been opened */ 383 382 snd_pcm_ops_t *ops; 384 383 /* -- runtime information -- */ 385 384 snd_pcm_runtime_t *runtime;
+2 -2
include/sound/version.h
··· 1 1 /* include/version.h. Generated by configure. */ 2 - #define CONFIG_SND_VERSION "1.0.9b" 3 - #define CONFIG_SND_DATE " (Thu Jul 28 12:20:13 2005 UTC)" 2 + #define CONFIG_SND_VERSION "1.0.10rc1" 3 + #define CONFIG_SND_DATE " (Tue Aug 30 05:31:08 2005 UTC)"
+6
include/sound/ymfpci.h
··· 295 295 unsigned int running: 1; 296 296 unsigned int output_front: 1; 297 297 unsigned int output_rear: 1; 298 + unsigned int update_pcm_vol; 298 299 u32 period_size; /* cached from runtime->period_size */ 299 300 u32 buffer_size; /* cached from runtime->buffer_size */ 300 301 u32 period_pos; ··· 368 367 int mode_dup4ch; 369 368 int rear_opened; 370 369 int spdif_opened; 370 + struct { 371 + u16 left; 372 + u16 right; 373 + snd_kcontrol_t *ctl; 374 + } pcm_mixer[32]; 371 375 372 376 spinlock_t reg_lock; 373 377 spinlock_t voice_lock;
+6 -6
sound/arm/pxa2xx-ac97.c
··· 132 132 udelay(10); 133 133 GCR |= GCR_WARM_RST; 134 134 pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT); 135 - udelay(50); 135 + udelay(500); 136 136 #else 137 - GCR |= GCR_WARM_RST|GCR_PRIRDY_IEN|GCR_SECRDY_IEN;; 137 + GCR |= GCR_WARM_RST|GCR_PRIRDY_IEN|GCR_SECRDY_IEN; 138 138 wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1); 139 139 #endif 140 140 ··· 261 261 return 0; 262 262 } 263 263 264 - static int pxa2xx_ac97_do_resume(snd_card_t *card, unsigned int state) 264 + static int pxa2xx_ac97_do_resume(snd_card_t *card) 265 265 { 266 266 if (card->power_state != SNDRV_CTL_POWER_D0) { 267 267 pxa2xx_audio_ops_t *platform_ops = card->dev->platform_data; ··· 275 275 return 0; 276 276 } 277 277 278 - static int pxa2xx_ac97_suspend(struct device *_dev, u32 state, u32 level) 278 + static int pxa2xx_ac97_suspend(struct device *_dev, pm_message_t state, u32 level) 279 279 { 280 280 snd_card_t *card = dev_get_drvdata(_dev); 281 281 int ret = 0; 282 282 283 283 if (card && level == SUSPEND_DISABLE) 284 - ret = pxa2xx_ac97_do_suspend(card, SNDRV_CTL_POWER_D3cold); 284 + ret = pxa2xx_ac97_do_suspend(card, PMSG_SUSPEND); 285 285 286 286 return ret; 287 287 } ··· 292 292 int ret = 0; 293 293 294 294 if (card && level == RESUME_ENABLE) 295 - ret = pxa2xx_ac97_do_resume(card, SNDRV_CTL_POWER_D0); 295 + ret = pxa2xx_ac97_do_resume(card); 296 296 297 297 return ret; 298 298 }
+2 -3
sound/core/memalloc.c
··· 512 512 * proc file interface 513 513 */ 514 514 #define SND_MEM_PROC_FILE "driver/snd-page-alloc" 515 - struct proc_dir_entry *snd_mem_proc; 515 + static struct proc_dir_entry *snd_mem_proc; 516 516 517 517 static int snd_mem_proc_read(char *page, char **start, off_t off, 518 518 int count, int *eof, void *data) ··· 655 655 656 656 static void __exit snd_mem_exit(void) 657 657 { 658 - if (snd_mem_proc) 659 - remove_proc_entry(SND_MEM_PROC_FILE, NULL); 658 + remove_proc_entry(SND_MEM_PROC_FILE, NULL); 660 659 free_all_reserved_pages(); 661 660 if (snd_allocated_pages > 0) 662 661 printk(KERN_ERR "snd-malloc: Memory leak? pages not freed = %li\n", snd_allocated_pages);
+1 -1
sound/core/memory.c
··· 56 56 #define VMALLOC_MAGIC 0x87654320 57 57 static snd_info_entry_t *snd_memory_info_entry; 58 58 59 - void snd_memory_init(void) 59 + void __init snd_memory_init(void) 60 60 { 61 61 snd_alloc_kmalloc = 0; 62 62 snd_alloc_vmalloc = 0;
+4 -7
sound/core/oss/pcm_oss.c
··· 1705 1705 if (snd_pcm_running(substream)) 1706 1706 snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); 1707 1707 snd_pcm_stream_unlock_irq(substream); 1708 - if (substream->open_flag) { 1708 + if (substream->ffile != NULL) { 1709 1709 if (substream->ops->hw_free != NULL) 1710 1710 substream->ops->hw_free(substream); 1711 1711 substream->ops->close(substream); 1712 - substream->open_flag = 0; 1712 + substream->ffile = NULL; 1713 1713 } 1714 - substream->ffile = NULL; 1715 1714 snd_pcm_oss_release_substream(substream); 1716 1715 snd_pcm_release_substream(substream); 1717 1716 } ··· 1777 1778 snd_pcm_oss_release_file(pcm_oss_file); 1778 1779 return err; 1779 1780 } 1780 - psubstream->open_flag = 1; 1781 + psubstream->ffile = file; 1781 1782 err = snd_pcm_hw_constraints_complete(psubstream); 1782 1783 if (err < 0) { 1783 1784 snd_printd("snd_pcm_hw_constraint_complete failed\n"); 1784 1785 snd_pcm_oss_release_file(pcm_oss_file); 1785 1786 return err; 1786 1787 } 1787 - psubstream->ffile = file; 1788 1788 snd_pcm_oss_init_substream(psubstream, psetup, minor); 1789 1789 } 1790 1790 if (csubstream != NULL) { ··· 1798 1800 snd_pcm_oss_release_file(pcm_oss_file); 1799 1801 return err; 1800 1802 } 1801 - csubstream->open_flag = 1; 1803 + csubstream->ffile = file; 1802 1804 err = snd_pcm_hw_constraints_complete(csubstream); 1803 1805 if (err < 0) { 1804 1806 snd_printd("snd_pcm_hw_constraint_complete failed\n"); 1805 1807 snd_pcm_oss_release_file(pcm_oss_file); 1806 1808 return err; 1807 1809 } 1808 - csubstream->ffile = file; 1809 1810 snd_pcm_oss_init_substream(csubstream, csetup, minor); 1810 1811 } 1811 1812
+34 -15
sound/core/pcm_compat.c
··· 103 103 unsigned char reserved[64]; 104 104 }; 105 105 106 + /* recalcuate the boundary within 32bit */ 107 + static snd_pcm_uframes_t recalculate_boundary(snd_pcm_runtime_t *runtime) 108 + { 109 + snd_pcm_uframes_t boundary; 110 + 111 + if (! runtime->buffer_size) 112 + return 0; 113 + boundary = runtime->buffer_size; 114 + while (boundary * 2 <= 0x7fffffffUL - runtime->buffer_size) 115 + boundary *= 2; 116 + return boundary; 117 + } 118 + 106 119 static int snd_pcm_ioctl_sw_params_compat(snd_pcm_substream_t *substream, 107 120 struct sndrv_pcm_sw_params32 __user *src) 108 121 { 109 122 snd_pcm_sw_params_t params; 123 + snd_pcm_uframes_t boundary; 110 124 int err; 111 125 112 126 memset(&params, 0, sizeof(params)); ··· 134 120 get_user(params.silence_threshold, &src->silence_threshold) || 135 121 get_user(params.silence_size, &src->silence_size)) 136 122 return -EFAULT; 123 + /* 124 + * Check silent_size parameter. Since we have 64bit boundary, 125 + * silence_size must be compared with the 32bit boundary. 126 + */ 127 + boundary = recalculate_boundary(substream->runtime); 128 + if (boundary && params.silence_size >= boundary) 129 + params.silence_size = substream->runtime->boundary; 137 130 err = snd_pcm_sw_params(substream, &params); 138 131 if (err < 0) 139 132 return err; 140 - if (put_user(params.boundary, &src->boundary)) 133 + if (boundary && put_user(boundary, &src->boundary)) 141 134 return -EFAULT; 142 135 return err; 143 136 } ··· 220 199 return err; 221 200 } 222 201 223 - /* recalcuate the boundary within 32bit */ 224 - static void recalculate_boundary(snd_pcm_runtime_t *runtime) 225 - { 226 - if (! runtime->buffer_size) 227 - return; 228 - runtime->boundary = runtime->buffer_size; 229 - while (runtime->boundary * 2 <= 0x7fffffffUL - runtime->buffer_size) 230 - runtime->boundary *= 2; 231 - } 232 - 233 202 /* both for HW_PARAMS and HW_REFINE */ 234 203 static int snd_pcm_ioctl_hw_params_compat(snd_pcm_substream_t *substream, 235 204 int refine, ··· 252 241 goto error; 253 242 } 254 243 255 - if (! refine) 256 - recalculate_boundary(runtime); 244 + if (! refine) { 245 + unsigned int new_boundary = recalculate_boundary(runtime); 246 + if (new_boundary) 247 + runtime->boundary = new_boundary; 248 + } 257 249 error: 258 250 kfree(data); 259 251 return err; ··· 394 380 u32 sflags; 395 381 struct sndrv_pcm_mmap_control scontrol; 396 382 struct sndrv_pcm_mmap_status sstatus; 383 + snd_pcm_uframes_t boundary; 397 384 int err; 398 385 399 386 snd_assert(runtime, return -EINVAL); ··· 410 395 } 411 396 status = runtime->status; 412 397 control = runtime->control; 398 + boundary = recalculate_boundary(runtime); 399 + if (! boundary) 400 + boundary = 0x7fffffff; 413 401 snd_pcm_stream_lock_irq(substream); 402 + /* FIXME: we should consider the boundary for the sync from app */ 414 403 if (!(sflags & SNDRV_PCM_SYNC_PTR_APPL)) 415 404 control->appl_ptr = scontrol.appl_ptr; 416 405 else 417 - scontrol.appl_ptr = control->appl_ptr; 406 + scontrol.appl_ptr = control->appl_ptr % boundary; 418 407 if (!(sflags & SNDRV_PCM_SYNC_PTR_AVAIL_MIN)) 419 408 control->avail_min = scontrol.avail_min; 420 409 else 421 410 scontrol.avail_min = control->avail_min; 422 411 sstatus.state = status->state; 423 - sstatus.hw_ptr = status->hw_ptr; 412 + sstatus.hw_ptr = status->hw_ptr % boundary; 424 413 sstatus.tstamp = status->tstamp; 425 414 sstatus.suspended_state = status->suspended_state; 426 415 snd_pcm_stream_unlock_irq(substream);
+16 -4
sound/core/pcm_lib.c
··· 1584 1584 return snd_pcm_hw_param_value(params, var, NULL); 1585 1585 } 1586 1586 1587 - int _snd_pcm_hw_param_mask(snd_pcm_hw_params_t *params, 1588 - snd_pcm_hw_param_t var, const snd_mask_t *val) 1587 + static int _snd_pcm_hw_param_mask(snd_pcm_hw_params_t *params, 1588 + snd_pcm_hw_param_t var, const snd_mask_t *val) 1589 1589 { 1590 1590 int changed; 1591 1591 assert(hw_is_mask(var)); ··· 2063 2063 if (((avail < runtime->control->avail_min && size > avail) || 2064 2064 (size >= runtime->xfer_align && avail < runtime->xfer_align))) { 2065 2065 wait_queue_t wait; 2066 - enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED } state; 2066 + enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state; 2067 2067 long tout; 2068 2068 2069 2069 if (nonblock) { ··· 2097 2097 case SNDRV_PCM_STATE_SUSPENDED: 2098 2098 state = SUSPENDED; 2099 2099 goto _end_loop; 2100 + case SNDRV_PCM_STATE_SETUP: 2101 + state = DROPPED; 2102 + goto _end_loop; 2100 2103 default: 2101 2104 break; 2102 2105 } ··· 2125 2122 case EXPIRED: 2126 2123 snd_printd("playback write error (DMA or IRQ trouble?)\n"); 2127 2124 err = -EIO; 2125 + goto _end_unlock; 2126 + case DROPPED: 2127 + err = -EBADFD; 2128 2128 goto _end_unlock; 2129 2129 default: 2130 2130 break; ··· 2365 2359 } else if ((avail < runtime->control->avail_min && size > avail) || 2366 2360 (size >= runtime->xfer_align && avail < runtime->xfer_align)) { 2367 2361 wait_queue_t wait; 2368 - enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED } state; 2362 + enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state; 2369 2363 long tout; 2370 2364 2371 2365 if (nonblock) { ··· 2400 2394 goto _end_loop; 2401 2395 case SNDRV_PCM_STATE_DRAINING: 2402 2396 goto __draining; 2397 + case SNDRV_PCM_STATE_SETUP: 2398 + state = DROPPED; 2399 + goto _end_loop; 2403 2400 default: 2404 2401 break; 2405 2402 } ··· 2428 2419 case EXPIRED: 2429 2420 snd_printd("capture read error (DMA or IRQ trouble?)\n"); 2430 2421 err = -EIO; 2422 + goto _end_unlock; 2423 + case DROPPED: 2424 + err = -EBADFD; 2431 2425 goto _end_unlock; 2432 2426 default: 2433 2427 break;
+5 -9
sound/core/pcm_native.c
··· 1025 1025 snd_pcm_runtime_t *runtime = substream->runtime; 1026 1026 snd_pcm_trigger_tstamp(substream); 1027 1027 if (substream->timer) 1028 - snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MPAUSE, &runtime->trigger_tstamp); 1028 + snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MSUSPEND, &runtime->trigger_tstamp); 1029 1029 runtime->status->suspended_state = runtime->status->state; 1030 1030 runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; 1031 1031 snd_pcm_tick_set(substream, 0); ··· 1115 1115 snd_pcm_runtime_t *runtime = substream->runtime; 1116 1116 snd_pcm_trigger_tstamp(substream); 1117 1117 if (substream->timer) 1118 - snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MCONTINUE, &runtime->trigger_tstamp); 1118 + snd_timer_notify(substream->timer, SNDRV_TIMER_EVENT_MRESUME, &runtime->trigger_tstamp); 1119 1119 runtime->status->state = runtime->status->suspended_state; 1120 1120 if (runtime->sleep_min) 1121 1121 snd_pcm_tick_prepare(substream); ··· 1967 1967 runtime = substream->runtime; 1968 1968 str = substream->pstr; 1969 1969 snd_pcm_unlink(substream); 1970 - if (substream->open_flag) { 1970 + if (substream->ffile != NULL) { 1971 1971 if (substream->ops->hw_free != NULL) 1972 1972 substream->ops->hw_free(substream); 1973 1973 substream->ops->close(substream); 1974 - substream->open_flag = 0; 1974 + substream->ffile = NULL; 1975 1975 } 1976 - substream->ffile = NULL; 1977 1976 snd_pcm_remove_file(str, pcm_file); 1978 1977 snd_pcm_release_substream(substream); 1979 1978 kfree(pcm_file); ··· 2021 2022 snd_pcm_release_file(pcm_file); 2022 2023 return err; 2023 2024 } 2024 - substream->open_flag = 1; 2025 + substream->ffile = file; 2025 2026 2026 2027 err = snd_pcm_hw_constraints_complete(substream); 2027 2028 if (err < 0) { 2028 2029 snd_printd("snd_pcm_hw_constraints_complete failed\n"); 2029 - substream->ops->close(substream); 2030 2030 snd_pcm_release_file(pcm_file); 2031 2031 return err; 2032 2032 } 2033 - 2034 - substream->ffile = file; 2035 2033 2036 2034 file->private_data = pcm_file; 2037 2035 *rpcm_file = pcm_file;
+5 -2
sound/core/sound_oss.c
··· 98 98 int cidx = SNDRV_MINOR_OSS_CARD(minor); 99 99 int track2 = -1; 100 100 int register1 = -1, register2 = -1; 101 + struct device *carddev = NULL; 101 102 102 103 if (minor < 0) 103 104 return minor; ··· 122 121 track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1); 123 122 break; 124 123 } 125 - register1 = register_sound_special(reg->f_ops, minor); 124 + if (card) 125 + carddev = card->dev; 126 + register1 = register_sound_special_device(reg->f_ops, minor, carddev); 126 127 if (register1 != minor) 127 128 goto __end; 128 129 if (track2 >= 0) { 129 - register2 = register_sound_special(reg->f_ops, track2); 130 + register2 = register_sound_special_device(reg->f_ops, track2, carddev); 130 131 if (register2 != track2) 131 132 goto __end; 132 133 }
+11 -5
sound/core/timer.c
··· 799 799 return 0; 800 800 } 801 801 802 - int snd_timer_dev_free(snd_device_t *device) 802 + static int snd_timer_dev_free(snd_device_t *device) 803 803 { 804 804 snd_timer_t *timer = device->device_data; 805 805 return snd_timer_free(timer); 806 806 } 807 807 808 - int snd_timer_dev_register(snd_device_t *dev) 808 + static int snd_timer_dev_register(snd_device_t *dev) 809 809 { 810 810 snd_timer_t *timer = dev->device_data; 811 811 snd_timer_t *timer1; ··· 880 880 struct list_head *p, *n; 881 881 882 882 snd_runtime_check(timer->hw.flags & SNDRV_TIMER_HW_SLAVE, return); 883 - snd_assert(event >= SNDRV_TIMER_EVENT_MSTART && event <= SNDRV_TIMER_EVENT_MPAUSE, return); 883 + snd_assert(event >= SNDRV_TIMER_EVENT_MSTART && event <= SNDRV_TIMER_EVENT_MRESUME, return); 884 884 spin_lock_irqsave(&timer->lock, flags); 885 - if (event == SNDRV_TIMER_EVENT_MSTART || event == SNDRV_TIMER_EVENT_MCONTINUE) { 885 + if (event == SNDRV_TIMER_EVENT_MSTART || 886 + event == SNDRV_TIMER_EVENT_MCONTINUE || 887 + event == SNDRV_TIMER_EVENT_MRESUME) { 886 888 if (timer->hw.c_resolution) 887 889 resolution = timer->hw.c_resolution(timer); 888 890 else ··· 1557 1555 (1<<SNDRV_TIMER_EVENT_STOP)| 1558 1556 (1<<SNDRV_TIMER_EVENT_CONTINUE)| 1559 1557 (1<<SNDRV_TIMER_EVENT_PAUSE)| 1558 + (1<<SNDRV_TIMER_EVENT_SUSPEND)| 1559 + (1<<SNDRV_TIMER_EVENT_RESUME)| 1560 1560 (1<<SNDRV_TIMER_EVENT_MSTART)| 1561 1561 (1<<SNDRV_TIMER_EVENT_MSTOP)| 1562 1562 (1<<SNDRV_TIMER_EVENT_MCONTINUE)| 1563 - (1<<SNDRV_TIMER_EVENT_MPAUSE))) { 1563 + (1<<SNDRV_TIMER_EVENT_MPAUSE)| 1564 + (1<<SNDRV_TIMER_EVENT_MSUSPEND)| 1565 + (1<<SNDRV_TIMER_EVENT_MRESUME))) { 1564 1566 err = -EINVAL; 1565 1567 goto _end; 1566 1568 }
+2 -2
sound/drivers/vx/vx_mixer.c
··· 796 796 797 797 static snd_kcontrol_new_t vx_control_iec958_mask = { 798 798 .access = SNDRV_CTL_ELEM_ACCESS_READ, 799 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 799 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 800 800 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), 801 801 .info = vx_iec958_info, /* shared */ 802 802 .get = vx_iec958_mask_get, 803 803 }; 804 804 805 805 static snd_kcontrol_new_t vx_control_iec958 = { 806 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 806 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 807 807 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), 808 808 .info = vx_iec958_info, 809 809 .get = vx_iec958_get,
+4 -4
sound/drivers/vx/vx_pcm.c
··· 549 549 550 550 static snd_pcm_hardware_t vx_pcm_playback_hw = { 551 551 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 552 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP_VALID | 553 - SNDRV_PCM_INFO_RESUME), 552 + SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP_VALID /*|*/ 553 + /*SNDRV_PCM_INFO_RESUME*/), 554 554 .formats = /*SNDRV_PCM_FMTBIT_U8 |*/ SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_3LE, 555 555 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, 556 556 .rate_min = 5000, ··· 949 949 950 950 static snd_pcm_hardware_t vx_pcm_capture_hw = { 951 951 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 952 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP_VALID | 953 - SNDRV_PCM_INFO_RESUME), 952 + SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_MMAP_VALID /*|*/ 953 + /*SNDRV_PCM_INFO_RESUME*/), 954 954 .formats = /*SNDRV_PCM_FMTBIT_U8 |*/ SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_3LE, 955 955 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, 956 956 .rate_min = 5000,
+5
sound/isa/ad1816a/ad1816a.c
··· 53 53 static int mpu_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* Pnp setup */ 54 54 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* PnP setup */ 55 55 static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* PnP setup */ 56 + static int clockfreq[SNDRV_CARDS]; 56 57 57 58 module_param_array(index, int, NULL, 0444); 58 59 MODULE_PARM_DESC(index, "Index value for ad1816a based soundcard."); ··· 75 74 MODULE_PARM_DESC(dma1, "1st DMA # for ad1816a driver."); 76 75 module_param_array(dma2, int, NULL, 0444); 77 76 MODULE_PARM_DESC(dma2, "2nd DMA # for ad1816a driver."); 77 + module_param_array(clockfreq, int, NULL, 0444); 78 + MODULE_PARM_DESC(clockfreq, "Clock frequency for ad1816a driver (default = 0)."); 78 79 79 80 struct snd_card_ad1816a { 80 81 struct pnp_dev *dev; ··· 212 209 snd_card_free(card); 213 210 return error; 214 211 } 212 + if (clockfreq[dev] >= 5000 && clockfreq[dev] <= 100000) 213 + chip->clock_freq = clockfreq[dev]; 215 214 216 215 strcpy(card->driver, "AD1816A"); 217 216 strcpy(card->shortname, "ADI SoundPort AD1816A");
+10 -4
sound/isa/ad1816a/ad1816a_lib.c
··· 234 234 ad1816a_t *chip = snd_pcm_substream_chip(substream); 235 235 unsigned long flags; 236 236 snd_pcm_runtime_t *runtime = substream->runtime; 237 - unsigned int size; 237 + unsigned int size, rate; 238 238 239 239 spin_lock_irqsave(&chip->lock, flags); 240 240 ··· 245 245 snd_dma_program(chip->dma1, runtime->dma_addr, size, 246 246 DMA_MODE_WRITE | DMA_AUTOINIT); 247 247 248 - snd_ad1816a_write(chip, AD1816A_PLAYBACK_SAMPLE_RATE, runtime->rate); 248 + rate = runtime->rate; 249 + if (chip->clock_freq) 250 + rate = (rate * 33000) / chip->clock_freq; 251 + snd_ad1816a_write(chip, AD1816A_PLAYBACK_SAMPLE_RATE, rate); 249 252 snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, 250 253 AD1816A_FMT_ALL | AD1816A_FMT_STEREO, 251 254 snd_ad1816a_get_format(chip, runtime->format, ··· 266 263 ad1816a_t *chip = snd_pcm_substream_chip(substream); 267 264 unsigned long flags; 268 265 snd_pcm_runtime_t *runtime = substream->runtime; 269 - unsigned int size; 266 + unsigned int size, rate; 270 267 271 268 spin_lock_irqsave(&chip->lock, flags); 272 269 ··· 277 274 snd_dma_program(chip->dma2, runtime->dma_addr, size, 278 275 DMA_MODE_READ | DMA_AUTOINIT); 279 276 280 - snd_ad1816a_write(chip, AD1816A_CAPTURE_SAMPLE_RATE, runtime->rate); 277 + rate = runtime->rate; 278 + if (chip->clock_freq) 279 + rate = (rate * 33000) / chip->clock_freq; 280 + snd_ad1816a_write(chip, AD1816A_CAPTURE_SAMPLE_RATE, rate); 281 281 snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, 282 282 AD1816A_FMT_ALL | AD1816A_FMT_STEREO, 283 283 snd_ad1816a_get_format(chip, runtime->format,
+1
sound/isa/ad1848/ad1848_lib.c
··· 1196 1196 .put = snd_ad1848_put_double, 1197 1197 }, 1198 1198 [AD1848_MIX_CAPTURE] = { 1199 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1199 1200 .info = snd_ad1848_info_mux, 1200 1201 .get = snd_ad1848_get_mux, 1201 1202 .put = snd_ad1848_put_mux,
+2 -2
sound/isa/cmi8330.c
··· 194 194 AD1848_SINGLE("3D Control - Switch", 0, CMI8330_RMUX3D, 5, 1, 1), 195 195 AD1848_SINGLE("PC Speaker Playback Volume", 0, CMI8330_OUTPUTVOL, 3, 3, 0), 196 196 AD1848_SINGLE("FM Playback Switch", 0, CMI8330_RECMUX, 3, 1, 1), 197 - AD1848_SINGLE("IEC958 Input Capture Switch", 0, CMI8330_RMUX3D, 7, 1, 1), 198 - AD1848_SINGLE("IEC958 Input Playback Switch", 0, CMI8330_MUTEMUX, 7, 1, 1), 197 + AD1848_SINGLE(SNDRV_CTL_NAME_IEC958("Input ",CAPTURE,SWITCH), 0, CMI8330_RMUX3D, 7, 1, 1), 198 + AD1848_SINGLE(SNDRV_CTL_NAME_IEC958("Input ",PLAYBACK,SWITCH), 0, CMI8330_MUTEMUX, 7, 1, 1), 199 199 }; 200 200 201 201 #ifdef ENABLE_SB_MIXER
+2
sound/isa/cs423x/cs4231_lib.c
··· 1346 1346 int reg; 1347 1347 unsigned long flags; 1348 1348 1349 + if (chip->pcm) 1350 + snd_pcm_suspend_all(chip->pcm); 1349 1351 spin_lock_irqsave(&chip->reg_lock, flags); 1350 1352 for (reg = 0; reg < 32; reg++) 1351 1353 chip->image[reg] = snd_cs4231_in(chip, reg);
+4 -2
sound/isa/gus/gus_io.c
··· 269 269 270 270 #endif /* 0 */ 271 271 272 - unsigned int snd_gf1_i_read_addr(snd_gus_card_t * gus, 273 - unsigned char reg, short w_16bit) 272 + #ifdef CONFIG_SND_DEBUG 273 + static unsigned int snd_gf1_i_read_addr(snd_gus_card_t * gus, 274 + unsigned char reg, short w_16bit) 274 275 { 275 276 unsigned int res; 276 277 unsigned long flags; ··· 281 280 spin_unlock_irqrestore(&gus->reg_lock, flags); 282 281 return res; 283 282 } 283 + #endif 284 284 285 285 /* 286 286
+90 -24
sound/isa/opl3sa2.c
··· 145 145 146 146 #ifdef CONFIG_PNP 147 147 148 + static struct pnp_device_id snd_opl3sa2_pnpbiosids[] = { 149 + { .id = "YMH0021" }, 150 + { .id = "NMX2210" }, /* Gateway Solo 2500 */ 151 + { .id = "" } /* end */ 152 + }; 153 + 154 + MODULE_DEVICE_TABLE(pnp, snd_opl3sa2_pnpbiosids); 155 + 148 156 static struct pnp_card_device_id snd_opl3sa2_pnpids[] = { 149 157 /* Yamaha YMF719E-S (Genius Sound Maker 3DX) */ 150 158 { .id = "YMH0020", .devs = { { "YMH0021" } } }, ··· 576 568 577 569 #ifdef CONFIG_PNP 578 570 static int __init snd_opl3sa2_pnp(int dev, opl3sa2_t *chip, 579 - struct pnp_card_link *card, 580 - const struct pnp_card_device_id *id) 571 + struct pnp_dev *pdev, 572 + int isapnp) 581 573 { 582 - struct pnp_dev *pdev; 583 - struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); 574 + struct pnp_resource_table * cfg; 584 575 int err; 585 576 577 + if (!isapnp && pnp_device_is_isapnp(pdev)) 578 + return -ENOENT; /* we have another procedure - card */ 579 + 580 + cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); 586 581 if (!cfg) 587 582 return -ENOMEM; 588 - pdev = chip->dev = pnp_request_card_device(card, id->devs[0].id, NULL); 589 - if (chip->dev == NULL) { 590 - kfree(cfg); 591 - return -EBUSY; 592 - } 593 583 /* PnP initialization */ 594 584 pnp_init_resource_table(cfg); 595 585 if (sb_port[dev] != SNDRV_AUTO_PORT) ··· 607 601 if (irq[dev] != SNDRV_AUTO_IRQ) 608 602 pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1); 609 603 err = pnp_manual_config_dev(pdev, cfg, 0); 610 - if (err < 0) 604 + if (err < 0 && isapnp) 611 605 snd_printk(KERN_ERR "PnP manual resources are invalid, using auto config\n"); 612 606 err = pnp_activate_dev(pdev); 613 607 if (err < 0) { ··· 623 617 dma1[dev] = pnp_dma(pdev, 0); 624 618 dma2[dev] = pnp_dma(pdev, 1); 625 619 irq[dev] = pnp_irq(pdev, 0); 626 - snd_printdd("PnP OPL3-SA: sb port=0x%lx, wss port=0x%lx, fm port=0x%lx, midi port=0x%lx\n", 627 - sb_port[dev], wss_port[dev], fm_port[dev], midi_port[dev]); 628 - snd_printdd("PnP OPL3-SA: control port=0x%lx, dma1=%i, dma2=%i, irq=%i\n", 629 - port[dev], dma1[dev], dma2[dev], irq[dev]); 620 + snd_printdd("%sPnP OPL3-SA: sb port=0x%lx, wss port=0x%lx, fm port=0x%lx, midi port=0x%lx\n", 621 + pnp_device_is_pnpbios(pdev) ? "BIOS" : "ISA", sb_port[dev], wss_port[dev], fm_port[dev], midi_port[dev]); 622 + snd_printdd("%sPnP OPL3-SA: control port=0x%lx, dma1=%i, dma2=%i, irq=%i\n", 623 + pnp_device_is_pnpbios(pdev) ? "BIOS" : "ISA", port[dev], dma1[dev], dma2[dev], irq[dev]); 630 624 kfree(cfg); 625 + chip->dev = pdev; 631 626 return 0; 627 + } 628 + 629 + static int __init snd_opl3sa2_cpnp(int dev, opl3sa2_t *chip, 630 + struct pnp_card_link *card, 631 + const struct pnp_card_device_id *id) 632 + { 633 + struct pnp_dev *pdev; 634 + struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL); 635 + 636 + if (!cfg) 637 + return -ENOMEM; 638 + pdev = pnp_request_card_device(card, id->devs[0].id, NULL); 639 + if (pdev == NULL) { 640 + kfree(cfg); 641 + return -EBUSY; 642 + } 643 + return snd_opl3sa2_pnp(dev, chip, pdev, 1); 632 644 } 633 645 #endif /* CONFIG_PNP */ 634 646 ··· 669 645 } 670 646 671 647 static int __devinit snd_opl3sa2_probe(int dev, 648 + struct pnp_dev *pdev, 672 649 struct pnp_card_link *pcard, 673 650 const struct pnp_card_device_id *pid) 674 651 { ··· 720 695 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) 721 696 goto __error; 722 697 #ifdef CONFIG_PNP 723 - if (isapnp[dev]) { 724 - if ((err = snd_opl3sa2_pnp(dev, chip, pcard, pid)) < 0) 698 + if (pdev) { 699 + if ((err = snd_opl3sa2_pnp(dev, chip, pdev, 0)) < 0) 700 + goto __error; 701 + snd_card_set_dev(card, &pdev->dev); 702 + } 703 + if (pcard) { 704 + if ((err = snd_opl3sa2_cpnp(dev, chip, pcard, pid)) < 0) 725 705 goto __error; 726 706 snd_card_set_dev(card, &pcard->card->dev); 727 707 } ··· 798 768 if ((err = snd_card_register(card)) < 0) 799 769 goto __error; 800 770 801 - if (pcard) 771 + if (pdev) 772 + pnp_set_drvdata(pdev, card); 773 + else if (pcard) 802 774 pnp_set_card_drvdata(pcard, card); 803 775 else 804 776 snd_opl3sa2_legacy[dev] = card; ··· 812 780 } 813 781 814 782 #ifdef CONFIG_PNP 815 - static int __devinit snd_opl3sa2_pnp_detect(struct pnp_card_link *card, 816 - const struct pnp_card_device_id *id) 783 + static int __devinit snd_opl3sa2_pnp_detect(struct pnp_dev *pdev, 784 + const struct pnp_device_id *id) 817 785 { 818 786 static int dev; 819 787 int res; ··· 821 789 for ( ; dev < SNDRV_CARDS; dev++) { 822 790 if (!enable[dev] || !isapnp[dev]) 823 791 continue; 824 - res = snd_opl3sa2_probe(dev, card, id); 792 + res = snd_opl3sa2_probe(dev, pdev, NULL, NULL); 825 793 if (res < 0) 826 794 return res; 827 795 dev++; ··· 830 798 return -ENODEV; 831 799 } 832 800 833 - static void __devexit snd_opl3sa2_pnp_remove(struct pnp_card_link * pcard) 801 + static void __devexit snd_opl3sa2_pnp_remove(struct pnp_dev * pdev) 802 + { 803 + snd_card_t *card = (snd_card_t *) pnp_get_drvdata(pdev); 804 + 805 + snd_card_disconnect(card); 806 + snd_card_free_in_thread(card); 807 + } 808 + 809 + static struct pnp_driver opl3sa2_pnp_driver = { 810 + .name = "opl3sa2-pnpbios", 811 + .id_table = snd_opl3sa2_pnpbiosids, 812 + .probe = snd_opl3sa2_pnp_detect, 813 + .remove = __devexit_p(snd_opl3sa2_pnp_remove), 814 + }; 815 + 816 + static int __devinit snd_opl3sa2_pnp_cdetect(struct pnp_card_link *card, 817 + const struct pnp_card_device_id *id) 818 + { 819 + static int dev; 820 + int res; 821 + 822 + for ( ; dev < SNDRV_CARDS; dev++) { 823 + if (!enable[dev] || !isapnp[dev]) 824 + continue; 825 + res = snd_opl3sa2_probe(dev, NULL, card, id); 826 + if (res < 0) 827 + return res; 828 + dev++; 829 + return 0; 830 + } 831 + return -ENODEV; 832 + } 833 + 834 + static void __devexit snd_opl3sa2_pnp_cremove(struct pnp_card_link * pcard) 834 835 { 835 836 snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard); 836 837 ··· 875 810 .flags = PNP_DRIVER_RES_DISABLE, 876 811 .name = "opl3sa2", 877 812 .id_table = snd_opl3sa2_pnpids, 878 - .probe = snd_opl3sa2_pnp_detect, 879 - .remove = __devexit_p(snd_opl3sa2_pnp_remove), 813 + .probe = snd_opl3sa2_pnp_cdetect, 814 + .remove = __devexit_p(snd_opl3sa2_pnp_cremove), 880 815 }; 881 816 #endif /* CONFIG_PNP */ 882 817 ··· 891 826 if (isapnp[dev]) 892 827 continue; 893 828 #endif 894 - if (snd_opl3sa2_probe(dev, NULL, NULL) >= 0) 829 + if (snd_opl3sa2_probe(dev, NULL, NULL, NULL) >= 0) 895 830 cards++; 896 831 } 897 832 #ifdef CONFIG_PNP 833 + cards += pnp_register_driver(&opl3sa2_pnp_driver); 898 834 cards += pnp_register_card_driver(&opl3sa2_pnpc_driver); 899 835 #endif 900 836 if (!cards) {
+1 -1
sound/isa/sb/sb16_main.c
··· 729 729 } 730 730 731 731 static snd_kcontrol_new_t snd_sb16_dma_control = { 732 - .iface = SNDRV_CTL_ELEM_IFACE_PCM, 732 + .iface = SNDRV_CTL_ELEM_IFACE_CARD, 733 733 .name = "16-bit DMA Allocation", 734 734 .info = snd_sb16_dma_control_info, 735 735 .get = snd_sb16_dma_control_get,
+7 -3
sound/pci/Kconfig
··· 1 1 # ALSA PCI drivers 2 2 3 - menu "PCI devices" 4 - depends on SND!=n && PCI 5 - 6 3 config SND_AC97_CODEC 7 4 tristate 8 5 select SND_PCM 6 + select SND_AC97_BUS 7 + 8 + config SND_AC97_BUS 9 + tristate 10 + 11 + menu "PCI devices" 12 + depends on SND!=n && PCI 9 13 10 14 config SND_ALI5451 11 15 tristate "ALi M5451 PCI Audio Controller"
+2
sound/pci/ac97/Makefile
··· 10 10 endif 11 11 12 12 snd-ak4531-codec-objs := ak4531_codec.o 13 + snd-ac97-bus-objs := ac97_bus.o 13 14 14 15 # Toplevel Module Dependency 15 16 obj-$(CONFIG_SND_AC97_CODEC) += snd-ac97-codec.o 16 17 obj-$(CONFIG_SND_ENS1370) += snd-ak4531-codec.o 18 + obj-$(CONFIG_SND_AC97_BUS) += snd-ac97-bus.o 17 19 18 20 obj-m := $(sort $(obj-m))
+79
sound/pci/ac97/ac97_bus.c
··· 1 + /* 2 + * Linux driver model AC97 bus interface 3 + * 4 + * Author: Nicolas Pitre 5 + * Created: Jan 14, 2005 6 + * Copyright: (C) MontaVista Software Inc. 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + */ 13 + 14 + #include <linux/module.h> 15 + #include <linux/init.h> 16 + #include <linux/device.h> 17 + #include <linux/string.h> 18 + 19 + /* 20 + * Codec families have names seperated by commas, so we search for an 21 + * individual codec name within the family string. 22 + */ 23 + static int ac97_bus_match(struct device *dev, struct device_driver *drv) 24 + { 25 + return (strstr(dev->bus_id, drv->name) != NULL); 26 + } 27 + 28 + static int ac97_bus_suspend(struct device *dev, pm_message_t state) 29 + { 30 + int ret = 0; 31 + 32 + if (dev->driver && dev->driver->suspend) { 33 + ret = dev->driver->suspend(dev, state, SUSPEND_DISABLE); 34 + if (ret == 0) 35 + ret = dev->driver->suspend(dev, state, SUSPEND_SAVE_STATE); 36 + if (ret == 0) 37 + ret = dev->driver->suspend(dev, state, SUSPEND_POWER_DOWN); 38 + } 39 + return ret; 40 + } 41 + 42 + static int ac97_bus_resume(struct device *dev) 43 + { 44 + int ret = 0; 45 + 46 + if (dev->driver && dev->driver->resume) { 47 + ret = dev->driver->resume(dev, RESUME_POWER_ON); 48 + if (ret == 0) 49 + ret = dev->driver->resume(dev, RESUME_RESTORE_STATE); 50 + if (ret == 0) 51 + ret = dev->driver->resume(dev, RESUME_ENABLE); 52 + } 53 + return ret; 54 + } 55 + 56 + struct bus_type ac97_bus_type = { 57 + .name = "ac97", 58 + .match = ac97_bus_match, 59 + .suspend = ac97_bus_suspend, 60 + .resume = ac97_bus_resume, 61 + }; 62 + 63 + static int __init ac97_bus_init(void) 64 + { 65 + return bus_register(&ac97_bus_type); 66 + } 67 + 68 + subsys_initcall(ac97_bus_init); 69 + 70 + static void __exit ac97_bus_exit(void) 71 + { 72 + bus_unregister(&ac97_bus_type); 73 + } 74 + 75 + module_exit(ac97_bus_exit); 76 + 77 + EXPORT_SYMBOL(ac97_bus_type); 78 + 79 + MODULE_LICENSE("GPL");
+64 -21
sound/pci/ac97/ac97_codec.c
··· 157 157 { 0x54524123, 0xffffffff, "TR28602", NULL, NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)] 158 158 { 0x54584e20, 0xffffffff, "TLC320AD9xC", NULL, NULL }, 159 159 { 0x56494161, 0xffffffff, "VIA1612A", NULL, NULL }, // modified ICE1232 with S/PDIF 160 + { 0x56494170, 0xffffffff, "VIA1617A", patch_vt1617a, NULL }, // modified VT1616 with S/PDIF 160 161 { 0x57454301, 0xffffffff, "W83971D", NULL, NULL }, 161 162 { 0x574d4c00, 0xffffffff, "WM9701A", NULL, NULL }, 162 163 { 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL}, ··· 1308 1307 } 1309 1308 1310 1309 /* build master tone controls */ 1311 - if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_TONE)) { 1312 - for (idx = 0; idx < 2; idx++) { 1313 - if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_tone[idx], ac97))) < 0) 1314 - return err; 1315 - if (ac97->id == AC97_ID_YMF753) { 1316 - kctl->private_value &= ~(0xff << 16); 1317 - kctl->private_value |= 7 << 16; 1310 + if (!(ac97->flags & AC97_HAS_NO_TONE)) { 1311 + if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_TONE)) { 1312 + for (idx = 0; idx < 2; idx++) { 1313 + if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_tone[idx], ac97))) < 0) 1314 + return err; 1315 + if (ac97->id == AC97_ID_YMF753) { 1316 + kctl->private_value &= ~(0xff << 16); 1317 + kctl->private_value |= 7 << 16; 1318 + } 1318 1319 } 1320 + snd_ac97_write_cache(ac97, AC97_MASTER_TONE, 0x0f0f); 1319 1321 } 1320 - snd_ac97_write_cache(ac97, AC97_MASTER_TONE, 0x0f0f); 1321 1322 } 1322 1323 1323 1324 /* build PC Speaker controls */ ··· 1342 1339 } 1343 1340 1344 1341 /* build MIC controls */ 1345 - if (snd_ac97_try_volume_mix(ac97, AC97_MIC)) { 1346 - if ((err = snd_ac97_cmix_new(card, "Mic Playback", AC97_MIC, ac97)) < 0) 1347 - return err; 1348 - if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_mic_boost, ac97))) < 0) 1349 - return err; 1342 + if (!(ac97->flags & AC97_HAS_NO_MIC)) { 1343 + if (snd_ac97_try_volume_mix(ac97, AC97_MIC)) { 1344 + if ((err = snd_ac97_cmix_new(card, "Mic Playback", AC97_MIC, ac97)) < 0) 1345 + return err; 1346 + if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_mic_boost, ac97))) < 0) 1347 + return err; 1348 + } 1350 1349 } 1351 1350 1352 1351 /* build Line controls */ ··· 1407 1402 } 1408 1403 snd_ac97_write_cache(ac97, AC97_PCM, init_val); 1409 1404 } else { 1410 - if (ac97->flags & AC97_HAS_NO_PCM_VOL) 1411 - err = snd_ac97_cmute_new(card, "PCM Playback Switch", AC97_PCM, ac97); 1412 - else 1413 - err = snd_ac97_cmix_new(card, "PCM Playback", AC97_PCM, ac97); 1414 - if (err < 0) 1415 - return err; 1405 + if (!(ac97->flags & AC97_HAS_NO_STD_PCM)) { 1406 + if (ac97->flags & AC97_HAS_NO_PCM_VOL) 1407 + err = snd_ac97_cmute_new(card, "PCM Playback Switch", AC97_PCM, ac97); 1408 + else 1409 + err = snd_ac97_cmix_new(card, "PCM Playback", AC97_PCM, ac97); 1410 + if (err < 0) 1411 + return err; 1412 + } 1416 1413 } 1417 1414 1418 1415 /* build Capture controls */ ··· 1814 1807 return 0; 1815 1808 } 1816 1809 1810 + /* stop no dev release warning */ 1811 + static void ac97_device_release(struct device * dev) 1812 + { 1813 + } 1814 + 1815 + /* register ac97 codec to bus */ 1816 + static int snd_ac97_dev_register(snd_device_t *device) 1817 + { 1818 + ac97_t *ac97 = device->device_data; 1819 + int err; 1820 + 1821 + ac97->dev.bus = &ac97_bus_type; 1822 + ac97->dev.parent = ac97->bus->card->dev; 1823 + ac97->dev.platform_data = ac97; 1824 + ac97->dev.release = ac97_device_release; 1825 + snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "card%d-%d", ac97->bus->card->number, ac97->num); 1826 + if ((err = device_register(&ac97->dev)) < 0) { 1827 + snd_printk(KERN_ERR "Can't register ac97 bus\n"); 1828 + ac97->dev.bus = NULL; 1829 + return err; 1830 + } 1831 + return 0; 1832 + } 1833 + 1834 + /* unregister ac97 codec */ 1835 + static int snd_ac97_dev_unregister(snd_device_t *device) 1836 + { 1837 + ac97_t *ac97 = device->device_data; 1838 + if (ac97->dev.bus) 1839 + device_unregister(&ac97->dev); 1840 + return snd_ac97_free(ac97); 1841 + } 1842 + 1817 1843 /* build_ops to do nothing */ 1818 1844 static struct snd_ac97_build_ops null_build_ops; 1819 1845 ··· 1880 1840 const ac97_codec_id_t *pid; 1881 1841 static snd_device_ops_t ops = { 1882 1842 .dev_free = snd_ac97_dev_free, 1843 + .dev_register = snd_ac97_dev_register, 1844 + .dev_unregister = snd_ac97_dev_unregister, 1883 1845 }; 1884 1846 1885 1847 snd_assert(rac97 != NULL, return -EINVAL); ··· 2581 2539 { 2582 2540 int result; 2583 2541 2584 - snd_assert(quirk, return -EINVAL); 2585 - 2586 2542 /* quirk overriden? */ 2587 2543 if (override && strcmp(override, "-1") && strcmp(override, "default")) { 2588 2544 result = apply_quirk_str(ac97, override); ··· 2588 2548 snd_printk(KERN_ERR "applying quirk type %s failed (%d)\n", override, result); 2589 2549 return result; 2590 2550 } 2551 + 2552 + if (! quirk) 2553 + return -EINVAL; 2591 2554 2592 2555 for (; quirk->subvendor; quirk++) { 2593 2556 if (quirk->subvendor != ac97->subsystem_vendor)
+356 -95
sound/pci/ac97/ac97_patch.c
··· 370 370 * added support for WM9705,WM9708,WM9709,WM9710,WM9711,WM9712 and WM9717. 371 371 */ 372 372 373 - int patch_wolfson03(ac97_t * ac97) 373 + static const snd_kcontrol_new_t wm97xx_snd_ac97_controls[] = { 374 + AC97_DOUBLE("Front Playback Volume", AC97_WM97XX_FMIXER_VOL, 8, 0, 31, 1), 375 + AC97_SINGLE("Front Playback Switch", AC97_WM97XX_FMIXER_VOL, 15, 1, 1), 376 + }; 377 + 378 + static int patch_wolfson_wm9703_specific(ac97_t * ac97) 374 379 { 375 380 /* This is known to work for the ViewSonic ViewPad 1000 376 - Randolph Bentson <bentson@holmsjoen.com> */ 377 - 378 - // WM9703/9707/9708/9717 379 - snd_ac97_write_cache(ac97, AC97_WM97XX_FMIXER_VOL, 0x0808); 380 - snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0x8000); 381 + * Randolph Bentson <bentson@holmsjoen.com> 382 + * WM9703/9707/9708/9717 383 + */ 384 + int err, i; 385 + 386 + for (i = 0; i < ARRAY_SIZE(wm97xx_snd_ac97_controls); i++) { 387 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm97xx_snd_ac97_controls[i], ac97))) < 0) 388 + return err; 389 + } 390 + snd_ac97_write_cache(ac97, AC97_WM97XX_FMIXER_VOL, 0x0808); 381 391 return 0; 382 392 } 383 - 393 + 394 + static struct snd_ac97_build_ops patch_wolfson_wm9703_ops = { 395 + .build_specific = patch_wolfson_wm9703_specific, 396 + }; 397 + 398 + int patch_wolfson03(ac97_t * ac97) 399 + { 400 + ac97->build_ops = &patch_wolfson_wm9703_ops; 401 + return 0; 402 + } 403 + 404 + static const snd_kcontrol_new_t wm9704_snd_ac97_controls[] = { 405 + AC97_DOUBLE("Front Playback Volume", AC97_WM97XX_FMIXER_VOL, 8, 0, 31, 1), 406 + AC97_SINGLE("Front Playback Switch", AC97_WM97XX_FMIXER_VOL, 15, 1, 1), 407 + AC97_DOUBLE("Rear Playback Volume", AC97_WM9704_RMIXER_VOL, 8, 0, 31, 1), 408 + AC97_SINGLE("Rear Playback Switch", AC97_WM9704_RMIXER_VOL, 15, 1, 1), 409 + AC97_DOUBLE("Rear DAC Volume", AC97_WM9704_RPCM_VOL, 8, 0, 31, 1), 410 + AC97_DOUBLE("Surround Volume", AC97_SURROUND_MASTER, 8, 0, 31, 1), 411 + }; 412 + 413 + static int patch_wolfson_wm9704_specific(ac97_t * ac97) 414 + { 415 + int err, i; 416 + for (i = 0; i < ARRAY_SIZE(wm9704_snd_ac97_controls); i++) { 417 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm9704_snd_ac97_controls[i], ac97))) < 0) 418 + return err; 419 + } 420 + /* patch for DVD noise */ 421 + snd_ac97_write_cache(ac97, AC97_WM9704_TEST, 0x0200); 422 + return 0; 423 + } 424 + 425 + static struct snd_ac97_build_ops patch_wolfson_wm9704_ops = { 426 + .build_specific = patch_wolfson_wm9704_specific, 427 + }; 428 + 384 429 int patch_wolfson04(ac97_t * ac97) 385 430 { 386 - // WM9704M/9704Q 387 - // set front and rear mixer volume 388 - snd_ac97_write_cache(ac97, AC97_WM97XX_FMIXER_VOL, 0x0808); 389 - snd_ac97_write_cache(ac97, AC97_WM9704_RMIXER_VOL, 0x0808); 390 - 391 - // patch for DVD noise 392 - snd_ac97_write_cache(ac97, AC97_WM9704_TEST, 0x0200); 393 - 394 - // init vol 395 - snd_ac97_write_cache(ac97, AC97_WM9704_RPCM_VOL, 0x0808); 396 - 397 - // set rear surround volume 398 - snd_ac97_write_cache(ac97, AC97_SURROUND_MASTER, 0x0000); 431 + /* WM9704M/9704Q */ 432 + ac97->build_ops = &patch_wolfson_wm9704_ops; 399 433 return 0; 400 434 } 401 - 435 + 436 + static int patch_wolfson_wm9705_specific(ac97_t * ac97) 437 + { 438 + int err, i; 439 + for (i = 0; i < ARRAY_SIZE(wm97xx_snd_ac97_controls); i++) { 440 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm97xx_snd_ac97_controls[i], ac97))) < 0) 441 + return err; 442 + } 443 + snd_ac97_write_cache(ac97, 0x72, 0x0808); 444 + return 0; 445 + } 446 + 447 + static struct snd_ac97_build_ops patch_wolfson_wm9705_ops = { 448 + .build_specific = patch_wolfson_wm9705_specific, 449 + }; 450 + 402 451 int patch_wolfson05(ac97_t * ac97) 403 452 { 404 - // WM9705, WM9710 405 - // set front mixer volume 406 - snd_ac97_write_cache(ac97, AC97_WM97XX_FMIXER_VOL, 0x0808); 453 + /* WM9705, WM9710 */ 454 + ac97->build_ops = &patch_wolfson_wm9705_ops; 407 455 return 0; 408 456 } 457 + 458 + static const char* wm9711_alc_select[] = {"None", "Left", "Right", "Stereo"}; 459 + static const char* wm9711_alc_mix[] = {"Stereo", "Right", "Left", "None"}; 460 + static const char* wm9711_out3_src[] = {"Left", "VREF", "Left + Right", "Mono"}; 461 + static const char* wm9711_out3_lrsrc[] = {"Master Mix", "Headphone Mix"}; 462 + static const char* wm9711_rec_adc[] = {"Stereo", "Left", "Right", "Mute"}; 463 + static const char* wm9711_base[] = {"Linear Control", "Adaptive Boost"}; 464 + static const char* wm9711_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"}; 465 + static const char* wm9711_mic[] = {"Mic 1", "Differential", "Mic 2", "Stereo"}; 466 + static const char* wm9711_rec_sel[] = 467 + {"Mic 1", "NC", "NC", "Master Mix", "Line", "Headphone Mix", "Phone Mix", "Phone"}; 468 + static const char* wm9711_ng_type[] = {"Constant Gain", "Mute"}; 469 + 470 + static const struct ac97_enum wm9711_enum[] = { 471 + AC97_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9711_alc_select), 472 + AC97_ENUM_SINGLE(AC97_VIDEO, 10, 4, wm9711_alc_mix), 473 + AC97_ENUM_SINGLE(AC97_AUX, 9, 4, wm9711_out3_src), 474 + AC97_ENUM_SINGLE(AC97_AUX, 8, 2, wm9711_out3_lrsrc), 475 + AC97_ENUM_SINGLE(AC97_REC_SEL, 12, 4, wm9711_rec_adc), 476 + AC97_ENUM_SINGLE(AC97_MASTER_TONE, 15, 2, wm9711_base), 477 + AC97_ENUM_DOUBLE(AC97_REC_GAIN, 14, 6, 2, wm9711_rec_gain), 478 + AC97_ENUM_SINGLE(AC97_MIC, 5, 4, wm9711_mic), 479 + AC97_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 8, wm9711_rec_sel), 480 + AC97_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9711_ng_type), 481 + }; 482 + 483 + static const snd_kcontrol_new_t wm9711_snd_ac97_controls[] = { 484 + AC97_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0), 485 + AC97_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0), 486 + AC97_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0), 487 + AC97_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0), 488 + AC97_ENUM("ALC Function", wm9711_enum[0]), 489 + AC97_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 1), 490 + AC97_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 1), 491 + AC97_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0), 492 + AC97_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0), 493 + AC97_ENUM("ALC NG Type", wm9711_enum[9]), 494 + AC97_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 1), 495 + 496 + AC97_SINGLE("Side Tone Switch", AC97_VIDEO, 15, 1, 1), 497 + AC97_SINGLE("Side Tone Volume", AC97_VIDEO, 12, 7, 1), 498 + AC97_ENUM("ALC Headphone Mux", wm9711_enum[1]), 499 + AC97_SINGLE("ALC Headphone Volume", AC97_VIDEO, 7, 7, 1), 500 + 501 + AC97_SINGLE("Out3 Switch", AC97_AUX, 15, 1, 1), 502 + AC97_SINGLE("Out3 ZC Switch", AC97_AUX, 7, 1, 1), 503 + AC97_ENUM("Out3 Mux", wm9711_enum[2]), 504 + AC97_ENUM("Out3 LR Mux", wm9711_enum[3]), 505 + AC97_SINGLE("Out3 Volume", AC97_AUX, 0, 31, 1), 506 + 507 + AC97_SINGLE("Beep to Headphone Switch", AC97_PC_BEEP, 15, 1, 1), 508 + AC97_SINGLE("Beep to Headphone Volume", AC97_PC_BEEP, 12, 7, 1), 509 + AC97_SINGLE("Beep to Side Tone Switch", AC97_PC_BEEP, 11, 1, 1), 510 + AC97_SINGLE("Beep to Side Tone Volume", AC97_PC_BEEP, 8, 7, 1), 511 + AC97_SINGLE("Beep to Phone Switch", AC97_PC_BEEP, 7, 1, 1), 512 + AC97_SINGLE("Beep to Phone Volume", AC97_PC_BEEP, 4, 7, 1), 513 + 514 + AC97_SINGLE("Aux to Headphone Switch", AC97_CD, 15, 1, 1), 515 + AC97_SINGLE("Aux to Headphone Volume", AC97_CD, 12, 7, 1), 516 + AC97_SINGLE("Aux to Side Tone Switch", AC97_CD, 11, 1, 1), 517 + AC97_SINGLE("Aux to Side Tone Volume", AC97_CD, 8, 7, 1), 518 + AC97_SINGLE("Aux to Phone Switch", AC97_CD, 7, 1, 1), 519 + AC97_SINGLE("Aux to Phone Volume", AC97_CD, 4, 7, 1), 520 + 521 + AC97_SINGLE("Phone to Headphone Switch", AC97_PHONE, 15, 1, 1), 522 + AC97_SINGLE("Phone to Master Switch", AC97_PHONE, 14, 1, 1), 523 + 524 + AC97_SINGLE("Line to Headphone Switch", AC97_LINE, 15, 1, 1), 525 + AC97_SINGLE("Line to Master Switch", AC97_LINE, 14, 1, 1), 526 + AC97_SINGLE("Line to Phone Switch", AC97_LINE, 13, 1, 1), 527 + 528 + AC97_SINGLE("PCM Playback to Headphone Switch", AC97_PCM, 15, 1, 1), 529 + AC97_SINGLE("PCM Playback to Master Switch", AC97_PCM, 14, 1, 1), 530 + AC97_SINGLE("PCM Playback to Phone Switch", AC97_PCM, 13, 1, 1), 531 + 532 + AC97_SINGLE("Capture 20dB Boost Switch", AC97_REC_SEL, 14, 1, 0), 533 + AC97_ENUM("Capture to Phone Mux", wm9711_enum[4]), 534 + AC97_SINGLE("Capture to Phone 20dB Boost Switch", AC97_REC_SEL, 11, 1, 1), 535 + AC97_ENUM("Capture Select", wm9711_enum[8]), 536 + 537 + AC97_SINGLE("3D Upper Cut-off Switch", AC97_3D_CONTROL, 5, 1, 1), 538 + AC97_SINGLE("3D Lower Cut-off Switch", AC97_3D_CONTROL, 4, 1, 1), 539 + 540 + AC97_ENUM("Bass Control", wm9711_enum[5]), 541 + AC97_SINGLE("Bass Cut-off Switch", AC97_MASTER_TONE, 12, 1, 1), 542 + AC97_SINGLE("Tone Cut-off Switch", AC97_MASTER_TONE, 4, 1, 1), 543 + AC97_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0), 544 + 545 + AC97_SINGLE("ADC Switch", AC97_REC_GAIN, 15, 1, 1), 546 + AC97_ENUM("Capture Volume Steps", wm9711_enum[6]), 547 + AC97_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 15, 1), 548 + AC97_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0), 549 + 550 + AC97_SINGLE("Mic 1 to Phone Switch", AC97_MIC, 14, 1, 1), 551 + AC97_SINGLE("Mic 2 to Phone Switch", AC97_MIC, 13, 1, 1), 552 + AC97_ENUM("Mic Select Source", wm9711_enum[7]), 553 + AC97_SINGLE("Mic 1 Volume", AC97_MIC, 8, 32, 1), 554 + AC97_SINGLE("Mic 20dB Boost Switch", AC97_MIC, 7, 1, 0), 555 + 556 + AC97_SINGLE("Master ZC Switch", AC97_MASTER, 7, 1, 0), 557 + AC97_SINGLE("Headphone ZC Switch", AC97_HEADPHONE, 7, 1, 0), 558 + AC97_SINGLE("Mono ZC Switch", AC97_MASTER_MONO, 7, 1, 0), 559 + }; 560 + 561 + static int patch_wolfson_wm9711_specific(ac97_t * ac97) 562 + { 563 + int err, i; 564 + 565 + for (i = 0; i < ARRAY_SIZE(wm9711_snd_ac97_controls); i++) { 566 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm9711_snd_ac97_controls[i], ac97))) < 0) 567 + return err; 568 + } 569 + snd_ac97_write_cache(ac97, AC97_CODEC_CLASS_REV, 0x0808); 570 + snd_ac97_write_cache(ac97, AC97_PCI_SVID, 0x0808); 571 + snd_ac97_write_cache(ac97, AC97_VIDEO, 0x0808); 572 + snd_ac97_write_cache(ac97, AC97_AUX, 0x0808); 573 + snd_ac97_write_cache(ac97, AC97_PC_BEEP, 0x0808); 574 + snd_ac97_write_cache(ac97, AC97_CD, 0x0000); 575 + return 0; 576 + } 577 + 578 + static struct snd_ac97_build_ops patch_wolfson_wm9711_ops = { 579 + .build_specific = patch_wolfson_wm9711_specific, 580 + }; 409 581 410 582 int patch_wolfson11(ac97_t * ac97) 411 583 { 412 - // WM9711, WM9712 413 - // set out3 volume 414 - snd_ac97_write_cache(ac97, AC97_WM9711_OUT3VOL, 0x0808); 584 + /* WM9711, WM9712 */ 585 + ac97->build_ops = &patch_wolfson_wm9711_ops; 586 + 587 + ac97->flags |= AC97_HAS_NO_REC_GAIN | AC97_STEREO_MUTES | AC97_HAS_NO_MIC | 588 + AC97_HAS_NO_PC_BEEP | AC97_HAS_NO_VIDEO | AC97_HAS_NO_CD; 589 + 415 590 return 0; 416 591 } 417 592 418 - static const char* wm9713_mic_mixer[] = {"Stereo", "Mic1", "Mic2", "Mute"}; 593 + static const char* wm9713_mic_mixer[] = {"Stereo", "Mic 1", "Mic 2", "Mute"}; 419 594 static const char* wm9713_rec_mux[] = {"Stereo", "Left", "Right", "Mute"}; 420 - static const char* wm9713_rec_src_l[] = {"Mic1", "Mic2", "Line L", "Mono In", "HP Mix L", "Spk Mix", "Mono Mix", "Zh"}; 421 - static const char* wm9713_rec_src_r[] = {"Mic1", "Mic2", "Line R", "Mono In", "HP Mix R", "Spk Mix", "Mono Mix", "Zh"}; 595 + static const char* wm9713_rec_src[] = 596 + {"Mic 1", "Mic 2", "Line", "Mono In", "Headphone Mix", "Master Mix", 597 + "Mono Mix", "Zh"}; 598 + static const char* wm9713_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"}; 599 + static const char* wm9713_alc_select[] = {"None", "Left", "Right", "Stereo"}; 600 + static const char* wm9713_mono_pga[] = {"Vmid", "Zh", "Mono Mix", "Inv 1"}; 601 + static const char* wm9713_spk_pga[] = 602 + {"Vmid", "Zh", "Headphone Mix", "Master Mix", "Inv", "NC", "NC", "NC"}; 603 + static const char* wm9713_hp_pga[] = {"Vmid", "Zh", "Headphone Mix", "NC"}; 604 + static const char* wm9713_out3_pga[] = {"Vmid", "Zh", "Inv 1", "NC"}; 605 + static const char* wm9713_out4_pga[] = {"Vmid", "Zh", "Inv 2", "NC"}; 606 + static const char* wm9713_dac_inv[] = 607 + {"Off", "Mono Mix", "Master Mix", "Headphone Mix L", "Headphone Mix R", 608 + "Headphone Mix Mono", "NC", "Vmid"}; 609 + static const char* wm9713_base[] = {"Linear Control", "Adaptive Boost"}; 610 + static const char* wm9713_ng_type[] = {"Constant Gain", "Mute"}; 422 611 423 612 static const struct ac97_enum wm9713_enum[] = { 424 613 AC97_ENUM_SINGLE(AC97_LINE, 3, 4, wm9713_mic_mixer), 425 614 AC97_ENUM_SINGLE(AC97_VIDEO, 14, 4, wm9713_rec_mux), 426 615 AC97_ENUM_SINGLE(AC97_VIDEO, 9, 4, wm9713_rec_mux), 427 - AC97_ENUM_SINGLE(AC97_VIDEO, 3, 8, wm9713_rec_src_l), 428 - AC97_ENUM_SINGLE(AC97_VIDEO, 0, 8, wm9713_rec_src_r), 616 + AC97_ENUM_DOUBLE(AC97_VIDEO, 3, 0, 8, wm9713_rec_src), 617 + AC97_ENUM_DOUBLE(AC97_CD, 14, 6, 2, wm9713_rec_gain), 618 + AC97_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9713_alc_select), 619 + AC97_ENUM_SINGLE(AC97_REC_GAIN, 14, 4, wm9713_mono_pga), 620 + AC97_ENUM_DOUBLE(AC97_REC_GAIN, 11, 8, 8, wm9713_spk_pga), 621 + AC97_ENUM_DOUBLE(AC97_REC_GAIN, 6, 4, 4, wm9713_hp_pga), 622 + AC97_ENUM_SINGLE(AC97_REC_GAIN, 2, 4, wm9713_out3_pga), 623 + AC97_ENUM_SINGLE(AC97_REC_GAIN, 0, 4, wm9713_out4_pga), 624 + AC97_ENUM_DOUBLE(AC97_REC_GAIN_MIC, 13, 10, 8, wm9713_dac_inv), 625 + AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, wm9713_base), 626 + AC97_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9713_ng_type), 429 627 }; 430 628 431 - static const snd_kcontrol_new_t wm13_snd_ac97_controls_line_in[] = { 629 + static const snd_kcontrol_new_t wm13_snd_ac97_controls[] = { 432 630 AC97_DOUBLE("Line In Volume", AC97_PC_BEEP, 8, 0, 31, 1), 433 - AC97_SINGLE("Line In to Headphone Mute", AC97_PC_BEEP, 15, 1, 1), 434 - AC97_SINGLE("Line In to Speaker Mute", AC97_PC_BEEP, 14, 1, 1), 435 - AC97_SINGLE("Line In to Mono Mute", AC97_PC_BEEP, 13, 1, 1), 631 + AC97_SINGLE("Line In to Headphone Switch", AC97_PC_BEEP, 15, 1, 1), 632 + AC97_SINGLE("Line In to Master Switch", AC97_PC_BEEP, 14, 1, 1), 633 + AC97_SINGLE("Line In to Mono Switch", AC97_PC_BEEP, 13, 1, 1), 634 + 635 + AC97_DOUBLE("PCM Playback Volume", AC97_PHONE, 8, 0, 31, 1), 636 + AC97_SINGLE("PCM Playback to Headphone Switch", AC97_PHONE, 15, 1, 1), 637 + AC97_SINGLE("PCM Playback to Master Switch", AC97_PHONE, 14, 1, 1), 638 + AC97_SINGLE("PCM Playback to Mono Switch", AC97_PHONE, 13, 1, 1), 639 + 640 + AC97_SINGLE("Mic 1 Volume", AC97_MIC, 8, 31, 1), 641 + AC97_SINGLE("Mic 2 Volume", AC97_MIC, 0, 31, 1), 642 + AC97_SINGLE("Mic 1 to Mono Switch", AC97_LINE, 7, 1, 1), 643 + AC97_SINGLE("Mic 2 to Mono Switch", AC97_LINE, 6, 1, 1), 644 + AC97_SINGLE("Mic Boost (+20dB) Switch", AC97_LINE, 5, 1, 0), 645 + AC97_ENUM("Mic to Headphone Mux", wm9713_enum[0]), 646 + AC97_SINGLE("Mic Headphone Mixer Volume", AC97_LINE, 0, 7, 1), 647 + 648 + AC97_SINGLE("Capture Switch", AC97_CD, 15, 1, 1), 649 + AC97_ENUM("Capture Volume Steps", wm9713_enum[4]), 650 + AC97_DOUBLE("Capture Volume", AC97_CD, 8, 0, 15, 0), 651 + AC97_SINGLE("Capture ZC Switch", AC97_CD, 7, 1, 0), 652 + 653 + AC97_ENUM("Capture to Headphone Mux", wm9713_enum[1]), 654 + AC97_SINGLE("Capture to Headphone Volume", AC97_VIDEO, 11, 7, 1), 655 + AC97_ENUM("Capture to Mono Mux", wm9713_enum[2]), 656 + AC97_SINGLE("Capture to Mono Boost (+20dB) Switch", AC97_VIDEO, 8, 1, 0), 657 + AC97_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0), 658 + AC97_ENUM("Capture Select", wm9713_enum[3]), 659 + 660 + AC97_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0), 661 + AC97_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0), 662 + AC97_SINGLE("ALC Decay Time ", AC97_CODEC_CLASS_REV, 4, 15, 0), 663 + AC97_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0), 664 + AC97_ENUM("ALC Function", wm9713_enum[5]), 665 + AC97_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0), 666 + AC97_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 0), 667 + AC97_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0), 668 + AC97_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0), 669 + AC97_ENUM("ALC NG Type", wm9713_enum[13]), 670 + AC97_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 0), 671 + 672 + AC97_DOUBLE("Master ZC Switch", AC97_MASTER, 14, 6, 1, 0), 673 + AC97_DOUBLE("Headphone ZC Switch", AC97_HEADPHONE, 14, 6, 1, 0), 674 + AC97_DOUBLE("Out3/4 ZC Switch", AC97_MASTER_MONO, 14, 6, 1, 0), 675 + AC97_SINGLE("Master Right Switch", AC97_MASTER, 7, 1, 1), 676 + AC97_SINGLE("Headphone Right Switch", AC97_HEADPHONE, 7, 1, 1), 677 + AC97_SINGLE("Out3/4 Right Switch", AC97_MASTER_MONO, 7, 1, 1), 678 + 679 + AC97_SINGLE("Mono In to Headphone Switch", AC97_MASTER_TONE, 15, 1, 1), 680 + AC97_SINGLE("Mono In to Master Switch", AC97_MASTER_TONE, 14, 1, 1), 681 + AC97_SINGLE("Mono In Volume", AC97_MASTER_TONE, 8, 31, 1), 682 + AC97_SINGLE("Mono Switch", AC97_MASTER_TONE, 7, 1, 1), 683 + AC97_SINGLE("Mono ZC Switch", AC97_MASTER_TONE, 6, 1, 0), 684 + AC97_SINGLE("Mono Volume", AC97_MASTER_TONE, 0, 31, 1), 685 + 686 + AC97_SINGLE("PC Beep to Headphone Switch", AC97_AUX, 15, 1, 1), 687 + AC97_SINGLE("PC Beep to Headphone Volume", AC97_AUX, 12, 7, 1), 688 + AC97_SINGLE("PC Beep to Master Switch", AC97_AUX, 11, 1, 1), 689 + AC97_SINGLE("PC Beep to Master Volume", AC97_AUX, 8, 7, 1), 690 + AC97_SINGLE("PC Beep to Mono Switch", AC97_AUX, 7, 1, 1), 691 + AC97_SINGLE("PC Beep to Mono Volume", AC97_AUX, 4, 7, 1), 692 + 693 + AC97_SINGLE("Voice to Headphone Switch", AC97_PCM, 15, 1, 1), 694 + AC97_SINGLE("Voice to Headphone Volume", AC97_PCM, 12, 7, 1), 695 + AC97_SINGLE("Voice to Master Switch", AC97_PCM, 11, 1, 1), 696 + AC97_SINGLE("Voice to Master Volume", AC97_PCM, 8, 7, 1), 697 + AC97_SINGLE("Voice to Mono Switch", AC97_PCM, 7, 1, 1), 698 + AC97_SINGLE("Voice to Mono Volume", AC97_PCM, 4, 7, 1), 699 + 700 + AC97_SINGLE("Aux to Headphone Switch", AC97_REC_SEL, 15, 1, 1), 701 + AC97_SINGLE("Aux to Headphone Volume", AC97_REC_SEL, 12, 7, 1), 702 + AC97_SINGLE("Aux to Master Switch", AC97_REC_SEL, 11, 1, 1), 703 + AC97_SINGLE("Aux to Master Volume", AC97_REC_SEL, 8, 7, 1), 704 + AC97_SINGLE("Aux to Mono Switch", AC97_REC_SEL, 7, 1, 1), 705 + AC97_SINGLE("Aux to Mono Volume", AC97_REC_SEL, 4, 7, 1), 706 + 707 + AC97_ENUM("Mono Input Mux", wm9713_enum[6]), 708 + AC97_ENUM("Master Input Mux", wm9713_enum[7]), 709 + AC97_ENUM("Headphone Input Mux", wm9713_enum[8]), 710 + AC97_ENUM("Out 3 Input Mux", wm9713_enum[9]), 711 + AC97_ENUM("Out 4 Input Mux", wm9713_enum[10]), 712 + 713 + AC97_ENUM("Bass Control", wm9713_enum[12]), 714 + AC97_SINGLE("Bass Cut-off Switch", AC97_GENERAL_PURPOSE, 12, 1, 1), 715 + AC97_SINGLE("Tone Cut-off Switch", AC97_GENERAL_PURPOSE, 4, 1, 1), 716 + AC97_SINGLE("Playback Attenuate (-6dB) Switch", AC97_GENERAL_PURPOSE, 6, 1, 0), 717 + AC97_SINGLE("Bass Volume", AC97_GENERAL_PURPOSE, 8, 15, 1), 718 + AC97_SINGLE("Tone Volume", AC97_GENERAL_PURPOSE, 0, 15, 1), 436 719 }; 437 720 438 - static const snd_kcontrol_new_t wm13_snd_ac97_controls_dac[] = { 439 - AC97_DOUBLE("DAC Volume", AC97_PHONE, 8, 0, 31, 1), 440 - AC97_SINGLE("DAC to Headphone Mute", AC97_PHONE, 15, 1, 1), 441 - AC97_SINGLE("DAC to Speaker Mute", AC97_PHONE, 14, 1, 1), 442 - AC97_SINGLE("DAC to Mono Mute", AC97_PHONE, 13, 1, 1), 721 + static const snd_kcontrol_new_t wm13_snd_ac97_controls_3d[] = { 722 + AC97_ENUM("Inv Input Mux", wm9713_enum[11]), 723 + AC97_SINGLE("3D Upper Cut-off Switch", AC97_REC_GAIN_MIC, 5, 1, 0), 724 + AC97_SINGLE("3D Lower Cut-off Switch", AC97_REC_GAIN_MIC, 4, 1, 0), 725 + AC97_SINGLE("3D Depth", AC97_REC_GAIN_MIC, 0, 15, 1), 443 726 }; 444 727 445 - static const snd_kcontrol_new_t wm13_snd_ac97_controls_mic[] = { 446 - AC97_SINGLE("MICA Volume", AC97_MIC, 8, 31, 1), 447 - AC97_SINGLE("MICB Volume", AC97_MIC, 0, 31, 1), 448 - AC97_SINGLE("MICA to Mono Mute", AC97_LINE, 7, 1, 1), 449 - AC97_SINGLE("MICB to Mono Mute", AC97_LINE, 6, 1, 1), 450 - AC97_SINGLE("MIC Boost (+20dB)", AC97_LINE, 5, 1, 1), 451 - AC97_ENUM("MIC Headphone Routing", wm9713_enum[0]), 452 - AC97_SINGLE("MIC Headphone Mixer Volume", AC97_LINE, 0, 7, 1) 453 - }; 454 - 455 - static const snd_kcontrol_new_t wm13_snd_ac97_controls_adc[] = { 456 - AC97_SINGLE("ADC Mute", AC97_CD, 15, 1, 1), 457 - AC97_DOUBLE("Gain Step Size (1.5dB/0.75dB)", AC97_CD, 14, 6, 1, 1), 458 - AC97_DOUBLE("ADC Volume",AC97_CD, 8, 0, 15, 0), 459 - AC97_SINGLE("ADC Zero Cross", AC97_CD, 7, 1, 1), 460 - }; 461 - 462 - static const snd_kcontrol_new_t wm13_snd_ac97_controls_recsel[] = { 463 - AC97_ENUM("Record to Headphone Path", wm9713_enum[1]), 464 - AC97_SINGLE("Record to Headphone Volume", AC97_VIDEO, 11, 7, 0), 465 - AC97_ENUM("Record to Mono Path", wm9713_enum[2]), 466 - AC97_SINGLE("Record to Mono Boost (+20dB)", AC97_VIDEO, 8, 1, 0), 467 - AC97_SINGLE("Record ADC Boost (+20dB)", AC97_VIDEO, 6, 1, 0), 468 - AC97_ENUM("Record Select Left", wm9713_enum[3]), 469 - AC97_ENUM("Record Select Right", wm9713_enum[4]), 470 - }; 728 + static int patch_wolfson_wm9713_3d (ac97_t * ac97) 729 + { 730 + int err, i; 731 + 732 + for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_3d); i++) { 733 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_3d[i], ac97))) < 0) 734 + return err; 735 + } 736 + return 0; 737 + } 471 738 472 739 static int patch_wolfson_wm9713_specific(ac97_t * ac97) 473 740 { 474 741 int err, i; 475 742 476 - for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_line_in); i++) { 477 - if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_line_in[i], ac97))) < 0) 743 + for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls); i++) { 744 + if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls[i], ac97))) < 0) 478 745 return err; 479 746 } 480 747 snd_ac97_write_cache(ac97, AC97_PC_BEEP, 0x0808); 481 - 482 - for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_dac); i++) { 483 - if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_dac[i], ac97))) < 0) 484 - return err; 485 - } 486 748 snd_ac97_write_cache(ac97, AC97_PHONE, 0x0808); 487 - 488 - for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_mic); i++) { 489 - if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_mic[i], ac97))) < 0) 490 - return err; 491 - } 492 749 snd_ac97_write_cache(ac97, AC97_MIC, 0x0808); 493 750 snd_ac97_write_cache(ac97, AC97_LINE, 0x00da); 494 - 495 - for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_adc); i++) { 496 - if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_adc[i], ac97))) < 0) 497 - return err; 498 - } 499 751 snd_ac97_write_cache(ac97, AC97_CD, 0x0808); 500 - 501 - for (i = 0; i < ARRAY_SIZE(wm13_snd_ac97_controls_recsel); i++) { 502 - if ((err = snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&wm13_snd_ac97_controls_recsel[i], ac97))) < 0) 503 - return err; 504 - } 505 752 snd_ac97_write_cache(ac97, AC97_VIDEO, 0xd612); 506 753 snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x1ba0); 507 - 508 754 return 0; 509 755 } 510 756 ··· 771 525 772 526 static struct snd_ac97_build_ops patch_wolfson_wm9713_ops = { 773 527 .build_specific = patch_wolfson_wm9713_specific, 528 + .build_3d = patch_wolfson_wm9713_3d, 774 529 #ifdef CONFIG_PM 775 530 .suspend = patch_wolfson_wm9713_suspend, 776 531 .resume = patch_wolfson_wm9713_resume ··· 780 533 781 534 int patch_wolfson13(ac97_t * ac97) 782 535 { 536 + /* WM9713, WM9714 */ 783 537 ac97->build_ops = &patch_wolfson_wm9713_ops; 784 538 785 539 ac97->flags |= AC97_HAS_NO_REC_GAIN | AC97_STEREO_MUTES | AC97_HAS_NO_PHONE | 786 - AC97_HAS_NO_PC_BEEP | AC97_HAS_NO_VIDEO | AC97_HAS_NO_CD; 540 + AC97_HAS_NO_PC_BEEP | AC97_HAS_NO_VIDEO | AC97_HAS_NO_CD | AC97_HAS_NO_TONE | 541 + AC97_HAS_NO_STD_PCM; 542 + ac97->scaps &= ~AC97_SCAP_MODEM; 787 543 788 544 snd_ac97_write_cache(ac97, AC97_EXTENDED_MID, 0xda00); 789 545 snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0x3810); ··· 1629 1379 u32 subid = ((u32)ac97->subsystem_vendor << 16) | ac97->subsystem_device; 1630 1380 switch (subid) { 1631 1381 case 0x103c0890: /* HP nc6000 */ 1382 + case 0x103c099c: /* HP nx6110 */ 1632 1383 case 0x103c006d: /* HP nx9105 */ 1633 1384 case 0x17340088: /* FSC Scenic-W */ 1634 1385 /* enable headphone jack sense */ ··· 1957 1706 }; 1958 1707 1959 1708 static const snd_kcontrol_new_t snd_ac97_spdif_controls_alc650[] = { 1960 - AC97_SINGLE("IEC958 Capture Switch", AC97_ALC650_MULTICH, 11, 1, 0), 1709 + AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), AC97_ALC650_MULTICH, 11, 1, 0), 1961 1710 AC97_SINGLE("Analog to IEC958 Output", AC97_ALC650_MULTICH, 12, 1, 0), 1962 1711 /* disable this controls since it doesn't work as expected */ 1963 1712 /* AC97_SINGLE("IEC958 Input Monitor", AC97_ALC650_MULTICH, 13, 1, 0), */ ··· 2100 1849 } 2101 1850 2102 1851 static const snd_kcontrol_new_t snd_ac97_spdif_controls_alc655[] = { 2103 - AC97_PAGE_SINGLE("IEC958 Capture Switch", AC97_ALC650_MULTICH, 11, 1, 0, 0), 1852 + AC97_PAGE_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), AC97_ALC650_MULTICH, 11, 1, 0, 0), 2104 1853 /* disable this controls since it doesn't work as expected */ 2105 1854 /* AC97_PAGE_SINGLE("IEC958 Input Monitor", AC97_ALC650_MULTICH, 14, 1, 0, 0), */ 2106 1855 { 2107 1856 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2108 - .name = "IEC958 Playback Route", 1857 + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", 2109 1858 .info = alc655_iec958_route_info, 2110 1859 .get = alc655_iec958_route_get, 2111 1860 .put = alc655_iec958_route_put, ··· 2667 2416 } 2668 2417 2669 2418 /* 2419 + * VT1617A codec 2420 + */ 2421 + int patch_vt1617a(ac97_t * ac97) 2422 + { 2423 + ac97->ext_id |= AC97_EI_SPDIF; /* force the detection of spdif */ 2424 + ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000; 2425 + return 0; 2426 + } 2427 + 2428 + /* 2670 2429 */ 2671 2430 static void it2646_update_jacks(ac97_t *ac97) 2672 2431 { ··· 2694 2433 }; 2695 2434 2696 2435 static const snd_kcontrol_new_t snd_ac97_spdif_controls_it2646[] = { 2697 - AC97_SINGLE("IEC958 Capture Switch", 0x76, 11, 1, 0), 2436 + AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0x76, 11, 1, 0), 2698 2437 AC97_SINGLE("Analog to IEC958 Output", 0x76, 12, 1, 0), 2699 2438 AC97_SINGLE("IEC958 Input Monitor", 0x76, 13, 1, 0), 2700 2439 };
+1
sound/pci/ac97/ac97_patch.h
··· 56 56 int patch_cm9761(ac97_t * ac97); 57 57 int patch_cm9780(ac97_t * ac97); 58 58 int patch_vt1616(ac97_t * ac97); 59 + int patch_vt1617a(ac97_t * ac97); 59 60 int patch_it2646(ac97_t * ac97); 60 61 int mpatch_si3036(ac97_t * ac97);
+3 -3
sound/pci/ali5451/ali5451.c
··· 1842 1842 return 0; 1843 1843 } 1844 1844 1845 - struct ali_pcm_description ali_pcms[] = { 1845 + static struct ali_pcm_description ali_pcms[] = { 1846 1846 { "ALI 5451", ALI_CHANNELS, 1, &snd_ali_playback_ops, &snd_ali_capture_ops }, 1847 1847 { "ALI 5451 modem", 1, 1, &snd_ali_modem_playback_ops, &snd_ali_modem_capture_ops } 1848 1848 }; ··· 1959 1959 static snd_kcontrol_new_t snd_ali5451_mixer_spdif[] __devinitdata = { 1960 1960 /* spdif aplayback switch */ 1961 1961 /* FIXME: "IEC958 Playback Switch" may conflict with one on ac97_codec */ 1962 - ALI5451_SPDIF("IEC958 Output switch", 0, 0), 1962 + ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 0, 0), 1963 1963 /* spdif out to spdif channel */ 1964 - ALI5451_SPDIF("IEC958 Channel Output Switch", 0, 1), 1964 + ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("Channel Output ",NONE,SWITCH), 0, 1), 1965 1965 /* spdif in from spdif channel */ 1966 1966 ALI5451_SPDIF(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), 0, 2) 1967 1967 };
+9 -1
sound/pci/atiixp.c
··· 248 248 unsigned int period_bytes, periods; 249 249 int opened; 250 250 int running; 251 + int suspended; 251 252 int pcm_open_flag; 252 253 int ac97_pcm_type; /* index # of ac97_pcm to access, -1 = not used */ 253 254 unsigned int saved_curptr; ··· 700 699 spin_lock(&chip->reg_lock); 701 700 switch (cmd) { 702 701 case SNDRV_PCM_TRIGGER_START: 702 + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 703 + case SNDRV_PCM_TRIGGER_RESUME: 703 704 dma->ops->enable_transfer(chip, 1); 704 705 dma->running = 1; 706 + dma->suspended = 0; 705 707 break; 706 708 case SNDRV_PCM_TRIGGER_STOP: 709 + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 710 + case SNDRV_PCM_TRIGGER_SUSPEND: 707 711 dma->ops->enable_transfer(chip, 0); 708 712 dma->running = 0; 713 + dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND; 709 714 break; 710 715 default: 711 716 err = -EINVAL; ··· 982 975 { 983 976 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 984 977 SNDRV_PCM_INFO_BLOCK_TRANSFER | 978 + SNDRV_PCM_INFO_PAUSE | 985 979 SNDRV_PCM_INFO_RESUME | 986 980 SNDRV_PCM_INFO_MMAP_VALID), 987 981 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE, ··· 1451 1443 for (i = 0; i < NUM_ATI_PCMDEVS; i++) 1452 1444 if (chip->pcmdevs[i]) { 1453 1445 atiixp_dma_t *dma = &chip->dmas[i]; 1454 - if (dma->substream && dma->running) { 1446 + if (dma->substream && dma->suspended) { 1455 1447 dma->ops->enable_dma(chip, 1); 1456 1448 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN, 1457 1449 chip->remap_addr + dma->ops->llp_offset);
+6 -4
sound/pci/au88x0/au88x0_pcm.c
··· 33 33 /* hardware definition */ 34 34 static snd_pcm_hardware_t snd_vortex_playback_hw_adb = { 35 35 .info = 36 - (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_RESUME | 36 + (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ 37 37 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | 38 38 SNDRV_PCM_INFO_MMAP_VALID), 39 39 .formats = ··· 58 58 #ifndef CHIP_AU8820 59 59 static snd_pcm_hardware_t snd_vortex_playback_hw_a3d = { 60 60 .info = 61 - (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_RESUME | 61 + (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ 62 62 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | 63 63 SNDRV_PCM_INFO_MMAP_VALID), 64 64 .formats = ··· 78 78 #endif 79 79 static snd_pcm_hardware_t snd_vortex_playback_hw_spdif = { 80 80 .info = 81 - (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_RESUME | 81 + (SNDRV_PCM_INFO_MMAP | /* SNDRV_PCM_INFO_RESUME | */ 82 82 SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_INTERLEAVED | 83 83 SNDRV_PCM_INFO_MMAP_VALID), 84 84 .formats = ··· 220 220 vortex_adb_allocroute(chip, -1, 221 221 params_channels(hw_params), 222 222 substream->stream, type); 223 - if (dma < 0) 223 + if (dma < 0) { 224 + spin_unlock_irq(&chip->lock); 224 225 return dma; 226 + } 225 227 stream = substream->runtime->private_data = &chip->dma_adb[dma]; 226 228 stream->substream = substream; 227 229 /* Setup Buffers. */
+8
sound/pci/ca0106/ca0106_main.c
··· 188 188 .name = "MSI K8N Diamond MB [SB0438]", 189 189 .gpio_type = 1, 190 190 .i2c_adc = 1 } , 191 + /* Shuttle XPC SD31P which has an onboard Creative Labs Sound Blaster Live! 24-bit EAX 192 + * high-definition 7.1 audio processor". 193 + * Added using info from andrewvegan in alsa bug #1298 194 + */ 195 + { .serial = 0x30381297, 196 + .name = "Shuttle XPC SD31P [SD31P]", 197 + .gpio_type = 1, 198 + .i2c_adc = 1 } , 191 199 { .serial = 0, 192 200 .name = "AudigyLS [Unknown]" } 193 201 };
+2 -2
sound/pci/ca0106/ca0106_mixer.c
··· 297 297 static snd_kcontrol_new_t snd_ca0106_spdif_mask_control = 298 298 { 299 299 .access = SNDRV_CTL_ELEM_ACCESS_READ, 300 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 300 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 301 301 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), 302 302 .count = 4, 303 303 .info = snd_ca0106_spdif_info, ··· 306 306 307 307 static snd_kcontrol_new_t snd_ca0106_spdif_control = 308 308 { 309 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 309 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 310 310 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), 311 311 .count = 4, 312 312 .info = snd_ca0106_spdif_info,
+1 -1
sound/pci/cmipci.c
··· 1029 1029 static snd_kcontrol_new_t snd_cmipci_spdif_mask __devinitdata = 1030 1030 { 1031 1031 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1032 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1032 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1033 1033 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 1034 1034 .info = snd_cmipci_spdif_mask_info, 1035 1035 .get = snd_cmipci_spdif_mask_get,
+1 -1
sound/pci/cs46xx/cs46xx.c
··· 113 113 return err; 114 114 } 115 115 #endif 116 - if ((err = snd_cs46xx_mixer(chip)) < 0) { 116 + if ((err = snd_cs46xx_mixer(chip, 2)) < 0) { 117 117 snd_card_free(card); 118 118 return err; 119 119 }
+10 -8
sound/pci/cs46xx/cs46xx_lib.c
··· 1243 1243 { 1244 1244 .info = (SNDRV_PCM_INFO_MMAP | 1245 1245 SNDRV_PCM_INFO_INTERLEAVED | 1246 - SNDRV_PCM_INFO_BLOCK_TRANSFER | 1247 - SNDRV_PCM_INFO_RESUME), 1246 + SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/ 1247 + /*SNDRV_PCM_INFO_RESUME*/), 1248 1248 .formats = (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 | 1249 1249 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | 1250 1250 SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE), ··· 1265 1265 { 1266 1266 .info = (SNDRV_PCM_INFO_MMAP | 1267 1267 SNDRV_PCM_INFO_INTERLEAVED | 1268 - SNDRV_PCM_INFO_BLOCK_TRANSFER | 1269 - SNDRV_PCM_INFO_RESUME), 1268 + SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/ 1269 + /*SNDRV_PCM_INFO_RESUME*/), 1270 1270 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1271 1271 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, 1272 1272 .rate_min = 5500, ··· 2231 2231 }, 2232 2232 { 2233 2233 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2234 - .name = "IEC958 Output Switch", 2234 + .name = SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 2235 2235 .info = snd_mixer_boolean_info, 2236 2236 .get = snd_cs46xx_iec958_get, 2237 2237 .put = snd_cs46xx_iec958_put, ··· 2239 2239 }, 2240 2240 { 2241 2241 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2242 - .name = "IEC958 Input Switch", 2242 + .name = SNDRV_CTL_NAME_IEC958("Input ",NONE,SWITCH), 2243 2243 .info = snd_mixer_boolean_info, 2244 2244 .get = snd_cs46xx_iec958_get, 2245 2245 .put = snd_cs46xx_iec958_put, ··· 2249 2249 /* Input IEC958 volume does not work for the moment. (Benny) */ 2250 2250 { 2251 2251 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2252 - .name = "IEC958 Input Volume", 2252 + .name = SNDRV_CTL_NAME_IEC958("Input ",NONE,VOLUME), 2253 2253 .info = snd_cs46xx_vol_info, 2254 2254 .get = snd_cs46xx_vol_iec958_get, 2255 2255 .put = snd_cs46xx_vol_iec958_put, ··· 2440 2440 return -ENXIO; 2441 2441 } 2442 2442 2443 - int __devinit snd_cs46xx_mixer(cs46xx_t *chip) 2443 + int __devinit snd_cs46xx_mixer(cs46xx_t *chip, int spdif_device) 2444 2444 { 2445 2445 snd_card_t *card = chip->card; 2446 2446 snd_ctl_elem_id_t id; ··· 2476 2476 for (idx = 0; idx < ARRAY_SIZE(snd_cs46xx_controls); idx++) { 2477 2477 snd_kcontrol_t *kctl; 2478 2478 kctl = snd_ctl_new1(&snd_cs46xx_controls[idx], chip); 2479 + if (kctl && kctl->id.iface == SNDRV_CTL_ELEM_IFACE_PCM) 2480 + kctl->id.device = spdif_device; 2479 2481 if ((err = snd_ctl_add(card, kctl)) < 0) 2480 2482 return err; 2481 2483 }
+1 -1
sound/pci/emu10k1/emu10k1.c
··· 149 149 } 150 150 } 151 151 152 - if ((err = snd_emu10k1_mixer(emu)) < 0) { 152 + if ((err = snd_emu10k1_mixer(emu, 0, 3)) < 0) { 153 153 snd_card_free(card); 154 154 return err; 155 155 }
+8
sound/pci/emu10k1/emu10k1_main.c
··· 741 741 .emu10k1_chip = 1, 742 742 .ac97_chip = 1, 743 743 .sblive51 = 1} , 744 + /* Tested by Thomas Zehetbauer 27th Aug 2005 */ 745 + {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80651102, 746 + .driver = "EMU10K1", .name = "SB Live 5.1 [SB0220]", 747 + .id = "Live", 748 + .emu10k1_chip = 1, 749 + .ac97_chip = 1, 750 + .sblive51 = 1} , 744 751 {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80641102, 745 752 .driver = "EMU10K1", .name = "SB Live 5.1", 746 753 .id = "Live", 747 754 .emu10k1_chip = 1, 748 755 .ac97_chip = 1, 749 756 .sblive51 = 1} , 757 + /* Tested by alsa bugtrack user "hus" 12th Sept 2005 */ 750 758 {.vendor = 0x1102, .device = 0x0002, .subsystem = 0x80611102, 751 759 .driver = "EMU10K1", .name = "SBLive! Player 5.1 [SB0060]", 752 760 .id = "Live",
+2 -2
sound/pci/emu10k1/emu10k1x.c
··· 1183 1183 static snd_kcontrol_new_t snd_emu10k1x_spdif_mask_control = 1184 1184 { 1185 1185 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1186 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1186 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1187 1187 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), 1188 1188 .count = 3, 1189 1189 .info = snd_emu10k1x_spdif_info, ··· 1192 1192 1193 1193 static snd_kcontrol_new_t snd_emu10k1x_spdif_control = 1194 1194 { 1195 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1195 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1196 1196 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), 1197 1197 .count = 3, 1198 1198 .info = snd_emu10k1x_spdif_info,
+13 -13
sound/pci/emu10k1/emufx.c
··· 1159 1159 /* Optical SPDIF Playback Volume */ 1160 1160 A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L); 1161 1161 A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1162 - snd_emu10k1_init_stereo_control(&controls[nctl++], "IEC958 Optical Playback Volume", gpr, 0); 1162 + snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",PLAYBACK,VOLUME), gpr, 0); 1163 1163 gpr += 2; 1164 1164 /* Optical SPDIF Capture Volume */ 1165 1165 A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L); 1166 1166 A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R); 1167 - snd_emu10k1_init_stereo_control(&controls[nctl++], "IEC958 Optical Capture Volume", gpr, 0); 1167 + snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",CAPTURE,VOLUME), gpr, 0); 1168 1168 gpr += 2; 1169 1169 1170 1170 /* Line2 Playback Volume */ ··· 1389 1389 A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000); 1390 1390 } 1391 1391 } 1392 - snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "IEC958 Optical Raw Playback Switch", gpr, 0); 1392 + snd_emu10k1_init_stereo_onoff_control(controls + nctl++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0); 1393 1393 gpr += 2; 1394 1394 1395 1395 A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS); ··· 1716 1716 /* IEC958 TTL Playback Volume */ 1717 1717 for (z = 0; z < 2; z++) 1718 1718 VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_SPDIF_CD_L + z, gpr + z); 1719 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 TTL Playback Volume", gpr, 0); 1719 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",PLAYBACK,VOLUME), gpr, 0); 1720 1720 gpr += 2; 1721 1721 1722 1722 /* IEC958 TTL Capture Volume + Switch */ ··· 1724 1724 SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_SPDIF_CD_L + z, gpr + 2 + z); 1725 1725 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z); 1726 1726 } 1727 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 TTL Capture Volume", gpr, 0); 1728 - snd_emu10k1_init_stereo_onoff_control(controls + i++, "IEC958 TTL Capture Switch", gpr + 2, 0); 1727 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,VOLUME), gpr, 0); 1728 + snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,SWITCH), gpr + 2, 0); 1729 1729 gpr += 4; 1730 1730 } 1731 1731 ··· 1750 1750 /* IEC958 Optical Playback Volume */ 1751 1751 for (z = 0; z < 2; z++) 1752 1752 VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_TOSLINK_L + z, gpr + z); 1753 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 LiveDrive Playback Volume", gpr, 0); 1753 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",PLAYBACK,VOLUME), gpr, 0); 1754 1754 gpr += 2; 1755 1755 1756 1756 /* IEC958 Optical Capture Volume */ ··· 1758 1758 SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_TOSLINK_L + z, gpr + 2 + z); 1759 1759 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z); 1760 1760 } 1761 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 LiveDrive Capture Volume", gpr, 0); 1762 - snd_emu10k1_init_stereo_onoff_control(controls + i++, "IEC958 LiveDrive Capture Switch", gpr + 2, 0); 1761 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,VOLUME), gpr, 0); 1762 + snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,SWITCH), gpr + 2, 0); 1763 1763 gpr += 4; 1764 1764 } 1765 1765 ··· 1784 1784 /* IEC958 Coax Playback Volume */ 1785 1785 for (z = 0; z < 2; z++) 1786 1786 VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_COAX_SPDIF_L + z, gpr + z); 1787 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 Coaxial Playback Volume", gpr, 0); 1787 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",PLAYBACK,VOLUME), gpr, 0); 1788 1788 gpr += 2; 1789 1789 1790 1790 /* IEC958 Coax Capture Volume + Switch */ ··· 1792 1792 SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_COAX_SPDIF_L + z, gpr + 2 + z); 1793 1793 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z); 1794 1794 } 1795 - snd_emu10k1_init_stereo_control(controls + i++, "IEC958 Coaxial Capture Volume", gpr, 0); 1796 - snd_emu10k1_init_stereo_onoff_control(controls + i++, "IEC958 Coaxial Capture Switch", gpr + 2, 0); 1795 + snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,VOLUME), gpr, 0); 1796 + snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,SWITCH), gpr + 2, 0); 1797 1797 gpr += 4; 1798 1798 } 1799 1799 ··· 1920 1920 #endif 1921 1921 } 1922 1922 1923 - snd_emu10k1_init_stereo_onoff_control(controls + i++, "IEC958 Optical Raw Playback Switch", gpr, 0); 1923 + snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0); 1924 1924 gpr += 2; 1925 1925 } 1926 1926
+17 -6
sound/pci/emu10k1/emumixer.c
··· 181 181 static snd_kcontrol_new_t snd_emu10k1_spdif_mask_control = 182 182 { 183 183 .access = SNDRV_CTL_ELEM_ACCESS_READ, 184 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 184 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 185 185 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), 186 186 .count = 4, 187 187 .info = snd_emu10k1_spdif_info, ··· 190 190 191 191 static snd_kcontrol_new_t snd_emu10k1_spdif_control = 192 192 { 193 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 193 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 194 194 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), 195 195 .count = 4, 196 196 .info = snd_emu10k1_spdif_info, ··· 295 295 static snd_kcontrol_new_t snd_emu10k1_send_routing_control = 296 296 { 297 297 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE, 298 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 298 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 299 299 .name = "EMU10K1 PCM Send Routing", 300 300 .count = 32, 301 301 .info = snd_emu10k1_send_routing_info, ··· 364 364 static snd_kcontrol_new_t snd_emu10k1_send_volume_control = 365 365 { 366 366 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE, 367 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 367 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 368 368 .name = "EMU10K1 PCM Send Volume", 369 369 .count = 32, 370 370 .info = snd_emu10k1_send_volume_info, ··· 427 427 static snd_kcontrol_new_t snd_emu10k1_attn_control = 428 428 { 429 429 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE, 430 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 430 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 431 431 .name = "EMU10K1 PCM Volume", 432 432 .count = 32, 433 433 .info = snd_emu10k1_attn_info, ··· 737 737 return -ENOENT; 738 738 } 739 739 740 - int __devinit snd_emu10k1_mixer(emu10k1_t *emu) 740 + int __devinit snd_emu10k1_mixer(emu10k1_t *emu, 741 + int pcm_device, int multi_device) 741 742 { 742 743 int err, pcm; 743 744 snd_kcontrol_t *kctl; ··· 853 852 854 853 if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL) 855 854 return -ENOMEM; 855 + kctl->id.device = pcm_device; 856 856 if ((err = snd_ctl_add(card, kctl))) 857 857 return err; 858 858 if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL) 859 859 return -ENOMEM; 860 + kctl->id.device = pcm_device; 860 861 if ((err = snd_ctl_add(card, kctl))) 861 862 return err; 862 863 if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL) 863 864 return -ENOMEM; 865 + kctl->id.device = pcm_device; 864 866 if ((err = snd_ctl_add(card, kctl))) 865 867 return err; 866 868 867 869 if ((kctl = emu->ctl_efx_send_routing = snd_ctl_new1(&snd_emu10k1_efx_send_routing_control, emu)) == NULL) 868 870 return -ENOMEM; 871 + kctl->id.device = multi_device; 869 872 if ((err = snd_ctl_add(card, kctl))) 870 873 return err; 871 874 872 875 if ((kctl = emu->ctl_efx_send_volume = snd_ctl_new1(&snd_emu10k1_efx_send_volume_control, emu)) == NULL) 873 876 return -ENOMEM; 877 + kctl->id.device = multi_device; 874 878 if ((err = snd_ctl_add(card, kctl))) 875 879 return err; 876 880 877 881 if ((kctl = emu->ctl_efx_attn = snd_ctl_new1(&snd_emu10k1_efx_attn_control, emu)) == NULL) 878 882 return -ENOMEM; 883 + kctl->id.device = multi_device; 879 884 if ((err = snd_ctl_add(card, kctl))) 880 885 return err; 881 886 ··· 931 924 /* sb live! and audigy */ 932 925 if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL) 933 926 return -ENOMEM; 927 + if (!emu->audigy) 928 + kctl->id.device = emu->pcm_efx->device; 934 929 if ((err = snd_ctl_add(card, kctl))) 935 930 return err; 936 931 if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL) 937 932 return -ENOMEM; 933 + if (!emu->audigy) 934 + kctl->id.device = emu->pcm_efx->device; 938 935 if ((err = snd_ctl_add(card, kctl))) 939 936 return err; 940 937 }
+6 -1
sound/pci/emu10k1/emupcm.c
··· 1682 1682 int __devinit snd_emu10k1_pcm_efx(emu10k1_t * emu, int device, snd_pcm_t ** rpcm) 1683 1683 { 1684 1684 snd_pcm_t *pcm; 1685 + snd_kcontrol_t *kctl; 1685 1686 int err; 1686 1687 1687 1688 if (rpcm) ··· 1715 1714 emu->efx_voices_mask[0] = 0xffff0000; 1716 1715 emu->efx_voices_mask[1] = 0; 1717 1716 } 1718 - snd_ctl_add(emu->card, snd_ctl_new1(&snd_emu10k1_pcm_efx_voices_mask, emu)); 1717 + kctl = snd_ctl_new1(&snd_emu10k1_pcm_efx_voices_mask, emu); 1718 + if (!kctl) 1719 + return -ENOMEM; 1720 + kctl->id.device = device; 1721 + snd_ctl_add(emu->card, kctl); 1719 1722 1720 1723 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), 64*1024, 64*1024); 1721 1724
+1 -1
sound/pci/ens1370.c
··· 1444 1444 1445 1445 /* spdif controls */ 1446 1446 static snd_kcontrol_new_t snd_es1371_mixer_spdif[] __devinitdata = { 1447 - ES1371_SPDIF("IEC958 Playback Switch"), 1447 + ES1371_SPDIF(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH)), 1448 1448 { 1449 1449 .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1450 1450 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
+4 -4
sound/pci/fm801.c
··· 1155 1155 static snd_kcontrol_new_t snd_fm801_controls_multi[] __devinitdata = { 1156 1156 FM801_SINGLE("AC97 2ch->4ch Copy Switch", FM801_CODEC_CTRL, 7, 1, 0), 1157 1157 FM801_SINGLE("AC97 18-bit Switch", FM801_CODEC_CTRL, 10, 1, 0), 1158 - FM801_SINGLE("IEC958 Capture Switch", FM801_I2S_MODE, 8, 1, 0), 1159 - FM801_SINGLE("IEC958 Raw Data Playback Switch", FM801_I2S_MODE, 9, 1, 0), 1160 - FM801_SINGLE("IEC958 Raw Data Capture Switch", FM801_I2S_MODE, 10, 1, 0), 1161 - FM801_SINGLE("IEC958 Playback Switch", FM801_GEN_CTRL, 2, 1, 0), 1158 + FM801_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), FM801_I2S_MODE, 8, 1, 0), 1159 + FM801_SINGLE(SNDRV_CTL_NAME_IEC958("Raw Data ",PLAYBACK,SWITCH), FM801_I2S_MODE, 9, 1, 0), 1160 + FM801_SINGLE(SNDRV_CTL_NAME_IEC958("Raw Data ",CAPTURE,SWITCH), FM801_I2S_MODE, 10, 1, 0), 1161 + FM801_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), FM801_GEN_CTRL, 2, 1, 0), 1162 1162 }; 1163 1163 1164 1164 static void snd_fm801_mixer_free_ac97_bus(ac97_bus_t *bus)
+1 -1
sound/pci/hda/Makefile
··· 1 1 snd-hda-intel-objs := hda_intel.o 2 - snd-hda-codec-objs := hda_codec.o hda_generic.o patch_realtek.o patch_cmedia.o patch_analog.o patch_sigmatel.o 2 + snd-hda-codec-objs := hda_codec.o hda_generic.o patch_realtek.o patch_cmedia.o patch_analog.o patch_sigmatel.o patch_si3054.o 3 3 ifdef CONFIG_PROC_FS 4 4 snd-hda-codec-objs += hda_proc.o 5 5 endif
+67 -30
sound/pci/hda/hda_codec.c
··· 432 432 } 433 433 434 434 /* 435 - * look for an AFG node 436 - * 437 - * return 0 if not found 435 + * look for an AFG and MFG nodes 438 436 */ 439 - static int look_for_afg_node(struct hda_codec *codec) 437 + static void setup_fg_nodes(struct hda_codec *codec) 440 438 { 441 439 int i, total_nodes; 442 440 hda_nid_t nid; 443 441 444 442 total_nodes = snd_hda_get_sub_nodes(codec, AC_NODE_ROOT, &nid); 445 443 for (i = 0; i < total_nodes; i++, nid++) { 446 - if ((snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE) & 0xff) == 447 - AC_GRP_AUDIO_FUNCTION) 448 - return nid; 444 + switch((snd_hda_param_read(codec, nid, AC_PAR_FUNCTION_TYPE) & 0xff)) { 445 + case AC_GRP_AUDIO_FUNCTION: 446 + codec->afg = nid; 447 + break; 448 + case AC_GRP_MODEM_FUNCTION: 449 + codec->mfg = nid; 450 + break; 451 + default: 452 + break; 453 + } 449 454 } 450 - return 0; 451 455 } 452 456 453 457 /* ··· 511 507 codec->subsystem_id = snd_hda_param_read(codec, AC_NODE_ROOT, AC_PAR_SUBSYSTEM_ID); 512 508 codec->revision_id = snd_hda_param_read(codec, AC_NODE_ROOT, AC_PAR_REV_ID); 513 509 514 - /* FIXME: support for multiple AFGs? */ 515 - codec->afg = look_for_afg_node(codec); 516 - if (! codec->afg) { 517 - snd_printdd("hda_codec: no AFG node found\n"); 510 + setup_fg_nodes(codec); 511 + if (! codec->afg && ! codec->mfg) { 512 + snd_printdd("hda_codec: no AFG or MFG node found\n"); 518 513 snd_hda_codec_free(codec); 519 514 return -ENODEV; 520 515 } ··· 752 749 long *valp = ucontrol->value.integer.value; 753 750 int change = 0; 754 751 755 - if (chs & 1) 752 + if (chs & 1) { 756 753 change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, 757 754 0x7f, *valp); 755 + valp++; 756 + } 758 757 if (chs & 2) 759 758 change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, 760 - 0x7f, valp[1]); 759 + 0x7f, *valp); 761 760 return change; 762 761 } 763 762 ··· 801 796 long *valp = ucontrol->value.integer.value; 802 797 int change = 0; 803 798 804 - if (chs & 1) 799 + if (chs & 1) { 805 800 change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, 806 801 0x80, *valp ? 0 : 0x80); 802 + valp++; 803 + } 807 804 if (chs & 2) 808 805 change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, 809 - 0x80, valp[1] ? 0 : 0x80); 806 + 0x80, *valp ? 0 : 0x80); 807 + 810 808 return change; 811 809 } 812 810 ··· 1163 1155 /* 1164 1156 * stream formats 1165 1157 */ 1166 - static unsigned int rate_bits[][3] = { 1158 + struct hda_rate_tbl { 1159 + unsigned int hz; 1160 + unsigned int alsa_bits; 1161 + unsigned int hda_fmt; 1162 + }; 1163 + 1164 + static struct hda_rate_tbl rate_bits[] = { 1167 1165 /* rate in Hz, ALSA rate bitmask, HDA format value */ 1166 + 1167 + /* autodetected value used in snd_hda_query_supported_pcm */ 1168 1168 { 8000, SNDRV_PCM_RATE_8000, 0x0500 }, /* 1/6 x 48 */ 1169 1169 { 11025, SNDRV_PCM_RATE_11025, 0x4300 }, /* 1/4 x 44 */ 1170 1170 { 16000, SNDRV_PCM_RATE_16000, 0x0200 }, /* 1/3 x 48 */ ··· 1184 1168 { 96000, SNDRV_PCM_RATE_96000, 0x0800 }, /* 2 x 48 */ 1185 1169 { 176400, SNDRV_PCM_RATE_176400, 0x5800 },/* 4 x 44 */ 1186 1170 { 192000, SNDRV_PCM_RATE_192000, 0x1800 }, /* 4 x 48 */ 1187 - { 0 } 1171 + 1172 + /* not autodetected value */ 1173 + { 9600, SNDRV_PCM_RATE_KNOT, 0x0400 }, /* 1/5 x 48 */ 1174 + 1175 + { 0 } /* terminator */ 1188 1176 }; 1189 1177 1190 1178 /** ··· 1210 1190 int i; 1211 1191 unsigned int val = 0; 1212 1192 1213 - for (i = 0; rate_bits[i][0]; i++) 1214 - if (rate_bits[i][0] == rate) { 1215 - val = rate_bits[i][2]; 1193 + for (i = 0; rate_bits[i].hz; i++) 1194 + if (rate_bits[i].hz == rate) { 1195 + val = rate_bits[i].hda_fmt; 1216 1196 break; 1217 1197 } 1218 - if (! rate_bits[i][0]) { 1198 + if (! rate_bits[i].hz) { 1219 1199 snd_printdd("invalid rate %d\n", rate); 1220 1200 return 0; 1221 1201 } ··· 1278 1258 1279 1259 if (ratesp) { 1280 1260 u32 rates = 0; 1281 - for (i = 0; rate_bits[i][0]; i++) { 1261 + for (i = 0; rate_bits[i].hz; i++) { 1282 1262 if (val & (1 << i)) 1283 - rates |= rate_bits[i][1]; 1263 + rates |= rate_bits[i].alsa_bits; 1284 1264 } 1285 1265 *ratesp = rates; 1286 1266 } ··· 1372 1352 } 1373 1353 1374 1354 rate = format & 0xff00; 1375 - for (i = 0; rate_bits[i][0]; i++) 1376 - if (rate_bits[i][2] == rate) { 1355 + for (i = 0; rate_bits[i].hz; i++) 1356 + if (rate_bits[i].hda_fmt == rate) { 1377 1357 if (val & (1 << i)) 1378 1358 break; 1379 1359 return 0; 1380 1360 } 1381 - if (! rate_bits[i][0]) 1361 + if (! rate_bits[i].hz) 1382 1362 return 0; 1383 1363 1384 1364 stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); ··· 1561 1541 for (c = tbl; c->modelname || c->pci_subvendor; c++) { 1562 1542 if (c->pci_subvendor == subsystem_vendor && 1563 1543 (! c->pci_subdevice /* all match */|| 1564 - (c->pci_subdevice == subsystem_device))) 1544 + (c->pci_subdevice == subsystem_device))) { 1545 + snd_printdd(KERN_INFO "hda_codec: PCI %x:%x, codec config %d is selected\n", 1546 + subsystem_vendor, subsystem_device, c->config); 1565 1547 return c->config; 1548 + } 1566 1549 } 1567 1550 } 1568 1551 return -1; ··· 1826 1803 cfg->line_out_pins[j] = nid; 1827 1804 } 1828 1805 1829 - /* Swap surround and CLFE: the association order is front/CLFE/surr/back */ 1830 - if (cfg->line_outs >= 3) { 1806 + /* Reorder the surround channels 1807 + * ALSA sequence is front/surr/clfe/side 1808 + * HDA sequence is: 1809 + * 4-ch: front/surr => OK as it is 1810 + * 6-ch: front/clfe/surr 1811 + * 8-ch: front/clfe/side/surr 1812 + */ 1813 + switch (cfg->line_outs) { 1814 + case 3: 1831 1815 nid = cfg->line_out_pins[1]; 1832 1816 cfg->line_out_pins[1] = cfg->line_out_pins[2]; 1833 1817 cfg->line_out_pins[2] = nid; 1818 + break; 1819 + case 4: 1820 + nid = cfg->line_out_pins[1]; 1821 + cfg->line_out_pins[1] = cfg->line_out_pins[3]; 1822 + cfg->line_out_pins[3] = cfg->line_out_pins[2]; 1823 + cfg->line_out_pins[2] = nid; 1824 + break; 1834 1825 } 1835 1826 1836 1827 return 0;
+1
sound/pci/hda/hda_codec.h
··· 514 514 struct list_head list; /* list point */ 515 515 516 516 hda_nid_t afg; /* AFG node id */ 517 + hda_nid_t mfg; /* MFG node id */ 517 518 518 519 /* ids */ 519 520 u32 vendor_id;
+5
sound/pci/hda/hda_generic.c
··· 881 881 struct hda_gspec *spec; 882 882 int err; 883 883 884 + if(!codec->afg) { 885 + snd_printdd("hda_generic: no generic modem yet\n"); 886 + return -ENODEV; 887 + } 888 + 884 889 spec = kcalloc(1, sizeof(*spec), GFP_KERNEL); 885 890 if (spec == NULL) { 886 891 printk(KERN_ERR "hda_generic: can't allocate spec\n");
+123 -34
sound/pci/hda/hda_intel.c
··· 71 71 "{Intel, ESB2}," 72 72 "{ATI, SB450}," 73 73 "{VIA, VT8251}," 74 - "{VIA, VT8237A}}"); 74 + "{VIA, VT8237A}," 75 + "{SiS, SIS966}," 76 + "{ULI, M5461}}"); 75 77 MODULE_DESCRIPTION("Intel HDA driver"); 76 78 77 79 #define SFX "hda-intel: " ··· 143 141 */ 144 142 145 143 /* max number of SDs */ 146 - #define MAX_ICH6_DEV 8 144 + /* ICH, ATI and VIA have 4 playback and 4 capture */ 145 + #define ICH6_CAPTURE_INDEX 0 146 + #define ICH6_NUM_CAPTURE 4 147 + #define ICH6_PLAYBACK_INDEX 4 148 + #define ICH6_NUM_PLAYBACK 4 149 + 150 + /* ULI has 6 playback and 5 capture */ 151 + #define ULI_CAPTURE_INDEX 0 152 + #define ULI_NUM_CAPTURE 5 153 + #define ULI_PLAYBACK_INDEX 5 154 + #define ULI_NUM_PLAYBACK 6 155 + 156 + /* this number is statically defined for simplicity */ 157 + #define MAX_AZX_DEV 16 158 + 147 159 /* max number of fragments - we may use more if allocating more pages for BDL */ 148 - #define AZX_MAX_FRAG (PAGE_SIZE / (MAX_ICH6_DEV * 16)) 160 + #define BDL_SIZE PAGE_ALIGN(8192) 161 + #define AZX_MAX_FRAG (BDL_SIZE / (MAX_AZX_DEV * 16)) 149 162 /* max buffer size - no h/w limit, you can increase as you like */ 150 163 #define AZX_MAX_BUF_SIZE (1024*1024*1024) 151 164 /* max number of PCM devics per card */ ··· 217 200 }; 218 201 219 202 /* Defines for ATI HD Audio support in SB450 south bridge */ 220 - #define ATI_SB450_HDAUDIO_PCI_DEVICE_ID 0x437b 221 203 #define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42 222 204 #define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02 223 205 ··· 274 258 snd_card_t *card; 275 259 struct pci_dev *pci; 276 260 261 + /* chip type specific */ 262 + int driver_type; 263 + int playback_streams; 264 + int playback_index_offset; 265 + int capture_streams; 266 + int capture_index_offset; 267 + int num_streams; 268 + 277 269 /* pci resources */ 278 270 unsigned long addr; 279 271 void __iomem *remap_addr; ··· 291 267 spinlock_t reg_lock; 292 268 struct semaphore open_mutex; 293 269 294 - /* streams */ 295 - azx_dev_t azx_dev[MAX_ICH6_DEV]; 270 + /* streams (x num_streams) */ 271 + azx_dev_t *azx_dev; 296 272 297 273 /* PCM */ 298 274 unsigned int pcm_devs; ··· 314 290 /* flags */ 315 291 int position_fix; 316 292 unsigned int initialized: 1; 293 + }; 294 + 295 + /* driver types */ 296 + enum { 297 + AZX_DRIVER_ICH, 298 + AZX_DRIVER_ATI, 299 + AZX_DRIVER_VIA, 300 + AZX_DRIVER_SIS, 301 + AZX_DRIVER_ULI, 302 + }; 303 + 304 + static char *driver_short_names[] __devinitdata = { 305 + [AZX_DRIVER_ICH] = "HDA Intel", 306 + [AZX_DRIVER_ATI] = "HDA ATI SB", 307 + [AZX_DRIVER_VIA] = "HDA VIA VT82xx", 308 + [AZX_DRIVER_SIS] = "HDA SIS966", 309 + [AZX_DRIVER_ULI] = "HDA ULI M5461" 317 310 }; 318 311 319 312 /* ··· 401 360 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr); 402 361 azx_writel(chip, CORBUBASE, upper_32bit(chip->corb.addr)); 403 362 363 + /* set the corb size to 256 entries (ULI requires explicitly) */ 364 + azx_writeb(chip, CORBSIZE, 0x02); 404 365 /* set the corb write pointer to 0 */ 405 366 azx_writew(chip, CORBWP, 0); 406 367 /* reset the corb hw read pointer */ ··· 416 373 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr); 417 374 azx_writel(chip, RIRBUBASE, upper_32bit(chip->rirb.addr)); 418 375 376 + /* set the rirb size to 256 entries (ULI requires explicitly) */ 377 + azx_writeb(chip, RIRBSIZE, 0x02); 419 378 /* reset the rirb hw write pointer */ 420 379 azx_writew(chip, RIRBWP, ICH6_RBRWP_CLR); 421 380 /* set N=1, get RIRB response interrupt for new entry */ ··· 641 596 int i; 642 597 643 598 /* disable interrupts in stream descriptor */ 644 - for (i = 0; i < MAX_ICH6_DEV; i++) { 599 + for (i = 0; i < chip->num_streams; i++) { 645 600 azx_dev_t *azx_dev = &chip->azx_dev[i]; 646 601 azx_sd_writeb(azx_dev, SD_CTL, 647 602 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK); ··· 661 616 int i; 662 617 663 618 /* clear stream status */ 664 - for (i = 0; i < MAX_ICH6_DEV; i++) { 619 + for (i = 0; i < chip->num_streams; i++) { 665 620 azx_dev_t *azx_dev = &chip->azx_dev[i]; 666 621 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); 667 622 } ··· 731 686 } 732 687 733 688 /* For ATI SB450 azalia HD audio, we need to enable snoop */ 734 - if (chip->pci->vendor == PCI_VENDOR_ID_ATI && 735 - chip->pci->device == ATI_SB450_HDAUDIO_PCI_DEVICE_ID) { 689 + if (chip->driver_type == AZX_DRIVER_ATI) { 736 690 pci_read_config_byte(chip->pci, ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 737 691 &ati_misc_cntl2); 738 692 pci_write_config_byte(chip->pci, ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, ··· 758 714 return IRQ_NONE; 759 715 } 760 716 761 - for (i = 0; i < MAX_ICH6_DEV; i++) { 717 + for (i = 0; i < chip->num_streams; i++) { 762 718 azx_dev = &chip->azx_dev[i]; 763 719 if (status & azx_dev->sd_int_sta_mask) { 764 720 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); ··· 923 879 /* assign a stream for the PCM */ 924 880 static inline azx_dev_t *azx_assign_device(azx_t *chip, int stream) 925 881 { 926 - int dev, i; 927 - dev = stream == SNDRV_PCM_STREAM_PLAYBACK ? 4 : 0; 928 - for (i = 0; i < 4; i++, dev++) 882 + int dev, i, nums; 883 + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { 884 + dev = chip->playback_index_offset; 885 + nums = chip->playback_streams; 886 + } else { 887 + dev = chip->capture_index_offset; 888 + nums = chip->capture_streams; 889 + } 890 + for (i = 0; i < nums; i++, dev++) 929 891 if (! chip->azx_dev[dev].opened) { 930 892 chip->azx_dev[dev].opened = 1; 931 893 return &chip->azx_dev[dev]; ··· 949 899 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 950 900 SNDRV_PCM_INFO_BLOCK_TRANSFER | 951 901 SNDRV_PCM_INFO_MMAP_VALID | 952 - SNDRV_PCM_INFO_PAUSE | 953 - SNDRV_PCM_INFO_RESUME), 902 + SNDRV_PCM_INFO_PAUSE /*|*/ 903 + /*SNDRV_PCM_INFO_RESUME*/), 954 904 .formats = SNDRV_PCM_FMTBIT_S16_LE, 955 905 .rates = SNDRV_PCM_RATE_48000, 956 906 .rate_min = 48000, ··· 1099 1049 azx_dev->running = 1; 1100 1050 break; 1101 1051 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 1052 + case SNDRV_PCM_TRIGGER_SUSPEND: 1102 1053 case SNDRV_PCM_TRIGGER_STOP: 1103 1054 azx_stream_stop(chip, azx_dev); 1104 1055 azx_dev->running = 0; ··· 1109 1058 } 1110 1059 spin_unlock(&chip->reg_lock); 1111 1060 if (cmd == SNDRV_PCM_TRIGGER_PAUSE_PUSH || 1061 + cmd == SNDRV_PCM_TRIGGER_SUSPEND || 1112 1062 cmd == SNDRV_PCM_TRIGGER_STOP) { 1113 1063 int timeout = 5000; 1114 1064 while (azx_sd_readb(azx_dev, SD_CTL) & SD_CTL_DMA_START && --timeout) ··· 1188 1136 snd_dma_pci_data(chip->pci), 1189 1137 1024 * 64, 1024 * 128); 1190 1138 chip->pcm[pcm_dev] = pcm; 1139 + chip->pcm_devs = pcm_dev + 1; 1191 1140 1192 1141 return 0; 1193 1142 } ··· 1239 1186 /* initialize each stream (aka device) 1240 1187 * assign the starting bdl address to each stream (device) and initialize 1241 1188 */ 1242 - for (i = 0; i < MAX_ICH6_DEV; i++) { 1189 + for (i = 0; i < chip->num_streams; i++) { 1243 1190 unsigned int off = sizeof(u32) * (i * AZX_MAX_FRAG * 4); 1244 1191 azx_dev_t *azx_dev = &chip->azx_dev[i]; 1245 1192 azx_dev->bdl = (u32 *)(chip->bdl.area + off); ··· 1298 1245 if (chip->initialized) { 1299 1246 int i; 1300 1247 1301 - for (i = 0; i < MAX_ICH6_DEV; i++) 1248 + for (i = 0; i < chip->num_streams; i++) 1302 1249 azx_stream_stop(chip, &chip->azx_dev[i]); 1303 1250 1304 1251 /* disable interrupts */ ··· 1314 1261 1315 1262 /* wait a little for interrupts to finish */ 1316 1263 msleep(1); 1317 - 1318 - iounmap(chip->remap_addr); 1319 1264 } 1320 1265 1266 + if (chip->remap_addr) 1267 + iounmap(chip->remap_addr); 1321 1268 if (chip->irq >= 0) 1322 1269 free_irq(chip->irq, (void*)chip); 1323 1270 ··· 1329 1276 snd_dma_free_pages(&chip->posbuf); 1330 1277 pci_release_regions(chip->pci); 1331 1278 pci_disable_device(chip->pci); 1279 + kfree(chip->azx_dev); 1332 1280 kfree(chip); 1333 1281 1334 1282 return 0; ··· 1344 1290 * constructor 1345 1291 */ 1346 1292 static int __devinit azx_create(snd_card_t *card, struct pci_dev *pci, 1347 - int posfix, azx_t **rchip) 1293 + int posfix, int driver_type, 1294 + azx_t **rchip) 1348 1295 { 1349 1296 azx_t *chip; 1350 1297 int err = 0; ··· 1371 1316 chip->card = card; 1372 1317 chip->pci = pci; 1373 1318 chip->irq = -1; 1319 + chip->driver_type = driver_type; 1374 1320 1375 1321 chip->position_fix = posfix; 1322 + 1323 + #if BITS_PER_LONG != 64 1324 + /* Fix up base address on ULI M5461 */ 1325 + if (chip->driver_type == AZX_DRIVER_ULI) { 1326 + u16 tmp3; 1327 + pci_read_config_word(pci, 0x40, &tmp3); 1328 + pci_write_config_word(pci, 0x40, tmp3 | 0x10); 1329 + pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0); 1330 + } 1331 + #endif 1376 1332 1377 1333 if ((err = pci_request_regions(pci, "ICH HD audio")) < 0) { 1378 1334 kfree(chip); ··· 1410 1344 pci_set_master(pci); 1411 1345 synchronize_irq(chip->irq); 1412 1346 1347 + switch (chip->driver_type) { 1348 + case AZX_DRIVER_ULI: 1349 + chip->playback_streams = ULI_NUM_PLAYBACK; 1350 + chip->capture_streams = ULI_NUM_CAPTURE; 1351 + chip->playback_index_offset = ULI_PLAYBACK_INDEX; 1352 + chip->capture_index_offset = ULI_CAPTURE_INDEX; 1353 + break; 1354 + default: 1355 + chip->playback_streams = ICH6_NUM_PLAYBACK; 1356 + chip->capture_streams = ICH6_NUM_CAPTURE; 1357 + chip->playback_index_offset = ICH6_PLAYBACK_INDEX; 1358 + chip->capture_index_offset = ICH6_CAPTURE_INDEX; 1359 + break; 1360 + } 1361 + chip->num_streams = chip->playback_streams + chip->capture_streams; 1362 + chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev), GFP_KERNEL); 1363 + if (! chip->azx_dev) { 1364 + snd_printk(KERN_ERR "cannot malloc azx_dev\n"); 1365 + goto errout; 1366 + } 1367 + 1413 1368 /* allocate memory for the BDL for each stream */ 1414 1369 if ((err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), 1415 - PAGE_SIZE, &chip->bdl)) < 0) { 1370 + BDL_SIZE, &chip->bdl)) < 0) { 1416 1371 snd_printk(KERN_ERR SFX "cannot allocate BDL\n"); 1417 1372 goto errout; 1418 1373 } 1419 1374 if (chip->position_fix == POS_FIX_POSBUF) { 1420 1375 /* allocate memory for the position buffer */ 1421 1376 if ((err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci), 1422 - MAX_ICH6_DEV * 8, &chip->posbuf)) < 0) { 1377 + chip->num_streams * 8, &chip->posbuf)) < 0) { 1423 1378 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n"); 1424 1379 goto errout; 1425 1380 } ··· 1468 1381 snd_printk(KERN_ERR SFX "Error creating device [card]!\n"); 1469 1382 goto errout; 1470 1383 } 1384 + 1385 + strcpy(card->driver, "HDA-Intel"); 1386 + strcpy(card->shortname, driver_short_names[chip->driver_type]); 1387 + sprintf(card->longname, "%s at 0x%lx irq %i", card->shortname, chip->addr, chip->irq); 1471 1388 1472 1389 *rchip = chip; 1473 1390 return 0; ··· 1501 1410 return -ENOMEM; 1502 1411 } 1503 1412 1504 - if ((err = azx_create(card, pci, position_fix[dev], &chip)) < 0) { 1413 + if ((err = azx_create(card, pci, position_fix[dev], pci_id->driver_data, 1414 + &chip)) < 0) { 1505 1415 snd_card_free(card); 1506 1416 return err; 1507 1417 } 1508 - 1509 - strcpy(card->driver, "HDA-Intel"); 1510 - strcpy(card->shortname, "HDA Intel"); 1511 - sprintf(card->longname, "%s at 0x%lx irq %i", card->shortname, chip->addr, chip->irq); 1512 1418 1513 1419 /* create codec instances */ 1514 1420 if ((err = azx_codec_create(chip, model[dev])) < 0) { ··· 1547 1459 1548 1460 /* PCI IDs */ 1549 1461 static struct pci_device_id azx_ids[] = { 1550 - { 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICH6 */ 1551 - { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICH7 */ 1552 - { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ESB2 */ 1553 - { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ATI SB450 */ 1554 - { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* VIA VT8251/VT8237A */ 1555 - { 0x10b9, 0x5461, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ALI 5461? */ 1462 + { 0x8086, 0x2668, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH6 */ 1463 + { 0x8086, 0x27d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ICH7 */ 1464 + { 0x8086, 0x269a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ICH }, /* ESB2 */ 1465 + { 0x1002, 0x437b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ATI }, /* ATI SB450 */ 1466 + { 0x1106, 0x3288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_VIA }, /* VIA VT8251/VT8237A */ 1467 + { 0x1039, 0x7502, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_SIS }, /* SIS966 */ 1468 + { 0x10b9, 0x5461, PCI_ANY_ID, PCI_ANY_ID, 0, 0, AZX_DRIVER_ULI }, /* ULI M5461 */ 1556 1469 { 0, } 1557 1470 }; 1558 1471 MODULE_DEVICE_TABLE(pci, azx_ids);
+3
sound/pci/hda/hda_patch.h
··· 10 10 extern struct hda_codec_preset snd_hda_preset_analog[]; 11 11 /* SigmaTel codecs */ 12 12 extern struct hda_codec_preset snd_hda_preset_sigmatel[]; 13 + /* SiLabs 3054/3055 modem codecs */ 14 + extern struct hda_codec_preset snd_hda_preset_si3054[]; 13 15 14 16 static const struct hda_codec_preset *hda_preset_tables[] = { 15 17 snd_hda_preset_realtek, 16 18 snd_hda_preset_cmedia, 17 19 snd_hda_preset_analog, 18 20 snd_hda_preset_sigmatel, 21 + snd_hda_preset_si3054, 19 22 NULL 20 23 };
+2 -2
sound/pci/hda/patch_analog.c
··· 572 572 }, 573 573 { 574 574 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 575 - .name = "IEC958 Playback Route", 575 + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", 576 576 .info = ad1983_spdif_route_info, 577 577 .get = ad1983_spdif_route_get, 578 578 .put = ad1983_spdif_route_put, ··· 705 705 /* identical with AD1983 */ 706 706 { 707 707 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 708 - .name = "IEC958 Playback Route", 708 + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", 709 709 .info = ad1983_spdif_route_info, 710 710 .get = ad1983_spdif_route_get, 711 711 .put = ad1983_spdif_route_put,
+1
sound/pci/hda/patch_cmedia.c
··· 647 647 { .modelname = "min_fp", .config = CMI_MIN_FP }, 648 648 { .modelname = "full", .config = CMI_FULL }, 649 649 { .modelname = "full_dig", .config = CMI_FULL_DIG }, 650 + { .pci_subvendor = 0x1043, .pci_subdevice = 0x813d, .config = CMI_FULL_DIG }, /* ASUS P5AD2 */ 650 651 { .modelname = "allout", .config = CMI_ALLOUT }, 651 652 { .modelname = "auto", .config = CMI_AUTO }, 652 653 {} /* terminator */
+8 -1
sound/pci/hda/patch_realtek.c
··· 687 687 { } /* end */ 688 688 }; 689 689 690 + /* additional mixers to alc880_asus_mixer */ 691 + static snd_kcontrol_new_t alc880_pcbeep_mixer[] = { 692 + HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT), 693 + HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT), 694 + { } /* end */ 695 + }; 690 696 691 697 /* 692 698 * build control elements ··· 1530 1524 /* Back 3 jack plus 1 SPDIF out jack, front 2 jack */ 1531 1525 { .modelname = "3stack-digout", .config = ALC880_3ST_DIG }, 1532 1526 { .pci_subvendor = 0x8086, .pci_subdevice = 0xe308, .config = ALC880_3ST_DIG }, 1527 + { .pci_subvendor = 0x1025, .pci_subdevice = 0x0070, .config = ALC880_3ST_DIG }, 1533 1528 1534 1529 /* Back 3 jack plus 1 SPDIF out jack, front 2 jack (Internal add Aux-In)*/ 1535 1530 { .pci_subvendor = 0x8086, .pci_subdevice = 0xe305, .config = ALC880_3ST_DIG }, ··· 1741 1734 .input_mux = &alc880_capture_source, 1742 1735 }, 1743 1736 [ALC880_UNIWILL_DIG] = { 1744 - .mixers = { alc880_asus_mixer }, 1737 + .mixers = { alc880_asus_mixer, alc880_pcbeep_mixer }, 1745 1738 .init_verbs = { alc880_volume_init_verbs, alc880_pin_asus_init_verbs }, 1746 1739 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids), 1747 1740 .dac_nids = alc880_asus_dac_nids,
+300
sound/pci/hda/patch_si3054.c
··· 1 + /* 2 + * Universal Interface for Intel High Definition Audio Codec 3 + * 4 + * HD audio interface patch for Silicon Labs 3054/5 modem codec 5 + * 6 + * Copyright (c) 2005 Sasha Khapyorsky <sashak@smlink.com> 7 + * Takashi Iwai <tiwai@suse.de> 8 + * 9 + * 10 + * This driver is free software; you can redistribute it and/or modify 11 + * it under the terms of the GNU General Public License as published by 12 + * the Free Software Foundation; either version 2 of the License, or 13 + * (at your option) any later version. 14 + * 15 + * This driver is distributed in the hope that it will be useful, 16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 + * GNU General Public License for more details. 19 + * 20 + * You should have received a copy of the GNU General Public License 21 + * along with this program; if not, write to the Free Software 22 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 + */ 24 + 25 + #include <sound/driver.h> 26 + #include <linux/init.h> 27 + #include <linux/delay.h> 28 + #include <linux/slab.h> 29 + #include <linux/pci.h> 30 + #include <sound/core.h> 31 + #include "hda_codec.h" 32 + #include "hda_local.h" 33 + 34 + 35 + /* si3054 verbs */ 36 + #define SI3054_VERB_READ_NODE 0x900 37 + #define SI3054_VERB_WRITE_NODE 0x100 38 + 39 + /* si3054 nodes (registers) */ 40 + #define SI3054_EXTENDED_MID 2 41 + #define SI3054_LINE_RATE 3 42 + #define SI3054_LINE_LEVEL 4 43 + #define SI3054_GPIO_CFG 5 44 + #define SI3054_GPIO_POLARITY 6 45 + #define SI3054_GPIO_STICKY 7 46 + #define SI3054_GPIO_WAKEUP 8 47 + #define SI3054_GPIO_STATUS 9 48 + #define SI3054_GPIO_CONTROL 10 49 + #define SI3054_MISC_AFE 11 50 + #define SI3054_CHIPID 12 51 + #define SI3054_LINE_CFG1 13 52 + #define SI3054_LINE_STATUS 14 53 + #define SI3054_DC_TERMINATION 15 54 + #define SI3054_LINE_CONFIG 16 55 + #define SI3054_CALLPROG_ATT 17 56 + #define SI3054_SQ_CONTROL 18 57 + #define SI3054_MISC_CONTROL 19 58 + #define SI3054_RING_CTRL1 20 59 + #define SI3054_RING_CTRL2 21 60 + 61 + /* extended MID */ 62 + #define SI3054_MEI_READY 0xf 63 + 64 + /* line level */ 65 + #define SI3054_ATAG_MASK 0x00f0 66 + #define SI3054_DTAG_MASK 0xf000 67 + 68 + /* GPIO bits */ 69 + #define SI3054_GPIO_OH 0x0001 70 + #define SI3054_GPIO_CID 0x0002 71 + 72 + /* chipid and revisions */ 73 + #define SI3054_CHIPID_CODEC_REV_MASK 0x000f 74 + #define SI3054_CHIPID_DAA_REV_MASK 0x00f0 75 + #define SI3054_CHIPID_INTERNATIONAL 0x0100 76 + #define SI3054_CHIPID_DAA_ID 0x0f00 77 + #define SI3054_CHIPID_CODEC_ID (1<<12) 78 + 79 + /* si3054 codec registers (nodes) access macros */ 80 + #define GET_REG(codec,reg) (snd_hda_codec_read(codec,reg,0,SI3054_VERB_READ_NODE,0)) 81 + #define SET_REG(codec,reg,val) (snd_hda_codec_write(codec,reg,0,SI3054_VERB_WRITE_NODE,val)) 82 + 83 + 84 + struct si3054_spec { 85 + unsigned international; 86 + struct hda_pcm pcm; 87 + }; 88 + 89 + 90 + /* 91 + * Modem mixer 92 + */ 93 + 94 + #define PRIVATE_VALUE(reg,mask) ((reg<<16)|(mask&0xffff)) 95 + #define PRIVATE_REG(val) ((val>>16)&0xffff) 96 + #define PRIVATE_MASK(val) (val&0xffff) 97 + 98 + static int si3054_switch_info(snd_kcontrol_t *kcontrol, 99 + snd_ctl_elem_info_t *uinfo) 100 + { 101 + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 102 + uinfo->count = 1; 103 + uinfo->value.integer.min = 0; 104 + uinfo->value.integer.max = 1; 105 + return 0; 106 + } 107 + 108 + static int si3054_switch_get(snd_kcontrol_t *kcontrol, 109 + snd_ctl_elem_value_t *uvalue) 110 + { 111 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 112 + u16 reg = PRIVATE_REG(kcontrol->private_value); 113 + u16 mask = PRIVATE_MASK(kcontrol->private_value); 114 + uvalue->value.integer.value[0] = (GET_REG(codec, reg)) & mask ? 1 : 0 ; 115 + return 0; 116 + } 117 + 118 + static int si3054_switch_put(snd_kcontrol_t *kcontrol, 119 + snd_ctl_elem_value_t *uvalue) 120 + { 121 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 122 + u16 reg = PRIVATE_REG(kcontrol->private_value); 123 + u16 mask = PRIVATE_MASK(kcontrol->private_value); 124 + if (uvalue->value.integer.value[0]) 125 + SET_REG(codec, reg, (GET_REG(codec, reg)) | mask); 126 + else 127 + SET_REG(codec, reg, (GET_REG(codec, reg)) & ~mask); 128 + return 0; 129 + } 130 + 131 + #define SI3054_KCONTROL(kname,reg,mask) { \ 132 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 133 + .name = kname, \ 134 + .info = si3054_switch_info, \ 135 + .get = si3054_switch_get, \ 136 + .put = si3054_switch_put, \ 137 + .private_value = PRIVATE_VALUE(reg,mask), \ 138 + } 139 + 140 + 141 + static snd_kcontrol_new_t si3054_modem_mixer[] = { 142 + SI3054_KCONTROL("Off-hook Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_OH), 143 + SI3054_KCONTROL("Caller ID Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_CID), 144 + {} 145 + }; 146 + 147 + static int si3054_build_controls(struct hda_codec *codec) 148 + { 149 + return snd_hda_add_new_ctls(codec, si3054_modem_mixer); 150 + } 151 + 152 + 153 + /* 154 + * PCM callbacks 155 + */ 156 + 157 + static int si3054_pcm_prepare(struct hda_pcm_stream *hinfo, 158 + struct hda_codec *codec, 159 + unsigned int stream_tag, 160 + unsigned int format, 161 + snd_pcm_substream_t *substream) 162 + { 163 + u16 val; 164 + 165 + SET_REG(codec, SI3054_LINE_RATE, substream->runtime->rate); 166 + val = GET_REG(codec, SI3054_LINE_LEVEL); 167 + val &= 0xff << (8 * (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)); 168 + val |= ((stream_tag & 0xf) << 4) << (8 * (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)); 169 + SET_REG(codec, SI3054_LINE_LEVEL, val); 170 + 171 + snd_hda_codec_setup_stream(codec, hinfo->nid, 172 + stream_tag, 0, format); 173 + return 0; 174 + } 175 + 176 + static int si3054_pcm_open(struct hda_pcm_stream *hinfo, 177 + struct hda_codec *codec, 178 + snd_pcm_substream_t *substream) 179 + { 180 + static unsigned int rates[] = { 8000, 9600, 16000 }; 181 + static snd_pcm_hw_constraint_list_t hw_constraints_rates = { 182 + .count = ARRAY_SIZE(rates), 183 + .list = rates, 184 + .mask = 0, 185 + }; 186 + substream->runtime->hw.period_bytes_min = 80; 187 + return snd_pcm_hw_constraint_list(substream->runtime, 0, 188 + SNDRV_PCM_HW_PARAM_RATE, &hw_constraints_rates); 189 + } 190 + 191 + 192 + static struct hda_pcm_stream si3054_pcm = { 193 + .substreams = 1, 194 + .channels_min = 1, 195 + .channels_max = 1, 196 + .nid = 0x1, 197 + .rates = SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_KNOT, 198 + .formats = SNDRV_PCM_FMTBIT_S16_LE, 199 + .maxbps = 16, 200 + .ops = { 201 + .open = si3054_pcm_open, 202 + .prepare = si3054_pcm_prepare, 203 + }, 204 + }; 205 + 206 + 207 + static int si3054_build_pcms(struct hda_codec *codec) 208 + { 209 + struct si3054_spec *spec = codec->spec; 210 + struct hda_pcm *info = &spec->pcm; 211 + si3054_pcm.nid = codec->mfg; 212 + codec->num_pcms = 1; 213 + codec->pcm_info = info; 214 + info->name = "Si3054 Modem"; 215 + info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm; 216 + info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm; 217 + return 0; 218 + } 219 + 220 + 221 + /* 222 + * Init part 223 + */ 224 + 225 + static int si3054_init(struct hda_codec *codec) 226 + { 227 + struct si3054_spec *spec = codec->spec; 228 + unsigned wait_count; 229 + u16 val; 230 + 231 + snd_hda_codec_write(codec, AC_NODE_ROOT, 0, AC_VERB_SET_CODEC_RESET, 0); 232 + snd_hda_codec_write(codec, codec->mfg, 0, AC_VERB_SET_STREAM_FORMAT, 0); 233 + SET_REG(codec, SI3054_LINE_RATE, 9600); 234 + SET_REG(codec, SI3054_LINE_LEVEL, SI3054_DTAG_MASK|SI3054_ATAG_MASK); 235 + SET_REG(codec, SI3054_EXTENDED_MID, 0); 236 + 237 + wait_count = 10; 238 + do { 239 + msleep(2); 240 + val = GET_REG(codec, SI3054_EXTENDED_MID); 241 + } while ((val & SI3054_MEI_READY) != SI3054_MEI_READY && wait_count--); 242 + 243 + if((val&SI3054_MEI_READY) != SI3054_MEI_READY) { 244 + snd_printk(KERN_ERR "si3054: cannot initialize. EXT MID = %04x\n", val); 245 + return -EACCES; 246 + } 247 + 248 + SET_REG(codec, SI3054_GPIO_POLARITY, 0xffff); 249 + SET_REG(codec, SI3054_GPIO_CFG, 0x0); 250 + SET_REG(codec, SI3054_MISC_AFE, 0); 251 + SET_REG(codec, SI3054_LINE_CFG1,0x200); 252 + 253 + if((GET_REG(codec,SI3054_LINE_STATUS) & (1<<6)) == 0) { 254 + snd_printd("Link Frame Detect(FDT) is not ready (line status: %04x)\n", 255 + GET_REG(codec,SI3054_LINE_STATUS)); 256 + } 257 + 258 + spec->international = GET_REG(codec, SI3054_CHIPID) & SI3054_CHIPID_INTERNATIONAL; 259 + 260 + return 0; 261 + } 262 + 263 + static void si3054_free(struct hda_codec *codec) 264 + { 265 + kfree(codec->spec); 266 + } 267 + 268 + 269 + /* 270 + */ 271 + 272 + static struct hda_codec_ops si3054_patch_ops = { 273 + .build_controls = si3054_build_controls, 274 + .build_pcms = si3054_build_pcms, 275 + .init = si3054_init, 276 + .free = si3054_free, 277 + #ifdef CONFIG_PM 278 + //.suspend = si3054_suspend, 279 + .resume = si3054_init, 280 + #endif 281 + }; 282 + 283 + static int patch_si3054(struct hda_codec *codec) 284 + { 285 + struct si3054_spec *spec = kcalloc(1, sizeof(*spec), GFP_KERNEL); 286 + if (spec == NULL) 287 + return -ENOMEM; 288 + codec->spec = spec; 289 + codec->patch_ops = si3054_patch_ops; 290 + return 0; 291 + } 292 + 293 + /* 294 + * patch entries 295 + */ 296 + struct hda_codec_preset snd_hda_preset_si3054[] = { 297 + { .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 }, 298 + {} 299 + }; 300 +
+5 -5
sound/pci/ice1712/delta.c
··· 618 618 */ 619 619 620 620 static snd_kcontrol_new_t snd_ice1712_delta1010_wordclock_select __devinitdata = 621 - ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_PCM, "Word Clock Sync", 0, ICE1712_DELTA_WORD_CLOCK_SELECT, 1, 0); 621 + ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_WORD_CLOCK_SELECT, 1, 0); 622 622 static snd_kcontrol_new_t snd_ice1712_delta1010lt_wordclock_select __devinitdata = 623 - ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_PCM, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 1, 0); 623 + ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 1, 0); 624 624 static snd_kcontrol_new_t snd_ice1712_delta1010_wordclock_status __devinitdata = 625 - ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_PCM, "Word Clock Status", 0, ICE1712_DELTA_WORD_CLOCK_STATUS, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE); 625 + ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Status", 0, ICE1712_DELTA_WORD_CLOCK_STATUS, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE); 626 626 static snd_kcontrol_new_t snd_ice1712_deltadio2496_spdif_in_select __devinitdata = 627 - ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_PCM, "IEC958 Input Optical", 0, ICE1712_DELTA_SPDIF_INPUT_SELECT, 0, 0); 627 + ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "IEC958 Input Optical", 0, ICE1712_DELTA_SPDIF_INPUT_SELECT, 0, 0); 628 628 static snd_kcontrol_new_t snd_ice1712_delta_spdif_in_status __devinitdata = 629 - ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_PCM, "Delta IEC958 Input Status", 0, ICE1712_DELTA_SPDIF_IN_STAT, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE); 629 + ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Delta IEC958 Input Status", 0, ICE1712_DELTA_SPDIF_IN_STAT, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE); 630 630 631 631 632 632 static int __devinit snd_ice1712_delta_add_controls(ice1712_t *ice)
+5 -5
sound/pci/ice1712/ice1712.c
··· 1422 1422 1423 1423 static snd_kcontrol_new_t snd_ice1712_multi_capture_spdif_switch __devinitdata = { 1424 1424 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1425 - .name = "IEC958 Multi Capture Switch", 1425 + .name = SNDRV_CTL_NAME_IEC958("Multi ",CAPTURE,SWITCH), 1426 1426 .info = snd_ice1712_pro_mixer_switch_info, 1427 1427 .get = snd_ice1712_pro_mixer_switch_get, 1428 1428 .put = snd_ice1712_pro_mixer_switch_put, ··· 1441 1441 1442 1442 static snd_kcontrol_new_t snd_ice1712_multi_capture_spdif_volume __devinitdata = { 1443 1443 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1444 - .name = "IEC958 Multi Capture Volume", 1444 + .name = SNDRV_CTL_NAME_IEC958("Multi ",CAPTURE,VOLUME), 1445 1445 .info = snd_ice1712_pro_mixer_volume_info, 1446 1446 .get = snd_ice1712_pro_mixer_volume_get, 1447 1447 .put = snd_ice1712_pro_mixer_volume_put, ··· 1715 1715 static snd_kcontrol_new_t snd_ice1712_spdif_maskc __devinitdata = 1716 1716 { 1717 1717 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1718 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1718 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1719 1719 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 1720 1720 .info = snd_ice1712_spdif_info, 1721 1721 .get = snd_ice1712_spdif_maskc_get, ··· 1724 1724 static snd_kcontrol_new_t snd_ice1712_spdif_maskp __devinitdata = 1725 1725 { 1726 1726 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1727 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1727 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1728 1728 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK), 1729 1729 .info = snd_ice1712_spdif_info, 1730 1730 .get = snd_ice1712_spdif_maskp_get, ··· 2203 2203 2204 2204 static snd_kcontrol_new_t snd_ice1712_mixer_pro_spdif_route __devinitdata = { 2205 2205 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2206 - .name = "IEC958 Playback Route", 2206 + .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Route", 2207 2207 .info = snd_ice1712_pro_route_info, 2208 2208 .get = snd_ice1712_pro_route_spdif_get, 2209 2209 .put = snd_ice1712_pro_route_spdif_put,
+3 -3
sound/pci/ice1712/ice1724.c
··· 1414 1414 static snd_kcontrol_new_t snd_vt1724_spdif_maskc __devinitdata = 1415 1415 { 1416 1416 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1417 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1417 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1418 1418 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 1419 1419 .info = snd_vt1724_spdif_info, 1420 1420 .get = snd_vt1724_spdif_maskc_get, ··· 1423 1423 static snd_kcontrol_new_t snd_vt1724_spdif_maskp __devinitdata = 1424 1424 { 1425 1425 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1426 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1426 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1427 1427 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK), 1428 1428 .info = snd_vt1724_spdif_info, 1429 1429 .get = snd_vt1724_spdif_maskp_get, ··· 1466 1466 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1467 1467 /* FIXME: the following conflict with IEC958 Playback Route */ 1468 1468 // .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH), 1469 - .name = "IEC958 Output Switch", 1469 + .name = SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 1470 1470 .info = snd_vt1724_spdif_sw_info, 1471 1471 .get = snd_vt1724_spdif_sw_get, 1472 1472 .put = snd_vt1724_spdif_sw_put
+49 -8
sound/pci/intel8x0.c
··· 389 389 struct ac97_pcm *pcm; 390 390 int pcm_open_flag; 391 391 unsigned int page_attr_changed: 1; 392 + unsigned int suspended: 1; 392 393 } ichdev_t; 393 394 394 395 typedef struct _snd_intel8x0 intel8x0_t; ··· 863 862 unsigned long port = ichdev->reg_offset; 864 863 865 864 switch (cmd) { 866 - case SNDRV_PCM_TRIGGER_START: 867 865 case SNDRV_PCM_TRIGGER_RESUME: 866 + ichdev->suspended = 0; 867 + /* fallthru */ 868 + case SNDRV_PCM_TRIGGER_START: 868 869 val = ICH_IOCE | ICH_STARTBM; 869 870 break; 870 - case SNDRV_PCM_TRIGGER_STOP: 871 871 case SNDRV_PCM_TRIGGER_SUSPEND: 872 + ichdev->suspended = 1; 873 + /* fallthru */ 874 + case SNDRV_PCM_TRIGGER_STOP: 872 875 val = 0; 873 876 break; 874 877 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: ··· 904 899 905 900 val = igetdword(chip, ICHREG(ALI_DMACR)); 906 901 switch (cmd) { 902 + case SNDRV_PCM_TRIGGER_RESUME: 903 + ichdev->suspended = 0; 904 + /* fallthru */ 907 905 case SNDRV_PCM_TRIGGER_START: 908 906 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 909 - case SNDRV_PCM_TRIGGER_RESUME: 910 907 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 911 908 /* clear FIFO for synchronization of channels */ 912 909 fifo = igetdword(chip, fiforeg[ichdev->ali_slot / 4]); ··· 920 913 val &= ~(1 << (ichdev->ali_slot + 16)); /* clear PAUSE flag */ 921 914 iputdword(chip, ICHREG(ALI_DMACR), val | (1 << ichdev->ali_slot)); /* start DMA */ 922 915 break; 916 + case SNDRV_PCM_TRIGGER_SUSPEND: 917 + ichdev->suspended = 1; 918 + /* fallthru */ 923 919 case SNDRV_PCM_TRIGGER_STOP: 924 920 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 925 - case SNDRV_PCM_TRIGGER_SUSPEND: 926 921 iputdword(chip, ICHREG(ALI_DMACR), val | (1 << (ichdev->ali_slot + 16))); /* pause */ 927 922 iputbyte(chip, port + ICH_REG_OFF_CR, 0); 928 923 while (igetbyte(chip, port + ICH_REG_OFF_CR)) ··· 1003 994 { 1004 995 unsigned int cnt; 1005 996 int dbl = runtime->rate > 48000; 997 + 998 + spin_lock_irq(&chip->reg_lock); 1006 999 switch (chip->device_type) { 1007 1000 case DEVICE_ALI: 1008 1001 cnt = igetdword(chip, ICHREG(ALI_SCR)); ··· 1048 1037 iputdword(chip, ICHREG(GLOB_CNT), cnt); 1049 1038 break; 1050 1039 } 1040 + spin_unlock_irq(&chip->reg_lock); 1051 1041 } 1052 1042 1053 1043 static int snd_intel8x0_pcm_prepare(snd_pcm_substream_t * substream) ··· 1060 1048 ichdev->physbuf = runtime->dma_addr; 1061 1049 ichdev->size = snd_pcm_lib_buffer_bytes(substream); 1062 1050 ichdev->fragsize = snd_pcm_lib_period_bytes(substream); 1063 - spin_lock_irq(&chip->reg_lock); 1064 1051 if (ichdev->ichd == ICHD_PCMOUT) { 1065 1052 snd_intel8x0_setup_pcm_out(chip, runtime); 1066 - if (chip->device_type == DEVICE_INTEL_ICH4) { 1053 + if (chip->device_type == DEVICE_INTEL_ICH4) 1067 1054 ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1; 1068 - } 1069 1055 } 1070 1056 snd_intel8x0_setup_periods(chip, ichdev); 1071 - spin_unlock_irq(&chip->reg_lock); 1072 1057 return 0; 1073 1058 } 1074 1059 ··· 1826 1817 }, 1827 1818 { 1828 1819 .subvendor = 0x103c, 1820 + .subdevice = 0x0934, 1821 + .name = "HP nx8220", 1822 + .type = AC97_TUNE_MUTE_LED 1823 + }, 1824 + { 1825 + .subvendor = 0x103c, 1826 + .subdevice = 0x099c, 1827 + .name = "HP nx6110", /* AD1981B */ 1828 + .type = AC97_TUNE_HP_ONLY 1829 + }, 1830 + { 1831 + .subvendor = 0x103c, 1829 1832 .subdevice = 0x129d, 1830 1833 .name = "HP xw8000", 1831 1834 .type = AC97_TUNE_HP_ONLY ··· 1888 1867 .subvendor = 0x10cf, 1889 1868 .subdevice = 0x1253, 1890 1869 .name = "Fujitsu S6210", /* STAC9750/51 */ 1870 + .type = AC97_TUNE_HP_ONLY 1871 + }, 1872 + { 1873 + .subvendor = 0x10cf, 1874 + .subdevice = 0x12ec, 1875 + .name = "Fujitsu-Siemens 4010", 1891 1876 .type = AC97_TUNE_HP_ONLY 1892 1877 }, 1893 1878 { ··· 2449 2422 fill_nocache(runtime->dma_area, runtime->dma_bytes, 1); 2450 2423 } 2451 2424 } 2425 + } 2426 + 2427 + /* resume status */ 2428 + for (i = 0; i < chip->bdbars_count; i++) { 2429 + ichdev_t *ichdev = &chip->ichd[i]; 2430 + unsigned long port = ichdev->reg_offset; 2431 + if (! ichdev->substream || ! ichdev->suspended) 2432 + continue; 2433 + if (ichdev->ichd == ICHD_PCMOUT) 2434 + snd_intel8x0_setup_pcm_out(chip, ichdev->substream->runtime); 2435 + iputdword(chip, port + ICH_REG_OFF_BDBAR, ichdev->bdbar_addr); 2436 + iputbyte(chip, port + ICH_REG_OFF_LVI, ichdev->lvi); 2437 + iputbyte(chip, port + ICH_REG_OFF_CIV, ichdev->civ); 2438 + iputbyte(chip, port + ichdev->roff_sr, ICH_FIFOE | ICH_BCIS | ICH_LVBCI); 2452 2439 } 2453 2440 2454 2441 return 0;
+2 -2
sound/pci/korg1212/korg1212.c
··· 2067 2067 }, \ 2068 2068 { \ 2069 2069 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE, \ 2070 - .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 2070 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2071 2071 .name = c_name " Monitor Phase Invert", \ 2072 2072 .info = snd_korg1212_control_phase_info, \ 2073 2073 .get = snd_korg1212_control_phase_get, \ ··· 2082 2082 MON_MIXER(4, "ADAT-5"), MON_MIXER(5, "ADAT-6"), MON_MIXER(6, "ADAT-7"), MON_MIXER(7, "ADAT-8"), 2083 2083 { 2084 2084 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE, 2085 - .iface = SNDRV_CTL_ELEM_IFACE_PCM, 2085 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2086 2086 .name = "Sync Source", 2087 2087 .info = snd_korg1212_control_sync_info, 2088 2088 .get = snd_korg1212_control_sync_get,
+70 -23
sound/pci/nm256/nm256.c
··· 189 189 nm256_t *chip; 190 190 snd_pcm_substream_t *substream; 191 191 int running; 192 + int suspended; 192 193 193 194 u32 buf; /* offset from chip->buffer */ 194 195 int bufsize; /* buffer size in bytes */ ··· 232 231 int mixer_status_mask; /* bit mask to test the mixer status */ 233 232 234 233 int irq; 234 + int irq_acks; 235 235 irqreturn_t (*interrupt)(int, void *, struct pt_regs *); 236 236 int badintrcount; /* counter to check bogus interrupts */ 237 + struct semaphore irq_mutex; 237 238 238 239 nm256_stream_t streams[2]; 239 240 ··· 467 464 } 468 465 } 469 466 467 + /* acquire interrupt */ 468 + static int snd_nm256_acquire_irq(nm256_t *chip) 469 + { 470 + down(&chip->irq_mutex); 471 + if (chip->irq < 0) { 472 + if (request_irq(chip->pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, 473 + chip->card->driver, (void*)chip)) { 474 + snd_printk("unable to grab IRQ %d\n", chip->pci->irq); 475 + up(&chip->irq_mutex); 476 + return -EBUSY; 477 + } 478 + chip->irq = chip->pci->irq; 479 + } 480 + chip->irq_acks++; 481 + up(&chip->irq_mutex); 482 + return 0; 483 + } 484 + 485 + /* release interrupt */ 486 + static void snd_nm256_release_irq(nm256_t *chip) 487 + { 488 + down(&chip->irq_mutex); 489 + if (chip->irq_acks > 0) 490 + chip->irq_acks--; 491 + if (chip->irq_acks == 0 && chip->irq >= 0) { 492 + free_irq(chip->irq, (void*)chip); 493 + chip->irq = -1; 494 + } 495 + up(&chip->irq_mutex); 496 + } 497 + 470 498 /* 471 499 * start / stop 472 500 */ ··· 572 538 573 539 spin_lock(&chip->reg_lock); 574 540 switch (cmd) { 575 - case SNDRV_PCM_TRIGGER_START: 576 541 case SNDRV_PCM_TRIGGER_RESUME: 542 + s->suspended = 0; 543 + /* fallthru */ 544 + case SNDRV_PCM_TRIGGER_START: 577 545 if (! s->running) { 578 546 snd_nm256_playback_start(chip, s, substream); 579 547 s->running = 1; 580 548 } 581 549 break; 582 - case SNDRV_PCM_TRIGGER_STOP: 583 550 case SNDRV_PCM_TRIGGER_SUSPEND: 551 + s->suspended = 1; 552 + /* fallthru */ 553 + case SNDRV_PCM_TRIGGER_STOP: 584 554 if (s->running) { 585 555 snd_nm256_playback_stop(chip); 586 556 s->running = 0; ··· 856 818 { 857 819 nm256_t *chip = snd_pcm_substream_chip(substream); 858 820 821 + if (snd_nm256_acquire_irq(chip) < 0) 822 + return -EBUSY; 859 823 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_PLAYBACK], 860 824 substream, &snd_nm256_playback); 861 825 return 0; ··· 868 828 { 869 829 nm256_t *chip = snd_pcm_substream_chip(substream); 870 830 831 + if (snd_nm256_acquire_irq(chip) < 0) 832 + return -EBUSY; 871 833 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_CAPTURE], 872 834 substream, &snd_nm256_capture); 873 835 return 0; ··· 881 839 static int 882 840 snd_nm256_playback_close(snd_pcm_substream_t *substream) 883 841 { 842 + nm256_t *chip = snd_pcm_substream_chip(substream); 843 + 844 + snd_nm256_release_irq(chip); 884 845 return 0; 885 846 } 886 847 ··· 891 846 static int 892 847 snd_nm256_capture_close(snd_pcm_substream_t *substream) 893 848 { 849 + nm256_t *chip = snd_pcm_substream_chip(substream); 850 + 851 + snd_nm256_release_irq(chip); 894 852 return 0; 895 853 } 896 854 ··· 963 915 static void 964 916 snd_nm256_init_chip(nm256_t *chip) 965 917 { 966 - spin_lock_irq(&chip->reg_lock); 967 918 /* Reset everything. */ 968 919 snd_nm256_writeb(chip, 0x0, 0x11); 969 920 snd_nm256_writew(chip, 0x214, 0); 970 921 /* stop sounds.. */ 971 922 //snd_nm256_playback_stop(chip); 972 923 //snd_nm256_capture_stop(chip); 973 - spin_unlock_irq(&chip->reg_lock); 974 924 } 975 925 976 926 977 - static inline void 927 + static irqreturn_t 978 928 snd_nm256_intr_check(nm256_t *chip) 979 929 { 980 930 if (chip->badintrcount++ > 1000) { ··· 993 947 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) 994 948 snd_nm256_capture_stop(chip); 995 949 chip->badintrcount = 0; 950 + return IRQ_HANDLED; 996 951 } 952 + return IRQ_NONE; 997 953 } 998 954 999 955 /* ··· 1017 969 status = snd_nm256_readw(chip, NM_INT_REG); 1018 970 1019 971 /* Not ours. */ 1020 - if (status == 0) { 1021 - snd_nm256_intr_check(chip); 1022 - return IRQ_NONE; 1023 - } 972 + if (status == 0) 973 + return snd_nm256_intr_check(chip); 1024 974 1025 975 chip->badintrcount = 0; 1026 976 ··· 1082 1036 status = snd_nm256_readl(chip, NM_INT_REG); 1083 1037 1084 1038 /* Not ours. */ 1085 - if (status == 0) { 1086 - snd_nm256_intr_check(chip); 1087 - return IRQ_NONE; 1088 - } 1039 + if (status == 0) 1040 + return snd_nm256_intr_check(chip); 1089 1041 1090 1042 chip->badintrcount = 0; 1091 1043 ··· 1236 1192 AC97_PC_BEEP, AC97_PHONE, AC97_MIC, AC97_LINE, AC97_CD, 1237 1193 AC97_VIDEO, AC97_AUX, AC97_PCM, AC97_REC_SEL, 1238 1194 AC97_REC_GAIN, AC97_GENERAL_PURPOSE, AC97_3D_CONTROL, 1239 - AC97_EXTENDED_ID, 1195 + /*AC97_EXTENDED_ID,*/ 1240 1196 AC97_VENDOR_ID1, AC97_VENDOR_ID2, 1241 1197 -1 1242 1198 }; ··· 1250 1206 for (i = 0; mixer_regs[i] >= 0; i++) 1251 1207 set_bit(mixer_regs[i], ac97.reg_accessed); 1252 1208 ac97.private_data = chip; 1209 + pbus->no_vra = 1; 1253 1210 err = snd_ac97_mixer(pbus, &ac97, &chip->ac97); 1254 1211 if (err < 0) 1255 1212 return err; ··· 1326 1281 static int nm256_resume(snd_card_t *card) 1327 1282 { 1328 1283 nm256_t *chip = card->pm_private_data; 1284 + int i; 1329 1285 1330 1286 /* Perform a full reset on the hardware */ 1331 1287 pci_enable_device(chip->pci); ··· 1334 1288 1335 1289 /* restore ac97 */ 1336 1290 snd_ac97_resume(chip->ac97); 1291 + 1292 + for (i = 0; i < 2; i++) { 1293 + nm256_stream_t *s = &chip->streams[i]; 1294 + if (s->substream && s->suspended) { 1295 + spin_lock_irq(&chip->reg_lock); 1296 + snd_nm256_set_format(chip, s, s->substream); 1297 + spin_unlock_irq(&chip->reg_lock); 1298 + } 1299 + } 1337 1300 1338 1301 return 0; 1339 1302 } ··· 1415 1360 chip->use_cache = usecache; 1416 1361 spin_lock_init(&chip->reg_lock); 1417 1362 chip->irq = -1; 1363 + init_MUTEX(&chip->irq_mutex); 1418 1364 1419 1365 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = play_bufsize; 1420 1366 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize = capt_bufsize; ··· 1525 1469 addr += NM_MAX_PLAYBACK_COEF_SIZE; 1526 1470 chip->coeff_buf[SNDRV_PCM_STREAM_CAPTURE] = addr; 1527 1471 } 1528 - 1529 - /* acquire interrupt */ 1530 - if (request_irq(pci->irq, chip->interrupt, SA_INTERRUPT|SA_SHIRQ, 1531 - card->driver, (void*)chip)) { 1532 - err = -EBUSY; 1533 - snd_printk("unable to grab IRQ %d\n", pci->irq); 1534 - goto __error; 1535 - } 1536 - chip->irq = pci->irq; 1537 1472 1538 1473 /* Fixed setting. */ 1539 1474 chip->mixer_base = NM_MIXER_OFFSET;
+2 -2
sound/pci/rme32.c
··· 1900 1900 }, 1901 1901 { 1902 1902 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1903 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1903 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1904 1904 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK), 1905 1905 .info = snd_rme32_control_spdif_mask_info, 1906 1906 .get = snd_rme32_control_spdif_mask_get, ··· 1908 1908 }, 1909 1909 { 1910 1910 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1911 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1911 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1912 1912 .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PRO_MASK), 1913 1913 .info = snd_rme32_control_spdif_mask_info, 1914 1914 .get = snd_rme32_control_spdif_mask_get,
+2 -2
sound/pci/rme96.c
··· 2266 2266 }, 2267 2267 { 2268 2268 .access = SNDRV_CTL_ELEM_ACCESS_READ, 2269 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2269 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 2270 2270 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 2271 2271 .info = snd_rme96_control_spdif_mask_info, 2272 2272 .get = snd_rme96_control_spdif_mask_get, ··· 2276 2276 }, 2277 2277 { 2278 2278 .access = SNDRV_CTL_ELEM_ACCESS_READ, 2279 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2279 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 2280 2280 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK), 2281 2281 .info = snd_rme96_control_spdif_mask_info, 2282 2282 .get = snd_rme96_control_spdif_mask_get,
+27 -28
sound/pci/rme9652/hdsp.c
··· 1524 1524 } 1525 1525 1526 1526 #define HDSP_SPDIF_IN(xname, xindex) \ 1527 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 1527 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1528 1528 .name = xname, \ 1529 1529 .index = xindex, \ 1530 1530 .info = snd_hdsp_info_spdif_in, \ ··· 1584 1584 } 1585 1585 1586 1586 #define HDSP_SPDIF_OUT(xname, xindex) \ 1587 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \ 1587 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1588 1588 .info = snd_hdsp_info_spdif_bits, \ 1589 1589 .get = snd_hdsp_get_spdif_out, .put = snd_hdsp_put_spdif_out } 1590 1590 ··· 1638 1638 } 1639 1639 1640 1640 #define HDSP_SPDIF_PROFESSIONAL(xname, xindex) \ 1641 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \ 1641 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1642 1642 .info = snd_hdsp_info_spdif_bits, \ 1643 1643 .get = snd_hdsp_get_spdif_professional, .put = snd_hdsp_put_spdif_professional } 1644 1644 ··· 1683 1683 } 1684 1684 1685 1685 #define HDSP_SPDIF_EMPHASIS(xname, xindex) \ 1686 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \ 1686 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1687 1687 .info = snd_hdsp_info_spdif_bits, \ 1688 1688 .get = snd_hdsp_get_spdif_emphasis, .put = snd_hdsp_put_spdif_emphasis } 1689 1689 ··· 1728 1728 } 1729 1729 1730 1730 #define HDSP_SPDIF_NON_AUDIO(xname, xindex) \ 1731 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \ 1731 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1732 1732 .info = snd_hdsp_info_spdif_bits, \ 1733 1733 .get = snd_hdsp_get_spdif_nonaudio, .put = snd_hdsp_put_spdif_nonaudio } 1734 1734 ··· 1773 1773 } 1774 1774 1775 1775 #define HDSP_SPDIF_SAMPLE_RATE(xname, xindex) \ 1776 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1776 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1777 1777 .name = xname, \ 1778 1778 .index = xindex, \ 1779 1779 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1834 1834 } 1835 1835 1836 1836 #define HDSP_SYSTEM_SAMPLE_RATE(xname, xindex) \ 1837 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1837 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1838 1838 .name = xname, \ 1839 1839 .index = xindex, \ 1840 1840 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1858 1858 } 1859 1859 1860 1860 #define HDSP_AUTOSYNC_SAMPLE_RATE(xname, xindex) \ 1861 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 1861 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1862 1862 .name = xname, \ 1863 1863 .index = xindex, \ 1864 1864 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1918 1918 } 1919 1919 1920 1920 #define HDSP_SYSTEM_CLOCK_MODE(xname, xindex) \ 1921 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1921 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1922 1922 .name = xname, \ 1923 1923 .index = xindex, \ 1924 1924 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1958 1958 } 1959 1959 1960 1960 #define HDSP_CLOCK_SOURCE(xname, xindex) \ 1961 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 1961 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1962 1962 .name = xname, \ 1963 1963 .index = xindex, \ 1964 1964 .info = snd_hdsp_info_clock_source, \ ··· 2124 2124 } 2125 2125 2126 2126 #define HDSP_DA_GAIN(xname, xindex) \ 2127 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2127 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2128 2128 .name = xname, \ 2129 2129 .index = xindex, \ 2130 2130 .info = snd_hdsp_info_da_gain, \ ··· 2210 2210 } 2211 2211 2212 2212 #define HDSP_AD_GAIN(xname, xindex) \ 2213 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2213 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2214 2214 .name = xname, \ 2215 2215 .index = xindex, \ 2216 2216 .info = snd_hdsp_info_ad_gain, \ ··· 2296 2296 } 2297 2297 2298 2298 #define HDSP_PHONE_GAIN(xname, xindex) \ 2299 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2299 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2300 2300 .name = xname, \ 2301 2301 .index = xindex, \ 2302 2302 .info = snd_hdsp_info_phone_gain, \ ··· 2382 2382 } 2383 2383 2384 2384 #define HDSP_XLR_BREAKOUT_CABLE(xname, xindex) \ 2385 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2385 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2386 2386 .name = xname, \ 2387 2387 .index = xindex, \ 2388 2388 .info = snd_hdsp_info_xlr_breakout_cable, \ ··· 2447 2447 Switching this on desactivates external ADAT 2448 2448 */ 2449 2449 #define HDSP_AEB(xname, xindex) \ 2450 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2450 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2451 2451 .name = xname, \ 2452 2452 .index = xindex, \ 2453 2453 .info = snd_hdsp_info_aeb, \ ··· 2508 2508 } 2509 2509 2510 2510 #define HDSP_PREF_SYNC_REF(xname, xindex) \ 2511 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2511 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2512 2512 .name = xname, \ 2513 2513 .index = xindex, \ 2514 2514 .info = snd_hdsp_info_pref_sync_ref, \ ··· 2641 2641 } 2642 2642 2643 2643 #define HDSP_AUTOSYNC_REF(xname, xindex) \ 2644 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2644 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2645 2645 .name = xname, \ 2646 2646 .index = xindex, \ 2647 2647 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 2697 2697 } 2698 2698 2699 2699 #define HDSP_LINE_OUT(xname, xindex) \ 2700 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2700 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2701 2701 .name = xname, \ 2702 2702 .index = xindex, \ 2703 2703 .info = snd_hdsp_info_line_out, \ ··· 2757 2757 } 2758 2758 2759 2759 #define HDSP_PRECISE_POINTER(xname, xindex) \ 2760 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2760 + { .iface = SNDRV_CTL_ELEM_IFACE_CARD, \ 2761 2761 .name = xname, \ 2762 2762 .index = xindex, \ 2763 2763 .info = snd_hdsp_info_precise_pointer, \ ··· 2811 2811 } 2812 2812 2813 2813 #define HDSP_USE_MIDI_TASKLET(xname, xindex) \ 2814 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2814 + { .iface = SNDRV_CTL_ELEM_IFACE_CARD, \ 2815 2815 .name = xname, \ 2816 2816 .index = xindex, \ 2817 2817 .info = snd_hdsp_info_use_midi_tasklet, \ ··· 2868 2868 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2869 2869 .name = xname, \ 2870 2870 .index = xindex, \ 2871 + .device = 0, \ 2871 2872 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 2872 2873 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 2873 2874 .info = snd_hdsp_info_mixer, \ ··· 2940 2939 } 2941 2940 2942 2941 #define HDSP_WC_SYNC_CHECK(xname, xindex) \ 2943 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2942 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2944 2943 .name = xname, \ 2945 2944 .index = xindex, \ 2946 2945 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ ··· 2984 2983 } 2985 2984 2986 2985 #define HDSP_SPDIF_SYNC_CHECK(xname, xindex) \ 2987 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2986 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2988 2987 .name = xname, \ 2989 2988 .index = xindex, \ 2990 2989 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ ··· 3016 3015 } 3017 3016 3018 3017 #define HDSP_ADATSYNC_SYNC_CHECK(xname, xindex) \ 3019 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 3018 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3020 3019 .name = xname, \ 3021 3020 .index = xindex, \ 3022 3021 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ ··· 3047 3046 } 3048 3047 3049 3048 #define HDSP_ADAT_SYNC_CHECK \ 3050 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 3049 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3051 3050 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 3052 3051 .info = snd_hdsp_info_sync_check, \ 3053 3052 .get = snd_hdsp_get_adat_sync_check \ ··· 3120 3119 }, 3121 3120 { 3122 3121 .access = SNDRV_CTL_ELEM_ACCESS_READ, 3123 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3122 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 3124 3123 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 3125 3124 .info = snd_hdsp_control_spdif_mask_info, 3126 3125 .get = snd_hdsp_control_spdif_mask_get, ··· 3130 3129 }, 3131 3130 { 3132 3131 .access = SNDRV_CTL_ELEM_ACCESS_READ, 3133 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3132 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 3134 3133 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK), 3135 3134 .info = snd_hdsp_control_spdif_mask_info, 3136 3135 .get = snd_hdsp_control_spdif_mask_get, ··· 3147 3146 /* 'Sample Clock Source' complies with the alsa control naming scheme */ 3148 3147 HDSP_CLOCK_SOURCE("Sample Clock Source", 0), 3149 3148 { 3150 - /* FIXME: should be PCM or MIXER? */ 3151 - /* .iface = SNDRV_CTL_ELEM_IFACE_PCM, */ 3152 3149 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3153 3150 .name = "Sample Clock Source Locking", 3154 3151 .info = snd_hdsp_info_clock_source_lock,
+17 -16
sound/pci/rme9652/hdspm.c
··· 65 65 MODULE_PARM_DESC(enable, "Enable/disable specific HDSPM soundcards."); 66 66 67 67 module_param_array(precise_ptr, bool, NULL, 0444); 68 - MODULE_PARM_DESC(precise_ptr, "Enable precise pointer, or disable."); 68 + MODULE_PARM_DESC(precise_ptr, "Enable or disable precise pointer."); 69 69 70 70 module_param_array(line_outs_monitor, bool, NULL, 0444); 71 71 MODULE_PARM_DESC(line_outs_monitor, ··· 1104 1104 return 0; 1105 1105 } 1106 1106 1107 - snd_rawmidi_ops_t snd_hdspm_midi_output = 1107 + static snd_rawmidi_ops_t snd_hdspm_midi_output = 1108 1108 { 1109 1109 .open = snd_hdspm_midi_output_open, 1110 1110 .close = snd_hdspm_midi_output_close, 1111 1111 .trigger = snd_hdspm_midi_output_trigger, 1112 1112 }; 1113 1113 1114 - snd_rawmidi_ops_t snd_hdspm_midi_input = 1114 + static snd_rawmidi_ops_t snd_hdspm_midi_input = 1115 1115 { 1116 1116 .open = snd_hdspm_midi_input_open, 1117 1117 .close = snd_hdspm_midi_input_close, ··· 1168 1168 /* get the system sample rate which is set */ 1169 1169 1170 1170 #define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \ 1171 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1171 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1172 1172 .name = xname, \ 1173 1173 .index = xindex, \ 1174 1174 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1195 1195 } 1196 1196 1197 1197 #define HDSPM_AUTOSYNC_SAMPLE_RATE(xname, xindex) \ 1198 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 1198 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1199 1199 .name = xname, \ 1200 1200 .index = xindex, \ 1201 1201 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1264 1264 } 1265 1265 1266 1266 #define HDSPM_SYSTEM_CLOCK_MODE(xname, xindex) \ 1267 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1267 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1268 1268 .name = xname, \ 1269 1269 .index = xindex, \ 1270 1270 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1310 1310 } 1311 1311 1312 1312 #define HDSPM_CLOCK_SOURCE(xname, xindex) \ 1313 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, \ 1313 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1314 1314 .name = xname, \ 1315 1315 .index = xindex, \ 1316 1316 .info = snd_hdspm_info_clock_source, \ ··· 1457 1457 } 1458 1458 1459 1459 #define HDSPM_PREF_SYNC_REF(xname, xindex) \ 1460 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1460 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1461 1461 .name = xname, \ 1462 1462 .index = xindex, \ 1463 1463 .info = snd_hdspm_info_pref_sync_ref, \ ··· 1547 1547 } 1548 1548 1549 1549 #define HDSPM_AUTOSYNC_REF(xname, xindex) \ 1550 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1550 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1551 1551 .name = xname, \ 1552 1552 .index = xindex, \ 1553 1553 .access = SNDRV_CTL_ELEM_ACCESS_READ, \ ··· 1604 1604 } 1605 1605 1606 1606 #define HDSPM_LINE_OUT(xname, xindex) \ 1607 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1607 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1608 1608 .name = xname, \ 1609 1609 .index = xindex, \ 1610 1610 .info = snd_hdspm_info_line_out, \ ··· 1668 1668 } 1669 1669 1670 1670 #define HDSPM_TX_64(xname, xindex) \ 1671 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1671 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1672 1672 .name = xname, \ 1673 1673 .index = xindex, \ 1674 1674 .info = snd_hdspm_info_tx_64, \ ··· 1731 1731 } 1732 1732 1733 1733 #define HDSPM_C_TMS(xname, xindex) \ 1734 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1734 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1735 1735 .name = xname, \ 1736 1736 .index = xindex, \ 1737 1737 .info = snd_hdspm_info_c_tms, \ ··· 1794 1794 } 1795 1795 1796 1796 #define HDSPM_SAFE_MODE(xname, xindex) \ 1797 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1797 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1798 1798 .name = xname, \ 1799 1799 .index = xindex, \ 1800 1800 .info = snd_hdspm_info_safe_mode, \ ··· 1857 1857 } 1858 1858 1859 1859 #define HDSPM_INPUT_SELECT(xname, xindex) \ 1860 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1860 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1861 1861 .name = xname, \ 1862 1862 .index = xindex, \ 1863 1863 .info = snd_hdspm_info_input_select, \ ··· 1941 1941 { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 1942 1942 .name = xname, \ 1943 1943 .index = xindex, \ 1944 + .device = 0, \ 1944 1945 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 1945 1946 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 1946 1947 .info = snd_hdspm_info_mixer, \ ··· 2125 2124 } 2126 2125 2127 2126 #define HDSPM_WC_SYNC_CHECK(xname, xindex) \ 2128 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2127 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2129 2128 .name = xname, \ 2130 2129 .index = xindex, \ 2131 2130 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ ··· 2171 2170 2172 2171 2173 2172 #define HDSPM_MADI_SYNC_CHECK(xname, xindex) \ 2174 - { .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \ 2173 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 2175 2174 .name = xname, \ 2176 2175 .index = xindex, \ 2177 2176 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
+12 -12
sound/pci/rme9652/rme9652.c
··· 893 893 } 894 894 895 895 #define RME9652_ADAT1_IN(xname, xindex) \ 896 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 896 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 897 897 .info = snd_rme9652_info_adat1_in, \ 898 898 .get = snd_rme9652_get_adat1_in, \ 899 899 .put = snd_rme9652_put_adat1_in } ··· 971 971 } 972 972 973 973 #define RME9652_SPDIF_IN(xname, xindex) \ 974 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 974 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 975 975 .info = snd_rme9652_info_spdif_in, \ 976 976 .get = snd_rme9652_get_spdif_in, .put = snd_rme9652_put_spdif_in } 977 977 ··· 1042 1042 } 1043 1043 1044 1044 #define RME9652_SPDIF_OUT(xname, xindex) \ 1045 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1045 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1046 1046 .info = snd_rme9652_info_spdif_out, \ 1047 1047 .get = snd_rme9652_get_spdif_out, .put = snd_rme9652_put_spdif_out } 1048 1048 ··· 1110 1110 } 1111 1111 1112 1112 #define RME9652_SYNC_MODE(xname, xindex) \ 1113 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1113 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1114 1114 .info = snd_rme9652_info_sync_mode, \ 1115 1115 .get = snd_rme9652_get_sync_mode, .put = snd_rme9652_put_sync_mode } 1116 1116 ··· 1195 1195 } 1196 1196 1197 1197 #define RME9652_SYNC_PREF(xname, xindex) \ 1198 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1198 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1199 1199 .info = snd_rme9652_info_sync_pref, \ 1200 1200 .get = snd_rme9652_get_sync_pref, .put = snd_rme9652_put_sync_pref } 1201 1201 ··· 1340 1340 } 1341 1341 1342 1342 #define RME9652_PASSTHRU(xname, xindex) \ 1343 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1343 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1344 1344 .info = snd_rme9652_info_passthru, \ 1345 1345 .put = snd_rme9652_put_passthru, \ 1346 1346 .get = snd_rme9652_get_passthru } ··· 1386 1386 /* Read-only switches */ 1387 1387 1388 1388 #define RME9652_SPDIF_RATE(xname, xindex) \ 1389 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1389 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1390 1390 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 1391 1391 .info = snd_rme9652_info_spdif_rate, \ 1392 1392 .get = snd_rme9652_get_spdif_rate } ··· 1411 1411 } 1412 1412 1413 1413 #define RME9652_ADAT_SYNC(xname, xindex, xidx) \ 1414 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1414 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1415 1415 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 1416 1416 .info = snd_rme9652_info_adat_sync, \ 1417 1417 .get = snd_rme9652_get_adat_sync, .private_value = xidx } ··· 1447 1447 } 1448 1448 1449 1449 #define RME9652_TC_VALID(xname, xindex) \ 1450 - { .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \ 1450 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \ 1451 1451 .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ 1452 1452 .info = snd_rme9652_info_tc_valid, \ 1453 1453 .get = snd_rme9652_get_tc_valid } ··· 1545 1545 }, 1546 1546 { 1547 1547 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1548 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1548 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1549 1549 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK), 1550 1550 .info = snd_rme9652_control_spdif_mask_info, 1551 1551 .get = snd_rme9652_control_spdif_mask_get, ··· 1555 1555 }, 1556 1556 { 1557 1557 .access = SNDRV_CTL_ELEM_ACCESS_READ, 1558 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1558 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1559 1559 .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK), 1560 1560 .info = snd_rme9652_control_spdif_mask_info, 1561 1561 .get = snd_rme9652_control_spdif_mask_get, ··· 1568 1568 RME9652_SYNC_MODE("Sync Mode", 0), 1569 1569 RME9652_SYNC_PREF("Preferred Sync Source", 0), 1570 1570 { 1571 - .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1571 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1572 1572 .name = "Channels Thru", 1573 1573 .index = 0, 1574 1574 .info = snd_rme9652_info_thru,
+5 -5
sound/pci/trident/trident_main.c
··· 1689 1689 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1690 1690 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1691 1691 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START | 1692 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), 1692 + SNDRV_PCM_INFO_PAUSE /* | SNDRV_PCM_INFO_RESUME */), 1693 1693 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | 1694 1694 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE), 1695 1695 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, ··· 1714 1714 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1715 1715 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1716 1716 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START | 1717 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), 1717 + SNDRV_PCM_INFO_PAUSE /* | SNDRV_PCM_INFO_RESUME */), 1718 1718 .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | 1719 1719 SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U16_LE), 1720 1720 .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000, ··· 1739 1739 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1740 1740 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1741 1741 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START | 1742 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), 1742 + SNDRV_PCM_INFO_PAUSE /* | SNDRV_PCM_INFO_RESUME */), 1743 1743 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1744 1744 .rates = SNDRV_PCM_RATE_48000, 1745 1745 .rate_min = 48000, ··· 1763 1763 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1764 1764 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1765 1765 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START | 1766 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), 1766 + SNDRV_PCM_INFO_PAUSE /* | SNDRV_PCM_INFO_RESUME */), 1767 1767 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1768 1768 .rates = (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | 1769 1769 SNDRV_PCM_RATE_48000), ··· 1784 1784 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1785 1785 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1786 1786 SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_SYNC_START | 1787 - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), 1787 + SNDRV_PCM_INFO_PAUSE /* | SNDRV_PCM_INFO_RESUME */), 1788 1788 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1789 1789 .rates = SNDRV_PCM_RATE_48000, 1790 1790 .rate_min = 48000,
+11 -6
sound/pci/via82xx.c
··· 663 663 val = 0; 664 664 switch (cmd) { 665 665 case SNDRV_PCM_TRIGGER_START: 666 + case SNDRV_PCM_TRIGGER_RESUME: 666 667 val |= VIA_REG_CTRL_START; 667 668 viadev->running = 1; 668 669 break; 669 670 case SNDRV_PCM_TRIGGER_STOP: 671 + case SNDRV_PCM_TRIGGER_SUSPEND: 670 672 val = VIA_REG_CTRL_TERMINATE; 671 673 viadev->running = 0; 672 674 break; ··· 931 929 932 930 if ((rate_changed = via_lock_rate(&chip->rates[0], ac97_rate)) < 0) 933 931 return rate_changed; 934 - if (rate_changed) { 932 + if (rate_changed) 935 933 snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, 936 934 chip->no_vra ? 48000 : runtime->rate); 937 - snd_ac97_set_rate(chip->ac97, AC97_SPDIF, 938 - chip->no_vra ? 48000 : runtime->rate); 939 - } 935 + if (chip->spdif_on && viadev->reg_offset == 0x30) 936 + snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate); 937 + 940 938 if (runtime->rate == 48000) 941 939 rbits = 0xfffff; 942 940 else ··· 1037 1035 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1038 1036 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1039 1037 SNDRV_PCM_INFO_MMAP_VALID | 1040 - SNDRV_PCM_INFO_RESUME | 1038 + /* SNDRV_PCM_INFO_RESUME | */ 1041 1039 SNDRV_PCM_INFO_PAUSE), 1042 1040 .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE, 1043 1041 .rates = SNDRV_PCM_RATE_48000, ··· 1486 1484 } 1487 1485 1488 1486 static snd_kcontrol_new_t snd_via8233_dxs3_spdif_control __devinitdata = { 1489 - .name = "IEC958 Output Switch", 1487 + .name = SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH), 1490 1488 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1491 1489 .info = snd_via8233_dxs3_spdif_info, 1492 1490 .get = snd_via8233_dxs3_spdif_get, ··· 2155 2153 { .subvendor = 0x1019, .subdevice = 0x0a81, .action = VIA_DXS_NO_VRA }, /* ECS K7VTA3 v8.0 */ 2156 2154 { .subvendor = 0x1019, .subdevice = 0x0a85, .action = VIA_DXS_NO_VRA }, /* ECS L7VMM2 */ 2157 2155 { .subvendor = 0x1025, .subdevice = 0x0033, .action = VIA_DXS_NO_VRA }, /* Acer Inspire 1353LM */ 2156 + { .subvendor = 0x1025, .subdevice = 0x0046, .action = VIA_DXS_SRC }, /* Acer Aspire 1524 WLMi */ 2158 2157 { .subvendor = 0x1043, .subdevice = 0x8095, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8X (FIXME: possibly VIA_DXS_ENABLE?)*/ 2159 2158 { .subvendor = 0x1043, .subdevice = 0x80a1, .action = VIA_DXS_NO_VRA }, /* ASUS A7V8-X */ 2160 2159 { .subvendor = 0x1043, .subdevice = 0x80b0, .action = VIA_DXS_NO_VRA }, /* ASUS A7V600 & K8V*/ ··· 2171 2168 { .subvendor = 0x1297, .subdevice = 0xc160, .action = VIA_DXS_ENABLE }, /* Shuttle SK41G */ 2172 2169 { .subvendor = 0x1458, .subdevice = 0xa002, .action = VIA_DXS_ENABLE }, /* Gigabyte GA-7VAXP */ 2173 2170 { .subvendor = 0x1462, .subdevice = 0x0080, .action = VIA_DXS_SRC }, /* MSI K8T Neo-FIS2R */ 2171 + { .subvendor = 0x1462, .subdevice = 0x0430, .action = VIA_DXS_SRC }, /* MSI 7142 (K8MM-V) */ 2174 2172 { .subvendor = 0x1462, .subdevice = 0x3800, .action = VIA_DXS_ENABLE }, /* MSI KT266 */ 2175 2173 { .subvendor = 0x1462, .subdevice = 0x5901, .action = VIA_DXS_NO_VRA }, /* MSI KT6 Delta-SR */ 2176 2174 { .subvendor = 0x1462, .subdevice = 0x7023, .action = VIA_DXS_NO_VRA }, /* MSI K8T Neo2-FI */ 2177 2175 { .subvendor = 0x1462, .subdevice = 0x7120, .action = VIA_DXS_ENABLE }, /* MSI KT4V */ 2176 + { .subvendor = 0x1462, .subdevice = 0x7142, .action = VIA_DXS_ENABLE }, /* MSI K8MM-V */ 2178 2177 { .subvendor = 0x147b, .subdevice = 0x1401, .action = VIA_DXS_ENABLE }, /* ABIT KD7(-RAID) */ 2179 2178 { .subvendor = 0x147b, .subdevice = 0x1411, .action = VIA_DXS_ENABLE }, /* ABIT VA-20 */ 2180 2179 { .subvendor = 0x147b, .subdevice = 0x1413, .action = VIA_DXS_ENABLE }, /* ABIT KV8 Pro */
+2 -1
sound/pci/via82xx_modem.c
··· 521 521 522 522 switch (cmd) { 523 523 case SNDRV_PCM_TRIGGER_START: 524 + case SNDRV_PCM_TRIGGER_SUSPEND: 524 525 val |= VIA_REG_CTRL_START; 525 526 viadev->running = 1; 526 527 break; ··· 698 697 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 699 698 SNDRV_PCM_INFO_BLOCK_TRANSFER | 700 699 SNDRV_PCM_INFO_MMAP_VALID | 701 - SNDRV_PCM_INFO_RESUME | 700 + /* SNDRV_PCM_INFO_RESUME | */ 702 701 SNDRV_PCM_INFO_PAUSE), 703 702 .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE, 704 703 .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_KNOT,
+159 -71
sound/pci/ymfpci/ymfpci_main.c
··· 321 321 snd_pcm_period_elapsed(ypcm->substream); 322 322 spin_lock(&chip->reg_lock); 323 323 } 324 + 325 + if (unlikely(ypcm->update_pcm_vol)) { 326 + unsigned int subs = ypcm->substream->number; 327 + unsigned int next_bank = 1 - chip->active_bank; 328 + snd_ymfpci_playback_bank_t *bank; 329 + u32 volume; 330 + 331 + bank = &voice->bank[next_bank]; 332 + volume = cpu_to_le32(chip->pcm_mixer[subs].left << 15); 333 + bank->left_gain_end = volume; 334 + if (ypcm->output_rear) 335 + bank->eff2_gain_end = volume; 336 + if (ypcm->voices[1]) 337 + bank = &ypcm->voices[1]->bank[next_bank]; 338 + volume = cpu_to_le32(chip->pcm_mixer[subs].right << 15); 339 + bank->right_gain_end = volume; 340 + if (ypcm->output_rear) 341 + bank->eff3_gain_end = volume; 342 + ypcm->update_pcm_vol--; 343 + } 324 344 } 325 345 spin_unlock(&chip->reg_lock); 326 346 } ··· 471 451 return 0; 472 452 } 473 453 474 - static void snd_ymfpci_pcm_init_voice(ymfpci_voice_t *voice, int stereo, 475 - int rate, int w_16, unsigned long addr, 476 - unsigned int end, 477 - int output_front, int output_rear) 454 + static void snd_ymfpci_pcm_init_voice(ymfpci_pcm_t *ypcm, unsigned int voiceidx, 455 + snd_pcm_runtime_t *runtime, 456 + int has_pcm_volume) 478 457 { 458 + ymfpci_voice_t *voice = ypcm->voices[voiceidx]; 479 459 u32 format; 480 - u32 delta = snd_ymfpci_calc_delta(rate); 481 - u32 lpfQ = snd_ymfpci_calc_lpfQ(rate); 482 - u32 lpfK = snd_ymfpci_calc_lpfK(rate); 460 + u32 delta = snd_ymfpci_calc_delta(runtime->rate); 461 + u32 lpfQ = snd_ymfpci_calc_lpfQ(runtime->rate); 462 + u32 lpfK = snd_ymfpci_calc_lpfK(runtime->rate); 483 463 snd_ymfpci_playback_bank_t *bank; 484 464 unsigned int nbank; 465 + u32 vol_left, vol_right; 466 + u8 use_left, use_right; 485 467 486 468 snd_assert(voice != NULL, return); 487 - format = (stereo ? 0x00010000 : 0) | (w_16 ? 0 : 0x80000000); 469 + if (runtime->channels == 1) { 470 + use_left = 1; 471 + use_right = 1; 472 + } else { 473 + use_left = (voiceidx & 1) == 0; 474 + use_right = !use_left; 475 + } 476 + if (has_pcm_volume) { 477 + vol_left = cpu_to_le32(ypcm->chip->pcm_mixer 478 + [ypcm->substream->number].left << 15); 479 + vol_right = cpu_to_le32(ypcm->chip->pcm_mixer 480 + [ypcm->substream->number].right << 15); 481 + } else { 482 + vol_left = cpu_to_le32(0x40000000); 483 + vol_right = cpu_to_le32(0x40000000); 484 + } 485 + format = runtime->channels == 2 ? 0x00010000 : 0; 486 + if (snd_pcm_format_width(runtime->format) == 8) 487 + format |= 0x80000000; 488 + if (runtime->channels == 2 && (voiceidx & 1) != 0) 489 + format |= 1; 488 490 for (nbank = 0; nbank < 2; nbank++) { 489 491 bank = &voice->bank[nbank]; 492 + memset(bank, 0, sizeof(*bank)); 490 493 bank->format = cpu_to_le32(format); 491 - bank->loop_default = 0; 492 - bank->base = cpu_to_le32(addr); 493 - bank->loop_start = 0; 494 - bank->loop_end = cpu_to_le32(end); 495 - bank->loop_frac = 0; 496 - bank->eg_gain_end = cpu_to_le32(0x40000000); 494 + bank->base = cpu_to_le32(runtime->dma_addr); 495 + bank->loop_end = cpu_to_le32(ypcm->buffer_size); 497 496 bank->lpfQ = cpu_to_le32(lpfQ); 498 - bank->status = 0; 499 - bank->num_of_frames = 0; 500 - bank->loop_count = 0; 501 - bank->start = 0; 502 - bank->start_frac = 0; 503 497 bank->delta = 504 498 bank->delta_end = cpu_to_le32(delta); 505 499 bank->lpfK = 506 500 bank->lpfK_end = cpu_to_le32(lpfK); 507 - bank->eg_gain = cpu_to_le32(0x40000000); 508 - bank->lpfD1 = 509 - bank->lpfD2 = 0; 501 + bank->eg_gain = 502 + bank->eg_gain_end = cpu_to_le32(0x40000000); 510 503 511 - bank->left_gain = 512 - bank->right_gain = 513 - bank->left_gain_end = 514 - bank->right_gain_end = 515 - bank->eff1_gain = 516 - bank->eff2_gain = 517 - bank->eff3_gain = 518 - bank->eff1_gain_end = 519 - bank->eff2_gain_end = 520 - bank->eff3_gain_end = 0; 521 - 522 - if (!stereo) { 523 - if (output_front) { 524 - bank->left_gain = 504 + if (ypcm->output_front) { 505 + if (use_left) { 506 + bank->left_gain = 507 + bank->left_gain_end = vol_left; 508 + } 509 + if (use_right) { 525 510 bank->right_gain = 526 - bank->left_gain_end = 527 - bank->right_gain_end = cpu_to_le32(0x40000000); 511 + bank->right_gain_end = vol_right; 528 512 } 529 - if (output_rear) { 513 + } 514 + if (ypcm->output_rear) { 515 + if (use_left) { 530 516 bank->eff2_gain = 531 - bank->eff2_gain_end = 517 + bank->eff2_gain_end = vol_left; 518 + } 519 + if (use_right) { 532 520 bank->eff3_gain = 533 - bank->eff3_gain_end = cpu_to_le32(0x40000000); 534 - } 535 - } else { 536 - if (output_front) { 537 - if ((voice->number & 1) == 0) { 538 - bank->left_gain = 539 - bank->left_gain_end = cpu_to_le32(0x40000000); 540 - } else { 541 - bank->format |= cpu_to_le32(1); 542 - bank->right_gain = 543 - bank->right_gain_end = cpu_to_le32(0x40000000); 544 - } 545 - } 546 - if (output_rear) { 547 - if ((voice->number & 1) == 0) { 548 - bank->eff3_gain = 549 - bank->eff3_gain_end = cpu_to_le32(0x40000000); 550 - } else { 551 - bank->format |= cpu_to_le32(1); 552 - bank->eff2_gain = 553 - bank->eff2_gain_end = cpu_to_le32(0x40000000); 554 - } 521 + bank->eff3_gain_end = vol_right; 555 522 } 556 523 } 557 524 } ··· 620 613 621 614 static int snd_ymfpci_playback_prepare(snd_pcm_substream_t * substream) 622 615 { 623 - // ymfpci_t *chip = snd_pcm_substream_chip(substream); 616 + ymfpci_t *chip = snd_pcm_substream_chip(substream); 624 617 snd_pcm_runtime_t *runtime = substream->runtime; 625 618 ymfpci_pcm_t *ypcm = runtime->private_data; 626 619 unsigned int nvoice; ··· 630 623 ypcm->period_pos = 0; 631 624 ypcm->last_pos = 0; 632 625 for (nvoice = 0; nvoice < runtime->channels; nvoice++) 633 - snd_ymfpci_pcm_init_voice(ypcm->voices[nvoice], 634 - runtime->channels == 2, 635 - runtime->rate, 636 - snd_pcm_format_width(runtime->format) == 16, 637 - runtime->dma_addr, 638 - ypcm->buffer_size, 639 - ypcm->output_front, 640 - ypcm->output_rear); 626 + snd_ymfpci_pcm_init_voice(ypcm, nvoice, runtime, 627 + substream->pcm == chip->pcm); 641 628 return 0; 642 629 } 643 630 ··· 883 882 ymfpci_t *chip = snd_pcm_substream_chip(substream); 884 883 snd_pcm_runtime_t *runtime = substream->runtime; 885 884 ymfpci_pcm_t *ypcm; 885 + snd_kcontrol_t *kctl; 886 886 int err; 887 887 888 888 if ((err = snd_ymfpci_playback_open_1(substream)) < 0) ··· 897 895 chip->rear_opened++; 898 896 } 899 897 spin_unlock_irq(&chip->reg_lock); 898 + 899 + kctl = chip->pcm_mixer[substream->number].ctl; 900 + kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; 901 + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO, &kctl->id); 900 902 return 0; 901 903 } 902 904 ··· 993 987 { 994 988 ymfpci_t *chip = snd_pcm_substream_chip(substream); 995 989 ymfpci_pcm_t *ypcm = substream->runtime->private_data; 990 + snd_kcontrol_t *kctl; 996 991 997 992 spin_lock_irq(&chip->reg_lock); 998 993 if (ypcm->output_rear && chip->rear_opened > 0) { ··· 1001 994 ymfpci_close_extension(chip); 1002 995 } 1003 996 spin_unlock_irq(&chip->reg_lock); 997 + kctl = chip->pcm_mixer[substream->number].ctl; 998 + kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; 999 + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_INFO, &kctl->id); 1004 1000 return snd_ymfpci_playback_close_1(substream); 1005 1001 } 1006 1002 ··· 1675 1665 .private_value = 2, 1676 1666 }; 1677 1667 1668 + /* 1669 + * PCM voice volume 1670 + */ 1671 + 1672 + static int snd_ymfpci_pcm_vol_info(snd_kcontrol_t *kcontrol, 1673 + snd_ctl_elem_info_t *uinfo) 1674 + { 1675 + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 1676 + uinfo->count = 2; 1677 + uinfo->value.integer.min = 0; 1678 + uinfo->value.integer.max = 0x8000; 1679 + return 0; 1680 + } 1681 + 1682 + static int snd_ymfpci_pcm_vol_get(snd_kcontrol_t *kcontrol, 1683 + snd_ctl_elem_value_t *ucontrol) 1684 + { 1685 + ymfpci_t *chip = snd_kcontrol_chip(kcontrol); 1686 + unsigned int subs = kcontrol->id.subdevice; 1687 + 1688 + ucontrol->value.integer.value[0] = chip->pcm_mixer[subs].left; 1689 + ucontrol->value.integer.value[1] = chip->pcm_mixer[subs].right; 1690 + return 0; 1691 + } 1692 + 1693 + static int snd_ymfpci_pcm_vol_put(snd_kcontrol_t *kcontrol, 1694 + snd_ctl_elem_value_t *ucontrol) 1695 + { 1696 + ymfpci_t *chip = snd_kcontrol_chip(kcontrol); 1697 + unsigned int subs = kcontrol->id.subdevice; 1698 + snd_pcm_substream_t *substream; 1699 + unsigned long flags; 1700 + 1701 + if (ucontrol->value.integer.value[0] != chip->pcm_mixer[subs].left || 1702 + ucontrol->value.integer.value[1] != chip->pcm_mixer[subs].right) { 1703 + chip->pcm_mixer[subs].left = ucontrol->value.integer.value[0]; 1704 + chip->pcm_mixer[subs].right = ucontrol->value.integer.value[1]; 1705 + 1706 + substream = (snd_pcm_substream_t *)kcontrol->private_value; 1707 + spin_lock_irqsave(&chip->voice_lock, flags); 1708 + if (substream->runtime && substream->runtime->private_data) { 1709 + ymfpci_pcm_t *ypcm = substream->runtime->private_data; 1710 + ypcm->update_pcm_vol = 2; 1711 + } 1712 + spin_unlock_irqrestore(&chip->voice_lock, flags); 1713 + return 1; 1714 + } 1715 + return 0; 1716 + } 1717 + 1718 + static snd_kcontrol_new_t snd_ymfpci_pcm_volume __devinitdata = { 1719 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 1720 + .name = "PCM Playback Volume", 1721 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 1722 + SNDRV_CTL_ELEM_ACCESS_INACTIVE, 1723 + .info = snd_ymfpci_pcm_vol_info, 1724 + .get = snd_ymfpci_pcm_vol_get, 1725 + .put = snd_ymfpci_pcm_vol_put, 1726 + }; 1727 + 1678 1728 1679 1729 /* 1680 1730 * Mixer routines ··· 1756 1686 { 1757 1687 ac97_template_t ac97; 1758 1688 snd_kcontrol_t *kctl; 1689 + snd_pcm_substream_t *substream; 1759 1690 unsigned int idx; 1760 1691 int err; 1761 1692 static ac97_bus_ops_t ops = { ··· 1808 1737 if (rear_switch) { 1809 1738 if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_ymfpci_rear_shared, chip))) < 0) 1810 1739 return err; 1740 + } 1741 + 1742 + /* per-voice volume */ 1743 + substream = chip->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; 1744 + for (idx = 0; idx < 32; ++idx) { 1745 + kctl = snd_ctl_new1(&snd_ymfpci_pcm_volume, chip); 1746 + if (!kctl) 1747 + return -ENOMEM; 1748 + kctl->id.device = chip->pcm->device; 1749 + kctl->id.subdevice = idx; 1750 + kctl->private_value = (unsigned long)substream; 1751 + if ((err = snd_ctl_add(chip->card, kctl)) < 0) 1752 + return err; 1753 + chip->pcm_mixer[idx].left = 0x8000; 1754 + chip->pcm_mixer[idx].right = 0x8000; 1755 + chip->pcm_mixer[idx].ctl = kctl; 1756 + substream = substream->next; 1811 1757 } 1812 1758 1813 1759 return 0;
+7 -5
sound/pcmcia/vx/vxpocket.c
··· 297 297 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); 298 298 299 299 chip->dev = &handle_to_dev(link->handle); 300 + snd_card_set_dev(chip->card, chip->dev); 300 301 301 302 if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq.AssignedIRQ) < 0) 302 303 goto failed; ··· 377 376 378 377 /* 379 378 */ 380 - static dev_link_t *vxp_attach(void) 379 + static dev_link_t *vxpocket_attach(void) 381 380 { 382 381 snd_card_t *card; 383 382 struct snd_vxpocket *vxp; ··· 408 407 return NULL; 409 408 } 410 409 411 - vxp->index = index[i]; 410 + vxp->index = i; 412 411 card_alloc |= 1 << i; 413 412 414 413 /* Chain drivers */ ··· 418 417 return &vxp->link; 419 418 } 420 419 421 - static void vxp_detach(dev_link_t *link) 420 + static void vxpocket_detach(dev_link_t *link) 422 421 { 423 422 struct snd_vxpocket *vxp; 424 423 vx_core_t *chip; ··· 459 458 .drv = { 460 459 .name = "snd-vxpocket", 461 460 }, 462 - .attach = vxp_attach, 463 - .detach = vxp_detach, 461 + .attach = vxpocket_attach, 462 + .detach = vxpocket_detach, 463 + .event = vxpocket_event, 464 464 .id_table = vxp_ids, 465 465 }; 466 466
+18 -9
sound/sound_core.c
··· 153 153 * list. Acquires locks as needed 154 154 */ 155 155 156 - static int sound_insert_unit(struct sound_unit **list, struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode) 156 + static int sound_insert_unit(struct sound_unit **list, struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode, struct device *dev) 157 157 { 158 158 struct sound_unit *s = kmalloc(sizeof(*s), GFP_KERNEL); 159 159 int r; ··· 175 175 devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor), 176 176 S_IFCHR | mode, s->name); 177 177 class_device_create(sound_class, MKDEV(SOUND_MAJOR, s->unit_minor), 178 - NULL, s->name+6); 178 + dev, s->name+6); 179 179 return r; 180 180 181 181 fail: ··· 227 227 static struct sound_unit *chains[SOUND_STEP]; 228 228 229 229 /** 230 - * register_sound_special - register a special sound node 230 + * register_sound_special_device - register a special sound node 231 231 * @fops: File operations for the driver 232 232 * @unit: Unit number to allocate 233 + * @dev: device pointer 233 234 * 234 235 * Allocate a special sound device by minor number from the sound 235 236 * subsystem. The allocated number is returned on succes. On failure 236 237 * a negative error code is returned. 237 238 */ 238 239 239 - int register_sound_special(struct file_operations *fops, int unit) 240 + int register_sound_special_device(struct file_operations *fops, int unit, 241 + struct device *dev) 240 242 { 241 243 const int chain = unit % SOUND_STEP; 242 244 int max_unit = 128 + chain; ··· 296 294 break; 297 295 } 298 296 return sound_insert_unit(&chains[chain], fops, -1, unit, max_unit, 299 - name, S_IRUSR | S_IWUSR); 297 + name, S_IRUSR | S_IWUSR, dev); 300 298 } 301 299 300 + EXPORT_SYMBOL(register_sound_special_device); 301 + 302 + int register_sound_special(struct file_operations *fops, int unit) 303 + { 304 + return register_sound_special_device(fops, unit, NULL); 305 + } 306 + 302 307 EXPORT_SYMBOL(register_sound_special); 303 308 304 309 /** ··· 321 312 int register_sound_mixer(struct file_operations *fops, int dev) 322 313 { 323 314 return sound_insert_unit(&chains[0], fops, dev, 0, 128, 324 - "mixer", S_IRUSR | S_IWUSR); 315 + "mixer", S_IRUSR | S_IWUSR, NULL); 325 316 } 326 317 327 318 EXPORT_SYMBOL(register_sound_mixer); ··· 339 330 int register_sound_midi(struct file_operations *fops, int dev) 340 331 { 341 332 return sound_insert_unit(&chains[2], fops, dev, 2, 130, 342 - "midi", S_IRUSR | S_IWUSR); 333 + "midi", S_IRUSR | S_IWUSR, NULL); 343 334 } 344 335 345 336 EXPORT_SYMBOL(register_sound_midi); ··· 365 356 int register_sound_dsp(struct file_operations *fops, int dev) 366 357 { 367 358 return sound_insert_unit(&chains[3], fops, dev, 3, 131, 368 - "dsp", S_IWUSR | S_IRUSR); 359 + "dsp", S_IWUSR | S_IRUSR, NULL); 369 360 } 370 361 371 362 EXPORT_SYMBOL(register_sound_dsp); ··· 384 375 int register_sound_synth(struct file_operations *fops, int dev) 385 376 { 386 377 return sound_insert_unit(&chains[9], fops, dev, 9, 137, 387 - "synth", S_IRUSR | S_IWUSR); 378 + "synth", S_IRUSR | S_IWUSR, NULL); 388 379 } 389 380 390 381 EXPORT_SYMBOL(register_sound_synth);
-1
sound/synth/emux/emux_synth.c
··· 98 98 vp = emu->ops.get_voice(emu, port); 99 99 if (vp == NULL || vp->ch < 0) 100 100 continue; 101 - snd_assert(vp->emu != NULL && vp->hw != NULL, return); 102 101 if (STATE_IS_PLAYING(vp->state)) 103 102 emu->ops.terminate(vp); 104 103
+187 -133
sound/usb/usbaudio.c
··· 41 41 #include <sound/driver.h> 42 42 #include <linux/bitops.h> 43 43 #include <linux/init.h> 44 + #include <linux/interrupt.h> 44 45 #include <linux/list.h> 45 46 #include <linux/slab.h> 46 47 #include <linux/string.h> 47 48 #include <linux/usb.h> 49 + #include <linux/vmalloc.h> 48 50 #include <linux/moduleparam.h> 49 51 #include <sound/core.h> 50 52 #include <sound/info.h> ··· 81 79 MODULE_PARM_DESC(vid, "Vendor ID for the USB audio device."); 82 80 module_param_array(pid, int, NULL, 0444); 83 81 MODULE_PARM_DESC(pid, "Product ID for the USB audio device."); 84 - module_param(nrpacks, int, 0444); 82 + module_param(nrpacks, int, 0644); 85 83 MODULE_PARM_DESC(nrpacks, "Max. number of packets per URB."); 86 84 module_param(async_unlink, bool, 0444); 87 85 MODULE_PARM_DESC(async_unlink, "Use async unlink mode."); ··· 99 97 100 98 #define MAX_PACKS 10 101 99 #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ 102 - #define MAX_URBS 5 /* max. 20ms long packets */ 100 + #define MAX_URBS 8 103 101 #define SYNC_URBS 4 /* always four urbs for sync */ 104 102 #define MIN_PACKS_URB 1 /* minimum 1 packet per urb */ 105 103 ··· 128 126 129 127 struct snd_urb_ctx { 130 128 struct urb *urb; 129 + unsigned int buffer_size; /* size of data buffer, if data URB */ 131 130 snd_usb_substream_t *subs; 132 131 int index; /* index for urb array */ 133 132 int packets; /* number of packets per urb */ 134 - int transfer; /* transferred size */ 135 - char *buf; /* buffer for capture */ 136 133 }; 137 134 138 135 struct snd_urb_ops { ··· 166 165 unsigned int curframesize; /* current packet size in frames (for capture) */ 167 166 unsigned int fill_max: 1; /* fill max packet size always */ 168 167 unsigned int fmt_type; /* USB audio format type (1-3) */ 168 + unsigned int packs_per_ms; /* packets per millisecond (for playback) */ 169 169 170 170 unsigned int running: 1; /* running status */ 171 171 172 - unsigned int hwptr; /* free frame position in the buffer (only for playback) */ 173 172 unsigned int hwptr_done; /* processed frame position in the buffer */ 174 - unsigned int transfer_sched; /* scheduled frames since last period (for playback) */ 175 173 unsigned int transfer_done; /* processed frames since last period update */ 176 174 unsigned long active_mask; /* bitmask of active urbs */ 177 175 unsigned long unlink_mask; /* bitmask of unlinked urbs */ ··· 178 178 unsigned int nurbs; /* # urbs */ 179 179 snd_urb_ctx_t dataurb[MAX_URBS]; /* data urb table */ 180 180 snd_urb_ctx_t syncurb[SYNC_URBS]; /* sync urb table */ 181 - char syncbuf[SYNC_URBS * 4]; /* sync buffer; it's so small - let's get static */ 182 - char *tmpbuf; /* temporary buffer for playback */ 181 + char *syncbuf; /* sync buffer for all sync URBs */ 182 + dma_addr_t sync_dma; /* DMA address of syncbuf */ 183 183 184 184 u64 formats; /* format bitmasks (all or'ed) */ 185 185 unsigned int num_formats; /* number of supported audio formats (list) */ 186 186 struct list_head fmt_list; /* format list */ 187 187 spinlock_t lock; 188 + struct tasklet_struct start_period_elapsed; /* for start trigger */ 188 189 189 190 struct snd_urb_ops ops; /* callbacks (must be filled at init) */ 190 191 }; ··· 312 311 struct urb *urb) 313 312 { 314 313 int i, offs; 315 - unsigned long flags; 316 314 snd_urb_ctx_t *ctx = (snd_urb_ctx_t *)urb->context; 317 315 318 316 offs = 0; 319 317 urb->dev = ctx->subs->dev; /* we need to set this at each time */ 320 - urb->number_of_packets = 0; 321 - spin_lock_irqsave(&subs->lock, flags); 322 318 for (i = 0; i < ctx->packets; i++) { 323 319 urb->iso_frame_desc[i].offset = offs; 324 320 urb->iso_frame_desc[i].length = subs->curpacksize; 325 321 offs += subs->curpacksize; 326 - urb->number_of_packets++; 327 - subs->transfer_sched += subs->curframesize; 328 - if (subs->transfer_sched >= runtime->period_size) { 329 - subs->transfer_sched -= runtime->period_size; 330 - break; 331 - } 332 322 } 333 - spin_unlock_irqrestore(&subs->lock, flags); 334 - urb->transfer_buffer = ctx->buf; 335 323 urb->transfer_buffer_length = offs; 324 + urb->number_of_packets = ctx->packets; 336 325 #if 0 // for check 337 326 if (! urb->bandwidth) { 338 327 int bustime; ··· 350 359 unsigned char *cp; 351 360 int i; 352 361 unsigned int stride, len, oldptr; 362 + int period_elapsed = 0; 353 363 354 364 stride = runtime->frame_bits >> 3; 355 365 ··· 370 378 if (subs->hwptr_done >= runtime->buffer_size) 371 379 subs->hwptr_done -= runtime->buffer_size; 372 380 subs->transfer_done += len; 381 + if (subs->transfer_done >= runtime->period_size) { 382 + subs->transfer_done -= runtime->period_size; 383 + period_elapsed = 1; 384 + } 373 385 spin_unlock_irqrestore(&subs->lock, flags); 374 386 /* copy a data chunk */ 375 387 if (oldptr + len > runtime->buffer_size) { ··· 384 388 } else { 385 389 memcpy(runtime->dma_area + oldptr * stride, cp, len * stride); 386 390 } 387 - /* update the pointer, call callback if necessary */ 388 - spin_lock_irqsave(&subs->lock, flags); 389 - if (subs->transfer_done >= runtime->period_size) { 390 - subs->transfer_done -= runtime->period_size; 391 - spin_unlock_irqrestore(&subs->lock, flags); 392 - snd_pcm_period_elapsed(subs->pcm_substream); 393 - } else 394 - spin_unlock_irqrestore(&subs->lock, flags); 395 391 } 392 + if (period_elapsed) 393 + snd_pcm_period_elapsed(subs->pcm_substream); 396 394 return 0; 397 395 } 398 396 ··· 482 492 /* 483 493 * prepare urb for playback data pipe 484 494 * 485 - * we copy the data directly from the pcm buffer. 486 - * the current position to be copied is held in hwptr field. 487 - * since a urb can handle only a single linear buffer, if the total 488 - * transferred area overflows the buffer boundary, we cannot send 489 - * it directly from the buffer. thus the data is once copied to 490 - * a temporary buffer and urb points to that. 495 + * Since a URB can handle only a single linear buffer, we must use double 496 + * buffering when the data to be transferred overflows the buffer boundary. 497 + * To avoid inconsistencies when updating hwptr_done, we use double buffering 498 + * for all URBs. 491 499 */ 492 500 static int prepare_playback_urb(snd_usb_substream_t *subs, 493 501 snd_pcm_runtime_t *runtime, ··· 494 506 int i, stride, offs; 495 507 unsigned int counts; 496 508 unsigned long flags; 509 + int period_elapsed = 0; 497 510 snd_urb_ctx_t *ctx = (snd_urb_ctx_t *)urb->context; 498 511 499 512 stride = runtime->frame_bits >> 3; ··· 519 530 urb->iso_frame_desc[i].length = counts * stride; 520 531 offs += counts; 521 532 urb->number_of_packets++; 522 - subs->transfer_sched += counts; 523 - if (subs->transfer_sched >= runtime->period_size) { 524 - subs->transfer_sched -= runtime->period_size; 533 + subs->transfer_done += counts; 534 + if (subs->transfer_done >= runtime->period_size) { 535 + subs->transfer_done -= runtime->period_size; 536 + period_elapsed = 1; 525 537 if (subs->fmt_type == USB_FORMAT_TYPE_II) { 526 - if (subs->transfer_sched > 0) { 527 - /* FIXME: fill-max mode is not supported yet */ 528 - offs -= subs->transfer_sched; 529 - counts -= subs->transfer_sched; 530 - urb->iso_frame_desc[i].length = counts * stride; 531 - subs->transfer_sched = 0; 538 + if (subs->transfer_done > 0) { 539 + /* FIXME: fill-max mode is not 540 + * supported yet */ 541 + offs -= subs->transfer_done; 542 + counts -= subs->transfer_done; 543 + urb->iso_frame_desc[i].length = 544 + counts * stride; 545 + subs->transfer_done = 0; 532 546 } 533 547 i++; 534 548 if (i < ctx->packets) { 535 549 /* add a transfer delimiter */ 536 - urb->iso_frame_desc[i].offset = offs * stride; 550 + urb->iso_frame_desc[i].offset = 551 + offs * stride; 537 552 urb->iso_frame_desc[i].length = 0; 538 553 urb->number_of_packets++; 539 554 } 555 + break; 540 556 } 541 - break; 542 557 } 558 + /* finish at the frame boundary at/after the period boundary */ 559 + if (period_elapsed && 560 + (i & (subs->packs_per_ms - 1)) == subs->packs_per_ms - 1) 561 + break; 543 562 } 544 - if (subs->hwptr + offs > runtime->buffer_size) { 545 - /* err, the transferred area goes over buffer boundary. 546 - * copy the data to the temp buffer. 547 - */ 548 - int len; 549 - len = runtime->buffer_size - subs->hwptr; 550 - urb->transfer_buffer = subs->tmpbuf; 551 - memcpy(subs->tmpbuf, runtime->dma_area + subs->hwptr * stride, len * stride); 552 - memcpy(subs->tmpbuf + len * stride, runtime->dma_area, (offs - len) * stride); 553 - subs->hwptr += offs; 554 - subs->hwptr -= runtime->buffer_size; 563 + if (subs->hwptr_done + offs > runtime->buffer_size) { 564 + /* err, the transferred area goes over buffer boundary. */ 565 + unsigned int len = runtime->buffer_size - subs->hwptr_done; 566 + memcpy(urb->transfer_buffer, 567 + runtime->dma_area + subs->hwptr_done * stride, 568 + len * stride); 569 + memcpy(urb->transfer_buffer + len * stride, 570 + runtime->dma_area, 571 + (offs - len) * stride); 555 572 } else { 556 - /* set the buffer pointer */ 557 - urb->transfer_buffer = runtime->dma_area + subs->hwptr * stride; 558 - subs->hwptr += offs; 559 - if (subs->hwptr == runtime->buffer_size) 560 - subs->hwptr = 0; 573 + memcpy(urb->transfer_buffer, 574 + runtime->dma_area + subs->hwptr_done * stride, 575 + offs * stride); 561 576 } 577 + subs->hwptr_done += offs; 578 + if (subs->hwptr_done >= runtime->buffer_size) 579 + subs->hwptr_done -= runtime->buffer_size; 562 580 spin_unlock_irqrestore(&subs->lock, flags); 563 581 urb->transfer_buffer_length = offs * stride; 564 - ctx->transfer = offs; 565 - 582 + if (period_elapsed) { 583 + if (likely(subs->running)) 584 + snd_pcm_period_elapsed(subs->pcm_substream); 585 + else 586 + tasklet_hi_schedule(&subs->start_period_elapsed); 587 + } 566 588 return 0; 567 589 } 568 590 569 591 /* 570 592 * process after playback data complete 571 - * 572 - * update the current position and call callback if a period is processed. 593 + * - nothing to do 573 594 */ 574 595 static int retire_playback_urb(snd_usb_substream_t *subs, 575 596 snd_pcm_runtime_t *runtime, 576 597 struct urb *urb) 577 598 { 578 - unsigned long flags; 579 - snd_urb_ctx_t *ctx = (snd_urb_ctx_t *)urb->context; 580 - 581 - spin_lock_irqsave(&subs->lock, flags); 582 - subs->transfer_done += ctx->transfer; 583 - subs->hwptr_done += ctx->transfer; 584 - ctx->transfer = 0; 585 - if (subs->hwptr_done >= runtime->buffer_size) 586 - subs->hwptr_done -= runtime->buffer_size; 587 - if (subs->transfer_done >= runtime->period_size) { 588 - subs->transfer_done -= runtime->period_size; 589 - spin_unlock_irqrestore(&subs->lock, flags); 590 - snd_pcm_period_elapsed(subs->pcm_substream); 591 - } else 592 - spin_unlock_irqrestore(&subs->lock, flags); 593 599 return 0; 600 + } 601 + 602 + /* 603 + * Delay the snd_pcm_period_elapsed() call until after the start trigger 604 + * callback so that we're not longer in the substream's lock. 605 + */ 606 + static void start_period_elapsed(unsigned long data) 607 + { 608 + snd_usb_substream_t *subs = (snd_usb_substream_t *)data; 609 + snd_pcm_period_elapsed(subs->pcm_substream); 594 610 } 595 611 596 612 ··· 674 680 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); 675 681 } 676 682 } 683 + } 684 + 685 + 686 + /* get the physical page pointer at the given offset */ 687 + static struct page *snd_pcm_get_vmalloc_page(snd_pcm_substream_t *subs, 688 + unsigned long offset) 689 + { 690 + void *pageptr = subs->runtime->dma_area + offset; 691 + return vmalloc_to_page(pageptr); 692 + } 693 + 694 + /* allocate virtual buffer; may be called more than once */ 695 + static int snd_pcm_alloc_vmalloc_buffer(snd_pcm_substream_t *subs, size_t size) 696 + { 697 + snd_pcm_runtime_t *runtime = subs->runtime; 698 + if (runtime->dma_area) { 699 + if (runtime->dma_bytes >= size) 700 + return 0; /* already large enough */ 701 + vfree_nocheck(runtime->dma_area); 702 + } 703 + runtime->dma_area = vmalloc_nocheck(size); 704 + if (! runtime->dma_area) 705 + return -ENOMEM; 706 + runtime->dma_bytes = size; 707 + return 0; 708 + } 709 + 710 + /* free virtual buffer; may be called more than once */ 711 + static int snd_pcm_free_vmalloc_buffer(snd_pcm_substream_t *subs) 712 + { 713 + snd_pcm_runtime_t *runtime = subs->runtime; 714 + if (runtime->dma_area) { 715 + vfree_nocheck(runtime->dma_area); 716 + runtime->dma_area = NULL; 717 + } 718 + return 0; 677 719 } 678 720 679 721 ··· 854 824 */ 855 825 static snd_pcm_uframes_t snd_usb_pcm_pointer(snd_pcm_substream_t *substream) 856 826 { 857 - snd_usb_substream_t *subs = (snd_usb_substream_t *)substream->runtime->private_data; 858 - return subs->hwptr_done; 827 + snd_usb_substream_t *subs; 828 + snd_pcm_uframes_t hwptr_done; 829 + 830 + subs = (snd_usb_substream_t *)substream->runtime->private_data; 831 + spin_lock(&subs->lock); 832 + hwptr_done = subs->hwptr_done; 833 + spin_unlock(&subs->lock); 834 + return hwptr_done; 859 835 } 860 836 861 837 ··· 894 858 static void release_urb_ctx(snd_urb_ctx_t *u) 895 859 { 896 860 if (u->urb) { 861 + if (u->buffer_size) 862 + usb_buffer_free(u->subs->dev, u->buffer_size, 863 + u->urb->transfer_buffer, 864 + u->urb->transfer_dma); 897 865 usb_free_urb(u->urb); 898 866 u->urb = NULL; 899 867 } 900 - kfree(u->buf); 901 - u->buf = NULL; 902 868 } 903 869 904 870 /* ··· 918 880 release_urb_ctx(&subs->dataurb[i]); 919 881 for (i = 0; i < SYNC_URBS; i++) 920 882 release_urb_ctx(&subs->syncurb[i]); 921 - kfree(subs->tmpbuf); 922 - subs->tmpbuf = NULL; 883 + usb_buffer_free(subs->dev, SYNC_URBS * 4, 884 + subs->syncbuf, subs->sync_dma); 885 + subs->syncbuf = NULL; 923 886 subs->nurbs = 0; 924 887 } 925 888 ··· 932 893 { 933 894 unsigned int maxsize, n, i; 934 895 int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK; 935 - unsigned int npacks[MAX_URBS], urb_packs, total_packs; 896 + unsigned int npacks[MAX_URBS], urb_packs, total_packs, packs_per_ms; 936 897 937 898 /* calculate the frequency in 16.16 format */ 938 899 if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) ··· 959 920 else 960 921 subs->curpacksize = maxsize; 961 922 962 - if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) 963 - urb_packs = nrpacks; 923 + if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH) 924 + packs_per_ms = 8 >> subs->datainterval; 964 925 else 965 - urb_packs = (nrpacks * 8) >> subs->datainterval; 926 + packs_per_ms = 1; 927 + subs->packs_per_ms = packs_per_ms; 966 928 967 - /* allocate a temporary buffer for playback */ 968 929 if (is_playback) { 969 - subs->tmpbuf = kmalloc(maxsize * urb_packs, GFP_KERNEL); 970 - if (! subs->tmpbuf) { 971 - snd_printk(KERN_ERR "cannot malloc tmpbuf\n"); 972 - return -ENOMEM; 973 - } 974 - } 930 + urb_packs = nrpacks; 931 + urb_packs = max(urb_packs, (unsigned int)MIN_PACKS_URB); 932 + urb_packs = min(urb_packs, (unsigned int)MAX_PACKS); 933 + } else 934 + urb_packs = 1; 935 + urb_packs *= packs_per_ms; 975 936 976 937 /* decide how many packets to be used */ 977 - total_packs = (period_bytes + maxsize - 1) / maxsize; 978 - if (total_packs < 2 * MIN_PACKS_URB) 979 - total_packs = 2 * MIN_PACKS_URB; 938 + if (is_playback) { 939 + unsigned int minsize; 940 + /* determine how small a packet can be */ 941 + minsize = (subs->freqn >> (16 - subs->datainterval)) 942 + * (frame_bits >> 3); 943 + /* with sync from device, assume it can be 12% lower */ 944 + if (subs->syncpipe) 945 + minsize -= minsize >> 3; 946 + minsize = max(minsize, 1u); 947 + total_packs = (period_bytes + minsize - 1) / minsize; 948 + /* round up to multiple of packs_per_ms */ 949 + total_packs = (total_packs + packs_per_ms - 1) 950 + & ~(packs_per_ms - 1); 951 + /* we need at least two URBs for queueing */ 952 + if (total_packs < 2 * MIN_PACKS_URB * packs_per_ms) 953 + total_packs = 2 * MIN_PACKS_URB * packs_per_ms; 954 + } else { 955 + total_packs = MAX_URBS * urb_packs; 956 + } 980 957 subs->nurbs = (total_packs + urb_packs - 1) / urb_packs; 981 958 if (subs->nurbs > MAX_URBS) { 982 959 /* too much... */ ··· 1011 956 subs->nurbs = 2; 1012 957 npacks[0] = (total_packs + 1) / 2; 1013 958 npacks[1] = total_packs - npacks[0]; 1014 - } else if (npacks[subs->nurbs-1] < MIN_PACKS_URB) { 959 + } else if (npacks[subs->nurbs-1] < MIN_PACKS_URB * packs_per_ms) { 1015 960 /* the last packet is too small.. */ 1016 961 if (subs->nurbs > 2) { 1017 962 /* merge to the first one */ ··· 1030 975 snd_urb_ctx_t *u = &subs->dataurb[i]; 1031 976 u->index = i; 1032 977 u->subs = subs; 1033 - u->transfer = 0; 1034 978 u->packets = npacks[i]; 979 + u->buffer_size = maxsize * u->packets; 1035 980 if (subs->fmt_type == USB_FORMAT_TYPE_II) 1036 981 u->packets++; /* for transfer delimiter */ 1037 - if (! is_playback) { 1038 - /* allocate a capture buffer per urb */ 1039 - u->buf = kmalloc(maxsize * u->packets, GFP_KERNEL); 1040 - if (! u->buf) { 1041 - release_substream_urbs(subs, 0); 1042 - return -ENOMEM; 1043 - } 1044 - } 1045 982 u->urb = usb_alloc_urb(u->packets, GFP_KERNEL); 1046 - if (! u->urb) { 1047 - release_substream_urbs(subs, 0); 1048 - return -ENOMEM; 1049 - } 1050 - u->urb->dev = subs->dev; 983 + if (! u->urb) 984 + goto out_of_memory; 985 + u->urb->transfer_buffer = 986 + usb_buffer_alloc(subs->dev, u->buffer_size, GFP_KERNEL, 987 + &u->urb->transfer_dma); 988 + if (! u->urb->transfer_buffer) 989 + goto out_of_memory; 1051 990 u->urb->pipe = subs->datapipe; 1052 - u->urb->transfer_flags = URB_ISO_ASAP; 1053 - u->urb->number_of_packets = u->packets; 991 + u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; 1054 992 u->urb->interval = 1 << subs->datainterval; 1055 993 u->urb->context = u; 1056 994 u->urb->complete = snd_usb_complete_callback(snd_complete_urb); ··· 1051 1003 1052 1004 if (subs->syncpipe) { 1053 1005 /* allocate and initialize sync urbs */ 1006 + subs->syncbuf = usb_buffer_alloc(subs->dev, SYNC_URBS * 4, 1007 + GFP_KERNEL, &subs->sync_dma); 1008 + if (! subs->syncbuf) 1009 + goto out_of_memory; 1054 1010 for (i = 0; i < SYNC_URBS; i++) { 1055 1011 snd_urb_ctx_t *u = &subs->syncurb[i]; 1056 1012 u->index = i; 1057 1013 u->subs = subs; 1058 1014 u->packets = 1; 1059 1015 u->urb = usb_alloc_urb(1, GFP_KERNEL); 1060 - if (! u->urb) { 1061 - release_substream_urbs(subs, 0); 1062 - return -ENOMEM; 1063 - } 1016 + if (! u->urb) 1017 + goto out_of_memory; 1064 1018 u->urb->transfer_buffer = subs->syncbuf + i * 4; 1019 + u->urb->transfer_dma = subs->sync_dma + i * 4; 1065 1020 u->urb->transfer_buffer_length = 4; 1066 - u->urb->dev = subs->dev; 1067 1021 u->urb->pipe = subs->syncpipe; 1068 - u->urb->transfer_flags = URB_ISO_ASAP; 1022 + u->urb->transfer_flags = URB_ISO_ASAP | 1023 + URB_NO_TRANSFER_DMA_MAP; 1069 1024 u->urb->number_of_packets = 1; 1070 1025 u->urb->interval = 1 << subs->syncinterval; 1071 1026 u->urb->context = u; ··· 1076 1025 } 1077 1026 } 1078 1027 return 0; 1028 + 1029 + out_of_memory: 1030 + release_substream_urbs(subs, 0); 1031 + return -ENOMEM; 1079 1032 } 1080 1033 1081 1034 ··· 1348 1293 unsigned int channels, rate, format; 1349 1294 int ret, changed; 1350 1295 1351 - ret = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params)); 1296 + ret = snd_pcm_alloc_vmalloc_buffer(substream, 1297 + params_buffer_bytes(hw_params)); 1352 1298 if (ret < 0) 1353 1299 return ret; 1354 1300 ··· 1405 1349 subs->cur_rate = 0; 1406 1350 subs->period_bytes = 0; 1407 1351 release_substream_urbs(subs, 0); 1408 - return snd_pcm_lib_free_pages(substream); 1352 + return snd_pcm_free_vmalloc_buffer(substream); 1409 1353 } 1410 1354 1411 1355 /* ··· 1428 1372 subs->curframesize = bytes_to_frames(runtime, subs->curpacksize); 1429 1373 1430 1374 /* reset the pointer */ 1431 - subs->hwptr = 0; 1432 1375 subs->hwptr_done = 0; 1433 - subs->transfer_sched = 0; 1434 1376 subs->transfer_done = 0; 1435 1377 subs->phase = 0; 1436 1378 ··· 1444 1390 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1445 1391 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1446 1392 SNDRV_PCM_INFO_MMAP_VALID), 1447 - .buffer_bytes_max = (128*1024), 1393 + .buffer_bytes_max = (256*1024), 1448 1394 .period_bytes_min = 64, 1449 1395 .period_bytes_max = (128*1024), 1450 1396 .periods_min = 2, ··· 1456 1402 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 1457 1403 SNDRV_PCM_INFO_BLOCK_TRANSFER | 1458 1404 SNDRV_PCM_INFO_MMAP_VALID), 1459 - .buffer_bytes_max = (128*1024), 1405 + .buffer_bytes_max = (256*1024), 1460 1406 .period_bytes_min = 64, 1461 1407 .period_bytes_max = (128*1024), 1462 1408 .periods_min = 2, ··· 1848 1794 .prepare = snd_usb_pcm_prepare, 1849 1795 .trigger = snd_usb_pcm_trigger, 1850 1796 .pointer = snd_usb_pcm_pointer, 1797 + .page = snd_pcm_get_vmalloc_page, 1851 1798 }; 1852 1799 1853 1800 static snd_pcm_ops_t snd_usb_capture_ops = { ··· 1860 1805 .prepare = snd_usb_pcm_prepare, 1861 1806 .trigger = snd_usb_pcm_trigger, 1862 1807 .pointer = snd_usb_pcm_pointer, 1808 + .page = snd_pcm_get_vmalloc_page, 1863 1809 }; 1864 1810 1865 1811 ··· 2077 2021 2078 2022 INIT_LIST_HEAD(&subs->fmt_list); 2079 2023 spin_lock_init(&subs->lock); 2024 + if (stream == SNDRV_PCM_STREAM_PLAYBACK) 2025 + tasklet_init(&subs->start_period_elapsed, start_period_elapsed, 2026 + (unsigned long)subs); 2080 2027 2081 2028 subs->stream = as; 2082 2029 subs->direction = stream; ··· 2088 2029 subs->ops = audio_urb_ops[stream]; 2089 2030 else 2090 2031 subs->ops = audio_urb_ops_high_speed[stream]; 2091 - snd_pcm_lib_preallocate_pages(as->pcm->streams[stream].substream, 2092 - SNDRV_DMA_TYPE_CONTINUOUS, 2093 - snd_dma_continuous_data(GFP_KERNEL), 2094 - 64 * 1024, 128 * 1024); 2095 2032 snd_pcm_set_ops(as->pcm, stream, 2096 2033 stream == SNDRV_PCM_STREAM_PLAYBACK ? 2097 2034 &snd_usb_playback_ops : &snd_usb_capture_ops); ··· 2133 2078 snd_usb_stream_t *stream = pcm->private_data; 2134 2079 if (stream) { 2135 2080 stream->pcm = NULL; 2136 - snd_pcm_lib_preallocate_free_for_all(pcm); 2137 2081 snd_usb_audio_stream_free(stream); 2138 2082 } 2139 2083 }
+89 -22
sound/usb/usbmidi.c
··· 44 44 #include <linux/string.h> 45 45 #include <linux/init.h> 46 46 #include <linux/slab.h> 47 + #include <linux/timer.h> 47 48 #include <linux/usb.h> 48 49 #include <sound/core.h> 49 50 #include <sound/minors.h> ··· 56 55 * define this to log all USB packets 57 56 */ 58 57 /* #define DUMP_PACKETS */ 58 + 59 + /* 60 + * how long to wait after some USB errors, so that khubd can disconnect() us 61 + * without too many spurious errors 62 + */ 63 + #define ERROR_DELAY_JIFFIES (HZ / 10) 59 64 60 65 61 66 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); ··· 107 100 snd_rawmidi_t* rmidi; 108 101 struct usb_protocol_ops* usb_protocol_ops; 109 102 struct list_head list; 103 + struct timer_list error_timer; 110 104 111 105 struct snd_usb_midi_endpoint { 112 106 snd_usb_midi_out_endpoint_t *out; ··· 149 141 struct usbmidi_in_port { 150 142 snd_rawmidi_substream_t* substream; 151 143 } ports[0x10]; 152 - int seen_f5; 144 + u8 seen_f5; 145 + u8 error_resubmit; 153 146 int current_port; 154 147 }; 155 148 ··· 176 167 */ 177 168 static int snd_usbmidi_urb_error(int status) 178 169 { 179 - if (status == -ENOENT) 180 - return status; /* killed */ 181 - if (status == -EILSEQ || 182 - status == -ECONNRESET || 183 - status == -ETIMEDOUT) 184 - return -ENODEV; /* device removed/shutdown */ 185 - snd_printk(KERN_ERR "urb status %d\n", status); 186 - return 0; /* continue */ 170 + switch (status) { 171 + /* manually unlinked, or device gone */ 172 + case -ENOENT: 173 + case -ECONNRESET: 174 + case -ESHUTDOWN: 175 + case -ENODEV: 176 + return -ENODEV; 177 + /* errors that might occur during unplugging */ 178 + case -EPROTO: /* EHCI */ 179 + case -ETIMEDOUT: /* OHCI */ 180 + case -EILSEQ: /* UHCI */ 181 + return -EIO; 182 + default: 183 + snd_printk(KERN_ERR "urb status %d\n", status); 184 + return 0; /* continue */ 185 + } 187 186 } 188 187 189 188 /* ··· 235 218 ep->umidi->usb_protocol_ops->input(ep, urb->transfer_buffer, 236 219 urb->actual_length); 237 220 } else { 238 - if (snd_usbmidi_urb_error(urb->status) < 0) 221 + int err = snd_usbmidi_urb_error(urb->status); 222 + if (err < 0) { 223 + if (err != -ENODEV) { 224 + ep->error_resubmit = 1; 225 + mod_timer(&ep->umidi->error_timer, 226 + jiffies + ERROR_DELAY_JIFFIES); 227 + } 239 228 return; 229 + } 240 230 } 241 231 242 232 if (usb_pipe_needs_resubmit(urb->pipe)) { ··· 260 236 ep->urb_active = 0; 261 237 spin_unlock(&ep->buffer_lock); 262 238 if (urb->status < 0) { 263 - if (snd_usbmidi_urb_error(urb->status) < 0) 239 + int err = snd_usbmidi_urb_error(urb->status); 240 + if (err < 0) { 241 + if (err != -ENODEV) 242 + mod_timer(&ep->umidi->error_timer, 243 + jiffies + ERROR_DELAY_JIFFIES); 264 244 return; 245 + } 265 246 } 266 247 snd_usbmidi_do_output(ep); 267 248 } ··· 303 274 snd_usb_midi_out_endpoint_t* ep = (snd_usb_midi_out_endpoint_t *) data; 304 275 305 276 snd_usbmidi_do_output(ep); 277 + } 278 + 279 + /* called after transfers had been interrupted due to some USB error */ 280 + static void snd_usbmidi_error_timer(unsigned long data) 281 + { 282 + snd_usb_midi_t *umidi = (snd_usb_midi_t *)data; 283 + int i; 284 + 285 + for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { 286 + snd_usb_midi_in_endpoint_t *in = umidi->endpoints[i].in; 287 + if (in && in->error_resubmit) { 288 + in->error_resubmit = 0; 289 + in->urb->dev = umidi->chip->dev; 290 + snd_usbmidi_submit_urb(in->urb, GFP_ATOMIC); 291 + } 292 + if (umidi->endpoints[i].out) 293 + snd_usbmidi_do_output(umidi->endpoints[i].out); 294 + } 306 295 } 307 296 308 297 /* helper function to send static data that may not DMA-able */ ··· 641 594 static void snd_usbmidi_emagic_input(snd_usb_midi_in_endpoint_t* ep, 642 595 uint8_t* buffer, int buffer_length) 643 596 { 644 - /* ignore padding bytes at end of buffer */ 645 - while (buffer_length > 0 && buffer[buffer_length - 1] == 0xff) 646 - --buffer_length; 597 + int i; 598 + 599 + /* FF indicates end of valid data */ 600 + for (i = 0; i < buffer_length; ++i) 601 + if (buffer[i] == 0xff) { 602 + buffer_length = i; 603 + break; 604 + } 647 605 648 606 /* handle F5 at end of last buffer */ 649 607 if (ep->seen_f5) 650 608 goto switch_port; 651 609 652 610 while (buffer_length > 0) { 653 - int i; 654 - 655 611 /* determine size of data until next F5 */ 656 612 for (i = 0; i < buffer_length; ++i) 657 613 if (buffer[i] == 0xf5) ··· 720 670 if (buf_free < 1) 721 671 break; 722 672 } 673 + } 674 + if (buf_free < ep->max_transfer && buf_free > 0) { 675 + *buf = 0xff; 676 + --buf_free; 723 677 } 724 678 ep->urb->transfer_buffer_length = ep->max_transfer - buf_free; 725 679 } ··· 819 765 static void snd_usbmidi_in_endpoint_delete(snd_usb_midi_in_endpoint_t* ep) 820 766 { 821 767 if (ep->urb) { 822 - kfree(ep->urb->transfer_buffer); 768 + usb_buffer_free(ep->umidi->chip->dev, 769 + ep->urb->transfer_buffer_length, 770 + ep->urb->transfer_buffer, 771 + ep->urb->transfer_dma); 823 772 usb_free_urb(ep->urb); 824 773 } 825 774 kfree(ep); ··· 856 799 else 857 800 pipe = usb_rcvbulkpipe(umidi->chip->dev, ep_info->in_ep); 858 801 length = usb_maxpacket(umidi->chip->dev, pipe, 0); 859 - buffer = kmalloc(length, GFP_KERNEL); 802 + buffer = usb_buffer_alloc(umidi->chip->dev, length, GFP_KERNEL, 803 + &ep->urb->transfer_dma); 860 804 if (!buffer) { 861 805 snd_usbmidi_in_endpoint_delete(ep); 862 806 return -ENOMEM; ··· 870 812 usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, length, 871 813 snd_usb_complete_callback(snd_usbmidi_in_urb_complete), 872 814 ep); 815 + ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; 873 816 874 817 rep->in = ep; 875 818 return 0; ··· 891 832 */ 892 833 static void snd_usbmidi_out_endpoint_delete(snd_usb_midi_out_endpoint_t* ep) 893 834 { 894 - if (ep->tasklet.func) 895 - tasklet_kill(&ep->tasklet); 896 835 if (ep->urb) { 897 - kfree(ep->urb->transfer_buffer); 836 + usb_buffer_free(ep->umidi->chip->dev, ep->max_transfer, 837 + ep->urb->transfer_buffer, 838 + ep->urb->transfer_dma); 898 839 usb_free_urb(ep->urb); 899 840 } 900 841 kfree(ep); ··· 926 867 /* we never use interrupt output pipes */ 927 868 pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->out_ep); 928 869 ep->max_transfer = usb_maxpacket(umidi->chip->dev, pipe, 1); 929 - buffer = kmalloc(ep->max_transfer, GFP_KERNEL); 870 + buffer = usb_buffer_alloc(umidi->chip->dev, ep->max_transfer, 871 + GFP_KERNEL, &ep->urb->transfer_dma); 930 872 if (!buffer) { 931 873 snd_usbmidi_out_endpoint_delete(ep); 932 874 return -ENOMEM; ··· 935 875 usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, 936 876 ep->max_transfer, 937 877 snd_usb_complete_callback(snd_usbmidi_out_urb_complete), ep); 878 + ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; 938 879 939 880 spin_lock_init(&ep->buffer_lock); 940 881 tasklet_init(&ep->tasklet, snd_usbmidi_out_tasklet, (unsigned long)ep); ··· 979 918 int i; 980 919 981 920 umidi = list_entry(p, snd_usb_midi_t, list); 921 + del_timer_sync(&umidi->error_timer); 982 922 for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { 983 923 snd_usb_midi_endpoint_t* ep = &umidi->endpoints[i]; 924 + if (ep->out) 925 + tasklet_kill(&ep->out->tasklet); 984 926 if (ep->out && ep->out->urb) { 985 927 usb_kill_urb(ep->out->urb); 986 928 if (umidi->usb_protocol_ops->finish_out_endpoint) ··· 1544 1480 umidi->iface = iface; 1545 1481 umidi->quirk = quirk; 1546 1482 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; 1483 + init_timer(&umidi->error_timer); 1484 + umidi->error_timer.function = snd_usbmidi_error_timer; 1485 + umidi->error_timer.data = (unsigned long)umidi; 1547 1486 1548 1487 /* detect the endpoint(s) to use */ 1549 1488 memset(endpoints, 0, sizeof(endpoints));
+1 -1
sound/usb/usx2y/usx2yhwdeppcm.c
··· 624 624 for (s = 0; s < 2; ++s) { 625 625 snd_pcm_substream_t *substream; 626 626 substream = pcm->streams[s].substream; 627 - if (substream && substream->open_flag) 627 + if (substream && substream->ffile != NULL) 628 628 err = -EBUSY; 629 629 } 630 630 }