clock.c 11.5 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 288 289 290
}

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;

	ep = get_endpoint(alts, 0)->bEndpointAddress;

	/* if endpoint doesn't have sampling rate control, bail out */
291
	if (!(fmt->attributes & UAC_EP_CS_ATTR_SAMPLE_RATE))
292 293 294 295 296 297 298 299
		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,
300
				   data, sizeof(data))) < 0) {
301 302
		dev_err(&dev->dev, "%d:%d: cannot set freq %d to ep %#x\n",
			iface, fmt->altsetting, rate, ep);
303 304 305
		return err;
	}

306 307 308 309 310
	/* 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;

311 312 313
	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,
314
				   data, sizeof(data))) < 0) {
315 316
		dev_err(&dev->dev, "%d:%d: cannot get freq at ep %#x\n",
			iface, fmt->altsetting, ep);
317 318 319 320 321
		return 0; /* some devices don't support reading */
	}

	crate = data[0] | (data[1] << 8) | (data[2] << 16);
	if (crate != rate) {
322
		dev_warn(&dev->dev, "current rate %d is different from the runtime rate %d\n", crate, rate);
323 324 325 326 327 328
		// runtime->rate = crate;
	}

	return 0;
}

329 330 331 332
static int get_sample_rate_v2(struct snd_usb_audio *chip, int iface,
			      int altsetting, int clock)
{
	struct usb_device *dev = chip->dev;
333
	__le32 data;
334 335 336 337 338 339
	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),
340
			      &data, sizeof(data));
341
	if (err < 0) {
342 343
		dev_warn(&dev->dev, "%d:%d: cannot get freq (v2): err %d\n",
			 iface, altsetting, err);
344 345 346
		return 0;
	}

347
	return le32_to_cpu(data);
348 349
}

350 351 352 353 354
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;
355
	__le32 data;
356
	int err, cur_rate, prev_rate;
357
	int clock;
358 359
	bool writeable;
	struct uac_clock_source_descriptor *cs_desc;
360

361
	clock = snd_usb_clock_find_source(chip, fmt->clock, true);
362 363 364
	if (clock < 0)
		return clock;

365
	prev_rate = get_sample_rate_v2(chip, iface, fmt->altsetting, clock);
366 367
	if (prev_rate == rate)
		return 0;
368

369 370 371 372 373 374 375 376 377 378
	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) {
379 380 381
			usb_audio_err(chip,
				"%d:%d: cannot set freq %d (v2): err %d\n",
				iface, fmt->altsetting, rate, err);
382 383
			return err;
		}
384

385 386 387 388
		cur_rate = get_sample_rate_v2(chip, iface, fmt->altsetting, clock);
	} else {
		cur_rate = prev_rate;
	}
389

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

	/* Some devices doesn't respond to sample rate changes while the
	 * interface is active. */
	if (rate != prev_rate) {
		usb_set_interface(dev, iface, 0);
406
		snd_usb_set_interface_quirk(dev);
407
		usb_set_interface(dev, iface, fmt->altsetting);
408
		snd_usb_set_interface_quirk(dev);
409
	}
410 411 412 413 414 415 416 417

	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)
{
418
	switch (fmt->protocol) {
419
	case UAC_VERSION_1:
420
	default:
421 422 423 424 425 426 427
		return set_sample_rate_v1(chip, iface, alts, fmt, rate);

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