diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-05 12:06:57 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-05 12:06:57 -0400 |
| commit | 8f09aacfa6cf64c469fe60c05dfc1bd75e8615ed (patch) | |
| tree | 46503c5bce589638d727bfd5415ba0dfb82b9a0e | |
| parent | d08d528dc1848fb369a0b27cdb0749d8f6f38063 (diff) | |
| parent | 868211db6df96ddae411fcd800502725beef8387 (diff) | |
Merge tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"This contains slightly more volumes than usual at this stage, mostly
because of my vacation in the last week. Nothing to scare, all small
and/or trivial fixes:
- Fix loop path handling in ASoC DAPM
- Some memory handling fixes in ASoC core
- Fix spear_pcm to adapt to the updated API
- HD-audio HDMI ELD handling fixes
- Fix for CM6331 USB-audio SRC change bugs
- Revert power_save_controller option change due to user-space usage
- A few other small ASoC and HD-audio fixes"
* tag 'sound-3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda/generic - fix uninitialized variable
Revert "ALSA: hda - Allow power_save_controller option override DCAPS"
ALSA: hda - fix typo in proc output
ALSA: hda - Enabling Realtek ALC 671 codec
ALSA: usb: Work around CM6631 sample rate change bug
ALSA: hda - bug fix on HDMI ELD debug message
ALSA: hda - bug fix on return value when getting HDMI ELD info
ASoC: dma-sh7760: Fix compile error
ASoC: core: fix invalid free of devm_ allocated data
ASoC: spear_pcm: Update to new pcm_new() API
ASoC:: max98090: Remove executable bit
ASoC: dapm: Fix pointer dereference in is_connected_output_ep()
ASoC: pcm030 audio fabric: remove __init from probe
ASoC: imx-ssi: Fix occasional AC97 reset failure
ASoC: core: fix possible memory leak in snd_soc_bytes_put()
ASoC: wm_adsp: fix possible memory leak in wm_adsp_load_coeff()
ASoC: dapm: Fix handling of loops
ASoC: si476x: Add missing break for SNDRV_PCM_FORMAT_S8 switch case
| -rw-r--r-- | Documentation/sound/alsa/ALSA-Configuration.txt | 5 | ||||
| -rw-r--r--[-rwxr-xr-x] | include/sound/max98090.h | 0 | ||||
| -rw-r--r-- | include/sound/soc-dapm.h | 1 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_eld.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_generic.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 4 | ||||
| -rw-r--r--[-rwxr-xr-x] | sound/soc/codecs/max98090.c | 0 | ||||
| -rw-r--r--[-rwxr-xr-x] | sound/soc/codecs/max98090.h | 0 | ||||
| -rw-r--r-- | sound/soc/codecs/si476x.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/wm_adsp.c | 5 | ||||
| -rw-r--r-- | sound/soc/fsl/imx-ssi.c | 5 | ||||
| -rw-r--r-- | sound/soc/fsl/pcm030-audio-fabric.c | 2 | ||||
| -rw-r--r-- | sound/soc/sh/dma-sh7760.c | 4 | ||||
| -rw-r--r-- | sound/soc/soc-core.c | 8 | ||||
| -rw-r--r-- | sound/soc/soc-dapm.c | 14 | ||||
| -rw-r--r-- | sound/soc/spear/spear_pcm.c | 12 | ||||
| -rw-r--r-- | sound/usb/clock.c | 45 |
20 files changed, 83 insertions, 37 deletions
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 4499bd948860..95731a08f257 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
| @@ -890,9 +890,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
| 890 | enable_msi - Enable Message Signaled Interrupt (MSI) (default = off) | 890 | enable_msi - Enable Message Signaled Interrupt (MSI) (default = off) |
| 891 | power_save - Automatic power-saving timeout (in second, 0 = | 891 | power_save - Automatic power-saving timeout (in second, 0 = |
| 892 | disable) | 892 | disable) |
| 893 | power_save_controller - Support runtime D3 of HD-audio controller | 893 | power_save_controller - Reset HD-audio controller in power-saving mode |
| 894 | (-1 = on for supported chip (default), false = off, | 894 | (default = on) |
| 895 | true = force to on even for unsupported hardware) | ||
| 896 | align_buffer_size - Force rounding of buffer/period sizes to multiples | 895 | align_buffer_size - Force rounding of buffer/period sizes to multiples |
| 897 | of 128 bytes. This is more efficient in terms of memory | 896 | of 128 bytes. This is more efficient in terms of memory |
| 898 | access but isn't required by the HDA spec and prevents | 897 | access but isn't required by the HDA spec and prevents |
diff --git a/include/sound/max98090.h b/include/sound/max98090.h index 95efb13f8478..95efb13f8478 100755..100644 --- a/include/sound/max98090.h +++ b/include/sound/max98090.h | |||
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index e1ef63d4a5c4..44a30b108683 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
| @@ -488,6 +488,7 @@ struct snd_soc_dapm_path { | |||
| 488 | /* status */ | 488 | /* status */ |
| 489 | u32 connect:1; /* source and sink widgets are connected */ | 489 | u32 connect:1; /* source and sink widgets are connected */ |
| 490 | u32 walked:1; /* path has been walked */ | 490 | u32 walked:1; /* path has been walked */ |
| 491 | u32 walking:1; /* path is in the process of being walked */ | ||
| 491 | u32 weak:1; /* path ignored for power management */ | 492 | u32 weak:1; /* path ignored for power management */ |
| 492 | 493 | ||
| 493 | int (*connected)(struct snd_soc_dapm_widget *source, | 494 | int (*connected)(struct snd_soc_dapm_widget *source, |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index ecdf30eb5879..4aba7646dd9c 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -173,7 +173,7 @@ const char *snd_hda_get_jack_type(u32 cfg) | |||
| 173 | "Line Out", "Speaker", "HP Out", "CD", | 173 | "Line Out", "Speaker", "HP Out", "CD", |
| 174 | "SPDIF Out", "Digital Out", "Modem Line", "Modem Hand", | 174 | "SPDIF Out", "Digital Out", "Modem Line", "Modem Hand", |
| 175 | "Line In", "Aux", "Mic", "Telephony", | 175 | "Line In", "Aux", "Mic", "Telephony", |
| 176 | "SPDIF In", "Digitial In", "Reserved", "Other" | 176 | "SPDIF In", "Digital In", "Reserved", "Other" |
| 177 | }; | 177 | }; |
| 178 | 178 | ||
| 179 | return jack_types[(cfg & AC_DEFCFG_DEVICE) | 179 | return jack_types[(cfg & AC_DEFCFG_DEVICE) |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 7dd846380a50..d0d7ac1e99d2 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
| @@ -320,7 +320,7 @@ int snd_hdmi_get_eld(struct hda_codec *codec, hda_nid_t nid, | |||
| 320 | unsigned char *buf, int *eld_size) | 320 | unsigned char *buf, int *eld_size) |
| 321 | { | 321 | { |
| 322 | int i; | 322 | int i; |
| 323 | int ret; | 323 | int ret = 0; |
| 324 | int size; | 324 | int size; |
| 325 | 325 | ||
| 326 | /* | 326 | /* |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 43c2ea539561..2dbe767be16b 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
| @@ -740,7 +740,7 @@ EXPORT_SYMBOL_HDA(snd_hda_activate_path); | |||
| 740 | static void path_power_down_sync(struct hda_codec *codec, struct nid_path *path) | 740 | static void path_power_down_sync(struct hda_codec *codec, struct nid_path *path) |
| 741 | { | 741 | { |
| 742 | struct hda_gen_spec *spec = codec->spec; | 742 | struct hda_gen_spec *spec = codec->spec; |
| 743 | bool changed; | 743 | bool changed = false; |
| 744 | int i; | 744 | int i; |
| 745 | 745 | ||
| 746 | if (!spec->power_down_unused || path->active) | 746 | if (!spec->power_down_unused || path->active) |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 418bfc0eb0a3..bcd40ee488e3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -134,8 +134,8 @@ MODULE_PARM_DESC(power_save, "Automatic power-saving timeout " | |||
| 134 | * this may give more power-saving, but will take longer time to | 134 | * this may give more power-saving, but will take longer time to |
| 135 | * wake up. | 135 | * wake up. |
| 136 | */ | 136 | */ |
| 137 | static int power_save_controller = -1; | 137 | static bool power_save_controller = 1; |
| 138 | module_param(power_save_controller, bint, 0644); | 138 | module_param(power_save_controller, bool, 0644); |
| 139 | MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode."); | 139 | MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode."); |
| 140 | #endif /* CONFIG_PM */ | 140 | #endif /* CONFIG_PM */ |
| 141 | 141 | ||
| @@ -2931,8 +2931,6 @@ static int azx_runtime_idle(struct device *dev) | |||
| 2931 | struct snd_card *card = dev_get_drvdata(dev); | 2931 | struct snd_card *card = dev_get_drvdata(dev); |
| 2932 | struct azx *chip = card->private_data; | 2932 | struct azx *chip = card->private_data; |
| 2933 | 2933 | ||
| 2934 | if (power_save_controller > 0) | ||
| 2935 | return 0; | ||
| 2936 | if (!power_save_controller || | 2934 | if (!power_save_controller || |
| 2937 | !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) | 2935 | !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) |
| 2938 | return -EBUSY; | 2936 | return -EBUSY; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 78e1827d0a95..de8ac5c07fd0 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -1196,7 +1196,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) | |||
| 1196 | 1196 | ||
| 1197 | _snd_printd(SND_PR_VERBOSE, | 1197 | _snd_printd(SND_PR_VERBOSE, |
| 1198 | "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", | 1198 | "HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", |
| 1199 | codec->addr, pin_nid, eld->monitor_present, eld->eld_valid); | 1199 | codec->addr, pin_nid, pin_eld->monitor_present, eld->eld_valid); |
| 1200 | 1200 | ||
| 1201 | if (eld->eld_valid) { | 1201 | if (eld->eld_valid) { |
| 1202 | if (snd_hdmi_get_eld(codec, pin_nid, eld->eld_buffer, | 1202 | if (snd_hdmi_get_eld(codec, pin_nid, eld->eld_buffer, |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 563c24df4d6f..f15c36bde540 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -3440,7 +3440,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 3440 | const hda_nid_t *ssids; | 3440 | const hda_nid_t *ssids; |
| 3441 | 3441 | ||
| 3442 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || | 3442 | if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 || |
| 3443 | codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670) | 3443 | codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670 || |
| 3444 | codec->vendor_id == 0x10ec0671) | ||
| 3444 | ssids = alc663_ssids; | 3445 | ssids = alc663_ssids; |
| 3445 | else | 3446 | else |
| 3446 | ssids = alc662_ssids; | 3447 | ssids = alc662_ssids; |
| @@ -3894,6 +3895,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { | |||
| 3894 | { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, | 3895 | { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, |
| 3895 | { .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 }, | 3896 | { .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 }, |
| 3896 | { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, | 3897 | { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, |
| 3898 | { .id = 0x10ec0671, .name = "ALC671", .patch = patch_alc662 }, | ||
| 3897 | { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, | 3899 | { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, |
| 3898 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, | 3900 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, |
| 3899 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, | 3901 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, |
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index fc176044994d..fc176044994d 100755..100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c | |||
diff --git a/sound/soc/codecs/max98090.h b/sound/soc/codecs/max98090.h index 7e103f249053..7e103f249053 100755..100644 --- a/sound/soc/codecs/max98090.h +++ b/sound/soc/codecs/max98090.h | |||
diff --git a/sound/soc/codecs/si476x.c b/sound/soc/codecs/si476x.c index f2d61a187830..566ea3256e2d 100644 --- a/sound/soc/codecs/si476x.c +++ b/sound/soc/codecs/si476x.c | |||
| @@ -159,6 +159,7 @@ static int si476x_codec_hw_params(struct snd_pcm_substream *substream, | |||
| 159 | switch (params_format(params)) { | 159 | switch (params_format(params)) { |
| 160 | case SNDRV_PCM_FORMAT_S8: | 160 | case SNDRV_PCM_FORMAT_S8: |
| 161 | width = SI476X_PCM_FORMAT_S8; | 161 | width = SI476X_PCM_FORMAT_S8; |
| 162 | break; | ||
| 162 | case SNDRV_PCM_FORMAT_S16_LE: | 163 | case SNDRV_PCM_FORMAT_S16_LE: |
| 163 | width = SI476X_PCM_FORMAT_S16_LE; | 164 | width = SI476X_PCM_FORMAT_S16_LE; |
| 164 | break; | 165 | break; |
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c index f3f7e75f8628..9af1bddc4c62 100644 --- a/sound/soc/codecs/wm_adsp.c +++ b/sound/soc/codecs/wm_adsp.c | |||
| @@ -828,7 +828,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp) | |||
| 828 | &buf_list); | 828 | &buf_list); |
| 829 | if (!buf) { | 829 | if (!buf) { |
| 830 | adsp_err(dsp, "Out of memory\n"); | 830 | adsp_err(dsp, "Out of memory\n"); |
| 831 | return -ENOMEM; | 831 | ret = -ENOMEM; |
| 832 | goto out_fw; | ||
| 832 | } | 833 | } |
| 833 | 834 | ||
| 834 | adsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n", | 835 | adsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n", |
| @@ -865,7 +866,7 @@ out_fw: | |||
| 865 | wm_adsp_buf_free(&buf_list); | 866 | wm_adsp_buf_free(&buf_list); |
| 866 | out: | 867 | out: |
| 867 | kfree(file); | 868 | kfree(file); |
| 868 | return 0; | 869 | return ret; |
| 869 | } | 870 | } |
| 870 | 871 | ||
| 871 | int wm_adsp1_init(struct wm_adsp *adsp) | 872 | int wm_adsp1_init(struct wm_adsp *adsp) |
diff --git a/sound/soc/fsl/imx-ssi.c b/sound/soc/fsl/imx-ssi.c index 55464a5b0706..810c7eeb7b03 100644 --- a/sound/soc/fsl/imx-ssi.c +++ b/sound/soc/fsl/imx-ssi.c | |||
| @@ -496,6 +496,8 @@ static void imx_ssi_ac97_reset(struct snd_ac97 *ac97) | |||
| 496 | 496 | ||
| 497 | if (imx_ssi->ac97_reset) | 497 | if (imx_ssi->ac97_reset) |
| 498 | imx_ssi->ac97_reset(ac97); | 498 | imx_ssi->ac97_reset(ac97); |
| 499 | /* First read sometimes fails, do a dummy read */ | ||
| 500 | imx_ssi_ac97_read(ac97, 0); | ||
| 499 | } | 501 | } |
| 500 | 502 | ||
| 501 | static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97) | 503 | static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97) |
| @@ -504,6 +506,9 @@ static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97) | |||
| 504 | 506 | ||
| 505 | if (imx_ssi->ac97_warm_reset) | 507 | if (imx_ssi->ac97_warm_reset) |
| 506 | imx_ssi->ac97_warm_reset(ac97); | 508 | imx_ssi->ac97_warm_reset(ac97); |
| 509 | |||
| 510 | /* First read sometimes fails, do a dummy read */ | ||
| 511 | imx_ssi_ac97_read(ac97, 0); | ||
| 507 | } | 512 | } |
| 508 | 513 | ||
| 509 | struct snd_ac97_bus_ops soc_ac97_ops = { | 514 | struct snd_ac97_bus_ops soc_ac97_ops = { |
diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c index 8e52c1485df3..eb4373840bb6 100644 --- a/sound/soc/fsl/pcm030-audio-fabric.c +++ b/sound/soc/fsl/pcm030-audio-fabric.c | |||
| @@ -51,7 +51,7 @@ static struct snd_soc_card pcm030_card = { | |||
| 51 | .num_links = ARRAY_SIZE(pcm030_fabric_dai), | 51 | .num_links = ARRAY_SIZE(pcm030_fabric_dai), |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | static int __init pcm030_fabric_probe(struct platform_device *op) | 54 | static int pcm030_fabric_probe(struct platform_device *op) |
| 55 | { | 55 | { |
| 56 | struct device_node *np = op->dev.of_node; | 56 | struct device_node *np = op->dev.of_node; |
| 57 | struct device_node *platform_np; | 57 | struct device_node *platform_np; |
diff --git a/sound/soc/sh/dma-sh7760.c b/sound/soc/sh/dma-sh7760.c index 19eff8fc4fdd..1a8b03e4b41b 100644 --- a/sound/soc/sh/dma-sh7760.c +++ b/sound/soc/sh/dma-sh7760.c | |||
| @@ -342,8 +342,8 @@ static int camelot_pcm_new(struct snd_soc_pcm_runtime *rtd) | |||
| 342 | return 0; | 342 | return 0; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | static struct snd_soc_platform sh7760_soc_platform = { | 345 | static struct snd_soc_platform_driver sh7760_soc_platform = { |
| 346 | .pcm_ops = &camelot_pcm_ops, | 346 | .ops = &camelot_pcm_ops, |
| 347 | .pcm_new = camelot_pcm_new, | 347 | .pcm_new = camelot_pcm_new, |
| 348 | .pcm_free = camelot_pcm_free, | 348 | .pcm_free = camelot_pcm_free, |
| 349 | }; | 349 | }; |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index b7e84a7cd9ee..507d251916af 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -3140,7 +3140,7 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, | |||
| 3140 | if (params->mask) { | 3140 | if (params->mask) { |
| 3141 | ret = regmap_read(codec->control_data, params->base, &val); | 3141 | ret = regmap_read(codec->control_data, params->base, &val); |
| 3142 | if (ret != 0) | 3142 | if (ret != 0) |
| 3143 | return ret; | 3143 | goto out; |
| 3144 | 3144 | ||
| 3145 | val &= params->mask; | 3145 | val &= params->mask; |
| 3146 | 3146 | ||
| @@ -3158,13 +3158,15 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol, | |||
| 3158 | ((u32 *)data)[0] |= cpu_to_be32(val); | 3158 | ((u32 *)data)[0] |= cpu_to_be32(val); |
| 3159 | break; | 3159 | break; |
| 3160 | default: | 3160 | default: |
| 3161 | return -EINVAL; | 3161 | ret = -EINVAL; |
| 3162 | goto out; | ||
| 3162 | } | 3163 | } |
| 3163 | } | 3164 | } |
| 3164 | 3165 | ||
| 3165 | ret = regmap_raw_write(codec->control_data, params->base, | 3166 | ret = regmap_raw_write(codec->control_data, params->base, |
| 3166 | data, len); | 3167 | data, len); |
| 3167 | 3168 | ||
| 3169 | out: | ||
| 3168 | kfree(data); | 3170 | kfree(data); |
| 3169 | 3171 | ||
| 3170 | return ret; | 3172 | return ret; |
| @@ -4197,7 +4199,6 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, | |||
| 4197 | dev_err(card->dev, | 4199 | dev_err(card->dev, |
| 4198 | "ASoC: Property '%s' index %d could not be read: %d\n", | 4200 | "ASoC: Property '%s' index %d could not be read: %d\n", |
| 4199 | propname, 2 * i, ret); | 4201 | propname, 2 * i, ret); |
| 4200 | kfree(routes); | ||
| 4201 | return -EINVAL; | 4202 | return -EINVAL; |
| 4202 | } | 4203 | } |
| 4203 | ret = of_property_read_string_index(np, propname, | 4204 | ret = of_property_read_string_index(np, propname, |
| @@ -4206,7 +4207,6 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, | |||
| 4206 | dev_err(card->dev, | 4207 | dev_err(card->dev, |
| 4207 | "ASoC: Property '%s' index %d could not be read: %d\n", | 4208 | "ASoC: Property '%s' index %d could not be read: %d\n", |
| 4208 | propname, (2 * i) + 1, ret); | 4209 | propname, (2 * i) + 1, ret); |
| 4209 | kfree(routes); | ||
| 4210 | return -EINVAL; | 4210 | return -EINVAL; |
| 4211 | } | 4211 | } |
| 4212 | } | 4212 | } |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 1d6a9b3ceb27..d6d9ba2e6916 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -831,6 +831,9 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget, | |||
| 831 | if (path->weak) | 831 | if (path->weak) |
| 832 | continue; | 832 | continue; |
| 833 | 833 | ||
| 834 | if (path->walking) | ||
| 835 | return 1; | ||
| 836 | |||
| 834 | if (path->walked) | 837 | if (path->walked) |
| 835 | continue; | 838 | continue; |
| 836 | 839 | ||
| @@ -838,6 +841,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget, | |||
| 838 | 841 | ||
| 839 | if (path->sink && path->connect) { | 842 | if (path->sink && path->connect) { |
| 840 | path->walked = 1; | 843 | path->walked = 1; |
| 844 | path->walking = 1; | ||
| 841 | 845 | ||
| 842 | /* do we need to add this widget to the list ? */ | 846 | /* do we need to add this widget to the list ? */ |
| 843 | if (list) { | 847 | if (list) { |
| @@ -847,11 +851,14 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget, | |||
| 847 | dev_err(widget->dapm->dev, | 851 | dev_err(widget->dapm->dev, |
| 848 | "ASoC: could not add widget %s\n", | 852 | "ASoC: could not add widget %s\n", |
| 849 | widget->name); | 853 | widget->name); |
| 854 | path->walking = 0; | ||
| 850 | return con; | 855 | return con; |
| 851 | } | 856 | } |
| 852 | } | 857 | } |
| 853 | 858 | ||
| 854 | con += is_connected_output_ep(path->sink, list); | 859 | con += is_connected_output_ep(path->sink, list); |
| 860 | |||
| 861 | path->walking = 0; | ||
| 855 | } | 862 | } |
| 856 | } | 863 | } |
| 857 | 864 | ||
| @@ -931,6 +938,9 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget, | |||
| 931 | if (path->weak) | 938 | if (path->weak) |
| 932 | continue; | 939 | continue; |
| 933 | 940 | ||
| 941 | if (path->walking) | ||
| 942 | return 1; | ||
| 943 | |||
| 934 | if (path->walked) | 944 | if (path->walked) |
| 935 | continue; | 945 | continue; |
| 936 | 946 | ||
| @@ -938,6 +948,7 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget, | |||
| 938 | 948 | ||
| 939 | if (path->source && path->connect) { | 949 | if (path->source && path->connect) { |
| 940 | path->walked = 1; | 950 | path->walked = 1; |
| 951 | path->walking = 1; | ||
| 941 | 952 | ||
| 942 | /* do we need to add this widget to the list ? */ | 953 | /* do we need to add this widget to the list ? */ |
| 943 | if (list) { | 954 | if (list) { |
| @@ -947,11 +958,14 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget, | |||
| 947 | dev_err(widget->dapm->dev, | 958 | dev_err(widget->dapm->dev, |
| 948 | "ASoC: could not add widget %s\n", | 959 | "ASoC: could not add widget %s\n", |
| 949 | widget->name); | 960 | widget->name); |
| 961 | path->walking = 0; | ||
| 950 | return con; | 962 | return con; |
| 951 | } | 963 | } |
| 952 | } | 964 | } |
| 953 | 965 | ||
| 954 | con += is_connected_input_ep(path->source, list); | 966 | con += is_connected_input_ep(path->source, list); |
| 967 | |||
| 968 | path->walking = 0; | ||
| 955 | } | 969 | } |
| 956 | } | 970 | } |
| 957 | 971 | ||
diff --git a/sound/soc/spear/spear_pcm.c b/sound/soc/spear/spear_pcm.c index 9b76cc5a1148..5e7aebe1e664 100644 --- a/sound/soc/spear/spear_pcm.c +++ b/sound/soc/spear/spear_pcm.c | |||
| @@ -149,9 +149,9 @@ static void spear_pcm_free(struct snd_pcm *pcm) | |||
| 149 | 149 | ||
| 150 | static u64 spear_pcm_dmamask = DMA_BIT_MASK(32); | 150 | static u64 spear_pcm_dmamask = DMA_BIT_MASK(32); |
| 151 | 151 | ||
| 152 | static int spear_pcm_new(struct snd_card *card, | 152 | static int spear_pcm_new(struct snd_soc_pcm_runtime *rtd) |
| 153 | struct snd_soc_dai *dai, struct snd_pcm *pcm) | ||
| 154 | { | 153 | { |
| 154 | struct snd_card *card = rtd->card->snd_card; | ||
| 155 | int ret; | 155 | int ret; |
| 156 | 156 | ||
| 157 | if (!card->dev->dma_mask) | 157 | if (!card->dev->dma_mask) |
| @@ -159,16 +159,16 @@ static int spear_pcm_new(struct snd_card *card, | |||
| 159 | if (!card->dev->coherent_dma_mask) | 159 | if (!card->dev->coherent_dma_mask) |
| 160 | card->dev->coherent_dma_mask = DMA_BIT_MASK(32); | 160 | card->dev->coherent_dma_mask = DMA_BIT_MASK(32); |
| 161 | 161 | ||
| 162 | if (dai->driver->playback.channels_min) { | 162 | if (rtd->cpu_dai->driver->playback.channels_min) { |
| 163 | ret = spear_pcm_preallocate_dma_buffer(pcm, | 163 | ret = spear_pcm_preallocate_dma_buffer(rtd->pcm, |
| 164 | SNDRV_PCM_STREAM_PLAYBACK, | 164 | SNDRV_PCM_STREAM_PLAYBACK, |
| 165 | spear_pcm_hardware.buffer_bytes_max); | 165 | spear_pcm_hardware.buffer_bytes_max); |
| 166 | if (ret) | 166 | if (ret) |
| 167 | return ret; | 167 | return ret; |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | if (dai->driver->capture.channels_min) { | 170 | if (rtd->cpu_dai->driver->capture.channels_min) { |
| 171 | ret = spear_pcm_preallocate_dma_buffer(pcm, | 171 | ret = spear_pcm_preallocate_dma_buffer(rtd->pcm, |
| 172 | SNDRV_PCM_STREAM_CAPTURE, | 172 | SNDRV_PCM_STREAM_CAPTURE, |
| 173 | spear_pcm_hardware.buffer_bytes_max); | 173 | spear_pcm_hardware.buffer_bytes_max); |
| 174 | if (ret) | 174 | if (ret) |
diff --git a/sound/usb/clock.c b/sound/usb/clock.c index 5e634a2eb282..9e2703a25156 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c | |||
| @@ -253,7 +253,7 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, | |||
| 253 | { | 253 | { |
| 254 | struct usb_device *dev = chip->dev; | 254 | struct usb_device *dev = chip->dev; |
| 255 | unsigned char data[4]; | 255 | unsigned char data[4]; |
| 256 | int err, crate; | 256 | int err, cur_rate, prev_rate; |
| 257 | int clock = snd_usb_clock_find_source(chip, fmt->clock); | 257 | int clock = snd_usb_clock_find_source(chip, fmt->clock); |
| 258 | 258 | ||
| 259 | if (clock < 0) | 259 | if (clock < 0) |
| @@ -266,6 +266,19 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, | |||
| 266 | return -ENXIO; | 266 | return -ENXIO; |
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, | ||
| 270 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | ||
| 271 | UAC2_CS_CONTROL_SAM_FREQ << 8, | ||
| 272 | snd_usb_ctrl_intf(chip) | (clock << 8), | ||
| 273 | data, sizeof(data)); | ||
| 274 | if (err < 0) { | ||
| 275 | snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n", | ||
| 276 | dev->devnum, iface, fmt->altsetting); | ||
| 277 | prev_rate = 0; | ||
| 278 | } else { | ||
| 279 | prev_rate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); | ||
| 280 | } | ||
| 281 | |||
| 269 | data[0] = rate; | 282 | data[0] = rate; |
| 270 | data[1] = rate >> 8; | 283 | data[1] = rate >> 8; |
| 271 | data[2] = rate >> 16; | 284 | data[2] = rate >> 16; |
| @@ -280,19 +293,31 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface, | |||
| 280 | return err; | 293 | return err; |
| 281 | } | 294 | } |
| 282 | 295 | ||
| 283 | if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, | 296 | err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, |
| 284 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, | 297 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, |
| 285 | UAC2_CS_CONTROL_SAM_FREQ << 8, | 298 | UAC2_CS_CONTROL_SAM_FREQ << 8, |
| 286 | snd_usb_ctrl_intf(chip) | (clock << 8), | 299 | snd_usb_ctrl_intf(chip) | (clock << 8), |
| 287 | data, sizeof(data))) < 0) { | 300 | data, sizeof(data)); |
| 301 | if (err < 0) { | ||
| 288 | snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n", | 302 | snd_printk(KERN_WARNING "%d:%d:%d: cannot get freq (v2)\n", |
| 289 | dev->devnum, iface, fmt->altsetting); | 303 | dev->devnum, iface, fmt->altsetting); |
| 290 | return err; | 304 | cur_rate = 0; |
| 305 | } else { | ||
| 306 | cur_rate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); | ||
| 291 | } | 307 | } |
| 292 | 308 | ||
| 293 | crate = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); | 309 | if (cur_rate != rate) { |
| 294 | if (crate != rate) | 310 | snd_printd(KERN_WARNING |
| 295 | snd_printd(KERN_WARNING "current rate %d is different from the runtime rate %d\n", crate, rate); | 311 | "current rate %d is different from the runtime rate %d\n", |
| 312 | cur_rate, rate); | ||
| 313 | } | ||
| 314 | |||
| 315 | /* Some devices doesn't respond to sample rate changes while the | ||
| 316 | * interface is active. */ | ||
| 317 | if (rate != prev_rate) { | ||
| 318 | usb_set_interface(dev, iface, 0); | ||
| 319 | usb_set_interface(dev, iface, fmt->altsetting); | ||
| 320 | } | ||
| 296 | 321 | ||
| 297 | return 0; | 322 | return 0; |
| 298 | } | 323 | } |
