clock.c 11.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/*
 *   Clock domain and sample rate management functions
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

#include <linux/bitops.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/usb.h>
#include <linux/usb/audio.h>
#include <linux/usb/audio-v2.h>

#include <sound/core.h>
#include <sound/info.h>
#include <sound/pcm.h>

#include "usbaudio.h"
#include "card.h"
#include "helper.h"
34
#include "clock.h"
35
#include "quirks.h"
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

static struct uac_clock_source_descriptor *
	snd_usb_find_clock_source(struct usb_host_interface *ctrl_iface,
				  int clock_id)
{
	struct uac_clock_source_descriptor *cs = NULL;

	while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra,
					     ctrl_iface->extralen,
					     cs, UAC2_CLOCK_SOURCE))) {
		if (cs->bClockID == clock_id)
			return cs;
	}

	return NULL;
}

static struct uac_clock_selector_descriptor *
	snd_usb_find_clock_selector(struct usb_host_interface *ctrl_iface,
				    int clock_id)
{
	struct uac_clock_selector_descriptor *cs = NULL;

	while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra,
					     ctrl_iface->extralen,
					     cs, UAC2_CLOCK_SELECTOR))) {
		if (cs->bClockID == clock_id)
			return cs;
	}

	return NULL;
}

static struct uac_clock_multiplier_descriptor *
	snd_usb_find_clock_multiplier(struct usb_host_interface *ctrl_iface,
				      int clock_id)
{
	struct uac_clock_multiplier_descriptor *cs = NULL;

	while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra,
					     ctrl_iface->extralen,
					     cs, UAC2_CLOCK_MULTIPLIER))) {
		if (cs->bClockID == clock_id)
			return cs;
	}

	return NULL;
}

static int uac_clock_selector_get_val(struct snd_usb_audio *chip, int selector_id)
{
	unsigned char buf;
	int ret;

	ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0),
			      UAC2_CS_CUR,
			      USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
93 94
			      UAC2_CX_CLOCK_SELECTOR << 8,
			      snd_usb_ctrl_intf(chip) | (selector_id << 8),
95
			      &buf, sizeof(buf));
96 97 98 99 100 101 102

	if (ret < 0)
		return ret;

	return buf;
}

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
static int uac_clock_selector_set_val(struct snd_usb_audio *chip, int selector_id,
					unsigned char pin)
{
	int ret;

	ret = snd_usb_ctl_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0),
			      UAC2_CS_CUR,
			      USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
			      UAC2_CX_CLOCK_SELECTOR << 8,
			      snd_usb_ctrl_intf(chip) | (selector_id << 8),
			      &pin, sizeof(pin));
	if (ret < 0)
		return ret;

	if (ret != sizeof(pin)) {
118 119 120
		usb_audio_err(chip,
			"setting selector (id %d) unexpected length %d\n",
			selector_id, ret);
121 122 123 124 125 126 127 128
		return -EINVAL;
	}

	ret = uac_clock_selector_get_val(chip, selector_id);
	if (ret < 0)
		return ret;

	if (ret != pin) {
129 130 131
		usb_audio_err(chip,
			"setting selector (id %d) to %x failed (current: %d)\n",
			selector_id, pin, ret);
132 133 134 135 136 137
		return -EINVAL;
	}

	return ret;
}

138 139 140 141 142
static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id)
{
	int err;
	unsigned char data;
	struct usb_device *dev = chip->dev;
143 144 145 146 147 148 149
	struct uac_clock_source_descriptor *cs_desc =
		snd_usb_find_clock_source(chip->ctrl_intf, source_id);

	if (!cs_desc)
		return 0;

	/* If a clock source can't tell us whether it's valid, we assume it is */
150 151
	if (!uac2_control_is_readable(cs_desc->bmControls,
				      UAC2_CS_CONTROL_CLOCK_VALID - 1))
152
		return 1;
153 154 155

	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
156 157
			      UAC2_CS_CONTROL_CLOCK_VALID << 8,
			      snd_usb_ctrl_intf(chip) | (source_id << 8),
158
			      &data, sizeof(data));
159 160

	if (err < 0) {
161 162
		dev_warn(&dev->dev,
			 "%s(): cannot get clock validity for id %d\n",
163
			   __func__, source_id);
164
		return 0;
165 166 167 168 169 170
	}

	return !!data;
}

static int __uac_clock_find_source(struct snd_usb_audio *chip,
171 172
				   int entity_id, unsigned long *visited,
				   bool validate)
173 174 175 176 177 178 179 180
{
	struct uac_clock_source_descriptor *source;
	struct uac_clock_selector_descriptor *selector;
	struct uac_clock_multiplier_descriptor *multiplier;

	entity_id &= 0xff;

	if (test_and_set_bit(entity_id, visited)) {
181 182 183
		usb_audio_warn(chip,
			 "%s(): recursive clock topology detected, id %d.\n",
			 __func__, entity_id);
184 185 186 187
		return -EINVAL;
	}

	/* first, see if the ID we're looking for is a clock source already */
188
	source = snd_usb_find_clock_source(chip->ctrl_intf, entity_id);
189 190 191
	if (source) {
		entity_id = source->bClockID;
		if (validate && !uac_clock_source_is_valid(chip, entity_id)) {
192 193 194
			usb_audio_err(chip,
				"clock source %d is not valid, cannot use\n",
				entity_id);
195 196 197 198
			return -ENXIO;
		}
		return entity_id;
	}
199

200
	selector = snd_usb_find_clock_selector(chip->ctrl_intf, entity_id);
201
	if (selector) {
202
		int ret, i, cur;
203 204 205 206 207 208 209

		/* the entity ID we are looking for is a selector.
		 * find out what it currently selects */
		ret = uac_clock_selector_get_val(chip, selector->bClockID);
		if (ret < 0)
			return ret;

210 211
		/* Selector values are one-based */

212
		if (ret > selector->bNrInPins || ret < 1) {
213
			usb_audio_err(chip,
214 215 216 217 218 219
				"%s(): selector reported illegal value, id %d, ret %d\n",
				__func__, selector->bClockID, ret);

			return -EINVAL;
		}

220 221
		cur = ret;
		ret = __uac_clock_find_source(chip, selector->baCSourceID[ret - 1],
222
					       visited, validate);
223
		if (!validate || ret > 0 || !chip->autoclock)
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
			return ret;

		/* The current clock source is invalid, try others. */
		for (i = 1; i <= selector->bNrInPins; i++) {
			int err;

			if (i == cur)
				continue;

			ret = __uac_clock_find_source(chip, selector->baCSourceID[i - 1],
				visited, true);
			if (ret < 0)
				continue;

			err = uac_clock_selector_set_val(chip, entity_id, i);
			if (err < 0)
				continue;

242 243 244
			usb_audio_info(chip,
				 "found and selected valid clock source %d\n",
				 ret);
245 246 247 248
			return ret;
		}

		return -ENXIO;
249 250 251
	}

	/* FIXME: multipliers only act as pass-thru element for now */
252
	multiplier = snd_usb_find_clock_multiplier(chip->ctrl_intf, entity_id);
253
	if (multiplier)
254
		return __uac_clock_find_source(chip, multiplier->bCSourceID,
255
						visited, validate);
256 257 258 259

	return -EINVAL;
}

260 261 262 263 264 265 266 267 268 269 270
/*
 * For all kinds of sample rate settings and other device queries,
 * the clock source (end-leaf) must be used. However, clock selectors,
 * clock multipliers and sample rate converters may be specified as
 * clock source input to terminal. This functions walks the clock path
 * to its end and tries to find the source.
 *
 * The 'visited' bitfield is used internally to detect recursive loops.
 *
 * Returns the clock source UnitID (>=0) on success, or an error.
 */
271 272
int snd_usb_clock_find_source(struct snd_usb_audio *chip, int entity_id,
			      bool validate)
273 274 275
{
	DECLARE_BITMAP(visited, 256);
	memset(visited, 0, sizeof(visited));
276
	return __uac_clock_find_source(chip, entity_id, visited, validate);
277 278 279 280 281 282 283 284 285 286 287
}

static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface,
			      struct usb_host_interface *alts,
			      struct audioformat *fmt, int rate)
{
	struct usb_device *dev = chip->dev;
	unsigned int ep;
	unsigned char data[3];
	int err, crate;

288 289
	if (get_iface_desc(alts)->bNumEndpoints < 1)
		return -EINVAL;
290 291 292
	ep = get_endpoint(alts, 0)->bEndpointAddress;

	/* if endpoint doesn't have sampling rate control, bail out */
293
	if (!(fmt->attributes & UAC_EP_CS_ATTR_SAMPLE_RATE))
294 295 296 297 298 299 300 301
		return 0;

	data[0] = rate;
	data[1] = rate >> 8;
	data[2] = rate >> 16;
	if ((err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
				   USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_OUT,
				   UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep,
302
				   data, sizeof(data))) < 0) {
303 304
		dev_err(&dev->dev, "%d:%d: cannot set freq %d to ep %#x\n",
			iface, fmt->altsetting, rate, ep);
305 306 307
		return err;
	}

308 309 310 311
	/* Don't check the sample rate for devices which we know don't
	 * support reading */
	if (snd_usb_get_sample_rate_quirk(chip))
		return 0;
312 313 314
	/* the firmware is likely buggy, don't repeat to fail too many times */
	if (chip->sample_rate_read_error > 2)
		return 0;
315

316 317 318
	if ((err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC_GET_CUR,
				   USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_IN,
				   UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep,
319
				   data, sizeof(data))) < 0) {
320 321
		dev_err(&dev->dev, "%d:%d: cannot get freq at ep %#x\n",
			iface, fmt->altsetting, ep);
322
		chip->sample_rate_read_error++;
323 324 325 326 327
		return 0; /* some devices don't support reading */
	}

	crate = data[0] | (data[1] << 8) | (data[2] << 16);
	if (crate != rate) {
328
		dev_warn(&dev->dev, "current rate %d is different from the runtime rate %d\n", crate, rate);
329 330 331 332 333 334
		// runtime->rate = crate;
	}

	return 0;
}

335 336 337 338
static int get_sample_rate_v2(struct snd_usb_audio *chip, int iface,
			      int altsetting, int clock)
{
	struct usb_device *dev = chip->dev;
339
	__le32 data;
340 341 342 343 344 345
	int err;

	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR,
			      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
			      UAC2_CS_CONTROL_SAM_FREQ << 8,
			      snd_usb_ctrl_intf(chip) | (clock << 8),
346
			      &data, sizeof(data));
347
	if (err < 0) {
348 349
		dev_warn(&dev->dev, "%d:%d: cannot get freq (v2): err %d\n",
			 iface, altsetting, err);
350 351 352
		return 0;
	}

353
	return le32_to_cpu(data);
354 355
}

356 357 358 359 360
static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
			      struct usb_host_interface *alts,
			      struct audioformat *fmt, int rate)
{
	struct usb_device *dev = chip->dev;
361
	__le32 data;
362
	int err, cur_rate, prev_rate;
363
	int clock;
364 365
	bool writeable;
	struct uac_clock_source_descriptor *cs_desc;
366

367
	clock = snd_usb_clock_find_source(chip, fmt->clock, true);
368 369 370
	if (clock < 0)
		return clock;

371
	prev_rate = get_sample_rate_v2(chip, iface, fmt->altsetting, clock);
372 373
	if (prev_rate == rate)
		return 0;
374

375 376 377 378 379 380 381 382 383 384
	cs_desc = snd_usb_find_clock_source(chip->ctrl_intf, clock);
	writeable = uac2_control_is_writeable(cs_desc->bmControls, UAC2_CS_CONTROL_SAM_FREQ - 1);
	if (writeable) {
		data = cpu_to_le32(rate);
		err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR,
				      USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
				      UAC2_CS_CONTROL_SAM_FREQ << 8,
				      snd_usb_ctrl_intf(chip) | (clock << 8),
				      &data, sizeof(data));
		if (err < 0) {
385 386 387
			usb_audio_err(chip,
				"%d:%d: cannot set freq %d (v2): err %d\n",
				iface, fmt->altsetting, rate, err);
388 389
			return err;
		}
390

391 392 393 394
		cur_rate = get_sample_rate_v2(chip, iface, fmt->altsetting, clock);
	} else {
		cur_rate = prev_rate;
	}
395

396
	if (cur_rate != rate) {
397
		if (!writeable) {
398 399 400
			usb_audio_warn(chip,
				 "%d:%d: freq mismatch (RO clock): req %d, clock runs @%d\n",
				 iface, fmt->altsetting, rate, cur_rate);
401 402
			return -ENXIO;
		}
403 404 405
		usb_audio_dbg(chip,
			"current rate %d is different from the runtime rate %d\n",
			cur_rate, rate);
406 407 408 409 410 411
	}

	/* Some devices doesn't respond to sample rate changes while the
	 * interface is active. */
	if (rate != prev_rate) {
		usb_set_interface(dev, iface, 0);
412
		snd_usb_set_interface_quirk(dev);
413
		usb_set_interface(dev, iface, fmt->altsetting);
414
		snd_usb_set_interface_quirk(dev);
415
	}
416 417 418 419 420 421 422 423

	return 0;
}

int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface,
			     struct usb_host_interface *alts,
			     struct audioformat *fmt, int rate)
{
424
	switch (fmt->protocol) {
425
	case UAC_VERSION_1:
426
	default:
427 428 429 430 431 432 433
		return set_sample_rate_v1(chip, iface, alts, fmt, rate);

	case UAC_VERSION_2:
		return set_sample_rate_v2(chip, iface, alts, fmt, rate);
	}
}