unsigned int cur_period_frames;
        unsigned int cur_period_bytes;
        unsigned int cur_buffer_periods;
+       unsigned char cur_clock;
 
        spinlock_t lock;
        struct list_head list;
 
                ep->cur_period_frames = params_period_size(params);
                ep->cur_period_bytes = ep->cur_period_frames * ep->cur_frame_bytes;
                ep->cur_buffer_periods = params_periods(params);
+               ep->cur_clock = fp->clock;
 
                if (ep->type == SND_USB_ENDPOINT_TYPE_SYNC)
                        endpoint_set_syncinterval(chip, ep);
                ep->altsetting = 0;
                ep->cur_audiofmt = NULL;
                ep->cur_rate = 0;
+               ep->cur_clock = 0;
                ep->iface_ref = NULL;
                usb_audio_dbg(chip, "EP 0x%x closed\n", ep->ep_num);
        }
        return err;
 }
 
+/* get the current rate set to the given clock by any endpoint */
+int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock)
+{
+       struct snd_usb_endpoint *ep;
+       int rate = 0;
+
+       if (!clock)
+               return 0;
+       mutex_lock(&chip->mutex);
+       list_for_each_entry(ep, &chip->ep_list, list) {
+               if (ep->cur_clock == clock && ep->cur_rate) {
+                       rate = ep->cur_rate;
+                       break;
+               }
+       }
+       mutex_unlock(&chip->mutex);
+       return rate;
+}
+
 /**
  * snd_usb_endpoint_start: start an snd_usb_endpoint
  *
 
                            struct snd_usb_endpoint *ep);
 int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
                               struct snd_usb_endpoint *ep);
+int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock);
 
 bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
                                 struct snd_usb_endpoint *ep,
 
                        struct snd_pcm_hw_rule *rule)
 {
        struct snd_usb_substream *subs = rule->private;
+       struct snd_usb_audio *chip = subs->stream->chip;
        const struct audioformat *fp;
        struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
        unsigned int rmin, rmax, r;
        list_for_each_entry(fp, &subs->fmt_list, list) {
                if (!hw_check_valid_format(subs, params, fp))
                        continue;
+               r = snd_usb_endpoint_get_clock_rate(chip, fp->clock);
+               if (r > 0) {
+                       if (!snd_interval_test(it, r))
+                               continue;
+                       rmin = min(rmin, r);
+                       rmax = max(rmax, r);
+                       continue;
+               }
                if (fp->rate_table && fp->nr_rates) {
                        for (i = 0; i < fp->nr_rates; i++) {
                                r = fp->rate_table[i];