提交 36e7a96c 编写于 作者: L Linus Torvalds

Merge tag 'sound-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull second round of sound fixes from Takashi Iwai:
 "Yet a few more fixes popped up in this week.

  The biggest change here is the addition of pinctrl support for Atmel,
  which turned out to be almost mandatory to make things working.

  The rest are a few fixes for M-Audio usb-audio device and a fix for
  regression of HD-audio HDMI codecs with alsactl in the recent kernel."

* tag 'sound-3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda/hdmi - Work around "alsactl restore" errors
  ALSA: usb-audio: selector map for M-Audio FT C400
  ALSA: usb-audio: M-Audio FT C400 skip packet quirk
  ALSA: usb-audio: correct M-Audio C400 clock source quirk
  ALSA: usb - fix race in creation of M-Audio Fast track pro driver
  ASoC: atmel-ssc: add pinctrl selection to driver
  ARM: at91/dts: add pinctrl support for SSC peripheral
...@@ -306,6 +306,22 @@ ...@@ -306,6 +306,22 @@
}; };
}; };
ssc0 {
pinctrl_ssc0_tx: ssc0_tx-0 {
atmel,pins =
<1 16 0x1 0x0 /* PB16 periph A */
1 17 0x1 0x0 /* PB17 periph A */
1 18 0x1 0x0>; /* PB18 periph A */
};
pinctrl_ssc0_rx: ssc0_rx-0 {
atmel,pins =
<1 19 0x1 0x0 /* PB19 periph A */
1 20 0x1 0x0 /* PB20 periph A */
1 21 0x1 0x0>; /* PB21 periph A */
};
};
pioA: gpio@fffff400 { pioA: gpio@fffff400 {
compatible = "atmel,at91rm9200-gpio"; compatible = "atmel,at91rm9200-gpio";
reg = <0xfffff400 0x200>; reg = <0xfffff400 0x200>;
...@@ -450,6 +466,8 @@ ...@@ -450,6 +466,8 @@
compatible = "atmel,at91rm9200-ssc"; compatible = "atmel,at91rm9200-ssc";
reg = <0xfffbc000 0x4000>; reg = <0xfffbc000 0x4000>;
interrupts = <14 4 5>; interrupts = <14 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
status = "disabled"; status = "disabled";
}; };
......
...@@ -271,6 +271,38 @@ ...@@ -271,6 +271,38 @@
}; };
}; };
ssc0 {
pinctrl_ssc0_tx: ssc0_tx-0 {
atmel,pins =
<1 0 0x2 0x0 /* PB0 periph B */
1 1 0x2 0x0 /* PB1 periph B */
1 2 0x2 0x0>; /* PB2 periph B */
};
pinctrl_ssc0_rx: ssc0_rx-0 {
atmel,pins =
<1 3 0x2 0x0 /* PB3 periph B */
1 4 0x2 0x0 /* PB4 periph B */
1 5 0x2 0x0>; /* PB5 periph B */
};
};
ssc1 {
pinctrl_ssc1_tx: ssc1_tx-0 {
atmel,pins =
<1 6 0x1 0x0 /* PB6 periph A */
1 7 0x1 0x0 /* PB7 periph A */
1 8 0x1 0x0>; /* PB8 periph A */
};
pinctrl_ssc1_rx: ssc1_rx-0 {
atmel,pins =
<1 9 0x1 0x0 /* PB9 periph A */
1 10 0x1 0x0 /* PB10 periph A */
1 11 0x1 0x0>; /* PB11 periph A */
};
};
pioA: gpio@fffff200 { pioA: gpio@fffff200 {
compatible = "atmel,at91rm9200-gpio"; compatible = "atmel,at91rm9200-gpio";
reg = <0xfffff200 0x200>; reg = <0xfffff200 0x200>;
...@@ -368,6 +400,8 @@ ...@@ -368,6 +400,8 @@
compatible = "atmel,at91rm9200-ssc"; compatible = "atmel,at91rm9200-ssc";
reg = <0xfff98000 0x4000>; reg = <0xfff98000 0x4000>;
interrupts = <16 4 5>; interrupts = <16 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
status = "disabled"; status = "disabled";
}; };
...@@ -375,6 +409,8 @@ ...@@ -375,6 +409,8 @@
compatible = "atmel,at91rm9200-ssc"; compatible = "atmel,at91rm9200-ssc";
reg = <0xfff9c000 0x4000>; reg = <0xfff9c000 0x4000>;
interrupts = <17 4 5>; interrupts = <17 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;
status = "disabled"; status = "disabled";
}; };
......
...@@ -290,6 +290,38 @@ ...@@ -290,6 +290,38 @@
}; };
}; };
ssc0 {
pinctrl_ssc0_tx: ssc0_tx-0 {
atmel,pins =
<3 0 0x1 0x0 /* PD0 periph A */
3 1 0x1 0x0 /* PD1 periph A */
3 2 0x1 0x0>; /* PD2 periph A */
};
pinctrl_ssc0_rx: ssc0_rx-0 {
atmel,pins =
<3 3 0x1 0x0 /* PD3 periph A */
3 4 0x1 0x0 /* PD4 periph A */
3 5 0x1 0x0>; /* PD5 periph A */
};
};
ssc1 {
pinctrl_ssc1_tx: ssc1_tx-0 {
atmel,pins =
<3 10 0x1 0x0 /* PD10 periph A */
3 11 0x1 0x0 /* PD11 periph A */
3 12 0x1 0x0>; /* PD12 periph A */
};
pinctrl_ssc1_rx: ssc1_rx-0 {
atmel,pins =
<3 13 0x1 0x0 /* PD13 periph A */
3 14 0x1 0x0 /* PD14 periph A */
3 15 0x1 0x0>; /* PD15 periph A */
};
};
pioA: gpio@fffff200 { pioA: gpio@fffff200 {
compatible = "atmel,at91rm9200-gpio"; compatible = "atmel,at91rm9200-gpio";
reg = <0xfffff200 0x200>; reg = <0xfffff200 0x200>;
...@@ -425,6 +457,8 @@ ...@@ -425,6 +457,8 @@
compatible = "atmel,at91sam9g45-ssc"; compatible = "atmel,at91sam9g45-ssc";
reg = <0xfff9c000 0x4000>; reg = <0xfff9c000 0x4000>;
interrupts = <16 4 5>; interrupts = <16 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
status = "disabled"; status = "disabled";
}; };
...@@ -432,6 +466,8 @@ ...@@ -432,6 +466,8 @@
compatible = "atmel,at91sam9g45-ssc"; compatible = "atmel,at91sam9g45-ssc";
reg = <0xfffa0000 0x4000>; reg = <0xfffa0000 0x4000>;
interrupts = <17 4 5>; interrupts = <17 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>;
status = "disabled"; status = "disabled";
}; };
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
tcb1 = &tcb1; tcb1 = &tcb1;
i2c0 = &i2c0; i2c0 = &i2c0;
i2c1 = &i2c1; i2c1 = &i2c1;
ssc0 = &ssc0;
}; };
cpus { cpus {
cpu@0 { cpu@0 {
...@@ -244,6 +245,22 @@ ...@@ -244,6 +245,22 @@
}; };
}; };
ssc0 {
pinctrl_ssc0_tx: ssc0_tx-0 {
atmel,pins =
<0 24 0x2 0x0 /* PA24 periph B */
0 25 0x2 0x0 /* PA25 periph B */
0 26 0x2 0x0>; /* PA26 periph B */
};
pinctrl_ssc0_rx: ssc0_rx-0 {
atmel,pins =
<0 27 0x2 0x0 /* PA27 periph B */
0 28 0x2 0x0 /* PA28 periph B */
0 29 0x2 0x0>; /* PA29 periph B */
};
};
pioA: gpio@fffff400 { pioA: gpio@fffff400 {
compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
reg = <0xfffff400 0x200>; reg = <0xfffff400 0x200>;
...@@ -294,6 +311,15 @@ ...@@ -294,6 +311,15 @@
status = "disabled"; status = "disabled";
}; };
ssc0: ssc@f0010000 {
compatible = "atmel,at91sam9g45-ssc";
reg = <0xf0010000 0x4000>;
interrupts = <28 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
status = "disabled";
};
usart0: serial@f801c000 { usart0: serial@f801c000 {
compatible = "atmel,at91sam9260-usart"; compatible = "atmel,at91sam9260-usart";
reg = <0xf801c000 0x4000>; reg = <0xf801c000 0x4000>;
......
...@@ -88,13 +88,6 @@ ...@@ -88,13 +88,6 @@
interrupts = <1 4 7>; interrupts = <1 4 7>;
}; };
ssc0: ssc@f0010000 {
compatible = "atmel,at91sam9g45-ssc";
reg = <0xf0010000 0x4000>;
interrupts = <28 4 5>;
status = "disabled";
};
tcb0: timer@f8008000 { tcb0: timer@f8008000 {
compatible = "atmel,at91sam9x5-tcb"; compatible = "atmel,at91sam9x5-tcb";
reg = <0xf8008000 0x100>; reg = <0xf8008000 0x100>;
...@@ -290,6 +283,22 @@ ...@@ -290,6 +283,22 @@
}; };
}; };
ssc0 {
pinctrl_ssc0_tx: ssc0_tx-0 {
atmel,pins =
<0 24 0x2 0x0 /* PA24 periph B */
0 25 0x2 0x0 /* PA25 periph B */
0 26 0x2 0x0>; /* PA26 periph B */
};
pinctrl_ssc0_rx: ssc0_rx-0 {
atmel,pins =
<0 27 0x2 0x0 /* PA27 periph B */
0 28 0x2 0x0 /* PA28 periph B */
0 29 0x2 0x0>; /* PA29 periph B */
};
};
pioA: gpio@fffff400 { pioA: gpio@fffff400 {
compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
reg = <0xfffff400 0x200>; reg = <0xfffff400 0x200>;
...@@ -333,6 +342,15 @@ ...@@ -333,6 +342,15 @@
}; };
}; };
ssc0: ssc@f0010000 {
compatible = "atmel,at91sam9g45-ssc";
reg = <0xf0010000 0x4000>;
interrupts = <28 4 5>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
status = "disabled";
};
mmc0: mmc@f0008000 { mmc0: mmc@f0008000 {
compatible = "atmel,hsmci"; compatible = "atmel,hsmci";
reg = <0xf0008000 0x600>; reg = <0xf0008000 0x600>;
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/pinctrl/consumer.h>
/* Serialize access to ssc_list and user count */ /* Serialize access to ssc_list and user count */
static DEFINE_SPINLOCK(user_lock); static DEFINE_SPINLOCK(user_lock);
...@@ -131,6 +132,13 @@ static int ssc_probe(struct platform_device *pdev) ...@@ -131,6 +132,13 @@ static int ssc_probe(struct platform_device *pdev)
struct resource *regs; struct resource *regs;
struct ssc_device *ssc; struct ssc_device *ssc;
const struct atmel_ssc_platform_data *plat_dat; const struct atmel_ssc_platform_data *plat_dat;
struct pinctrl *pinctrl;
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl)) {
dev_err(&pdev->dev, "Failed to request pinctrl\n");
return PTR_ERR(pinctrl);
}
ssc = devm_kzalloc(&pdev->dev, sizeof(struct ssc_device), GFP_KERNEL); ssc = devm_kzalloc(&pdev->dev, sizeof(struct ssc_device), GFP_KERNEL);
if (!ssc) { if (!ssc) {
......
...@@ -1502,7 +1502,7 @@ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol, ...@@ -1502,7 +1502,7 @@ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol,
ctl_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); ctl_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
substream = snd_pcm_chmap_substream(info, ctl_idx); substream = snd_pcm_chmap_substream(info, ctl_idx);
if (!substream || !substream->runtime) if (!substream || !substream->runtime)
return -EBADFD; return 0; /* just for avoiding error from alsactl restore */
switch (substream->runtime->status->state) { switch (substream->runtime->status->state) {
case SNDRV_PCM_STATE_OPEN: case SNDRV_PCM_STATE_OPEN:
case SNDRV_PCM_STATE_SETUP: case SNDRV_PCM_STATE_SETUP:
......
...@@ -179,6 +179,15 @@ static struct usbmix_name_map audigy2nx_map[] = { ...@@ -179,6 +179,15 @@ static struct usbmix_name_map audigy2nx_map[] = {
{ 0 } /* terminator */ { 0 } /* terminator */
}; };
static struct usbmix_selector_map c400_selectors[] = {
{
.id = 0x80,
.count = 2,
.names = (const char*[]) {"Internal", "SPDIF"}
},
{ 0 } /* terminator */
};
static struct usbmix_selector_map audigy2nx_selectors[] = { static struct usbmix_selector_map audigy2nx_selectors[] = {
{ {
.id = 14, /* Capture Source */ .id = 14, /* Capture Source */
...@@ -366,6 +375,10 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { ...@@ -366,6 +375,10 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
.id = USB_ID(0x06f8, 0xc000), .id = USB_ID(0x06f8, 0xc000),
.map = hercules_usb51_map, .map = hercules_usb51_map,
}, },
{
.id = USB_ID(0x0763, 0x2030),
.selector_map = c400_selectors,
},
{ {
.id = USB_ID(0x08bb, 0x2702), .id = USB_ID(0x08bb, 0x2702),
.map = linex_map, .map = linex_map,
......
...@@ -2289,7 +2289,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), ...@@ -2289,7 +2289,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.rate_table = (unsigned int[]) { .rate_table = (unsigned int[]) {
44100, 48000, 88200, 96000 44100, 48000, 88200, 96000
}, },
.clock = 0x81, .clock = 0x80,
} }
}, },
/* Capture */ /* Capture */
...@@ -2315,7 +2315,7 @@ YAMAHA_DEVICE(0x7010, "UB99"), ...@@ -2315,7 +2315,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.rate_table = (unsigned int[]) { .rate_table = (unsigned int[]) {
44100, 48000, 88200, 96000 44100, 48000, 88200, 96000
}, },
.clock = 0x81, .clock = 0x80,
} }
}, },
/* MIDI */ /* MIDI */
......
...@@ -387,11 +387,13 @@ static int snd_usb_fasttrackpro_boot_quirk(struct usb_device *dev) ...@@ -387,11 +387,13 @@ static int snd_usb_fasttrackpro_boot_quirk(struct usb_device *dev)
* rules * rules
*/ */
err = usb_driver_set_configuration(dev, 2); err = usb_driver_set_configuration(dev, 2);
if (err < 0) { if (err < 0)
snd_printdd("error usb_driver_set_configuration: %d\n", snd_printdd("error usb_driver_set_configuration: %d\n",
err); err);
return -ENODEV; /* Always return an error, so that we stop creating a device
} that will just be destroyed and recreated with a new
configuration */
return -ENODEV;
} else } else
snd_printk(KERN_INFO "usb-audio: Fast Track Pro config OK\n"); snd_printk(KERN_INFO "usb-audio: Fast Track Pro config OK\n");
...@@ -859,6 +861,17 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep) ...@@ -859,6 +861,17 @@ void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
if ((le16_to_cpu(ep->chip->dev->descriptor.idVendor) == 0x23ba) && if ((le16_to_cpu(ep->chip->dev->descriptor.idVendor) == 0x23ba) &&
ep->type == SND_USB_ENDPOINT_TYPE_SYNC) ep->type == SND_USB_ENDPOINT_TYPE_SYNC)
ep->skip_packets = 4; ep->skip_packets = 4;
/*
* M-Audio Fast Track C400 - when packets are not skipped, real world
* latency varies by approx. +/- 50 frames (at 96KHz) each time the
* stream is (re)started. When skipping packets 16 at endpoint start
* up, the real world latency is stable within +/- 1 frame (also
* across power cycles).
*/
if (ep->chip->usb_id == USB_ID(0x0763, 0x2030) &&
ep->type == SND_USB_ENDPOINT_TYPE_DATA)
ep->skip_packets = 16;
} }
void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册