Commit 6bb615bc authored by Linus Torvalds's avatar Linus Torvalds

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
parents ab04fc58 60b1ae0c
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
#include <plat/iic.h> #include <plat/iic.h>
#include <plat/pm.h> #include <plat/pm.h>
#include <sound/wm8915.h> #include <sound/wm8996.h>
#include <sound/wm8962.h> #include <sound/wm8962.h>
#include <sound/wm9081.h> #include <sound/wm9081.h>
...@@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = { ...@@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = {
.disable_touch = true, .disable_touch = true,
}; };
static struct wm8915_retune_mobile_config wm8915_retune[] = { static struct wm8996_retune_mobile_config wm8996_retune[] = {
{ {
.name = "Sub LPF", .name = "Sub LPF",
.rate = 48000, .rate = 48000,
...@@ -635,12 +635,12 @@ static struct wm8915_retune_mobile_config wm8915_retune[] = { ...@@ -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), .ldo_ena = S3C64XX_GPN(7),
.gpio_base = CODEC_GPIO_BASE, .gpio_base = CODEC_GPIO_BASE,
.micdet_def = 1, .micdet_def = 1,
.inl_mode = WM8915_DIFFERRENTIAL_1, .inl_mode = WM8996_DIFFERRENTIAL_1,
.inr_mode = WM8915_DIFFERRENTIAL_1, .inr_mode = WM8996_DIFFERRENTIAL_1,
.irq_flags = IRQF_TRIGGER_RISING, .irq_flags = IRQF_TRIGGER_RISING,
...@@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = { ...@@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = {
0x020e, /* GPIO5 == CLKOUT */ 0x020e, /* GPIO5 == CLKOUT */
}, },
.retune_mobile_cfgs = wm8915_retune, .retune_mobile_cfgs = wm8996_retune,
.num_retune_mobile_cfgs = ARRAY_SIZE(wm8915_retune), .num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune),
}; };
static struct wm8962_pdata wm8962_pdata __initdata = { static struct wm8962_pdata wm8962_pdata __initdata = {
...@@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = { ...@@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = {
.platform_data = &glenfarclas_pmic_pdata }, .platform_data = &glenfarclas_pmic_pdata },
{ I2C_BOARD_INFO("wm1250-ev1", 0x27) }, { I2C_BOARD_INFO("wm1250-ev1", 0x27) },
{ I2C_BOARD_INFO("wm8915", 0x1a), { I2C_BOARD_INFO("wm8996", 0x1a),
.platform_data = &wm8915_pdata, .platform_data = &wm8996_pdata,
.irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
}, },
{ I2C_BOARD_INFO("wm9081", 0x6c), { I2C_BOARD_INFO("wm9081", 0x6c),
......
/* /*
* linux/sound/wm8915.h -- Platform data for WM8915 * linux/sound/wm8996.h -- Platform data for WM8996
* *
* Copyright 2011 Wolfson Microelectronics. PLC. * Copyright 2011 Wolfson Microelectronics. PLC.
* *
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#ifndef __LINUX_SND_WM8903_H #ifndef __LINUX_SND_WM8996_H
#define __LINUX_SND_WM8903_H #define __LINUX_SND_WM8996_H
enum wm8915_inmode { enum wm8996_inmode {
WM8915_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */ WM8996_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */
WM8915_INVERTING = 1, /* IN1xN */ WM8996_INVERTING = 1, /* IN1xN */
WM8915_NON_INVERTING = 2, /* IN1xP */ WM8996_NON_INVERTING = 2, /* IN1xP */
WM8915_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */ WM8996_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */
}; };
/** /**
...@@ -25,23 +25,23 @@ enum wm8915_inmode { ...@@ -25,23 +25,23 @@ enum wm8915_inmode {
* Configurations are expected to be generated using the ReTune Mobile * Configurations are expected to be generated using the ReTune Mobile
* control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/
*/ */
struct wm8915_retune_mobile_config { struct wm8996_retune_mobile_config {
const char *name; const char *name;
int rate; int rate;
u16 regs[20]; 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 irq_flags; /** Set IRQ trigger flags; default active low */
int ldo_ena; /** GPIO for LDO1; -1 for none */ int ldo_ena; /** GPIO for LDO1; -1 for none */
int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */ int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */
enum wm8915_inmode inl_mode; enum wm8996_inmode inl_mode;
enum wm8915_inmode inr_mode; enum wm8996_inmode inr_mode;
u32 spkmute_seq; /** Value for register 0x802 */ u32 spkmute_seq; /** Value for register 0x802 */
...@@ -49,7 +49,7 @@ struct wm8915_pdata { ...@@ -49,7 +49,7 @@ struct wm8915_pdata {
u32 gpio_default[5]; u32 gpio_default[5];
int num_retune_mobile_cfgs; int num_retune_mobile_cfgs;
struct wm8915_retune_mobile_config *retune_mobile_cfgs; struct wm8996_retune_mobile_config *retune_mobile_cfgs;
}; };
#endif #endif
...@@ -328,6 +328,8 @@ int snd_timer_close(struct snd_timer_instance *timeri) ...@@ -328,6 +328,8 @@ int snd_timer_close(struct snd_timer_instance *timeri)
mutex_unlock(&register_mutex); mutex_unlock(&register_mutex);
} else { } else {
timer = timeri->timer; timer = timeri->timer;
if (snd_BUG_ON(!timer))
goto out;
/* wait, until the active callback is finished */ /* wait, until the active callback is finished */
spin_lock_irq(&timer->lock); spin_lock_irq(&timer->lock);
while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) {
...@@ -353,6 +355,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) ...@@ -353,6 +355,7 @@ int snd_timer_close(struct snd_timer_instance *timeri)
} }
mutex_unlock(&register_mutex); mutex_unlock(&register_mutex);
} }
out:
if (timeri->private_free) if (timeri->private_free)
timeri->private_free(timeri); timeri->private_free(timeri);
kfree(timeri->owner); kfree(timeri->owner);
...@@ -531,6 +534,8 @@ int snd_timer_stop(struct snd_timer_instance *timeri) ...@@ -531,6 +534,8 @@ int snd_timer_stop(struct snd_timer_instance *timeri)
if (err < 0) if (err < 0)
return err; return err;
timer = timeri->timer; timer = timeri->timer;
if (!timer)
return -EINVAL;
spin_lock_irqsave(&timer->lock, flags); spin_lock_irqsave(&timer->lock, flags);
timeri->cticks = timeri->ticks; timeri->cticks = timeri->ticks;
timeri->pticks = 0; timeri->pticks = 0;
......
...@@ -63,13 +63,13 @@ static int pcm_set_speed(int arg) ...@@ -63,13 +63,13 @@ static int pcm_set_speed(int arg)
if (pcm_channels & 2) if (pcm_channels & 2)
{ {
foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg; foo = ((PIT_TICK_RATE / 2) + (arg / 2)) / arg;
arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo; arg = ((PIT_TICK_RATE / 2) + (foo / 2)) / foo;
} }
else else
{ {
foo = (CLOCK_TICK_RATE + (arg / 2)) / arg; foo = (PIT_TICK_RATE + (arg / 2)) / arg;
arg = (CLOCK_TICK_RATE + (foo / 2)) / foo; arg = (PIT_TICK_RATE + (foo / 2)) / foo;
} }
pcm_speed = arg; pcm_speed = arg;
......
...@@ -673,7 +673,8 @@ static void configure_nonsound_components(void) ...@@ -673,7 +673,8 @@ static void configure_nonsound_components(void)
if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */ if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */
printk(KERN_INFO "PSS: CDROM port not enabled.\n"); 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"); printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
} else { } else {
set_io_base(devc, CONF_CDROM, pss_cdrom_port); set_io_base(devc, CONF_CDROM, pss_cdrom_port);
...@@ -1232,7 +1233,8 @@ static void __exit cleanup_pss(void) ...@@ -1232,7 +1233,8 @@ static void __exit cleanup_pss(void)
if(pssmpu) if(pssmpu)
unload_pss_mpu(&cfg_mpu); unload_pss_mpu(&cfg_mpu);
unload_pss(&cfg); unload_pss(&cfg);
} } else if (pss_cdrom_port != -1)
release_region(pss_cdrom_port, 2);
if(!pss_keep_settings) /* Keep hardware settings if asked */ if(!pss_keep_settings) /* Keep hardware settings if asked */
{ {
......
# ALSA PCI drivers # 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 menuconfig SND_PCI
bool "PCI sound devices" bool "PCI sound devices"
depends on PCI depends on PCI
...@@ -563,11 +568,6 @@ config SND_FM801_TEA575X_BOOL ...@@ -563,11 +568,6 @@ config SND_FM801_TEA575X_BOOL
FM801 chip with a TEA5757 tuner (MediaForte SF256-PCS, SF256-PCP and FM801 chip with a TEA5757 tuner (MediaForte SF256-PCS, SF256-PCP and
SF64-PCR) into the snd-fm801 driver. 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" source "sound/pci/hda/Kconfig"
config SND_HDSP config SND_HDSP
......
...@@ -631,13 +631,12 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 control_count, ...@@ -631,13 +631,12 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 control_count,
if (!p_cache) if (!p_cache)
return NULL; return NULL;
p_cache->p_info = p_cache->p_info = kzalloc(sizeof(*p_cache->p_info) * control_count,
kmalloc(sizeof(*p_cache->p_info) * control_count, GFP_KERNEL); GFP_KERNEL);
if (!p_cache->p_info) { if (!p_cache->p_info) {
kfree(p_cache); kfree(p_cache);
return NULL; 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->cache_size_in_bytes = size_in_bytes;
p_cache->control_count = control_count; p_cache->control_count = control_count;
p_cache->p_cache = p_dsp_control_buffer; p_cache->p_cache = p_dsp_control_buffer;
......
...@@ -531,17 +531,10 @@ static const struct snd_pci_quirk alc269_cfg_tbl[] = { ...@@ -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, 0x1653, "ASUS U50", ALC269_AMIC),
SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC), SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", 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, 0x1723, "ASUS P80", ALC269_AMIC),
SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC), SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC), SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", 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(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
......
...@@ -4484,6 +4484,22 @@ static void alc269_fixup_pcm_44k(struct hda_codec *codec, ...@@ -4484,6 +4484,22 @@ static void alc269_fixup_pcm_44k(struct hda_codec *codec,
spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; 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 { enum {
ALC269_FIXUP_SONY_VAIO, ALC269_FIXUP_SONY_VAIO,
ALC275_FIXUP_SONY_VAIO_GPIO2, ALC275_FIXUP_SONY_VAIO_GPIO2,
...@@ -4494,6 +4510,7 @@ enum { ...@@ -4494,6 +4510,7 @@ enum {
ALC275_FIXUP_SONY_HWEQ, ALC275_FIXUP_SONY_HWEQ,
ALC271_FIXUP_DMIC, ALC271_FIXUP_DMIC,
ALC269_FIXUP_PCM_44K, ALC269_FIXUP_PCM_44K,
ALC269_FIXUP_STEREO_DMIC,
}; };
static const struct alc_fixup alc269_fixups[] = { static const struct alc_fixup alc269_fixups[] = {
...@@ -4556,10 +4573,19 @@ static const struct alc_fixup alc269_fixups[] = { ...@@ -4556,10 +4573,19 @@ static const struct alc_fixup alc269_fixups[] = {
.type = ALC_FIXUP_FUNC, .type = ALC_FIXUP_FUNC,
.v.func = alc269_fixup_pcm_44k, .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[] = { static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), 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, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
SND_PCI_QUIRK(0x104d, 0x9084, "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) ...@@ -2084,7 +2084,7 @@ static int via_auto_create_speaker_ctls(struct hda_codec *codec)
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
struct nid_path *path; struct nid_path *path;
bool check_dac; bool check_dac;
hda_nid_t pin, dac; hda_nid_t pin, dac = 0;
int err; int err;
pin = spec->autocfg.speaker_pins[0]; pin = spec->autocfg.speaker_pins[0];
......
...@@ -1339,6 +1339,10 @@ static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period) ...@@ -1339,6 +1339,10 @@ static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period)
break; break;
case MADIface: case MADIface:
freq_const = 131072000000000ULL; freq_const = 131072000000000ULL;
break;
default:
snd_BUG();
return 0;
} }
return div_u64(freq_const, period); return div_u64(freq_const, period);
...@@ -1356,16 +1360,19 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate) ...@@ -1356,16 +1360,19 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate)
switch (hdspm->io_type) { switch (hdspm->io_type) {
case MADIface: case MADIface:
n = 131072000000000ULL; /* 125 MHz */ n = 131072000000000ULL; /* 125 MHz */
break; break;
case MADI: case MADI:
case AES32: case AES32:
n = 110069313433624ULL; /* 105 MHz */ n = 110069313433624ULL; /* 105 MHz */
break; break;
case RayDAT: case RayDAT:
case AIO: case AIO:
n = 104857600000000ULL; /* 100 MHz */ n = 104857600000000ULL; /* 100 MHz */
break; break;
default:
snd_BUG();
return;
} }
n = div_u64(n, rate); n = div_u64(n, rate);
......
...@@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS ...@@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8900 if I2C select SND_SOC_WM8900 if I2C
select SND_SOC_WM8903 if I2C select SND_SOC_WM8903 if I2C
select SND_SOC_WM8904 if I2C select SND_SOC_WM8904 if I2C
select SND_SOC_WM8915 if I2C
select SND_SOC_WM8940 if I2C select SND_SOC_WM8940 if I2C
select SND_SOC_WM8955 if I2C select SND_SOC_WM8955 if I2C
select SND_SOC_WM8960 if I2C select SND_SOC_WM8960 if I2C
...@@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS ...@@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_WM8993 if I2C select SND_SOC_WM8993 if I2C
select SND_SOC_WM8994 if MFD_WM8994 select SND_SOC_WM8994 if MFD_WM8994
select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI 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_WM9081 if I2C
select SND_SOC_WM9090 if I2C select SND_SOC_WM9090 if I2C
select SND_SOC_WM9705 if SND_SOC_AC97_BUS select SND_SOC_WM9705 if SND_SOC_AC97_BUS
...@@ -329,9 +329,6 @@ config SND_SOC_WM8903 ...@@ -329,9 +329,6 @@ config SND_SOC_WM8903
config SND_SOC_WM8904 config SND_SOC_WM8904
tristate tristate
config SND_SOC_WM8915
tristate
config SND_SOC_WM8940 config SND_SOC_WM8940
tristate tristate
...@@ -380,6 +377,9 @@ config SND_SOC_WM8994 ...@@ -380,6 +377,9 @@ config SND_SOC_WM8994
config SND_SOC_WM8995 config SND_SOC_WM8995
tristate tristate
config SND_SOC_WM8996
tristate
config SND_SOC_WM9081 config SND_SOC_WM9081
tristate tristate
......
...@@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o ...@@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o
snd-soc-wm8900-objs := wm8900.o snd-soc-wm8900-objs := wm8900.o
snd-soc-wm8903-objs := wm8903.o snd-soc-wm8903-objs := wm8903.o
snd-soc-wm8904-objs := wm8904.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-wm8940-objs := wm8940.o
snd-soc-wm8955-objs := wm8955.o snd-soc-wm8955-objs := wm8955.o
snd-soc-wm8960-objs := wm8960.o snd-soc-wm8960-objs := wm8960.o
...@@ -160,7 +160,7 @@ obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.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_WM8900) += snd-soc-wm8900.o
obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o
obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.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_WM8940) += snd-soc-wm8940.o
obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o
obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o
......
...@@ -33,73 +33,31 @@ ...@@ -33,73 +33,31 @@
#define SGTL5000_DAP_REG_OFFSET 0x0100 #define SGTL5000_DAP_REG_OFFSET 0x0100
#define SGTL5000_MAX_REG_OFFSET 0x013A #define SGTL5000_MAX_REG_OFFSET 0x013A
/* default value of sgtl5000 registers except DAP */ /* default value of sgtl5000 registers */
static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET >> 1] = { static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET] = {
0xa011, /* 0x0000, CHIP_ID. 11 stand for revison 17 */ [SGTL5000_CHIP_CLK_CTRL] = 0x0008,
0x0000, /* 0x0002, CHIP_DIG_POWER. */ [SGTL5000_CHIP_I2S_CTRL] = 0x0010,
0x0008, /* 0x0004, CHIP_CKL_CTRL */ [SGTL5000_CHIP_SSS_CTRL] = 0x0008,
0x0010, /* 0x0006, CHIP_I2S_CTRL */ [SGTL5000_CHIP_DAC_VOL] = 0x3c3c,
0x0000, /* 0x0008, reserved */ [SGTL5000_CHIP_PAD_STRENGTH] = 0x015f,
0x0008, /* 0x000A, CHIP_SSS_CTRL */ [SGTL5000_CHIP_ANA_HP_CTRL] = 0x1818,
0x0000, /* 0x000C, reserved */ [SGTL5000_CHIP_ANA_CTRL] = 0x0111,
0x020c, /* 0x000E, CHIP_ADCDAC_CTRL */ [SGTL5000_CHIP_LINE_OUT_VOL] = 0x0404,
0x3c3c, /* 0x0010, CHIP_DAC_VOL */ [SGTL5000_CHIP_ANA_POWER] = 0x7060,
0x0000, /* 0x0012, reserved */ [SGTL5000_CHIP_PLL_CTRL] = 0x5000,
0x015f, /* 0x0014, CHIP_PAD_STRENGTH */ [SGTL5000_DAP_BASS_ENHANCE] = 0x0040,
0x0000, /* 0x0016, reserved */ [SGTL5000_DAP_BASS_ENHANCE_CTRL] = 0x051f,
0x0000, /* 0x0018, reserved */ [SGTL5000_DAP_SURROUND] = 0x0040,
0x0000, /* 0x001A, reserved */ [SGTL5000_DAP_EQ_BASS_BAND0] = 0x002f,
0x0000, /* 0x001E, reserved */ [SGTL5000_DAP_EQ_BASS_BAND1] = 0x002f,
0x0000, /* 0x0020, CHIP_ANA_ADC_CTRL */ [SGTL5000_DAP_EQ_BASS_BAND2] = 0x002f,
0x1818, /* 0x0022, CHIP_ANA_HP_CTRL */ [SGTL5000_DAP_EQ_BASS_BAND3] = 0x002f,
0x0111, /* 0x0024, CHIP_ANN_CTRL */ [SGTL5000_DAP_EQ_BASS_BAND4] = 0x002f,
0x0000, /* 0x0026, CHIP_LINREG_CTRL */ [SGTL5000_DAP_MAIN_CHAN] = 0x8000,
0x0000, /* 0x0028, CHIP_REF_CTRL */ [SGTL5000_DAP_AVC_CTRL] = 0x0510,
0x0000, /* 0x002A, CHIP_MIC_CTRL */ [SGTL5000_DAP_AVC_THRESHOLD] = 0x1473,
0x0000, /* 0x002C, CHIP_LINE_OUT_CTRL */ [SGTL5000_DAP_AVC_ATTACK] = 0x0028,
0x0404, /* 0x002E, CHIP_LINE_OUT_VOL */ [SGTL5000_DAP_AVC_DECAY] = 0x0050,
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 */
}; };
/* regulator supplies for sgtl5000, VDDD is an optional external supply */ /* 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) ...@@ -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) static int sgtl5000_restore_regs(struct snd_soc_codec *codec)
{ {
u16 *cache = codec->reg_cache; u16 *cache = codec->reg_cache;
int i; u16 reg;
int regular_regs = SGTL5000_CHIP_SHORT_CTRL >> 1;
/* restore regular registers */ /* restore regular registers */
for (i = 0; i < regular_regs; i++) { for (reg = 0; reg <= SGTL5000_CHIP_SHORT_CTRL; reg += 2) {
int reg = i << 1;
/* this regs depends on the others */ /* this regs depends on the others */
if (reg == SGTL5000_CHIP_ANA_POWER || if (reg == SGTL5000_CHIP_ANA_POWER ||
...@@ -1038,35 +994,31 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec) ...@@ -1038,35 +994,31 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec)
reg == SGTL5000_CHIP_CLK_CTRL) reg == SGTL5000_CHIP_CLK_CTRL)
continue; continue;
snd_soc_write(codec, reg, cache[i]); snd_soc_write(codec, reg, cache[reg]);
} }
/* restore dap registers */ /* restore dap registers */
for (i = SGTL5000_DAP_REG_OFFSET >> 1; for (reg = SGTL5000_DAP_REG_OFFSET; reg < SGTL5000_MAX_REG_OFFSET; reg += 2)
i < SGTL5000_MAX_REG_OFFSET >> 1; i++) { snd_soc_write(codec, reg, cache[reg]);
int reg = i << 1;
snd_soc_write(codec, reg, cache[i]);
}
/* /*
* restore power and other regs according * restore power and other regs according
* to set_power() and set_clock() * to set_power() and set_clock()
*/ */
snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, 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, 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, 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, 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, snd_soc_write(codec, SGTL5000_CHIP_LINE_OUT_CTRL,
cache[SGTL5000_CHIP_LINE_OUT_CTRL >> 1]); cache[SGTL5000_CHIP_LINE_OUT_CTRL]);
return 0; return 0;
} }
...@@ -1454,16 +1406,6 @@ static __devinit int sgtl5000_i2c_probe(struct i2c_client *client, ...@@ -1454,16 +1406,6 @@ static __devinit int sgtl5000_i2c_probe(struct i2c_client *client,
if (!sgtl5000) if (!sgtl5000)
return -ENOMEM; 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); i2c_set_clientdata(client, sgtl5000);
ret = snd_soc_register_codec(&client->dev, ret = snd_soc_register_codec(&client->dev,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -440,9 +440,8 @@ static int hp_event(struct snd_soc_dapm_widget *w, ...@@ -440,9 +440,8 @@ static int hp_event(struct snd_soc_dapm_widget *w,
reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY; reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY;
snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg); snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg);
/* Smallest supported update interval */
snd_soc_update_bits(codec, WM8993_DC_SERVO_1, 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); calibrate_dc_servo(codec);
......
...@@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE ...@@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE
tristate "Audio support for Wolfson Speyside" tristate "Audio support for Wolfson Speyside"
depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410
select SND_SAMSUNG_I2S select SND_SAMSUNG_I2S
select SND_SOC_WM8915 select SND_SOC_WM8996
select SND_SOC_WM9081 select SND_SOC_WM9081
config SND_SOC_SPEYSIDE_WM8962 config SND_SOC_SPEYSIDE_WM8962
......
...@@ -14,10 +14,10 @@ ...@@ -14,10 +14,10 @@
#include <sound/jack.h> #include <sound/jack.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include "../codecs/wm8915.h" #include "../codecs/wm8996.h"
#include "../codecs/wm9081.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, static int speyside_set_bias_level(struct snd_soc_card *card,
struct snd_soc_dapm_context *dapm, struct snd_soc_dapm_context *dapm,
...@@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card, ...@@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
switch (level) { switch (level) {
case SND_SOC_BIAS_STANDBY: 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); 32768, SND_SOC_CLOCK_IN);
if (ret < 0) if (ret < 0)
return ret; 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); 0, 0, 0);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to stop FLL\n"); pr_err("Failed to stop FLL\n");
...@@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, ...@@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) {
ret = snd_soc_dai_set_pll(codec_dai, 0, ret = snd_soc_dai_set_pll(codec_dai, 0,
WM8915_FLL_MCLK2, WM8996_FLL_MCLK2,
32768, 48000 * 256); 32768, 48000 * 256);
if (ret < 0) { if (ret < 0) {
pr_err("Failed to start FLL\n"); pr_err("Failed to start FLL\n");
...@@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, ...@@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
} }
ret = snd_soc_dai_set_sysclk(codec_dai, ret = snd_soc_dai_set_sysclk(codec_dai,
WM8915_SYSCLK_FLL, WM8996_SYSCLK_FLL,
48000 * 256, 48000 * 256,
SND_SOC_CLOCK_IN); SND_SOC_CLOCK_IN);
if (ret < 0) if (ret < 0)
...@@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec, ...@@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec,
int polarity) int polarity)
{ {
speyside_jack_polarity = !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 */ /* Re-run DAPM to make sure we're using the correct mic bias */
snd_soc_dapm_sync(&codec->dapm); 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_dai *dai = rtd->codec_dai;
struct snd_soc_codec *codec = rtd->codec; struct snd_soc_codec *codec = rtd->codec;
int ret; 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) if (ret < 0)
return ret; return ret;
ret = gpio_request(WM8915_HPSEL_GPIO, "HP_SEL"); ret = gpio_request(WM8996_HPSEL_GPIO, "HP_SEL");
if (ret != 0) if (ret != 0)
pr_err("Failed to request HP_SEL GPIO: %d\n", ret); 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", ret = snd_soc_jack_new(codec, "Headset",
SND_JACK_HEADSET | SND_JACK_BTN_0, SND_JACK_HEADSET | SND_JACK_BTN_0,
...@@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd) ...@@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd)
if (ret) if (ret)
return ret; return ret;
wm8915_detect(codec, &speyside_headset, speyside_set_polarity); wm8996_detect(codec, &speyside_headset, speyside_set_polarity);
return 0; return 0;
} }
...@@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = { ...@@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = {
.name = "CPU", .name = "CPU",
.stream_name = "CPU", .stream_name = "CPU",
.cpu_dai_name = "samsung-i2s.0", .cpu_dai_name = "samsung-i2s.0",
.codec_dai_name = "wm8915-aif1", .codec_dai_name = "wm8996-aif1",
.platform_name = "samsung-audio", .platform_name = "samsung-audio",
.codec_name = "wm8915.1-001a", .codec_name = "wm8996.1-001a",
.init = speyside_wm8915_init, .init = speyside_wm8996_init,
.ops = &speyside_ops, .ops = &speyside_ops,
}, },
{ {
.name = "Baseband", .name = "Baseband",
.stream_name = "Baseband", .stream_name = "Baseband",
.cpu_dai_name = "wm8915-aif2", .cpu_dai_name = "wm8996-aif2",
.codec_dai_name = "wm1250-ev1", .codec_dai_name = "wm1250-ev1",
.codec_name = "wm1250-ev1.1-0027", .codec_name = "wm1250-ev1.1-0027",
.ops = &speyside_ops, .ops = &speyside_ops,
......
...@@ -30,7 +30,7 @@ static unsigned short keycode_ak1[] = { KEY_C, KEY_B, KEY_A }; ...@@ -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, static unsigned short keycode_rk2[] = { KEY_1, KEY_2, KEY_3, KEY_4,
KEY_5, KEY_6, KEY_7 }; KEY_5, KEY_6, KEY_7 };
static unsigned short keycode_rk3[] = { KEY_1, KEY_2, KEY_3, KEY_4, 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[] = { static unsigned short keycode_kore[] = {
KEY_FN_F1, /* "menu" */ KEY_FN_F1, /* "menu" */
......
...@@ -352,7 +352,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) ...@@ -352,7 +352,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
continue; continue;
} }
if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) || 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", snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
dev->devnum, iface_no, altno); dev->devnum, iface_no, altno);
continue; continue;
......
...@@ -1191,6 +1191,11 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void ...@@ -1191,6 +1191,11 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void
if (state->mixer->protocol == UAC_VERSION_1) { if (state->mixer->protocol == UAC_VERSION_1) {
csize = hdr->bControlSize; 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; channels = (hdr->bLength - 7) / csize - 1;
bmaControls = hdr->bmaControls; bmaControls = hdr->bmaControls;
} else { } else {
...@@ -1934,15 +1939,13 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) ...@@ -1934,15 +1939,13 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
struct mixer_build state; struct mixer_build state;
int err; int err;
const struct usbmix_ctl_map *map; const struct usbmix_ctl_map *map;
struct usb_host_interface *hostif;
void *p; void *p;
hostif = mixer->chip->ctrl_intf;
memset(&state, 0, sizeof(state)); memset(&state, 0, sizeof(state));
state.chip = mixer->chip; state.chip = mixer->chip;
state.mixer = mixer; state.mixer = mixer;
state.buffer = hostif->extra; state.buffer = mixer->hostif->extra;
state.buflen = hostif->extralen; state.buflen = mixer->hostif->extralen;
/* check the mapping table */ /* check the mapping table */
for (map = usbmix_ctl_maps; map->id; map++) { for (map = usbmix_ctl_maps; map->id; map++) {
...@@ -1955,7 +1958,8 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) ...@@ -1955,7 +1958,8 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
} }
p = NULL; 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) { if (mixer->protocol == UAC_VERSION_1) {
struct uac1_output_terminal_descriptor *desc = p; struct uac1_output_terminal_descriptor *desc = p;
...@@ -2162,17 +2166,15 @@ int snd_usb_mixer_activate(struct usb_mixer_interface *mixer) ...@@ -2162,17 +2166,15 @@ int snd_usb_mixer_activate(struct usb_mixer_interface *mixer)
/* create the handler for the optional status interrupt endpoint */ /* create the handler for the optional status interrupt endpoint */
static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer) static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer)
{ {
struct usb_host_interface *hostif;
struct usb_endpoint_descriptor *ep; struct usb_endpoint_descriptor *ep;
void *transfer_buffer; void *transfer_buffer;
int buffer_length; int buffer_length;
unsigned int epnum; unsigned int epnum;
hostif = mixer->chip->ctrl_intf;
/* we need one interrupt input endpoint */ /* we need one interrupt input endpoint */
if (get_iface_desc(hostif)->bNumEndpoints < 1) if (get_iface_desc(mixer->hostif)->bNumEndpoints < 1)
return 0; return 0;
ep = get_endpoint(hostif, 0); ep = get_endpoint(mixer->hostif, 0);
if (!usb_endpoint_dir_in(ep) || !usb_endpoint_xfer_int(ep)) if (!usb_endpoint_dir_in(ep) || !usb_endpoint_xfer_int(ep))
return 0; return 0;
...@@ -2202,7 +2204,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, ...@@ -2202,7 +2204,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
}; };
struct usb_mixer_interface *mixer; struct usb_mixer_interface *mixer;
struct snd_info_entry *entry; struct snd_info_entry *entry;
struct usb_host_interface *host_iface;
int err; int err;
strcpy(chip->card->mixername, "USB Mixer"); strcpy(chip->card->mixername, "USB Mixer");
...@@ -2219,8 +2220,8 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, ...@@ -2219,8 +2220,8 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
return -ENOMEM; return -ENOMEM;
} }
host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; mixer->hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
switch (get_iface_desc(host_iface)->bInterfaceProtocol) { switch (get_iface_desc(mixer->hostif)->bInterfaceProtocol) {
case UAC_VERSION_1: case UAC_VERSION_1:
default: default:
mixer->protocol = UAC_VERSION_1; mixer->protocol = UAC_VERSION_1;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
struct usb_mixer_interface { struct usb_mixer_interface {
struct snd_usb_audio *chip; struct snd_usb_audio *chip;
struct usb_host_interface *hostif;
struct list_head list; struct list_head list;
unsigned int ignore_ctl_error; unsigned int ignore_ctl_error;
struct urb *urb; struct urb *urb;
......
...@@ -2417,6 +2417,12 @@ YAMAHA_DEVICE(0x7010, "UB99"), ...@@ -2417,6 +2417,12 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.idProduct = 0x1020, .idProduct = 0x1020,
}, },
/* KeithMcMillen Stringport */
{
USB_DEVICE(0x1f38, 0x0001),
.bInterfaceClass = USB_CLASS_AUDIO,
},
/* Miditech devices */ /* Miditech devices */
{ {
USB_DEVICE(0x4752, 0x0011), USB_DEVICE(0x4752, 0x0011),
......
...@@ -426,7 +426,7 @@ static int snd_usb_cm106_boot_quirk(struct usb_device *dev) ...@@ -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) 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}; int val[] = {0x2004, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000};
for (reg = 0; reg < ARRAY_SIZE(val); reg++) { for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment