Merge branch 'topic/misc' into for-linus

+2753 -1126
+9 -11
Documentation/sound/alsa/ALSA-Configuration.txt
··· 974 974 975 975 See hdspm.txt for details. 976 976 977 - Module snd-hifier 978 - ----------------- 979 - 980 - Module for the MediaTek/TempoTec HiFier Fantasia sound card. 981 - 982 - This module supports autoprobe and multiple cards. 983 - 984 977 Module snd-ice1712 985 978 ------------------ 986 979 ··· 1524 1531 Module snd-oxygen 1525 1532 ----------------- 1526 1533 1527 - Module for sound cards based on the C-Media CMI8788 chip: 1534 + Module for sound cards based on the C-Media CMI8786/8787/8788 chip: 1528 1535 * Asound A-8788 1536 + * Asus Xonar DG 1529 1537 * AuzenTech X-Meridian 1538 + * AuzenTech X-Meridian 2G 1530 1539 * Bgears b-Enspirer 1531 1540 * Club3D Theatron DTS 1532 1541 * HT-Omega Claro (plus) 1533 1542 * HT-Omega Claro halo (XT) 1543 + * Kuroutoshikou CMI8787-HG2PCI 1534 1544 * Razer Barracuda AC-1 1535 1545 * Sondigo Inferno 1546 + * TempoTec HiFier Fantasia 1547 + * TempoTec HiFier Serenade 1536 1548 1537 1549 This module supports autoprobe and multiple cards. 1538 1550 ··· 2004 2006 Module snd-virtuoso 2005 2007 ------------------- 2006 2008 2007 - Module for sound cards based on the Asus AV100/AV200 chips, 2008 - i.e., Xonar D1, DX, D2, D2X, DS, HDAV1.3 (Deluxe), Essence ST 2009 - (Deluxe) and Essence STX. 2009 + Module for sound cards based on the Asus AV66/AV100/AV200 chips, 2010 + i.e., Xonar D1, DX, D2, D2X, DS, Essence ST (Deluxe), Essence STX, 2011 + HDAV1.3 (Deluxe), and HDAV1.3 Slim. 2010 2012 2011 2013 This module supports autoprobe and multiple cards. 2012 2014
+43
MAINTAINERS
··· 1434 1434 F: block/bsg.c 1435 1435 F: include/linux/bsg.h 1436 1436 1437 + BT87X AUDIO DRIVER 1438 + M: Clemens Ladisch <clemens@ladisch.de> 1439 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 1440 + T: git git://git.alsa-project.org/alsa-kernel.git 1441 + S: Maintained 1442 + F: Documentation/sound/alsa/Bt87x.txt 1443 + F: sound/pci/bt87x.c 1444 + 1437 1445 BT8XXGPIO DRIVER 1438 1446 M: Michael Buesch <mb@bu3sch.de> 1439 1447 W: http://bu3sch.de/btgpio.php ··· 1466 1458 S: Maintained 1467 1459 F: Documentation/video4linux/bttv/ 1468 1460 F: drivers/media/video/bt8xx/bttv* 1461 + 1462 + C-MEDIA CMI8788 DRIVER 1463 + M: Clemens Ladisch <clemens@ladisch.de> 1464 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 1465 + T: git git://git.alsa-project.org/alsa-kernel.git 1466 + S: Maintained 1467 + F: sound/pci/oxygen/ 1469 1468 1470 1469 CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS 1471 1470 M: David Howells <dhowells@redhat.com> ··· 2263 2248 W: bluesmoke.sourceforge.net 2264 2249 S: Maintained 2265 2250 F: drivers/edac/r82600_edac.c 2251 + 2252 + EDIROL UA-101/UA-1000 DRIVER 2253 + M: Clemens Ladisch <clemens@ladisch.de> 2254 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 2255 + T: git git://git.alsa-project.org/alsa-kernel.git 2256 + S: Maintained 2257 + F: sound/usb/misc/ua101.c 2266 2258 2267 2259 EEEPC LAPTOP EXTRAS DRIVER 2268 2260 M: Corentin Chary <corentincj@iksaif.net> ··· 3415 3393 S: Maintained 3416 3394 F: drivers/serial/jsm/ 3417 3395 3396 + K10TEMP HARDWARE MONITORING DRIVER 3397 + M: Clemens Ladisch <clemens@ladisch.de> 3398 + L: lm-sensors@lm-sensors.org 3399 + S: Maintained 3400 + F: Documentation/hwmon/k10temp 3401 + F: drivers/hwmon/k10temp.c 3402 + 3418 3403 K8TEMP HARDWARE MONITORING DRIVER 3419 3404 M: Rudolf Marek <r.marek@assembler.cz> 3420 3405 L: lm-sensors@lm-sensors.org ··· 4437 4408 F: drivers/of 4438 4409 F: include/linux/of*.h 4439 4410 K: of_get_property 4411 + 4412 + OPL4 DRIVER 4413 + M: Clemens Ladisch <clemens@ladisch.de> 4414 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 4415 + T: git git://git.alsa-project.org/alsa-kernel.git 4416 + S: Maintained 4417 + F: sound/drivers/opl4/ 4440 4418 4441 4419 OPROFILE 4442 4420 M: Robert Richter <robert.richter@amd.com> ··· 6176 6140 S: Maintained 6177 6141 W: http://www.one-eyed-alien.net/~mdharm/linux-usb/ 6178 6142 F: drivers/usb/storage/ 6143 + 6144 + USB MIDI DRIVER 6145 + M: Clemens Ladisch <clemens@ladisch.de> 6146 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 6147 + T: git git://git.alsa-project.org/alsa-kernel.git 6148 + S: Maintained 6149 + F: sound/usb/midi.* 6179 6150 6180 6151 USB OHCI DRIVER 6181 6152 M: David Brownell <dbrownell@users.sourceforge.net>
+3
include/sound/asound.h
··· 259 259 #define SNDRV_PCM_INFO_HALF_DUPLEX 0x00100000 /* only half duplex */ 260 260 #define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */ 261 261 #define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */ 262 + #define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000 /* period wakeup can be disabled */ 262 263 #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */ 263 264 264 265 typedef int __bitwise snd_pcm_state_t; ··· 335 334 #define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME 336 335 337 336 #define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */ 337 + #define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */ 338 + #define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */ 338 339 339 340 struct snd_interval { 340 341 unsigned int min, max;
+3 -1
include/sound/control.h
··· 160 160 } 161 161 162 162 /* 163 - * Frequently used control callbacks 163 + * Frequently used control callbacks/helpers 164 164 */ 165 165 int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol, 166 166 struct snd_ctl_elem_info *uinfo); 167 167 int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol, 168 168 struct snd_ctl_elem_info *uinfo); 169 + int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels, 170 + unsigned int items, const char *const names[]); 169 171 170 172 /* 171 173 * virtual master control
+1
include/sound/hdsp.h
··· 28 28 Multiface, 29 29 H9652, 30 30 H9632, 31 + RPM, 31 32 Undefined, 32 33 }; 33 34
+2 -2
include/sound/minors.h
··· 31 31 /* these minors can still be used for autoloading devices (/dev/aload*) */ 32 32 #define SNDRV_MINOR_CONTROL 0 /* 0 */ 33 33 #define SNDRV_MINOR_GLOBAL 1 /* 1 */ 34 - #define SNDRV_MINOR_SEQUENCER (SNDRV_MINOR_GLOBAL + 0 * 32) 35 - #define SNDRV_MINOR_TIMER (SNDRV_MINOR_GLOBAL + 1 * 32) 34 + #define SNDRV_MINOR_SEQUENCER 1 /* SNDRV_MINOR_GLOBAL + 0 * 32 */ 35 + #define SNDRV_MINOR_TIMER 33 /* SNDRV_MINOR_GLOBAL + 1 * 32 */ 36 36 37 37 #ifndef CONFIG_SND_DYNAMIC_MINORS 38 38 /* 2 - 3 (reserved) */
+1
include/sound/pcm.h
··· 297 297 unsigned int info; 298 298 unsigned int rate_num; 299 299 unsigned int rate_den; 300 + unsigned int no_period_wakeup: 1; 300 301 301 302 /* -- SW params -- */ 302 303 int tstamp_mode; /* mmap timestamp is updated */
+2 -2
sound/ac97_bus.c
··· 19 19 20 20 /* 21 21 * Let drivers decide whether they want to support given codec from their 22 - * probe method. Drivers have direct access to the struct snd_ac97 structure and may 23 - * decide based on the id field amongst other things. 22 + * probe method. Drivers have direct access to the struct snd_ac97 23 + * structure and may decide based on the id field amongst other things. 24 24 */ 25 25 static int ac97_bus_match(struct device *dev, struct device_driver *drv) 26 26 {
-1
sound/aoa/codecs/onyx.c
··· 1114 1114 of_node_put(onyx->codec.node); 1115 1115 if (onyx->codec_info) 1116 1116 kfree(onyx->codec_info); 1117 - i2c_set_clientdata(client, onyx); 1118 1117 kfree(onyx); 1119 1118 return 0; 1120 1119 }
+3 -4
sound/aoa/core/gpio-feature.c
··· 287 287 free_irq(linein_detect_irq, &rt->line_in_notify); 288 288 if (rt->line_out_notify.gpio_private) 289 289 free_irq(lineout_detect_irq, &rt->line_out_notify); 290 - cancel_delayed_work(&rt->headphone_notify.work); 291 - cancel_delayed_work(&rt->line_in_notify.work); 292 - cancel_delayed_work(&rt->line_out_notify.work); 293 - flush_scheduled_work(); 290 + cancel_delayed_work_sync(&rt->headphone_notify.work); 291 + cancel_delayed_work_sync(&rt->line_in_notify.work); 292 + cancel_delayed_work_sync(&rt->line_out_notify.work); 294 293 mutex_destroy(&rt->headphone_notify.mutex); 295 294 mutex_destroy(&rt->line_in_notify.mutex); 296 295 mutex_destroy(&rt->line_out_notify.mutex);
+3 -4
sound/aoa/core/gpio-pmf.c
··· 107 107 108 108 /* make sure no work is pending before freeing 109 109 * all things */ 110 - cancel_delayed_work(&rt->headphone_notify.work); 111 - cancel_delayed_work(&rt->line_in_notify.work); 112 - cancel_delayed_work(&rt->line_out_notify.work); 113 - flush_scheduled_work(); 110 + cancel_delayed_work_sync(&rt->headphone_notify.work); 111 + cancel_delayed_work_sync(&rt->line_in_notify.work); 112 + cancel_delayed_work_sync(&rt->line_out_notify.work); 114 113 115 114 mutex_destroy(&rt->headphone_notify.mutex); 116 115 mutex_destroy(&rt->line_in_notify.mutex);
+27 -1
sound/core/control.c
··· 1488 1488 } 1489 1489 1490 1490 /* 1491 - * Frequently used control callbacks 1491 + * Frequently used control callbacks/helpers 1492 1492 */ 1493 1493 int snd_ctl_boolean_mono_info(struct snd_kcontrol *kcontrol, 1494 1494 struct snd_ctl_elem_info *uinfo) ··· 1513 1513 } 1514 1514 1515 1515 EXPORT_SYMBOL(snd_ctl_boolean_stereo_info); 1516 + 1517 + /** 1518 + * snd_ctl_enum_info - fills the info structure for an enumerated control 1519 + * @info: the structure to be filled 1520 + * @channels: the number of the control's channels; often one 1521 + * @items: the number of control values; also the size of @names 1522 + * @names: an array containing the names of all control values 1523 + * 1524 + * Sets all required fields in @info to their appropriate values. 1525 + * If the control's accessibility is not the default (readable and writable), 1526 + * the caller has to fill @info->access. 1527 + */ 1528 + int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels, 1529 + unsigned int items, const char *const names[]) 1530 + { 1531 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1532 + info->count = channels; 1533 + info->value.enumerated.items = items; 1534 + if (info->value.enumerated.item >= items) 1535 + info->value.enumerated.item = items - 1; 1536 + strlcpy(info->value.enumerated.name, 1537 + names[info->value.enumerated.item], 1538 + sizeof(info->value.enumerated.name)); 1539 + return 0; 1540 + } 1541 + EXPORT_SYMBOL(snd_ctl_enum_info);
+3 -1
sound/core/oss/pcm_oss.c
··· 453 453 } else { 454 454 *params = *save; 455 455 max = snd_pcm_hw_param_max(pcm, params, var, max, &maxdir); 456 - if (max < 0) 456 + if (max < 0) { 457 + kfree(save); 457 458 return max; 459 + } 458 460 last = 1; 459 461 } 460 462 _end:
+22
sound/core/pcm_lib.c
··· 373 373 (unsigned long)new_hw_ptr, 374 374 (unsigned long)runtime->hw_ptr_base); 375 375 } 376 + 377 + if (runtime->no_period_wakeup) { 378 + /* 379 + * Without regular period interrupts, we have to check 380 + * the elapsed time to detect xruns. 381 + */ 382 + jdelta = jiffies - runtime->hw_ptr_jiffies; 383 + if (jdelta < runtime->hw_ptr_buffer_jiffies / 2) 384 + goto no_delta_check; 385 + hdelta = jdelta - delta * HZ / runtime->rate; 386 + while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) { 387 + delta += runtime->buffer_size; 388 + hw_base += runtime->buffer_size; 389 + if (hw_base >= runtime->boundary) 390 + hw_base = 0; 391 + new_hw_ptr = hw_base + pos; 392 + hdelta -= runtime->hw_ptr_buffer_jiffies; 393 + } 394 + goto no_delta_check; 395 + } 396 + 376 397 /* something must be really wrong */ 377 398 if (delta >= runtime->buffer_size + runtime->period_size) { 378 399 hw_ptr_error(substream, ··· 463 442 (long)old_hw_ptr); 464 443 } 465 444 445 + no_delta_check: 466 446 if (runtime->status->hw_ptr == new_hw_ptr) 467 447 return 0; 468 448
+3
sound/core/pcm_native.c
··· 422 422 runtime->info = params->info; 423 423 runtime->rate_num = params->rate_num; 424 424 runtime->rate_den = params->rate_den; 425 + runtime->no_period_wakeup = 426 + (params->info & SNDRV_PCM_INFO_NO_PERIOD_WAKEUP) && 427 + (params->flags & SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP); 425 428 426 429 bits = snd_pcm_format_physical_width(runtime->format); 427 430 runtime->sample_bits = bits;
+4
sound/core/seq/seq.c
··· 32 32 #include "seq_timer.h" 33 33 #include "seq_system.h" 34 34 #include "seq_info.h" 35 + #include <sound/minors.h> 35 36 #include <sound/seq_device.h> 36 37 37 38 #if defined(CONFIG_SND_SEQ_DUMMY_MODULE) ··· 73 72 MODULE_PARM_DESC(seq_default_timer_subdevice, "The default timer subdevice number."); 74 73 module_param(seq_default_timer_resolution, int, 0644); 75 74 MODULE_PARM_DESC(seq_default_timer_resolution, "The default timer resolution in Hz."); 75 + 76 + MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_SEQUENCER); 77 + MODULE_ALIAS("devname:snd/seq"); 76 78 77 79 /* 78 80 * INIT PART
+13 -5
sound/core/sound.c
··· 188 188 }; 189 189 190 190 #ifdef CONFIG_SND_DYNAMIC_MINORS 191 - static int snd_find_free_minor(void) 191 + static int snd_find_free_minor(int type) 192 192 { 193 193 int minor; 194 194 195 + /* static minors for module auto loading */ 196 + if (type == SNDRV_DEVICE_TYPE_SEQUENCER) 197 + return SNDRV_MINOR_SEQUENCER; 198 + if (type == SNDRV_DEVICE_TYPE_TIMER) 199 + return SNDRV_MINOR_TIMER; 200 + 195 201 for (minor = 0; minor < ARRAY_SIZE(snd_minors); ++minor) { 196 - /* skip minors still used statically for autoloading devices */ 197 - if (SNDRV_MINOR_DEVICE(minor) == SNDRV_MINOR_CONTROL || 198 - minor == SNDRV_MINOR_SEQUENCER) 202 + /* skip static minors still used for module auto loading */ 203 + if (SNDRV_MINOR_DEVICE(minor) == SNDRV_MINOR_CONTROL) 204 + continue; 205 + if (minor == SNDRV_MINOR_SEQUENCER || 206 + minor == SNDRV_MINOR_TIMER) 199 207 continue; 200 208 if (!snd_minors[minor]) 201 209 return minor; ··· 277 269 preg->private_data = private_data; 278 270 mutex_lock(&sound_mutex); 279 271 #ifdef CONFIG_SND_DYNAMIC_MINORS 280 - minor = snd_find_free_minor(); 272 + minor = snd_find_free_minor(type); 281 273 #else 282 274 minor = snd_kernel_minor(type, card, dev); 283 275 if (minor >= 0 && snd_minors[minor])
+5 -2
sound/core/timer.c
··· 34 34 #include <sound/initval.h> 35 35 #include <linux/kmod.h> 36 36 37 - #if defined(CONFIG_SND_HPET) || defined(CONFIG_SND_HPET_MODULE) 38 - #define DEFAULT_TIMER_LIMIT 3 37 + #if defined(CONFIG_SND_HRTIMER) || defined(CONFIG_SND_HRTIMER_MODULE) 38 + #define DEFAULT_TIMER_LIMIT 4 39 39 #elif defined(CONFIG_SND_RTCTIMER) || defined(CONFIG_SND_RTCTIMER_MODULE) 40 40 #define DEFAULT_TIMER_LIMIT 2 41 41 #else ··· 51 51 MODULE_PARM_DESC(timer_limit, "Maximum global timers in system."); 52 52 module_param(timer_tstamp_monotonic, int, 0444); 53 53 MODULE_PARM_DESC(timer_tstamp_monotonic, "Use posix monotonic clock source for timestamps (default)."); 54 + 55 + MODULE_ALIAS_CHARDEV(CONFIG_SND_MAJOR, SNDRV_MINOR_TIMER); 56 + MODULE_ALIAS("devname:snd/timer"); 54 57 55 58 struct snd_timer_user { 56 59 struct snd_timer_instance *timeri;
+2 -2
sound/drivers/ml403-ac97cr.c
··· 1143 1143 (resource->start) + 1); 1144 1144 if (ml403_ac97cr->port == NULL) { 1145 1145 snd_printk(KERN_ERR SND_ML403_AC97CR_DRIVER ": " 1146 - "unable to remap memory region (%x to %x)\n", 1147 - resource->start, resource->end); 1146 + "unable to remap memory region (%pR)\n", 1147 + resource); 1148 1148 snd_ml403_ac97cr_free(ml403_ac97cr); 1149 1149 return -EBUSY; 1150 1150 }
+2 -3
sound/i2c/other/ak4113.c
··· 57 57 { 58 58 chip->init = 1; /* don't schedule new work */ 59 59 mb(); 60 - cancel_delayed_work(&chip->work); 61 - flush_scheduled_work(); 60 + cancel_delayed_work_sync(&chip->work); 62 61 kfree(chip); 63 62 } 64 63 ··· 140 141 { 141 142 chip->init = 1; 142 143 mb(); 143 - flush_scheduled_work(); 144 + flush_delayed_work_sync(&chip->work); 144 145 ak4113_init_regs(chip); 145 146 /* bring up statistics / event queing */ 146 147 chip->init = 0;
+2 -3
sound/i2c/other/ak4114.c
··· 67 67 { 68 68 chip->init = 1; /* don't schedule new work */ 69 69 mb(); 70 - cancel_delayed_work(&chip->work); 71 - flush_scheduled_work(); 70 + cancel_delayed_work_sync(&chip->work); 72 71 kfree(chip); 73 72 } 74 73 ··· 153 154 { 154 155 chip->init = 1; 155 156 mb(); 156 - flush_scheduled_work(); 157 + flush_delayed_work_sync(&chip->work); 157 158 ak4114_init_regs(chip); 158 159 /* bring up statistics / event queing */ 159 160 chip->init = 0;
+8 -15
sound/pci/Kconfig
··· 209 209 tristate 210 210 211 211 config SND_OXYGEN 212 - tristate "C-Media 8788 (Oxygen)" 212 + tristate "C-Media 8786, 8787, 8788 (Oxygen)" 213 213 select SND_OXYGEN_LIB 214 214 select SND_PCM 215 215 select SND_MPU401_UART ··· 217 217 Say Y here to include support for sound cards based on the 218 218 C-Media CMI8788 (Oxygen HD Audio) chip: 219 219 * Asound A-8788 220 + * Asus Xonar DG 220 221 * AuzenTech X-Meridian 222 + * AuzenTech X-Meridian 2G 221 223 * Bgears b-Enspirer 222 224 * Club3D Theatron DTS 223 225 * HT-Omega Claro (plus) 224 226 * HT-Omega Claro halo (XT) 227 + * Kuroutoshikou CMI8787-HG2PCI 225 228 * Razer Barracuda AC-1 226 229 * Sondigo Inferno 230 + * TempoTec/MediaTek HiFier Fantasia 231 + * TempoTec/MediaTek HiFier Serenade 227 232 228 233 To compile this driver as a module, choose M here: the module 229 234 will be called snd-oxygen. ··· 583 578 To compile this driver as a module, choose M here: the module 584 579 will be called snd-hdspm. 585 580 586 - config SND_HIFIER 587 - tristate "TempoTec HiFier Fantasia" 588 - select SND_OXYGEN_LIB 589 - select SND_PCM 590 - select SND_MPU401_UART 591 - help 592 - Say Y here to include support for the MediaTek/TempoTec HiFier 593 - Fantasia sound card. 594 - 595 - To compile this driver as a module, choose M here: the module 596 - will be called snd-hifier. 597 - 598 581 config SND_ICE1712 599 582 tristate "ICEnsemble ICE1712 (Envy24)" 600 583 select SND_MPU401_UART ··· 819 826 Say Y here to include support for sound cards based on the 820 827 Asus AV66/AV100/AV200 chips, i.e., Xonar D1, DX, D2, D2X, DS, 821 828 Essence ST (Deluxe), and Essence STX. 822 - Support for the HDAV1.3 (Deluxe) is incomplete; for the 823 - HDAV1.3 Slim and Xense, missing. 829 + Support for the HDAV1.3 (Deluxe) and HDAV1.3 Slim is experimental; 830 + for the Xense, missing. 824 831 825 832 To compile this driver as a module, choose M here: the module 826 833 will be called snd-virtuoso.
+2 -4
sound/pci/ac97/ac97_codec.c
··· 1014 1014 { 1015 1015 if (ac97) { 1016 1016 #ifdef CONFIG_SND_AC97_POWER_SAVE 1017 - cancel_delayed_work(&ac97->power_work); 1018 - flush_scheduled_work(); 1017 + cancel_delayed_work_sync(&ac97->power_work); 1019 1018 #endif 1020 1019 snd_ac97_proc_done(ac97); 1021 1020 if (ac97->bus) ··· 2455 2456 if (ac97->build_ops->suspend) 2456 2457 ac97->build_ops->suspend(ac97); 2457 2458 #ifdef CONFIG_SND_AC97_POWER_SAVE 2458 - cancel_delayed_work(&ac97->power_work); 2459 - flush_scheduled_work(); 2459 + cancel_delayed_work_sync(&ac97->power_work); 2460 2460 #endif 2461 2461 snd_ac97_powerdown(ac97); 2462 2462 }
+205 -201
sound/pci/azt3328.c
··· 1 1 /* 2 2 * azt3328.c - driver for Aztech AZF3328 based soundcards (e.g. PCI168). 3 - * Copyright (C) 2002, 2005 - 2009 by Andreas Mohr <andi AT lisas.de> 3 + * Copyright (C) 2002, 2005 - 2010 by Andreas Mohr <andi AT lisas.de> 4 4 * 5 5 * Framework borrowed from Bart Hartgers's als4000.c. 6 6 * Driver developed on PCI168 AP(W) version (PCI rev. 10, subsystem ID 1801), ··· 175 175 176 176 #include <asm/io.h> 177 177 #include <linux/init.h> 178 + #include <linux/bug.h> /* WARN_ONCE */ 178 179 #include <linux/pci.h> 179 180 #include <linux/delay.h> 180 181 #include <linux/slab.h> ··· 202 201 203 202 /* === Debug settings === 204 203 Further diagnostic functionality than the settings below 205 - does not need to be provided, since one can easily write a bash script 204 + does not need to be provided, since one can easily write a POSIX shell script 206 205 to dump the card's I/O ports (those listed in lspci -v -v): 207 - function dump() 206 + dump() 208 207 { 209 208 local descr=$1; local addr=$2; local count=$3 210 209 211 210 echo "${descr}: ${count} @ ${addr}:" 212 - dd if=/dev/port skip=$[${addr}] count=${count} bs=1 2>/dev/null| hexdump -C 211 + dd if=/dev/port skip=`printf %d ${addr}` count=${count} bs=1 \ 212 + 2>/dev/null| hexdump -C 213 213 } 214 214 and then use something like 215 215 "dump joy200 0x200 8", "dump mpu388 0x388 4", "dump joy 0xb400 8", ··· 218 216 possibly within a "while true; do ... sleep 1; done" loop. 219 217 Tweaking ports could be done using 220 218 VALSTRING="`printf "%02x" $value`" 221 - printf "\x""$VALSTRING"|dd of=/dev/port seek=$[${addr}] bs=1 2>/dev/null 219 + printf "\x""$VALSTRING"|dd of=/dev/port seek=`printf %d ${addr}` bs=1 \ 220 + 2>/dev/null 222 221 */ 223 222 224 223 #define DEBUG_MISC 0 225 224 #define DEBUG_CALLS 0 226 225 #define DEBUG_MIXER 0 227 226 #define DEBUG_CODEC 0 228 - #define DEBUG_IO 0 229 227 #define DEBUG_TIMER 0 230 228 #define DEBUG_GAME 0 231 229 #define DEBUG_PM 0 ··· 293 291 module_param(seqtimer_scaling, int, 0444); 294 292 MODULE_PARM_DESC(seqtimer_scaling, "Set 1024000Hz sequencer timer scale factor (lockup danger!). Default 128."); 295 293 296 - struct snd_azf3328_codec_data { 297 - unsigned long io_base; 298 - struct snd_pcm_substream *substream; 299 - bool running; 300 - const char *name; 301 - }; 302 - 303 294 enum snd_azf3328_codec_type { 295 + /* warning: fixed indices (also used for bitmask checks!) */ 304 296 AZF_CODEC_PLAYBACK = 0, 305 297 AZF_CODEC_CAPTURE = 1, 306 298 AZF_CODEC_I2S_OUT = 2, 299 + }; 300 + 301 + struct snd_azf3328_codec_data { 302 + unsigned long io_base; /* keep first! (avoid offset calc) */ 303 + unsigned int dma_base; /* helper to avoid an indirection in hotpath */ 304 + spinlock_t *lock; /* TODO: convert to our own per-codec lock member */ 305 + struct snd_pcm_substream *substream; 306 + bool running; 307 + enum snd_azf3328_codec_type type; 308 + const char *name; 307 309 }; 308 310 309 311 struct snd_azf3328 { ··· 368 362 static int 369 363 snd_azf3328_io_reg_setb(unsigned reg, u8 mask, bool do_set) 370 364 { 365 + /* Well, strictly spoken, the inb/outb sequence isn't atomic 366 + and would need locking. However we currently don't care 367 + since it potentially complicates matters. */ 371 368 u8 prev = inb(reg), new; 372 369 373 370 new = (do_set) ? (prev|mask) : (prev & ~mask); ··· 420 411 ) 421 412 { 422 413 outl(value, codec->io_base + reg); 414 + } 415 + 416 + static inline void 417 + snd_azf3328_codec_outl_multi(const struct snd_azf3328_codec_data *codec, 418 + unsigned reg, const void *buffer, int count 419 + ) 420 + { 421 + unsigned long addr = codec->io_base + reg; 422 + if (count) { 423 + const u32 *buf = buffer; 424 + do { 425 + outl(*buf++, addr); 426 + addr += 4; 427 + } while (--count); 428 + } 423 429 } 424 430 425 431 static inline u32 ··· 967 943 } 968 944 969 945 static void 970 - snd_azf3328_codec_setfmt(struct snd_azf3328 *chip, 971 - enum snd_azf3328_codec_type codec_type, 946 + snd_azf3328_codec_setfmt(struct snd_azf3328_codec_data *codec, 972 947 enum azf_freq_t bitrate, 973 948 unsigned int format_width, 974 949 unsigned int channels 975 950 ) 976 951 { 977 952 unsigned long flags; 978 - const struct snd_azf3328_codec_data *codec = &chip->codecs[codec_type]; 979 953 u16 val = 0xff00; 954 + u8 freq = 0; 980 955 981 956 snd_azf3328_dbgcallenter(); 982 957 switch (bitrate) { 983 - case AZF_FREQ_4000: val |= SOUNDFORMAT_FREQ_SUSPECTED_4000; break; 984 - case AZF_FREQ_4800: val |= SOUNDFORMAT_FREQ_SUSPECTED_4800; break; 985 - case AZF_FREQ_5512: 986 - /* the AZF3328 names it "5510" for some strange reason */ 987 - val |= SOUNDFORMAT_FREQ_5510; break; 988 - case AZF_FREQ_6620: val |= SOUNDFORMAT_FREQ_6620; break; 989 - case AZF_FREQ_8000: val |= SOUNDFORMAT_FREQ_8000; break; 990 - case AZF_FREQ_9600: val |= SOUNDFORMAT_FREQ_9600; break; 991 - case AZF_FREQ_11025: val |= SOUNDFORMAT_FREQ_11025; break; 992 - case AZF_FREQ_13240: val |= SOUNDFORMAT_FREQ_SUSPECTED_13240; break; 993 - case AZF_FREQ_16000: val |= SOUNDFORMAT_FREQ_16000; break; 994 - case AZF_FREQ_22050: val |= SOUNDFORMAT_FREQ_22050; break; 995 - case AZF_FREQ_32000: val |= SOUNDFORMAT_FREQ_32000; break; 958 + #define AZF_FMT_XLATE(in_freq, out_bits) \ 959 + do { \ 960 + case AZF_FREQ_ ## in_freq: \ 961 + freq = SOUNDFORMAT_FREQ_ ## out_bits; \ 962 + break; \ 963 + } while (0); 964 + AZF_FMT_XLATE(4000, SUSPECTED_4000) 965 + AZF_FMT_XLATE(4800, SUSPECTED_4800) 966 + /* the AZF3328 names it "5510" for some strange reason: */ 967 + AZF_FMT_XLATE(5512, 5510) 968 + AZF_FMT_XLATE(6620, 6620) 969 + AZF_FMT_XLATE(8000, 8000) 970 + AZF_FMT_XLATE(9600, 9600) 971 + AZF_FMT_XLATE(11025, 11025) 972 + AZF_FMT_XLATE(13240, SUSPECTED_13240) 973 + AZF_FMT_XLATE(16000, 16000) 974 + AZF_FMT_XLATE(22050, 22050) 975 + AZF_FMT_XLATE(32000, 32000) 996 976 default: 997 977 snd_printk(KERN_WARNING "unknown bitrate %d, assuming 44.1kHz!\n", bitrate); 998 978 /* fall-through */ 999 - case AZF_FREQ_44100: val |= SOUNDFORMAT_FREQ_44100; break; 1000 - case AZF_FREQ_48000: val |= SOUNDFORMAT_FREQ_48000; break; 1001 - case AZF_FREQ_66200: val |= SOUNDFORMAT_FREQ_SUSPECTED_66200; break; 979 + AZF_FMT_XLATE(44100, 44100) 980 + AZF_FMT_XLATE(48000, 48000) 981 + AZF_FMT_XLATE(66200, SUSPECTED_66200) 982 + #undef AZF_FMT_XLATE 1002 983 } 1003 984 /* val = 0xff07; 3m27.993s (65301Hz; -> 64000Hz???) hmm, 66120, 65967, 66123 */ 1004 985 /* val = 0xff09; 17m15.098s (13123,478Hz; -> 12000Hz???) hmm, 13237.2Hz? */ ··· 1015 986 /* val = 0xff0d; 41m23.135s (5523,600Hz; -> 5512Hz???) */ 1016 987 /* val = 0xff0e; 28m30.777s (8017Hz; -> 8000Hz???) */ 1017 988 989 + val |= freq; 990 + 1018 991 if (channels == 2) 1019 992 val |= SOUNDFORMAT_FLAG_2CHANNELS; 1020 993 1021 994 if (format_width == 16) 1022 995 val |= SOUNDFORMAT_FLAG_16BIT; 1023 996 1024 - spin_lock_irqsave(&chip->reg_lock, flags); 997 + spin_lock_irqsave(codec->lock, flags); 1025 998 1026 999 /* set bitrate/format */ 1027 1000 snd_azf3328_codec_outw(codec, IDX_IO_CODEC_SOUNDFORMAT, val); ··· 1035 1004 * (FIXME: yes, it works, but what exactly am I doing here?? :) 1036 1005 * FIXME: does this have some side effects for full-duplex 1037 1006 * or other dramatic side effects? */ 1038 - if (codec_type == AZF_CODEC_PLAYBACK) /* only do it for playback */ 1007 + /* do it for non-capture codecs only */ 1008 + if (codec->type != AZF_CODEC_CAPTURE) 1039 1009 snd_azf3328_codec_outw(codec, IDX_IO_CODEC_DMA_FLAGS, 1040 1010 snd_azf3328_codec_inw(codec, IDX_IO_CODEC_DMA_FLAGS) | 1041 1011 DMA_RUN_SOMETHING1 | ··· 1046 1014 DMA_SOMETHING_ELSE 1047 1015 ); 1048 1016 1049 - spin_unlock_irqrestore(&chip->reg_lock, flags); 1017 + spin_unlock_irqrestore(codec->lock, flags); 1050 1018 snd_azf3328_dbgcallleave(); 1051 1019 } 1052 1020 1053 1021 static inline void 1054 - snd_azf3328_codec_setfmt_lowpower(struct snd_azf3328 *chip, 1055 - enum snd_azf3328_codec_type codec_type 1022 + snd_azf3328_codec_setfmt_lowpower(struct snd_azf3328_codec_data *codec 1056 1023 ) 1057 1024 { 1058 1025 /* choose lowest frequency for low power consumption. 1059 1026 * While this will cause louder noise due to rather coarse frequency, 1060 1027 * it should never matter since output should always 1061 1028 * get disabled properly when idle anyway. */ 1062 - snd_azf3328_codec_setfmt(chip, codec_type, AZF_FREQ_4000, 8, 1); 1029 + snd_azf3328_codec_setfmt(codec, AZF_FREQ_4000, 8, 1); 1063 1030 } 1064 1031 1065 1032 static void ··· 1132 1101 /* ...and adjust clock, too 1133 1102 * (reduce noise and power consumption) */ 1134 1103 if (!enable) 1135 - snd_azf3328_codec_setfmt_lowpower( 1136 - chip, 1137 - codec_type 1138 - ); 1104 + snd_azf3328_codec_setfmt_lowpower(codec); 1139 1105 codec->running = enable; 1140 1106 } 1141 1107 } 1142 1108 1143 1109 static void 1144 - snd_azf3328_codec_setdmaa(struct snd_azf3328 *chip, 1145 - enum snd_azf3328_codec_type codec_type, 1110 + snd_azf3328_codec_setdmaa(struct snd_azf3328_codec_data *codec, 1146 1111 unsigned long addr, 1147 - unsigned int count, 1148 - unsigned int size 1112 + unsigned int period_bytes, 1113 + unsigned int buffer_bytes 1149 1114 ) 1150 1115 { 1151 - const struct snd_azf3328_codec_data *codec = &chip->codecs[codec_type]; 1152 1116 snd_azf3328_dbgcallenter(); 1117 + WARN_ONCE(period_bytes & 1, "odd period length!?\n"); 1118 + WARN_ONCE(buffer_bytes != 2 * period_bytes, 1119 + "missed our input expectations! %u vs. %u\n", 1120 + buffer_bytes, period_bytes); 1153 1121 if (!codec->running) { 1154 1122 /* AZF3328 uses a two buffer pointer DMA transfer approach */ 1155 1123 1156 - unsigned long flags, addr_area2; 1124 + unsigned long flags; 1157 1125 1158 1126 /* width 32bit (prevent overflow): */ 1159 - u32 count_areas, lengths; 1127 + u32 area_length; 1128 + struct codec_setup_io { 1129 + u32 dma_start_1; 1130 + u32 dma_start_2; 1131 + u32 dma_lengths; 1132 + } __attribute__((packed)) setup_io; 1160 1133 1161 - count_areas = size/2; 1162 - addr_area2 = addr+count_areas; 1163 - snd_azf3328_dbgcodec("setdma: buffers %08lx[%u] / %08lx[%u]\n", 1164 - addr, count_areas, addr_area2, count_areas); 1134 + area_length = buffer_bytes/2; 1165 1135 1166 - count_areas--; /* max. index */ 1136 + setup_io.dma_start_1 = addr; 1137 + setup_io.dma_start_2 = addr+area_length; 1138 + 1139 + snd_azf3328_dbgcodec( 1140 + "setdma: buffers %08x[%u] / %08x[%u], %u, %u\n", 1141 + setup_io.dma_start_1, area_length, 1142 + setup_io.dma_start_2, area_length, 1143 + period_bytes, buffer_bytes); 1144 + 1145 + /* Hmm, are we really supposed to decrement this by 1?? 1146 + Most definitely certainly not: configuring full length does 1147 + work properly (i.e. likely better), and BTW we 1148 + violated possibly differing frame sizes with this... 1149 + 1150 + area_length--; |* max. index *| 1151 + */ 1167 1152 1168 1153 /* build combined I/O buffer length word */ 1169 - lengths = (count_areas << 16) | (count_areas); 1170 - spin_lock_irqsave(&chip->reg_lock, flags); 1171 - snd_azf3328_codec_outl(codec, IDX_IO_CODEC_DMA_START_1, addr); 1172 - snd_azf3328_codec_outl(codec, IDX_IO_CODEC_DMA_START_2, 1173 - addr_area2); 1174 - snd_azf3328_codec_outl(codec, IDX_IO_CODEC_DMA_LENGTHS, 1175 - lengths); 1176 - spin_unlock_irqrestore(&chip->reg_lock, flags); 1154 + setup_io.dma_lengths = (area_length << 16) | (area_length); 1155 + 1156 + spin_lock_irqsave(codec->lock, flags); 1157 + snd_azf3328_codec_outl_multi( 1158 + codec, IDX_IO_CODEC_DMA_START_1, &setup_io, 3 1159 + ); 1160 + spin_unlock_irqrestore(codec->lock, flags); 1177 1161 } 1178 1162 snd_azf3328_dbgcallleave(); 1179 1163 } 1180 1164 1181 1165 static int 1182 - snd_azf3328_codec_prepare(struct snd_pcm_substream *substream) 1166 + snd_azf3328_pcm_prepare(struct snd_pcm_substream *substream) 1183 1167 { 1184 - #if 0 1185 - struct snd_azf3328 *chip = snd_pcm_substream_chip(substream); 1186 1168 struct snd_pcm_runtime *runtime = substream->runtime; 1169 + struct snd_azf3328_codec_data *codec = runtime->private_data; 1170 + #if 0 1187 1171 unsigned int size = snd_pcm_lib_buffer_bytes(substream); 1188 1172 unsigned int count = snd_pcm_lib_period_bytes(substream); 1189 1173 #endif 1190 1174 1191 1175 snd_azf3328_dbgcallenter(); 1176 + 1177 + codec->dma_base = runtime->dma_addr; 1178 + 1192 1179 #if 0 1193 - snd_azf3328_codec_setfmt(chip, AZF_CODEC_..., 1180 + snd_azf3328_codec_setfmt(codec, 1194 1181 runtime->rate, 1195 1182 snd_pcm_format_width(runtime->format), 1196 1183 runtime->channels); 1197 - snd_azf3328_codec_setdmaa(chip, AZF_CODEC_..., 1184 + snd_azf3328_codec_setdmaa(codec, 1198 1185 runtime->dma_addr, count, size); 1199 1186 #endif 1200 1187 snd_azf3328_dbgcallleave(); ··· 1220 1171 } 1221 1172 1222 1173 static int 1223 - snd_azf3328_codec_trigger(enum snd_azf3328_codec_type codec_type, 1224 - struct snd_pcm_substream *substream, int cmd) 1174 + snd_azf3328_pcm_trigger(struct snd_pcm_substream *substream, int cmd) 1225 1175 { 1226 1176 struct snd_azf3328 *chip = snd_pcm_substream_chip(substream); 1227 - const struct snd_azf3328_codec_data *codec = &chip->codecs[codec_type]; 1228 1177 struct snd_pcm_runtime *runtime = substream->runtime; 1178 + struct snd_azf3328_codec_data *codec = runtime->private_data; 1229 1179 int result = 0; 1230 1180 u16 flags1; 1231 1181 bool previously_muted = 0; 1232 - bool is_playback_codec = (AZF_CODEC_PLAYBACK == codec_type); 1182 + bool is_main_mixer_playback_codec = (AZF_CODEC_PLAYBACK == codec->type); 1233 1183 1234 - snd_azf3328_dbgcalls("snd_azf3328_codec_trigger cmd %d\n", cmd); 1184 + snd_azf3328_dbgcalls("snd_azf3328_pcm_trigger cmd %d\n", cmd); 1235 1185 1236 1186 switch (cmd) { 1237 1187 case SNDRV_PCM_TRIGGER_START: 1238 1188 snd_azf3328_dbgcodec("START %s\n", codec->name); 1239 1189 1240 - if (is_playback_codec) { 1190 + if (is_main_mixer_playback_codec) { 1241 1191 /* mute WaveOut (avoid clicking during setup) */ 1242 1192 previously_muted = 1243 1193 snd_azf3328_mixer_set_mute( ··· 1244 1196 ); 1245 1197 } 1246 1198 1247 - snd_azf3328_codec_setfmt(chip, codec_type, 1199 + snd_azf3328_codec_setfmt(codec, 1248 1200 runtime->rate, 1249 1201 snd_pcm_format_width(runtime->format), 1250 1202 runtime->channels); 1251 1203 1252 - spin_lock(&chip->reg_lock); 1204 + spin_lock(codec->lock); 1253 1205 /* first, remember current value: */ 1254 1206 flags1 = snd_azf3328_codec_inw(codec, IDX_IO_CODEC_DMA_FLAGS); 1255 1207 ··· 1259 1211 1260 1212 /* FIXME: clear interrupts or what??? */ 1261 1213 snd_azf3328_codec_outw(codec, IDX_IO_CODEC_IRQTYPE, 0xffff); 1262 - spin_unlock(&chip->reg_lock); 1214 + spin_unlock(codec->lock); 1263 1215 1264 - snd_azf3328_codec_setdmaa(chip, codec_type, runtime->dma_addr, 1216 + snd_azf3328_codec_setdmaa(codec, runtime->dma_addr, 1265 1217 snd_pcm_lib_period_bytes(substream), 1266 1218 snd_pcm_lib_buffer_bytes(substream) 1267 1219 ); 1268 1220 1269 - spin_lock(&chip->reg_lock); 1221 + spin_lock(codec->lock); 1270 1222 #ifdef WIN9X 1271 1223 /* FIXME: enable playback/recording??? */ 1272 1224 flags1 |= DMA_RUN_SOMETHING1 | DMA_RUN_SOMETHING2; ··· 1290 1242 DMA_EPILOGUE_SOMETHING | 1291 1243 DMA_SOMETHING_ELSE); 1292 1244 #endif 1293 - spin_unlock(&chip->reg_lock); 1294 - snd_azf3328_ctrl_codec_activity(chip, codec_type, 1); 1245 + spin_unlock(codec->lock); 1246 + snd_azf3328_ctrl_codec_activity(chip, codec->type, 1); 1295 1247 1296 - if (is_playback_codec) { 1248 + if (is_main_mixer_playback_codec) { 1297 1249 /* now unmute WaveOut */ 1298 1250 if (!previously_muted) 1299 1251 snd_azf3328_mixer_set_mute( ··· 1306 1258 case SNDRV_PCM_TRIGGER_RESUME: 1307 1259 snd_azf3328_dbgcodec("RESUME %s\n", codec->name); 1308 1260 /* resume codec if we were active */ 1309 - spin_lock(&chip->reg_lock); 1261 + spin_lock(codec->lock); 1310 1262 if (codec->running) 1311 1263 snd_azf3328_codec_outw(codec, IDX_IO_CODEC_DMA_FLAGS, 1312 1264 snd_azf3328_codec_inw( 1313 1265 codec, IDX_IO_CODEC_DMA_FLAGS 1314 1266 ) | DMA_RESUME 1315 1267 ); 1316 - spin_unlock(&chip->reg_lock); 1268 + spin_unlock(codec->lock); 1317 1269 break; 1318 1270 case SNDRV_PCM_TRIGGER_STOP: 1319 1271 snd_azf3328_dbgcodec("STOP %s\n", codec->name); 1320 1272 1321 - if (is_playback_codec) { 1273 + if (is_main_mixer_playback_codec) { 1322 1274 /* mute WaveOut (avoid clicking during setup) */ 1323 1275 previously_muted = 1324 1276 snd_azf3328_mixer_set_mute( ··· 1326 1278 ); 1327 1279 } 1328 1280 1329 - spin_lock(&chip->reg_lock); 1281 + spin_lock(codec->lock); 1330 1282 /* first, remember current value: */ 1331 1283 flags1 = snd_azf3328_codec_inw(codec, IDX_IO_CODEC_DMA_FLAGS); 1332 1284 ··· 1341 1293 1342 1294 flags1 &= ~DMA_RUN_SOMETHING1; 1343 1295 snd_azf3328_codec_outw(codec, IDX_IO_CODEC_DMA_FLAGS, flags1); 1344 - spin_unlock(&chip->reg_lock); 1345 - snd_azf3328_ctrl_codec_activity(chip, codec_type, 0); 1296 + spin_unlock(codec->lock); 1297 + snd_azf3328_ctrl_codec_activity(chip, codec->type, 0); 1346 1298 1347 - if (is_playback_codec) { 1299 + if (is_main_mixer_playback_codec) { 1348 1300 /* now unmute WaveOut */ 1349 1301 if (!previously_muted) 1350 1302 snd_azf3328_mixer_set_mute( ··· 1378 1330 return result; 1379 1331 } 1380 1332 1381 - static int 1382 - snd_azf3328_codec_playback_trigger(struct snd_pcm_substream *substream, int cmd) 1383 - { 1384 - return snd_azf3328_codec_trigger(AZF_CODEC_PLAYBACK, substream, cmd); 1385 - } 1386 - 1387 - static int 1388 - snd_azf3328_codec_capture_trigger(struct snd_pcm_substream *substream, int cmd) 1389 - { 1390 - return snd_azf3328_codec_trigger(AZF_CODEC_CAPTURE, substream, cmd); 1391 - } 1392 - 1393 - static int 1394 - snd_azf3328_codec_i2s_out_trigger(struct snd_pcm_substream *substream, int cmd) 1395 - { 1396 - return snd_azf3328_codec_trigger(AZF_CODEC_I2S_OUT, substream, cmd); 1397 - } 1398 - 1399 1333 static snd_pcm_uframes_t 1400 - snd_azf3328_codec_pointer(struct snd_pcm_substream *substream, 1401 - enum snd_azf3328_codec_type codec_type 1334 + snd_azf3328_pcm_pointer(struct snd_pcm_substream *substream 1402 1335 ) 1403 1336 { 1404 - const struct snd_azf3328 *chip = snd_pcm_substream_chip(substream); 1405 - const struct snd_azf3328_codec_data *codec = &chip->codecs[codec_type]; 1406 - unsigned long bufptr, result; 1337 + const struct snd_azf3328_codec_data *codec = 1338 + substream->runtime->private_data; 1339 + unsigned long result; 1407 1340 snd_pcm_uframes_t frmres; 1408 1341 1409 - #ifdef QUERY_HARDWARE 1410 - bufptr = snd_azf3328_codec_inl(codec, IDX_IO_CODEC_DMA_START_1); 1411 - #else 1412 - bufptr = substream->runtime->dma_addr; 1413 - #endif 1414 1342 result = snd_azf3328_codec_inl(codec, IDX_IO_CODEC_DMA_CURRPOS); 1415 1343 1416 1344 /* calculate offset */ 1417 - result -= bufptr; 1345 + #ifdef QUERY_HARDWARE 1346 + result -= snd_azf3328_codec_inl(codec, IDX_IO_CODEC_DMA_START_1); 1347 + #else 1348 + result -= codec->dma_base; 1349 + #endif 1418 1350 frmres = bytes_to_frames( substream->runtime, result); 1419 - snd_azf3328_dbgcodec("%s @ 0x%8lx, frames %8ld\n", 1420 - codec->name, result, frmres); 1351 + snd_azf3328_dbgcodec("%08li %s @ 0x%8lx, frames %8ld\n", 1352 + jiffies, codec->name, result, frmres); 1421 1353 return frmres; 1422 - } 1423 - 1424 - static snd_pcm_uframes_t 1425 - snd_azf3328_codec_playback_pointer(struct snd_pcm_substream *substream) 1426 - { 1427 - return snd_azf3328_codec_pointer(substream, AZF_CODEC_PLAYBACK); 1428 - } 1429 - 1430 - static snd_pcm_uframes_t 1431 - snd_azf3328_codec_capture_pointer(struct snd_pcm_substream *substream) 1432 - { 1433 - return snd_azf3328_codec_pointer(substream, AZF_CODEC_CAPTURE); 1434 - } 1435 - 1436 - static snd_pcm_uframes_t 1437 - snd_azf3328_codec_i2s_out_pointer(struct snd_pcm_substream *substream) 1438 - { 1439 - return snd_azf3328_codec_pointer(substream, AZF_CODEC_I2S_OUT); 1440 1354 } 1441 1355 1442 1356 /******************************************************************/ ··· 1542 1532 } 1543 1533 } 1544 1534 1545 - /* trigger next axes sampling, to be evaluated the next time we 1535 + /* trigger next sampling of axes, to be evaluated the next time we 1546 1536 * enter this function */ 1547 1537 1548 1538 /* for some very, very strange reason we cannot enable ··· 1634 1624 } 1635 1625 1636 1626 static inline void 1637 - snd_azf3328_codec_interrupt(struct snd_azf3328 *chip, u8 status) 1627 + snd_azf3328_pcm_interrupt(const struct snd_azf3328_codec_data *first_codec, 1628 + u8 status 1629 + ) 1638 1630 { 1639 1631 u8 which; 1640 1632 enum snd_azf3328_codec_type codec_type; 1641 - const struct snd_azf3328_codec_data *codec; 1633 + const struct snd_azf3328_codec_data *codec = first_codec; 1642 1634 1643 1635 for (codec_type = AZF_CODEC_PLAYBACK; 1644 1636 codec_type <= AZF_CODEC_I2S_OUT; 1645 - ++codec_type) { 1637 + ++codec_type, ++codec) { 1646 1638 1647 1639 /* skip codec if there's no interrupt for it */ 1648 1640 if (!(status & (1 << codec_type))) 1649 1641 continue; 1650 1642 1651 - codec = &chip->codecs[codec_type]; 1652 - 1653 - spin_lock(&chip->reg_lock); 1643 + spin_lock(codec->lock); 1654 1644 which = snd_azf3328_codec_inb(codec, IDX_IO_CODEC_IRQTYPE); 1655 1645 /* ack all IRQ types immediately */ 1656 1646 snd_azf3328_codec_outb(codec, IDX_IO_CODEC_IRQTYPE, which); 1657 - spin_unlock(&chip->reg_lock); 1647 + spin_unlock(codec->lock); 1658 1648 1659 - if ((chip->pcm[codec_type]) && (codec->substream)) { 1649 + if (codec->substream) { 1660 1650 snd_pcm_period_elapsed(codec->substream); 1661 1651 snd_azf3328_dbgcodec("%s period done (#%x), @ %x\n", 1662 1652 codec->name, ··· 1711 1701 } 1712 1702 1713 1703 if (status & (IRQ_PLAYBACK|IRQ_RECORDING|IRQ_I2S_OUT)) 1714 - snd_azf3328_codec_interrupt(chip, status); 1704 + snd_azf3328_pcm_interrupt(chip->codecs, status); 1715 1705 1716 1706 if (status & IRQ_GAMEPORT) 1717 1707 snd_azf3328_gameport_interrupt(chip); ··· 1799 1789 { 1800 1790 struct snd_azf3328 *chip = snd_pcm_substream_chip(substream); 1801 1791 struct snd_pcm_runtime *runtime = substream->runtime; 1792 + struct snd_azf3328_codec_data *codec = &chip->codecs[codec_type]; 1802 1793 1803 1794 snd_azf3328_dbgcallenter(); 1804 - chip->codecs[codec_type].substream = substream; 1795 + codec->substream = substream; 1805 1796 1806 1797 /* same parameters for all our codecs - at least we think so... */ 1807 1798 runtime->hw = snd_azf3328_hardware; 1808 1799 1809 1800 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, 1810 1801 &snd_azf3328_hw_constraints_rates); 1802 + runtime->private_data = codec; 1811 1803 snd_azf3328_dbgcallleave(); 1812 1804 return 0; 1813 1805 } 1814 1806 1815 1807 static int 1816 - snd_azf3328_playback_open(struct snd_pcm_substream *substream) 1808 + snd_azf3328_pcm_playback_open(struct snd_pcm_substream *substream) 1817 1809 { 1818 1810 return snd_azf3328_pcm_open(substream, AZF_CODEC_PLAYBACK); 1819 1811 } 1820 1812 1821 1813 static int 1822 - snd_azf3328_capture_open(struct snd_pcm_substream *substream) 1814 + snd_azf3328_pcm_capture_open(struct snd_pcm_substream *substream) 1823 1815 { 1824 1816 return snd_azf3328_pcm_open(substream, AZF_CODEC_CAPTURE); 1825 1817 } 1826 1818 1827 1819 static int 1828 - snd_azf3328_i2s_out_open(struct snd_pcm_substream *substream) 1820 + snd_azf3328_pcm_i2s_out_open(struct snd_pcm_substream *substream) 1829 1821 { 1830 1822 return snd_azf3328_pcm_open(substream, AZF_CODEC_I2S_OUT); 1831 1823 } 1832 1824 1833 1825 static int 1834 - snd_azf3328_pcm_close(struct snd_pcm_substream *substream, 1835 - enum snd_azf3328_codec_type codec_type 1826 + snd_azf3328_pcm_close(struct snd_pcm_substream *substream 1836 1827 ) 1837 1828 { 1838 - struct snd_azf3328 *chip = snd_pcm_substream_chip(substream); 1829 + struct snd_azf3328_codec_data *codec = 1830 + substream->runtime->private_data; 1839 1831 1840 1832 snd_azf3328_dbgcallenter(); 1841 - chip->codecs[codec_type].substream = NULL; 1833 + codec->substream = NULL; 1842 1834 snd_azf3328_dbgcallleave(); 1843 1835 return 0; 1844 - } 1845 - 1846 - static int 1847 - snd_azf3328_playback_close(struct snd_pcm_substream *substream) 1848 - { 1849 - return snd_azf3328_pcm_close(substream, AZF_CODEC_PLAYBACK); 1850 - } 1851 - 1852 - static int 1853 - snd_azf3328_capture_close(struct snd_pcm_substream *substream) 1854 - { 1855 - return snd_azf3328_pcm_close(substream, AZF_CODEC_CAPTURE); 1856 - } 1857 - 1858 - static int 1859 - snd_azf3328_i2s_out_close(struct snd_pcm_substream *substream) 1860 - { 1861 - return snd_azf3328_pcm_close(substream, AZF_CODEC_I2S_OUT); 1862 1836 } 1863 1837 1864 1838 /******************************************************************/ 1865 1839 1866 1840 static struct snd_pcm_ops snd_azf3328_playback_ops = { 1867 - .open = snd_azf3328_playback_open, 1868 - .close = snd_azf3328_playback_close, 1841 + .open = snd_azf3328_pcm_playback_open, 1842 + .close = snd_azf3328_pcm_close, 1869 1843 .ioctl = snd_pcm_lib_ioctl, 1870 1844 .hw_params = snd_azf3328_hw_params, 1871 1845 .hw_free = snd_azf3328_hw_free, 1872 - .prepare = snd_azf3328_codec_prepare, 1873 - .trigger = snd_azf3328_codec_playback_trigger, 1874 - .pointer = snd_azf3328_codec_playback_pointer 1846 + .prepare = snd_azf3328_pcm_prepare, 1847 + .trigger = snd_azf3328_pcm_trigger, 1848 + .pointer = snd_azf3328_pcm_pointer 1875 1849 }; 1876 1850 1877 1851 static struct snd_pcm_ops snd_azf3328_capture_ops = { 1878 - .open = snd_azf3328_capture_open, 1879 - .close = snd_azf3328_capture_close, 1852 + .open = snd_azf3328_pcm_capture_open, 1853 + .close = snd_azf3328_pcm_close, 1880 1854 .ioctl = snd_pcm_lib_ioctl, 1881 1855 .hw_params = snd_azf3328_hw_params, 1882 1856 .hw_free = snd_azf3328_hw_free, 1883 - .prepare = snd_azf3328_codec_prepare, 1884 - .trigger = snd_azf3328_codec_capture_trigger, 1885 - .pointer = snd_azf3328_codec_capture_pointer 1857 + .prepare = snd_azf3328_pcm_prepare, 1858 + .trigger = snd_azf3328_pcm_trigger, 1859 + .pointer = snd_azf3328_pcm_pointer 1886 1860 }; 1887 1861 1888 1862 static struct snd_pcm_ops snd_azf3328_i2s_out_ops = { 1889 - .open = snd_azf3328_i2s_out_open, 1890 - .close = snd_azf3328_i2s_out_close, 1863 + .open = snd_azf3328_pcm_i2s_out_open, 1864 + .close = snd_azf3328_pcm_close, 1891 1865 .ioctl = snd_pcm_lib_ioctl, 1892 1866 .hw_params = snd_azf3328_hw_params, 1893 1867 .hw_free = snd_azf3328_hw_free, 1894 - .prepare = snd_azf3328_codec_prepare, 1895 - .trigger = snd_azf3328_codec_i2s_out_trigger, 1896 - .pointer = snd_azf3328_codec_i2s_out_pointer 1868 + .prepare = snd_azf3328_pcm_prepare, 1869 + .trigger = snd_azf3328_pcm_trigger, 1870 + .pointer = snd_azf3328_pcm_pointer 1897 1871 }; 1898 1872 1899 1873 static int __devinit ··· 1960 1966 snd_azf3328_dbgtimer("delay was too low (%d)!\n", delay); 1961 1967 delay = 49; /* minimum time is 49 ticks */ 1962 1968 } 1963 - snd_azf3328_dbgtimer("setting timer countdown value %d, add COUNTDOWN|IRQ\n", delay); 1969 + snd_azf3328_dbgtimer("setting timer countdown value %d\n", delay); 1964 1970 delay |= TIMER_COUNTDOWN_ENABLE | TIMER_IRQ_ENABLE; 1965 1971 spin_lock_irqsave(&chip->reg_lock, flags); 1966 1972 snd_azf3328_ctrl_outl(chip, IDX_IO_TIMER_VALUE, delay); ··· 2174 2180 }; 2175 2181 u8 dma_init; 2176 2182 enum snd_azf3328_codec_type codec_type; 2183 + struct snd_azf3328_codec_data *codec_setup; 2177 2184 2178 2185 *rchip = NULL; 2179 2186 ··· 2212 2217 chip->opl3_io = pci_resource_start(pci, 3); 2213 2218 chip->mixer_io = pci_resource_start(pci, 4); 2214 2219 2215 - chip->codecs[AZF_CODEC_PLAYBACK].io_base = 2216 - chip->ctrl_io + AZF_IO_OFFS_CODEC_PLAYBACK; 2217 - chip->codecs[AZF_CODEC_PLAYBACK].name = "PLAYBACK"; 2218 - chip->codecs[AZF_CODEC_CAPTURE].io_base = 2219 - chip->ctrl_io + AZF_IO_OFFS_CODEC_CAPTURE; 2220 - chip->codecs[AZF_CODEC_CAPTURE].name = "CAPTURE"; 2221 - chip->codecs[AZF_CODEC_I2S_OUT].io_base = 2222 - chip->ctrl_io + AZF_IO_OFFS_CODEC_I2S_OUT; 2223 - chip->codecs[AZF_CODEC_I2S_OUT].name = "I2S_OUT"; 2220 + codec_setup = &chip->codecs[AZF_CODEC_PLAYBACK]; 2221 + codec_setup->io_base = chip->ctrl_io + AZF_IO_OFFS_CODEC_PLAYBACK; 2222 + codec_setup->lock = &chip->reg_lock; 2223 + codec_setup->type = AZF_CODEC_PLAYBACK; 2224 + codec_setup->name = "PLAYBACK"; 2225 + 2226 + codec_setup = &chip->codecs[AZF_CODEC_CAPTURE]; 2227 + codec_setup->io_base = chip->ctrl_io + AZF_IO_OFFS_CODEC_CAPTURE; 2228 + codec_setup->lock = &chip->reg_lock; 2229 + codec_setup->type = AZF_CODEC_CAPTURE; 2230 + codec_setup->name = "CAPTURE"; 2231 + 2232 + codec_setup = &chip->codecs[AZF_CODEC_I2S_OUT]; 2233 + codec_setup->io_base = chip->ctrl_io + AZF_IO_OFFS_CODEC_I2S_OUT; 2234 + codec_setup->lock = &chip->reg_lock; 2235 + codec_setup->type = AZF_CODEC_I2S_OUT; 2236 + codec_setup->name = "I2S_OUT"; 2224 2237 2225 2238 if (request_irq(pci->irq, snd_azf3328_interrupt, 2226 2239 IRQF_SHARED, card->shortname, chip)) { ··· 2260 2257 struct snd_azf3328_codec_data *codec = 2261 2258 &chip->codecs[codec_type]; 2262 2259 2263 - /* shutdown codecs to save power */ 2260 + /* shutdown codecs to reduce power / noise */ 2264 2261 /* have ...ctrl_codec_activity() act properly */ 2265 2262 codec->running = 1; 2266 2263 snd_azf3328_ctrl_codec_activity(chip, codec_type, 0); 2267 2264 2268 - spin_lock_irq(&chip->reg_lock); 2265 + spin_lock_irq(codec->lock); 2269 2266 snd_azf3328_codec_outb(codec, IDX_IO_CODEC_DMA_FLAGS, 2270 2267 dma_init); 2271 - spin_unlock_irq(&chip->reg_lock); 2268 + spin_unlock_irq(codec->lock); 2272 2269 } 2273 2270 2274 2271 snd_card_set_dev(card, &pci->dev); ··· 2422 2419 2423 2420 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); 2424 2421 2422 + /* same pcm object for playback/capture */ 2425 2423 snd_pcm_suspend_all(chip->pcm[AZF_CODEC_PLAYBACK]); 2426 2424 snd_pcm_suspend_all(chip->pcm[AZF_CODEC_I2S_OUT]); 2427 2425
+2 -8
sound/pci/bt87x.c
··· 637 637 static int snd_bt87x_capture_source_info(struct snd_kcontrol *kcontrol, 638 638 struct snd_ctl_elem_info *info) 639 639 { 640 - static char *texts[3] = {"TV Tuner", "FM", "Mic/Line"}; 640 + static const char *const texts[3] = {"TV Tuner", "FM", "Mic/Line"}; 641 641 642 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 643 - info->count = 1; 644 - info->value.enumerated.items = 3; 645 - if (info->value.enumerated.item > 2) 646 - info->value.enumerated.item = 2; 647 - strcpy(info->value.enumerated.name, texts[info->value.enumerated.item]); 648 - return 0; 642 + return snd_ctl_enum_info(info, 1, 3, texts); 649 643 } 650 644 651 645 static int snd_bt87x_capture_source_get(struct snd_kcontrol *kcontrol,
+9 -16
sound/pci/cmipci.c
··· 2507 2507 struct snd_ctl_elem_info *uinfo) 2508 2508 { 2509 2509 struct cmipci *cm = snd_kcontrol_chip(kcontrol); 2510 - static char *texts[3] = { "Line-In", "Rear Output", "Bass Output" }; 2511 - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 2512 - uinfo->count = 1; 2513 - uinfo->value.enumerated.items = cm->chip_version >= 39 ? 3 : 2; 2514 - if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 2515 - uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 2516 - strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 2517 - return 0; 2510 + static const char *const texts[3] = { 2511 + "Line-In", "Rear Output", "Bass Output" 2512 + }; 2513 + 2514 + return snd_ctl_enum_info(uinfo, 1, 2515 + cm->chip_version >= 39 ? 3 : 2, texts); 2518 2516 } 2519 2517 2520 2518 static inline unsigned int get_line_in_mode(struct cmipci *cm) ··· 2562 2564 static int snd_cmipci_mic_in_mode_info(struct snd_kcontrol *kcontrol, 2563 2565 struct snd_ctl_elem_info *uinfo) 2564 2566 { 2565 - static char *texts[2] = { "Mic-In", "Center/LFE Output" }; 2566 - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 2567 - uinfo->count = 1; 2568 - uinfo->value.enumerated.items = 2; 2569 - if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 2570 - uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 2571 - strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 2572 - return 0; 2567 + static const char *const texts[2] = { "Mic-In", "Center/LFE Output" }; 2568 + 2569 + return snd_ctl_enum_info(uinfo, 1, 2, texts); 2573 2570 } 2574 2571 2575 2572 static int snd_cmipci_mic_in_mode_get(struct snd_kcontrol *kcontrol,
+6 -3
sound/pci/hda/hda_intel.c
··· 1235 1235 pos_adj = 0; 1236 1236 } else { 1237 1237 ofs = setup_bdle(substream, azx_dev, 1238 - &bdl, ofs, pos_adj, 1); 1238 + &bdl, ofs, pos_adj, 1239 + !substream->runtime->no_period_wakeup); 1239 1240 if (ofs < 0) 1240 1241 goto error; 1241 1242 } ··· 1248 1247 period_bytes - pos_adj, 0); 1249 1248 else 1250 1249 ofs = setup_bdle(substream, azx_dev, &bdl, ofs, 1251 - period_bytes, 1); 1250 + period_bytes, 1251 + !substream->runtime->no_period_wakeup); 1252 1252 if (ofs < 0) 1253 1253 goto error; 1254 1254 } ··· 1517 1515 /* No full-resume yet implemented */ 1518 1516 /* SNDRV_PCM_INFO_RESUME |*/ 1519 1517 SNDRV_PCM_INFO_PAUSE | 1520 - SNDRV_PCM_INFO_SYNC_START), 1518 + SNDRV_PCM_INFO_SYNC_START | 1519 + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP), 1521 1520 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1522 1521 .rates = SNDRV_PCM_RATE_48000, 1523 1522 .rate_min = 48000,
+8 -2
sound/pci/hda/patch_realtek.c
··· 10857 10857 return 0; 10858 10858 } 10859 10859 10860 + static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, 10861 + const struct auto_pin_cfg *cfg); 10862 + 10860 10863 /* almost identical with ALC880 parser... */ 10861 10864 static int alc882_parse_auto_config(struct hda_codec *codec) 10862 10865 { ··· 10877 10874 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 10878 10875 if (err < 0) 10879 10876 return err; 10880 - err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 10877 + if (codec->vendor_id == 0x10ec0887) 10878 + err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg); 10879 + else 10880 + err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 10881 10881 if (err < 0) 10882 10882 return err; 10883 10883 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], ··· 17049 17043 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) 17050 17044 17051 17045 /* add playback controls from the parsed DAC table */ 17052 - /* Based on ALC880 version. But ALC861VD has separate, 17046 + /* Based on ALC880 version. But ALC861VD and ALC887 have separate, 17053 17047 * different NIDs for mute/unmute switch and volume control */ 17054 17048 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, 17055 17049 const struct auto_pin_cfg *cfg)
+1 -2
sound/pci/hda/patch_via.c
··· 263 263 return; 264 264 snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 265 265 !spec->vt1708_jack_detectect); 266 - cancel_delayed_work(&spec->vt1708_hp_work); 267 - flush_scheduled_work(); 266 + cancel_delayed_work_sync(&spec->vt1708_hp_work); 268 267 } 269 268 270 269
+48 -1
sound/pci/ice1712/delta.c
··· 96 96 tmp |= ICE1712_DELTA_AP_CCLK | ICE1712_DELTA_AP_CS_CODEC; 97 97 tmp &= ~ICE1712_DELTA_AP_CS_DIGITAL; 98 98 break; 99 + case ICE1712_SUBDEVICE_DELTA66E: 100 + tmp |= ICE1712_DELTA_66E_CCLK | ICE1712_DELTA_66E_CS_CHIP_A | 101 + ICE1712_DELTA_66E_CS_CHIP_B; 102 + tmp &= ~ICE1712_DELTA_66E_CS_CS8427; 103 + break; 99 104 case ICE1712_SUBDEVICE_VX442: 100 105 tmp |= ICE1712_VX442_CCLK | ICE1712_VX442_CODEC_CHIP_A | ICE1712_VX442_CODEC_CHIP_B; 101 106 tmp &= ~ICE1712_VX442_CS_DIGITAL; ··· 123 118 case ICE1712_SUBDEVICE_AUDIOPHILE: 124 119 case ICE1712_SUBDEVICE_DELTA410: 125 120 tmp |= ICE1712_DELTA_AP_CS_DIGITAL; 121 + break; 122 + case ICE1712_SUBDEVICE_DELTA66E: 123 + tmp |= ICE1712_DELTA_66E_CS_CS8427; 126 124 break; 127 125 case ICE1712_SUBDEVICE_VX442: 128 126 tmp |= ICE1712_VX442_CS_DIGITAL; ··· 281 273 snd_ice1712_save_gpio_status(ice); 282 274 priv->cs_mask = ICE1712_DELTA_1010LT_CS; 283 275 priv->cs_addr = chip << 4; 276 + } 277 + 278 + /* 279 + * AK4524 on Delta66 rev E to choose the chip address 280 + */ 281 + static void delta66e_ak4524_lock(struct snd_akm4xxx *ak, int chip) 282 + { 283 + struct snd_ak4xxx_private *priv = (void *)ak->private_value[0]; 284 + struct snd_ice1712 *ice = ak->private_data[0]; 285 + 286 + snd_ice1712_save_gpio_status(ice); 287 + priv->cs_mask = 288 + priv->cs_addr = chip == 0 ? ICE1712_DELTA_66E_CS_CHIP_A : 289 + ICE1712_DELTA_66E_CS_CHIP_B; 284 290 } 285 291 286 292 /* ··· 509 487 .mask_flags = 0, 510 488 }; 511 489 490 + static struct snd_akm4xxx akm_delta66e __devinitdata = { 491 + .type = SND_AK4524, 492 + .num_adcs = 4, 493 + .num_dacs = 4, 494 + .ops = { 495 + .lock = delta66e_ak4524_lock, 496 + .set_rate_val = delta_ak4524_set_rate_val 497 + } 498 + }; 499 + 500 + static struct snd_ak4xxx_private akm_delta66e_priv __devinitdata = { 501 + .caddr = 2, 502 + .cif = 0, /* the default level of the CIF pin from AK4524 */ 503 + .data_mask = ICE1712_DELTA_66E_DOUT, 504 + .clk_mask = ICE1712_DELTA_66E_CCLK, 505 + .cs_mask = 0, 506 + .cs_addr = 0, /* set later */ 507 + .cs_none = 0, 508 + .add_flags = 0, 509 + .mask_flags = 0, 510 + }; 511 + 512 + 512 513 static struct snd_akm4xxx akm_delta44 __devinitdata = { 513 514 .type = SND_AK4524, 514 515 .num_adcs = 4, ··· 689 644 err = snd_ice1712_akm4xxx_init(ak, &akm_delta44, &akm_delta44_priv, ice); 690 645 break; 691 646 case ICE1712_SUBDEVICE_VX442: 692 - case ICE1712_SUBDEVICE_DELTA66E: 693 647 err = snd_ice1712_akm4xxx_init(ak, &akm_vx442, &akm_vx442_priv, ice); 648 + break; 649 + case ICE1712_SUBDEVICE_DELTA66E: 650 + err = snd_ice1712_akm4xxx_init(ak, &akm_delta66e, &akm_delta66e_priv, ice); 694 651 break; 695 652 default: 696 653 snd_BUG();
+11
sound/pci/ice1712/delta.h
··· 144 144 #define ICE1712_DELTA_1010LT_CS_NONE 0x50 /* nothing */ 145 145 #define ICE1712_DELTA_1010LT_WORDCLOCK 0x80 /* sample clock source: 0 = Word Clock Input, 1 = S/PDIF Input ??? */ 146 146 147 + /* M-Audio Delta 66 rev. E definitions. 148 + * Newer revisions of Delta 66 have CS8427 over SPI for 149 + * S/PDIF transceiver instead of CS8404/CS8414. */ 150 + /* 0x01 = DFS */ 151 + #define ICE1712_DELTA_66E_CCLK 0x02 /* SPI clock */ 152 + #define ICE1712_DELTA_66E_DIN 0x04 /* data input */ 153 + #define ICE1712_DELTA_66E_DOUT 0x08 /* data output */ 154 + #define ICE1712_DELTA_66E_CS_CS8427 0x10 /* chip select, low = CS8427 */ 155 + #define ICE1712_DELTA_66E_CS_CHIP_A 0x20 /* AK4524 #0 */ 156 + #define ICE1712_DELTA_66E_CS_CHIP_B 0x40 /* AK4524 #1 */ 157 + 147 158 /* Digigram VX442 definitions */ 148 159 #define ICE1712_VX442_CCLK 0x02 /* SPI clock */ 149 160 #define ICE1712_VX442_DIN 0x04 /* data input */
+1 -3
sound/pci/oxygen/Makefile
··· 1 1 snd-oxygen-lib-objs := oxygen_io.o oxygen_lib.o oxygen_mixer.o oxygen_pcm.o 2 - snd-hifier-objs := hifier.o 3 - snd-oxygen-objs := oxygen.o 2 + snd-oxygen-objs := oxygen.o xonar_dg.o 4 3 snd-virtuoso-objs := virtuoso.o xonar_lib.o \ 5 4 xonar_pcm179x.o xonar_cs43xx.o xonar_wm87x6.o xonar_hdmi.o 6 5 7 6 obj-$(CONFIG_SND_OXYGEN_LIB) += snd-oxygen-lib.o 8 - obj-$(CONFIG_SND_HIFIER) += snd-hifier.o 9 7 obj-$(CONFIG_SND_OXYGEN) += snd-oxygen.o 10 8 obj-$(CONFIG_SND_VIRTUOSO) += snd-virtuoso.o
+107
sound/pci/oxygen/cs4245.h
··· 1 + #define CS4245_CHIP_ID 0x01 2 + #define CS4245_POWER_CTRL 0x02 3 + #define CS4245_DAC_CTRL_1 0x03 4 + #define CS4245_ADC_CTRL 0x04 5 + #define CS4245_MCLK_FREQ 0x05 6 + #define CS4245_SIGNAL_SEL 0x06 7 + #define CS4245_PGA_B_CTRL 0x07 8 + #define CS4245_PGA_A_CTRL 0x08 9 + #define CS4245_ANALOG_IN 0x09 10 + #define CS4245_DAC_A_CTRL 0x0a 11 + #define CS4245_DAC_B_CTRL 0x0b 12 + #define CS4245_DAC_CTRL_2 0x0c 13 + #define CS4245_INT_STATUS 0x0d 14 + #define CS4245_INT_MASK 0x0e 15 + #define CS4245_INT_MODE_MSB 0x0f 16 + #define CS4245_INT_MODE_LSB 0x10 17 + 18 + /* Chip ID */ 19 + #define CS4245_CHIP_PART_MASK 0xf0 20 + #define CS4245_CHIP_REV_MASK 0x0f 21 + 22 + /* Power Control */ 23 + #define CS4245_FREEZE 0x80 24 + #define CS4245_PDN_MIC 0x08 25 + #define CS4245_PDN_ADC 0x04 26 + #define CS4245_PDN_DAC 0x02 27 + #define CS4245_PDN 0x01 28 + 29 + /* DAC Control */ 30 + #define CS4245_DAC_FM_MASK 0xc0 31 + #define CS4245_DAC_FM_SINGLE 0x00 32 + #define CS4245_DAC_FM_DOUBLE 0x40 33 + #define CS4245_DAC_FM_QUAD 0x80 34 + #define CS4245_DAC_DIF_MASK 0x30 35 + #define CS4245_DAC_DIF_LJUST 0x00 36 + #define CS4245_DAC_DIF_I2S 0x10 37 + #define CS4245_DAC_DIF_RJUST_16 0x20 38 + #define CS4245_DAC_DIF_RJUST_24 0x30 39 + #define CS4245_RESERVED_1 0x08 40 + #define CS4245_MUTE_DAC 0x04 41 + #define CS4245_DEEMPH 0x02 42 + #define CS4245_DAC_MASTER 0x01 43 + 44 + /* ADC Control */ 45 + #define CS4245_ADC_FM_MASK 0xc0 46 + #define CS4245_ADC_FM_SINGLE 0x00 47 + #define CS4245_ADC_FM_DOUBLE 0x40 48 + #define CS4245_ADC_FM_QUAD 0x80 49 + #define CS4245_ADC_DIF_MASK 0x10 50 + #define CS4245_ADC_DIF_LJUST 0x00 51 + #define CS4245_ADC_DIF_I2S 0x10 52 + #define CS4245_MUTE_ADC 0x04 53 + #define CS4245_HPF_FREEZE 0x02 54 + #define CS4245_ADC_MASTER 0x01 55 + 56 + /* MCLK Frequency */ 57 + #define CS4245_MCLK1_MASK 0x70 58 + #define CS4245_MCLK1_SHIFT 4 59 + #define CS4245_MCLK2_MASK 0x07 60 + #define CS4245_MCLK2_SHIFT 0 61 + #define CS4245_MCLK_1 0 62 + #define CS4245_MCLK_1_5 1 63 + #define CS4245_MCLK_2 2 64 + #define CS4245_MCLK_3 3 65 + #define CS4245_MCLK_4 4 66 + 67 + /* Signal Selection */ 68 + #define CS4245_A_OUT_SEL_MASK 0x60 69 + #define CS4245_A_OUT_SEL_HIZ 0x00 70 + #define CS4245_A_OUT_SEL_DAC 0x20 71 + #define CS4245_A_OUT_SEL_PGA 0x40 72 + #define CS4245_LOOP 0x02 73 + #define CS4245_ASYNCH 0x01 74 + 75 + /* Channel B/A PGA Control */ 76 + #define CS4245_PGA_GAIN_MASK 0x3f 77 + 78 + /* ADC Input Control */ 79 + #define CS4245_PGA_SOFT 0x10 80 + #define CS4245_PGA_ZERO 0x08 81 + #define CS4245_SEL_MASK 0x07 82 + #define CS4245_SEL_MIC 0x00 83 + #define CS4245_SEL_INPUT_1 0x01 84 + #define CS4245_SEL_INPUT_2 0x02 85 + #define CS4245_SEL_INPUT_3 0x03 86 + #define CS4245_SEL_INPUT_4 0x04 87 + #define CS4245_SEL_INPUT_5 0x05 88 + #define CS4245_SEL_INPUT_6 0x06 89 + 90 + /* DAC Channel A/B Volume Control */ 91 + #define CS4245_VOL_MASK 0xff 92 + 93 + /* DAC Control 2 */ 94 + #define CS4245_DAC_SOFT 0x80 95 + #define CS4245_DAC_ZERO 0x40 96 + #define CS4245_INVERT_DAC 0x20 97 + #define CS4245_INT_ACTIVE_HIGH 0x01 98 + 99 + /* Interrupt Status/Mask/Mode */ 100 + #define CS4245_ADC_CLK_ERR 0x08 101 + #define CS4245_DAC_CLK_ERR 0x04 102 + #define CS4245_ADC_OVFL 0x02 103 + #define CS4245_ADC_UNDRFL 0x01 104 + 105 + 106 + #define CS4245_SPI_ADDRESS (0x9e << 16) 107 + #define CS4245_SPI_WRITE (0 << 16)
-239
sound/pci/oxygen/hifier.c
··· 1 - /* 2 - * C-Media CMI8788 driver for the MediaTek/TempoTec HiFier Fantasia 3 - * 4 - * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 - * 6 - * 7 - * This driver is free software; you can redistribute it and/or modify 8 - * it under the terms of the GNU General Public License, version 2. 9 - * 10 - * This driver is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 - * GNU General Public License for more details. 14 - * 15 - * You should have received a copy of the GNU General Public License 16 - * along with this driver; if not, write to the Free Software 17 - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 - */ 19 - 20 - /* 21 - * CMI8788: 22 - * 23 - * SPI 0 -> AK4396 24 - */ 25 - 26 - #include <linux/delay.h> 27 - #include <linux/pci.h> 28 - #include <sound/control.h> 29 - #include <sound/core.h> 30 - #include <sound/initval.h> 31 - #include <sound/pcm.h> 32 - #include <sound/tlv.h> 33 - #include "oxygen.h" 34 - #include "ak4396.h" 35 - 36 - MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); 37 - MODULE_DESCRIPTION("TempoTec HiFier driver"); 38 - MODULE_LICENSE("GPL v2"); 39 - 40 - static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; 41 - static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; 42 - static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; 43 - 44 - module_param_array(index, int, NULL, 0444); 45 - MODULE_PARM_DESC(index, "card index"); 46 - module_param_array(id, charp, NULL, 0444); 47 - MODULE_PARM_DESC(id, "ID string"); 48 - module_param_array(enable, bool, NULL, 0444); 49 - MODULE_PARM_DESC(enable, "enable card"); 50 - 51 - static DEFINE_PCI_DEVICE_TABLE(hifier_ids) = { 52 - { OXYGEN_PCI_SUBID(0x14c3, 0x1710) }, 53 - { OXYGEN_PCI_SUBID(0x14c3, 0x1711) }, 54 - { OXYGEN_PCI_SUBID_BROKEN_EEPROM }, 55 - { } 56 - }; 57 - MODULE_DEVICE_TABLE(pci, hifier_ids); 58 - 59 - struct hifier_data { 60 - u8 ak4396_regs[5]; 61 - }; 62 - 63 - static void ak4396_write(struct oxygen *chip, u8 reg, u8 value) 64 - { 65 - struct hifier_data *data = chip->model_data; 66 - 67 - oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 68 - OXYGEN_SPI_DATA_LENGTH_2 | 69 - OXYGEN_SPI_CLOCK_160 | 70 - (0 << OXYGEN_SPI_CODEC_SHIFT) | 71 - OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 72 - AK4396_WRITE | (reg << 8) | value); 73 - data->ak4396_regs[reg] = value; 74 - } 75 - 76 - static void ak4396_write_cached(struct oxygen *chip, u8 reg, u8 value) 77 - { 78 - struct hifier_data *data = chip->model_data; 79 - 80 - if (value != data->ak4396_regs[reg]) 81 - ak4396_write(chip, reg, value); 82 - } 83 - 84 - static void hifier_registers_init(struct oxygen *chip) 85 - { 86 - struct hifier_data *data = chip->model_data; 87 - 88 - ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); 89 - ak4396_write(chip, AK4396_CONTROL_2, 90 - data->ak4396_regs[AK4396_CONTROL_2]); 91 - ak4396_write(chip, AK4396_CONTROL_3, AK4396_PCM); 92 - ak4396_write(chip, AK4396_LCH_ATT, chip->dac_volume[0]); 93 - ak4396_write(chip, AK4396_RCH_ATT, chip->dac_volume[1]); 94 - } 95 - 96 - static void hifier_init(struct oxygen *chip) 97 - { 98 - struct hifier_data *data = chip->model_data; 99 - 100 - data->ak4396_regs[AK4396_CONTROL_2] = 101 - AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 102 - hifier_registers_init(chip); 103 - 104 - snd_component_add(chip->card, "AK4396"); 105 - snd_component_add(chip->card, "CS5340"); 106 - } 107 - 108 - static void hifier_cleanup(struct oxygen *chip) 109 - { 110 - } 111 - 112 - static void hifier_resume(struct oxygen *chip) 113 - { 114 - hifier_registers_init(chip); 115 - } 116 - 117 - static void set_ak4396_params(struct oxygen *chip, 118 - struct snd_pcm_hw_params *params) 119 - { 120 - struct hifier_data *data = chip->model_data; 121 - u8 value; 122 - 123 - value = data->ak4396_regs[AK4396_CONTROL_2] & ~AK4396_DFS_MASK; 124 - if (params_rate(params) <= 54000) 125 - value |= AK4396_DFS_NORMAL; 126 - else if (params_rate(params) <= 108000) 127 - value |= AK4396_DFS_DOUBLE; 128 - else 129 - value |= AK4396_DFS_QUAD; 130 - 131 - msleep(1); /* wait for the new MCLK to become stable */ 132 - 133 - if (value != data->ak4396_regs[AK4396_CONTROL_2]) { 134 - ak4396_write(chip, AK4396_CONTROL_1, 135 - AK4396_DIF_24_MSB); 136 - ak4396_write(chip, AK4396_CONTROL_2, value); 137 - ak4396_write(chip, AK4396_CONTROL_1, 138 - AK4396_DIF_24_MSB | AK4396_RSTN); 139 - } 140 - } 141 - 142 - static void update_ak4396_volume(struct oxygen *chip) 143 - { 144 - ak4396_write_cached(chip, AK4396_LCH_ATT, chip->dac_volume[0]); 145 - ak4396_write_cached(chip, AK4396_RCH_ATT, chip->dac_volume[1]); 146 - } 147 - 148 - static void update_ak4396_mute(struct oxygen *chip) 149 - { 150 - struct hifier_data *data = chip->model_data; 151 - u8 value; 152 - 153 - value = data->ak4396_regs[AK4396_CONTROL_2] & ~AK4396_SMUTE; 154 - if (chip->dac_mute) 155 - value |= AK4396_SMUTE; 156 - ak4396_write_cached(chip, AK4396_CONTROL_2, value); 157 - } 158 - 159 - static void set_cs5340_params(struct oxygen *chip, 160 - struct snd_pcm_hw_params *params) 161 - { 162 - } 163 - 164 - static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); 165 - 166 - static const struct oxygen_model model_hifier = { 167 - .shortname = "C-Media CMI8787", 168 - .longname = "C-Media Oxygen HD Audio", 169 - .chip = "CMI8788", 170 - .init = hifier_init, 171 - .cleanup = hifier_cleanup, 172 - .resume = hifier_resume, 173 - .get_i2s_mclk = oxygen_default_i2s_mclk, 174 - .set_dac_params = set_ak4396_params, 175 - .set_adc_params = set_cs5340_params, 176 - .update_dac_volume = update_ak4396_volume, 177 - .update_dac_mute = update_ak4396_mute, 178 - .dac_tlv = ak4396_db_scale, 179 - .model_data_size = sizeof(struct hifier_data), 180 - .device_config = PLAYBACK_0_TO_I2S | 181 - PLAYBACK_1_TO_SPDIF | 182 - CAPTURE_0_FROM_I2S_1, 183 - .dac_channels = 2, 184 - .dac_volume_min = 0, 185 - .dac_volume_max = 255, 186 - .function_flags = OXYGEN_FUNCTION_SPI, 187 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 188 - .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 189 - }; 190 - 191 - static int __devinit get_hifier_model(struct oxygen *chip, 192 - const struct pci_device_id *id) 193 - { 194 - chip->model = model_hifier; 195 - return 0; 196 - } 197 - 198 - static int __devinit hifier_probe(struct pci_dev *pci, 199 - const struct pci_device_id *pci_id) 200 - { 201 - static int dev; 202 - int err; 203 - 204 - if (dev >= SNDRV_CARDS) 205 - return -ENODEV; 206 - if (!enable[dev]) { 207 - ++dev; 208 - return -ENOENT; 209 - } 210 - err = oxygen_pci_probe(pci, index[dev], id[dev], THIS_MODULE, 211 - hifier_ids, get_hifier_model); 212 - if (err >= 0) 213 - ++dev; 214 - return err; 215 - } 216 - 217 - static struct pci_driver hifier_driver = { 218 - .name = "CMI8787HiFier", 219 - .id_table = hifier_ids, 220 - .probe = hifier_probe, 221 - .remove = __devexit_p(oxygen_pci_remove), 222 - #ifdef CONFIG_PM 223 - .suspend = oxygen_pci_suspend, 224 - .resume = oxygen_pci_resume, 225 - #endif 226 - }; 227 - 228 - static int __init alsa_card_hifier_init(void) 229 - { 230 - return pci_register_driver(&hifier_driver); 231 - } 232 - 233 - static void __exit alsa_card_hifier_exit(void) 234 - { 235 - pci_unregister_driver(&hifier_driver); 236 - } 237 - 238 - module_init(alsa_card_hifier_init) 239 - module_exit(alsa_card_hifier_exit)
+318 -38
sound/pci/oxygen/oxygen.c
··· 20 20 /* 21 21 * CMI8788: 22 22 * 23 - * SPI 0 -> 1st AK4396 (front) 24 - * SPI 1 -> 2nd AK4396 (surround) 25 - * SPI 2 -> 3rd AK4396 (center/LFE) 26 - * SPI 3 -> WM8785 27 - * SPI 4 -> 4th AK4396 (back) 23 + * SPI 0 -> 1st AK4396 (front) 24 + * SPI 1 -> 2nd AK4396 (surround) 25 + * SPI 2 -> 3rd AK4396 (center/LFE) 26 + * SPI 3 -> WM8785 27 + * SPI 4 -> 4th AK4396 (back) 28 28 * 29 - * GPIO 0 -> DFS0 of AK5385 30 - * GPIO 1 -> DFS1 of AK5385 31 - * GPIO 8 -> enable headphone amplifier on HT-Omega models 29 + * GPIO 0 -> DFS0 of AK5385 30 + * GPIO 1 -> DFS1 of AK5385 31 + * 32 + * X-Meridian models: 33 + * GPIO 4 -> enable extension S/PDIF input 34 + * GPIO 6 -> enable on-board S/PDIF input 35 + * 36 + * Claro models: 37 + * GPIO 6 -> S/PDIF from optical (0) or coaxial (1) input 38 + * GPIO 8 -> enable headphone amplifier 32 39 * 33 40 * CM9780: 34 41 * 35 - * GPO 0 -> route line-in (0) or AC97 output (1) to ADC input 42 + * LINE_OUT -> input of ADC 43 + * 44 + * AUX_IN <- aux 45 + * CD_IN <- CD 46 + * MIC_IN <- mic 47 + * 48 + * GPO 0 -> route line-in (0) or AC97 output (1) to ADC input 36 49 */ 37 50 38 51 #include <linux/delay.h> ··· 54 41 #include <sound/ac97_codec.h> 55 42 #include <sound/control.h> 56 43 #include <sound/core.h> 44 + #include <sound/info.h> 57 45 #include <sound/initval.h> 58 46 #include <sound/pcm.h> 59 47 #include <sound/pcm_params.h> 60 48 #include <sound/tlv.h> 61 49 #include "oxygen.h" 50 + #include "xonar_dg.h" 62 51 #include "ak4396.h" 63 52 #include "wm8785.h" 64 53 65 54 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); 66 55 MODULE_DESCRIPTION("C-Media CMI8788 driver"); 67 56 MODULE_LICENSE("GPL v2"); 68 - MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8788}}"); 57 + MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8786}" 58 + ",{C-Media,CMI8787}" 59 + ",{C-Media,CMI8788}}"); 69 60 70 61 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; 71 62 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; ··· 83 66 MODULE_PARM_DESC(enable, "enable card"); 84 67 85 68 enum { 86 - MODEL_CMEDIA_REF, /* C-Media's reference design */ 87 - MODEL_MERIDIAN, /* AuzenTech X-Meridian */ 88 - MODEL_CLARO, /* HT-Omega Claro */ 89 - MODEL_CLARO_HALO, /* HT-Omega Claro halo */ 69 + MODEL_CMEDIA_REF, 70 + MODEL_MERIDIAN, 71 + MODEL_MERIDIAN_2G, 72 + MODEL_CLARO, 73 + MODEL_CLARO_HALO, 74 + MODEL_FANTASIA, 75 + MODEL_SERENADE, 76 + MODEL_2CH_OUTPUT, 77 + MODEL_HG2PCI, 78 + MODEL_XONAR_DG, 90 79 }; 91 80 92 81 static DEFINE_PCI_DEVICE_TABLE(oxygen_ids) = { 82 + /* C-Media's reference design */ 93 83 { OXYGEN_PCI_SUBID(0x10b0, 0x0216), .driver_data = MODEL_CMEDIA_REF }, 84 + { OXYGEN_PCI_SUBID(0x10b0, 0x0217), .driver_data = MODEL_CMEDIA_REF }, 94 85 { OXYGEN_PCI_SUBID(0x10b0, 0x0218), .driver_data = MODEL_CMEDIA_REF }, 95 86 { OXYGEN_PCI_SUBID(0x10b0, 0x0219), .driver_data = MODEL_CMEDIA_REF }, 96 87 { OXYGEN_PCI_SUBID(0x13f6, 0x0001), .driver_data = MODEL_CMEDIA_REF }, 97 88 { OXYGEN_PCI_SUBID(0x13f6, 0x0010), .driver_data = MODEL_CMEDIA_REF }, 98 89 { OXYGEN_PCI_SUBID(0x13f6, 0x8788), .driver_data = MODEL_CMEDIA_REF }, 99 - { OXYGEN_PCI_SUBID(0x13f6, 0xffff), .driver_data = MODEL_CMEDIA_REF }, 100 90 { OXYGEN_PCI_SUBID(0x147a, 0xa017), .driver_data = MODEL_CMEDIA_REF }, 101 91 { OXYGEN_PCI_SUBID(0x1a58, 0x0910), .driver_data = MODEL_CMEDIA_REF }, 92 + /* Asus Xonar DG */ 93 + { OXYGEN_PCI_SUBID(0x1043, 0x8467), .driver_data = MODEL_XONAR_DG }, 94 + /* PCI 2.0 HD Audio */ 95 + { OXYGEN_PCI_SUBID(0x13f6, 0x8782), .driver_data = MODEL_2CH_OUTPUT }, 96 + /* Kuroutoshikou CMI8787-HG2PCI */ 97 + { OXYGEN_PCI_SUBID(0x13f6, 0xffff), .driver_data = MODEL_HG2PCI }, 98 + /* TempoTec HiFier Fantasia */ 99 + { OXYGEN_PCI_SUBID(0x14c3, 0x1710), .driver_data = MODEL_FANTASIA }, 100 + /* TempoTec HiFier Serenade */ 101 + { OXYGEN_PCI_SUBID(0x14c3, 0x1711), .driver_data = MODEL_SERENADE }, 102 + /* AuzenTech X-Meridian */ 102 103 { OXYGEN_PCI_SUBID(0x415a, 0x5431), .driver_data = MODEL_MERIDIAN }, 104 + /* AuzenTech X-Meridian 2G */ 105 + { OXYGEN_PCI_SUBID(0x5431, 0x017a), .driver_data = MODEL_MERIDIAN_2G }, 106 + /* HT-Omega Claro */ 103 107 { OXYGEN_PCI_SUBID(0x7284, 0x9761), .driver_data = MODEL_CLARO }, 108 + /* HT-Omega Claro halo */ 104 109 { OXYGEN_PCI_SUBID(0x7284, 0x9781), .driver_data = MODEL_CLARO_HALO }, 105 110 { } 106 111 }; ··· 134 95 #define GPIO_AK5385_DFS_DOUBLE 0x0001 135 96 #define GPIO_AK5385_DFS_QUAD 0x0002 136 97 98 + #define GPIO_MERIDIAN_DIG_MASK 0x0050 99 + #define GPIO_MERIDIAN_DIG_EXT 0x0010 100 + #define GPIO_MERIDIAN_DIG_BOARD 0x0040 101 + 102 + #define GPIO_CLARO_DIG_COAX 0x0040 137 103 #define GPIO_CLARO_HP 0x0100 138 104 139 105 struct generic_data { 106 + unsigned int dacs; 140 107 u8 ak4396_regs[4][5]; 141 108 u16 wm8785_regs[3]; 142 109 }; ··· 193 148 struct generic_data *data = chip->model_data; 194 149 unsigned int i; 195 150 196 - for (i = 0; i < 4; ++i) { 151 + for (i = 0; i < data->dacs; ++i) { 197 152 ak4396_write(chip, i, AK4396_CONTROL_1, 198 153 AK4396_DIF_24_MSB | AK4396_RSTN); 199 154 ak4396_write(chip, i, AK4396_CONTROL_2, ··· 211 166 { 212 167 struct generic_data *data = chip->model_data; 213 168 169 + data->dacs = chip->model.dac_channels_pcm / 2; 214 170 data->ak4396_regs[0][AK4396_CONTROL_2] = 215 171 AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 216 172 ak4396_registers_init(chip); ··· 253 207 254 208 static void meridian_init(struct oxygen *chip) 255 209 { 210 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 211 + GPIO_MERIDIAN_DIG_MASK); 212 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 213 + GPIO_MERIDIAN_DIG_BOARD, GPIO_MERIDIAN_DIG_MASK); 256 214 ak4396_init(chip); 257 215 ak5385_init(chip); 258 216 } ··· 270 220 271 221 static void claro_init(struct oxygen *chip) 272 222 { 223 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_DIG_COAX); 224 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_DIG_COAX); 273 225 ak4396_init(chip); 274 226 wm8785_init(chip); 275 227 claro_enable_hp(chip); ··· 279 227 280 228 static void claro_halo_init(struct oxygen *chip) 281 229 { 230 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CLARO_DIG_COAX); 231 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_CLARO_DIG_COAX); 282 232 ak4396_init(chip); 283 233 ak5385_init(chip); 284 234 claro_enable_hp(chip); 235 + } 236 + 237 + static void fantasia_init(struct oxygen *chip) 238 + { 239 + ak4396_init(chip); 240 + snd_component_add(chip->card, "CS5340"); 241 + } 242 + 243 + static void stereo_output_init(struct oxygen *chip) 244 + { 245 + ak4396_init(chip); 285 246 } 286 247 287 248 static void generic_cleanup(struct oxygen *chip) ··· 333 268 claro_enable_hp(chip); 334 269 } 335 270 271 + static void stereo_resume(struct oxygen *chip) 272 + { 273 + ak4396_registers_init(chip); 274 + } 275 + 336 276 static void set_ak4396_params(struct oxygen *chip, 337 277 struct snd_pcm_hw_params *params) 338 278 { ··· 356 286 msleep(1); /* wait for the new MCLK to become stable */ 357 287 358 288 if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) { 359 - for (i = 0; i < 4; ++i) { 289 + for (i = 0; i < data->dacs; ++i) { 360 290 ak4396_write(chip, i, AK4396_CONTROL_1, 361 291 AK4396_DIF_24_MSB); 362 292 ak4396_write(chip, i, AK4396_CONTROL_2, value); ··· 368 298 369 299 static void update_ak4396_volume(struct oxygen *chip) 370 300 { 301 + struct generic_data *data = chip->model_data; 371 302 unsigned int i; 372 303 373 - for (i = 0; i < 4; ++i) { 304 + for (i = 0; i < data->dacs; ++i) { 374 305 ak4396_write_cached(chip, i, AK4396_LCH_ATT, 375 306 chip->dac_volume[i * 2]); 376 307 ak4396_write_cached(chip, i, AK4396_RCH_ATT, ··· 388 317 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE; 389 318 if (chip->dac_mute) 390 319 value |= AK4396_SMUTE; 391 - for (i = 0; i < 4; ++i) 320 + for (i = 0; i < data->dacs; ++i) 392 321 ak4396_write_cached(chip, i, AK4396_CONTROL_2, value); 393 322 } 394 323 ··· 427 356 value, GPIO_AK5385_DFS_MASK); 428 357 } 429 358 359 + static void set_no_params(struct oxygen *chip, struct snd_pcm_hw_params *params) 360 + { 361 + } 362 + 430 363 static int rolloff_info(struct snd_kcontrol *ctl, 431 364 struct snd_ctl_elem_info *info) 432 365 { ··· 438 363 "Sharp Roll-off", "Slow Roll-off" 439 364 }; 440 365 441 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 442 - info->count = 1; 443 - info->value.enumerated.items = 2; 444 - if (info->value.enumerated.item >= 2) 445 - info->value.enumerated.item = 1; 446 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 447 - return 0; 366 + return snd_ctl_enum_info(info, 1, 2, names); 448 367 } 449 368 450 369 static int rolloff_get(struct snd_kcontrol *ctl, ··· 469 400 reg &= ~AK4396_SLOW; 470 401 changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; 471 402 if (changed) { 472 - for (i = 0; i < 4; ++i) 403 + for (i = 0; i < data->dacs; ++i) 473 404 ak4396_write(chip, i, AK4396_CONTROL_2, reg); 474 405 } 475 406 mutex_unlock(&chip->mutex); ··· 490 421 "None", "High-pass Filter" 491 422 }; 492 423 493 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 494 - info->count = 1; 495 - info->value.enumerated.items = 2; 496 - if (info->value.enumerated.item >= 2) 497 - info->value.enumerated.item = 1; 498 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 499 - return 0; 424 + return snd_ctl_enum_info(info, 1, 2, names); 500 425 } 501 426 502 427 static int hpf_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) ··· 529 466 .put = hpf_put, 530 467 }; 531 468 469 + static int meridian_dig_source_info(struct snd_kcontrol *ctl, 470 + struct snd_ctl_elem_info *info) 471 + { 472 + static const char *const names[2] = { "On-board", "Extension" }; 473 + 474 + return snd_ctl_enum_info(info, 1, 2, names); 475 + } 476 + 477 + static int claro_dig_source_info(struct snd_kcontrol *ctl, 478 + struct snd_ctl_elem_info *info) 479 + { 480 + static const char *const names[2] = { "Optical", "Coaxial" }; 481 + 482 + return snd_ctl_enum_info(info, 1, 2, names); 483 + } 484 + 485 + static int meridian_dig_source_get(struct snd_kcontrol *ctl, 486 + struct snd_ctl_elem_value *value) 487 + { 488 + struct oxygen *chip = ctl->private_data; 489 + 490 + value->value.enumerated.item[0] = 491 + !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & 492 + GPIO_MERIDIAN_DIG_EXT); 493 + return 0; 494 + } 495 + 496 + static int claro_dig_source_get(struct snd_kcontrol *ctl, 497 + struct snd_ctl_elem_value *value) 498 + { 499 + struct oxygen *chip = ctl->private_data; 500 + 501 + value->value.enumerated.item[0] = 502 + !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & 503 + GPIO_CLARO_DIG_COAX); 504 + return 0; 505 + } 506 + 507 + static int meridian_dig_source_put(struct snd_kcontrol *ctl, 508 + struct snd_ctl_elem_value *value) 509 + { 510 + struct oxygen *chip = ctl->private_data; 511 + u16 old_reg, new_reg; 512 + int changed; 513 + 514 + mutex_lock(&chip->mutex); 515 + old_reg = oxygen_read16(chip, OXYGEN_GPIO_DATA); 516 + new_reg = old_reg & ~GPIO_MERIDIAN_DIG_MASK; 517 + if (value->value.enumerated.item[0] == 0) 518 + new_reg |= GPIO_MERIDIAN_DIG_BOARD; 519 + else 520 + new_reg |= GPIO_MERIDIAN_DIG_EXT; 521 + changed = new_reg != old_reg; 522 + if (changed) 523 + oxygen_write16(chip, OXYGEN_GPIO_DATA, new_reg); 524 + mutex_unlock(&chip->mutex); 525 + return changed; 526 + } 527 + 528 + static int claro_dig_source_put(struct snd_kcontrol *ctl, 529 + struct snd_ctl_elem_value *value) 530 + { 531 + struct oxygen *chip = ctl->private_data; 532 + u16 old_reg, new_reg; 533 + int changed; 534 + 535 + mutex_lock(&chip->mutex); 536 + old_reg = oxygen_read16(chip, OXYGEN_GPIO_DATA); 537 + new_reg = old_reg & ~GPIO_CLARO_DIG_COAX; 538 + if (value->value.enumerated.item[0]) 539 + new_reg |= GPIO_CLARO_DIG_COAX; 540 + changed = new_reg != old_reg; 541 + if (changed) 542 + oxygen_write16(chip, OXYGEN_GPIO_DATA, new_reg); 543 + mutex_unlock(&chip->mutex); 544 + return changed; 545 + } 546 + 547 + static const struct snd_kcontrol_new meridian_dig_source_control = { 548 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 549 + .name = "IEC958 Source Capture Enum", 550 + .info = meridian_dig_source_info, 551 + .get = meridian_dig_source_get, 552 + .put = meridian_dig_source_put, 553 + }; 554 + 555 + static const struct snd_kcontrol_new claro_dig_source_control = { 556 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 557 + .name = "IEC958 Source Capture Enum", 558 + .info = claro_dig_source_info, 559 + .get = claro_dig_source_get, 560 + .put = claro_dig_source_put, 561 + }; 562 + 532 563 static int generic_mixer_init(struct oxygen *chip) 533 564 { 534 565 return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); ··· 641 484 return 0; 642 485 } 643 486 487 + static int meridian_mixer_init(struct oxygen *chip) 488 + { 489 + int err; 490 + 491 + err = generic_mixer_init(chip); 492 + if (err < 0) 493 + return err; 494 + err = snd_ctl_add(chip->card, 495 + snd_ctl_new1(&meridian_dig_source_control, chip)); 496 + if (err < 0) 497 + return err; 498 + return 0; 499 + } 500 + 501 + static int claro_mixer_init(struct oxygen *chip) 502 + { 503 + int err; 504 + 505 + err = generic_wm8785_mixer_init(chip); 506 + if (err < 0) 507 + return err; 508 + err = snd_ctl_add(chip->card, 509 + snd_ctl_new1(&claro_dig_source_control, chip)); 510 + if (err < 0) 511 + return err; 512 + return 0; 513 + } 514 + 515 + static int claro_halo_mixer_init(struct oxygen *chip) 516 + { 517 + int err; 518 + 519 + err = generic_mixer_init(chip); 520 + if (err < 0) 521 + return err; 522 + err = snd_ctl_add(chip->card, 523 + snd_ctl_new1(&claro_dig_source_control, chip)); 524 + if (err < 0) 525 + return err; 526 + return 0; 527 + } 528 + 529 + static void dump_ak4396_registers(struct oxygen *chip, 530 + struct snd_info_buffer *buffer) 531 + { 532 + struct generic_data *data = chip->model_data; 533 + unsigned int dac, i; 534 + 535 + for (dac = 0; dac < data->dacs; ++dac) { 536 + snd_iprintf(buffer, "\nAK4396 %u:", dac + 1); 537 + for (i = 0; i < 5; ++i) 538 + snd_iprintf(buffer, " %02x", data->ak4396_regs[dac][i]); 539 + } 540 + snd_iprintf(buffer, "\n"); 541 + } 542 + 543 + static void dump_wm8785_registers(struct oxygen *chip, 544 + struct snd_info_buffer *buffer) 545 + { 546 + struct generic_data *data = chip->model_data; 547 + unsigned int i; 548 + 549 + snd_iprintf(buffer, "\nWM8785:"); 550 + for (i = 0; i < 3; ++i) 551 + snd_iprintf(buffer, " %03x", data->wm8785_regs[i]); 552 + snd_iprintf(buffer, "\n"); 553 + } 554 + 555 + static void dump_oxygen_registers(struct oxygen *chip, 556 + struct snd_info_buffer *buffer) 557 + { 558 + dump_ak4396_registers(chip, buffer); 559 + dump_wm8785_registers(chip, buffer); 560 + } 561 + 644 562 static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); 645 563 646 564 static const struct oxygen_model model_generic = { ··· 726 494 .mixer_init = generic_wm8785_mixer_init, 727 495 .cleanup = generic_cleanup, 728 496 .resume = generic_resume, 729 - .get_i2s_mclk = oxygen_default_i2s_mclk, 730 497 .set_dac_params = set_ak4396_params, 731 498 .set_adc_params = set_wm8785_params, 732 499 .update_dac_volume = update_ak4396_volume, 733 500 .update_dac_mute = update_ak4396_mute, 501 + .dump_registers = dump_oxygen_registers, 734 502 .dac_tlv = ak4396_db_scale, 735 503 .model_data_size = sizeof(struct generic_data), 736 504 .device_config = PLAYBACK_0_TO_I2S | ··· 740 508 CAPTURE_1_FROM_SPDIF | 741 509 CAPTURE_2_FROM_AC97_1 | 742 510 AC97_CD_INPUT, 743 - .dac_channels = 8, 511 + .dac_channels_pcm = 8, 512 + .dac_channels_mixer = 8, 744 513 .dac_volume_min = 0, 745 514 .dac_volume_max = 255, 746 515 .function_flags = OXYGEN_FUNCTION_SPI | 747 516 OXYGEN_FUNCTION_ENABLE_SPI_4_5, 517 + .dac_mclks = OXYGEN_MCLKS(256, 128, 128), 518 + .adc_mclks = OXYGEN_MCLKS(256, 256, 128), 748 519 .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 749 520 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 750 521 }; ··· 755 520 static int __devinit get_oxygen_model(struct oxygen *chip, 756 521 const struct pci_device_id *id) 757 522 { 523 + static const char *const names[] = { 524 + [MODEL_MERIDIAN] = "AuzenTech X-Meridian", 525 + [MODEL_MERIDIAN_2G] = "AuzenTech X-Meridian 2G", 526 + [MODEL_CLARO] = "HT-Omega Claro", 527 + [MODEL_CLARO_HALO] = "HT-Omega Claro halo", 528 + [MODEL_FANTASIA] = "TempoTec HiFier Fantasia", 529 + [MODEL_SERENADE] = "TempoTec HiFier Serenade", 530 + [MODEL_HG2PCI] = "CMI8787-HG2PCI", 531 + }; 532 + 758 533 chip->model = model_generic; 759 534 switch (id->driver_data) { 760 535 case MODEL_MERIDIAN: 536 + case MODEL_MERIDIAN_2G: 761 537 chip->model.init = meridian_init; 762 - chip->model.mixer_init = generic_mixer_init; 538 + chip->model.mixer_init = meridian_mixer_init; 763 539 chip->model.resume = meridian_resume; 764 540 chip->model.set_adc_params = set_ak5385_params; 541 + chip->model.dump_registers = dump_ak4396_registers; 765 542 chip->model.device_config = PLAYBACK_0_TO_I2S | 766 543 PLAYBACK_1_TO_SPDIF | 767 544 CAPTURE_0_FROM_I2S_2 | 768 545 CAPTURE_1_FROM_SPDIF; 546 + if (id->driver_data == MODEL_MERIDIAN) 547 + chip->model.device_config |= AC97_CD_INPUT; 769 548 break; 770 549 case MODEL_CLARO: 771 550 chip->model.init = claro_init; 551 + chip->model.mixer_init = claro_mixer_init; 772 552 chip->model.cleanup = claro_cleanup; 773 553 chip->model.suspend = claro_suspend; 774 554 chip->model.resume = claro_resume; 775 555 break; 776 556 case MODEL_CLARO_HALO: 777 557 chip->model.init = claro_halo_init; 778 - chip->model.mixer_init = generic_mixer_init; 558 + chip->model.mixer_init = claro_halo_mixer_init; 779 559 chip->model.cleanup = claro_cleanup; 780 560 chip->model.suspend = claro_suspend; 781 561 chip->model.resume = claro_resume; 782 562 chip->model.set_adc_params = set_ak5385_params; 563 + chip->model.dump_registers = dump_ak4396_registers; 783 564 chip->model.device_config = PLAYBACK_0_TO_I2S | 784 565 PLAYBACK_1_TO_SPDIF | 785 566 CAPTURE_0_FROM_I2S_2 | 786 567 CAPTURE_1_FROM_SPDIF; 787 568 break; 569 + case MODEL_FANTASIA: 570 + case MODEL_SERENADE: 571 + case MODEL_2CH_OUTPUT: 572 + case MODEL_HG2PCI: 573 + chip->model.shortname = "C-Media CMI8787"; 574 + chip->model.chip = "CMI8787"; 575 + if (id->driver_data == MODEL_FANTASIA) 576 + chip->model.init = fantasia_init; 577 + else 578 + chip->model.init = stereo_output_init; 579 + chip->model.resume = stereo_resume; 580 + chip->model.mixer_init = generic_mixer_init; 581 + chip->model.set_adc_params = set_no_params; 582 + chip->model.dump_registers = dump_ak4396_registers; 583 + chip->model.device_config = PLAYBACK_0_TO_I2S | 584 + PLAYBACK_1_TO_SPDIF; 585 + if (id->driver_data == MODEL_FANTASIA) { 586 + chip->model.device_config |= CAPTURE_0_FROM_I2S_1; 587 + chip->model.adc_mclks = OXYGEN_MCLKS(256, 128, 128); 588 + } 589 + chip->model.dac_channels_pcm = 2; 590 + chip->model.dac_channels_mixer = 2; 591 + break; 592 + case MODEL_XONAR_DG: 593 + chip->model = model_xonar_dg; 594 + break; 788 595 } 789 596 if (id->driver_data == MODEL_MERIDIAN || 597 + id->driver_data == MODEL_MERIDIAN_2G || 790 598 id->driver_data == MODEL_CLARO_HALO) { 791 599 chip->model.misc_flags = OXYGEN_MISC_MIDI; 792 600 chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; 793 601 } 602 + if (id->driver_data < ARRAY_SIZE(names) && names[id->driver_data]) 603 + chip->model.shortname = names[id->driver_data]; 794 604 return 0; 795 605 } 796 606
+12 -7
sound/pci/oxygen/oxygen.h
··· 16 16 #define PCM_AC97 5 17 17 #define PCM_COUNT 6 18 18 19 + #define OXYGEN_MCLKS(f_single, f_double, f_quad) ((MCLK_##f_single << 0) | \ 20 + (MCLK_##f_double << 2) | \ 21 + (MCLK_##f_quad << 4)) 22 + 19 23 #define OXYGEN_IO_SIZE 0x100 20 24 21 25 #define OXYGEN_EEPROM_ID 0x434d /* "CM" */ ··· 39 35 #define MIDI_OUTPUT 0x0800 40 36 #define MIDI_INPUT 0x1000 41 37 #define AC97_CD_INPUT 0x2000 38 + #define AC97_FMIC_SWITCH 0x4000 42 39 43 40 enum { 44 41 CONTROL_SPDIF_PCM, ··· 70 65 struct snd_pcm_hw_params; 71 66 struct snd_kcontrol_new; 72 67 struct snd_rawmidi; 68 + struct snd_info_buffer; 73 69 struct oxygen; 74 70 75 71 struct oxygen_model { ··· 85 79 void (*resume)(struct oxygen *chip); 86 80 void (*pcm_hardware_filter)(unsigned int channel, 87 81 struct snd_pcm_hardware *hardware); 88 - unsigned int (*get_i2s_mclk)(struct oxygen *chip, unsigned int channel, 89 - struct snd_pcm_hw_params *hw_params); 90 82 void (*set_dac_params)(struct oxygen *chip, 91 83 struct snd_pcm_hw_params *params); 92 84 void (*set_adc_params)(struct oxygen *chip, ··· 96 92 void (*uart_input)(struct oxygen *chip); 97 93 void (*ac97_switch)(struct oxygen *chip, 98 94 unsigned int reg, unsigned int mute); 95 + void (*dump_registers)(struct oxygen *chip, 96 + struct snd_info_buffer *buffer); 99 97 const unsigned int *dac_tlv; 100 - unsigned long private_data; 101 98 size_t model_data_size; 102 99 unsigned int device_config; 103 - u8 dac_channels; 100 + u8 dac_channels_pcm; 101 + u8 dac_channels_mixer; 104 102 u8 dac_volume_min; 105 103 u8 dac_volume_max; 106 104 u8 misc_flags; 107 105 u8 function_flags; 106 + u8 dac_mclks; 107 + u8 adc_mclks; 108 108 u16 dac_i2s_format; 109 109 u16 adc_i2s_format; 110 110 }; ··· 129 121 u8 pcm_running; 130 122 u8 dac_routing; 131 123 u8 spdif_playback_enable; 132 - u8 revision; 133 124 u8 has_ac97_0; 134 125 u8 has_ac97_1; 135 126 u32 spdif_bits; ··· 174 167 /* oxygen_pcm.c */ 175 168 176 169 int oxygen_pcm_init(struct oxygen *chip); 177 - unsigned int oxygen_default_i2s_mclk(struct oxygen *chip, unsigned int channel, 178 - struct snd_pcm_hw_params *hw_params); 179 170 180 171 /* oxygen_io.c */ 181 172
+2 -2
sound/pci/oxygen/oxygen_io.c
··· 197 197 { 198 198 unsigned int count; 199 199 200 - /* should not need more than 7.68 us (24 * 320 ns) */ 200 + /* should not need more than 30.72 us (24 * 1.28 us) */ 201 201 count = 10; 202 202 while ((oxygen_read8(chip, OXYGEN_SPI_CONTROL) & OXYGEN_SPI_BUSY) 203 203 && count > 0) { 204 - udelay(1); 204 + udelay(4); 205 205 --count; 206 206 } 207 207
+44 -27
sound/pci/oxygen/oxygen_lib.c
··· 202 202 struct oxygen *chip = entry->private_data; 203 203 int i, j; 204 204 205 - snd_iprintf(buffer, "CMI8788\n\n"); 205 + switch (oxygen_read8(chip, OXYGEN_REVISION) & OXYGEN_PACKAGE_ID_MASK) { 206 + case OXYGEN_PACKAGE_ID_8786: i = '6'; break; 207 + case OXYGEN_PACKAGE_ID_8787: i = '7'; break; 208 + case OXYGEN_PACKAGE_ID_8788: i = '8'; break; 209 + default: i = '?'; break; 210 + } 211 + snd_iprintf(buffer, "CMI878%c:\n", i); 206 212 for (i = 0; i < OXYGEN_IO_SIZE; i += 0x10) { 207 213 snd_iprintf(buffer, "%02x:", i); 208 214 for (j = 0; j < 0x10; ++j) ··· 218 212 if (mutex_lock_interruptible(&chip->mutex) < 0) 219 213 return; 220 214 if (chip->has_ac97_0) { 221 - snd_iprintf(buffer, "\nAC97\n"); 215 + snd_iprintf(buffer, "\nAC97:\n"); 222 216 for (i = 0; i < 0x80; i += 0x10) { 223 217 snd_iprintf(buffer, "%02x:", i); 224 218 for (j = 0; j < 0x10; j += 2) ··· 228 222 } 229 223 } 230 224 if (chip->has_ac97_1) { 231 - snd_iprintf(buffer, "\nAC97 2\n"); 225 + snd_iprintf(buffer, "\nAC97 2:\n"); 232 226 for (i = 0; i < 0x80; i += 0x10) { 233 227 snd_iprintf(buffer, "%02x:", i); 234 228 for (j = 0; j < 0x10; j += 2) ··· 238 232 } 239 233 } 240 234 mutex_unlock(&chip->mutex); 235 + if (chip->model.dump_registers) 236 + chip->model.dump_registers(chip, buffer); 241 237 } 242 238 243 239 static void oxygen_proc_init(struct oxygen *chip) 244 240 { 245 241 struct snd_info_entry *entry; 246 242 247 - if (!snd_card_proc_new(chip->card, "cmi8788", &entry)) 243 + if (!snd_card_proc_new(chip->card, "oxygen", &entry)) 248 244 snd_info_set_text_ops(entry, chip, oxygen_proc_read); 249 245 } 250 246 #else ··· 270 262 */ 271 263 subdevice = oxygen_read_eeprom(chip, 2); 272 264 /* use default ID if EEPROM is missing */ 273 - if (subdevice == 0xffff) 265 + if (subdevice == 0xffff && oxygen_read_eeprom(chip, 1) == 0xffff) 274 266 subdevice = 0x8788; 275 267 /* 276 268 * We use only the subsystem device ID for searching because it is ··· 372 364 (IEC958_AES1_CON_PCM_CODER << OXYGEN_SPDIF_CATEGORY_SHIFT); 373 365 chip->spdif_pcm_bits = chip->spdif_bits; 374 366 375 - if (oxygen_read8(chip, OXYGEN_REVISION) & OXYGEN_REVISION_2) 376 - chip->revision = 2; 377 - else 378 - chip->revision = 1; 379 - 380 - if (chip->revision == 1) 367 + if (!(oxygen_read8(chip, OXYGEN_REVISION) & OXYGEN_REVISION_2)) 381 368 oxygen_set_bits8(chip, OXYGEN_MISC, 382 369 OXYGEN_MISC_PCI_MEM_W_1_CLOCK); 383 370 ··· 409 406 (OXYGEN_FORMAT_16 << OXYGEN_MULTICH_FORMAT_SHIFT)); 410 407 oxygen_write8(chip, OXYGEN_REC_CHANNELS, OXYGEN_REC_CHANNELS_2_2_2); 411 408 oxygen_write16(chip, OXYGEN_I2S_MULTICH_FORMAT, 412 - OXYGEN_RATE_48000 | chip->model.dac_i2s_format | 413 - OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | 414 - OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); 409 + OXYGEN_RATE_48000 | 410 + chip->model.dac_i2s_format | 411 + OXYGEN_I2S_MCLK(chip->model.dac_mclks) | 412 + OXYGEN_I2S_BITS_16 | 413 + OXYGEN_I2S_MASTER | 414 + OXYGEN_I2S_BCLK_64); 415 415 if (chip->model.device_config & CAPTURE_0_FROM_I2S_1) 416 416 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, 417 - OXYGEN_RATE_48000 | chip->model.adc_i2s_format | 418 - OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | 419 - OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); 417 + OXYGEN_RATE_48000 | 418 + chip->model.adc_i2s_format | 419 + OXYGEN_I2S_MCLK(chip->model.adc_mclks) | 420 + OXYGEN_I2S_BITS_16 | 421 + OXYGEN_I2S_MASTER | 422 + OXYGEN_I2S_BCLK_64); 420 423 else 421 424 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, 422 - OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); 425 + OXYGEN_I2S_MASTER | 426 + OXYGEN_I2S_MUTE_MCLK); 423 427 if (chip->model.device_config & (CAPTURE_0_FROM_I2S_2 | 424 428 CAPTURE_2_FROM_I2S_2)) 425 429 oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, 426 - OXYGEN_RATE_48000 | chip->model.adc_i2s_format | 427 - OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | 428 - OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); 430 + OXYGEN_RATE_48000 | 431 + chip->model.adc_i2s_format | 432 + OXYGEN_I2S_MCLK(chip->model.adc_mclks) | 433 + OXYGEN_I2S_BITS_16 | 434 + OXYGEN_I2S_MASTER | 435 + OXYGEN_I2S_BCLK_64); 429 436 else 430 437 oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, 431 - OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); 438 + OXYGEN_I2S_MASTER | 439 + OXYGEN_I2S_MUTE_MCLK); 432 440 oxygen_write16(chip, OXYGEN_I2S_C_FORMAT, 433 - OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); 441 + OXYGEN_I2S_MASTER | 442 + OXYGEN_I2S_MUTE_MCLK); 434 443 oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, 435 444 OXYGEN_SPDIF_OUT_ENABLE | 436 445 OXYGEN_SPDIF_LOOPBACK); ··· 572 557 oxygen_shutdown(chip); 573 558 if (chip->irq >= 0) 574 559 free_irq(chip->irq, chip); 575 - flush_scheduled_work(); 560 + flush_work_sync(&chip->spdif_input_bits_work); 561 + flush_work_sync(&chip->gpio_work); 576 562 chip->model.cleanup(chip); 577 563 kfree(chip->model_data); 578 564 mutex_destroy(&chip->mutex); ··· 664 648 665 649 strcpy(card->driver, chip->model.chip); 666 650 strcpy(card->shortname, chip->model.shortname); 667 - sprintf(card->longname, "%s (rev %u) at %#lx, irq %i", 668 - chip->model.longname, chip->revision, chip->addr, chip->irq); 651 + sprintf(card->longname, "%s at %#lx, irq %i", 652 + chip->model.longname, chip->addr, chip->irq); 669 653 strcpy(card->mixername, chip->model.chip); 670 654 snd_component_add(card, chip->model.chip); 671 655 ··· 749 733 spin_unlock_irq(&chip->reg_lock); 750 734 751 735 synchronize_irq(chip->irq); 752 - flush_scheduled_work(); 736 + flush_work_sync(&chip->spdif_input_bits_work); 737 + flush_work_sync(&chip->gpio_work); 753 738 chip->interrupt_mask = saved_interrupt_mask; 754 739 755 740 pci_disable_device(pci);
+87 -23
sound/pci/oxygen/oxygen_mixer.c
··· 31 31 struct oxygen *chip = ctl->private_data; 32 32 33 33 info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 34 - info->count = chip->model.dac_channels; 34 + info->count = chip->model.dac_channels_mixer; 35 35 info->value.integer.min = chip->model.dac_volume_min; 36 36 info->value.integer.max = chip->model.dac_volume_max; 37 37 return 0; ··· 44 44 unsigned int i; 45 45 46 46 mutex_lock(&chip->mutex); 47 - for (i = 0; i < chip->model.dac_channels; ++i) 47 + for (i = 0; i < chip->model.dac_channels_mixer; ++i) 48 48 value->value.integer.value[i] = chip->dac_volume[i]; 49 49 mutex_unlock(&chip->mutex); 50 50 return 0; ··· 59 59 60 60 changed = 0; 61 61 mutex_lock(&chip->mutex); 62 - for (i = 0; i < chip->model.dac_channels; ++i) 62 + for (i = 0; i < chip->model.dac_channels_mixer; ++i) 63 63 if (value->value.integer.value[i] != chip->dac_volume[i]) { 64 64 chip->dac_volume[i] = value->value.integer.value[i]; 65 65 changed = 1; ··· 97 97 return changed; 98 98 } 99 99 100 + static unsigned int upmix_item_count(struct oxygen *chip) 101 + { 102 + if (chip->model.dac_channels_pcm < 8) 103 + return 2; 104 + else if (chip->model.update_center_lfe_mix) 105 + return 5; 106 + else 107 + return 3; 108 + } 109 + 100 110 static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 101 111 { 102 112 static const char *const names[5] = { ··· 117 107 "Front+Surround+Center/LFE+Back", 118 108 }; 119 109 struct oxygen *chip = ctl->private_data; 120 - unsigned int count = chip->model.update_center_lfe_mix ? 5 : 3; 110 + unsigned int count = upmix_item_count(chip); 121 111 122 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 123 - info->count = 1; 124 - info->value.enumerated.items = count; 125 - if (info->value.enumerated.item >= count) 126 - info->value.enumerated.item = count - 1; 127 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 128 - return 0; 112 + return snd_ctl_enum_info(info, 1, count, names); 129 113 } 130 114 131 115 static int upmix_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) ··· 192 188 static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 193 189 { 194 190 struct oxygen *chip = ctl->private_data; 195 - unsigned int count = chip->model.update_center_lfe_mix ? 5 : 3; 191 + unsigned int count = upmix_item_count(chip); 196 192 int changed; 197 193 198 194 if (value->value.enumerated.item[0] >= count) ··· 434 430 return 0; 435 431 } 436 432 437 - static int spdif_loopback_get(struct snd_kcontrol *ctl, 438 - struct snd_ctl_elem_value *value) 433 + static int spdif_bit_switch_get(struct snd_kcontrol *ctl, 434 + struct snd_ctl_elem_value *value) 439 435 { 440 436 struct oxygen *chip = ctl->private_data; 437 + u32 bit = ctl->private_value; 441 438 442 439 value->value.integer.value[0] = 443 - !!(oxygen_read32(chip, OXYGEN_SPDIF_CONTROL) 444 - & OXYGEN_SPDIF_LOOPBACK); 440 + !!(oxygen_read32(chip, OXYGEN_SPDIF_CONTROL) & bit); 445 441 return 0; 446 442 } 447 443 448 - static int spdif_loopback_put(struct snd_kcontrol *ctl, 449 - struct snd_ctl_elem_value *value) 444 + static int spdif_bit_switch_put(struct snd_kcontrol *ctl, 445 + struct snd_ctl_elem_value *value) 450 446 { 451 447 struct oxygen *chip = ctl->private_data; 448 + u32 bit = ctl->private_value; 452 449 u32 oldreg, newreg; 453 450 int changed; 454 451 455 452 spin_lock_irq(&chip->reg_lock); 456 453 oldreg = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL); 457 454 if (value->value.integer.value[0]) 458 - newreg = oldreg | OXYGEN_SPDIF_LOOPBACK; 455 + newreg = oldreg | bit; 459 456 else 460 - newreg = oldreg & ~OXYGEN_SPDIF_LOOPBACK; 457 + newreg = oldreg & ~bit; 461 458 changed = newreg != oldreg; 462 459 if (changed) 463 460 oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, newreg); ··· 649 644 return change; 650 645 } 651 646 647 + static int mic_fmic_source_info(struct snd_kcontrol *ctl, 648 + struct snd_ctl_elem_info *info) 649 + { 650 + static const char *const names[] = { "Mic Jack", "Front Panel" }; 651 + 652 + return snd_ctl_enum_info(info, 1, 2, names); 653 + } 654 + 655 + static int mic_fmic_source_get(struct snd_kcontrol *ctl, 656 + struct snd_ctl_elem_value *value) 657 + { 658 + struct oxygen *chip = ctl->private_data; 659 + 660 + mutex_lock(&chip->mutex); 661 + value->value.enumerated.item[0] = 662 + !!(oxygen_read_ac97(chip, 0, CM9780_JACK) & CM9780_FMIC2MIC); 663 + mutex_unlock(&chip->mutex); 664 + return 0; 665 + } 666 + 667 + static int mic_fmic_source_put(struct snd_kcontrol *ctl, 668 + struct snd_ctl_elem_value *value) 669 + { 670 + struct oxygen *chip = ctl->private_data; 671 + u16 oldreg, newreg; 672 + int change; 673 + 674 + mutex_lock(&chip->mutex); 675 + oldreg = oxygen_read_ac97(chip, 0, CM9780_JACK); 676 + if (value->value.enumerated.item[0]) 677 + newreg = oldreg | CM9780_FMIC2MIC; 678 + else 679 + newreg = oldreg & ~CM9780_FMIC2MIC; 680 + change = newreg != oldreg; 681 + if (change) 682 + oxygen_write_ac97(chip, 0, CM9780_JACK, newreg); 683 + mutex_unlock(&chip->mutex); 684 + return change; 685 + } 686 + 652 687 static int ac97_fp_rec_volume_info(struct snd_kcontrol *ctl, 653 688 struct snd_ctl_elem_info *info) 654 689 { ··· 836 791 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 837 792 .name = SNDRV_CTL_NAME_IEC958("Loopback ", NONE, SWITCH), 838 793 .info = snd_ctl_boolean_mono_info, 839 - .get = spdif_loopback_get, 840 - .put = spdif_loopback_put, 794 + .get = spdif_bit_switch_get, 795 + .put = spdif_bit_switch_put, 796 + .private_value = OXYGEN_SPDIF_LOOPBACK, 797 + }, 798 + { 799 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 800 + .name = SNDRV_CTL_NAME_IEC958("Validity Check ",CAPTURE,SWITCH), 801 + .info = snd_ctl_boolean_mono_info, 802 + .get = spdif_bit_switch_get, 803 + .put = spdif_bit_switch_put, 804 + .private_value = OXYGEN_SPDIF_SPDVALID, 841 805 }, 842 806 }; 843 807 ··· 962 908 AC97_VOLUME("Mic Capture Volume", 0, AC97_MIC, 0), 963 909 AC97_SWITCH("Mic Capture Switch", 0, AC97_MIC, 15, 1), 964 910 AC97_SWITCH("Mic Boost (+20dB)", 0, AC97_MIC, 6, 0), 911 + { 912 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 913 + .name = "Mic Source Capture Enum", 914 + .info = mic_fmic_source_info, 915 + .get = mic_fmic_source_get, 916 + .put = mic_fmic_source_put, 917 + }, 965 918 AC97_SWITCH("Line Capture Switch", 0, AC97_LINE, 15, 1), 966 919 AC97_VOLUME("CD Capture Volume", 0, AC97_CD, 1), 967 920 AC97_SWITCH("CD Capture Switch", 0, AC97_CD, 15, 1), ··· 1031 970 continue; 1032 971 } 1033 972 if (!strcmp(template.name, "Stereo Upmixing") && 1034 - chip->model.dac_channels == 2) 973 + chip->model.dac_channels_pcm == 2) 974 + continue; 975 + if (!strcmp(template.name, "Mic Source Capture Enum") && 976 + !(chip->model.device_config & AC97_FMIC_SWITCH)) 1035 977 continue; 1036 978 if (!strncmp(template.name, "CD Capture ", 11) && 1037 979 !(chip->model.device_config & AC97_CD_INPUT))
+34 -21
sound/pci/oxygen/oxygen_pcm.c
··· 39 39 SNDRV_PCM_INFO_MMAP_VALID | 40 40 SNDRV_PCM_INFO_INTERLEAVED | 41 41 SNDRV_PCM_INFO_PAUSE | 42 - SNDRV_PCM_INFO_SYNC_START, 42 + SNDRV_PCM_INFO_SYNC_START | 43 + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, 43 44 .formats = SNDRV_PCM_FMTBIT_S16_LE | 44 45 SNDRV_PCM_FMTBIT_S32_LE, 45 46 .rates = SNDRV_PCM_RATE_32000 | ··· 66 65 SNDRV_PCM_INFO_MMAP_VALID | 67 66 SNDRV_PCM_INFO_INTERLEAVED | 68 67 SNDRV_PCM_INFO_PAUSE | 69 - SNDRV_PCM_INFO_SYNC_START, 68 + SNDRV_PCM_INFO_SYNC_START | 69 + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, 70 70 .formats = SNDRV_PCM_FMTBIT_S16_LE | 71 71 SNDRV_PCM_FMTBIT_S32_LE, 72 72 .rates = SNDRV_PCM_RATE_32000 | ··· 93 91 SNDRV_PCM_INFO_MMAP_VALID | 94 92 SNDRV_PCM_INFO_INTERLEAVED | 95 93 SNDRV_PCM_INFO_PAUSE | 96 - SNDRV_PCM_INFO_SYNC_START, 94 + SNDRV_PCM_INFO_SYNC_START | 95 + SNDRV_PCM_INFO_NO_PERIOD_WAKEUP, 97 96 .formats = SNDRV_PCM_FMTBIT_S16_LE, 98 97 .rates = SNDRV_PCM_RATE_48000, 99 98 .rate_min = 48000, ··· 143 140 runtime->hw.rate_min = 44100; 144 141 break; 145 142 case PCM_MULTICH: 146 - runtime->hw.channels_max = chip->model.dac_channels; 143 + runtime->hw.channels_max = chip->model.dac_channels_pcm; 147 144 break; 148 145 } 149 146 if (chip->model.pcm_hardware_filter) ··· 274 271 } 275 272 } 276 273 277 - unsigned int oxygen_default_i2s_mclk(struct oxygen *chip, 278 - unsigned int channel, 279 - struct snd_pcm_hw_params *hw_params) 280 - { 281 - if (params_rate(hw_params) <= 96000) 282 - return OXYGEN_I2S_MCLK_256; 283 - else 284 - return OXYGEN_I2S_MCLK_128; 285 - } 286 - EXPORT_SYMBOL(oxygen_default_i2s_mclk); 287 - 288 274 static unsigned int oxygen_i2s_bits(struct snd_pcm_hw_params *hw_params) 289 275 { 290 276 if (params_format(hw_params) == SNDRV_PCM_FORMAT_S32_LE) ··· 333 341 return 0; 334 342 } 335 343 344 + static u16 get_mclk(struct oxygen *chip, unsigned int channel, 345 + struct snd_pcm_hw_params *params) 346 + { 347 + unsigned int mclks, shift; 348 + 349 + if (channel == PCM_MULTICH) 350 + mclks = chip->model.dac_mclks; 351 + else 352 + mclks = chip->model.adc_mclks; 353 + 354 + if (params_rate(params) <= 48000) 355 + shift = 0; 356 + else if (params_rate(params) <= 96000) 357 + shift = 2; 358 + else 359 + shift = 4; 360 + 361 + return OXYGEN_I2S_MCLK(mclks >> shift); 362 + } 363 + 336 364 static int oxygen_rec_a_hw_params(struct snd_pcm_substream *substream, 337 365 struct snd_pcm_hw_params *hw_params) 338 366 { ··· 369 357 OXYGEN_REC_FORMAT_A_MASK); 370 358 oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, 371 359 oxygen_rate(hw_params) | 372 - chip->model.get_i2s_mclk(chip, PCM_A, hw_params) | 373 360 chip->model.adc_i2s_format | 361 + get_mclk(chip, PCM_A, hw_params) | 374 362 oxygen_i2s_bits(hw_params), 375 363 OXYGEN_I2S_RATE_MASK | 376 364 OXYGEN_I2S_FORMAT_MASK | ··· 405 393 if (!is_ac97) 406 394 oxygen_write16_masked(chip, OXYGEN_I2S_B_FORMAT, 407 395 oxygen_rate(hw_params) | 408 - chip->model.get_i2s_mclk(chip, PCM_B, 409 - hw_params) | 410 396 chip->model.adc_i2s_format | 397 + get_mclk(chip, PCM_B, hw_params) | 411 398 oxygen_i2s_bits(hw_params), 412 399 OXYGEN_I2S_RATE_MASK | 413 400 OXYGEN_I2S_FORMAT_MASK | ··· 487 476 oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, 488 477 oxygen_rate(hw_params) | 489 478 chip->model.dac_i2s_format | 490 - chip->model.get_i2s_mclk(chip, PCM_MULTICH, 491 - hw_params) | 479 + get_mclk(chip, PCM_MULTICH, hw_params) | 492 480 oxygen_i2s_bits(hw_params), 493 481 OXYGEN_I2S_RATE_MASK | 494 482 OXYGEN_I2S_FORMAT_MASK | ··· 540 530 oxygen_set_bits8(chip, OXYGEN_DMA_FLUSH, channel_mask); 541 531 oxygen_clear_bits8(chip, OXYGEN_DMA_FLUSH, channel_mask); 542 532 543 - chip->interrupt_mask |= channel_mask; 533 + if (substream->runtime->no_period_wakeup) 534 + chip->interrupt_mask &= ~channel_mask; 535 + else 536 + chip->interrupt_mask |= channel_mask; 544 537 oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); 545 538 spin_unlock_irq(&chip->reg_lock); 546 539 return 0;
+9 -7
sound/pci/oxygen/oxygen_regs.h
··· 139 139 #define OXYGEN_I2S_FORMAT_I2S 0x0000 140 140 #define OXYGEN_I2S_FORMAT_LJUST 0x0008 141 141 #define OXYGEN_I2S_MCLK_MASK 0x0030 /* MCLK/LRCK */ 142 - #define OXYGEN_I2S_MCLK_128 0x0000 143 - #define OXYGEN_I2S_MCLK_256 0x0010 144 - #define OXYGEN_I2S_MCLK_512 0x0020 142 + #define OXYGEN_I2S_MCLK_SHIFT 4 143 + #define MCLK_128 0 144 + #define MCLK_256 1 145 + #define MCLK_512 2 146 + #define OXYGEN_I2S_MCLK(f) (((f) & 3) << OXYGEN_I2S_MCLK_SHIFT) 145 147 #define OXYGEN_I2S_BITS_MASK 0x00c0 146 148 #define OXYGEN_I2S_BITS_16 0x0000 147 149 #define OXYGEN_I2S_BITS_20 0x0040 ··· 240 238 #define OXYGEN_SPI_DATA_LENGTH_MASK 0x02 241 239 #define OXYGEN_SPI_DATA_LENGTH_2 0x00 242 240 #define OXYGEN_SPI_DATA_LENGTH_3 0x02 243 - #define OXYGEN_SPI_CLOCK_MASK 0xc0 241 + #define OXYGEN_SPI_CLOCK_MASK 0x0c 244 242 #define OXYGEN_SPI_CLOCK_160 0x00 /* ns */ 245 - #define OXYGEN_SPI_CLOCK_320 0x40 246 - #define OXYGEN_SPI_CLOCK_640 0x80 247 - #define OXYGEN_SPI_CLOCK_1280 0xc0 243 + #define OXYGEN_SPI_CLOCK_320 0x04 244 + #define OXYGEN_SPI_CLOCK_640 0x08 245 + #define OXYGEN_SPI_CLOCK_1280 0x0c 248 246 #define OXYGEN_SPI_CODEC_MASK 0x70 /* 0..5 */ 249 247 #define OXYGEN_SPI_CODEC_SHIFT 4 250 248 #define OXYGEN_SPI_CEN_MASK 0x80
+2
sound/pci/oxygen/xonar.h
··· 24 24 void xonar_init_cs53x1(struct oxygen *chip); 25 25 void xonar_set_cs53x1_params(struct oxygen *chip, 26 26 struct snd_pcm_hw_params *params); 27 + 28 + #define XONAR_GPIO_BIT_INVERT (1 << 16) 27 29 int xonar_gpio_bit_switch_get(struct snd_kcontrol *ctl, 28 30 struct snd_ctl_elem_value *value); 29 31 int xonar_gpio_bit_switch_put(struct snd_kcontrol *ctl,
+54 -32
sound/pci/oxygen/xonar_cs43xx.c
··· 22 22 * 23 23 * CMI8788: 24 24 * 25 - * I²C <-> CS4398 (front) 26 - * <-> CS4362A (surround, center/LFE, back) 25 + * I²C <-> CS4398 (addr 1001111) (front) 26 + * <-> CS4362A (addr 0011000) (surround, center/LFE, back) 27 27 * 28 - * GPI 0 <- external power present (DX only) 28 + * GPI 0 <- external power present (DX only) 29 29 * 30 - * GPIO 0 -> enable output to speakers 31 - * GPIO 1 -> enable front panel I/O 32 - * GPIO 2 -> M0 of CS5361 33 - * GPIO 3 -> M1 of CS5361 34 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 35 - * 36 - * CS4398: 37 - * 38 - * AD0 <- 1 39 - * AD1 <- 1 40 - * 41 - * CS4362A: 42 - * 43 - * AD0 <- 0 30 + * GPIO 0 -> enable output to speakers 31 + * GPIO 1 -> route output to front panel 32 + * GPIO 2 -> M0 of CS5361 33 + * GPIO 3 -> M1 of CS5361 34 + * GPIO 6 -> ? 35 + * GPIO 7 -> ? 36 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 44 37 * 45 38 * CM9780: 46 39 * 47 - * GPO 0 -> route line-in (0) or AC97 output (1) to CS5361 input 40 + * LINE_OUT -> input of ADC 41 + * 42 + * AUX_IN <- aux 43 + * MIC_IN <- mic 44 + * FMIC_IN <- front mic 45 + * 46 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5361 input 48 47 */ 49 48 50 49 #include <linux/pci.h> ··· 62 63 #define GPI_EXT_POWER 0x01 63 64 #define GPIO_D1_OUTPUT_ENABLE 0x0001 64 65 #define GPIO_D1_FRONT_PANEL 0x0002 66 + #define GPIO_D1_MAGIC 0x00c0 65 67 #define GPIO_D1_INPUT_ROUTE 0x0100 66 68 67 69 #define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ ··· 169 169 cs43xx_registers_init(chip); 170 170 171 171 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 172 - GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); 172 + GPIO_D1_FRONT_PANEL | 173 + GPIO_D1_MAGIC | 174 + GPIO_D1_INPUT_ROUTE); 173 175 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 174 176 GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); 175 - 176 - oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); 177 177 178 178 xonar_init_cs53x1(chip); 179 179 xonar_enable_output(chip); ··· 284 284 285 285 static const struct snd_kcontrol_new front_panel_switch = { 286 286 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 287 - .name = "Front Panel Switch", 287 + .name = "Front Panel Playback Switch", 288 288 .info = snd_ctl_boolean_mono_info, 289 289 .get = xonar_gpio_bit_switch_get, 290 290 .put = xonar_gpio_bit_switch_put, ··· 298 298 "Fast Roll-off", "Slow Roll-off" 299 299 }; 300 300 301 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 302 - info->count = 1; 303 - info->value.enumerated.items = 2; 304 - if (info->value.enumerated.item >= 2) 305 - info->value.enumerated.item = 1; 306 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 307 - return 0; 301 + return snd_ctl_enum_info(info, 1, 2, names); 308 302 } 309 303 310 304 static int rolloff_get(struct snd_kcontrol *ctl, ··· 374 380 return 0; 375 381 } 376 382 383 + static void dump_cs4362a_registers(struct xonar_cs43xx *data, 384 + struct snd_info_buffer *buffer) 385 + { 386 + unsigned int i; 387 + 388 + snd_iprintf(buffer, "\nCS4362A:"); 389 + for (i = 1; i <= 14; ++i) 390 + snd_iprintf(buffer, " %02x", data->cs4362a_regs[i]); 391 + snd_iprintf(buffer, "\n"); 392 + } 393 + 394 + static void dump_d1_registers(struct oxygen *chip, 395 + struct snd_info_buffer *buffer) 396 + { 397 + struct xonar_cs43xx *data = chip->model_data; 398 + unsigned int i; 399 + 400 + snd_iprintf(buffer, "\nCS4398: 7?"); 401 + for (i = 2; i <= 8; ++i) 402 + snd_iprintf(buffer, " %02x", data->cs4398_regs[i]); 403 + snd_iprintf(buffer, "\n"); 404 + dump_cs4362a_registers(data, buffer); 405 + } 406 + 377 407 static const struct oxygen_model model_xonar_d1 = { 378 408 .longname = "Asus Virtuoso 100", 379 409 .chip = "AV200", ··· 406 388 .cleanup = xonar_d1_cleanup, 407 389 .suspend = xonar_d1_suspend, 408 390 .resume = xonar_d1_resume, 409 - .get_i2s_mclk = oxygen_default_i2s_mclk, 410 391 .set_dac_params = set_cs43xx_params, 411 392 .set_adc_params = xonar_set_cs53x1_params, 412 393 .update_dac_volume = update_cs43xx_volume, 413 394 .update_dac_mute = update_cs43xx_mute, 414 395 .update_center_lfe_mix = update_cs43xx_center_lfe_mix, 415 396 .ac97_switch = xonar_d1_line_mic_ac97_switch, 397 + .dump_registers = dump_d1_registers, 416 398 .dac_tlv = cs4362a_db_scale, 417 399 .model_data_size = sizeof(struct xonar_cs43xx), 418 400 .device_config = PLAYBACK_0_TO_I2S | 419 401 PLAYBACK_1_TO_SPDIF | 420 - CAPTURE_0_FROM_I2S_2, 421 - .dac_channels = 8, 402 + CAPTURE_0_FROM_I2S_2 | 403 + AC97_FMIC_SWITCH, 404 + .dac_channels_pcm = 8, 405 + .dac_channels_mixer = 8, 422 406 .dac_volume_min = 127 - 60, 423 407 .dac_volume_max = 127, 424 408 .function_flags = OXYGEN_FUNCTION_2WIRE, 409 + .dac_mclks = OXYGEN_MCLKS(256, 128, 128), 410 + .adc_mclks = OXYGEN_MCLKS(256, 128, 128), 425 411 .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 426 412 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 427 413 };
+572
sound/pci/oxygen/xonar_dg.c
··· 1 + /* 2 + * card driver for the Xonar DG 3 + * 4 + * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 + * 6 + * 7 + * This driver is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License, version 2. 9 + * 10 + * This driver is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this driver; if not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + /* 20 + * Xonar DG 21 + * -------- 22 + * 23 + * CMI8788: 24 + * 25 + * SPI 0 -> CS4245 26 + * 27 + * GPIO 3 <- ? 28 + * GPIO 4 <- headphone detect 29 + * GPIO 5 -> route input jack to line-in (0) or mic-in (1) 30 + * GPIO 6 -> route input jack to line-in (0) or mic-in (1) 31 + * GPIO 7 -> enable rear headphone amp 32 + * GPIO 8 -> enable output to speakers 33 + * 34 + * CS4245: 35 + * 36 + * input 1 <- aux 37 + * input 2 <- front mic 38 + * input 4 <- line/mic 39 + * aux out -> front panel headphones 40 + */ 41 + 42 + #include <linux/pci.h> 43 + #include <linux/delay.h> 44 + #include <sound/control.h> 45 + #include <sound/core.h> 46 + #include <sound/info.h> 47 + #include <sound/pcm.h> 48 + #include <sound/tlv.h> 49 + #include "oxygen.h" 50 + #include "xonar_dg.h" 51 + #include "cs4245.h" 52 + 53 + #define GPIO_MAGIC 0x0008 54 + #define GPIO_HP_DETECT 0x0010 55 + #define GPIO_INPUT_ROUTE 0x0060 56 + #define GPIO_HP_REAR 0x0080 57 + #define GPIO_OUTPUT_ENABLE 0x0100 58 + 59 + struct dg { 60 + unsigned int output_sel; 61 + s8 input_vol[4][2]; 62 + unsigned int input_sel; 63 + u8 hp_vol_att; 64 + u8 cs4245_regs[0x11]; 65 + }; 66 + 67 + static void cs4245_write(struct oxygen *chip, unsigned int reg, u8 value) 68 + { 69 + struct dg *data = chip->model_data; 70 + 71 + oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 72 + OXYGEN_SPI_DATA_LENGTH_3 | 73 + OXYGEN_SPI_CLOCK_1280 | 74 + (0 << OXYGEN_SPI_CODEC_SHIFT) | 75 + OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 76 + CS4245_SPI_ADDRESS | 77 + CS4245_SPI_WRITE | 78 + (value << 8) | reg); 79 + data->cs4245_regs[reg] = value; 80 + } 81 + 82 + static void cs4245_write_cached(struct oxygen *chip, unsigned int reg, u8 value) 83 + { 84 + struct dg *data = chip->model_data; 85 + 86 + if (value != data->cs4245_regs[reg]) 87 + cs4245_write(chip, reg, value); 88 + } 89 + 90 + static void cs4245_registers_init(struct oxygen *chip) 91 + { 92 + struct dg *data = chip->model_data; 93 + 94 + cs4245_write(chip, CS4245_POWER_CTRL, CS4245_PDN); 95 + cs4245_write(chip, CS4245_DAC_CTRL_1, 96 + data->cs4245_regs[CS4245_DAC_CTRL_1]); 97 + cs4245_write(chip, CS4245_ADC_CTRL, 98 + data->cs4245_regs[CS4245_ADC_CTRL]); 99 + cs4245_write(chip, CS4245_SIGNAL_SEL, 100 + data->cs4245_regs[CS4245_SIGNAL_SEL]); 101 + cs4245_write(chip, CS4245_PGA_B_CTRL, 102 + data->cs4245_regs[CS4245_PGA_B_CTRL]); 103 + cs4245_write(chip, CS4245_PGA_A_CTRL, 104 + data->cs4245_regs[CS4245_PGA_A_CTRL]); 105 + cs4245_write(chip, CS4245_ANALOG_IN, 106 + data->cs4245_regs[CS4245_ANALOG_IN]); 107 + cs4245_write(chip, CS4245_DAC_A_CTRL, 108 + data->cs4245_regs[CS4245_DAC_A_CTRL]); 109 + cs4245_write(chip, CS4245_DAC_B_CTRL, 110 + data->cs4245_regs[CS4245_DAC_B_CTRL]); 111 + cs4245_write(chip, CS4245_DAC_CTRL_2, 112 + CS4245_DAC_SOFT | CS4245_DAC_ZERO | CS4245_INVERT_DAC); 113 + cs4245_write(chip, CS4245_INT_MASK, 0); 114 + cs4245_write(chip, CS4245_POWER_CTRL, 0); 115 + } 116 + 117 + static void cs4245_init(struct oxygen *chip) 118 + { 119 + struct dg *data = chip->model_data; 120 + 121 + data->cs4245_regs[CS4245_DAC_CTRL_1] = 122 + CS4245_DAC_FM_SINGLE | CS4245_DAC_DIF_LJUST; 123 + data->cs4245_regs[CS4245_ADC_CTRL] = 124 + CS4245_ADC_FM_SINGLE | CS4245_ADC_DIF_LJUST; 125 + data->cs4245_regs[CS4245_SIGNAL_SEL] = 126 + CS4245_A_OUT_SEL_HIZ | CS4245_ASYNCH; 127 + data->cs4245_regs[CS4245_PGA_B_CTRL] = 0; 128 + data->cs4245_regs[CS4245_PGA_A_CTRL] = 0; 129 + data->cs4245_regs[CS4245_ANALOG_IN] = 130 + CS4245_PGA_SOFT | CS4245_PGA_ZERO | CS4245_SEL_INPUT_4; 131 + data->cs4245_regs[CS4245_DAC_A_CTRL] = 0; 132 + data->cs4245_regs[CS4245_DAC_B_CTRL] = 0; 133 + cs4245_registers_init(chip); 134 + snd_component_add(chip->card, "CS4245"); 135 + } 136 + 137 + static void dg_output_enable(struct oxygen *chip) 138 + { 139 + msleep(2500); 140 + oxygen_set_bits16(chip, OXYGEN_GPIO_DATA, GPIO_OUTPUT_ENABLE); 141 + } 142 + 143 + static void dg_init(struct oxygen *chip) 144 + { 145 + struct dg *data = chip->model_data; 146 + 147 + data->output_sel = 0; 148 + data->input_sel = 3; 149 + data->hp_vol_att = 2 * 16; 150 + 151 + cs4245_init(chip); 152 + 153 + oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, 154 + GPIO_MAGIC | GPIO_HP_DETECT); 155 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 156 + GPIO_INPUT_ROUTE | GPIO_HP_REAR | GPIO_OUTPUT_ENABLE); 157 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 158 + GPIO_INPUT_ROUTE | GPIO_HP_REAR); 159 + dg_output_enable(chip); 160 + } 161 + 162 + static void dg_cleanup(struct oxygen *chip) 163 + { 164 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_OUTPUT_ENABLE); 165 + } 166 + 167 + static void dg_suspend(struct oxygen *chip) 168 + { 169 + dg_cleanup(chip); 170 + } 171 + 172 + static void dg_resume(struct oxygen *chip) 173 + { 174 + cs4245_registers_init(chip); 175 + dg_output_enable(chip); 176 + } 177 + 178 + static void set_cs4245_dac_params(struct oxygen *chip, 179 + struct snd_pcm_hw_params *params) 180 + { 181 + struct dg *data = chip->model_data; 182 + u8 value; 183 + 184 + value = data->cs4245_regs[CS4245_DAC_CTRL_1] & ~CS4245_DAC_FM_MASK; 185 + if (params_rate(params) <= 50000) 186 + value |= CS4245_DAC_FM_SINGLE; 187 + else if (params_rate(params) <= 100000) 188 + value |= CS4245_DAC_FM_DOUBLE; 189 + else 190 + value |= CS4245_DAC_FM_QUAD; 191 + cs4245_write_cached(chip, CS4245_DAC_CTRL_1, value); 192 + } 193 + 194 + static void set_cs4245_adc_params(struct oxygen *chip, 195 + struct snd_pcm_hw_params *params) 196 + { 197 + struct dg *data = chip->model_data; 198 + u8 value; 199 + 200 + value = data->cs4245_regs[CS4245_ADC_CTRL] & ~CS4245_ADC_FM_MASK; 201 + if (params_rate(params) <= 50000) 202 + value |= CS4245_ADC_FM_SINGLE; 203 + else if (params_rate(params) <= 100000) 204 + value |= CS4245_ADC_FM_DOUBLE; 205 + else 206 + value |= CS4245_ADC_FM_QUAD; 207 + cs4245_write_cached(chip, CS4245_ADC_CTRL, value); 208 + } 209 + 210 + static int output_switch_info(struct snd_kcontrol *ctl, 211 + struct snd_ctl_elem_info *info) 212 + { 213 + static const char *const names[3] = { 214 + "Speakers", "Headphones", "FP Headphones" 215 + }; 216 + 217 + return snd_ctl_enum_info(info, 1, 3, names); 218 + } 219 + 220 + static int output_switch_get(struct snd_kcontrol *ctl, 221 + struct snd_ctl_elem_value *value) 222 + { 223 + struct oxygen *chip = ctl->private_data; 224 + struct dg *data = chip->model_data; 225 + 226 + mutex_lock(&chip->mutex); 227 + value->value.enumerated.item[0] = data->output_sel; 228 + mutex_unlock(&chip->mutex); 229 + return 0; 230 + } 231 + 232 + static int output_switch_put(struct snd_kcontrol *ctl, 233 + struct snd_ctl_elem_value *value) 234 + { 235 + struct oxygen *chip = ctl->private_data; 236 + struct dg *data = chip->model_data; 237 + u8 reg; 238 + int changed; 239 + 240 + if (value->value.enumerated.item[0] > 2) 241 + return -EINVAL; 242 + 243 + mutex_lock(&chip->mutex); 244 + changed = value->value.enumerated.item[0] != data->output_sel; 245 + if (changed) { 246 + data->output_sel = value->value.enumerated.item[0]; 247 + 248 + reg = data->cs4245_regs[CS4245_SIGNAL_SEL] & 249 + ~CS4245_A_OUT_SEL_MASK; 250 + reg |= data->output_sel == 2 ? 251 + CS4245_A_OUT_SEL_DAC : CS4245_A_OUT_SEL_HIZ; 252 + cs4245_write_cached(chip, CS4245_SIGNAL_SEL, reg); 253 + 254 + cs4245_write_cached(chip, CS4245_DAC_A_CTRL, 255 + data->output_sel ? data->hp_vol_att : 0); 256 + cs4245_write_cached(chip, CS4245_DAC_B_CTRL, 257 + data->output_sel ? data->hp_vol_att : 0); 258 + 259 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 260 + data->output_sel == 1 ? GPIO_HP_REAR : 0, 261 + GPIO_HP_REAR); 262 + } 263 + mutex_unlock(&chip->mutex); 264 + return changed; 265 + } 266 + 267 + static int hp_volume_offset_info(struct snd_kcontrol *ctl, 268 + struct snd_ctl_elem_info *info) 269 + { 270 + static const char *const names[3] = { 271 + "< 64 ohms", "64-150 ohms", "150-300 ohms" 272 + }; 273 + 274 + return snd_ctl_enum_info(info, 1, 3, names); 275 + } 276 + 277 + static int hp_volume_offset_get(struct snd_kcontrol *ctl, 278 + struct snd_ctl_elem_value *value) 279 + { 280 + struct oxygen *chip = ctl->private_data; 281 + struct dg *data = chip->model_data; 282 + 283 + mutex_lock(&chip->mutex); 284 + if (data->hp_vol_att > 2 * 7) 285 + value->value.enumerated.item[0] = 0; 286 + else if (data->hp_vol_att > 0) 287 + value->value.enumerated.item[0] = 1; 288 + else 289 + value->value.enumerated.item[0] = 2; 290 + mutex_unlock(&chip->mutex); 291 + return 0; 292 + } 293 + 294 + static int hp_volume_offset_put(struct snd_kcontrol *ctl, 295 + struct snd_ctl_elem_value *value) 296 + { 297 + static const s8 atts[3] = { 2 * 16, 2 * 7, 0 }; 298 + struct oxygen *chip = ctl->private_data; 299 + struct dg *data = chip->model_data; 300 + s8 att; 301 + int changed; 302 + 303 + if (value->value.enumerated.item[0] > 2) 304 + return -EINVAL; 305 + att = atts[value->value.enumerated.item[0]]; 306 + mutex_lock(&chip->mutex); 307 + changed = att != data->hp_vol_att; 308 + if (changed) { 309 + data->hp_vol_att = att; 310 + if (data->output_sel) { 311 + cs4245_write_cached(chip, CS4245_DAC_A_CTRL, att); 312 + cs4245_write_cached(chip, CS4245_DAC_B_CTRL, att); 313 + } 314 + } 315 + mutex_unlock(&chip->mutex); 316 + return changed; 317 + } 318 + 319 + static int input_vol_info(struct snd_kcontrol *ctl, 320 + struct snd_ctl_elem_info *info) 321 + { 322 + info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 323 + info->count = 2; 324 + info->value.integer.min = 2 * -12; 325 + info->value.integer.max = 2 * 12; 326 + return 0; 327 + } 328 + 329 + static int input_vol_get(struct snd_kcontrol *ctl, 330 + struct snd_ctl_elem_value *value) 331 + { 332 + struct oxygen *chip = ctl->private_data; 333 + struct dg *data = chip->model_data; 334 + unsigned int idx = ctl->private_value; 335 + 336 + mutex_lock(&chip->mutex); 337 + value->value.integer.value[0] = data->input_vol[idx][0]; 338 + value->value.integer.value[1] = data->input_vol[idx][1]; 339 + mutex_unlock(&chip->mutex); 340 + return 0; 341 + } 342 + 343 + static int input_vol_put(struct snd_kcontrol *ctl, 344 + struct snd_ctl_elem_value *value) 345 + { 346 + struct oxygen *chip = ctl->private_data; 347 + struct dg *data = chip->model_data; 348 + unsigned int idx = ctl->private_value; 349 + int changed = 0; 350 + 351 + if (value->value.integer.value[0] < 2 * -12 || 352 + value->value.integer.value[0] > 2 * 12 || 353 + value->value.integer.value[1] < 2 * -12 || 354 + value->value.integer.value[1] > 2 * 12) 355 + return -EINVAL; 356 + mutex_lock(&chip->mutex); 357 + changed = data->input_vol[idx][0] != value->value.integer.value[0] || 358 + data->input_vol[idx][1] != value->value.integer.value[1]; 359 + if (changed) { 360 + data->input_vol[idx][0] = value->value.integer.value[0]; 361 + data->input_vol[idx][1] = value->value.integer.value[1]; 362 + if (idx == data->input_sel) { 363 + cs4245_write_cached(chip, CS4245_PGA_A_CTRL, 364 + data->input_vol[idx][0]); 365 + cs4245_write_cached(chip, CS4245_PGA_B_CTRL, 366 + data->input_vol[idx][1]); 367 + } 368 + } 369 + mutex_unlock(&chip->mutex); 370 + return changed; 371 + } 372 + 373 + static DECLARE_TLV_DB_SCALE(cs4245_pga_db_scale, -1200, 50, 0); 374 + 375 + static int input_sel_info(struct snd_kcontrol *ctl, 376 + struct snd_ctl_elem_info *info) 377 + { 378 + static const char *const names[4] = { 379 + "Mic", "Aux", "Front Mic", "Line" 380 + }; 381 + 382 + return snd_ctl_enum_info(info, 1, 4, names); 383 + } 384 + 385 + static int input_sel_get(struct snd_kcontrol *ctl, 386 + struct snd_ctl_elem_value *value) 387 + { 388 + struct oxygen *chip = ctl->private_data; 389 + struct dg *data = chip->model_data; 390 + 391 + mutex_lock(&chip->mutex); 392 + value->value.enumerated.item[0] = data->input_sel; 393 + mutex_unlock(&chip->mutex); 394 + return 0; 395 + } 396 + 397 + static int input_sel_put(struct snd_kcontrol *ctl, 398 + struct snd_ctl_elem_value *value) 399 + { 400 + static const u8 sel_values[4] = { 401 + CS4245_SEL_MIC, 402 + CS4245_SEL_INPUT_1, 403 + CS4245_SEL_INPUT_2, 404 + CS4245_SEL_INPUT_4 405 + }; 406 + struct oxygen *chip = ctl->private_data; 407 + struct dg *data = chip->model_data; 408 + int changed; 409 + 410 + if (value->value.enumerated.item[0] > 3) 411 + return -EINVAL; 412 + 413 + mutex_lock(&chip->mutex); 414 + changed = value->value.enumerated.item[0] != data->input_sel; 415 + if (changed) { 416 + data->input_sel = value->value.enumerated.item[0]; 417 + 418 + cs4245_write(chip, CS4245_ANALOG_IN, 419 + (data->cs4245_regs[CS4245_ANALOG_IN] & 420 + ~CS4245_SEL_MASK) | 421 + sel_values[data->input_sel]); 422 + 423 + cs4245_write_cached(chip, CS4245_PGA_A_CTRL, 424 + data->input_vol[data->input_sel][0]); 425 + cs4245_write_cached(chip, CS4245_PGA_B_CTRL, 426 + data->input_vol[data->input_sel][1]); 427 + 428 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 429 + data->input_sel ? 0 : GPIO_INPUT_ROUTE, 430 + GPIO_INPUT_ROUTE); 431 + } 432 + mutex_unlock(&chip->mutex); 433 + return changed; 434 + } 435 + 436 + static int hpf_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 437 + { 438 + static const char *const names[2] = { "Active", "Frozen" }; 439 + 440 + return snd_ctl_enum_info(info, 1, 2, names); 441 + } 442 + 443 + static int hpf_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 444 + { 445 + struct oxygen *chip = ctl->private_data; 446 + struct dg *data = chip->model_data; 447 + 448 + value->value.enumerated.item[0] = 449 + !!(data->cs4245_regs[CS4245_ADC_CTRL] & CS4245_HPF_FREEZE); 450 + return 0; 451 + } 452 + 453 + static int hpf_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 454 + { 455 + struct oxygen *chip = ctl->private_data; 456 + struct dg *data = chip->model_data; 457 + u8 reg; 458 + int changed; 459 + 460 + mutex_lock(&chip->mutex); 461 + reg = data->cs4245_regs[CS4245_ADC_CTRL] & ~CS4245_HPF_FREEZE; 462 + if (value->value.enumerated.item[0]) 463 + reg |= CS4245_HPF_FREEZE; 464 + changed = reg != data->cs4245_regs[CS4245_ADC_CTRL]; 465 + if (changed) 466 + cs4245_write(chip, CS4245_ADC_CTRL, reg); 467 + mutex_unlock(&chip->mutex); 468 + return changed; 469 + } 470 + 471 + #define INPUT_VOLUME(xname, index) { \ 472 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 473 + .name = xname, \ 474 + .info = input_vol_info, \ 475 + .get = input_vol_get, \ 476 + .put = input_vol_put, \ 477 + .tlv = { .p = cs4245_pga_db_scale }, \ 478 + .private_value = index, \ 479 + } 480 + static const struct snd_kcontrol_new dg_controls[] = { 481 + { 482 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 483 + .name = "Analog Output Playback Enum", 484 + .info = output_switch_info, 485 + .get = output_switch_get, 486 + .put = output_switch_put, 487 + }, 488 + { 489 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 490 + .name = "Headphones Impedance Playback Enum", 491 + .info = hp_volume_offset_info, 492 + .get = hp_volume_offset_get, 493 + .put = hp_volume_offset_put, 494 + }, 495 + INPUT_VOLUME("Mic Capture Volume", 0), 496 + INPUT_VOLUME("Aux Capture Volume", 1), 497 + INPUT_VOLUME("Front Mic Capture Volume", 2), 498 + INPUT_VOLUME("Line Capture Volume", 3), 499 + { 500 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 501 + .name = "Capture Source", 502 + .info = input_sel_info, 503 + .get = input_sel_get, 504 + .put = input_sel_put, 505 + }, 506 + { 507 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 508 + .name = "ADC High-pass Filter Capture Enum", 509 + .info = hpf_info, 510 + .get = hpf_get, 511 + .put = hpf_put, 512 + }, 513 + }; 514 + 515 + static int dg_control_filter(struct snd_kcontrol_new *template) 516 + { 517 + if (!strncmp(template->name, "Master Playback ", 16)) 518 + return 1; 519 + return 0; 520 + } 521 + 522 + static int dg_mixer_init(struct oxygen *chip) 523 + { 524 + unsigned int i; 525 + int err; 526 + 527 + for (i = 0; i < ARRAY_SIZE(dg_controls); ++i) { 528 + err = snd_ctl_add(chip->card, 529 + snd_ctl_new1(&dg_controls[i], chip)); 530 + if (err < 0) 531 + return err; 532 + } 533 + return 0; 534 + } 535 + 536 + static void dump_cs4245_registers(struct oxygen *chip, 537 + struct snd_info_buffer *buffer) 538 + { 539 + struct dg *data = chip->model_data; 540 + unsigned int i; 541 + 542 + snd_iprintf(buffer, "\nCS4245:"); 543 + for (i = 1; i <= 0x10; ++i) 544 + snd_iprintf(buffer, " %02x", data->cs4245_regs[i]); 545 + snd_iprintf(buffer, "\n"); 546 + } 547 + 548 + struct oxygen_model model_xonar_dg = { 549 + .shortname = "Xonar DG", 550 + .longname = "C-Media Oxygen HD Audio", 551 + .chip = "CMI8786", 552 + .init = dg_init, 553 + .control_filter = dg_control_filter, 554 + .mixer_init = dg_mixer_init, 555 + .cleanup = dg_cleanup, 556 + .suspend = dg_suspend, 557 + .resume = dg_resume, 558 + .set_dac_params = set_cs4245_dac_params, 559 + .set_adc_params = set_cs4245_adc_params, 560 + .dump_registers = dump_cs4245_registers, 561 + .model_data_size = sizeof(struct dg), 562 + .device_config = PLAYBACK_0_TO_I2S | 563 + PLAYBACK_1_TO_SPDIF | 564 + CAPTURE_0_FROM_I2S_2, 565 + .dac_channels_pcm = 6, 566 + .dac_channels_mixer = 0, 567 + .function_flags = OXYGEN_FUNCTION_SPI, 568 + .dac_mclks = OXYGEN_MCLKS(256, 128, 128), 569 + .adc_mclks = OXYGEN_MCLKS(256, 128, 128), 570 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 571 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 572 + };
+8
sound/pci/oxygen/xonar_dg.h
··· 1 + #ifndef XONAR_DG_H_INCLUDED 2 + #define XONAR_DG_H_INCLUDED 3 + 4 + #include "oxygen.h" 5 + 6 + extern struct oxygen_model model_xonar_dg; 7 + 8 + #endif
+1 -1
sound/pci/oxygen/xonar_hdmi.c
··· 1 1 /* 2 - * helper functions for HDMI models (Xonar HDAV1.3) 2 + * helper functions for HDMI models (Xonar HDAV1.3/HDAV1.3 Slim) 3 3 * 4 4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 5 *
+4 -2
sound/pci/oxygen/xonar_lib.c
··· 104 104 { 105 105 struct oxygen *chip = ctl->private_data; 106 106 u16 bit = ctl->private_value; 107 + bool invert = ctl->private_value & XONAR_GPIO_BIT_INVERT; 107 108 108 109 value->value.integer.value[0] = 109 - !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & bit); 110 + !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & bit) ^ invert; 110 111 return 0; 111 112 } 112 113 ··· 116 115 { 117 116 struct oxygen *chip = ctl->private_data; 118 117 u16 bit = ctl->private_value; 118 + bool invert = ctl->private_value & XONAR_GPIO_BIT_INVERT; 119 119 u16 old_bits, new_bits; 120 120 int changed; 121 121 122 122 spin_lock_irq(&chip->reg_lock); 123 123 old_bits = oxygen_read16(chip, OXYGEN_GPIO_DATA); 124 - if (value->value.integer.value[0]) 124 + if (!!value->value.integer.value[0] ^ invert) 125 125 new_bits = old_bits | bit; 126 126 else 127 127 new_bits = old_bits & ~bit;
+246 -229
sound/pci/oxygen/xonar_pcm179x.c
··· 22 22 * 23 23 * CMI8788: 24 24 * 25 - * SPI 0 -> 1st PCM1796 (front) 26 - * SPI 1 -> 2nd PCM1796 (surround) 27 - * SPI 2 -> 3rd PCM1796 (center/LFE) 28 - * SPI 4 -> 4th PCM1796 (back) 25 + * SPI 0 -> 1st PCM1796 (front) 26 + * SPI 1 -> 2nd PCM1796 (surround) 27 + * SPI 2 -> 3rd PCM1796 (center/LFE) 28 + * SPI 4 -> 4th PCM1796 (back) 29 29 * 30 - * GPIO 2 -> M0 of CS5381 31 - * GPIO 3 -> M1 of CS5381 32 - * GPIO 5 <- external power present (D2X only) 33 - * GPIO 7 -> ALT 34 - * GPIO 8 -> enable output to speakers 30 + * GPIO 2 -> M0 of CS5381 31 + * GPIO 3 -> M1 of CS5381 32 + * GPIO 5 <- external power present (D2X only) 33 + * GPIO 7 -> ALT 34 + * GPIO 8 -> enable output to speakers 35 35 * 36 36 * CM9780: 37 37 * 38 - * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 38 + * LINE_OUT -> input of ADC 39 + * 40 + * AUX_IN <- aux 41 + * VIDEO_IN <- CD 42 + * FMIC_IN <- mic 43 + * 44 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 39 45 */ 40 46 41 47 /* ··· 50 44 * 51 45 * CMI8788: 52 46 * 53 - * I²C <-> PCM1796 (front) 47 + * I²C <-> PCM1796 (addr 1001100) (front) 54 48 * 55 - * GPI 0 <- external power present 49 + * GPI 0 <- external power present 56 50 * 57 - * GPIO 0 -> enable output to speakers 58 - * GPIO 2 -> M0 of CS5381 59 - * GPIO 3 -> M1 of CS5381 60 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 51 + * GPIO 0 -> enable HDMI (0) or speaker (1) output 52 + * GPIO 2 -> M0 of CS5381 53 + * GPIO 3 -> M1 of CS5381 54 + * GPIO 4 <- daughterboard detection 55 + * GPIO 5 <- daughterboard detection 56 + * GPIO 6 -> ? 57 + * GPIO 7 -> ? 58 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 61 59 * 62 - * TXD -> HDMI controller 63 - * RXD <- HDMI controller 64 - * 65 - * PCM1796 front: AD1,0 <- 0,0 60 + * UART <-> HDMI controller 66 61 * 67 62 * CM9780: 68 63 * 69 - * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 64 + * LINE_OUT -> input of ADC 65 + * 66 + * AUX_IN <- aux 67 + * CD_IN <- CD 68 + * MIC_IN <- mic 69 + * 70 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 70 71 * 71 72 * no daughterboard 72 73 * ---------------- 73 74 * 74 - * GPIO 4 <- 1 75 + * GPIO 4 <- 1 75 76 * 76 77 * H6 daughterboard 77 78 * ---------------- 78 79 * 79 - * GPIO 4 <- 0 80 - * GPIO 5 <- 0 80 + * GPIO 4 <- 0 81 + * GPIO 5 <- 0 81 82 * 82 - * I²C <-> PCM1796 (surround) 83 - * <-> PCM1796 (center/LFE) 84 - * <-> PCM1796 (back) 85 - * 86 - * PCM1796 surround: AD1,0 <- 0,1 87 - * PCM1796 center/LFE: AD1,0 <- 1,0 88 - * PCM1796 back: AD1,0 <- 1,1 83 + * I²C <-> PCM1796 (addr 1001101) (surround) 84 + * <-> PCM1796 (addr 1001110) (center/LFE) 85 + * <-> PCM1796 (addr 1001111) (back) 89 86 * 90 87 * unknown daughterboard 91 88 * --------------------- 92 89 * 93 - * GPIO 4 <- 0 94 - * GPIO 5 <- 1 90 + * GPIO 4 <- 0 91 + * GPIO 5 <- 1 95 92 * 96 - * I²C <-> CS4362A (surround, center/LFE, back) 97 - * 98 - * CS4362A: AD0 <- 0 93 + * I²C <-> CS4362A (addr 0011000) (surround, center/LFE, back) 99 94 */ 100 95 101 96 /* ··· 105 98 * 106 99 * CMI8788: 107 100 * 108 - * I²C <-> PCM1792A 109 - * <-> CS2000 (ST only) 101 + * I²C <-> PCM1792A (addr 1001100) 102 + * <-> CS2000 (addr 1001110) (ST only) 110 103 * 111 - * ADC1 MCLK -> REF_CLK of CS2000 (ST only) 104 + * ADC1 MCLK -> REF_CLK of CS2000 (ST only) 112 105 * 113 - * GPI 0 <- external power present (STX only) 106 + * GPI 0 <- external power present (STX only) 114 107 * 115 - * GPIO 0 -> enable output to speakers 116 - * GPIO 1 -> route HP to front panel (0) or rear jack (1) 117 - * GPIO 2 -> M0 of CS5381 118 - * GPIO 3 -> M1 of CS5381 119 - * GPIO 7 -> route output to speaker jacks (0) or HP (1) 120 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 108 + * GPIO 0 -> enable output to speakers 109 + * GPIO 1 -> route HP to front panel (0) or rear jack (1) 110 + * GPIO 2 -> M0 of CS5381 111 + * GPIO 3 -> M1 of CS5381 112 + * GPIO 4 <- daughterboard detection 113 + * GPIO 5 <- daughterboard detection 114 + * GPIO 6 -> ? 115 + * GPIO 7 -> route output to speaker jacks (0) or HP (1) 116 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 121 117 * 122 118 * PCM1792A: 123 119 * 124 - * AD1,0 <- 0,0 125 - * SCK <- CLK_OUT of CS2000 (ST only) 126 - * 127 - * CS2000: 128 - * 129 - * AD0 <- 0 120 + * SCK <- CLK_OUT of CS2000 (ST only) 130 121 * 131 122 * CM9780: 132 123 * 133 - * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 124 + * LINE_OUT -> input of ADC 125 + * 126 + * AUX_IN <- aux 127 + * MIC_IN <- mic 128 + * 129 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 134 130 * 135 131 * H6 daughterboard 136 132 * ---------------- ··· 143 133 */ 144 134 145 135 /* 146 - * Xonar HDAV1.3 Slim 147 - * ------------------ 136 + * Xonar Xense 137 + * ----------- 148 138 * 149 139 * CMI8788: 150 140 * 151 - * GPIO 1 -> enable output 141 + * I²C <-> PCM1796 (addr 1001100) (front) 142 + * <-> CS4362A (addr 0011000) (surround, center/LFE, back) 143 + * <-> CS2000 (addr 1001110) 152 144 * 153 - * TXD -> HDMI controller 154 - * RXD <- HDMI controller 145 + * ADC1 MCLK -> REF_CLK of CS2000 146 + * 147 + * GPI 0 <- external power present 148 + * 149 + * GPIO 0 -> enable output 150 + * GPIO 1 -> route HP to front panel (0) or rear jack (1) 151 + * GPIO 2 -> M0 of CS5381 152 + * GPIO 3 -> M1 of CS5381 153 + * GPIO 4 -> enable output 154 + * GPIO 5 -> enable output 155 + * GPIO 6 -> ? 156 + * GPIO 7 -> route output to HP (0) or speaker (1) 157 + * GPIO 8 -> route input jack to mic-in (0) or line-in (1) 158 + * 159 + * CM9780: 160 + * 161 + * LINE_OUT -> input of ADC 162 + * 163 + * AUX_IN <- aux 164 + * VIDEO_IN <- ? 165 + * FMIC_IN <- mic 166 + * 167 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 168 + * GPO 1 -> route mic-in from input jack (0) or front panel header (1) 155 169 */ 156 170 157 171 #include <linux/pci.h> ··· 184 150 #include <sound/ac97_codec.h> 185 151 #include <sound/control.h> 186 152 #include <sound/core.h> 153 + #include <sound/info.h> 187 154 #include <sound/pcm.h> 188 155 #include <sound/pcm_params.h> 189 156 #include <sound/tlv.h> ··· 202 167 #define GPIO_INPUT_ROUTE 0x0100 203 168 204 169 #define GPIO_HDAV_OUTPUT_ENABLE 0x0001 170 + #define GPIO_HDAV_MAGIC 0x00c0 205 171 206 172 #define GPIO_DB_MASK 0x0030 207 173 #define GPIO_DB_H6 0x0000 208 174 209 175 #define GPIO_ST_OUTPUT_ENABLE 0x0001 210 176 #define GPIO_ST_HP_REAR 0x0002 177 + #define GPIO_ST_MAGIC 0x0040 211 178 #define GPIO_ST_HP 0x0080 212 179 213 180 #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ii, /W=0 */ ··· 223 186 unsigned int dacs; 224 187 u8 pcm1796_regs[4][5]; 225 188 unsigned int current_rate; 226 - bool os_128; 189 + bool h6; 227 190 bool hp_active; 228 191 s8 hp_gain_offset; 229 192 bool has_cs2000; 230 - u8 cs2000_fun_cfg_1; 193 + u8 cs2000_regs[0x1f]; 194 + bool broken_i2c; 231 195 }; 232 196 233 197 struct xonar_hdav { ··· 287 249 struct xonar_pcm179x *data = chip->model_data; 288 250 289 251 oxygen_write_i2c(chip, I2C_DEVICE_CS2000, reg, value); 290 - if (reg == CS2000_FUN_CFG_1) 291 - data->cs2000_fun_cfg_1 = value; 252 + data->cs2000_regs[reg] = value; 292 253 } 293 254 294 255 static void cs2000_write_cached(struct oxygen *chip, u8 reg, u8 value) 295 256 { 296 257 struct xonar_pcm179x *data = chip->model_data; 297 258 298 - if (reg != CS2000_FUN_CFG_1 || 299 - value != data->cs2000_fun_cfg_1) 259 + if (value != data->cs2000_regs[reg]) 300 260 cs2000_write(chip, reg, value); 301 261 } 302 262 ··· 304 268 unsigned int i; 305 269 s8 gain_offset; 306 270 271 + msleep(1); 307 272 gain_offset = data->hp_active ? data->hp_gain_offset : 0; 308 273 for (i = 0; i < data->dacs; ++i) { 309 274 /* set ATLD before ATL/ATR */ ··· 319 282 pcm1796_write(chip, i, 20, 320 283 data->pcm1796_regs[0][20 - PCM1796_REG_BASE]); 321 284 pcm1796_write(chip, i, 21, 0); 285 + gain_offset = 0; 322 286 } 323 287 } 324 288 ··· 328 290 struct xonar_pcm179x *data = chip->model_data; 329 291 330 292 data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = PCM1796_MUTE | 331 - PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD; 293 + PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD; 332 294 data->pcm1796_regs[0][19 - PCM1796_REG_BASE] = 333 295 PCM1796_FLT_SHARP | PCM1796_ATS_1; 334 - data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = PCM1796_OS_64; 296 + data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = 297 + data->h6 ? PCM1796_OS_64 : PCM1796_OS_128; 335 298 pcm1796_registers_init(chip); 336 299 data->current_rate = 48000; 337 300 } ··· 378 339 oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 379 340 OXYGEN_2WIRE_LENGTH_8 | 380 341 OXYGEN_2WIRE_INTERRUPT_MASK | 381 - OXYGEN_2WIRE_SPEED_FAST); 342 + OXYGEN_2WIRE_SPEED_STANDARD); 382 343 383 344 data->pcm179x.generic.anti_pop_delay = 100; 384 345 data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE; 385 346 data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA; 386 347 data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 387 348 data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER; 388 - data->pcm179x.dacs = chip->model.private_data ? 4 : 1; 349 + data->pcm179x.dacs = chip->model.dac_channels_mixer / 2; 350 + data->pcm179x.h6 = chip->model.dac_channels_mixer > 2; 389 351 390 352 pcm1796_init(chip); 391 353 392 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_INPUT_ROUTE); 354 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 355 + GPIO_HDAV_MAGIC | GPIO_INPUT_ROUTE); 393 356 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE); 394 357 395 358 xonar_init_cs53x1(chip); ··· 408 367 oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 409 368 OXYGEN_2WIRE_LENGTH_8 | 410 369 OXYGEN_2WIRE_INTERRUPT_MASK | 411 - OXYGEN_2WIRE_SPEED_FAST); 370 + OXYGEN_2WIRE_SPEED_STANDARD); 412 371 } 413 372 414 373 static void xonar_st_init_common(struct oxygen *chip) ··· 416 375 struct xonar_pcm179x *data = chip->model_data; 417 376 418 377 data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE; 419 - data->dacs = chip->model.private_data ? 4 : 1; 378 + data->dacs = chip->model.dac_channels_mixer / 2; 420 379 data->hp_gain_offset = 2*-18; 421 380 422 381 pcm1796_init(chip); 423 382 424 383 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 425 - GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 384 + GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | 385 + GPIO_ST_MAGIC | GPIO_ST_HP); 426 386 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 427 387 GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 428 388 ··· 452 410 cs2000_write(chip, CS2000_RATIO_0 + 1, 0x10); 453 411 cs2000_write(chip, CS2000_RATIO_0 + 2, 0x00); 454 412 cs2000_write(chip, CS2000_RATIO_0 + 3, 0x00); 455 - cs2000_write(chip, CS2000_FUN_CFG_1, data->cs2000_fun_cfg_1); 413 + cs2000_write(chip, CS2000_FUN_CFG_1, 414 + data->cs2000_regs[CS2000_FUN_CFG_1]); 456 415 cs2000_write(chip, CS2000_FUN_CFG_2, 0); 457 416 cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_EN_DEV_CFG_2); 417 + msleep(3); /* PLL lock delay */ 458 418 } 459 419 460 420 static void xonar_st_init(struct oxygen *chip) ··· 464 420 struct xonar_pcm179x *data = chip->model_data; 465 421 466 422 data->generic.anti_pop_delay = 100; 423 + data->h6 = chip->model.dac_channels_mixer > 2; 467 424 data->has_cs2000 = 1; 468 - data->cs2000_fun_cfg_1 = CS2000_REF_CLK_DIV_1; 425 + data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1; 426 + data->broken_i2c = true; 469 427 470 428 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, 471 - OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_I2S | 472 - OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | 473 - OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); 429 + OXYGEN_RATE_48000 | 430 + OXYGEN_I2S_FORMAT_I2S | 431 + OXYGEN_I2S_MCLK(data->h6 ? MCLK_256 : MCLK_512) | 432 + OXYGEN_I2S_BITS_16 | 433 + OXYGEN_I2S_MASTER | 434 + OXYGEN_I2S_BCLK_64); 474 435 475 436 xonar_st_init_i2c(chip); 476 437 cs2000_registers_init(chip); ··· 556 507 xonar_stx_resume(chip); 557 508 } 558 509 559 - static unsigned int mclk_from_rate(struct oxygen *chip, unsigned int rate) 560 - { 561 - struct xonar_pcm179x *data = chip->model_data; 562 - 563 - if (rate <= 32000) 564 - return OXYGEN_I2S_MCLK_512; 565 - else if (rate <= 48000 && data->os_128) 566 - return OXYGEN_I2S_MCLK_512; 567 - else if (rate <= 96000) 568 - return OXYGEN_I2S_MCLK_256; 569 - else 570 - return OXYGEN_I2S_MCLK_128; 571 - } 572 - 573 - static unsigned int get_pcm1796_i2s_mclk(struct oxygen *chip, 574 - unsigned int channel, 575 - struct snd_pcm_hw_params *params) 576 - { 577 - if (channel == PCM_MULTICH) 578 - return mclk_from_rate(chip, params_rate(params)); 579 - else 580 - return oxygen_default_i2s_mclk(chip, channel, params); 581 - } 582 - 583 510 static void update_pcm1796_oversampling(struct oxygen *chip) 584 511 { 585 512 struct xonar_pcm179x *data = chip->model_data; 586 513 unsigned int i; 587 514 u8 reg; 588 515 589 - if (data->current_rate <= 32000) 516 + if (data->current_rate <= 48000 && !data->h6) 590 517 reg = PCM1796_OS_128; 591 - else if (data->current_rate <= 48000 && data->os_128) 592 - reg = PCM1796_OS_128; 593 - else if (data->current_rate <= 96000 || data->os_128) 594 - reg = PCM1796_OS_64; 595 518 else 596 - reg = PCM1796_OS_32; 519 + reg = PCM1796_OS_64; 597 520 for (i = 0; i < data->dacs; ++i) 598 521 pcm1796_write_cached(chip, i, 20, reg); 599 522 } ··· 575 554 { 576 555 struct xonar_pcm179x *data = chip->model_data; 577 556 557 + msleep(1); 578 558 data->current_rate = params_rate(params); 579 559 update_pcm1796_oversampling(chip); 580 560 } ··· 592 570 + gain_offset); 593 571 pcm1796_write_cached(chip, i, 17, chip->dac_volume[i * 2 + 1] 594 572 + gain_offset); 573 + gain_offset = 0; 595 574 } 596 575 } 597 576 ··· 602 579 unsigned int i; 603 580 u8 value; 604 581 605 - value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD; 582 + value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD; 606 583 if (chip->dac_mute) 607 584 value |= PCM1796_MUTE; 608 585 for (i = 0; i < data->dacs; ++i) ··· 615 592 u8 rate_mclk, reg; 616 593 617 594 switch (rate) { 618 - /* XXX Why is the I2S A MCLK half the actual I2S MCLK? */ 619 595 case 32000: 620 - rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256; 596 + case 64000: 597 + rate_mclk = OXYGEN_RATE_32000; 621 598 break; 622 599 case 44100: 623 - if (data->os_128) 624 - rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 625 - else 626 - rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_128; 627 - break; 628 - default: /* 48000 */ 629 - if (data->os_128) 630 - rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 631 - else 632 - rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_128; 633 - break; 634 - case 64000: 635 - rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256; 636 - break; 637 600 case 88200: 638 - rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 639 - break; 640 - case 96000: 641 - rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 642 - break; 643 601 case 176400: 644 - rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 602 + rate_mclk = OXYGEN_RATE_44100; 645 603 break; 604 + default: 605 + case 48000: 606 + case 96000: 646 607 case 192000: 647 - rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 608 + rate_mclk = OXYGEN_RATE_48000; 648 609 break; 649 610 } 611 + 612 + if (rate <= 96000 && (rate > 48000 || data->h6)) { 613 + rate_mclk |= OXYGEN_I2S_MCLK(MCLK_256); 614 + reg = CS2000_REF_CLK_DIV_1; 615 + } else { 616 + rate_mclk |= OXYGEN_I2S_MCLK(MCLK_512); 617 + reg = CS2000_REF_CLK_DIV_2; 618 + } 619 + 650 620 oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, rate_mclk, 651 621 OXYGEN_I2S_RATE_MASK | OXYGEN_I2S_MCLK_MASK); 652 - if ((rate_mclk & OXYGEN_I2S_MCLK_MASK) <= OXYGEN_I2S_MCLK_128) 653 - reg = CS2000_REF_CLK_DIV_1; 654 - else 655 - reg = CS2000_REF_CLK_DIV_2; 656 622 cs2000_write_cached(chip, CS2000_FUN_CFG_1, reg); 623 + msleep(3); /* PLL lock delay */ 657 624 } 658 625 659 626 static void set_st_params(struct oxygen *chip, ··· 678 665 "Sharp Roll-off", "Slow Roll-off" 679 666 }; 680 667 681 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 682 - info->count = 1; 683 - info->value.enumerated.items = 2; 684 - if (info->value.enumerated.item >= 2) 685 - info->value.enumerated.item = 1; 686 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 687 - return 0; 668 + return snd_ctl_enum_info(info, 1, 2, names); 688 669 } 689 670 690 671 static int rolloff_get(struct snd_kcontrol *ctl, ··· 726 719 .put = rolloff_put, 727 720 }; 728 721 729 - static int os_128_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 730 - { 731 - static const char *const names[2] = { "64x", "128x" }; 732 - 733 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 734 - info->count = 1; 735 - info->value.enumerated.items = 2; 736 - if (info->value.enumerated.item >= 2) 737 - info->value.enumerated.item = 1; 738 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 739 - return 0; 740 - } 741 - 742 - static int os_128_get(struct snd_kcontrol *ctl, 743 - struct snd_ctl_elem_value *value) 744 - { 745 - struct oxygen *chip = ctl->private_data; 746 - struct xonar_pcm179x *data = chip->model_data; 747 - 748 - value->value.enumerated.item[0] = data->os_128; 749 - return 0; 750 - } 751 - 752 - static int os_128_put(struct snd_kcontrol *ctl, 753 - struct snd_ctl_elem_value *value) 754 - { 755 - struct oxygen *chip = ctl->private_data; 756 - struct xonar_pcm179x *data = chip->model_data; 757 - int changed; 758 - 759 - mutex_lock(&chip->mutex); 760 - changed = value->value.enumerated.item[0] != data->os_128; 761 - if (changed) { 762 - data->os_128 = value->value.enumerated.item[0]; 763 - if (data->has_cs2000) 764 - update_cs2000_rate(chip, data->current_rate); 765 - oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, 766 - mclk_from_rate(chip, data->current_rate), 767 - OXYGEN_I2S_MCLK_MASK); 768 - update_pcm1796_oversampling(chip); 769 - } 770 - mutex_unlock(&chip->mutex); 771 - return changed; 772 - } 773 - 774 - static const struct snd_kcontrol_new os_128_control = { 722 + static const struct snd_kcontrol_new hdav_hdmi_control = { 775 723 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 776 - .name = "DAC Oversampling Playback Enum", 777 - .info = os_128_info, 778 - .get = os_128_get, 779 - .put = os_128_put, 724 + .name = "HDMI Playback Switch", 725 + .info = snd_ctl_boolean_mono_info, 726 + .get = xonar_gpio_bit_switch_get, 727 + .put = xonar_gpio_bit_switch_put, 728 + .private_value = GPIO_HDAV_OUTPUT_ENABLE | XONAR_GPIO_BIT_INVERT, 780 729 }; 781 730 782 731 static int st_output_switch_info(struct snd_kcontrol *ctl, ··· 742 779 "Speakers", "Headphones", "FP Headphones" 743 780 }; 744 781 745 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 746 - info->count = 1; 747 - info->value.enumerated.items = 3; 748 - if (info->value.enumerated.item >= 3) 749 - info->value.enumerated.item = 2; 750 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 751 - return 0; 782 + return snd_ctl_enum_info(info, 1, 3, names); 752 783 } 753 784 754 785 static int st_output_switch_get(struct snd_kcontrol *ctl, ··· 797 840 "< 64 ohms", "64-300 ohms", "300-600 ohms" 798 841 }; 799 842 800 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 801 - info->count = 1; 802 - info->value.enumerated.items = 3; 803 - if (info->value.enumerated.item > 2) 804 - info->value.enumerated.item = 2; 805 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 806 - return 0; 843 + return snd_ctl_enum_info(info, 1, 3, names); 807 844 } 808 845 809 846 static int st_hp_volume_offset_get(struct snd_kcontrol *ctl, ··· 879 928 return 0; 880 929 } 881 930 931 + static int xonar_st_h6_control_filter(struct snd_kcontrol_new *template) 932 + { 933 + if (!strncmp(template->name, "Master Playback ", 16)) 934 + /* no volume/mute, as I²C to the third DAC does not work */ 935 + return 1; 936 + return 0; 937 + } 938 + 882 939 static int add_pcm1796_controls(struct oxygen *chip) 883 940 { 941 + struct xonar_pcm179x *data = chip->model_data; 884 942 int err; 885 943 886 - err = snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); 887 - if (err < 0) 888 - return err; 889 - err = snd_ctl_add(chip->card, snd_ctl_new1(&os_128_control, chip)); 890 - if (err < 0) 891 - return err; 944 + if (!data->broken_i2c) { 945 + err = snd_ctl_add(chip->card, 946 + snd_ctl_new1(&rolloff_control, chip)); 947 + if (err < 0) 948 + return err; 949 + } 892 950 return 0; 893 951 } 894 952 ··· 916 956 917 957 static int xonar_hdav_mixer_init(struct oxygen *chip) 918 958 { 919 - return add_pcm1796_controls(chip); 959 + int err; 960 + 961 + err = snd_ctl_add(chip->card, snd_ctl_new1(&hdav_hdmi_control, chip)); 962 + if (err < 0) 963 + return err; 964 + err = add_pcm1796_controls(chip); 965 + if (err < 0) 966 + return err; 967 + return 0; 920 968 } 921 969 922 970 static int xonar_st_mixer_init(struct oxygen *chip) ··· 944 976 return 0; 945 977 } 946 978 979 + static void dump_pcm1796_registers(struct oxygen *chip, 980 + struct snd_info_buffer *buffer) 981 + { 982 + struct xonar_pcm179x *data = chip->model_data; 983 + unsigned int dac, i; 984 + 985 + for (dac = 0; dac < data->dacs; ++dac) { 986 + snd_iprintf(buffer, "\nPCM1796 %u:", dac + 1); 987 + for (i = 0; i < 5; ++i) 988 + snd_iprintf(buffer, " %02x", 989 + data->pcm1796_regs[dac][i]); 990 + } 991 + snd_iprintf(buffer, "\n"); 992 + } 993 + 994 + static void dump_cs2000_registers(struct oxygen *chip, 995 + struct snd_info_buffer *buffer) 996 + { 997 + struct xonar_pcm179x *data = chip->model_data; 998 + unsigned int i; 999 + 1000 + if (data->has_cs2000) { 1001 + snd_iprintf(buffer, "\nCS2000:\n00: "); 1002 + for (i = 1; i < 0x10; ++i) 1003 + snd_iprintf(buffer, " %02x", data->cs2000_regs[i]); 1004 + snd_iprintf(buffer, "\n10:"); 1005 + for (i = 0x10; i < 0x1f; ++i) 1006 + snd_iprintf(buffer, " %02x", data->cs2000_regs[i]); 1007 + snd_iprintf(buffer, "\n"); 1008 + } 1009 + } 1010 + 1011 + static void dump_st_registers(struct oxygen *chip, 1012 + struct snd_info_buffer *buffer) 1013 + { 1014 + dump_pcm1796_registers(chip, buffer); 1015 + dump_cs2000_registers(chip, buffer); 1016 + } 1017 + 947 1018 static const struct oxygen_model model_xonar_d2 = { 948 1019 .longname = "Asus Virtuoso 200", 949 1020 .chip = "AV200", ··· 992 985 .cleanup = xonar_d2_cleanup, 993 986 .suspend = xonar_d2_suspend, 994 987 .resume = xonar_d2_resume, 995 - .get_i2s_mclk = get_pcm1796_i2s_mclk, 996 988 .set_dac_params = set_pcm1796_params, 997 989 .set_adc_params = xonar_set_cs53x1_params, 998 990 .update_dac_volume = update_pcm1796_volume, 999 991 .update_dac_mute = update_pcm1796_mute, 992 + .dump_registers = dump_pcm1796_registers, 1000 993 .dac_tlv = pcm1796_db_scale, 1001 994 .model_data_size = sizeof(struct xonar_pcm179x), 1002 995 .device_config = PLAYBACK_0_TO_I2S | ··· 1006 999 MIDI_OUTPUT | 1007 1000 MIDI_INPUT | 1008 1001 AC97_CD_INPUT, 1009 - .dac_channels = 8, 1002 + .dac_channels_pcm = 8, 1003 + .dac_channels_mixer = 8, 1010 1004 .dac_volume_min = 255 - 2*60, 1011 1005 .dac_volume_max = 255, 1012 1006 .misc_flags = OXYGEN_MISC_MIDI, 1013 1007 .function_flags = OXYGEN_FUNCTION_SPI | 1014 1008 OXYGEN_FUNCTION_ENABLE_SPI_4_5, 1015 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1009 + .dac_mclks = OXYGEN_MCLKS(512, 128, 128), 1010 + .adc_mclks = OXYGEN_MCLKS(256, 128, 128), 1011 + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, 1016 1012 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1017 1013 }; 1018 1014 ··· 1028 1018 .suspend = xonar_hdav_suspend, 1029 1019 .resume = xonar_hdav_resume, 1030 1020 .pcm_hardware_filter = xonar_hdmi_pcm_hardware_filter, 1031 - .get_i2s_mclk = get_pcm1796_i2s_mclk, 1032 1021 .set_dac_params = set_hdav_params, 1033 1022 .set_adc_params = xonar_set_cs53x1_params, 1034 1023 .update_dac_volume = update_pcm1796_volume, 1035 1024 .update_dac_mute = update_pcm1796_mute, 1036 1025 .uart_input = xonar_hdmi_uart_input, 1037 1026 .ac97_switch = xonar_line_mic_ac97_switch, 1027 + .dump_registers = dump_pcm1796_registers, 1038 1028 .dac_tlv = pcm1796_db_scale, 1039 1029 .model_data_size = sizeof(struct xonar_hdav), 1040 1030 .device_config = PLAYBACK_0_TO_I2S | 1041 1031 PLAYBACK_1_TO_SPDIF | 1042 1032 CAPTURE_0_FROM_I2S_2 | 1043 1033 CAPTURE_1_FROM_SPDIF, 1044 - .dac_channels = 8, 1034 + .dac_channels_pcm = 8, 1035 + .dac_channels_mixer = 2, 1045 1036 .dac_volume_min = 255 - 2*60, 1046 1037 .dac_volume_max = 255, 1047 1038 .misc_flags = OXYGEN_MISC_MIDI, 1048 1039 .function_flags = OXYGEN_FUNCTION_2WIRE, 1049 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1040 + .dac_mclks = OXYGEN_MCLKS(512, 128, 128), 1041 + .adc_mclks = OXYGEN_MCLKS(256, 128, 128), 1042 + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, 1050 1043 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1051 1044 }; 1052 1045 ··· 1061 1048 .cleanup = xonar_st_cleanup, 1062 1049 .suspend = xonar_st_suspend, 1063 1050 .resume = xonar_st_resume, 1064 - .get_i2s_mclk = get_pcm1796_i2s_mclk, 1065 1051 .set_dac_params = set_st_params, 1066 1052 .set_adc_params = xonar_set_cs53x1_params, 1067 1053 .update_dac_volume = update_pcm1796_volume, 1068 1054 .update_dac_mute = update_pcm1796_mute, 1069 1055 .ac97_switch = xonar_line_mic_ac97_switch, 1056 + .dump_registers = dump_st_registers, 1070 1057 .dac_tlv = pcm1796_db_scale, 1071 1058 .model_data_size = sizeof(struct xonar_pcm179x), 1072 1059 .device_config = PLAYBACK_0_TO_I2S | 1073 1060 PLAYBACK_1_TO_SPDIF | 1074 - CAPTURE_0_FROM_I2S_2, 1075 - .dac_channels = 2, 1061 + CAPTURE_0_FROM_I2S_2 | 1062 + AC97_FMIC_SWITCH, 1063 + .dac_channels_pcm = 2, 1064 + .dac_channels_mixer = 2, 1076 1065 .dac_volume_min = 255 - 2*60, 1077 1066 .dac_volume_max = 255, 1078 1067 .function_flags = OXYGEN_FUNCTION_2WIRE, 1079 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1068 + .dac_mclks = OXYGEN_MCLKS(512, 128, 128), 1069 + .adc_mclks = OXYGEN_MCLKS(256, 128, 128), 1070 + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, 1080 1071 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1081 1072 }; 1082 1073 ··· 1106 1089 break; 1107 1090 case GPIO_DB_H6: 1108 1091 chip->model.shortname = "Xonar HDAV1.3+H6"; 1109 - chip->model.private_data = 1; 1092 + chip->model.dac_channels_mixer = 8; 1093 + chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128); 1110 1094 break; 1111 1095 } 1112 1096 break; ··· 1120 1102 break; 1121 1103 case GPIO_DB_H6: 1122 1104 chip->model.shortname = "Xonar ST+H6"; 1123 - chip->model.dac_channels = 8; 1124 - chip->model.private_data = 1; 1105 + chip->model.control_filter = xonar_st_h6_control_filter; 1106 + chip->model.dac_channels_pcm = 8; 1107 + chip->model.dac_channels_mixer = 8; 1108 + chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128); 1125 1109 break; 1126 1110 } 1127 1111 break; ··· 1134 1114 chip->model.resume = xonar_stx_resume; 1135 1115 chip->model.set_dac_params = set_pcm1796_params; 1136 1116 break; 1137 - case 0x835e: 1138 - snd_printk(KERN_ERR "the HDAV1.3 Slim is not supported\n"); 1139 - return -ENODEV; 1140 1117 default: 1141 1118 return -EINVAL; 1142 1119 }
+273 -44
sound/pci/oxygen/xonar_wm87x6.c
··· 1 1 /* 2 - * card driver for models with WM8776/WM8766 DACs (Xonar DS) 2 + * card driver for models with WM8776/WM8766 DACs (Xonar DS/HDAV1.3 Slim) 3 3 * 4 4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 5 * ··· 22 22 * 23 23 * CMI8788: 24 24 * 25 - * SPI 0 -> WM8766 (surround, center/LFE, back) 26 - * SPI 1 -> WM8776 (front, input) 25 + * SPI 0 -> WM8766 (surround, center/LFE, back) 26 + * SPI 1 -> WM8776 (front, input) 27 27 * 28 - * GPIO 4 <- headphone detect, 0 = plugged 29 - * GPIO 6 -> route input jack to mic-in (0) or line-in (1) 30 - * GPIO 7 -> enable output to front L/R speaker channels 31 - * GPIO 8 -> enable output to other speaker channels and front panel headphone 28 + * GPIO 4 <- headphone detect, 0 = plugged 29 + * GPIO 6 -> route input jack to mic-in (0) or line-in (1) 30 + * GPIO 7 -> enable output to front L/R speaker channels 31 + * GPIO 8 -> enable output to other speaker channels and front panel headphone 32 32 * 33 - * WM8766: 33 + * WM8776: 34 34 * 35 - * input 1 <- line 36 - * input 2 <- mic 37 - * input 3 <- front mic 38 - * input 4 <- aux 35 + * input 1 <- line 36 + * input 2 <- mic 37 + * input 3 <- front mic 38 + * input 4 <- aux 39 + */ 40 + 41 + /* 42 + * Xonar HDAV1.3 Slim 43 + * ------------------ 44 + * 45 + * CMI8788: 46 + * 47 + * I²C <-> WM8776 (addr 0011010) 48 + * 49 + * GPIO 0 -> disable HDMI output 50 + * GPIO 1 -> enable HP output 51 + * GPIO 6 -> firmware EEPROM I²C clock 52 + * GPIO 7 <-> firmware EEPROM I²C data 53 + * 54 + * UART <-> HDMI controller 55 + * 56 + * WM8776: 57 + * 58 + * input 1 <- mic 59 + * input 2 <- aux 39 60 */ 40 61 41 62 #include <linux/pci.h> 42 63 #include <linux/delay.h> 43 64 #include <sound/control.h> 44 65 #include <sound/core.h> 66 + #include <sound/info.h> 45 67 #include <sound/jack.h> 46 68 #include <sound/pcm.h> 47 69 #include <sound/pcm_params.h> ··· 77 55 #define GPIO_DS_OUTPUT_FRONTLR 0x0080 78 56 #define GPIO_DS_OUTPUT_ENABLE 0x0100 79 57 58 + #define GPIO_SLIM_HDMI_DISABLE 0x0001 59 + #define GPIO_SLIM_OUTPUT_ENABLE 0x0002 60 + #define GPIO_SLIM_FIRMWARE_CLK 0x0040 61 + #define GPIO_SLIM_FIRMWARE_DATA 0x0080 62 + 63 + #define I2C_DEVICE_WM8776 0x34 /* 001101, 0, /W=0 */ 64 + 80 65 #define LC_CONTROL_LIMITER 0x40000000 81 66 #define LC_CONTROL_ALC 0x20000000 82 67 ··· 95 66 struct snd_kcontrol *mic_adcmux_control; 96 67 struct snd_kcontrol *lc_controls[13]; 97 68 struct snd_jack *hp_jack; 69 + struct xonar_hdmi hdmi; 98 70 }; 99 71 100 - static void wm8776_write(struct oxygen *chip, 101 - unsigned int reg, unsigned int value) 72 + static void wm8776_write_spi(struct oxygen *chip, 73 + unsigned int reg, unsigned int value) 102 74 { 103 - struct xonar_wm87x6 *data = chip->model_data; 104 - 105 75 oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 106 76 OXYGEN_SPI_DATA_LENGTH_2 | 107 77 OXYGEN_SPI_CLOCK_160 | 108 78 (1 << OXYGEN_SPI_CODEC_SHIFT) | 109 79 OXYGEN_SPI_CEN_LATCH_CLOCK_LO, 110 80 (reg << 9) | value); 81 + } 82 + 83 + static void wm8776_write_i2c(struct oxygen *chip, 84 + unsigned int reg, unsigned int value) 85 + { 86 + oxygen_write_i2c(chip, I2C_DEVICE_WM8776, 87 + (reg << 1) | (value >> 8), value); 88 + } 89 + 90 + static void wm8776_write(struct oxygen *chip, 91 + unsigned int reg, unsigned int value) 92 + { 93 + struct xonar_wm87x6 *data = chip->model_data; 94 + 95 + if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) == 96 + OXYGEN_FUNCTION_SPI) 97 + wm8776_write_spi(chip, reg, value); 98 + else 99 + wm8776_write_i2c(chip, reg, value); 111 100 if (reg < ARRAY_SIZE(data->wm8776_regs)) { 112 101 if (reg >= WM8776_HPLVOL && reg <= WM8776_DACMASTER) 113 102 value &= ~WM8776_UPDATE; ··· 292 245 snd_component_add(chip->card, "WM8766"); 293 246 } 294 247 248 + static void xonar_hdav_slim_init(struct oxygen *chip) 249 + { 250 + struct xonar_wm87x6 *data = chip->model_data; 251 + 252 + data->generic.anti_pop_delay = 300; 253 + data->generic.output_enable_bit = GPIO_SLIM_OUTPUT_ENABLE; 254 + 255 + wm8776_init(chip); 256 + 257 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 258 + GPIO_SLIM_HDMI_DISABLE | 259 + GPIO_SLIM_FIRMWARE_CLK | 260 + GPIO_SLIM_FIRMWARE_DATA); 261 + 262 + xonar_hdmi_init(chip, &data->hdmi); 263 + xonar_enable_output(chip); 264 + 265 + snd_component_add(chip->card, "WM8776"); 266 + } 267 + 295 268 static void xonar_ds_cleanup(struct oxygen *chip) 296 269 { 297 270 xonar_disable_output(chip); 298 271 wm8776_write(chip, WM8776_RESET, 0); 299 272 } 300 273 274 + static void xonar_hdav_slim_cleanup(struct oxygen *chip) 275 + { 276 + xonar_hdmi_cleanup(chip); 277 + xonar_disable_output(chip); 278 + wm8776_write(chip, WM8776_RESET, 0); 279 + msleep(2); 280 + } 281 + 301 282 static void xonar_ds_suspend(struct oxygen *chip) 302 283 { 303 284 xonar_ds_cleanup(chip); 285 + } 286 + 287 + static void xonar_hdav_slim_suspend(struct oxygen *chip) 288 + { 289 + xonar_hdav_slim_cleanup(chip); 304 290 } 305 291 306 292 static void xonar_ds_resume(struct oxygen *chip) ··· 342 262 wm8766_registers_init(chip); 343 263 xonar_enable_output(chip); 344 264 xonar_ds_handle_hp_jack(chip); 265 + } 266 + 267 + static void xonar_hdav_slim_resume(struct oxygen *chip) 268 + { 269 + struct xonar_wm87x6 *data = chip->model_data; 270 + 271 + wm8776_registers_init(chip); 272 + xonar_hdmi_resume(chip, &data->hdmi); 273 + xonar_enable_output(chip); 345 274 } 346 275 347 276 static void wm8776_adc_hardware_filter(unsigned int channel, ··· 367 278 } 368 279 } 369 280 281 + static void xonar_hdav_slim_hardware_filter(unsigned int channel, 282 + struct snd_pcm_hardware *hardware) 283 + { 284 + wm8776_adc_hardware_filter(channel, hardware); 285 + xonar_hdmi_pcm_hardware_filter(channel, hardware); 286 + } 287 + 370 288 static void set_wm87x6_dac_params(struct oxygen *chip, 371 289 struct snd_pcm_hw_params *params) 372 290 { ··· 388 292 if (params_rate(params) > 48000) 389 293 reg |= WM8776_ADCOSR; 390 294 wm8776_write_cached(chip, WM8776_MSTRCTRL, reg); 295 + } 296 + 297 + static void set_hdav_slim_dac_params(struct oxygen *chip, 298 + struct snd_pcm_hw_params *params) 299 + { 300 + struct xonar_wm87x6 *data = chip->model_data; 301 + 302 + xonar_set_hdmi_params(chip, &data->hdmi, params); 391 303 } 392 304 393 305 static void update_wm8776_volume(struct oxygen *chip) ··· 577 473 const char *const *names; 578 474 579 475 max = (ctl->private_value >> 12) & 0xf; 580 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 581 - info->count = 1; 582 - info->value.enumerated.items = max + 1; 583 - if (info->value.enumerated.item > max) 584 - info->value.enumerated.item = max; 585 476 switch ((ctl->private_value >> 24) & 0x1f) { 586 477 case WM8776_ALCCTRL2: 587 478 names = hld; ··· 600 501 default: 601 502 return -ENXIO; 602 503 } 603 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 604 - return 0; 504 + return snd_ctl_enum_info(info, 1, max + 1, names); 605 505 } 606 506 607 507 static int wm8776_field_volume_info(struct snd_kcontrol *ctl, ··· 857 759 static const char *const names[3] = { 858 760 "None", "Peak Limiter", "Automatic Level Control" 859 761 }; 860 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 861 - info->count = 1; 862 - info->value.enumerated.items = 3; 863 - if (info->value.enumerated.item >= 3) 864 - info->value.enumerated.item = 2; 865 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 866 - return 0; 762 + 763 + return snd_ctl_enum_info(info, 1, 3, names); 867 764 } 868 765 869 766 static int wm8776_level_control_get(struct snd_kcontrol *ctl, ··· 944 851 "None", "High-pass Filter" 945 852 }; 946 853 947 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 948 - info->count = 1; 949 - info->value.enumerated.items = 2; 950 - if (info->value.enumerated.item >= 2) 951 - info->value.enumerated.item = 1; 952 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 953 - return 0; 854 + return snd_ctl_enum_info(info, 1, 2, names); 954 855 } 955 856 956 857 static int hpf_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) ··· 1072 985 .private_value = 0, 1073 986 }, 1074 987 }; 988 + static const struct snd_kcontrol_new hdav_slim_controls[] = { 989 + { 990 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 991 + .name = "HDMI Playback Switch", 992 + .info = snd_ctl_boolean_mono_info, 993 + .get = xonar_gpio_bit_switch_get, 994 + .put = xonar_gpio_bit_switch_put, 995 + .private_value = GPIO_SLIM_HDMI_DISABLE | XONAR_GPIO_BIT_INVERT, 996 + }, 997 + { 998 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 999 + .name = "Headphone Playback Volume", 1000 + .info = wm8776_hp_vol_info, 1001 + .get = wm8776_hp_vol_get, 1002 + .put = wm8776_hp_vol_put, 1003 + .tlv = { .p = wm8776_hp_db_scale }, 1004 + }, 1005 + WM8776_BIT_SWITCH("Headphone Playback Switch", 1006 + WM8776_PWRDOWN, WM8776_HPPD, 1, 0), 1007 + { 1008 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1009 + .name = "Input Capture Volume", 1010 + .info = wm8776_input_vol_info, 1011 + .get = wm8776_input_vol_get, 1012 + .put = wm8776_input_vol_put, 1013 + .tlv = { .p = wm8776_adc_db_scale }, 1014 + }, 1015 + WM8776_BIT_SWITCH("Mic Capture Switch", 1016 + WM8776_ADCMUX, 1 << 0, 0, 0), 1017 + WM8776_BIT_SWITCH("Aux Capture Switch", 1018 + WM8776_ADCMUX, 1 << 1, 0, 0), 1019 + { 1020 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1021 + .name = "ADC Filter Capture Enum", 1022 + .info = hpf_info, 1023 + .get = hpf_get, 1024 + .put = hpf_put, 1025 + }, 1026 + { 1027 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1028 + .name = "Level Control Capture Enum", 1029 + .info = wm8776_level_control_info, 1030 + .get = wm8776_level_control_get, 1031 + .put = wm8776_level_control_put, 1032 + .private_value = 0, 1033 + }, 1034 + }; 1075 1035 static const struct snd_kcontrol_new lc_controls[] = { 1076 1036 WM8776_FIELD_CTL_VOLUME("Limiter Threshold", 1077 1037 WM8776_ALCCTRL1, 0, 11, 0, 15, 0xf, ··· 1162 1028 LC_CONTROL_ALC, wm8776_ngth_db_scale), 1163 1029 }; 1164 1030 1031 + static int add_lc_controls(struct oxygen *chip) 1032 + { 1033 + struct xonar_wm87x6 *data = chip->model_data; 1034 + unsigned int i; 1035 + struct snd_kcontrol *ctl; 1036 + int err; 1037 + 1038 + BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); 1039 + for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { 1040 + ctl = snd_ctl_new1(&lc_controls[i], chip); 1041 + if (!ctl) 1042 + return -ENOMEM; 1043 + err = snd_ctl_add(chip->card, ctl); 1044 + if (err < 0) 1045 + return err; 1046 + data->lc_controls[i] = ctl; 1047 + } 1048 + return 0; 1049 + } 1050 + 1165 1051 static int xonar_ds_mixer_init(struct oxygen *chip) 1166 1052 { 1167 1053 struct xonar_wm87x6 *data = chip->model_data; ··· 1203 1049 } 1204 1050 if (!data->line_adcmux_control || !data->mic_adcmux_control) 1205 1051 return -ENXIO; 1206 - BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); 1207 - for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { 1208 - ctl = snd_ctl_new1(&lc_controls[i], chip); 1052 + 1053 + return add_lc_controls(chip); 1054 + } 1055 + 1056 + static int xonar_hdav_slim_mixer_init(struct oxygen *chip) 1057 + { 1058 + unsigned int i; 1059 + struct snd_kcontrol *ctl; 1060 + int err; 1061 + 1062 + for (i = 0; i < ARRAY_SIZE(hdav_slim_controls); ++i) { 1063 + ctl = snd_ctl_new1(&hdav_slim_controls[i], chip); 1209 1064 if (!ctl) 1210 1065 return -ENOMEM; 1211 1066 err = snd_ctl_add(chip->card, ctl); 1212 1067 if (err < 0) 1213 1068 return err; 1214 - data->lc_controls[i] = ctl; 1215 1069 } 1216 - return 0; 1070 + 1071 + return add_lc_controls(chip); 1072 + } 1073 + 1074 + static void dump_wm8776_registers(struct oxygen *chip, 1075 + struct snd_info_buffer *buffer) 1076 + { 1077 + struct xonar_wm87x6 *data = chip->model_data; 1078 + unsigned int i; 1079 + 1080 + snd_iprintf(buffer, "\nWM8776:\n00:"); 1081 + for (i = 0; i < 0x10; ++i) 1082 + snd_iprintf(buffer, " %03x", data->wm8776_regs[i]); 1083 + snd_iprintf(buffer, "\n10:"); 1084 + for (i = 0x10; i < 0x17; ++i) 1085 + snd_iprintf(buffer, " %03x", data->wm8776_regs[i]); 1086 + snd_iprintf(buffer, "\n"); 1087 + } 1088 + 1089 + static void dump_wm87x6_registers(struct oxygen *chip, 1090 + struct snd_info_buffer *buffer) 1091 + { 1092 + struct xonar_wm87x6 *data = chip->model_data; 1093 + unsigned int i; 1094 + 1095 + dump_wm8776_registers(chip, buffer); 1096 + snd_iprintf(buffer, "\nWM8766:\n00:"); 1097 + for (i = 0; i < 0x10; ++i) 1098 + snd_iprintf(buffer, " %03x", data->wm8766_regs[i]); 1099 + snd_iprintf(buffer, "\n"); 1217 1100 } 1218 1101 1219 1102 static const struct oxygen_model model_xonar_ds = { ··· 1263 1072 .suspend = xonar_ds_suspend, 1264 1073 .resume = xonar_ds_resume, 1265 1074 .pcm_hardware_filter = wm8776_adc_hardware_filter, 1266 - .get_i2s_mclk = oxygen_default_i2s_mclk, 1267 1075 .set_dac_params = set_wm87x6_dac_params, 1268 1076 .set_adc_params = set_wm8776_adc_params, 1269 1077 .update_dac_volume = update_wm87x6_volume, 1270 1078 .update_dac_mute = update_wm87x6_mute, 1271 1079 .update_center_lfe_mix = update_wm8766_center_lfe_mix, 1272 1080 .gpio_changed = xonar_ds_gpio_changed, 1081 + .dump_registers = dump_wm87x6_registers, 1273 1082 .dac_tlv = wm87x6_dac_db_scale, 1274 1083 .model_data_size = sizeof(struct xonar_wm87x6), 1275 1084 .device_config = PLAYBACK_0_TO_I2S | 1276 1085 PLAYBACK_1_TO_SPDIF | 1277 1086 CAPTURE_0_FROM_I2S_1, 1278 - .dac_channels = 8, 1087 + .dac_channels_pcm = 8, 1088 + .dac_channels_mixer = 8, 1279 1089 .dac_volume_min = 255 - 2*60, 1280 1090 .dac_volume_max = 255, 1281 1091 .function_flags = OXYGEN_FUNCTION_SPI, 1092 + .dac_mclks = OXYGEN_MCLKS(256, 256, 128), 1093 + .adc_mclks = OXYGEN_MCLKS(256, 256, 128), 1094 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1095 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1096 + }; 1097 + 1098 + static const struct oxygen_model model_xonar_hdav_slim = { 1099 + .shortname = "Xonar HDAV1.3 Slim", 1100 + .longname = "Asus Virtuoso 200", 1101 + .chip = "AV200", 1102 + .init = xonar_hdav_slim_init, 1103 + .mixer_init = xonar_hdav_slim_mixer_init, 1104 + .cleanup = xonar_hdav_slim_cleanup, 1105 + .suspend = xonar_hdav_slim_suspend, 1106 + .resume = xonar_hdav_slim_resume, 1107 + .pcm_hardware_filter = xonar_hdav_slim_hardware_filter, 1108 + .set_dac_params = set_hdav_slim_dac_params, 1109 + .set_adc_params = set_wm8776_adc_params, 1110 + .update_dac_volume = update_wm8776_volume, 1111 + .update_dac_mute = update_wm8776_mute, 1112 + .uart_input = xonar_hdmi_uart_input, 1113 + .dump_registers = dump_wm8776_registers, 1114 + .dac_tlv = wm87x6_dac_db_scale, 1115 + .model_data_size = sizeof(struct xonar_wm87x6), 1116 + .device_config = PLAYBACK_0_TO_I2S | 1117 + PLAYBACK_1_TO_SPDIF | 1118 + CAPTURE_0_FROM_I2S_1, 1119 + .dac_channels_pcm = 8, 1120 + .dac_channels_mixer = 2, 1121 + .dac_volume_min = 255 - 2*60, 1122 + .dac_volume_max = 255, 1123 + .function_flags = OXYGEN_FUNCTION_2WIRE, 1124 + .dac_mclks = OXYGEN_MCLKS(256, 256, 128), 1125 + .adc_mclks = OXYGEN_MCLKS(256, 256, 128), 1282 1126 .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1283 1127 .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1284 1128 }; ··· 1324 1098 switch (id->subdevice) { 1325 1099 case 0x838e: 1326 1100 chip->model = model_xonar_ds; 1101 + break; 1102 + case 0x835e: 1103 + chip->model = model_xonar_hdav_slim; 1327 1104 break; 1328 1105 default: 1329 1106 return -EINVAL;
+481 -57
sound/pci/rme9652/hdsp.c
··· 60 60 "{RME HDSP-9652}," 61 61 "{RME HDSP-9632}}"); 62 62 #ifdef HDSP_FW_LOADER 63 + MODULE_FIRMWARE("rpm_firmware.bin"); 63 64 MODULE_FIRMWARE("multiface_firmware.bin"); 64 65 MODULE_FIRMWARE("multiface_firmware_rev11.bin"); 65 66 MODULE_FIRMWARE("digiface_firmware.bin"); ··· 82 81 #define H9632_SS_CHANNELS 12 83 82 #define H9632_DS_CHANNELS 8 84 83 #define H9632_QS_CHANNELS 4 84 + #define RPM_CHANNELS 6 85 85 86 86 /* Write registers. These are defined as byte-offsets from the iobase value. 87 87 */ ··· 192 190 #define HDSP_PhoneGain0 (1<<29) 193 191 #define HDSP_PhoneGain1 (1<<30) 194 192 #define HDSP_QuadSpeed (1<<31) 193 + 194 + /* RPM uses some of the registers for special purposes */ 195 + #define HDSP_RPM_Inp12 0x04A00 196 + #define HDSP_RPM_Inp12_Phon_6dB 0x00800 /* Dolby */ 197 + #define HDSP_RPM_Inp12_Phon_0dB 0x00000 /* .. */ 198 + #define HDSP_RPM_Inp12_Phon_n6dB 0x04000 /* inp_0 */ 199 + #define HDSP_RPM_Inp12_Line_0dB 0x04200 /* Dolby+PRO */ 200 + #define HDSP_RPM_Inp12_Line_n6dB 0x00200 /* PRO */ 201 + 202 + #define HDSP_RPM_Inp34 0x32000 203 + #define HDSP_RPM_Inp34_Phon_6dB 0x20000 /* SyncRef1 */ 204 + #define HDSP_RPM_Inp34_Phon_0dB 0x00000 /* .. */ 205 + #define HDSP_RPM_Inp34_Phon_n6dB 0x02000 /* SyncRef2 */ 206 + #define HDSP_RPM_Inp34_Line_0dB 0x30000 /* SyncRef1+SyncRef0 */ 207 + #define HDSP_RPM_Inp34_Line_n6dB 0x10000 /* SyncRef0 */ 208 + 209 + #define HDSP_RPM_Bypass 0x01000 210 + 211 + #define HDSP_RPM_Disconnect 0x00001 195 212 196 213 #define HDSP_ADGainMask (HDSP_ADGain0|HDSP_ADGain1) 197 214 #define HDSP_ADGainMinus10dBV HDSP_ADGainMask ··· 471 450 u32 creg_spdif; 472 451 u32 creg_spdif_stream; 473 452 int clock_source_locked; 474 - char *card_name; /* digiface/multiface */ 453 + char *card_name; /* digiface/multiface/rpm */ 475 454 enum HDSP_IO_Type io_type; /* ditto, but for code use */ 476 455 unsigned short firmware_rev; 477 456 unsigned short state; /* stores state bits */ ··· 633 612 switch (hdsp->io_type) { 634 613 case Multiface: 635 614 case Digiface: 615 + case RPM: 636 616 default: 637 617 if (hdsp->firmware_rev == 0xa) 638 618 return (64 * out) + (32 + (in)); ··· 651 629 switch (hdsp->io_type) { 652 630 case Multiface: 653 631 case Digiface: 632 + case RPM: 654 633 default: 655 634 if (hdsp->firmware_rev == 0xa) 656 635 return (64 * out) + in; ··· 678 655 { 679 656 if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return 0; 680 657 if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) { 681 - snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n"); 658 + snd_printk("Hammerfall-DSP: no IO box connected!\n"); 682 659 hdsp->state &= ~HDSP_FirmwareLoaded; 683 660 return -EIO; 684 661 } ··· 703 680 } 704 681 } 705 682 706 - snd_printk("Hammerfall-DSP: no Digiface or Multiface connected!\n"); 683 + snd_printk("Hammerfall-DSP: no IO box connected!\n"); 707 684 hdsp->state &= ~HDSP_FirmwareLoaded; 708 685 return -EIO; 709 686 } ··· 775 752 hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD); 776 753 hdsp_write (hdsp, HDSP_fifoData, 0); 777 754 778 - if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT)) { 779 - hdsp->io_type = Multiface; 780 - hdsp_write (hdsp, HDSP_control2Reg, HDSP_VERSION_BIT); 781 - hdsp_write (hdsp, HDSP_control2Reg, HDSP_S_LOAD); 782 - hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT); 755 + if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT)) { 756 + hdsp_write(hdsp, HDSP_control2Reg, HDSP_VERSION_BIT); 757 + hdsp_write(hdsp, HDSP_control2Reg, HDSP_S_LOAD); 758 + if (hdsp_fifo_wait(hdsp, 0, HDSP_SHORT_WAIT)) 759 + hdsp->io_type = RPM; 760 + else 761 + hdsp->io_type = Multiface; 783 762 } else { 784 763 hdsp->io_type = Digiface; 785 764 } 786 765 } else { 787 766 /* firmware was already loaded, get iobox type */ 788 - if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) 767 + if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version2) 768 + hdsp->io_type = RPM; 769 + else if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) 789 770 hdsp->io_type = Multiface; 790 771 else 791 772 hdsp->io_type = Digiface; ··· 1211 1184 hdsp->channel_map = channel_map_ds; 1212 1185 } else { 1213 1186 switch (hdsp->io_type) { 1187 + case RPM: 1214 1188 case Multiface: 1215 1189 hdsp->channel_map = channel_map_mf_ss; 1216 1190 break; ··· 3259 3231 HDSP_USE_MIDI_TASKLET("Use Midi Tasklet", 0), 3260 3232 }; 3261 3233 3234 + 3235 + static int hdsp_rpm_input12(struct hdsp *hdsp) 3236 + { 3237 + switch (hdsp->control_register & HDSP_RPM_Inp12) { 3238 + case HDSP_RPM_Inp12_Phon_6dB: 3239 + return 0; 3240 + case HDSP_RPM_Inp12_Phon_n6dB: 3241 + return 2; 3242 + case HDSP_RPM_Inp12_Line_0dB: 3243 + return 3; 3244 + case HDSP_RPM_Inp12_Line_n6dB: 3245 + return 4; 3246 + } 3247 + return 1; 3248 + } 3249 + 3250 + 3251 + static int snd_hdsp_get_rpm_input12(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3252 + { 3253 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3254 + 3255 + ucontrol->value.enumerated.item[0] = hdsp_rpm_input12(hdsp); 3256 + return 0; 3257 + } 3258 + 3259 + 3260 + static int hdsp_set_rpm_input12(struct hdsp *hdsp, int mode) 3261 + { 3262 + hdsp->control_register &= ~HDSP_RPM_Inp12; 3263 + switch (mode) { 3264 + case 0: 3265 + hdsp->control_register |= HDSP_RPM_Inp12_Phon_6dB; 3266 + break; 3267 + case 1: 3268 + break; 3269 + case 2: 3270 + hdsp->control_register |= HDSP_RPM_Inp12_Phon_n6dB; 3271 + break; 3272 + case 3: 3273 + hdsp->control_register |= HDSP_RPM_Inp12_Line_0dB; 3274 + break; 3275 + case 4: 3276 + hdsp->control_register |= HDSP_RPM_Inp12_Line_n6dB; 3277 + break; 3278 + default: 3279 + return -1; 3280 + } 3281 + 3282 + hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); 3283 + return 0; 3284 + } 3285 + 3286 + 3287 + static int snd_hdsp_put_rpm_input12(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3288 + { 3289 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3290 + int change; 3291 + int val; 3292 + 3293 + if (!snd_hdsp_use_is_exclusive(hdsp)) 3294 + return -EBUSY; 3295 + val = ucontrol->value.enumerated.item[0]; 3296 + if (val < 0) 3297 + val = 0; 3298 + if (val > 4) 3299 + val = 4; 3300 + spin_lock_irq(&hdsp->lock); 3301 + if (val != hdsp_rpm_input12(hdsp)) 3302 + change = (hdsp_set_rpm_input12(hdsp, val) == 0) ? 1 : 0; 3303 + else 3304 + change = 0; 3305 + spin_unlock_irq(&hdsp->lock); 3306 + return change; 3307 + } 3308 + 3309 + 3310 + static int snd_hdsp_info_rpm_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 3311 + { 3312 + static char *texts[] = {"Phono +6dB", "Phono 0dB", "Phono -6dB", "Line 0dB", "Line -6dB"}; 3313 + 3314 + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3315 + uinfo->count = 1; 3316 + uinfo->value.enumerated.items = 5; 3317 + if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 3318 + uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 3319 + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3320 + return 0; 3321 + } 3322 + 3323 + 3324 + static int hdsp_rpm_input34(struct hdsp *hdsp) 3325 + { 3326 + switch (hdsp->control_register & HDSP_RPM_Inp34) { 3327 + case HDSP_RPM_Inp34_Phon_6dB: 3328 + return 0; 3329 + case HDSP_RPM_Inp34_Phon_n6dB: 3330 + return 2; 3331 + case HDSP_RPM_Inp34_Line_0dB: 3332 + return 3; 3333 + case HDSP_RPM_Inp34_Line_n6dB: 3334 + return 4; 3335 + } 3336 + return 1; 3337 + } 3338 + 3339 + 3340 + static int snd_hdsp_get_rpm_input34(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3341 + { 3342 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3343 + 3344 + ucontrol->value.enumerated.item[0] = hdsp_rpm_input34(hdsp); 3345 + return 0; 3346 + } 3347 + 3348 + 3349 + static int hdsp_set_rpm_input34(struct hdsp *hdsp, int mode) 3350 + { 3351 + hdsp->control_register &= ~HDSP_RPM_Inp34; 3352 + switch (mode) { 3353 + case 0: 3354 + hdsp->control_register |= HDSP_RPM_Inp34_Phon_6dB; 3355 + break; 3356 + case 1: 3357 + break; 3358 + case 2: 3359 + hdsp->control_register |= HDSP_RPM_Inp34_Phon_n6dB; 3360 + break; 3361 + case 3: 3362 + hdsp->control_register |= HDSP_RPM_Inp34_Line_0dB; 3363 + break; 3364 + case 4: 3365 + hdsp->control_register |= HDSP_RPM_Inp34_Line_n6dB; 3366 + break; 3367 + default: 3368 + return -1; 3369 + } 3370 + 3371 + hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); 3372 + return 0; 3373 + } 3374 + 3375 + 3376 + static int snd_hdsp_put_rpm_input34(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3377 + { 3378 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3379 + int change; 3380 + int val; 3381 + 3382 + if (!snd_hdsp_use_is_exclusive(hdsp)) 3383 + return -EBUSY; 3384 + val = ucontrol->value.enumerated.item[0]; 3385 + if (val < 0) 3386 + val = 0; 3387 + if (val > 4) 3388 + val = 4; 3389 + spin_lock_irq(&hdsp->lock); 3390 + if (val != hdsp_rpm_input34(hdsp)) 3391 + change = (hdsp_set_rpm_input34(hdsp, val) == 0) ? 1 : 0; 3392 + else 3393 + change = 0; 3394 + spin_unlock_irq(&hdsp->lock); 3395 + return change; 3396 + } 3397 + 3398 + 3399 + /* RPM Bypass switch */ 3400 + static int hdsp_rpm_bypass(struct hdsp *hdsp) 3401 + { 3402 + return (hdsp->control_register & HDSP_RPM_Bypass) ? 1 : 0; 3403 + } 3404 + 3405 + 3406 + static int snd_hdsp_get_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3407 + { 3408 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3409 + 3410 + ucontrol->value.integer.value[0] = hdsp_rpm_bypass(hdsp); 3411 + return 0; 3412 + } 3413 + 3414 + 3415 + static int hdsp_set_rpm_bypass(struct hdsp *hdsp, int on) 3416 + { 3417 + if (on) 3418 + hdsp->control_register |= HDSP_RPM_Bypass; 3419 + else 3420 + hdsp->control_register &= ~HDSP_RPM_Bypass; 3421 + hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); 3422 + return 0; 3423 + } 3424 + 3425 + 3426 + static int snd_hdsp_put_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3427 + { 3428 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3429 + int change; 3430 + unsigned int val; 3431 + 3432 + if (!snd_hdsp_use_is_exclusive(hdsp)) 3433 + return -EBUSY; 3434 + val = ucontrol->value.integer.value[0] & 1; 3435 + spin_lock_irq(&hdsp->lock); 3436 + change = (int)val != hdsp_rpm_bypass(hdsp); 3437 + hdsp_set_rpm_bypass(hdsp, val); 3438 + spin_unlock_irq(&hdsp->lock); 3439 + return change; 3440 + } 3441 + 3442 + 3443 + static int snd_hdsp_info_rpm_bypass(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 3444 + { 3445 + static char *texts[] = {"On", "Off"}; 3446 + 3447 + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3448 + uinfo->count = 1; 3449 + uinfo->value.enumerated.items = 2; 3450 + if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 3451 + uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 3452 + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3453 + return 0; 3454 + } 3455 + 3456 + 3457 + /* RPM Disconnect switch */ 3458 + static int hdsp_rpm_disconnect(struct hdsp *hdsp) 3459 + { 3460 + return (hdsp->control_register & HDSP_RPM_Disconnect) ? 1 : 0; 3461 + } 3462 + 3463 + 3464 + static int snd_hdsp_get_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3465 + { 3466 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3467 + 3468 + ucontrol->value.integer.value[0] = hdsp_rpm_disconnect(hdsp); 3469 + return 0; 3470 + } 3471 + 3472 + 3473 + static int hdsp_set_rpm_disconnect(struct hdsp *hdsp, int on) 3474 + { 3475 + if (on) 3476 + hdsp->control_register |= HDSP_RPM_Disconnect; 3477 + else 3478 + hdsp->control_register &= ~HDSP_RPM_Disconnect; 3479 + hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register); 3480 + return 0; 3481 + } 3482 + 3483 + 3484 + static int snd_hdsp_put_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) 3485 + { 3486 + struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); 3487 + int change; 3488 + unsigned int val; 3489 + 3490 + if (!snd_hdsp_use_is_exclusive(hdsp)) 3491 + return -EBUSY; 3492 + val = ucontrol->value.integer.value[0] & 1; 3493 + spin_lock_irq(&hdsp->lock); 3494 + change = (int)val != hdsp_rpm_disconnect(hdsp); 3495 + hdsp_set_rpm_disconnect(hdsp, val); 3496 + spin_unlock_irq(&hdsp->lock); 3497 + return change; 3498 + } 3499 + 3500 + static int snd_hdsp_info_rpm_disconnect(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 3501 + { 3502 + static char *texts[] = {"On", "Off"}; 3503 + 3504 + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 3505 + uinfo->count = 1; 3506 + uinfo->value.enumerated.items = 2; 3507 + if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 3508 + uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 3509 + strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); 3510 + return 0; 3511 + } 3512 + 3513 + static struct snd_kcontrol_new snd_hdsp_rpm_controls[] = { 3514 + { 3515 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3516 + .name = "RPM Bypass", 3517 + .get = snd_hdsp_get_rpm_bypass, 3518 + .put = snd_hdsp_put_rpm_bypass, 3519 + .info = snd_hdsp_info_rpm_bypass 3520 + }, 3521 + { 3522 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3523 + .name = "RPM Disconnect", 3524 + .get = snd_hdsp_get_rpm_disconnect, 3525 + .put = snd_hdsp_put_rpm_disconnect, 3526 + .info = snd_hdsp_info_rpm_disconnect 3527 + }, 3528 + { 3529 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3530 + .name = "Input 1/2", 3531 + .get = snd_hdsp_get_rpm_input12, 3532 + .put = snd_hdsp_put_rpm_input12, 3533 + .info = snd_hdsp_info_rpm_input 3534 + }, 3535 + { 3536 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3537 + .name = "Input 3/4", 3538 + .get = snd_hdsp_get_rpm_input34, 3539 + .put = snd_hdsp_put_rpm_input34, 3540 + .info = snd_hdsp_info_rpm_input 3541 + }, 3542 + HDSP_SYSTEM_SAMPLE_RATE("System Sample Rate", 0), 3543 + HDSP_MIXER("Mixer", 0) 3544 + }; 3545 + 3262 3546 static struct snd_kcontrol_new snd_hdsp_96xx_aeb = HDSP_AEB("Analog Extension Board", 0); 3263 3547 static struct snd_kcontrol_new snd_hdsp_adat_sync_check = HDSP_ADAT_SYNC_CHECK; 3264 3548 ··· 3579 3239 unsigned int idx; 3580 3240 int err; 3581 3241 struct snd_kcontrol *kctl; 3242 + 3243 + if (hdsp->io_type == RPM) { 3244 + /* RPM Bypass, Disconnect and Input switches */ 3245 + for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_rpm_controls); idx++) { 3246 + err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_hdsp_rpm_controls[idx], hdsp)); 3247 + if (err < 0) 3248 + return err; 3249 + } 3250 + return 0; 3251 + } 3582 3252 3583 3253 for (idx = 0; idx < ARRAY_SIZE(snd_hdsp_controls); idx++) { 3584 3254 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_hdsp_controls[idx], hdsp))) < 0) ··· 3809 3459 3810 3460 snd_iprintf(buffer, "\n"); 3811 3461 3812 - switch (hdsp_spdif_in(hdsp)) { 3813 - case HDSP_SPDIFIN_OPTICAL: 3814 - snd_iprintf(buffer, "IEC958 input: Optical\n"); 3815 - break; 3816 - case HDSP_SPDIFIN_COAXIAL: 3817 - snd_iprintf(buffer, "IEC958 input: Coaxial\n"); 3818 - break; 3819 - case HDSP_SPDIFIN_INTERNAL: 3820 - snd_iprintf(buffer, "IEC958 input: Internal\n"); 3821 - break; 3822 - case HDSP_SPDIFIN_AES: 3823 - snd_iprintf(buffer, "IEC958 input: AES\n"); 3824 - break; 3825 - default: 3826 - snd_iprintf(buffer, "IEC958 input: ???\n"); 3827 - break; 3462 + if (hdsp->io_type != RPM) { 3463 + switch (hdsp_spdif_in(hdsp)) { 3464 + case HDSP_SPDIFIN_OPTICAL: 3465 + snd_iprintf(buffer, "IEC958 input: Optical\n"); 3466 + break; 3467 + case HDSP_SPDIFIN_COAXIAL: 3468 + snd_iprintf(buffer, "IEC958 input: Coaxial\n"); 3469 + break; 3470 + case HDSP_SPDIFIN_INTERNAL: 3471 + snd_iprintf(buffer, "IEC958 input: Internal\n"); 3472 + break; 3473 + case HDSP_SPDIFIN_AES: 3474 + snd_iprintf(buffer, "IEC958 input: AES\n"); 3475 + break; 3476 + default: 3477 + snd_iprintf(buffer, "IEC958 input: ???\n"); 3478 + break; 3479 + } 3828 3480 } 3829 3481 3830 - if (hdsp->control_register & HDSP_SPDIFOpticalOut) 3831 - snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n"); 3832 - else 3833 - snd_iprintf(buffer, "IEC958 output: Coaxial only\n"); 3482 + if (RPM == hdsp->io_type) { 3483 + if (hdsp->control_register & HDSP_RPM_Bypass) 3484 + snd_iprintf(buffer, "RPM Bypass: disabled\n"); 3485 + else 3486 + snd_iprintf(buffer, "RPM Bypass: enabled\n"); 3487 + if (hdsp->control_register & HDSP_RPM_Disconnect) 3488 + snd_iprintf(buffer, "RPM disconnected\n"); 3489 + else 3490 + snd_iprintf(buffer, "RPM connected\n"); 3834 3491 3835 - if (hdsp->control_register & HDSP_SPDIFProfessional) 3836 - snd_iprintf(buffer, "IEC958 quality: Professional\n"); 3837 - else 3838 - snd_iprintf(buffer, "IEC958 quality: Consumer\n"); 3492 + switch (hdsp->control_register & HDSP_RPM_Inp12) { 3493 + case HDSP_RPM_Inp12_Phon_6dB: 3494 + snd_iprintf(buffer, "Input 1/2: Phono, 6dB\n"); 3495 + break; 3496 + case HDSP_RPM_Inp12_Phon_0dB: 3497 + snd_iprintf(buffer, "Input 1/2: Phono, 0dB\n"); 3498 + break; 3499 + case HDSP_RPM_Inp12_Phon_n6dB: 3500 + snd_iprintf(buffer, "Input 1/2: Phono, -6dB\n"); 3501 + break; 3502 + case HDSP_RPM_Inp12_Line_0dB: 3503 + snd_iprintf(buffer, "Input 1/2: Line, 0dB\n"); 3504 + break; 3505 + case HDSP_RPM_Inp12_Line_n6dB: 3506 + snd_iprintf(buffer, "Input 1/2: Line, -6dB\n"); 3507 + break; 3508 + default: 3509 + snd_iprintf(buffer, "Input 1/2: ???\n"); 3510 + } 3839 3511 3840 - if (hdsp->control_register & HDSP_SPDIFEmphasis) 3841 - snd_iprintf(buffer, "IEC958 emphasis: on\n"); 3842 - else 3843 - snd_iprintf(buffer, "IEC958 emphasis: off\n"); 3512 + switch (hdsp->control_register & HDSP_RPM_Inp34) { 3513 + case HDSP_RPM_Inp34_Phon_6dB: 3514 + snd_iprintf(buffer, "Input 3/4: Phono, 6dB\n"); 3515 + break; 3516 + case HDSP_RPM_Inp34_Phon_0dB: 3517 + snd_iprintf(buffer, "Input 3/4: Phono, 0dB\n"); 3518 + break; 3519 + case HDSP_RPM_Inp34_Phon_n6dB: 3520 + snd_iprintf(buffer, "Input 3/4: Phono, -6dB\n"); 3521 + break; 3522 + case HDSP_RPM_Inp34_Line_0dB: 3523 + snd_iprintf(buffer, "Input 3/4: Line, 0dB\n"); 3524 + break; 3525 + case HDSP_RPM_Inp34_Line_n6dB: 3526 + snd_iprintf(buffer, "Input 3/4: Line, -6dB\n"); 3527 + break; 3528 + default: 3529 + snd_iprintf(buffer, "Input 3/4: ???\n"); 3530 + } 3844 3531 3845 - if (hdsp->control_register & HDSP_SPDIFNonAudio) 3846 - snd_iprintf(buffer, "IEC958 NonAudio: on\n"); 3847 - else 3848 - snd_iprintf(buffer, "IEC958 NonAudio: off\n"); 3849 - if ((x = hdsp_spdif_sample_rate (hdsp)) != 0) 3850 - snd_iprintf (buffer, "IEC958 sample rate: %d\n", x); 3851 - else 3852 - snd_iprintf (buffer, "IEC958 sample rate: Error flag set\n"); 3532 + } else { 3533 + if (hdsp->control_register & HDSP_SPDIFOpticalOut) 3534 + snd_iprintf(buffer, "IEC958 output: Coaxial & ADAT1\n"); 3535 + else 3536 + snd_iprintf(buffer, "IEC958 output: Coaxial only\n"); 3853 3537 3538 + if (hdsp->control_register & HDSP_SPDIFProfessional) 3539 + snd_iprintf(buffer, "IEC958 quality: Professional\n"); 3540 + else 3541 + snd_iprintf(buffer, "IEC958 quality: Consumer\n"); 3542 + 3543 + if (hdsp->control_register & HDSP_SPDIFEmphasis) 3544 + snd_iprintf(buffer, "IEC958 emphasis: on\n"); 3545 + else 3546 + snd_iprintf(buffer, "IEC958 emphasis: off\n"); 3547 + 3548 + if (hdsp->control_register & HDSP_SPDIFNonAudio) 3549 + snd_iprintf(buffer, "IEC958 NonAudio: on\n"); 3550 + else 3551 + snd_iprintf(buffer, "IEC958 NonAudio: off\n"); 3552 + x = hdsp_spdif_sample_rate(hdsp); 3553 + if (x != 0) 3554 + snd_iprintf(buffer, "IEC958 sample rate: %d\n", x); 3555 + else 3556 + snd_iprintf(buffer, "IEC958 sample rate: Error flag set\n"); 3557 + } 3854 3558 snd_iprintf(buffer, "\n"); 3855 3559 3856 3560 /* Sync Check */ ··· 4169 3765 snd_hdsp_midi_input_read (&hdsp->midi[0]); 4170 3766 } 4171 3767 } 4172 - if (hdsp->io_type != Multiface && hdsp->io_type != H9632 && midi1 && midi1status) { 3768 + if (hdsp->io_type != Multiface && hdsp->io_type != RPM && hdsp->io_type != H9632 && midi1 && midi1status) { 4173 3769 if (hdsp->use_midi_tasklet) { 4174 3770 /* we disable interrupts for this input until processing is done */ 4175 3771 hdsp->control_register &= ~HDSP_Midi1InterruptEnable; ··· 4497 4093 SNDRV_PCM_RATE_96000), 4498 4094 .rate_min = 32000, 4499 4095 .rate_max = 96000, 4500 - .channels_min = 14, 4096 + .channels_min = 6, 4501 4097 .channels_max = HDSP_MAX_CHANNELS, 4502 4098 .buffer_bytes_max = HDSP_CHANNEL_BUFFER_BYTES * HDSP_MAX_CHANNELS, 4503 4099 .period_bytes_min = (64 * 4) * 10, ··· 4526 4122 SNDRV_PCM_RATE_96000), 4527 4123 .rate_min = 32000, 4528 4124 .rate_max = 96000, 4529 - .channels_min = 14, 4125 + .channels_min = 5, 4530 4126 .channels_max = HDSP_MAX_CHANNELS, 4531 4127 .buffer_bytes_max = HDSP_CHANNEL_BUFFER_BYTES * HDSP_MAX_CHANNELS, 4532 4128 .period_bytes_min = (64 * 4) * 10, ··· 4761 4357 snd_hdsp_hw_rule_rate_out_channels, hdsp, 4762 4358 SNDRV_PCM_HW_PARAM_CHANNELS, -1); 4763 4359 4764 - hdsp->creg_spdif_stream = hdsp->creg_spdif; 4765 - hdsp->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; 4766 - snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE | 4767 - SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id); 4360 + if (RPM != hdsp->io_type) { 4361 + hdsp->creg_spdif_stream = hdsp->creg_spdif; 4362 + hdsp->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; 4363 + snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE | 4364 + SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id); 4365 + } 4768 4366 return 0; 4769 4367 } 4770 4368 ··· 4781 4375 4782 4376 spin_unlock_irq(&hdsp->lock); 4783 4377 4784 - hdsp->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; 4785 - snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE | 4786 - SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id); 4378 + if (RPM != hdsp->io_type) { 4379 + hdsp->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; 4380 + snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE | 4381 + SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id); 4382 + } 4787 4383 return 0; 4788 4384 } 4789 4385 ··· 5024 4616 if (hdsp->io_type != H9632) 5025 4617 info.adatsync_sync_check = (unsigned char)hdsp_adatsync_sync_check(hdsp); 5026 4618 info.spdif_sync_check = (unsigned char)hdsp_spdif_sync_check(hdsp); 5027 - for (i = 0; i < ((hdsp->io_type != Multiface && hdsp->io_type != H9632) ? 3 : 1); ++i) 4619 + for (i = 0; i < ((hdsp->io_type != Multiface && hdsp->io_type != RPM && hdsp->io_type != H9632) ? 3 : 1); ++i) 5028 4620 info.adat_sync_check[i] = (unsigned char)hdsp_adat_sync_check(hdsp, i); 5029 4621 info.spdif_in = (unsigned char)hdsp_spdif_in(hdsp); 5030 4622 info.spdif_out = (unsigned char)hdsp_spdif_out(hdsp); ··· 5044 4636 info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp); 5045 4637 info.xlr_breakout_cable = (unsigned char)hdsp_xlr_breakout_cable(hdsp); 5046 4638 4639 + } else if (hdsp->io_type == RPM) { 4640 + info.da_gain = (unsigned char) hdsp_rpm_input12(hdsp); 4641 + info.ad_gain = (unsigned char) hdsp_rpm_input34(hdsp); 5047 4642 } 5048 4643 if (hdsp->io_type == H9632 || hdsp->io_type == H9652) 5049 4644 info.analog_extension_board = (unsigned char)hdsp_aeb(hdsp); ··· 5255 4844 hdsp->ds_in_channels = hdsp->ds_out_channels = MULTIFACE_DS_CHANNELS; 5256 4845 break; 5257 4846 4847 + case RPM: 4848 + hdsp->card_name = "RME Hammerfall DSP + RPM"; 4849 + hdsp->ss_in_channels = RPM_CHANNELS-1; 4850 + hdsp->ss_out_channels = RPM_CHANNELS; 4851 + hdsp->ds_in_channels = RPM_CHANNELS-1; 4852 + hdsp->ds_out_channels = RPM_CHANNELS; 4853 + break; 4854 + 5258 4855 default: 5259 4856 /* should never get here */ 5260 4857 break; ··· 5349 4930 5350 4931 /* caution: max length of firmware filename is 30! */ 5351 4932 switch (hdsp->io_type) { 4933 + case RPM: 4934 + fwfile = "rpm_firmware.bin"; 4935 + break; 5352 4936 case Multiface: 5353 4937 if (hdsp->firmware_rev == 0xa) 5354 4938 fwfile = "multiface_firmware.bin"; ··· 5522 5100 return 0; 5523 5101 } else { 5524 5102 snd_printk(KERN_INFO "Hammerfall-DSP: Firmware already present, initializing card.\n"); 5525 - if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) 5103 + if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version2) 5104 + hdsp->io_type = RPM; 5105 + else if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) 5526 5106 hdsp->io_type = Multiface; 5527 5107 else 5528 5108 hdsp->io_type = Digiface;
+2 -8
sound/pci/ymfpci/ymfpci_main.c
··· 1389 1389 1390 1390 static int snd_ymfpci_drec_source_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *info) 1391 1391 { 1392 - static char *texts[3] = {"AC'97", "IEC958", "ZV Port"}; 1392 + static const char *const texts[3] = {"AC'97", "IEC958", "ZV Port"}; 1393 1393 1394 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1395 - info->count = 1; 1396 - info->value.enumerated.items = 3; 1397 - if (info->value.enumerated.item > 2) 1398 - info->value.enumerated.item = 2; 1399 - strcpy(info->value.enumerated.name, texts[info->value.enumerated.item]); 1400 - return 0; 1394 + return snd_ctl_enum_info(info, 1, 3, texts); 1401 1395 } 1402 1396 1403 1397 static int snd_ymfpci_drec_source_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *value)
+1 -8
sound/soc/codecs/wm8350.c
··· 1626 1626 { 1627 1627 struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec); 1628 1628 struct wm8350 *wm8350 = dev_get_platdata(codec->dev); 1629 - int ret; 1630 1629 1631 1630 wm8350_clear_bits(wm8350, WM8350_JACK_DETECT, 1632 1631 WM8350_JDL_ENA | WM8350_JDR_ENA); ··· 1640 1641 priv->hpr.jack = NULL; 1641 1642 priv->mic.jack = NULL; 1642 1643 1643 - /* cancel any work waiting to be queued. */ 1644 - ret = cancel_delayed_work(&codec->delayed_work); 1645 - 1646 1644 /* if there was any work waiting then we run it now and 1647 1645 * wait for its completion */ 1648 - if (ret) { 1649 - schedule_delayed_work(&codec->delayed_work, 0); 1650 - flush_scheduled_work(); 1651 - } 1646 + flush_delayed_work_sync(&codec->delayed_work); 1652 1647 1653 1648 wm8350_set_bias_level(codec, SND_SOC_BIAS_OFF); 1654 1649
+1 -20
sound/soc/codecs/wm8753.c
··· 1476 1476 return 0; 1477 1477 } 1478 1478 1479 - /* 1480 - * This function forces any delayed work to be queued and run. 1481 - */ 1482 - static int run_delayed_work(struct delayed_work *dwork) 1483 - { 1484 - int ret; 1485 - 1486 - /* cancel any work waiting to be queued. */ 1487 - ret = cancel_delayed_work(dwork); 1488 - 1489 - /* if there was any work waiting then we run it now and 1490 - * wait for it's completion */ 1491 - if (ret) { 1492 - schedule_delayed_work(dwork, 0); 1493 - flush_scheduled_work(); 1494 - } 1495 - return ret; 1496 - } 1497 - 1498 1479 static int wm8753_probe(struct snd_soc_codec *codec) 1499 1480 { 1500 1481 struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); ··· 1525 1544 /* power down chip */ 1526 1545 static int wm8753_remove(struct snd_soc_codec *codec) 1527 1546 { 1528 - run_delayed_work(&codec->delayed_work); 1547 + flush_delayed_work_sync(&codec->delayed_work); 1529 1548 wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF); 1530 1549 1531 1550 return 0;
+3 -22
sound/soc/soc-core.c
··· 67 67 module_param(pmdown_time, int, 0); 68 68 MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)"); 69 69 70 - /* 71 - * This function forces any delayed work to be queued and run. 72 - */ 73 - static int run_delayed_work(struct delayed_work *dwork) 74 - { 75 - int ret; 76 - 77 - /* cancel any work waiting to be queued. */ 78 - ret = cancel_delayed_work(dwork); 79 - 80 - /* if there was any work waiting then we run it now and 81 - * wait for it's completion */ 82 - if (ret) { 83 - schedule_delayed_work(dwork, 0); 84 - flush_scheduled_work(); 85 - } 86 - return ret; 87 - } 88 - 89 70 /* codec register dump */ 90 71 static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf) 91 72 { ··· 997 1016 998 1017 /* close any waiting streams and save state */ 999 1018 for (i = 0; i < card->num_rtd; i++) { 1000 - run_delayed_work(&card->rtd[i].delayed_work); 1019 + flush_delayed_work_sync(&card->rtd[i].delayed_work); 1001 1020 card->rtd[i].codec->suspend_bias_level = card->rtd[i].codec->bias_level; 1002 1021 } 1003 1022 ··· 1670 1689 /* make sure any delayed work runs */ 1671 1690 for (i = 0; i < card->num_rtd; i++) { 1672 1691 struct snd_soc_pcm_runtime *rtd = &card->rtd[i]; 1673 - run_delayed_work(&rtd->delayed_work); 1692 + flush_delayed_work_sync(&rtd->delayed_work); 1674 1693 } 1675 1694 1676 1695 /* remove and free each DAI */ ··· 1701 1720 * now, we're shutting down so no imminent restart. */ 1702 1721 for (i = 0; i < card->num_rtd; i++) { 1703 1722 struct snd_soc_pcm_runtime *rtd = &card->rtd[i]; 1704 - run_delayed_work(&rtd->delayed_work); 1723 + flush_delayed_work_sync(&rtd->delayed_work); 1705 1724 } 1706 1725 1707 1726 snd_soc_dapm_shutdown(card);
+4 -1
sound/usb/format.c
··· 76 76 format = 1 << UAC_FORMAT_TYPE_I_PCM; 77 77 } 78 78 if (format & (1 << UAC_FORMAT_TYPE_I_PCM)) { 79 - if (sample_width > sample_bytes * 8) { 79 + if (chip->usb_id == USB_ID(0x0582, 0x0016) /* Edirol SD-90 */ && 80 + sample_width == 24 && sample_bytes == 2) 81 + sample_bytes = 3; 82 + else if (sample_width > sample_bytes * 8) { 80 83 snd_printk(KERN_INFO "%d:%u:%d : sample bitwidth %d in over sample bytes %d\n", 81 84 chip->dev->devnum, fp->iface, fp->altsetting, 82 85 sample_width, sample_bytes);
+10 -9
sound/usb/midi.c
··· 850 850 return; 851 851 } 852 852 853 - memset(urb->transfer_buffer + count, 0xFD, 9 - count); 854 - urb->transfer_buffer_length = count; 853 + memset(urb->transfer_buffer + count, 0xFD, ep->max_transfer - count); 854 + urb->transfer_buffer_length = ep->max_transfer; 855 855 } 856 856 857 857 static struct usb_protocol_ops snd_usbmidi_122l_ops = { ··· 1295 1295 case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */ 1296 1296 ep->max_transfer = 4; 1297 1297 break; 1298 + /* 1299 + * Some devices only work with 9 bytes packet size: 1300 + */ 1301 + case USB_ID(0x0644, 0x800E): /* Tascam US-122L */ 1302 + case USB_ID(0x0644, 0x800F): /* Tascam US-144 */ 1303 + ep->max_transfer = 9; 1304 + break; 1298 1305 } 1299 1306 for (i = 0; i < OUTPUT_URBS; ++i) { 1300 1307 buffer = usb_alloc_coherent(umidi->dev, ··· 1736 1729 { 1737 1730 static const char *const names[] = { "High Load", "Light Load" }; 1738 1731 1739 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1740 - info->count = 1; 1741 - info->value.enumerated.items = 2; 1742 - if (info->value.enumerated.item > 1) 1743 - info->value.enumerated.item = 1; 1744 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 1745 - return 0; 1732 + return snd_ctl_enum_info(info, 1, 2, names); 1746 1733 } 1747 1734 1748 1735 static int roland_load_get(struct snd_kcontrol *kcontrol,
+2 -9
sound/usb/mixer.c
··· 1633 1633 static int mixer_ctl_selector_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 1634 1634 { 1635 1635 struct usb_mixer_elem_info *cval = kcontrol->private_data; 1636 - char **itemlist = (char **)kcontrol->private_value; 1636 + const char **itemlist = (const char **)kcontrol->private_value; 1637 1637 1638 1638 if (snd_BUG_ON(!itemlist)) 1639 1639 return -EINVAL; 1640 - uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1641 - uinfo->count = 1; 1642 - uinfo->value.enumerated.items = cval->max; 1643 - if (uinfo->value.enumerated.item >= cval->max) 1644 - uinfo->value.enumerated.item = cval->max - 1; 1645 - strlcpy(uinfo->value.enumerated.name, itemlist[uinfo->value.enumerated.item], 1646 - sizeof(uinfo->value.enumerated.name)); 1647 - return 0; 1640 + return snd_ctl_enum_info(uinfo, 1, cval->max, itemlist); 1648 1641 } 1649 1642 1650 1643 /* get callback for selector unit */
+2 -2
sound/usb/quirks-table.h
··· 705 705 .data = (const struct snd_usb_audio_quirk[]) { 706 706 { 707 707 .ifnum = 0, 708 - .type = QUIRK_IGNORE_INTERFACE 708 + .type = QUIRK_AUDIO_STANDARD_INTERFACE 709 709 }, 710 710 { 711 711 .ifnum = 1, 712 - .type = QUIRK_IGNORE_INTERFACE 712 + .type = QUIRK_AUDIO_STANDARD_INTERFACE 713 713 }, 714 714 { 715 715 .ifnum = 2,
+20 -21
sound/usb/usx2y/us122l.c
··· 273 273 struct file *file, poll_table *wait) 274 274 { 275 275 struct us122l *us122l = hw->private_data; 276 - struct usb_stream *s = us122l->sk.s; 277 276 unsigned *polled; 278 277 unsigned int mask; 279 278 280 279 poll_wait(file, &us122l->sk.sleep, wait); 281 280 282 - switch (s->state) { 283 - case usb_stream_ready: 284 - if (us122l->first == file) 285 - polled = &s->periods_polled; 286 - else 287 - polled = &us122l->second_periods_polled; 288 - if (*polled != s->periods_done) { 289 - *polled = s->periods_done; 290 - mask = POLLIN | POLLOUT | POLLWRNORM; 291 - break; 281 + mask = POLLIN | POLLOUT | POLLWRNORM | POLLERR; 282 + if (mutex_trylock(&us122l->mutex)) { 283 + struct usb_stream *s = us122l->sk.s; 284 + if (s && s->state == usb_stream_ready) { 285 + if (us122l->first == file) 286 + polled = &s->periods_polled; 287 + else 288 + polled = &us122l->second_periods_polled; 289 + if (*polled != s->periods_done) { 290 + *polled = s->periods_done; 291 + mask = POLLIN | POLLOUT | POLLWRNORM; 292 + } else 293 + mask = 0; 292 294 } 293 - /* Fall through */ 294 - mask = 0; 295 - break; 296 - default: 297 - mask = POLLIN | POLLOUT | POLLWRNORM | POLLERR; 298 - break; 295 + mutex_unlock(&us122l->mutex); 299 296 } 300 297 return mask; 301 298 } ··· 378 381 { 379 382 struct usb_stream_config *cfg; 380 383 struct us122l *us122l = hw->private_data; 384 + struct usb_stream *s; 381 385 unsigned min_period_frames; 382 386 int err = 0; 383 387 bool high_speed; ··· 424 426 snd_power_wait(hw->card, SNDRV_CTL_POWER_D0); 425 427 426 428 mutex_lock(&us122l->mutex); 429 + s = us122l->sk.s; 427 430 if (!us122l->master) 428 431 us122l->master = file; 429 432 else if (us122l->master != file) { 430 - if (memcmp(cfg, &us122l->sk.s->cfg, sizeof(*cfg))) { 433 + if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg))) { 431 434 err = -EIO; 432 435 goto unlock; 433 436 } 434 437 us122l->slave = file; 435 438 } 436 - if (!us122l->sk.s || 437 - memcmp(cfg, &us122l->sk.s->cfg, sizeof(*cfg)) || 438 - us122l->sk.s->state == usb_stream_xrun) { 439 + if (!s || memcmp(cfg, &s->cfg, sizeof(*cfg)) || 440 + s->state == usb_stream_xrun) { 439 441 us122l_stop(us122l); 440 442 if (!us122l_start(us122l, cfg->sample_rate, cfg->period_frames)) 441 443 err = -EIO; ··· 446 448 mutex_unlock(&us122l->mutex); 447 449 free: 448 450 kfree(cfg); 451 + wake_up_all(&us122l->sk.sleep); 449 452 return err; 450 453 } 451 454