mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: sound: pss - don't use the deprecated function check_region ALSA: timer - Add NULL-check for invalid slave timer ALSA: timer - Fix Oops at closing slave timer ASoC: Acknowledge WM8996 interrupts before acting on them ASoC: Rename WM8915 to WM8996 ALSA: Fix dependency of CONFIG_SND_TEA575X ALSA: asihpi - use kzalloc() ALSA: snd-usb-caiaq: Fix keymap for RigKontrol3 ALSA: snd-usb: Fix uninitialized variable usage ALSA: hda - Fix a complile warning in patch_via.c ALSA: hdspm - Fix uninitialized compile warnings ALSA: usb-audio - add quirk for Keith McMillen StringPort ALSA: snd-usb: operate on given mixer interface only ALSA: snd-usb: avoid dividing by zero on invalid input ALSA: snd-usb: Accept UAC2 FORMAT_TYPE descriptors with bLength > 6 sound: oss/pas2: Remove CLOCK_TICK_RATE dependency from PAS16 driver ALSA: hda - Use auto-parser for ASUS UX50, Eee PC P901, S101 and P1005 ALSA: hda - Fix digital-mic mono recording on ASUS Eee PC ASoC: sgtl5000: fix cache handling ASoC: Disable wm_hubs periodic DC servo update
This commit is contained in:
commit
6bb615bc39
27 changed files with 6876 additions and 6896 deletions
|
@ -65,7 +65,7 @@
|
|||
#include <plat/iic.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include <sound/wm8915.h>
|
||||
#include <sound/wm8996.h>
|
||||
#include <sound/wm8962.h>
|
||||
#include <sound/wm9081.h>
|
||||
|
||||
|
@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = {
|
|||
.disable_touch = true,
|
||||
};
|
||||
|
||||
static struct wm8915_retune_mobile_config wm8915_retune[] = {
|
||||
static struct wm8996_retune_mobile_config wm8996_retune[] = {
|
||||
{
|
||||
.name = "Sub LPF",
|
||||
.rate = 48000,
|
||||
|
@ -635,12 +635,12 @@ static struct wm8915_retune_mobile_config wm8915_retune[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct wm8915_pdata wm8915_pdata __initdata = {
|
||||
static struct wm8996_pdata wm8996_pdata __initdata = {
|
||||
.ldo_ena = S3C64XX_GPN(7),
|
||||
.gpio_base = CODEC_GPIO_BASE,
|
||||
.micdet_def = 1,
|
||||
.inl_mode = WM8915_DIFFERRENTIAL_1,
|
||||
.inr_mode = WM8915_DIFFERRENTIAL_1,
|
||||
.inl_mode = WM8996_DIFFERRENTIAL_1,
|
||||
.inr_mode = WM8996_DIFFERRENTIAL_1,
|
||||
|
||||
.irq_flags = IRQF_TRIGGER_RISING,
|
||||
|
||||
|
@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = {
|
|||
0x020e, /* GPIO5 == CLKOUT */
|
||||
},
|
||||
|
||||
.retune_mobile_cfgs = wm8915_retune,
|
||||
.num_retune_mobile_cfgs = ARRAY_SIZE(wm8915_retune),
|
||||
.retune_mobile_cfgs = wm8996_retune,
|
||||
.num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune),
|
||||
};
|
||||
|
||||
static struct wm8962_pdata wm8962_pdata __initdata = {
|
||||
|
@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = {
|
|||
.platform_data = &glenfarclas_pmic_pdata },
|
||||
|
||||
{ I2C_BOARD_INFO("wm1250-ev1", 0x27) },
|
||||
{ I2C_BOARD_INFO("wm8915", 0x1a),
|
||||
.platform_data = &wm8915_pdata,
|
||||
{ I2C_BOARD_INFO("wm8996", 0x1a),
|
||||
.platform_data = &wm8996_pdata,
|
||||
.irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
|
||||
},
|
||||
{ I2C_BOARD_INFO("wm9081", 0x6c),
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* linux/sound/wm8915.h -- Platform data for WM8915
|
||||
* linux/sound/wm8996.h -- Platform data for WM8996
|
||||
*
|
||||
* Copyright 2011 Wolfson Microelectronics. PLC.
|
||||
*
|
||||
|
@ -8,14 +8,14 @@
|
|||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_WM8903_H
|
||||
#define __LINUX_SND_WM8903_H
|
||||
#ifndef __LINUX_SND_WM8996_H
|
||||
#define __LINUX_SND_WM8996_H
|
||||
|
||||
enum wm8915_inmode {
|
||||
WM8915_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */
|
||||
WM8915_INVERTING = 1, /* IN1xN */
|
||||
WM8915_NON_INVERTING = 2, /* IN1xP */
|
||||
WM8915_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */
|
||||
enum wm8996_inmode {
|
||||
WM8996_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */
|
||||
WM8996_INVERTING = 1, /* IN1xN */
|
||||
WM8996_NON_INVERTING = 2, /* IN1xP */
|
||||
WM8996_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -25,23 +25,23 @@ enum wm8915_inmode {
|
|||
* Configurations are expected to be generated using the ReTune Mobile
|
||||
* control panel in WISCE - see http://www.wolfsonmicro.com/wisce/
|
||||
*/
|
||||
struct wm8915_retune_mobile_config {
|
||||
struct wm8996_retune_mobile_config {
|
||||
const char *name;
|
||||
int rate;
|
||||
u16 regs[20];
|
||||
};
|
||||
|
||||
#define WM8915_SET_DEFAULT 0x10000
|
||||
#define WM8996_SET_DEFAULT 0x10000
|
||||
|
||||
struct wm8915_pdata {
|
||||
struct wm8996_pdata {
|
||||
int irq_flags; /** Set IRQ trigger flags; default active low */
|
||||
|
||||
int ldo_ena; /** GPIO for LDO1; -1 for none */
|
||||
|
||||
int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */
|
||||
|
||||
enum wm8915_inmode inl_mode;
|
||||
enum wm8915_inmode inr_mode;
|
||||
enum wm8996_inmode inl_mode;
|
||||
enum wm8996_inmode inr_mode;
|
||||
|
||||
u32 spkmute_seq; /** Value for register 0x802 */
|
||||
|
||||
|
@ -49,7 +49,7 @@ struct wm8915_pdata {
|
|||
u32 gpio_default[5];
|
||||
|
||||
int num_retune_mobile_cfgs;
|
||||
struct wm8915_retune_mobile_config *retune_mobile_cfgs;
|
||||
struct wm8996_retune_mobile_config *retune_mobile_cfgs;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -328,6 +328,8 @@ int snd_timer_close(struct snd_timer_instance *timeri)
|
|||
mutex_unlock(®ister_mutex);
|
||||
} else {
|
||||
timer = timeri->timer;
|
||||
if (snd_BUG_ON(!timer))
|
||||
goto out;
|
||||
/* wait, until the active callback is finished */
|
||||
spin_lock_irq(&timer->lock);
|
||||
while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) {
|
||||
|
@ -353,6 +355,7 @@ int snd_timer_close(struct snd_timer_instance *timeri)
|
|||
}
|
||||
mutex_unlock(®ister_mutex);
|
||||
}
|
||||
out:
|
||||
if (timeri->private_free)
|
||||
timeri->private_free(timeri);
|
||||
kfree(timeri->owner);
|
||||
|
@ -531,6 +534,8 @@ int snd_timer_stop(struct snd_timer_instance *timeri)
|
|||
if (err < 0)
|
||||
return err;
|
||||
timer = timeri->timer;
|
||||
if (!timer)
|
||||
return -EINVAL;
|
||||
spin_lock_irqsave(&timer->lock, flags);
|
||||
timeri->cticks = timeri->ticks;
|
||||
timeri->pticks = 0;
|
||||
|
|
|
@ -63,13 +63,13 @@ static int pcm_set_speed(int arg)
|
|||
|
||||
if (pcm_channels & 2)
|
||||
{
|
||||
foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg;
|
||||
arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo;
|
||||
foo = ((PIT_TICK_RATE / 2) + (arg / 2)) / arg;
|
||||
arg = ((PIT_TICK_RATE / 2) + (foo / 2)) / foo;
|
||||
}
|
||||
else
|
||||
{
|
||||
foo = (CLOCK_TICK_RATE + (arg / 2)) / arg;
|
||||
arg = (CLOCK_TICK_RATE + (foo / 2)) / foo;
|
||||
foo = (PIT_TICK_RATE + (arg / 2)) / arg;
|
||||
arg = (PIT_TICK_RATE + (foo / 2)) / foo;
|
||||
}
|
||||
|
||||
pcm_speed = arg;
|
||||
|
|
|
@ -673,7 +673,8 @@ static void configure_nonsound_components(void)
|
|||
|
||||
if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */
|
||||
printk(KERN_INFO "PSS: CDROM port not enabled.\n");
|
||||
} else if (check_region(pss_cdrom_port, 2)) {
|
||||
} else if (!request_region(pss_cdrom_port, 2, "PSS CDROM")) {
|
||||
pss_cdrom_port = -1;
|
||||
printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
|
||||
} else {
|
||||
set_io_base(devc, CONF_CDROM, pss_cdrom_port);
|
||||
|
@ -1232,7 +1233,8 @@ static void __exit cleanup_pss(void)
|
|||
if(pssmpu)
|
||||
unload_pss_mpu(&cfg_mpu);
|
||||
unload_pss(&cfg);
|
||||
}
|
||||
} else if (pss_cdrom_port != -1)
|
||||
release_region(pss_cdrom_port, 2);
|
||||
|
||||
if(!pss_keep_settings) /* Keep hardware settings if asked */
|
||||
{
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
# ALSA PCI drivers
|
||||
|
||||
config SND_TEA575X
|
||||
tristate
|
||||
depends on SND_FM801_TEA575X_BOOL || SND_ES1968_RADIO || RADIO_SF16FMR2
|
||||
default SND_FM801 || SND_ES1968 || RADIO_SF16FMR2
|
||||
|
||||
menuconfig SND_PCI
|
||||
bool "PCI sound devices"
|
||||
depends on PCI
|
||||
|
@ -563,11 +568,6 @@ config SND_FM801_TEA575X_BOOL
|
|||
FM801 chip with a TEA5757 tuner (MediaForte SF256-PCS, SF256-PCP and
|
||||
SF64-PCR) into the snd-fm801 driver.
|
||||
|
||||
config SND_TEA575X
|
||||
tristate
|
||||
depends on SND_FM801_TEA575X_BOOL || SND_ES1968_RADIO || RADIO_SF16FMR2
|
||||
default SND_FM801 || SND_ES1968 || RADIO_SF16FMR2
|
||||
|
||||
source "sound/pci/hda/Kconfig"
|
||||
|
||||
config SND_HDSP
|
||||
|
|
|
@ -631,13 +631,12 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 control_count,
|
|||
if (!p_cache)
|
||||
return NULL;
|
||||
|
||||
p_cache->p_info =
|
||||
kmalloc(sizeof(*p_cache->p_info) * control_count, GFP_KERNEL);
|
||||
p_cache->p_info = kzalloc(sizeof(*p_cache->p_info) * control_count,
|
||||
GFP_KERNEL);
|
||||
if (!p_cache->p_info) {
|
||||
kfree(p_cache);
|
||||
return NULL;
|
||||
}
|
||||
memset(p_cache->p_info, 0, sizeof(*p_cache->p_info) * control_count);
|
||||
p_cache->cache_size_in_bytes = size_in_bytes;
|
||||
p_cache->control_count = control_count;
|
||||
p_cache->p_cache = p_dsp_control_buffer;
|
||||
|
|
|
@ -531,17 +531,10 @@ static const struct snd_pci_quirk alc269_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
|
||||
ALC269_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
|
||||
ALC269_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
|
||||
SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
|
||||
SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
|
||||
SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
|
||||
|
|
|
@ -4484,6 +4484,22 @@ static void alc269_fixup_pcm_44k(struct hda_codec *codec,
|
|||
spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
|
||||
}
|
||||
|
||||
static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix, int action)
|
||||
{
|
||||
int coef;
|
||||
|
||||
if (action != ALC_FIXUP_ACT_INIT)
|
||||
return;
|
||||
/* The digital-mic unit sends PDM (differential signal) instead of
|
||||
* the standard PCM, thus you can't record a valid mono stream as is.
|
||||
* Below is a workaround specific to ALC269 to control the dmic
|
||||
* signal source as mono.
|
||||
*/
|
||||
coef = alc_read_coef_idx(codec, 0x07);
|
||||
alc_write_coef_idx(codec, 0x07, coef | 0x80);
|
||||
}
|
||||
|
||||
enum {
|
||||
ALC269_FIXUP_SONY_VAIO,
|
||||
ALC275_FIXUP_SONY_VAIO_GPIO2,
|
||||
|
@ -4494,6 +4510,7 @@ enum {
|
|||
ALC275_FIXUP_SONY_HWEQ,
|
||||
ALC271_FIXUP_DMIC,
|
||||
ALC269_FIXUP_PCM_44K,
|
||||
ALC269_FIXUP_STEREO_DMIC,
|
||||
};
|
||||
|
||||
static const struct alc_fixup alc269_fixups[] = {
|
||||
|
@ -4556,10 +4573,19 @@ static const struct alc_fixup alc269_fixups[] = {
|
|||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_pcm_44k,
|
||||
},
|
||||
[ALC269_FIXUP_STEREO_DMIC] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_stereo_dmic,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
|
||||
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
|
|
|
@ -2084,7 +2084,7 @@ static int via_auto_create_speaker_ctls(struct hda_codec *codec)
|
|||
struct via_spec *spec = codec->spec;
|
||||
struct nid_path *path;
|
||||
bool check_dac;
|
||||
hda_nid_t pin, dac;
|
||||
hda_nid_t pin, dac = 0;
|
||||
int err;
|
||||
|
||||
pin = spec->autocfg.speaker_pins[0];
|
||||
|
|
|
@ -1339,6 +1339,10 @@ static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
|
|||
break;
|
||||
case MADIface:
|
||||
freq_const = 131072000000000ULL;
|
||||
break;
|
||||
default:
|
||||
snd_BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return div_u64(freq_const, period);
|
||||
|
@ -1356,16 +1360,19 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
|
|||
|
||||
switch (hdspm->io_type) {
|
||||
case MADIface:
|
||||
n = 131072000000000ULL; /* 125 MHz */
|
||||
break;
|
||||
n = 131072000000000ULL; /* 125 MHz */
|
||||
break;
|
||||
case MADI:
|
||||
case AES32:
|
||||
n = 110069313433624ULL; /* 105 MHz */
|
||||
break;
|
||||
n = 110069313433624ULL; /* 105 MHz */
|
||||
break;
|
||||
case RayDAT:
|
||||
case AIO:
|
||||
n = 104857600000000ULL; /* 100 MHz */
|
||||
break;
|
||||
n = 104857600000000ULL; /* 100 MHz */
|
||||
break;
|
||||
default:
|
||||
snd_BUG();
|
||||
return;
|
||||
}
|
||||
|
||||
n = div_u64(n, rate);
|
||||
|
|
|
@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS
|
|||
select SND_SOC_WM8900 if I2C
|
||||
select SND_SOC_WM8903 if I2C
|
||||
select SND_SOC_WM8904 if I2C
|
||||
select SND_SOC_WM8915 if I2C
|
||||
select SND_SOC_WM8940 if I2C
|
||||
select SND_SOC_WM8955 if I2C
|
||||
select SND_SOC_WM8960 if I2C
|
||||
|
@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS
|
|||
select SND_SOC_WM8993 if I2C
|
||||
select SND_SOC_WM8994 if MFD_WM8994
|
||||
select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI
|
||||
select SND_SOC_WM8996 if I2C
|
||||
select SND_SOC_WM9081 if I2C
|
||||
select SND_SOC_WM9090 if I2C
|
||||
select SND_SOC_WM9705 if SND_SOC_AC97_BUS
|
||||
|
@ -329,9 +329,6 @@ config SND_SOC_WM8903
|
|||
config SND_SOC_WM8904
|
||||
tristate
|
||||
|
||||
config SND_SOC_WM8915
|
||||
tristate
|
||||
|
||||
config SND_SOC_WM8940
|
||||
tristate
|
||||
|
||||
|
@ -380,6 +377,9 @@ config SND_SOC_WM8994
|
|||
config SND_SOC_WM8995
|
||||
tristate
|
||||
|
||||
config SND_SOC_WM8996
|
||||
tristate
|
||||
|
||||
config SND_SOC_WM9081
|
||||
tristate
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o
|
|||
snd-soc-wm8900-objs := wm8900.o
|
||||
snd-soc-wm8903-objs := wm8903.o
|
||||
snd-soc-wm8904-objs := wm8904.o
|
||||
snd-soc-wm8915-objs := wm8915.o
|
||||
snd-soc-wm8996-objs := wm8996.o
|
||||
snd-soc-wm8940-objs := wm8940.o
|
||||
snd-soc-wm8955-objs := wm8955.o
|
||||
snd-soc-wm8960-objs := wm8960.o
|
||||
|
@ -160,7 +160,7 @@ obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o
|
|||
obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o
|
||||
obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o
|
||||
obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o
|
||||
obj-$(CONFIG_SND_SOC_WM8915) += snd-soc-wm8915.o
|
||||
obj-$(CONFIG_SND_SOC_WM8996) += snd-soc-wm8996.o
|
||||
obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o
|
||||
obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o
|
||||
obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o
|
||||
|
|
|
@ -33,73 +33,31 @@
|
|||
#define SGTL5000_DAP_REG_OFFSET 0x0100
|
||||
#define SGTL5000_MAX_REG_OFFSET 0x013A
|
||||
|
||||
/* default value of sgtl5000 registers except DAP */
|
||||
static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET >> 1] = {
|
||||
0xa011, /* 0x0000, CHIP_ID. 11 stand for revison 17 */
|
||||
0x0000, /* 0x0002, CHIP_DIG_POWER. */
|
||||
0x0008, /* 0x0004, CHIP_CKL_CTRL */
|
||||
0x0010, /* 0x0006, CHIP_I2S_CTRL */
|
||||
0x0000, /* 0x0008, reserved */
|
||||
0x0008, /* 0x000A, CHIP_SSS_CTRL */
|
||||
0x0000, /* 0x000C, reserved */
|
||||
0x020c, /* 0x000E, CHIP_ADCDAC_CTRL */
|
||||
0x3c3c, /* 0x0010, CHIP_DAC_VOL */
|
||||
0x0000, /* 0x0012, reserved */
|
||||
0x015f, /* 0x0014, CHIP_PAD_STRENGTH */
|
||||
0x0000, /* 0x0016, reserved */
|
||||
0x0000, /* 0x0018, reserved */
|
||||
0x0000, /* 0x001A, reserved */
|
||||
0x0000, /* 0x001E, reserved */
|
||||
0x0000, /* 0x0020, CHIP_ANA_ADC_CTRL */
|
||||
0x1818, /* 0x0022, CHIP_ANA_HP_CTRL */
|
||||
0x0111, /* 0x0024, CHIP_ANN_CTRL */
|
||||
0x0000, /* 0x0026, CHIP_LINREG_CTRL */
|
||||
0x0000, /* 0x0028, CHIP_REF_CTRL */
|
||||
0x0000, /* 0x002A, CHIP_MIC_CTRL */
|
||||
0x0000, /* 0x002C, CHIP_LINE_OUT_CTRL */
|
||||
0x0404, /* 0x002E, CHIP_LINE_OUT_VOL */
|
||||
0x7060, /* 0x0030, CHIP_ANA_POWER */
|
||||
0x5000, /* 0x0032, CHIP_PLL_CTRL */
|
||||
0x0000, /* 0x0034, CHIP_CLK_TOP_CTRL */
|
||||
0x0000, /* 0x0036, CHIP_ANA_STATUS */
|
||||
0x0000, /* 0x0038, reserved */
|
||||
0x0000, /* 0x003A, CHIP_ANA_TEST2 */
|
||||
0x0000, /* 0x003C, CHIP_SHORT_CTRL */
|
||||
0x0000, /* reserved */
|
||||
};
|
||||
|
||||
/* default value of dap registers */
|
||||
static const u16 sgtl5000_dap_regs[] = {
|
||||
0x0000, /* 0x0100, DAP_CONTROL */
|
||||
0x0000, /* 0x0102, DAP_PEQ */
|
||||
0x0040, /* 0x0104, DAP_BASS_ENHANCE */
|
||||
0x051f, /* 0x0106, DAP_BASS_ENHANCE_CTRL */
|
||||
0x0000, /* 0x0108, DAP_AUDIO_EQ */
|
||||
0x0040, /* 0x010A, DAP_SGTL_SURROUND */
|
||||
0x0000, /* 0x010C, DAP_FILTER_COEF_ACCESS */
|
||||
0x0000, /* 0x010E, DAP_COEF_WR_B0_MSB */
|
||||
0x0000, /* 0x0110, DAP_COEF_WR_B0_LSB */
|
||||
0x0000, /* 0x0112, reserved */
|
||||
0x0000, /* 0x0114, reserved */
|
||||
0x002f, /* 0x0116, DAP_AUDIO_EQ_BASS_BAND0 */
|
||||
0x002f, /* 0x0118, DAP_AUDIO_EQ_BAND0 */
|
||||
0x002f, /* 0x011A, DAP_AUDIO_EQ_BAND2 */
|
||||
0x002f, /* 0x011C, DAP_AUDIO_EQ_BAND3 */
|
||||
0x002f, /* 0x011E, DAP_AUDIO_EQ_TREBLE_BAND4 */
|
||||
0x8000, /* 0x0120, DAP_MAIN_CHAN */
|
||||
0x0000, /* 0x0122, DAP_MIX_CHAN */
|
||||
0x0510, /* 0x0124, DAP_AVC_CTRL */
|
||||
0x1473, /* 0x0126, DAP_AVC_THRESHOLD */
|
||||
0x0028, /* 0x0128, DAP_AVC_ATTACK */
|
||||
0x0050, /* 0x012A, DAP_AVC_DECAY */
|
||||
0x0000, /* 0x012C, DAP_COEF_WR_B1_MSB */
|
||||
0x0000, /* 0x012E, DAP_COEF_WR_B1_LSB */
|
||||
0x0000, /* 0x0130, DAP_COEF_WR_B2_MSB */
|
||||
0x0000, /* 0x0132, DAP_COEF_WR_B2_LSB */
|
||||
0x0000, /* 0x0134, DAP_COEF_WR_A1_MSB */
|
||||
0x0000, /* 0x0136, DAP_COEF_WR_A1_LSB */
|
||||
0x0000, /* 0x0138, DAP_COEF_WR_A2_MSB */
|
||||
0x0000, /* 0x013A, DAP_COEF_WR_A2_LSB */
|
||||
/* default value of sgtl5000 registers */
|
||||
static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET] = {
|
||||
[SGTL5000_CHIP_CLK_CTRL] = 0x0008,
|
||||
[SGTL5000_CHIP_I2S_CTRL] = 0x0010,
|
||||
[SGTL5000_CHIP_SSS_CTRL] = 0x0008,
|
||||
[SGTL5000_CHIP_DAC_VOL] = 0x3c3c,
|
||||
[SGTL5000_CHIP_PAD_STRENGTH] = 0x015f,
|
||||
[SGTL5000_CHIP_ANA_HP_CTRL] = 0x1818,
|
||||
[SGTL5000_CHIP_ANA_CTRL] = 0x0111,
|
||||
[SGTL5000_CHIP_LINE_OUT_VOL] = 0x0404,
|
||||
[SGTL5000_CHIP_ANA_POWER] = 0x7060,
|
||||
[SGTL5000_CHIP_PLL_CTRL] = 0x5000,
|
||||
[SGTL5000_DAP_BASS_ENHANCE] = 0x0040,
|
||||
[SGTL5000_DAP_BASS_ENHANCE_CTRL] = 0x051f,
|
||||
[SGTL5000_DAP_SURROUND] = 0x0040,
|
||||
[SGTL5000_DAP_EQ_BASS_BAND0] = 0x002f,
|
||||
[SGTL5000_DAP_EQ_BASS_BAND1] = 0x002f,
|
||||
[SGTL5000_DAP_EQ_BASS_BAND2] = 0x002f,
|
||||
[SGTL5000_DAP_EQ_BASS_BAND3] = 0x002f,
|
||||
[SGTL5000_DAP_EQ_BASS_BAND4] = 0x002f,
|
||||
[SGTL5000_DAP_MAIN_CHAN] = 0x8000,
|
||||
[SGTL5000_DAP_AVC_CTRL] = 0x0510,
|
||||
[SGTL5000_DAP_AVC_THRESHOLD] = 0x1473,
|
||||
[SGTL5000_DAP_AVC_ATTACK] = 0x0028,
|
||||
[SGTL5000_DAP_AVC_DECAY] = 0x0050,
|
||||
};
|
||||
|
||||
/* regulator supplies for sgtl5000, VDDD is an optional external supply */
|
||||
|
@ -1023,12 +981,10 @@ static int sgtl5000_suspend(struct snd_soc_codec *codec, pm_message_t state)
|
|||
static int sgtl5000_restore_regs(struct snd_soc_codec *codec)
|
||||
{
|
||||
u16 *cache = codec->reg_cache;
|
||||
int i;
|
||||
int regular_regs = SGTL5000_CHIP_SHORT_CTRL >> 1;
|
||||
u16 reg;
|
||||
|
||||
/* restore regular registers */
|
||||
for (i = 0; i < regular_regs; i++) {
|
||||
int reg = i << 1;
|
||||
for (reg = 0; reg <= SGTL5000_CHIP_SHORT_CTRL; reg += 2) {
|
||||
|
||||
/* this regs depends on the others */
|
||||
if (reg == SGTL5000_CHIP_ANA_POWER ||
|
||||
|
@ -1038,35 +994,31 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec)
|
|||
reg == SGTL5000_CHIP_CLK_CTRL)
|
||||
continue;
|
||||
|
||||
snd_soc_write(codec, reg, cache[i]);
|
||||
snd_soc_write(codec, reg, cache[reg]);
|
||||
}
|
||||
|
||||
/* restore dap registers */
|
||||
for (i = SGTL5000_DAP_REG_OFFSET >> 1;
|
||||
i < SGTL5000_MAX_REG_OFFSET >> 1; i++) {
|
||||
int reg = i << 1;
|
||||
|
||||
snd_soc_write(codec, reg, cache[i]);
|
||||
}
|
||||
for (reg = SGTL5000_DAP_REG_OFFSET; reg < SGTL5000_MAX_REG_OFFSET; reg += 2)
|
||||
snd_soc_write(codec, reg, cache[reg]);
|
||||
|
||||
/*
|
||||
* restore power and other regs according
|
||||
* to set_power() and set_clock()
|
||||
*/
|
||||
snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL,
|
||||
cache[SGTL5000_CHIP_LINREG_CTRL >> 1]);
|
||||
cache[SGTL5000_CHIP_LINREG_CTRL]);
|
||||
|
||||
snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER,
|
||||
cache[SGTL5000_CHIP_ANA_POWER >> 1]);
|
||||
cache[SGTL5000_CHIP_ANA_POWER]);
|
||||
|
||||
snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL,
|
||||
cache[SGTL5000_CHIP_CLK_CTRL >> 1]);
|
||||
cache[SGTL5000_CHIP_CLK_CTRL]);
|
||||
|
||||
snd_soc_write(codec, SGTL5000_CHIP_REF_CTRL,
|
||||
cache[SGTL5000_CHIP_REF_CTRL >> 1]);
|
||||
cache[SGTL5000_CHIP_REF_CTRL]);
|
||||
|
||||
snd_soc_write(codec, SGTL5000_CHIP_LINE_OUT_CTRL,
|
||||
cache[SGTL5000_CHIP_LINE_OUT_CTRL >> 1]);
|
||||
cache[SGTL5000_CHIP_LINE_OUT_CTRL]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1454,16 +1406,6 @@ static __devinit int sgtl5000_i2c_probe(struct i2c_client *client,
|
|||
if (!sgtl5000)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* copy DAP default values to default value array.
|
||||
* sgtl5000 register space has a big hole, merge it
|
||||
* at init phase makes life easy.
|
||||
* FIXME: should we drop 'const' of sgtl5000_regs?
|
||||
*/
|
||||
memcpy((void *)(&sgtl5000_regs[0] + (SGTL5000_DAP_REG_OFFSET >> 1)),
|
||||
sgtl5000_dap_regs,
|
||||
SGTL5000_MAX_REG_OFFSET - SGTL5000_DAP_REG_OFFSET);
|
||||
|
||||
i2c_set_clientdata(client, sgtl5000);
|
||||
|
||||
ret = snd_soc_register_codec(&client->dev,
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
2994
sound/soc/codecs/wm8996.c
Normal file
2994
sound/soc/codecs/wm8996.c
Normal file
File diff suppressed because it is too large
Load diff
3717
sound/soc/codecs/wm8996.h
Normal file
3717
sound/soc/codecs/wm8996.h
Normal file
File diff suppressed because it is too large
Load diff
|
@ -440,9 +440,8 @@ static int hp_event(struct snd_soc_dapm_widget *w,
|
|||
reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY;
|
||||
snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg);
|
||||
|
||||
/* Smallest supported update interval */
|
||||
snd_soc_update_bits(codec, WM8993_DC_SERVO_1,
|
||||
WM8993_DCS_TIMER_PERIOD_01_MASK, 1);
|
||||
WM8993_DCS_TIMER_PERIOD_01_MASK, 0);
|
||||
|
||||
calibrate_dc_servo(codec);
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE
|
|||
tristate "Audio support for Wolfson Speyside"
|
||||
depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410
|
||||
select SND_SAMSUNG_I2S
|
||||
select SND_SOC_WM8915
|
||||
select SND_SOC_WM8996
|
||||
select SND_SOC_WM9081
|
||||
|
||||
config SND_SOC_SPEYSIDE_WM8962
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
#include <sound/jack.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include "../codecs/wm8915.h"
|
||||
#include "../codecs/wm8996.h"
|
||||
#include "../codecs/wm9081.h"
|
||||
|
||||
#define WM8915_HPSEL_GPIO 214
|
||||
#define WM8996_HPSEL_GPIO 214
|
||||
|
||||
static int speyside_set_bias_level(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_context *dapm,
|
||||
|
@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
|
|||
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_MCLK2,
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, WM8996_SYSCLK_MCLK2,
|
||||
32768, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_dai_set_pll(codec_dai, WM8915_FLL_MCLK2,
|
||||
ret = snd_soc_dai_set_pll(codec_dai, WM8996_FLL_MCLK2,
|
||||
0, 0, 0);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to stop FLL\n");
|
||||
|
@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
|
|||
case SND_SOC_BIAS_PREPARE:
|
||||
if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) {
|
||||
ret = snd_soc_dai_set_pll(codec_dai, 0,
|
||||
WM8915_FLL_MCLK2,
|
||||
WM8996_FLL_MCLK2,
|
||||
32768, 48000 * 256);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to start FLL\n");
|
||||
|
@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
|
|||
}
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai,
|
||||
WM8915_SYSCLK_FLL,
|
||||
WM8996_SYSCLK_FLL,
|
||||
48000 * 256,
|
||||
SND_SOC_CLOCK_IN);
|
||||
if (ret < 0)
|
||||
|
@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec,
|
|||
int polarity)
|
||||
{
|
||||
speyside_jack_polarity = !polarity;
|
||||
gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity);
|
||||
gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity);
|
||||
|
||||
/* Re-run DAPM to make sure we're using the correct mic bias */
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
}
|
||||
|
||||
static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static int speyside_wm8996_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_dai *dai = rtd->codec_dai;
|
||||
struct snd_soc_codec *codec = rtd->codec;
|
||||
int ret;
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(dai, WM8915_SYSCLK_MCLK2, 32768, 0);
|
||||
ret = snd_soc_dai_set_sysclk(dai, WM8996_SYSCLK_MCLK2, 32768, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = gpio_request(WM8915_HPSEL_GPIO, "HP_SEL");
|
||||
ret = gpio_request(WM8996_HPSEL_GPIO, "HP_SEL");
|
||||
if (ret != 0)
|
||||
pr_err("Failed to request HP_SEL GPIO: %d\n", ret);
|
||||
gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity);
|
||||
gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity);
|
||||
|
||||
ret = snd_soc_jack_new(codec, "Headset",
|
||||
SND_JACK_HEADSET | SND_JACK_BTN_0,
|
||||
|
@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
wm8915_detect(codec, &speyside_headset, speyside_set_polarity);
|
||||
wm8996_detect(codec, &speyside_headset, speyside_set_polarity);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = {
|
|||
.name = "CPU",
|
||||
.stream_name = "CPU",
|
||||
.cpu_dai_name = "samsung-i2s.0",
|
||||
.codec_dai_name = "wm8915-aif1",
|
||||
.codec_dai_name = "wm8996-aif1",
|
||||
.platform_name = "samsung-audio",
|
||||
.codec_name = "wm8915.1-001a",
|
||||
.init = speyside_wm8915_init,
|
||||
.codec_name = "wm8996.1-001a",
|
||||
.init = speyside_wm8996_init,
|
||||
.ops = &speyside_ops,
|
||||
},
|
||||
{
|
||||
.name = "Baseband",
|
||||
.stream_name = "Baseband",
|
||||
.cpu_dai_name = "wm8915-aif2",
|
||||
.cpu_dai_name = "wm8996-aif2",
|
||||
.codec_dai_name = "wm1250-ev1",
|
||||
.codec_name = "wm1250-ev1.1-0027",
|
||||
.ops = &speyside_ops,
|
||||
|
|
|
@ -30,7 +30,7 @@ static unsigned short keycode_ak1[] = { KEY_C, KEY_B, KEY_A };
|
|||
static unsigned short keycode_rk2[] = { KEY_1, KEY_2, KEY_3, KEY_4,
|
||||
KEY_5, KEY_6, KEY_7 };
|
||||
static unsigned short keycode_rk3[] = { KEY_1, KEY_2, KEY_3, KEY_4,
|
||||
KEY_5, KEY_6, KEY_7, KEY_5, KEY_6 };
|
||||
KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 };
|
||||
|
||||
static unsigned short keycode_kore[] = {
|
||||
KEY_FN_F1, /* "menu" */
|
||||
|
|
|
@ -352,7 +352,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
|
|||
continue;
|
||||
}
|
||||
if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) ||
|
||||
((protocol == UAC_VERSION_2) && (fmt->bLength != 6))) {
|
||||
((protocol == UAC_VERSION_2) && (fmt->bLength < 6))) {
|
||||
snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
|
||||
dev->devnum, iface_no, altno);
|
||||
continue;
|
||||
|
|
|
@ -1191,6 +1191,11 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void
|
|||
|
||||
if (state->mixer->protocol == UAC_VERSION_1) {
|
||||
csize = hdr->bControlSize;
|
||||
if (!csize) {
|
||||
snd_printdd(KERN_ERR "usbaudio: unit %u: "
|
||||
"invalid bControlSize == 0\n", unitid);
|
||||
return -EINVAL;
|
||||
}
|
||||
channels = (hdr->bLength - 7) / csize - 1;
|
||||
bmaControls = hdr->bmaControls;
|
||||
} else {
|
||||
|
@ -1934,15 +1939,13 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
|||
struct mixer_build state;
|
||||
int err;
|
||||
const struct usbmix_ctl_map *map;
|
||||
struct usb_host_interface *hostif;
|
||||
void *p;
|
||||
|
||||
hostif = mixer->chip->ctrl_intf;
|
||||
memset(&state, 0, sizeof(state));
|
||||
state.chip = mixer->chip;
|
||||
state.mixer = mixer;
|
||||
state.buffer = hostif->extra;
|
||||
state.buflen = hostif->extralen;
|
||||
state.buffer = mixer->hostif->extra;
|
||||
state.buflen = mixer->hostif->extralen;
|
||||
|
||||
/* check the mapping table */
|
||||
for (map = usbmix_ctl_maps; map->id; map++) {
|
||||
|
@ -1955,7 +1958,8 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
|||
}
|
||||
|
||||
p = NULL;
|
||||
while ((p = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, p, UAC_OUTPUT_TERMINAL)) != NULL) {
|
||||
while ((p = snd_usb_find_csint_desc(mixer->hostif->extra, mixer->hostif->extralen,
|
||||
p, UAC_OUTPUT_TERMINAL)) != NULL) {
|
||||
if (mixer->protocol == UAC_VERSION_1) {
|
||||
struct uac1_output_terminal_descriptor *desc = p;
|
||||
|
||||
|
@ -2162,17 +2166,15 @@ int snd_usb_mixer_activate(struct usb_mixer_interface *mixer)
|
|||
/* create the handler for the optional status interrupt endpoint */
|
||||
static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer)
|
||||
{
|
||||
struct usb_host_interface *hostif;
|
||||
struct usb_endpoint_descriptor *ep;
|
||||
void *transfer_buffer;
|
||||
int buffer_length;
|
||||
unsigned int epnum;
|
||||
|
||||
hostif = mixer->chip->ctrl_intf;
|
||||
/* we need one interrupt input endpoint */
|
||||
if (get_iface_desc(hostif)->bNumEndpoints < 1)
|
||||
if (get_iface_desc(mixer->hostif)->bNumEndpoints < 1)
|
||||
return 0;
|
||||
ep = get_endpoint(hostif, 0);
|
||||
ep = get_endpoint(mixer->hostif, 0);
|
||||
if (!usb_endpoint_dir_in(ep) || !usb_endpoint_xfer_int(ep))
|
||||
return 0;
|
||||
|
||||
|
@ -2202,7 +2204,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|||
};
|
||||
struct usb_mixer_interface *mixer;
|
||||
struct snd_info_entry *entry;
|
||||
struct usb_host_interface *host_iface;
|
||||
int err;
|
||||
|
||||
strcpy(chip->card->mixername, "USB Mixer");
|
||||
|
@ -2219,8 +2220,8 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
|
||||
switch (get_iface_desc(host_iface)->bInterfaceProtocol) {
|
||||
mixer->hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
|
||||
switch (get_iface_desc(mixer->hostif)->bInterfaceProtocol) {
|
||||
case UAC_VERSION_1:
|
||||
default:
|
||||
mixer->protocol = UAC_VERSION_1;
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
struct usb_mixer_interface {
|
||||
struct snd_usb_audio *chip;
|
||||
struct usb_host_interface *hostif;
|
||||
struct list_head list;
|
||||
unsigned int ignore_ctl_error;
|
||||
struct urb *urb;
|
||||
|
|
|
@ -2417,6 +2417,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|||
.idProduct = 0x1020,
|
||||
},
|
||||
|
||||
/* KeithMcMillen Stringport */
|
||||
{
|
||||
USB_DEVICE(0x1f38, 0x0001),
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
},
|
||||
|
||||
/* Miditech devices */
|
||||
{
|
||||
USB_DEVICE(0x4752, 0x0011),
|
||||
|
|
|
@ -426,7 +426,7 @@ static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
|
|||
*/
|
||||
static int snd_usb_cm6206_boot_quirk(struct usb_device *dev)
|
||||
{
|
||||
int err, reg;
|
||||
int err = 0, reg;
|
||||
int val[] = {0x2004, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000};
|
||||
|
||||
for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
|
||||
|
|
Loading…
Reference in a new issue