*/
 static snd_pcm_uframes_t snd_usb_pcm_pointer(struct snd_pcm_substream *substream)
 {
-       struct snd_usb_substream *subs;
+       struct snd_usb_substream *subs = substream->runtime->private_data;
        unsigned int hwptr_done;
 
-       subs = (struct snd_usb_substream *)substream->runtime->private_data;
        if (atomic_read(&subs->stream->chip->shutdown))
                return SNDRV_PCM_POS_XRUN;
        spin_lock(&subs->lock);
                pt = 125 * (1 << fp->datainterval);
                ptmin = min(ptmin, pt);
        }
-       err = snd_usb_autoresume(subs->stream->chip);
-       if (err < 0)
-               return err;
 
        param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
        if (subs->speed == USB_SPEED_FULL)
        if (ptmin == 1000)
                /* if period time doesn't go below 1 ms, no rules needed */
                param_period_time_if_needed = -1;
-       snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_TIME,
-                                    ptmin, UINT_MAX);
-
-       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
-                                      hw_rule_rate, subs,
-                                      SNDRV_PCM_HW_PARAM_FORMAT,
-                                      SNDRV_PCM_HW_PARAM_CHANNELS,
-                                      param_period_time_if_needed,
-                                      -1)) < 0)
-               goto rep_err;
-       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
-                                      hw_rule_channels, subs,
-                                      SNDRV_PCM_HW_PARAM_FORMAT,
-                                      SNDRV_PCM_HW_PARAM_RATE,
-                                      param_period_time_if_needed,
-                                      -1)) < 0)
-               goto rep_err;
-       if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
-                                      hw_rule_format, subs,
-                                      SNDRV_PCM_HW_PARAM_RATE,
-                                      SNDRV_PCM_HW_PARAM_CHANNELS,
-                                      param_period_time_if_needed,
-                                      -1)) < 0)
-               goto rep_err;
+
+       err = snd_pcm_hw_constraint_minmax(runtime,
+                                          SNDRV_PCM_HW_PARAM_PERIOD_TIME,
+                                          ptmin, UINT_MAX);
+       if (err < 0)
+               return err;
+
+       err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
+                                 hw_rule_rate, subs,
+                                 SNDRV_PCM_HW_PARAM_FORMAT,
+                                 SNDRV_PCM_HW_PARAM_CHANNELS,
+                                 param_period_time_if_needed,
+                                 -1);
+       if (err < 0)
+               return err;
+       err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
+                                 hw_rule_channels, subs,
+                                 SNDRV_PCM_HW_PARAM_FORMAT,
+                                 SNDRV_PCM_HW_PARAM_RATE,
+                                 param_period_time_if_needed,
+                                 -1);
+       if (err < 0)
+               return err;
+       err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
+                                 hw_rule_format, subs,
+                                 SNDRV_PCM_HW_PARAM_RATE,
+                                 SNDRV_PCM_HW_PARAM_CHANNELS,
+                                 param_period_time_if_needed,
+                                 -1);
+       if (err < 0)
+               return err;
        if (param_period_time_if_needed >= 0) {
                err = snd_pcm_hw_rule_add(runtime, 0,
                                          SNDRV_PCM_HW_PARAM_PERIOD_TIME,
                                          SNDRV_PCM_HW_PARAM_RATE,
                                          -1);
                if (err < 0)
-                       goto rep_err;
+                       return err;
        }
-       if ((err = snd_usb_pcm_check_knot(runtime, subs)) < 0)
-               goto rep_err;
-       return 0;
+       err = snd_usb_pcm_check_knot(runtime, subs);
+       if (err < 0)
+               return err;
 
-rep_err:
-       snd_usb_autosuspend(subs->stream->chip);
-       return err;
+       return snd_usb_autoresume(subs->stream->chip);
 }
 
 static int snd_usb_pcm_open(struct snd_pcm_substream *substream)