diff options
Diffstat (limited to 'sound/pci/rme96.c')
| -rw-r--r-- | sound/pci/rme96.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index 714df906249e..41c31db65039 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c | |||
| @@ -741,10 +741,11 @@ snd_rme96_playback_setrate(struct rme96 *rme96, | |||
| 741 | { | 741 | { |
| 742 | /* change to/from double-speed: reset the DAC (if available) */ | 742 | /* change to/from double-speed: reset the DAC (if available) */ |
| 743 | snd_rme96_reset_dac(rme96); | 743 | snd_rme96_reset_dac(rme96); |
| 744 | return 1; /* need to restore volume */ | ||
| 744 | } else { | 745 | } else { |
| 745 | writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); | 746 | writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); |
| 747 | return 0; | ||
| 746 | } | 748 | } |
| 747 | return 0; | ||
| 748 | } | 749 | } |
| 749 | 750 | ||
| 750 | static int | 751 | static int |
| @@ -980,6 +981,7 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream *substream, | |||
| 980 | struct rme96 *rme96 = snd_pcm_substream_chip(substream); | 981 | struct rme96 *rme96 = snd_pcm_substream_chip(substream); |
| 981 | struct snd_pcm_runtime *runtime = substream->runtime; | 982 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 982 | int err, rate, dummy; | 983 | int err, rate, dummy; |
| 984 | bool apply_dac_volume = false; | ||
| 983 | 985 | ||
| 984 | runtime->dma_area = (void __force *)(rme96->iobase + | 986 | runtime->dma_area = (void __force *)(rme96->iobase + |
| 985 | RME96_IO_PLAY_BUFFER); | 987 | RME96_IO_PLAY_BUFFER); |
| @@ -993,24 +995,26 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream *substream, | |||
| 993 | { | 995 | { |
| 994 | /* slave clock */ | 996 | /* slave clock */ |
| 995 | if ((int)params_rate(params) != rate) { | 997 | if ((int)params_rate(params) != rate) { |
| 996 | spin_unlock_irq(&rme96->lock); | 998 | err = -EIO; |
| 997 | return -EIO; | 999 | goto error; |
| 998 | } | 1000 | } |
| 999 | } else if ((err = snd_rme96_playback_setrate(rme96, params_rate(params))) < 0) { | 1001 | } else { |
| 1000 | spin_unlock_irq(&rme96->lock); | 1002 | err = snd_rme96_playback_setrate(rme96, params_rate(params)); |
| 1001 | return err; | 1003 | if (err < 0) |
| 1002 | } | 1004 | goto error; |
| 1003 | if ((err = snd_rme96_playback_setformat(rme96, params_format(params))) < 0) { | 1005 | apply_dac_volume = err > 0; /* need to restore volume later? */ |
| 1004 | spin_unlock_irq(&rme96->lock); | ||
| 1005 | return err; | ||
| 1006 | } | 1006 | } |
| 1007 | |||
| 1008 | err = snd_rme96_playback_setformat(rme96, params_format(params)); | ||
| 1009 | if (err < 0) | ||
| 1010 | goto error; | ||
| 1007 | snd_rme96_setframelog(rme96, params_channels(params), 1); | 1011 | snd_rme96_setframelog(rme96, params_channels(params), 1); |
| 1008 | if (rme96->capture_periodsize != 0) { | 1012 | if (rme96->capture_periodsize != 0) { |
| 1009 | if (params_period_size(params) << rme96->playback_frlog != | 1013 | if (params_period_size(params) << rme96->playback_frlog != |
| 1010 | rme96->capture_periodsize) | 1014 | rme96->capture_periodsize) |
| 1011 | { | 1015 | { |
| 1012 | spin_unlock_irq(&rme96->lock); | 1016 | err = -EBUSY; |
| 1013 | return -EBUSY; | 1017 | goto error; |
| 1014 | } | 1018 | } |
| 1015 | } | 1019 | } |
| 1016 | rme96->playback_periodsize = | 1020 | rme96->playback_periodsize = |
| @@ -1021,9 +1025,16 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream *substream, | |||
| 1021 | rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP); | 1025 | rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP); |
| 1022 | writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase + RME96_IO_CONTROL_REGISTER); | 1026 | writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase + RME96_IO_CONTROL_REGISTER); |
| 1023 | } | 1027 | } |
| 1028 | |||
| 1029 | err = 0; | ||
| 1030 | error: | ||
| 1024 | spin_unlock_irq(&rme96->lock); | 1031 | spin_unlock_irq(&rme96->lock); |
| 1025 | 1032 | if (apply_dac_volume) { | |
| 1026 | return 0; | 1033 | usleep_range(3000, 10000); |
| 1034 | snd_rme96_apply_dac_volume(rme96); | ||
| 1035 | } | ||
| 1036 | |||
| 1037 | return err; | ||
| 1027 | } | 1038 | } |
| 1028 | 1039 | ||
| 1029 | static int | 1040 | static int |
