Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull sound fixes from Takashi Iwai:
"Just a few trivial driver-specific fixes."

* tag 'sound-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hdspm - Work around broken DDS value on PCI RME MADI
ALSA: usb-audio: fix rate_list memory leak
ASoC: fsi: bugfix: ensure dma is terminated
ASoC: fsi: bugfix: correct dma area
ASoC: fsi: bugfix: enable master clock control on DMA stream
ASoC: imx-ssi: Use clk_prepare_enable/clk_disable_unprepare

+29 -12
+7
sound/pci/rme9652/hdspm.c
··· 1988 1988 period = hdspm_read(hdspm, HDSPM_RD_PLL_FREQ); 1989 1989 rate = hdspm_calc_dds_value(hdspm, period); 1990 1990 1991 + if (rate > 207000) { 1992 + /* Unreasonable high sample rate as seen on PCI MADI cards. 1993 + * Use the cached value instead. 1994 + */ 1995 + rate = hdspm->system_sample_rate; 1996 + } 1997 + 1991 1998 return rate; 1992 1999 } 1993 2000
+3 -3
sound/soc/fsl/imx-ssi.c
··· 543 543 ret); 544 544 goto failed_clk; 545 545 } 546 - clk_enable(ssi->clk); 546 + clk_prepare_enable(ssi->clk); 547 547 548 548 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 549 549 if (!res) { ··· 641 641 failed_ioremap: 642 642 release_mem_region(res->start, resource_size(res)); 643 643 failed_get_resource: 644 - clk_disable(ssi->clk); 644 + clk_disable_unprepare(ssi->clk); 645 645 clk_put(ssi->clk); 646 646 failed_clk: 647 647 kfree(ssi); ··· 664 664 665 665 iounmap(ssi->base); 666 666 release_mem_region(res->start, resource_size(res)); 667 - clk_disable(ssi->clk); 667 + clk_disable_unprepare(ssi->clk); 668 668 clk_put(ssi->clk); 669 669 kfree(ssi); 670 670
+16 -9
sound/soc/sh/fsi.c
··· 1052 1052 return 0; 1053 1053 } 1054 1054 1055 + static dma_addr_t fsi_dma_get_area(struct fsi_stream *io) 1056 + { 1057 + struct snd_pcm_runtime *runtime = io->substream->runtime; 1058 + 1059 + return io->dma + samples_to_bytes(runtime, io->buff_sample_pos); 1060 + } 1061 + 1055 1062 static void fsi_dma_complete(void *data) 1056 1063 { 1057 1064 struct fsi_stream *io = (struct fsi_stream *)data; ··· 1068 1061 enum dma_data_direction dir = fsi_stream_is_play(fsi, io) ? 1069 1062 DMA_TO_DEVICE : DMA_FROM_DEVICE; 1070 1063 1071 - dma_sync_single_for_cpu(dai->dev, io->dma, 1064 + dma_sync_single_for_cpu(dai->dev, fsi_dma_get_area(io), 1072 1065 samples_to_bytes(runtime, io->period_samples), dir); 1073 1066 1074 1067 io->buff_sample_pos += io->period_samples; ··· 1083 1076 fsi_stream_transfer(io); 1084 1077 1085 1078 snd_pcm_period_elapsed(io->substream); 1086 - } 1087 - 1088 - static dma_addr_t fsi_dma_get_area(struct fsi_stream *io) 1089 - { 1090 - struct snd_pcm_runtime *runtime = io->substream->runtime; 1091 - 1092 - return io->dma + samples_to_bytes(runtime, io->buff_sample_pos); 1093 1079 } 1094 1080 1095 1081 static void fsi_dma_do_tasklet(unsigned long data) ··· 1110 1110 len = samples_to_bytes(runtime, io->period_samples); 1111 1111 buf = fsi_dma_get_area(io); 1112 1112 1113 - dma_sync_single_for_device(dai->dev, io->dma, len, dir); 1113 + dma_sync_single_for_device(dai->dev, buf, len, dir); 1114 1114 1115 1115 sg_init_table(&sg, 1); 1116 1116 sg_set_page(&sg, pfn_to_page(PFN_DOWN(buf)), ··· 1172 1172 static void fsi_dma_push_start_stop(struct fsi_priv *fsi, struct fsi_stream *io, 1173 1173 int start) 1174 1174 { 1175 + struct fsi_master *master = fsi_get_master(fsi); 1176 + u32 clk = fsi_is_port_a(fsi) ? CRA : CRB; 1175 1177 u32 enable = start ? DMA_ON : 0; 1176 1178 1177 1179 fsi_reg_mask_set(fsi, OUT_DMAC, DMA_ON, enable); 1180 + 1181 + dmaengine_terminate_all(io->chan); 1182 + 1183 + if (fsi_is_clk_master(fsi)) 1184 + fsi_master_mask_set(master, CLK_RST, clk, (enable) ? clk : 0); 1178 1185 } 1179 1186 1180 1187 static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io)
+3
sound/usb/pcm.c
··· 788 788 int count = 0, needs_knot = 0; 789 789 int err; 790 790 791 + kfree(subs->rate_list.list); 792 + subs->rate_list.list = NULL; 793 + 791 794 list_for_each_entry(fp, &subs->fmt_list, list) { 792 795 if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) 793 796 return 0;