mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-01 11:32:33 +07:00
Merge branch 'fix/misc' into topic/misc
This commit is contained in:
commit
cc99a0861f
@ -296,6 +296,7 @@ Conexant 5066
|
||||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp-laptop HP laptops, e g G60
|
||||
asus Asus K52JU, Lenovo G560
|
||||
dell-laptop Dell laptops
|
||||
dell-vostro Dell Vostro
|
||||
olpc-xo-1_5 OLPC XO 1.5
|
||||
|
@ -33,9 +33,12 @@
|
||||
#include <linux/dw_dmac.h>
|
||||
|
||||
#include <mach/cpu.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/gpio.h>
|
||||
|
||||
#ifdef CONFIG_ARCH_AT91
|
||||
#include <mach/hardware.h>
|
||||
#endif
|
||||
|
||||
#include "ac97c.h"
|
||||
|
||||
enum {
|
||||
|
@ -45,12 +45,13 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
|
||||
{
|
||||
struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt);
|
||||
struct snd_timer *t = stime->timer;
|
||||
unsigned long oruns;
|
||||
|
||||
if (!atomic_read(&stime->running))
|
||||
return HRTIMER_NORESTART;
|
||||
|
||||
hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution));
|
||||
snd_timer_interrupt(stime->timer, t->sticks);
|
||||
oruns = hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution));
|
||||
snd_timer_interrupt(stime->timer, t->sticks * oruns);
|
||||
|
||||
if (!atomic_read(&stime->running))
|
||||
return HRTIMER_NORESTART;
|
||||
@ -104,7 +105,7 @@ static int snd_hrtimer_stop(struct snd_timer *t)
|
||||
}
|
||||
|
||||
static struct snd_timer_hardware hrtimer_hw = {
|
||||
.flags = SNDRV_TIMER_HW_AUTO,
|
||||
.flags = SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_TASKLET,
|
||||
.open = snd_hrtimer_open,
|
||||
.close = snd_hrtimer_close,
|
||||
.start = snd_hrtimer_start,
|
||||
|
@ -141,6 +141,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
|
||||
fail_input:
|
||||
input_free_device(jack->input_dev);
|
||||
kfree(jack->id);
|
||||
kfree(jack);
|
||||
return err;
|
||||
}
|
||||
|
@ -55,14 +55,13 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/initval.h>
|
||||
#include <sound/rawmidi.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
* globals
|
||||
*/
|
||||
|
@ -87,7 +87,7 @@ ifeq ($(CONFIG_PSS_HAVE_BOOT),y)
|
||||
$(obj)/bin2hex pss_synth < $< > $@
|
||||
else
|
||||
$(obj)/pss_boot.h:
|
||||
( \
|
||||
$(Q)( \
|
||||
echo 'static unsigned char * pss_synth = NULL;'; \
|
||||
echo 'static int pss_synthLen = 0;'; \
|
||||
) > $@
|
||||
@ -102,7 +102,7 @@ ifeq ($(CONFIG_TRIX_HAVE_BOOT),y)
|
||||
$(obj)/hex2hex -i trix_boot < $< > $@
|
||||
else
|
||||
$(obj)/trix_boot.h:
|
||||
( \
|
||||
$(Q)( \
|
||||
echo 'static unsigned char * trix_boot = NULL;'; \
|
||||
echo 'static int trix_boot_len = 0;'; \
|
||||
) > $@
|
||||
|
@ -1252,11 +1252,19 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
|
||||
static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma)
|
||||
{
|
||||
stream_t *dma = &vortex->dma_adb[adbdma];
|
||||
int temp;
|
||||
int temp, page, delta;
|
||||
|
||||
temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2));
|
||||
temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1));
|
||||
return temp;
|
||||
page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT;
|
||||
if (dma->nr_periods >= 4)
|
||||
delta = (page - dma->period_real) & 3;
|
||||
else {
|
||||
delta = (page - dma->period_real);
|
||||
if (delta < 0)
|
||||
delta += dma->nr_periods;
|
||||
}
|
||||
return (dma->period_virt + delta) * dma->period_bytes
|
||||
+ (temp & (dma->period_bytes - 1));
|
||||
}
|
||||
|
||||
static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma)
|
||||
|
@ -1317,31 +1317,25 @@ snd_azf3328_codec_setfmt(struct snd_azf3328_codec_data *codec,
|
||||
|
||||
snd_azf3328_dbgcallenter();
|
||||
switch (bitrate) {
|
||||
#define AZF_FMT_XLATE(in_freq, out_bits) \
|
||||
do { \
|
||||
case AZF_FREQ_ ## in_freq: \
|
||||
freq = SOUNDFORMAT_FREQ_ ## out_bits; \
|
||||
break; \
|
||||
} while (0);
|
||||
AZF_FMT_XLATE(4000, SUSPECTED_4000)
|
||||
AZF_FMT_XLATE(4800, SUSPECTED_4800)
|
||||
/* the AZF3328 names it "5510" for some strange reason: */
|
||||
AZF_FMT_XLATE(5512, 5510)
|
||||
AZF_FMT_XLATE(6620, 6620)
|
||||
AZF_FMT_XLATE(8000, 8000)
|
||||
AZF_FMT_XLATE(9600, 9600)
|
||||
AZF_FMT_XLATE(11025, 11025)
|
||||
AZF_FMT_XLATE(13240, SUSPECTED_13240)
|
||||
AZF_FMT_XLATE(16000, 16000)
|
||||
AZF_FMT_XLATE(22050, 22050)
|
||||
AZF_FMT_XLATE(32000, 32000)
|
||||
case AZF_FREQ_4000: freq = SOUNDFORMAT_FREQ_SUSPECTED_4000; break;
|
||||
case AZF_FREQ_4800: freq = SOUNDFORMAT_FREQ_SUSPECTED_4800; break;
|
||||
case AZF_FREQ_5512:
|
||||
/* the AZF3328 names it "5510" for some strange reason */
|
||||
freq = SOUNDFORMAT_FREQ_5510; break;
|
||||
case AZF_FREQ_6620: freq = SOUNDFORMAT_FREQ_6620; break;
|
||||
case AZF_FREQ_8000: freq = SOUNDFORMAT_FREQ_8000; break;
|
||||
case AZF_FREQ_9600: freq = SOUNDFORMAT_FREQ_9600; break;
|
||||
case AZF_FREQ_11025: freq = SOUNDFORMAT_FREQ_11025; break;
|
||||
case AZF_FREQ_13240: freq = SOUNDFORMAT_FREQ_SUSPECTED_13240; break;
|
||||
case AZF_FREQ_16000: freq = SOUNDFORMAT_FREQ_16000; break;
|
||||
case AZF_FREQ_22050: freq = SOUNDFORMAT_FREQ_22050; break;
|
||||
case AZF_FREQ_32000: freq = SOUNDFORMAT_FREQ_32000; break;
|
||||
default:
|
||||
snd_printk(KERN_WARNING "unknown bitrate %d, assuming 44.1kHz!\n", bitrate);
|
||||
/* fall-through */
|
||||
AZF_FMT_XLATE(44100, 44100)
|
||||
AZF_FMT_XLATE(48000, 48000)
|
||||
AZF_FMT_XLATE(66200, SUSPECTED_66200)
|
||||
#undef AZF_FMT_XLATE
|
||||
case AZF_FREQ_44100: freq = SOUNDFORMAT_FREQ_44100; break;
|
||||
case AZF_FREQ_48000: freq = SOUNDFORMAT_FREQ_48000; break;
|
||||
case AZF_FREQ_66200: freq = SOUNDFORMAT_FREQ_SUSPECTED_66200; break;
|
||||
}
|
||||
/* val = 0xff07; 3m27.993s (65301Hz; -> 64000Hz???) hmm, 66120, 65967, 66123 */
|
||||
/* val = 0xff09; 17m15.098s (13123,478Hz; -> 12000Hz???) hmm, 13237.2Hz? */
|
||||
|
@ -381,7 +381,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a)
|
||||
snd_print_pcm_rates(a->rates, buf, sizeof(buf));
|
||||
|
||||
if (a->format == AUDIO_CODING_TYPE_LPCM)
|
||||
snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2 - 8));
|
||||
snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8);
|
||||
else if (a->max_bitrate)
|
||||
snprintf(buf2, sizeof(buf2),
|
||||
", max bitrate = %d", a->max_bitrate);
|
||||
|
@ -2308,6 +2308,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
|
||||
SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x8410, "ASUS", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB),
|
||||
@ -2703,7 +2704,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
|
||||
if (err < 0)
|
||||
goto out_free;
|
||||
#ifdef CONFIG_SND_HDA_PATCH_LOADER
|
||||
if (patch[dev]) {
|
||||
if (patch[dev] && *patch[dev]) {
|
||||
snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
|
||||
patch[dev]);
|
||||
err = snd_hda_load_patch(chip->bus, patch[dev]);
|
||||
|
@ -85,6 +85,7 @@ struct conexant_spec {
|
||||
unsigned int auto_mic;
|
||||
int auto_mic_ext; /* autocfg.inputs[] index for ext mic */
|
||||
unsigned int need_dac_fix;
|
||||
hda_nid_t slave_dig_outs[2];
|
||||
|
||||
/* capture */
|
||||
unsigned int num_adc_nids;
|
||||
@ -127,6 +128,7 @@ struct conexant_spec {
|
||||
unsigned int ideapad:1;
|
||||
unsigned int thinkpad:1;
|
||||
unsigned int hp_laptop:1;
|
||||
unsigned int asus:1;
|
||||
|
||||
unsigned int ext_mic_present;
|
||||
unsigned int recording;
|
||||
@ -352,6 +354,8 @@ static int conexant_build_pcms(struct hda_codec *codec)
|
||||
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
|
||||
spec->dig_in_nid;
|
||||
}
|
||||
if (spec->slave_dig_outs[0])
|
||||
codec->slave_dig_outs = spec->slave_dig_outs;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -403,10 +407,16 @@ static int conexant_add_jack(struct hda_codec *codec,
|
||||
struct conexant_spec *spec;
|
||||
struct conexant_jack *jack;
|
||||
const char *name;
|
||||
int err;
|
||||
int i, err;
|
||||
|
||||
spec = codec->spec;
|
||||
snd_array_init(&spec->jacks, sizeof(*jack), 32);
|
||||
|
||||
jack = spec->jacks.list;
|
||||
for (i = 0; i < spec->jacks.used; i++, jack++)
|
||||
if (jack->nid == nid)
|
||||
return 0 ; /* already present */
|
||||
|
||||
jack = snd_array_new(&spec->jacks);
|
||||
name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ;
|
||||
|
||||
@ -2100,7 +2110,7 @@ static int patch_cxt5051(struct hda_codec *codec)
|
||||
static hda_nid_t cxt5066_dac_nids[1] = { 0x10 };
|
||||
static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 };
|
||||
static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 };
|
||||
#define CXT5066_SPDIF_OUT 0x21
|
||||
static hda_nid_t cxt5066_digout_pin_nids[2] = { 0x20, 0x22 };
|
||||
|
||||
/* OLPC's microphone port is DC coupled for use with external sensors,
|
||||
* therefore we use a 50% mic bias in order to center the input signal with
|
||||
@ -2312,6 +2322,19 @@ static void cxt5066_ideapad_automic(struct hda_codec *codec)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* toggle input of built-in digital mic and mic jack appropriately */
|
||||
static void cxt5066_asus_automic(struct hda_codec *codec)
|
||||
{
|
||||
unsigned int present;
|
||||
|
||||
present = snd_hda_jack_detect(codec, 0x1b);
|
||||
snd_printdd("CXT5066: external microphone present=%d\n", present);
|
||||
snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL,
|
||||
present ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
/* toggle input of built-in digital mic and mic jack appropriately */
|
||||
static void cxt5066_hp_laptop_automic(struct hda_codec *codec)
|
||||
{
|
||||
@ -2387,6 +2410,23 @@ static void cxt5066_hp_automute(struct hda_codec *codec)
|
||||
cxt5066_update_speaker(codec);
|
||||
}
|
||||
|
||||
/* Dispatch the right mic autoswitch function */
|
||||
static void cxt5066_automic(struct hda_codec *codec)
|
||||
{
|
||||
struct conexant_spec *spec = codec->spec;
|
||||
|
||||
if (spec->dell_vostro)
|
||||
cxt5066_vostro_automic(codec);
|
||||
else if (spec->ideapad)
|
||||
cxt5066_ideapad_automic(codec);
|
||||
else if (spec->thinkpad)
|
||||
cxt5066_thinkpad_automic(codec);
|
||||
else if (spec->hp_laptop)
|
||||
cxt5066_hp_laptop_automic(codec);
|
||||
else if (spec->asus)
|
||||
cxt5066_asus_automic(codec);
|
||||
}
|
||||
|
||||
/* unsolicited event for jack sensing */
|
||||
static void cxt5066_olpc_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
@ -2405,60 +2445,19 @@ static void cxt5066_olpc_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
}
|
||||
|
||||
/* unsolicited event for jack sensing */
|
||||
static void cxt5066_vostro_event(struct hda_codec *codec, unsigned int res)
|
||||
static void cxt5066_unsol_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
snd_printdd("CXT5066_vostro: unsol event %x (%x)\n", res, res >> 26);
|
||||
snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26);
|
||||
switch (res >> 26) {
|
||||
case CONEXANT_HP_EVENT:
|
||||
cxt5066_hp_automute(codec);
|
||||
break;
|
||||
case CONEXANT_MIC_EVENT:
|
||||
cxt5066_vostro_automic(codec);
|
||||
cxt5066_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* unsolicited event for jack sensing */
|
||||
static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
snd_printdd("CXT5066_ideapad: unsol event %x (%x)\n", res, res >> 26);
|
||||
switch (res >> 26) {
|
||||
case CONEXANT_HP_EVENT:
|
||||
cxt5066_hp_automute(codec);
|
||||
break;
|
||||
case CONEXANT_MIC_EVENT:
|
||||
cxt5066_ideapad_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* unsolicited event for jack sensing */
|
||||
static void cxt5066_hp_laptop_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
snd_printdd("CXT5066_hp_laptop: unsol event %x (%x)\n", res, res >> 26);
|
||||
switch (res >> 26) {
|
||||
case CONEXANT_HP_EVENT:
|
||||
cxt5066_hp_automute(codec);
|
||||
break;
|
||||
case CONEXANT_MIC_EVENT:
|
||||
cxt5066_hp_laptop_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* unsolicited event for jack sensing */
|
||||
static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res)
|
||||
{
|
||||
snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26);
|
||||
switch (res >> 26) {
|
||||
case CONEXANT_HP_EVENT:
|
||||
cxt5066_hp_automute(codec);
|
||||
break;
|
||||
case CONEXANT_MIC_EVENT:
|
||||
cxt5066_thinkpad_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct hda_input_mux cxt5066_analog_mic_boost = {
|
||||
.num_items = 5,
|
||||
@ -2633,6 +2632,27 @@ static void cxt5066_olpc_capture_cleanup(struct hda_codec *codec)
|
||||
spec->recording = 0;
|
||||
}
|
||||
|
||||
static void conexant_check_dig_outs(struct hda_codec *codec,
|
||||
hda_nid_t *dig_pins,
|
||||
int num_pins)
|
||||
{
|
||||
struct conexant_spec *spec = codec->spec;
|
||||
hda_nid_t *nid_loc = &spec->multiout.dig_out_nid;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_pins; i++, dig_pins++) {
|
||||
unsigned int cfg = snd_hda_codec_get_pincfg(codec, *dig_pins);
|
||||
if (get_defcfg_connect(cfg) == AC_JACK_PORT_NONE)
|
||||
continue;
|
||||
if (snd_hda_get_connections(codec, *dig_pins, nid_loc, 1) != 1)
|
||||
continue;
|
||||
if (spec->slave_dig_outs[0])
|
||||
nid_loc++;
|
||||
else
|
||||
nid_loc = spec->slave_dig_outs;
|
||||
}
|
||||
}
|
||||
|
||||
static struct hda_input_mux cxt5066_capture_source = {
|
||||
.num_items = 4,
|
||||
.items = {
|
||||
@ -3039,20 +3059,11 @@ static struct hda_verb cxt5066_init_verbs_hp_laptop[] = {
|
||||
/* initialize jack-sensing, too */
|
||||
static int cxt5066_init(struct hda_codec *codec)
|
||||
{
|
||||
struct conexant_spec *spec = codec->spec;
|
||||
|
||||
snd_printdd("CXT5066: init\n");
|
||||
conexant_init(codec);
|
||||
if (codec->patch_ops.unsol_event) {
|
||||
cxt5066_hp_automute(codec);
|
||||
if (spec->dell_vostro)
|
||||
cxt5066_vostro_automic(codec);
|
||||
else if (spec->ideapad)
|
||||
cxt5066_ideapad_automic(codec);
|
||||
else if (spec->thinkpad)
|
||||
cxt5066_thinkpad_automic(codec);
|
||||
else if (spec->hp_laptop)
|
||||
cxt5066_hp_laptop_automic(codec);
|
||||
cxt5066_automic(codec);
|
||||
}
|
||||
cxt5066_set_mic_boost(codec);
|
||||
return 0;
|
||||
@ -3080,6 +3091,7 @@ enum {
|
||||
CXT5066_DELL_VOSTRO, /* Dell Vostro 1015i */
|
||||
CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */
|
||||
CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */
|
||||
CXT5066_ASUS, /* Asus K52JU, Lenovo G560 - Int mic at 0x1a and Ext mic at 0x1b */
|
||||
CXT5066_HP_LAPTOP, /* HP Laptop */
|
||||
CXT5066_MODELS
|
||||
};
|
||||
@ -3091,6 +3103,7 @@ static const char * const cxt5066_models[CXT5066_MODELS] = {
|
||||
[CXT5066_DELL_VOSTRO] = "dell-vostro",
|
||||
[CXT5066_IDEAPAD] = "ideapad",
|
||||
[CXT5066_THINKPAD] = "thinkpad",
|
||||
[CXT5066_ASUS] = "asus",
|
||||
[CXT5066_HP_LAPTOP] = "hp-laptop",
|
||||
};
|
||||
|
||||
@ -3102,7 +3115,9 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
|
||||
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
|
||||
SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP),
|
||||
SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1643, "Asus K52JU", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
|
||||
SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5),
|
||||
@ -3111,7 +3126,9 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */
|
||||
{}
|
||||
};
|
||||
@ -3133,7 +3150,8 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
spec->multiout.max_channels = 2;
|
||||
spec->multiout.num_dacs = ARRAY_SIZE(cxt5066_dac_nids);
|
||||
spec->multiout.dac_nids = cxt5066_dac_nids;
|
||||
spec->multiout.dig_out_nid = CXT5066_SPDIF_OUT;
|
||||
conexant_check_dig_outs(codec, cxt5066_digout_pin_nids,
|
||||
ARRAY_SIZE(cxt5066_digout_pin_nids));
|
||||
spec->num_adc_nids = 1;
|
||||
spec->adc_nids = cxt5066_adc_nids;
|
||||
spec->capsrc_nids = cxt5066_capsrc_nids;
|
||||
@ -3167,17 +3185,20 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
spec->num_init_verbs++;
|
||||
spec->dell_automute = 1;
|
||||
break;
|
||||
case CXT5066_ASUS:
|
||||
case CXT5066_HP_LAPTOP:
|
||||
codec->patch_ops.init = cxt5066_init;
|
||||
codec->patch_ops.unsol_event = cxt5066_hp_laptop_event;
|
||||
codec->patch_ops.unsol_event = cxt5066_unsol_event;
|
||||
spec->init_verbs[spec->num_init_verbs] =
|
||||
cxt5066_init_verbs_hp_laptop;
|
||||
spec->num_init_verbs++;
|
||||
spec->hp_laptop = 1;
|
||||
spec->hp_laptop = board_config == CXT5066_HP_LAPTOP;
|
||||
spec->asus = board_config == CXT5066_ASUS;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixers;
|
||||
/* no S/PDIF out */
|
||||
spec->multiout.dig_out_nid = 0;
|
||||
if (board_config == CXT5066_HP_LAPTOP)
|
||||
spec->multiout.dig_out_nid = 0;
|
||||
/* input source automatically selected */
|
||||
spec->input_mux = NULL;
|
||||
spec->port_d_mode = 0;
|
||||
@ -3207,7 +3228,7 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
break;
|
||||
case CXT5066_DELL_VOSTRO:
|
||||
codec->patch_ops.init = cxt5066_init;
|
||||
codec->patch_ops.unsol_event = cxt5066_vostro_event;
|
||||
codec->patch_ops.unsol_event = cxt5066_unsol_event;
|
||||
spec->init_verbs[0] = cxt5066_init_verbs_vostro;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixers;
|
||||
@ -3224,7 +3245,7 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
break;
|
||||
case CXT5066_IDEAPAD:
|
||||
codec->patch_ops.init = cxt5066_init;
|
||||
codec->patch_ops.unsol_event = cxt5066_ideapad_event;
|
||||
codec->patch_ops.unsol_event = cxt5066_unsol_event;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixers;
|
||||
spec->init_verbs[0] = cxt5066_init_verbs_ideapad;
|
||||
@ -3240,7 +3261,7 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
break;
|
||||
case CXT5066_THINKPAD:
|
||||
codec->patch_ops.init = cxt5066_init;
|
||||
codec->patch_ops.unsol_event = cxt5066_thinkpad_event;
|
||||
codec->patch_ops.unsol_event = cxt5066_unsol_event;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixer_master;
|
||||
spec->mixers[spec->num_mixers++] = cxt5066_mixers;
|
||||
spec->init_verbs[0] = cxt5066_init_verbs_thinkpad;
|
||||
@ -3389,7 +3410,7 @@ static void cx_auto_parse_output(struct hda_codec *codec)
|
||||
}
|
||||
}
|
||||
spec->multiout.dac_nids = spec->private_dac_nids;
|
||||
spec->multiout.max_channels = nums * 2;
|
||||
spec->multiout.max_channels = spec->multiout.num_dacs * 2;
|
||||
|
||||
if (cfg->hp_outs > 0)
|
||||
spec->auto_mute = 1;
|
||||
@ -3708,9 +3729,9 @@ static int cx_auto_init(struct hda_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
|
||||
const char *dir, int cidx,
|
||||
hda_nid_t nid, int hda_dir)
|
||||
hda_nid_t nid, int hda_dir, int amp_idx)
|
||||
{
|
||||
static char name[32];
|
||||
static struct snd_kcontrol_new knew[] = {
|
||||
@ -3722,7 +3743,8 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
struct snd_kcontrol *kctl;
|
||||
knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, 0, hda_dir);
|
||||
knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, amp_idx,
|
||||
hda_dir);
|
||||
knew[i].subdevice = HDA_SUBDEV_AMP_FLAG;
|
||||
knew[i].index = cidx;
|
||||
snprintf(name, sizeof(name), "%s%s %s", basename, dir, sfx[i]);
|
||||
@ -3738,6 +3760,9 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir) \
|
||||
cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0)
|
||||
|
||||
#define cx_auto_add_pb_volume(codec, nid, str, idx) \
|
||||
cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)
|
||||
|
||||
@ -3787,29 +3812,60 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
|
||||
struct conexant_spec *spec = codec->spec;
|
||||
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||
static const char *prev_label;
|
||||
int i, err, cidx;
|
||||
int i, err, cidx, conn_len;
|
||||
hda_nid_t conn[HDA_MAX_CONNECTIONS];
|
||||
|
||||
int multi_adc_volume = 0; /* If the ADC nid has several input volumes */
|
||||
int adc_nid = spec->adc_nids[0];
|
||||
|
||||
conn_len = snd_hda_get_connections(codec, adc_nid, conn,
|
||||
HDA_MAX_CONNECTIONS);
|
||||
if (conn_len < 0)
|
||||
return conn_len;
|
||||
|
||||
multi_adc_volume = cfg->num_inputs > 1 && conn_len > 1;
|
||||
if (!multi_adc_volume) {
|
||||
err = cx_auto_add_volume(codec, "Capture", "", 0, adc_nid,
|
||||
HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = cx_auto_add_volume(codec, "Capture", "", 0, spec->adc_nids[0],
|
||||
HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
prev_label = NULL;
|
||||
cidx = 0;
|
||||
for (i = 0; i < cfg->num_inputs; i++) {
|
||||
hda_nid_t nid = cfg->inputs[i].pin;
|
||||
const char *label;
|
||||
if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
|
||||
int j;
|
||||
int pin_amp = get_wcaps(codec, nid) & AC_WCAP_IN_AMP;
|
||||
if (!pin_amp && !multi_adc_volume)
|
||||
continue;
|
||||
|
||||
label = hda_get_autocfg_input_label(codec, cfg, i);
|
||||
if (label == prev_label)
|
||||
cidx++;
|
||||
else
|
||||
cidx = 0;
|
||||
prev_label = label;
|
||||
err = cx_auto_add_volume(codec, label, " Capture", cidx,
|
||||
nid, HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (pin_amp) {
|
||||
err = cx_auto_add_volume(codec, label, " Boost", cidx,
|
||||
nid, HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!multi_adc_volume)
|
||||
continue;
|
||||
for (j = 0; j < conn_len; j++) {
|
||||
if (conn[j] == nid) {
|
||||
err = cx_auto_add_volume_idx(codec, label,
|
||||
" Capture", cidx, adc_nid, HDA_INPUT, j);
|
||||
if (err < 0)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -642,6 +642,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
|
||||
hdmi_ai->ver = 0x01;
|
||||
hdmi_ai->len = 0x0a;
|
||||
hdmi_ai->CC02_CT47 = channels - 1;
|
||||
hdmi_ai->CA = ca;
|
||||
hdmi_checksum_audio_infoframe(hdmi_ai);
|
||||
} else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */
|
||||
struct dp_audio_infoframe *dp_ai;
|
||||
@ -651,6 +652,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
|
||||
dp_ai->len = 0x1b;
|
||||
dp_ai->ver = 0x11 << 2;
|
||||
dp_ai->CC02_CT47 = channels - 1;
|
||||
dp_ai->CA = ca;
|
||||
} else {
|
||||
snd_printd("HDMI: unknown connection type at pin %d\n",
|
||||
pin_nid);
|
||||
|
@ -2290,6 +2290,29 @@ static struct snd_kcontrol_new alc888_base_mixer[] = {
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = {
|
||||
HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0f, 2, 0x0,
|
||||
HDA_OUTPUT),
|
||||
HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0f, 2, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Side Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Side Playback Switch", 0x0e, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
||||
static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
|
||||
HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
@ -10359,7 +10382,7 @@ static struct alc_config_preset alc882_presets[] = {
|
||||
.init_hook = alc_automute_amp,
|
||||
},
|
||||
[ALC888_ACER_ASPIRE_4930G] = {
|
||||
.mixers = { alc888_base_mixer,
|
||||
.mixers = { alc888_acer_aspire_4930g_mixer,
|
||||
alc883_chmode_mixer },
|
||||
.init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
|
||||
alc888_acer_aspire_4930g_verbs },
|
||||
@ -14954,9 +14977,11 @@ static struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||
SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
|
||||
SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
|
||||
{}
|
||||
@ -18800,6 +18825,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = {
|
||||
ALC662_3ST_6ch_DIG),
|
||||
SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
|
||||
ALC663_ASUS_H13),
|
||||
SND_PCI_QUIRK(0x1991, 0x5628, "Ordissimo EVE", ALC662_LENOVO_101E),
|
||||
{}
|
||||
};
|
||||
|
||||
@ -19492,6 +19518,7 @@ static const struct alc_fixup alc662_fixups[] = {
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk alc662_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
|
||||
SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
|
||||
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
|
||||
|
@ -567,7 +567,7 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
|
||||
hda_nid_t nid = cfg->inputs[i].pin;
|
||||
if (spec->smart51_enabled && is_smart51_pins(spec, nid))
|
||||
ctl = PIN_OUT;
|
||||
else if (i == AUTO_PIN_MIC)
|
||||
else if (cfg->inputs[i].type == AUTO_PIN_MIC)
|
||||
ctl = PIN_VREF50;
|
||||
else
|
||||
ctl = PIN_IN;
|
||||
|
@ -92,6 +92,8 @@ struct oxygen_model {
|
||||
void (*update_dac_volume)(struct oxygen *chip);
|
||||
void (*update_dac_mute)(struct oxygen *chip);
|
||||
void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed);
|
||||
unsigned int (*adjust_dac_routing)(struct oxygen *chip,
|
||||
unsigned int play_routing);
|
||||
void (*gpio_changed)(struct oxygen *chip);
|
||||
void (*uart_input)(struct oxygen *chip);
|
||||
void (*ac97_switch)(struct oxygen *chip,
|
||||
|
@ -180,6 +180,8 @@ void oxygen_update_dac_routing(struct oxygen *chip)
|
||||
(1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
|
||||
(2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
|
||||
(3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
|
||||
if (chip->model.adjust_dac_routing)
|
||||
reg_value = chip->model.adjust_dac_routing(chip, reg_value);
|
||||
oxygen_write16_masked(chip, OXYGEN_PLAY_ROUTING, reg_value,
|
||||
OXYGEN_PLAY_DAC0_SOURCE_MASK |
|
||||
OXYGEN_PLAY_DAC1_SOURCE_MASK |
|
||||
|
@ -24,6 +24,11 @@
|
||||
*
|
||||
* SPI 0 -> CS4245
|
||||
*
|
||||
* I²S 1 -> CS4245
|
||||
* I²S 2 -> CS4361 (center/LFE)
|
||||
* I²S 3 -> CS4361 (surround)
|
||||
* I²S 4 -> CS4361 (front)
|
||||
*
|
||||
* GPIO 3 <- ?
|
||||
* GPIO 4 <- headphone detect
|
||||
* GPIO 5 -> route input jack to line-in (0) or mic-in (1)
|
||||
@ -36,6 +41,7 @@
|
||||
* input 1 <- aux
|
||||
* input 2 <- front mic
|
||||
* input 4 <- line/mic
|
||||
* DAC out -> headphones
|
||||
* aux out -> front panel headphones
|
||||
*/
|
||||
|
||||
@ -207,6 +213,35 @@ static void set_cs4245_adc_params(struct oxygen *chip,
|
||||
cs4245_write_cached(chip, CS4245_ADC_CTRL, value);
|
||||
}
|
||||
|
||||
static inline unsigned int shift_bits(unsigned int value,
|
||||
unsigned int shift_from,
|
||||
unsigned int shift_to,
|
||||
unsigned int mask)
|
||||
{
|
||||
if (shift_from < shift_to)
|
||||
return (value << (shift_to - shift_from)) & mask;
|
||||
else
|
||||
return (value >> (shift_from - shift_to)) & mask;
|
||||
}
|
||||
|
||||
static unsigned int adjust_dg_dac_routing(struct oxygen *chip,
|
||||
unsigned int play_routing)
|
||||
{
|
||||
return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC1_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC2_SOURCE_MASK) |
|
||||
shift_bits(play_routing,
|
||||
OXYGEN_PLAY_DAC0_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC3_SOURCE_SHIFT,
|
||||
OXYGEN_PLAY_DAC3_SOURCE_MASK);
|
||||
}
|
||||
|
||||
static int output_switch_info(struct snd_kcontrol *ctl,
|
||||
struct snd_ctl_elem_info *info)
|
||||
{
|
||||
@ -557,6 +592,7 @@ struct oxygen_model model_xonar_dg = {
|
||||
.resume = dg_resume,
|
||||
.set_dac_params = set_cs4245_dac_params,
|
||||
.set_adc_params = set_cs4245_adc_params,
|
||||
.adjust_dac_routing = adjust_dg_dac_routing,
|
||||
.dump_registers = dump_cs4245_registers,
|
||||
.model_data_size = sizeof(struct dg),
|
||||
.device_config = PLAYBACK_0_TO_I2S |
|
||||
|
@ -22,7 +22,7 @@
|
||||
#define __PDAUDIOCF_H
|
||||
|
||||
#include <sound/pcm.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -23,8 +23,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/io.h>
|
||||
#include <sound/core.h>
|
||||
#include <asm/io.h>
|
||||
#include "vxpocket.h"
|
||||
|
||||
|
||||
|
@ -129,7 +129,7 @@ static struct snd_soc_dai_link afeb9260_dai = {
|
||||
.cpu_dai_name = "atmel-ssc-dai.0",
|
||||
.codec_dai_name = "tlv320aic23-hifi",
|
||||
.platform_name = "atmel_pcm-audio",
|
||||
.codec_name = "tlv320aic23-codec.0-0x1a",
|
||||
.codec_name = "tlv320aic23-codec.0-001a",
|
||||
.init = afeb9260_tlv320aic23_init,
|
||||
.ops = &afeb9260_ops,
|
||||
};
|
||||
|
@ -119,7 +119,7 @@ static struct snd_soc_dai_link bf5xx_ssm2602_dai = {
|
||||
.cpu_dai_name = "bf5xx-i2s",
|
||||
.codec_dai_name = "ssm2602-hifi",
|
||||
.platform_name = "bf5xx-pcm-audio",
|
||||
.codec_name = "ssm2602-codec.0-0x1b",
|
||||
.codec_name = "ssm2602-codec.0-001b",
|
||||
.ops = &bf5xx_ssm2602_ops,
|
||||
};
|
||||
|
||||
|
@ -153,7 +153,7 @@ static int cq93vc_resume(struct snd_soc_codec *codec)
|
||||
|
||||
static int cq93vc_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct davinci_vc *davinci_vc = codec->dev->platform_data;
|
||||
struct davinci_vc *davinci_vc = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
davinci_vc->cq93vc.codec = codec;
|
||||
codec->control_data = davinci_vc;
|
||||
|
@ -367,9 +367,12 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const u8 cx20442_reg = CX20442_TELOUT | CX20442_MIC;
|
||||
|
||||
static struct snd_soc_codec_driver cx20442_codec_dev = {
|
||||
.probe = cx20442_codec_probe,
|
||||
.remove = cx20442_codec_remove,
|
||||
.reg_cache_default = &cx20442_reg,
|
||||
.reg_cache_size = 1,
|
||||
.reg_word_size = sizeof(u8),
|
||||
.read = cx20442_read_reg_cache,
|
||||
|
@ -1287,9 +1287,9 @@ SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 9, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 8, 0),
|
||||
SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev,
|
||||
@ -1298,9 +1298,9 @@ SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 11, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 10, 0),
|
||||
SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev,
|
||||
@ -1345,6 +1345,7 @@ SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0,
|
||||
|
||||
SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADCDAT", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
|
||||
|
||||
SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux),
|
||||
@ -1546,6 +1547,11 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{ "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" },
|
||||
{ "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" },
|
||||
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC1L" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC1R" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC2L" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC2R" },
|
||||
|
||||
{ "AIF2ADCDAT", NULL, "AIF2ADC Mux" },
|
||||
|
||||
/* AIF3 output */
|
||||
@ -1578,6 +1584,13 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{ "Right Headphone Mux", "DAC", "DAC1R" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {
|
||||
{ "AIF1DACDAT", NULL, "AIF2DACDAT" },
|
||||
{ "AIF2DACDAT", NULL, "AIF1DACDAT" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },
|
||||
{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route wm8994_intercon[] = {
|
||||
{ "AIF2DACL", NULL, "AIF2DAC Mux" },
|
||||
{ "AIF2DACR", NULL, "AIF2DAC Mux" },
|
||||
@ -2386,7 +2399,7 @@ static int wm8994_set_tristate(struct snd_soc_dai *codec_dai, int tristate)
|
||||
else
|
||||
val = 0;
|
||||
|
||||
return snd_soc_update_bits(codec, reg, mask, reg);
|
||||
return snd_soc_update_bits(codec, reg, mask, val);
|
||||
}
|
||||
|
||||
#define WM8994_RATES SNDRV_PCM_RATE_8000_96000
|
||||
@ -3129,6 +3142,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
|
||||
case WM8994:
|
||||
snd_soc_dapm_add_routes(dapm, wm8994_intercon,
|
||||
ARRAY_SIZE(wm8994_intercon));
|
||||
|
||||
if (wm8994->revision < 4)
|
||||
snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon,
|
||||
ARRAY_SIZE(wm8994_revd_intercon));
|
||||
|
||||
break;
|
||||
case WM8958:
|
||||
snd_soc_dapm_add_routes(dapm, wm8958_intercon,
|
||||
|
@ -1223,7 +1223,7 @@ static int wm8995_set_tristate(struct snd_soc_dai *codec_dai, int tristate)
|
||||
else
|
||||
val = 0;
|
||||
|
||||
return snd_soc_update_bits(codec, reg, mask, reg);
|
||||
return snd_soc_update_bits(codec, reg, mask, val);
|
||||
}
|
||||
|
||||
/* The size in bits of the FLL divide multiplied by 10
|
||||
|
@ -91,6 +91,7 @@ static void wait_for_dc_servo(struct snd_soc_codec *codec, unsigned int op)
|
||||
static void calibrate_dc_servo(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
||||
s8 offset;
|
||||
u16 reg, reg_l, reg_r, dcs_cfg;
|
||||
|
||||
/* If we're using a digital only path and have a previously
|
||||
@ -149,16 +150,14 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
|
||||
hubs->dcs_codes);
|
||||
|
||||
/* HPOUT1L */
|
||||
if (reg_l + hubs->dcs_codes > 0 &&
|
||||
reg_l + hubs->dcs_codes < 0xff)
|
||||
reg_l += hubs->dcs_codes;
|
||||
dcs_cfg = reg_l << WM8993_DCS_DAC_WR_VAL_1_SHIFT;
|
||||
offset = reg_l;
|
||||
offset += hubs->dcs_codes;
|
||||
dcs_cfg = (u8)offset << WM8993_DCS_DAC_WR_VAL_1_SHIFT;
|
||||
|
||||
/* HPOUT1R */
|
||||
if (reg_r + hubs->dcs_codes > 0 &&
|
||||
reg_r + hubs->dcs_codes < 0xff)
|
||||
reg_r += hubs->dcs_codes;
|
||||
dcs_cfg |= reg_r;
|
||||
offset = reg_r;
|
||||
offset += hubs->dcs_codes;
|
||||
dcs_cfg |= (u8)offset;
|
||||
|
||||
dev_dbg(codec->dev, "DCS result: %x\n", dcs_cfg);
|
||||
|
||||
|
@ -218,12 +218,24 @@ static struct snd_soc_dai_link dm6467_evm_dai[] = {
|
||||
.ops = &evm_spdif_ops,
|
||||
},
|
||||
};
|
||||
static struct snd_soc_dai_link da8xx_evm_dai = {
|
||||
|
||||
static struct snd_soc_dai_link da830_evm_dai = {
|
||||
.name = "TLV320AIC3X",
|
||||
.stream_name = "AIC3X",
|
||||
.cpu_dai_name = "davinci-mcasp.1",
|
||||
.codec_dai_name = "tlv320aic3x-hifi",
|
||||
.codec_name = "tlv320aic3x-codec.1-0018",
|
||||
.platform_name = "davinci-pcm-audio",
|
||||
.init = evm_aic3x_init,
|
||||
.ops = &evm_ops,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link da850_evm_dai = {
|
||||
.name = "TLV320AIC3X",
|
||||
.stream_name = "AIC3X",
|
||||
.cpu_dai_name= "davinci-mcasp.0",
|
||||
.codec_dai_name = "tlv320aic3x-hifi",
|
||||
.codec_name = "tlv320aic3x-codec.0-001a",
|
||||
.codec_name = "tlv320aic3x-codec.1-0018",
|
||||
.platform_name = "davinci-pcm-audio",
|
||||
.init = evm_aic3x_init,
|
||||
.ops = &evm_ops,
|
||||
@ -259,13 +271,13 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = {
|
||||
|
||||
static struct snd_soc_card da830_snd_soc_card = {
|
||||
.name = "DA830/OMAP-L137 EVM",
|
||||
.dai_link = &da8xx_evm_dai,
|
||||
.dai_link = &da830_evm_dai,
|
||||
.num_links = 1,
|
||||
};
|
||||
|
||||
static struct snd_soc_card da850_snd_soc_card = {
|
||||
.name = "DA850/OMAP-L138 EVM",
|
||||
.dai_link = &da8xx_evm_dai,
|
||||
.dai_link = &da850_evm_dai,
|
||||
.num_links = 1,
|
||||
};
|
||||
|
||||
|
@ -507,8 +507,6 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
||||
/* Set up digital mute if not provided by the codec */
|
||||
if (!codec_dai->driver->ops) {
|
||||
codec_dai->driver->ops = &ams_delta_dai_ops;
|
||||
} else if (!codec_dai->driver->ops->digital_mute) {
|
||||
codec_dai->driver->ops->digital_mute = ams_delta_digital_mute;
|
||||
} else {
|
||||
ams_delta_ops.startup = ams_delta_startup;
|
||||
ams_delta_ops.shutdown = ams_delta_shutdown;
|
||||
|
@ -307,10 +307,10 @@ static int corgi_wm8731_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static struct snd_soc_dai_link corgi_dai = {
|
||||
.name = "WM8731",
|
||||
.stream_name = "WM8731",
|
||||
.cpu_dai_name = "pxa-is2-dai",
|
||||
.cpu_dai_name = "pxa2xx-i2s",
|
||||
.codec_dai_name = "wm8731-hifi",
|
||||
.platform_name = "pxa-pcm-audio",
|
||||
.codec_name = "wm8731-codec-0.001a",
|
||||
.codec_name = "wm8731-codec-0.001b",
|
||||
.init = corgi_wm8731_init,
|
||||
.ops = &corgi_ops,
|
||||
};
|
||||
|
@ -276,7 +276,7 @@ static struct snd_soc_dai_link poodle_dai = {
|
||||
.cpu_dai_name = "pxa2xx-i2s",
|
||||
.codec_dai_name = "wm8731-hifi",
|
||||
.platform_name = "pxa-pcm-audio",
|
||||
.codec_name = "wm8731-codec.0-001a",
|
||||
.codec_name = "wm8731-codec.0-001b",
|
||||
.init = poodle_wm8731_init,
|
||||
.ops = &poodle_ops,
|
||||
};
|
||||
|
@ -315,10 +315,10 @@ static int spitz_wm8750_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static struct snd_soc_dai_link spitz_dai = {
|
||||
.name = "wm8750",
|
||||
.stream_name = "WM8750",
|
||||
.cpu_dai_name = "pxa-is2",
|
||||
.cpu_dai_name = "pxa2xx-i2s",
|
||||
.codec_dai_name = "wm8750-hifi",
|
||||
.platform_name = "pxa-pcm-audio",
|
||||
.codec_name = "wm8750-codec.0-001a",
|
||||
.codec_name = "wm8750-codec.0-001b",
|
||||
.init = spitz_wm8750_init,
|
||||
.ops = &spitz_ops,
|
||||
};
|
||||
|
@ -397,11 +397,11 @@ static struct snd_soc_dai_link neo1973_gta02_dai[] = {
|
||||
{ /* Hifi Playback - for similatious use with voice below */
|
||||
.name = "WM8753",
|
||||
.stream_name = "WM8753 HiFi",
|
||||
.cpu_dai_name = "s3c24xx-i2s",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.codec_dai_name = "wm8753-hifi",
|
||||
.init = neo1973_gta02_wm8753_init,
|
||||
.platform_name = "samsung-audio",
|
||||
.codec_name = "wm8753-codec.0-0x1a",
|
||||
.codec_name = "wm8753-codec.0-001a",
|
||||
.ops = &neo1973_gta02_hifi_ops,
|
||||
},
|
||||
{ /* Voice via BT */
|
||||
@ -410,7 +410,7 @@ static struct snd_soc_dai_link neo1973_gta02_dai[] = {
|
||||
.cpu_dai_name = "bluetooth-dai",
|
||||
.codec_dai_name = "wm8753-voice",
|
||||
.ops = &neo1973_gta02_voice_ops,
|
||||
.codec_name = "wm8753-codec.0-0x1a",
|
||||
.codec_name = "wm8753-codec.0-001a",
|
||||
.platform_name = "samsung-audio",
|
||||
},
|
||||
};
|
||||
|
@ -559,9 +559,9 @@ static struct snd_soc_dai_link neo1973_dai[] = {
|
||||
.name = "WM8753",
|
||||
.stream_name = "WM8753 HiFi",
|
||||
.platform_name = "samsung-audio",
|
||||
.cpu_dai_name = "s3c24xx-i2s",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.codec_dai_name = "wm8753-hifi",
|
||||
.codec_name = "wm8753-codec.0-0x1a",
|
||||
.codec_name = "wm8753-codec.0-001a",
|
||||
.init = neo1973_wm8753_init,
|
||||
.ops = &neo1973_hifi_ops,
|
||||
},
|
||||
@ -571,7 +571,7 @@ static struct snd_soc_dai_link neo1973_dai[] = {
|
||||
.platform_name = "samsung-audio",
|
||||
.cpu_dai_name = "bluetooth-dai",
|
||||
.codec_dai_name = "wm8753-voice",
|
||||
.codec_name = "wm8753-codec.0-0x1a",
|
||||
.codec_name = "wm8753-codec.0-001a",
|
||||
.ops = &neo1973_voice_ops,
|
||||
},
|
||||
};
|
||||
|
@ -94,8 +94,8 @@ static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static struct snd_soc_dai_link simtec_dai_aic33 = {
|
||||
.name = "tlv320aic33",
|
||||
.stream_name = "TLV320AIC33",
|
||||
.codec_name = "tlv320aic3x-codec.0-0x1a",
|
||||
.cpu_dai_name = "s3c24xx-i2s",
|
||||
.codec_name = "tlv320aic3x-codec.0-001a",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.codec_dai_name = "tlv320aic3x-hifi",
|
||||
.platform_name = "samsung-audio",
|
||||
.init = simtec_hermes_init,
|
||||
|
@ -85,8 +85,8 @@ static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd)
|
||||
static struct snd_soc_dai_link simtec_dai_aic23 = {
|
||||
.name = "tlv320aic23",
|
||||
.stream_name = "TLV320AIC23",
|
||||
.codec_name = "tlv320aic3x-codec.0-0x1a",
|
||||
.cpu_dai_name = "s3c24xx-i2s",
|
||||
.codec_name = "tlv320aic3x-codec.0-001a",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.codec_dai_name = "tlv320aic3x-hifi",
|
||||
.platform_name = "samsung-audio",
|
||||
.init = simtec_tlv320aic23_init,
|
||||
|
@ -228,7 +228,7 @@ static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = {
|
||||
.stream_name = "UDA134X",
|
||||
.codec_name = "uda134x-hifi",
|
||||
.codec_dai_name = "uda134x-hifi",
|
||||
.cpu_dai_name = "s3c24xx-i2s",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.ops = &s3c24xx_uda134x_ops,
|
||||
.platform_name = "samsung-audio",
|
||||
};
|
||||
|
@ -1449,6 +1449,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
|
||||
rtd = &card->rtd_aux[num];
|
||||
name = aux_dev->name;
|
||||
}
|
||||
rtd->card = card;
|
||||
|
||||
/* machine controls, routes and widgets are not prefixed */
|
||||
temp = codec->name_prefix;
|
||||
@ -1471,7 +1472,6 @@ static int soc_post_component_init(struct snd_soc_card *card,
|
||||
|
||||
/* register the rtd device */
|
||||
rtd->codec = codec;
|
||||
rtd->card = card;
|
||||
rtd->dev.parent = card->dev;
|
||||
rtd->dev.release = rtd_release;
|
||||
rtd->dev.init_name = name;
|
||||
@ -1664,9 +1664,6 @@ static int soc_probe_aux_dev(struct snd_soc_card *card, int num)
|
||||
goto out;
|
||||
|
||||
found:
|
||||
if (!try_module_get(codec->dev->driver->owner))
|
||||
return -ENODEV;
|
||||
|
||||
ret = soc_probe_codec(card, codec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -1742,7 +1742,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
int max = mc->max;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
unsigned int val, val_mask;
|
||||
unsigned int val;
|
||||
int connect, change;
|
||||
struct snd_soc_dapm_update update;
|
||||
|
||||
@ -1750,13 +1750,13 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
|
||||
if (invert)
|
||||
val = max - val;
|
||||
val_mask = mask << shift;
|
||||
mask = mask << shift;
|
||||
val = val << shift;
|
||||
|
||||
mutex_lock(&widget->codec->mutex);
|
||||
widget->value = val;
|
||||
|
||||
change = snd_soc_test_bits(widget->codec, reg, val_mask, val);
|
||||
change = snd_soc_test_bits(widget->codec, reg, mask, val);
|
||||
if (change) {
|
||||
if (val)
|
||||
/* new connection */
|
||||
|
@ -785,7 +785,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
|
||||
}
|
||||
|
||||
dev->pcm->private_data = dev;
|
||||
strcpy(dev->pcm->name, dev->product_name);
|
||||
strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name));
|
||||
|
||||
memset(dev->sub_playback, 0, sizeof(dev->sub_playback));
|
||||
memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
|
||||
|
@ -136,7 +136,7 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
strcpy(rmidi->name, device->product_name);
|
||||
strlcpy(rmidi->name, device->product_name, sizeof(rmidi->name));
|
||||
|
||||
rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX;
|
||||
rmidi->private_data = device;
|
||||
|
@ -323,6 +323,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_init(&chip->shutdown_mutex);
|
||||
chip->index = idx;
|
||||
chip->dev = dev;
|
||||
chip->card = card;
|
||||
@ -531,6 +532,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
chip = ptr;
|
||||
card = chip->card;
|
||||
mutex_lock(®ister_mutex);
|
||||
mutex_lock(&chip->shutdown_mutex);
|
||||
chip->shutdown = 1;
|
||||
chip->num_interfaces--;
|
||||
if (chip->num_interfaces <= 0) {
|
||||
@ -548,9 +550,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
snd_usb_mixer_disconnect(p);
|
||||
}
|
||||
usb_chip[chip->index] = NULL;
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
snd_card_free_when_closed(card);
|
||||
} else {
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ enum {
|
||||
};
|
||||
|
||||
|
||||
/*E-mu 0202(0404) eXtension Unit(XU) control*/
|
||||
/*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
|
||||
enum {
|
||||
USB_XU_CLOCK_RATE = 0xe301,
|
||||
USB_XU_CLOCK_SOURCE = 0xe302,
|
||||
@ -1583,7 +1583,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw
|
||||
cval->initialized = 1;
|
||||
} else {
|
||||
if (type == USB_XU_CLOCK_RATE) {
|
||||
/* E-Mu USB 0404/0202/TrackerPre
|
||||
/* E-Mu USB 0404/0202/TrackerPre/0204
|
||||
* samplerate control quirk
|
||||
*/
|
||||
cval->min = 0;
|
||||
|
@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
/* format changed */
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
/* influenced: period_bytes, channels, rate, format, */
|
||||
@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
params_rate(hw_params),
|
||||
snd_pcm_format_physical_width(params_format(hw_params)) *
|
||||
params_channels(hw_params));
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
|
||||
subs->cur_audiofmt = NULL;
|
||||
subs->cur_rate = 0;
|
||||
subs->period_bytes = 0;
|
||||
if (!subs->stream->chip->shutdown)
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
return snd_pcm_lib_free_vmalloc_buffer(substream);
|
||||
}
|
||||
|
||||
|
@ -79,6 +79,13 @@
|
||||
.idProduct = 0x3f0a,
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
},
|
||||
{
|
||||
/* E-Mu 0204 USB */
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
|
||||
.idVendor = 0x041e,
|
||||
.idProduct = 0x3f19,
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
},
|
||||
|
||||
/*
|
||||
* Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
|
||||
|
@ -566,7 +566,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat
|
||||
}
|
||||
|
||||
/*
|
||||
* For E-Mu 0404USB/0202USB/TrackerPre sample rate should be set for device,
|
||||
* For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device,
|
||||
* not for interface.
|
||||
*/
|
||||
|
||||
@ -623,6 +623,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
|
||||
case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */
|
||||
case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */
|
||||
case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */
|
||||
case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */
|
||||
set_format_emu_quirk(subs, fmt);
|
||||
break;
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ struct snd_usb_audio {
|
||||
struct snd_card *card;
|
||||
u32 usb_id;
|
||||
int shutdown;
|
||||
struct mutex shutdown_mutex;
|
||||
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
||||
int num_interfaces;
|
||||
int num_suspended_intf;
|
||||
|
Loading…
Reference in New Issue
Block a user