hda_codec.c 109.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Universal Interface for Intel High Definition Audio Codec
 *
 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
 *
 *
 *  This driver 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 driver 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
 */

22
#include <linux/mm.h>
L
Linus Torvalds 已提交
23 24 25
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/slab.h>
26
#include <linux/mutex.h>
27
#include <linux/module.h>
28
#include <linux/async.h>
29 30
#include <linux/pm.h>
#include <linux/pm_runtime.h>
L
Linus Torvalds 已提交
31 32 33
#include <sound/core.h>
#include "hda_codec.h"
#include <sound/asoundef.h>
34
#include <sound/tlv.h>
L
Linus Torvalds 已提交
35
#include <sound/initval.h>
36
#include <sound/jack.h>
L
Linus Torvalds 已提交
37
#include "hda_local.h"
38
#include "hda_beep.h"
39
#include "hda_jack.h"
40
#include <sound/hda_hwdep.h>
L
Linus Torvalds 已提交
41

42
#ifdef CONFIG_PM
43
#define codec_in_pm(codec)	atomic_read(&(codec)->core.in_pm)
44 45
#define hda_codec_is_power_on(codec) \
	(!pm_runtime_suspended(hda_codec_dev(codec)))
46
#else
47
#define codec_in_pm(codec)	0
48
#define hda_codec_is_power_on(codec)	1
49 50
#endif

51 52 53 54 55
#define codec_has_epss(codec) \
	((codec)->core.power_caps & AC_PWRST_EPSS)
#define codec_has_clkstop(codec) \
	((codec)->core.power_caps & AC_PWRST_CLKSTOP)

56
/*
57
 * Send and receive a verb - passed to exec_verb override for hdac_device
58
 */
59 60
static int codec_exec_verb(struct hdac_device *dev, unsigned int cmd,
			   unsigned int flags, unsigned int *res)
61
{
62
	struct hda_codec *codec = container_of(dev, struct hda_codec, core);
63
	struct hda_bus *bus = codec->bus;
64
	int err;
65

66 67 68
	if (cmd == ~0)
		return -1;

69
 again:
70
	snd_hda_power_up_pm(codec);
71
	mutex_lock(&bus->core.cmd_mutex);
72 73
	if (flags & HDA_RW_NO_RESPONSE_FALLBACK)
		bus->no_response_fallback = 1;
74 75
	err = snd_hdac_bus_exec_verb_unlocked(&bus->core, codec->core.addr,
					      cmd, res);
76
	bus->no_response_fallback = 0;
77
	mutex_unlock(&bus->core.cmd_mutex);
78
	snd_hda_power_down_pm(codec);
79
	if (!codec_in_pm(codec) && res && err == -EAGAIN) {
80
		if (bus->response_reset) {
81 82
			codec_dbg(codec,
				  "resetting BUS due to fatal communication error\n");
83
			snd_hda_bus_reset(bus);
84 85 86 87
		}
		goto again;
	}
	/* clear reset-flag when the communication gets recovered */
88
	if (!err || codec_in_pm(codec))
89
		bus->response_reset = 0;
90 91 92
	return err;
}

L
Linus Torvalds 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105
/**
 * snd_hda_sequence_write - sequence writes
 * @codec: the HDA codec
 * @seq: VERB array to send
 *
 * Send the commands sequentially from the given array.
 * The array must be terminated with NID=0.
 */
void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq)
{
	for (; seq->nid; seq++)
		snd_hda_codec_write(codec, seq->nid, 0, seq->verb, seq->param);
}
106
EXPORT_SYMBOL_GPL(snd_hda_sequence_write);
L
Linus Torvalds 已提交
107

108 109 110 111 112 113 114 115
/* connection list element */
struct hda_conn_list {
	struct list_head list;
	int len;
	hda_nid_t nid;
	hda_nid_t conns[0];
};

116
/* look up the cached results */
117 118
static struct hda_conn_list *
lookup_conn_list(struct hda_codec *codec, hda_nid_t nid)
119
{
120 121 122
	struct hda_conn_list *p;
	list_for_each_entry(p, &codec->conn_list, list) {
		if (p->nid == nid)
123 124 125 126
			return p;
	}
	return NULL;
}
127

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
static int add_conn_list(struct hda_codec *codec, hda_nid_t nid, int len,
			 const hda_nid_t *list)
{
	struct hda_conn_list *p;

	p = kmalloc(sizeof(*p) + len * sizeof(hda_nid_t), GFP_KERNEL);
	if (!p)
		return -ENOMEM;
	p->len = len;
	p->nid = nid;
	memcpy(p->conns, list, len * sizeof(hda_nid_t));
	list_add(&p->list, &codec->conn_list);
	return 0;
}

static void remove_conn_list(struct hda_codec *codec)
{
	while (!list_empty(&codec->conn_list)) {
		struct hda_conn_list *p;
		p = list_first_entry(&codec->conn_list, typeof(*p), list);
		list_del(&p->list);
		kfree(p);
	}
}

153 154 155
/* read the connection and add to the cache */
static int read_and_add_raw_conns(struct hda_codec *codec, hda_nid_t nid)
{
156 157
	hda_nid_t list[32];
	hda_nid_t *result = list;
158 159 160
	int len;

	len = snd_hda_get_raw_connections(codec, nid, list, ARRAY_SIZE(list));
161 162 163 164 165 166 167 168 169 170 171 172
	if (len == -ENOSPC) {
		len = snd_hda_get_num_raw_conns(codec, nid);
		result = kmalloc(sizeof(hda_nid_t) * len, GFP_KERNEL);
		if (!result)
			return -ENOMEM;
		len = snd_hda_get_raw_connections(codec, nid, result, len);
	}
	if (len >= 0)
		len = snd_hda_override_conn_list(codec, nid, len, result);
	if (result != list)
		kfree(result);
	return len;
173 174
}

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
/**
 * snd_hda_get_conn_list - get connection list
 * @codec: the HDA codec
 * @nid: NID to parse
 * @listp: the pointer to store NID list
 *
 * Parses the connection list of the given widget and stores the pointer
 * to the list of NIDs.
 *
 * Returns the number of connections, or a negative error code.
 *
 * Note that the returned pointer isn't protected against the list
 * modification.  If snd_hda_override_conn_list() might be called
 * concurrently, protect with a mutex appropriately.
 */
int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid,
			  const hda_nid_t **listp)
{
	bool added = false;

	for (;;) {
		int err;
		const struct hda_conn_list *p;

		/* if the connection-list is already cached, read it */
		p = lookup_conn_list(codec, nid);
		if (p) {
			if (listp)
				*listp = p->conns;
			return p->len;
		}
		if (snd_BUG_ON(added))
			return -EINVAL;

		err = read_and_add_raw_conns(codec, nid);
		if (err < 0)
			return err;
		added = true;
	}
}
215
EXPORT_SYMBOL_GPL(snd_hda_get_conn_list);
216

L
Linus Torvalds 已提交
217
/**
218
 * snd_hda_get_connections - copy connection list
L
Linus Torvalds 已提交
219 220
 * @codec: the HDA codec
 * @nid: NID to parse
221 222
 * @conn_list: connection list array; when NULL, checks only the size
 * @max_conns: max. number of connections to store
L
Linus Torvalds 已提交
223 224 225 226 227 228
 *
 * Parses the connection list of the given widget and stores the list
 * of NIDs.
 *
 * Returns the number of connections, or a negative error code.
 */
229 230
int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
			    hda_nid_t *conn_list, int max_conns)
231
{
232 233
	const hda_nid_t *list;
	int len = snd_hda_get_conn_list(codec, nid, &list);
234

235 236
	if (len > 0 && conn_list) {
		if (len > max_conns) {
237
			codec_err(codec, "Too many connections %d for NID 0x%x\n",
238 239 240
				   len, nid);
			return -EINVAL;
		}
241
		memcpy(conn_list, list, len * sizeof(hda_nid_t));
242 243
	}

244
	return len;
245
}
246
EXPORT_SYMBOL_GPL(snd_hda_get_connections);
247

248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
/**
 * snd_hda_override_conn_list - add/modify the connection-list to cache
 * @codec: the HDA codec
 * @nid: NID to parse
 * @len: number of connection list entries
 * @list: the list of connection entries
 *
 * Add or modify the given connection-list to the cache.  If the corresponding
 * cache already exists, invalidate it and append a new one.
 *
 * Returns zero or a negative error code.
 */
int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int len,
			       const hda_nid_t *list)
{
263
	struct hda_conn_list *p;
264

265 266 267 268 269
	p = lookup_conn_list(codec, nid);
	if (p) {
		list_del(&p->list);
		kfree(p);
	}
270

271
	return add_conn_list(codec, nid, len, list);
272
}
273
EXPORT_SYMBOL_GPL(snd_hda_override_conn_list);
274

275 276 277 278 279 280 281 282 283 284 285 286 287
/**
 * snd_hda_get_conn_index - get the connection index of the given NID
 * @codec: the HDA codec
 * @mux: NID containing the list
 * @nid: NID to select
 * @recursive: 1 when searching NID recursively, otherwise 0
 *
 * Parses the connection list of the widget @mux and checks whether the
 * widget @nid is present.  If it is, return the connection index.
 * Otherwise it returns -1.
 */
int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
			   hda_nid_t nid, int recursive)
288
{
289
	const hda_nid_t *conn;
290 291
	int i, nums;

292
	nums = snd_hda_get_conn_list(codec, mux, &conn);
293 294 295 296 297
	for (i = 0; i < nums; i++)
		if (conn[i] == nid)
			return i;
	if (!recursive)
		return -1;
298
	if (recursive > 10) {
299
		codec_dbg(codec, "too deep connection for 0x%x\n", nid);
300
		return -1;
301
	}
302
	recursive++;
303 304 305 306
	for (i = 0; i < nums; i++) {
		unsigned int type = get_wcaps_type(get_wcaps(codec, conn[i]));
		if (type == AC_WID_PIN || type == AC_WID_AUD_OUT)
			continue;
307 308
		if (snd_hda_get_conn_index(codec, conn[i], nid, recursive) >= 0)
			return i;
309
	}
310
	return -1;
311
}
312
EXPORT_SYMBOL_GPL(snd_hda_get_conn_index);
L
Linus Torvalds 已提交
313

314 315 316 317 318 319 320 321 322 323 324

/* return DEVLIST_LEN parameter of the given widget */
static unsigned int get_num_devices(struct hda_codec *codec, hda_nid_t nid)
{
	unsigned int wcaps = get_wcaps(codec, nid);
	unsigned int parm;

	if (!codec->dp_mst || !(wcaps & AC_WCAP_DIGITAL) ||
	    get_wcaps_type(wcaps) != AC_WID_PIN)
		return 0;

325
	parm = snd_hdac_read_parm_uncached(&codec->core, nid, AC_PAR_DEVLIST_LEN);
326
	if (parm == -1)
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
		parm = 0;
	return parm & AC_DEV_LIST_LEN_MASK;
}

/**
 * snd_hda_get_devices - copy device list without cache
 * @codec: the HDA codec
 * @nid: NID of the pin to parse
 * @dev_list: device list array
 * @max_devices: max. number of devices to store
 *
 * Copy the device list. This info is dynamic and so not cached.
 * Currently called only from hda_proc.c, so not exported.
 */
int snd_hda_get_devices(struct hda_codec *codec, hda_nid_t nid,
			u8 *dev_list, int max_devices)
{
	unsigned int parm;
	int i, dev_len, devices;

	parm = get_num_devices(codec, nid);
	if (!parm)	/* not multi-stream capable */
		return 0;

	dev_len = parm + 1;
	dev_len = dev_len < max_devices ? dev_len : max_devices;

	devices = 0;
	while (devices < dev_len) {
356 357 358
		if (snd_hdac_read(&codec->core, nid,
				  AC_VERB_GET_DEVICE_LIST, devices, &parm))
			break; /* error */
359 360 361 362 363 364 365 366 367 368 369 370

		for (i = 0; i < 8; i++) {
			dev_list[devices] = (u8)parm;
			parm >>= 4;
			devices++;
			if (devices >= dev_len)
				break;
		}
	}
	return devices;
}

371 372 373 374 375 376 377 378
/*
 * read widget caps for each widget and store in cache
 */
static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node)
{
	int i;
	hda_nid_t nid;

379
	codec->wcaps = kmalloc(codec->core.num_nodes * 4, GFP_KERNEL);
T
Takashi Iwai 已提交
380
	if (!codec->wcaps)
381
		return -ENOMEM;
382 383
	nid = codec->core.start_nid;
	for (i = 0; i < codec->core.num_nodes; i++, nid++)
384 385
		codec->wcaps[i] = snd_hdac_read_parm_uncached(&codec->core,
					nid, AC_PAR_AUDIO_WIDGET_CAP);
386 387 388
	return 0;
}

389 390 391
/* read all pin default configurations and save codec->init_pins */
static int read_pin_defaults(struct hda_codec *codec)
{
392
	hda_nid_t nid;
393

394
	for_each_hda_codec_node(nid, codec) {
395 396
		struct hda_pincfg *pin;
		unsigned int wcaps = get_wcaps(codec, nid);
397
		unsigned int wid_type = get_wcaps_type(wcaps);
398 399 400 401 402 403 404 405
		if (wid_type != AC_WID_PIN)
			continue;
		pin = snd_array_new(&codec->init_pins);
		if (!pin)
			return -ENOMEM;
		pin->nid = nid;
		pin->cfg = snd_hda_codec_read(codec, nid, 0,
					      AC_VERB_GET_CONFIG_DEFAULT, 0);
406 407 408
		pin->ctrl = snd_hda_codec_read(codec, nid, 0,
					       AC_VERB_GET_PIN_WIDGET_CONTROL,
					       0);
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
	}
	return 0;
}

/* look up the given pin config list and return the item matching with NID */
static struct hda_pincfg *look_up_pincfg(struct hda_codec *codec,
					 struct snd_array *array,
					 hda_nid_t nid)
{
	int i;
	for (i = 0; i < array->used; i++) {
		struct hda_pincfg *pin = snd_array_elem(array, i);
		if (pin->nid == nid)
			return pin;
	}
	return NULL;
}

/* set the current pin config value for the given NID.
 * the value is cached, and read via snd_hda_codec_get_pincfg()
 */
int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
		       hda_nid_t nid, unsigned int cfg)
{
	struct hda_pincfg *pin;

435 436 437 438 439
	/* the check below may be invalid when pins are added by a fixup
	 * dynamically (e.g. via snd_hda_codec_update_widgets()), so disabled
	 * for now
	 */
	/*
440 441
	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
		return -EINVAL;
442
	*/
443

444 445 446 447 448 449 450 451 452 453 454
	pin = look_up_pincfg(codec, list, nid);
	if (!pin) {
		pin = snd_array_new(list);
		if (!pin)
			return -ENOMEM;
		pin->nid = nid;
	}
	pin->cfg = cfg;
	return 0;
}

455 456 457 458 459 460 461 462 463 464
/**
 * snd_hda_codec_set_pincfg - Override a pin default configuration
 * @codec: the HDA codec
 * @nid: NID to set the pin config
 * @cfg: the pin default config value
 *
 * Override a pin default configuration value in the cache.
 * This value can be read by snd_hda_codec_get_pincfg() in a higher
 * priority than the real hardware value.
 */
465 466 467
int snd_hda_codec_set_pincfg(struct hda_codec *codec,
			     hda_nid_t nid, unsigned int cfg)
{
468
	return snd_hda_add_pincfg(codec, &codec->driver_pins, nid, cfg);
469
}
470
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pincfg);
471

472 473 474 475 476 477 478 479 480
/**
 * snd_hda_codec_get_pincfg - Obtain a pin-default configuration
 * @codec: the HDA codec
 * @nid: NID to get the pin config
 *
 * Get the current pin config value of the given pin NID.
 * If the pincfg value is cached or overridden via sysfs or driver,
 * returns the cached value.
 */
481 482 483 484
unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
{
	struct hda_pincfg *pin;

485
#ifdef CONFIG_SND_HDA_RECONFIG
486 487 488 489 490 491 492 493 494 495
	{
		unsigned int cfg = 0;
		mutex_lock(&codec->user_mutex);
		pin = look_up_pincfg(codec, &codec->user_pins, nid);
		if (pin)
			cfg = pin->cfg;
		mutex_unlock(&codec->user_mutex);
		if (cfg)
			return cfg;
	}
496
#endif
497 498 499
	pin = look_up_pincfg(codec, &codec->driver_pins, nid);
	if (pin)
		return pin->cfg;
500 501 502 503 504
	pin = look_up_pincfg(codec, &codec->init_pins, nid);
	if (pin)
		return pin->cfg;
	return 0;
}
505
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pincfg);
506

T
Takashi Iwai 已提交
507 508 509 510 511 512 513 514 515 516
/**
 * snd_hda_codec_set_pin_target - remember the current pinctl target value
 * @codec: the HDA codec
 * @nid: pin NID
 * @val: assigned pinctl value
 *
 * This function stores the given value to a pinctl target value in the
 * pincfg table.  This isn't always as same as the actually written value
 * but can be referred at any time via snd_hda_codec_get_pin_target().
 */
517 518 519 520 521 522 523 524 525 526 527
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
				 unsigned int val)
{
	struct hda_pincfg *pin;

	pin = look_up_pincfg(codec, &codec->init_pins, nid);
	if (!pin)
		return -EINVAL;
	pin->target = val;
	return 0;
}
528
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pin_target);
529

T
Takashi Iwai 已提交
530 531 532 533 534
/**
 * snd_hda_codec_get_pin_target - return the current pinctl target value
 * @codec: the HDA codec
 * @nid: pin NID
 */
535 536 537 538 539 540 541 542 543
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid)
{
	struct hda_pincfg *pin;

	pin = look_up_pincfg(codec, &codec->init_pins, nid);
	if (!pin)
		return 0;
	return pin->target;
}
544
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pin_target);
545

546 547 548 549 550 551 552 553 554 555
/**
 * snd_hda_shutup_pins - Shut up all pins
 * @codec: the HDA codec
 *
 * Clear all pin controls to shup up before suspend for avoiding click noise.
 * The controls aren't cached so that they can be resumed properly.
 */
void snd_hda_shutup_pins(struct hda_codec *codec)
{
	int i;
556 557 558 559 560
	/* don't shut up pins when unloading the driver; otherwise it breaks
	 * the default pin setup at the next load of the driver
	 */
	if (codec->bus->shutdown)
		return;
561 562 563 564 565 566
	for (i = 0; i < codec->init_pins.used; i++) {
		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
		/* use read here for syncing after issuing each verb */
		snd_hda_codec_read(codec, pin->nid, 0,
				   AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
	}
567
	codec->pins_shutup = 1;
568
}
569
EXPORT_SYMBOL_GPL(snd_hda_shutup_pins);
570

571
#ifdef CONFIG_PM
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587
/* Restore the pin controls cleared previously via snd_hda_shutup_pins() */
static void restore_shutup_pins(struct hda_codec *codec)
{
	int i;
	if (!codec->pins_shutup)
		return;
	if (codec->bus->shutdown)
		return;
	for (i = 0; i < codec->init_pins.used; i++) {
		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
		snd_hda_codec_write(codec, pin->nid, 0,
				    AC_VERB_SET_PIN_WIDGET_CONTROL,
				    pin->ctrl);
	}
	codec->pins_shutup = 0;
}
588
#endif
589

590 591 592 593 594 595 596
static void hda_jackpoll_work(struct work_struct *work)
{
	struct hda_codec *codec =
		container_of(work, struct hda_codec, jackpoll_work.work);

	snd_hda_jack_set_dirty_all(codec);
	snd_hda_jack_poll_all(codec);
597 598 599 600

	if (!codec->jackpoll_interval)
		return;

601 602
	schedule_delayed_work(&codec->jackpoll_work,
			      codec->jackpoll_interval);
603 604
}

605 606
/* release all pincfg lists */
static void free_init_pincfgs(struct hda_codec *codec)
607
{
608
	snd_array_free(&codec->driver_pins);
609
#ifdef CONFIG_SND_HDA_RECONFIG
610
	snd_array_free(&codec->user_pins);
611 612 613 614
#endif
	snd_array_free(&codec->init_pins);
}

615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
/*
 * audio-converter setup caches
 */
struct hda_cvt_setup {
	hda_nid_t nid;
	u8 stream_tag;
	u8 channel_id;
	u16 format_id;
	unsigned char active;	/* cvt is currently used */
	unsigned char dirty;	/* setups should be cleared */
};

/* get or create a cache entry for the given audio converter NID */
static struct hda_cvt_setup *
get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid)
{
	struct hda_cvt_setup *p;
	int i;

	for (i = 0; i < codec->cvt_setups.used; i++) {
		p = snd_array_elem(&codec->cvt_setups, i);
		if (p->nid == nid)
			return p;
	}
	p = snd_array_new(&codec->cvt_setups);
	if (p)
		p->nid = nid;
	return p;
}

645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
/*
 * PCM device
 */
static void release_pcm(struct kref *kref)
{
	struct hda_pcm *pcm = container_of(kref, struct hda_pcm, kref);

	if (pcm->pcm)
		snd_device_free(pcm->codec->card, pcm->pcm);
	clear_bit(pcm->device, pcm->codec->bus->pcm_dev_bits);
	kfree(pcm->name);
	kfree(pcm);
}

void snd_hda_codec_pcm_put(struct hda_pcm *pcm)
{
	kref_put(&pcm->kref, release_pcm);
}
EXPORT_SYMBOL_GPL(snd_hda_codec_pcm_put);

struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec,
				      const char *fmt, ...)
{
	struct hda_pcm *pcm;
	va_list args;

	pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
	if (!pcm)
		return NULL;

	pcm->codec = codec;
	kref_init(&pcm->kref);
677
	va_start(args, fmt);
678
	pcm->name = kvasprintf(GFP_KERNEL, fmt, args);
679
	va_end(args);
680 681 682 683 684 685 686 687 688 689
	if (!pcm->name) {
		kfree(pcm);
		return NULL;
	}

	list_add_tail(&pcm->list, &codec->pcm_list_head);
	return pcm;
}
EXPORT_SYMBOL_GPL(snd_hda_codec_pcm_new);

690 691 692
/*
 * codec destructor
 */
693 694 695 696 697 698
static void codec_release_pcms(struct hda_codec *codec)
{
	struct hda_pcm *pcm, *n;

	list_for_each_entry_safe(pcm, n, &codec->pcm_list_head, list) {
		list_del_init(&pcm->list);
699 700
		if (pcm->pcm)
			snd_device_disconnect(codec->card, pcm->pcm);
701 702 703 704
		snd_hda_codec_pcm_put(pcm);
	}
}

705 706
void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec)
{
707 708 709 710 711 712 713
	if (codec->registered) {
		/* pm_runtime_put() is called in snd_hdac_device_exit() */
		pm_runtime_get_noresume(hda_codec_dev(codec));
		pm_runtime_disable(hda_codec_dev(codec));
		codec->registered = 0;
	}

714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
	cancel_delayed_work_sync(&codec->jackpoll_work);
	if (!codec->in_freeing)
		snd_hda_ctls_clear(codec);
	codec_release_pcms(codec);
	snd_hda_detach_beep_device(codec);
	memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
	snd_hda_jack_tbl_clear(codec);
	codec->proc_widget_hook = NULL;
	codec->spec = NULL;

	/* free only driver_pins so that init_pins + user_pins are restored */
	snd_array_free(&codec->driver_pins);
	snd_array_free(&codec->cvt_setups);
	snd_array_free(&codec->spdif_out);
	snd_array_free(&codec->verbs);
	codec->preset = NULL;
	codec->slave_dig_outs = NULL;
	codec->spdif_status_reset = 0;
	snd_array_free(&codec->mixers);
	snd_array_free(&codec->nids);
	remove_conn_list(codec);
T
Takashi Iwai 已提交
735
	snd_hdac_regmap_exit(&codec->core);
736 737
}

738
static unsigned int hda_set_power_state(struct hda_codec *codec,
739 740
				unsigned int power_state);

741 742
/* also called from hda_bind.c */
void snd_hda_codec_register(struct hda_codec *codec)
743
{
744 745 746 747
	if (codec->registered)
		return;
	if (device_is_registered(hda_codec_dev(codec))) {
		snd_hda_register_beep_device(codec);
748
		snd_hdac_link_power(&codec->core, true);
749
		pm_runtime_enable(hda_codec_dev(codec));
750 751 752 753 754 755 756 757 758
		/* it was powered up in snd_hda_codec_new(), now all done */
		snd_hda_power_down(codec);
		codec->registered = 1;
	}
}

static int snd_hda_codec_dev_register(struct snd_device *device)
{
	snd_hda_codec_register(device->device_data);
759
	return 0;
760 761 762 763 764 765
}

static int snd_hda_codec_dev_disconnect(struct snd_device *device)
{
	struct hda_codec *codec = device->device_data;

766
	snd_hda_detach_beep_device(codec);
767 768 769
	return 0;
}

770 771
static int snd_hda_codec_dev_free(struct snd_device *device)
{
772 773 774
	struct hda_codec *codec = device->device_data;

	codec->in_freeing = 1;
T
Takashi Iwai 已提交
775
	snd_hdac_device_unregister(&codec->core);
776
	snd_hdac_link_power(&codec->core, false);
777
	put_device(hda_codec_dev(codec));
778 779 780
	return 0;
}

781 782
static void snd_hda_codec_dev_release(struct device *dev)
{
783 784 785
	struct hda_codec *codec = dev_to_hda_codec(dev);

	free_init_pincfgs(codec);
786
	snd_hdac_device_exit(&codec->core);
787 788 789 790
	snd_hda_sysfs_clear(codec);
	kfree(codec->modelname);
	kfree(codec->wcaps);
	kfree(codec);
791 792
}

L
Linus Torvalds 已提交
793 794 795 796 797 798 799 800
/**
 * snd_hda_codec_new - create a HDA codec
 * @bus: the bus to assign
 * @codec_addr: the codec address
 * @codecp: the pointer to store the generated codec
 *
 * Returns 0 if successful, or a negative error code.
 */
801 802
int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
		      unsigned int codec_addr, struct hda_codec **codecp)
L
Linus Torvalds 已提交
803 804
{
	struct hda_codec *codec;
805
	char component[31];
806
	hda_nid_t fg;
L
Linus Torvalds 已提交
807
	int err;
808
	static struct snd_device_ops dev_ops = {
809 810
		.dev_register = snd_hda_codec_dev_register,
		.dev_disconnect = snd_hda_codec_dev_disconnect,
811 812
		.dev_free = snd_hda_codec_dev_free,
	};
L
Linus Torvalds 已提交
813

814 815 816 817
	if (snd_BUG_ON(!bus))
		return -EINVAL;
	if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
		return -EINVAL;
L
Linus Torvalds 已提交
818

819
	codec = kzalloc(sizeof(*codec), GFP_KERNEL);
820
	if (!codec)
L
Linus Torvalds 已提交
821 822
		return -ENOMEM;

823 824 825 826 827 828 829
	sprintf(component, "hdaudioC%dD%d", card->number, codec_addr);
	err = snd_hdac_device_init(&codec->core, &bus->core, component,
				   codec_addr);
	if (err < 0) {
		kfree(codec);
		return err;
	}
830

831 832
	codec->core.dev.release = snd_hda_codec_dev_release;
	codec->core.type = HDA_DEV_LEGACY;
833
	codec->core.exec_verb = codec_exec_verb;
834

L
Linus Torvalds 已提交
835
	codec->bus = bus;
836
	codec->card = card;
L
Linus Torvalds 已提交
837
	codec->addr = codec_addr;
838
	mutex_init(&codec->spdif_mutex);
839
	mutex_init(&codec->control_mutex);
840 841
	snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32);
	snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32);
842
	snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16);
843
	snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16);
844
	snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8);
845
	snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16);
846
	snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16);
847
	snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8);
848
	INIT_LIST_HEAD(&codec->conn_list);
849
	INIT_LIST_HEAD(&codec->pcm_list_head);
850

851
	INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work);
852
	codec->depop_delay = -1;
853
	codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
L
Linus Torvalds 已提交
854

855
#ifdef CONFIG_PM
856
	codec->power_jiffies = jiffies;
857 858
#endif

859 860
	snd_hda_sysfs_init(codec);

861 862 863
	if (codec->bus->modelname) {
		codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL);
		if (!codec->modelname) {
H
Heloise NH 已提交
864
			err = -ENOMEM;
865
			goto error;
866 867 868
		}
	}

869
	fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
870
	err = read_widget_caps(codec, fg);
871
	if (err < 0)
872 873 874 875
		goto error;
	err = read_pin_defaults(codec);
	if (err < 0)
		goto error;
876

877
	/* power-up all before initialization */
878
	hda_set_power_state(codec, AC_PWRST_D0);
879

880 881 882 883
	snd_hda_codec_proc_new(codec);

	snd_hda_create_hwdep(codec);

884 885
	sprintf(component, "HDA:%08x,%08x,%08x", codec->core.vendor_id,
		codec->core.subsystem_id, codec->core.revision_id);
886
	snd_component_add(card, component);
887

888
	err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops);
889 890 891
	if (err < 0)
		goto error;

892 893 894
	if (codecp)
		*codecp = codec;
	return 0;
895 896

 error:
897
	put_device(hda_codec_dev(codec));
898
	return err;
899
}
900
EXPORT_SYMBOL_GPL(snd_hda_codec_new);
901

T
Takashi Iwai 已提交
902 903 904 905 906 907 908
/**
 * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
 * @codec: the HDA codec
 *
 * Forcibly refresh the all widget caps and the init pin configurations of
 * the given codec.
 */
909 910 911 912 913
int snd_hda_codec_update_widgets(struct hda_codec *codec)
{
	hda_nid_t fg;
	int err;

914
	err = snd_hdac_refresh_widget_sysfs(&codec->core);
915 916 917
	if (err < 0)
		return err;

918 919 920 921
	/* Assume the function group node does not change,
	 * only the widget nodes may change.
	 */
	kfree(codec->wcaps);
922
	fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
923
	err = read_widget_caps(codec, fg);
924
	if (err < 0)
925 926 927 928 929 930 931
		return err;

	snd_array_free(&codec->init_pins);
	err = read_pin_defaults(codec);

	return err;
}
932
EXPORT_SYMBOL_GPL(snd_hda_codec_update_widgets);
933

934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
/* update the stream-id if changed */
static void update_pcm_stream_id(struct hda_codec *codec,
				 struct hda_cvt_setup *p, hda_nid_t nid,
				 u32 stream_tag, int channel_id)
{
	unsigned int oldval, newval;

	if (p->stream_tag != stream_tag || p->channel_id != channel_id) {
		oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
		newval = (stream_tag << 4) | channel_id;
		if (oldval != newval)
			snd_hda_codec_write(codec, nid, 0,
					    AC_VERB_SET_CHANNEL_STREAMID,
					    newval);
		p->stream_tag = stream_tag;
		p->channel_id = channel_id;
	}
}

/* update the format-id if changed */
static void update_pcm_format(struct hda_codec *codec, struct hda_cvt_setup *p,
			      hda_nid_t nid, int format)
{
	unsigned int oldval;

	if (p->format_id != format) {
		oldval = snd_hda_codec_read(codec, nid, 0,
					    AC_VERB_GET_STREAM_FORMAT, 0);
		if (oldval != format) {
			msleep(1);
			snd_hda_codec_write(codec, nid, 0,
					    AC_VERB_SET_STREAM_FORMAT,
					    format);
		}
		p->format_id = format;
	}
}

L
Linus Torvalds 已提交
972 973 974 975 976 977 978 979
/**
 * snd_hda_codec_setup_stream - set up the codec for streaming
 * @codec: the CODEC to set up
 * @nid: the NID to set up
 * @stream_tag: stream tag to pass, it's between 0x1 and 0xf.
 * @channel_id: channel id to pass, zero based.
 * @format: stream format.
 */
T
Takashi Iwai 已提交
980 981
void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
				u32 stream_tag,
L
Linus Torvalds 已提交
982 983
				int channel_id, int format)
{
984
	struct hda_codec *c;
985
	struct hda_cvt_setup *p;
986
	int type;
987 988
	int i;

T
Takashi Iwai 已提交
989
	if (!nid)
990 991
		return;

992 993 994
	codec_dbg(codec,
		  "hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
		  nid, stream_tag, channel_id, format);
995
	p = get_hda_cvt_setup(codec, nid);
996
	if (!p)
997
		return;
998

999 1000
	if (codec->patch_ops.stream_pm)
		codec->patch_ops.stream_pm(codec, nid, true);
1001 1002 1003 1004 1005 1006
	if (codec->pcm_format_first)
		update_pcm_format(codec, p, nid, format);
	update_pcm_stream_id(codec, p, nid, stream_tag, channel_id);
	if (!codec->pcm_format_first)
		update_pcm_format(codec, p, nid, format);

1007 1008 1009 1010
	p->active = 1;
	p->dirty = 0;

	/* make other inactive cvts with the same stream-tag dirty */
1011
	type = get_wcaps_type(get_wcaps(codec, nid));
1012
	list_for_each_codec(c, codec->bus) {
1013 1014
		for (i = 0; i < c->cvt_setups.used; i++) {
			p = snd_array_elem(&c->cvt_setups, i);
1015
			if (!p->active && p->stream_tag == stream_tag &&
1016
			    get_wcaps_type(get_wcaps(c, p->nid)) == type)
1017 1018
				p->dirty = 1;
		}
1019
	}
L
Linus Torvalds 已提交
1020
}
1021
EXPORT_SYMBOL_GPL(snd_hda_codec_setup_stream);
L
Linus Torvalds 已提交
1022

1023 1024 1025
static void really_cleanup_stream(struct hda_codec *codec,
				  struct hda_cvt_setup *q);

1026
/**
1027
 * __snd_hda_codec_cleanup_stream - clean up the codec for closing
1028 1029
 * @codec: the CODEC to clean up
 * @nid: the NID to clean up
1030
 * @do_now: really clean up the stream instead of clearing the active flag
1031
 */
1032 1033
void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
				    int do_now)
1034
{
1035 1036
	struct hda_cvt_setup *p;

1037 1038 1039
	if (!nid)
		return;

1040 1041 1042
	if (codec->no_sticky_stream)
		do_now = 1;

1043
	codec_dbg(codec, "hda_codec_cleanup_stream: NID=0x%x\n", nid);
1044
	p = get_hda_cvt_setup(codec, nid);
1045
	if (p) {
1046 1047 1048 1049 1050 1051 1052 1053 1054
		/* here we just clear the active flag when do_now isn't set;
		 * actual clean-ups will be done later in
		 * purify_inactive_streams() called from snd_hda_codec_prpapre()
		 */
		if (do_now)
			really_cleanup_stream(codec, p);
		else
			p->active = 0;
	}
1055
}
1056
EXPORT_SYMBOL_GPL(__snd_hda_codec_cleanup_stream);
1057 1058 1059 1060 1061

static void really_cleanup_stream(struct hda_codec *codec,
				  struct hda_cvt_setup *q)
{
	hda_nid_t nid = q->nid;
1062 1063 1064 1065 1066
	if (q->stream_tag || q->channel_id)
		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0);
	if (q->format_id)
		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0
);
1067 1068
	memset(q, 0, sizeof(*q));
	q->nid = nid;
1069 1070
	if (codec->patch_ops.stream_pm)
		codec->patch_ops.stream_pm(codec, nid, false);
1071 1072 1073 1074 1075
}

/* clean up the all conflicting obsolete streams */
static void purify_inactive_streams(struct hda_codec *codec)
{
1076
	struct hda_codec *c;
1077 1078
	int i;

1079
	list_for_each_codec(c, codec->bus) {
1080 1081 1082 1083 1084 1085
		for (i = 0; i < c->cvt_setups.used; i++) {
			struct hda_cvt_setup *p;
			p = snd_array_elem(&c->cvt_setups, i);
			if (p->dirty)
				really_cleanup_stream(c, p);
		}
1086 1087 1088
	}
}

1089
#ifdef CONFIG_PM
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
/* clean up all streams; called from suspend */
static void hda_cleanup_all_streams(struct hda_codec *codec)
{
	int i;

	for (i = 0; i < codec->cvt_setups.used; i++) {
		struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i);
		if (p->stream_tag)
			really_cleanup_stream(codec, p);
	}
1100
}
1101
#endif
1102

L
Linus Torvalds 已提交
1103 1104 1105 1106
/*
 * amp access functions
 */

1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
/**
 * query_amp_caps - query AMP capabilities
 * @codec: the HD-auio codec
 * @nid: the NID to query
 * @direction: either #HDA_INPUT or #HDA_OUTPUT
 *
 * Query AMP capabilities for the given widget and direction.
 * Returns the obtained capability bits.
 *
 * When cap bits have been already read, this doesn't read again but
 * returns the cached value.
L
Linus Torvalds 已提交
1118
 */
1119
u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction)
L
Linus Torvalds 已提交
1120
{
1121 1122 1123 1124 1125
	if (!(get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD))
		nid = codec->core.afg;
	return snd_hda_param_read(codec, nid,
				  direction == HDA_OUTPUT ?
				  AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
L
Linus Torvalds 已提交
1126
}
1127
EXPORT_SYMBOL_GPL(query_amp_caps);
L
Linus Torvalds 已提交
1128

1129 1130 1131 1132 1133
/**
 * snd_hda_check_amp_caps - query AMP capabilities
 * @codec: the HD-audio codec
 * @nid: the NID to query
 * @dir: either #HDA_INPUT or #HDA_OUTPUT
1134
 * @bits: bit mask to check the result
1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
 *
 * Check whether the widget has the given amp capability for the direction.
 */
bool snd_hda_check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
			   int dir, unsigned int bits)
{
	if (!nid)
		return false;
	if (get_wcaps(codec, nid) & (1 << (dir + 1)))
		if (query_amp_caps(codec, nid, dir) & bits)
			return true;
	return false;
}
EXPORT_SYMBOL_GPL(snd_hda_check_amp_caps);

1150 1151 1152 1153
/**
 * snd_hda_override_amp_caps - Override the AMP capabilities
 * @codec: the CODEC to clean up
 * @nid: the NID to clean up
1154
 * @dir: either #HDA_INPUT or #HDA_OUTPUT
1155 1156 1157 1158 1159 1160 1161 1162
 * @caps: the capability bits to set
 *
 * Override the cached AMP caps bits value by the given one.
 * This function is useful if the driver needs to adjust the AMP ranges,
 * e.g. limit to 0dB, etc.
 *
 * Returns zero if successful or a negative error code.
 */
1163 1164 1165
int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
			      unsigned int caps)
{
1166
	unsigned int parm;
1167

1168 1169 1170 1171
	snd_hda_override_wcaps(codec, nid,
			       get_wcaps(codec, nid) | AC_WCAP_AMP_OVRD);
	parm = dir == HDA_OUTPUT ? AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP;
	return snd_hdac_override_parm(&codec->core, nid, parm, caps);
1172
}
1173
EXPORT_SYMBOL_GPL(snd_hda_override_amp_caps);
1174

1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
/**
 * snd_hda_codec_amp_update - update the AMP mono value
 * @codec: HD-audio codec
 * @nid: NID to read the AMP value
 * @ch: channel to update (0 or 1)
 * @dir: #HDA_INPUT or #HDA_OUTPUT
 * @idx: the index value (only for input direction)
 * @mask: bit mask to set
 * @val: the bits value to set
 *
 * Update the AMP values for the given channel, direction and index.
 */
int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid,
			     int ch, int dir, int idx, int mask, int val)
{
	unsigned int cmd = snd_hdac_regmap_encode_amp(nid, ch, dir, idx);

	/* enable fake mute if no h/w mute but min=mute */
	if ((query_amp_caps(codec, nid, dir) &
	     (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE)) == AC_AMPCAP_MIN_MUTE)
		cmd |= AC_AMP_FAKE_MUTE;
	return snd_hdac_regmap_update_raw(&codec->core, cmd, mask, val);
}
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_update);

1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210
/**
 * snd_hda_codec_amp_stereo - update the AMP stereo values
 * @codec: HD-audio codec
 * @nid: NID to read the AMP value
 * @direction: #HDA_INPUT or #HDA_OUTPUT
 * @idx: the index value (only for input direction)
 * @mask: bit mask to set
 * @val: the bits value to set
 *
 * Update the AMP values like snd_hda_codec_amp_update(), but for a
 * stereo widget with the same mask and value.
1211 1212 1213 1214 1215
 */
int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
			     int direction, int idx, int mask, int val)
{
	int ch, ret = 0;
1216 1217 1218

	if (snd_BUG_ON(mask & ~0xff))
		mask &= 0xff;
1219 1220 1221 1222 1223
	for (ch = 0; ch < 2; ch++)
		ret |= snd_hda_codec_amp_update(codec, nid, ch, direction,
						idx, mask, val);
	return ret;
}
1224
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_stereo);
1225

T
Takashi Iwai 已提交
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
/**
 * snd_hda_codec_amp_init - initialize the AMP value
 * @codec: the HDA codec
 * @nid: NID to read the AMP value
 * @ch: channel (left=0 or right=1)
 * @dir: #HDA_INPUT or #HDA_OUTPUT
 * @idx: the index value (only for input direction)
 * @mask: bit mask to set
 * @val: the bits value to set
 *
 * Works like snd_hda_codec_amp_update() but it writes the value only at
1237 1238 1239 1240 1241 1242
 * the first access.  If the amp was already initialized / updated beforehand,
 * this does nothing.
 */
int snd_hda_codec_amp_init(struct hda_codec *codec, hda_nid_t nid, int ch,
			   int dir, int idx, int mask, int val)
{
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252
	int orig;

	if (!codec->core.regmap)
		return -EINVAL;
	regcache_cache_only(codec->core.regmap, true);
	orig = snd_hda_codec_amp_read(codec, nid, ch, dir, idx);
	regcache_cache_only(codec->core.regmap, false);
	if (orig >= 0)
		return 0;
	return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, mask, val);
1253
}
1254
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init);
1255

T
Takashi Iwai 已提交
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
/**
 * snd_hda_codec_amp_init_stereo - initialize the stereo AMP value
 * @codec: the HDA codec
 * @nid: NID to read the AMP value
 * @dir: #HDA_INPUT or #HDA_OUTPUT
 * @idx: the index value (only for input direction)
 * @mask: bit mask to set
 * @val: the bits value to set
 *
 * Call snd_hda_codec_amp_init() for both stereo channels.
 */
1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278
int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
				  int dir, int idx, int mask, int val)
{
	int ch, ret = 0;

	if (snd_BUG_ON(mask & ~0xff))
		mask &= 0xff;
	for (ch = 0; ch < 2; ch++)
		ret |= snd_hda_codec_amp_init(codec, nid, ch, dir,
					      idx, mask, val);
	return ret;
}
1279
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init_stereo);
1280

1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
static u32 get_amp_max_value(struct hda_codec *codec, hda_nid_t nid, int dir,
			     unsigned int ofs)
{
	u32 caps = query_amp_caps(codec, nid, dir);
	/* get num steps */
	caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
	if (ofs < caps)
		caps -= ofs;
	return caps;
}

1292 1293
/**
 * snd_hda_mixer_amp_volume_info - Info callback for a standard AMP mixer
1294 1295
 * @kcontrol: referred ctl element
 * @uinfo: pointer to get/store the data
1296 1297 1298 1299
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
1300 1301
int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_info *uinfo)
L
Linus Torvalds 已提交
1302 1303 1304 1305 1306
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	u16 nid = get_amp_nid(kcontrol);
	u8 chs = get_amp_channels(kcontrol);
	int dir = get_amp_direction(kcontrol);
1307
	unsigned int ofs = get_amp_offset(kcontrol);
L
Linus Torvalds 已提交
1308

1309 1310 1311 1312 1313
	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
	uinfo->count = chs == 3 ? 2 : 1;
	uinfo->value.integer.min = 0;
	uinfo->value.integer.max = get_amp_max_value(codec, nid, dir, ofs);
	if (!uinfo->value.integer.max) {
1314 1315 1316
		codec_warn(codec,
			   "num_steps = 0 for NID=0x%x (ctl = %s)\n",
			   nid, kcontrol->id.name);
L
Linus Torvalds 已提交
1317 1318 1319 1320
		return -EINVAL;
	}
	return 0;
}
1321
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_info);
L
Linus Torvalds 已提交
1322

1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342

static inline unsigned int
read_amp_value(struct hda_codec *codec, hda_nid_t nid,
	       int ch, int dir, int idx, unsigned int ofs)
{
	unsigned int val;
	val = snd_hda_codec_amp_read(codec, nid, ch, dir, idx);
	val &= HDA_AMP_VOLMASK;
	if (val >= ofs)
		val -= ofs;
	else
		val = 0;
	return val;
}

static inline int
update_amp_value(struct hda_codec *codec, hda_nid_t nid,
		 int ch, int dir, int idx, unsigned int ofs,
		 unsigned int val)
{
1343 1344
	unsigned int maxval;

1345 1346
	if (val > 0)
		val += ofs;
1347 1348
	/* ofs = 0: raw max value */
	maxval = get_amp_max_value(codec, nid, dir, 0);
1349 1350
	if (val > maxval)
		val = maxval;
1351 1352
	return snd_hda_codec_amp_update(codec, nid, ch, dir, idx,
					HDA_AMP_VOLMASK, val);
1353 1354
}

1355 1356
/**
 * snd_hda_mixer_amp_volume_get - Get callback for a standard AMP mixer volume
1357 1358
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
1359 1360 1361 1362
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
1363 1364
int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
1365 1366 1367 1368 1369 1370
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = get_amp_nid(kcontrol);
	int chs = get_amp_channels(kcontrol);
	int dir = get_amp_direction(kcontrol);
	int idx = get_amp_index(kcontrol);
1371
	unsigned int ofs = get_amp_offset(kcontrol);
L
Linus Torvalds 已提交
1372 1373 1374
	long *valp = ucontrol->value.integer.value;

	if (chs & 1)
1375
		*valp++ = read_amp_value(codec, nid, 0, dir, idx, ofs);
L
Linus Torvalds 已提交
1376
	if (chs & 2)
1377
		*valp = read_amp_value(codec, nid, 1, dir, idx, ofs);
L
Linus Torvalds 已提交
1378 1379
	return 0;
}
1380
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_get);
L
Linus Torvalds 已提交
1381

1382 1383
/**
 * snd_hda_mixer_amp_volume_put - Put callback for a standard AMP mixer volume
1384 1385
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
1386 1387 1388 1389
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
1390 1391
int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
1392 1393 1394 1395 1396 1397
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = get_amp_nid(kcontrol);
	int chs = get_amp_channels(kcontrol);
	int dir = get_amp_direction(kcontrol);
	int idx = get_amp_index(kcontrol);
1398
	unsigned int ofs = get_amp_offset(kcontrol);
L
Linus Torvalds 已提交
1399 1400 1401
	long *valp = ucontrol->value.integer.value;
	int change = 0;

1402
	if (chs & 1) {
1403
		change = update_amp_value(codec, nid, 0, dir, idx, ofs, *valp);
1404 1405
		valp++;
	}
1406
	if (chs & 2)
1407
		change |= update_amp_value(codec, nid, 1, dir, idx, ofs, *valp);
L
Linus Torvalds 已提交
1408 1409
	return change;
}
1410
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_put);
L
Linus Torvalds 已提交
1411

1412 1413
/**
 * snd_hda_mixer_amp_volume_put - TLV callback for a standard AMP mixer volume
1414 1415 1416 1417
 * @kcontrol: ctl element
 * @op_flag: operation flag
 * @size: byte size of input TLV
 * @_tlv: TLV data
1418 1419 1420 1421
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
1422 1423 1424 1425 1426 1427
int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag,
			  unsigned int size, unsigned int __user *_tlv)
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = get_amp_nid(kcontrol);
	int dir = get_amp_direction(kcontrol);
1428
	unsigned int ofs = get_amp_offset(kcontrol);
1429
	bool min_mute = get_amp_min_mute(kcontrol);
1430 1431 1432 1433 1434
	u32 caps, val1, val2;

	if (size < 4 * sizeof(unsigned int))
		return -ENOMEM;
	caps = query_amp_caps(codec, nid, dir);
T
Takashi Iwai 已提交
1435 1436
	val2 = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT;
	val2 = (val2 + 1) * 25;
1437
	val1 = -((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT);
1438
	val1 += ofs;
1439
	val1 = ((int)val1) * ((int)val2);
1440
	if (min_mute || (caps & AC_AMPCAP_MIN_MUTE))
1441
		val2 |= TLV_DB_SCALE_MUTE;
1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
	if (put_user(SNDRV_CTL_TLVT_DB_SCALE, _tlv))
		return -EFAULT;
	if (put_user(2 * sizeof(unsigned int), _tlv + 1))
		return -EFAULT;
	if (put_user(val1, _tlv + 2))
		return -EFAULT;
	if (put_user(val2, _tlv + 3))
		return -EFAULT;
	return 0;
}
1452
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_tlv);
1453

1454 1455 1456 1457 1458 1459 1460 1461 1462 1463
/**
 * snd_hda_set_vmaster_tlv - Set TLV for a virtual master control
 * @codec: HD-audio codec
 * @nid: NID of a reference widget
 * @dir: #HDA_INPUT or #HDA_OUTPUT
 * @tlv: TLV data to be stored, at least 4 elements
 *
 * Set (static) TLV data for a virtual master volume using the AMP caps
 * obtained from the reference NID.
 * The volume range is recalculated as if the max volume is 0dB.
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
 */
void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
			     unsigned int *tlv)
{
	u32 caps;
	int nums, step;

	caps = query_amp_caps(codec, nid, dir);
	nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
	step = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT;
	step = (step + 1) * 25;
	tlv[0] = SNDRV_CTL_TLVT_DB_SCALE;
	tlv[1] = 2 * sizeof(unsigned int);
	tlv[2] = -nums * step;
	tlv[3] = step;
}
1480
EXPORT_SYMBOL_GPL(snd_hda_set_vmaster_tlv);
1481 1482

/* find a mixer control element with the given name */
1483
static struct snd_kcontrol *
1484
find_mixer_ctl(struct hda_codec *codec, const char *name, int dev, int idx)
1485 1486 1487 1488
{
	struct snd_ctl_elem_id id;
	memset(&id, 0, sizeof(id));
	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1489
	id.device = dev;
1490
	id.index = idx;
T
Takashi Iwai 已提交
1491 1492
	if (snd_BUG_ON(strlen(name) >= sizeof(id.name)))
		return NULL;
1493
	strcpy(id.name, name);
1494
	return snd_ctl_find_id(codec->card, &id);
1495 1496
}

1497 1498 1499 1500 1501 1502 1503
/**
 * snd_hda_find_mixer_ctl - Find a mixer control element with the given name
 * @codec: HD-audio codec
 * @name: ctl id name string
 *
 * Get the control element with the given id string and IFACE_MIXER.
 */
1504 1505 1506
struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
					    const char *name)
{
1507
	return find_mixer_ctl(codec, name, 0, 0);
1508
}
1509
EXPORT_SYMBOL_GPL(snd_hda_find_mixer_ctl);
1510

1511
static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name,
1512
				    int start_idx)
1513
{
1514 1515 1516 1517
	int i, idx;
	/* 16 ctlrs should be large enough */
	for (i = 0, idx = start_idx; i < 16; i++, idx++) {
		if (!find_mixer_ctl(codec, name, 0, idx))
1518 1519 1520 1521 1522
			return idx;
	}
	return -EBUSY;
}

1523
/**
1524
 * snd_hda_ctl_add - Add a control element and assign to the codec
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538
 * @codec: HD-audio codec
 * @nid: corresponding NID (optional)
 * @kctl: the control element to assign
 *
 * Add the given control element to an array inside the codec instance.
 * All control elements belonging to a codec are supposed to be added
 * by this function so that a proper clean-up works at the free or
 * reconfiguration time.
 *
 * If non-zero @nid is passed, the NID is assigned to the control element.
 * The assignment is shown in the codec proc file.
 *
 * snd_hda_ctl_add() checks the control subdev id field whether
 * #HDA_SUBDEV_NID_FLAG bit is set.  If set (and @nid is zero), the lower
1539 1540
 * bits value is taken as the NID to assign. The #HDA_NID_ITEM_AMP bit
 * specifies if kctl->private_value is a HDA amplifier value.
1541
 */
1542 1543
int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid,
		    struct snd_kcontrol *kctl)
T
Takashi Iwai 已提交
1544 1545
{
	int err;
1546
	unsigned short flags = 0;
1547
	struct hda_nid_item *item;
T
Takashi Iwai 已提交
1548

1549
	if (kctl->id.subdevice & HDA_SUBDEV_AMP_FLAG) {
1550
		flags |= HDA_NID_ITEM_AMP;
1551 1552 1553
		if (nid == 0)
			nid = get_amp_nid_(kctl->private_value);
	}
1554 1555
	if ((kctl->id.subdevice & HDA_SUBDEV_NID_FLAG) != 0 && nid == 0)
		nid = kctl->id.subdevice & 0xffff;
1556
	if (kctl->id.subdevice & (HDA_SUBDEV_NID_FLAG|HDA_SUBDEV_AMP_FLAG))
1557
		kctl->id.subdevice = 0;
1558
	err = snd_ctl_add(codec->card, kctl);
T
Takashi Iwai 已提交
1559 1560
	if (err < 0)
		return err;
1561 1562
	item = snd_array_new(&codec->mixers);
	if (!item)
T
Takashi Iwai 已提交
1563
		return -ENOMEM;
1564 1565
	item->kctl = kctl;
	item->nid = nid;
1566
	item->flags = flags;
T
Takashi Iwai 已提交
1567 1568
	return 0;
}
1569
EXPORT_SYMBOL_GPL(snd_hda_ctl_add);
T
Takashi Iwai 已提交
1570

1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
/**
 * snd_hda_add_nid - Assign a NID to a control element
 * @codec: HD-audio codec
 * @nid: corresponding NID (optional)
 * @kctl: the control element to assign
 * @index: index to kctl
 *
 * Add the given control element to an array inside the codec instance.
 * This function is used when #snd_hda_ctl_add cannot be used for 1:1
 * NID:KCTL mapping - for example "Capture Source" selector.
 */
int snd_hda_add_nid(struct hda_codec *codec, struct snd_kcontrol *kctl,
		    unsigned int index, hda_nid_t nid)
{
	struct hda_nid_item *item;

	if (nid > 0) {
		item = snd_array_new(&codec->nids);
		if (!item)
			return -ENOMEM;
		item->kctl = kctl;
		item->index = index;
		item->nid = nid;
		return 0;
	}
1596 1597
	codec_err(codec, "no NID for mapping control %s:%d:%d\n",
		  kctl->id.name, kctl->id.index, index);
1598 1599
	return -EINVAL;
}
1600
EXPORT_SYMBOL_GPL(snd_hda_add_nid);
1601

1602 1603 1604 1605
/**
 * snd_hda_ctls_clear - Clear all controls assigned to the given codec
 * @codec: HD-audio codec
 */
T
Takashi Iwai 已提交
1606 1607 1608
void snd_hda_ctls_clear(struct hda_codec *codec)
{
	int i;
1609
	struct hda_nid_item *items = codec->mixers.list;
T
Takashi Iwai 已提交
1610
	for (i = 0; i < codec->mixers.used; i++)
1611
		snd_ctl_remove(codec->card, items[i].kctl);
T
Takashi Iwai 已提交
1612
	snd_array_free(&codec->mixers);
1613
	snd_array_free(&codec->nids);
T
Takashi Iwai 已提交
1614 1615
}

T
Takashi Iwai 已提交
1616 1617 1618 1619
/**
 * snd_hda_lock_devices - pseudo device locking
 * @bus: the BUS
 *
1620 1621
 * toggle card->shutdown to allow/disallow the device access (as a hack)
 */
1622
int snd_hda_lock_devices(struct hda_bus *bus)
1623
{
1624 1625 1626
	struct snd_card *card = bus->card;
	struct hda_codec *codec;

1627
	spin_lock(&card->files_lock);
1628 1629
	if (card->shutdown)
		goto err_unlock;
1630
	card->shutdown = 1;
1631 1632 1633
	if (!list_empty(&card->ctl_files))
		goto err_clear;

1634
	list_for_each_codec(codec, bus) {
1635 1636
		struct hda_pcm *cpcm;
		list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
1637 1638 1639 1640 1641 1642 1643
			if (!cpcm->pcm)
				continue;
			if (cpcm->pcm->streams[0].substream_opened ||
			    cpcm->pcm->streams[1].substream_opened)
				goto err_clear;
		}
	}
1644 1645
	spin_unlock(&card->files_lock);
	return 0;
1646 1647 1648 1649 1650 1651

 err_clear:
	card->shutdown = 0;
 err_unlock:
	spin_unlock(&card->files_lock);
	return -EINVAL;
1652
}
1653
EXPORT_SYMBOL_GPL(snd_hda_lock_devices);
1654

T
Takashi Iwai 已提交
1655 1656 1657 1658
/**
 * snd_hda_unlock_devices - pseudo device unlocking
 * @bus: the BUS
 */
1659
void snd_hda_unlock_devices(struct hda_bus *bus)
1660
{
1661 1662
	struct snd_card *card = bus->card;

1663 1664 1665 1666
	spin_lock(&card->files_lock);
	card->shutdown = 0;
	spin_unlock(&card->files_lock);
}
1667
EXPORT_SYMBOL_GPL(snd_hda_unlock_devices);
1668

1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
/**
 * snd_hda_codec_reset - Clear all objects assigned to the codec
 * @codec: HD-audio codec
 *
 * This frees the all PCM and control elements assigned to the codec, and
 * clears the caches and restores the pin default configurations.
 *
 * When a device is being used, it returns -EBSY.  If successfully freed,
 * returns zero.
 */
1679 1680
int snd_hda_codec_reset(struct hda_codec *codec)
{
1681
	struct hda_bus *bus = codec->bus;
1682

1683
	if (snd_hda_lock_devices(bus) < 0)
1684 1685 1686
		return -EBUSY;

	/* OK, let it free */
T
Takashi Iwai 已提交
1687
	snd_hdac_device_unregister(&codec->core);
1688

1689
	/* allow device access again */
1690
	snd_hda_unlock_devices(bus);
1691
	return 0;
1692 1693
}

1694
typedef int (*map_slave_func_t)(struct hda_codec *, void *, struct snd_kcontrol *);
1695 1696 1697

/* apply the function to all matching slave ctls in the mixer list */
static int map_slaves(struct hda_codec *codec, const char * const *slaves,
1698
		      const char *suffix, map_slave_func_t func, void *data) 
1699 1700 1701 1702 1703 1704 1705 1706
{
	struct hda_nid_item *items;
	const char * const *s;
	int i, err;

	items = codec->mixers.list;
	for (i = 0; i < codec->mixers.used; i++) {
		struct snd_kcontrol *sctl = items[i].kctl;
1707
		if (!sctl || sctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER)
1708 1709
			continue;
		for (s = slaves; *s; s++) {
1710 1711 1712 1713 1714 1715 1716 1717
			char tmpname[sizeof(sctl->id.name)];
			const char *name = *s;
			if (suffix) {
				snprintf(tmpname, sizeof(tmpname), "%s %s",
					 name, suffix);
				name = tmpname;
			}
			if (!strcmp(sctl->id.name, name)) {
1718
				err = func(codec, data, sctl);
1719 1720 1721 1722 1723 1724 1725 1726 1727
				if (err)
					return err;
				break;
			}
		}
	}
	return 0;
}

1728 1729
static int check_slave_present(struct hda_codec *codec,
			       void *data, struct snd_kcontrol *sctl)
1730 1731 1732 1733
{
	return 1;
}

1734
/* guess the value corresponding to 0dB */
1735 1736
static int get_kctl_0dB_offset(struct hda_codec *codec,
			       struct snd_kcontrol *kctl, int *step_to_check)
1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750
{
	int _tlv[4];
	const int *tlv = NULL;
	int val = -1;

	if (kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
		/* FIXME: set_fs() hack for obtaining user-space TLV data */
		mm_segment_t fs = get_fs();
		set_fs(get_ds());
		if (!kctl->tlv.c(kctl, 0, sizeof(_tlv), _tlv))
			tlv = _tlv;
		set_fs(fs);
	} else if (kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_TLV_READ)
		tlv = kctl->tlv.p;
1751 1752 1753 1754 1755
	if (tlv && tlv[0] == SNDRV_CTL_TLVT_DB_SCALE) {
		int step = tlv[3];
		step &= ~TLV_DB_SCALE_MUTE;
		if (!step)
			return -1;
1756
		if (*step_to_check && *step_to_check != step) {
1757
			codec_err(codec, "Mismatching dB step for vmaster slave (%d!=%d)\n",
1758
-				   *step_to_check, step);
1759 1760 1761
			return -1;
		}
		*step_to_check = step;
1762 1763
		val = -tlv[2] / step;
	}
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
	return val;
}

/* call kctl->put with the given value(s) */
static int put_kctl_with_value(struct snd_kcontrol *kctl, int val)
{
	struct snd_ctl_elem_value *ucontrol;
	ucontrol = kzalloc(sizeof(*ucontrol), GFP_KERNEL);
	if (!ucontrol)
		return -ENOMEM;
	ucontrol->value.integer.value[0] = val;
	ucontrol->value.integer.value[1] = val;
	kctl->put(kctl, ucontrol);
	kfree(ucontrol);
	return 0;
}

/* initialize the slave volume with 0dB */
1782 1783
static int init_slave_0dB(struct hda_codec *codec,
			  void *data, struct snd_kcontrol *slave)
1784
{
1785
	int offset = get_kctl_0dB_offset(codec, slave, data);
1786 1787 1788 1789 1790 1791
	if (offset > 0)
		put_kctl_with_value(slave, offset);
	return 0;
}

/* unmute the slave */
1792 1793
static int init_slave_unmute(struct hda_codec *codec,
			     void *data, struct snd_kcontrol *slave)
1794 1795 1796 1797
{
	return put_kctl_with_value(slave, 1);
}

1798 1799 1800 1801 1802 1803
static int add_slave(struct hda_codec *codec,
		     void *data, struct snd_kcontrol *slave)
{
	return snd_ctl_add_slave(data, slave);
}

1804
/**
T
Takashi Iwai 已提交
1805
 * __snd_hda_add_vmaster - create a virtual master control and add slaves
1806 1807 1808 1809
 * @codec: HD-audio codec
 * @name: vmaster control name
 * @tlv: TLV data (optional)
 * @slaves: slave control names (optional)
1810
 * @suffix: suffix string to each slave name (optional)
1811
 * @init_slave_vol: initialize slaves to unmute/0dB
1812
 * @ctl_ret: store the vmaster kcontrol in return
1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
 *
 * Create a virtual master control with the given name.  The TLV data
 * must be either NULL or a valid data.
 *
 * @slaves is a NULL-terminated array of strings, each of which is a
 * slave control name.  All controls with these names are assigned to
 * the new virtual master control.
 *
 * This function returns zero if successful or a negative error code.
 */
1823
int __snd_hda_add_vmaster(struct hda_codec *codec, char *name,
1824
			unsigned int *tlv, const char * const *slaves,
1825 1826
			  const char *suffix, bool init_slave_vol,
			  struct snd_kcontrol **ctl_ret)
1827 1828 1829 1830
{
	struct snd_kcontrol *kctl;
	int err;

1831 1832 1833
	if (ctl_ret)
		*ctl_ret = NULL;

1834
	err = map_slaves(codec, slaves, suffix, check_slave_present, NULL);
1835
	if (err != 1) {
1836
		codec_dbg(codec, "No slave found for %s\n", name);
1837 1838
		return 0;
	}
1839 1840 1841
	kctl = snd_ctl_make_virtual_master(name, tlv);
	if (!kctl)
		return -ENOMEM;
1842
	err = snd_hda_ctl_add(codec, 0, kctl);
1843 1844
	if (err < 0)
		return err;
1845

1846
	err = map_slaves(codec, slaves, suffix, add_slave, kctl);
1847 1848
	if (err < 0)
		return err;
1849 1850 1851

	/* init with master mute & zero volume */
	put_kctl_with_value(kctl, 0);
1852 1853
	if (init_slave_vol) {
		int step = 0;
1854
		map_slaves(codec, slaves, suffix,
1855 1856
			   tlv ? init_slave_0dB : init_slave_unmute, &step);
	}
1857

1858 1859
	if (ctl_ret)
		*ctl_ret = kctl;
1860 1861
	return 0;
}
1862
EXPORT_SYMBOL_GPL(__snd_hda_add_vmaster);
1863

1864 1865 1866 1867 1868 1869 1870
/*
 * mute-LED control using vmaster
 */
static int vmaster_mute_mode_info(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_info *uinfo)
{
	static const char * const texts[] = {
1871
		"On", "Off", "Follow Master"
1872 1873
	};

T
Takashi Iwai 已提交
1874
	return snd_ctl_enum_info(uinfo, 1, 3, texts);
1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907
}

static int vmaster_mute_mode_get(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
{
	struct hda_vmaster_mute_hook *hook = snd_kcontrol_chip(kcontrol);
	ucontrol->value.enumerated.item[0] = hook->mute_mode;
	return 0;
}

static int vmaster_mute_mode_put(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
{
	struct hda_vmaster_mute_hook *hook = snd_kcontrol_chip(kcontrol);
	unsigned int old_mode = hook->mute_mode;

	hook->mute_mode = ucontrol->value.enumerated.item[0];
	if (hook->mute_mode > HDA_VMUTE_FOLLOW_MASTER)
		hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
	if (old_mode == hook->mute_mode)
		return 0;
	snd_hda_sync_vmaster_hook(hook);
	return 1;
}

static struct snd_kcontrol_new vmaster_mute_mode = {
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.name = "Mute-LED Mode",
	.info = vmaster_mute_mode_info,
	.get = vmaster_mute_mode_get,
	.put = vmaster_mute_mode_put,
};

1908 1909 1910 1911 1912 1913 1914 1915 1916 1917
/* meta hook to call each driver's vmaster hook */
static void vmaster_hook(void *private_data, int enabled)
{
	struct hda_vmaster_mute_hook *hook = private_data;

	if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
		enabled = hook->mute_mode;
	hook->hook(hook->codec, enabled);
}

T
Takashi Iwai 已提交
1918 1919 1920 1921 1922 1923 1924 1925 1926
/**
 * snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
 * @codec: the HDA codec
 * @hook: the vmaster hook object
 * @expose_enum_ctl: flag to create an enum ctl
 *
 * Add a mute-LED hook with the given vmaster switch kctl.
 * When @expose_enum_ctl is set, "Mute-LED Mode" control is automatically
 * created and associated with the given hook.
1927 1928
 */
int snd_hda_add_vmaster_hook(struct hda_codec *codec,
1929 1930
			     struct hda_vmaster_mute_hook *hook,
			     bool expose_enum_ctl)
1931 1932 1933 1934 1935 1936 1937
{
	struct snd_kcontrol *kctl;

	if (!hook->hook || !hook->sw_kctl)
		return 0;
	hook->codec = codec;
	hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
1938
	snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
1939 1940
	if (!expose_enum_ctl)
		return 0;
1941 1942 1943 1944 1945
	kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
	if (!kctl)
		return -ENOMEM;
	return snd_hda_ctl_add(codec, 0, kctl);
}
1946
EXPORT_SYMBOL_GPL(snd_hda_add_vmaster_hook);
1947

T
Takashi Iwai 已提交
1948 1949 1950 1951 1952 1953
/**
 * snd_hda_sync_vmaster_hook - Sync vmaster hook
 * @hook: the vmaster hook
 *
 * Call the hook with the current value for synchronization.
 * Should be called in init callback.
1954 1955 1956 1957 1958
 */
void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
{
	if (!hook->hook || !hook->codec)
		return;
1959 1960 1961 1962 1963
	/* don't call vmaster hook in the destructor since it might have
	 * been already destroyed
	 */
	if (hook->codec->bus->shutdown)
		return;
1964
	snd_ctl_sync_vmaster_hook(hook->sw_kctl);
1965
}
1966
EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
1967 1968


1969 1970
/**
 * snd_hda_mixer_amp_switch_info - Info callback for a standard AMP mixer switch
1971 1972
 * @kcontrol: referred ctl element
 * @uinfo: pointer to get/store the data
1973 1974 1975 1976
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
1977 1978
int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_info *uinfo)
L
Linus Torvalds 已提交
1979 1980 1981 1982 1983 1984 1985 1986 1987
{
	int chs = get_amp_channels(kcontrol);

	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
	uinfo->count = chs == 3 ? 2 : 1;
	uinfo->value.integer.min = 0;
	uinfo->value.integer.max = 1;
	return 0;
}
1988
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_info);
L
Linus Torvalds 已提交
1989

1990 1991
/**
 * snd_hda_mixer_amp_switch_get - Get callback for a standard AMP mixer switch
1992 1993
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
1994 1995 1996 1997
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
1998 1999
int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2000 2001 2002 2003 2004 2005 2006 2007 2008
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = get_amp_nid(kcontrol);
	int chs = get_amp_channels(kcontrol);
	int dir = get_amp_direction(kcontrol);
	int idx = get_amp_index(kcontrol);
	long *valp = ucontrol->value.integer.value;

	if (chs & 1)
T
Takashi Iwai 已提交
2009
		*valp++ = (snd_hda_codec_amp_read(codec, nid, 0, dir, idx) &
2010
			   HDA_AMP_MUTE) ? 0 : 1;
L
Linus Torvalds 已提交
2011
	if (chs & 2)
T
Takashi Iwai 已提交
2012
		*valp = (snd_hda_codec_amp_read(codec, nid, 1, dir, idx) &
2013
			 HDA_AMP_MUTE) ? 0 : 1;
L
Linus Torvalds 已提交
2014 2015
	return 0;
}
2016
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_get);
L
Linus Torvalds 已提交
2017

2018 2019
/**
 * snd_hda_mixer_amp_switch_put - Put callback for a standard AMP mixer switch
2020 2021
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
2022 2023 2024 2025
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
 */
T
Takashi Iwai 已提交
2026 2027
int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2028 2029 2030 2031 2032 2033 2034 2035 2036
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = get_amp_nid(kcontrol);
	int chs = get_amp_channels(kcontrol);
	int dir = get_amp_direction(kcontrol);
	int idx = get_amp_index(kcontrol);
	long *valp = ucontrol->value.integer.value;
	int change = 0;

2037
	if (chs & 1) {
2038 2039 2040
		change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx,
						  HDA_AMP_MUTE,
						  *valp ? 0 : HDA_AMP_MUTE);
2041 2042
		valp++;
	}
2043
	if (chs & 2)
2044 2045 2046
		change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx,
						   HDA_AMP_MUTE,
						   *valp ? 0 : HDA_AMP_MUTE);
2047
	hda_call_check_power_status(codec, nid);
L
Linus Torvalds 已提交
2048 2049
	return change;
}
2050
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_put);
L
Linus Torvalds 已提交
2051

T
Takashi Iwai 已提交
2052 2053 2054 2055 2056 2057 2058 2059 2060
/*
 * bound volume controls
 *
 * bind multiple volumes (# indices, from 0)
 */

#define AMP_VAL_IDX_SHIFT	19
#define AMP_VAL_IDX_MASK	(0x0f<<19)

2061 2062
/**
 * snd_hda_mixer_bind_switch_get - Get callback for a bound volume control
2063 2064
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
2065 2066 2067 2068
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_MUTE*() macros.
 */
T
Takashi Iwai 已提交
2069 2070
int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
T
Takashi Iwai 已提交
2071 2072 2073 2074 2075
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	unsigned long pval;
	int err;

2076
	mutex_lock(&codec->control_mutex);
T
Takashi Iwai 已提交
2077 2078 2079 2080
	pval = kcontrol->private_value;
	kcontrol->private_value = pval & ~AMP_VAL_IDX_MASK; /* index 0 */
	err = snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
	kcontrol->private_value = pval;
2081
	mutex_unlock(&codec->control_mutex);
T
Takashi Iwai 已提交
2082 2083
	return err;
}
2084
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_switch_get);
T
Takashi Iwai 已提交
2085

2086 2087
/**
 * snd_hda_mixer_bind_switch_put - Put callback for a bound volume control
2088 2089
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
2090 2091 2092 2093
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_MUTE*() macros.
 */
T
Takashi Iwai 已提交
2094 2095
int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
T
Takashi Iwai 已提交
2096 2097 2098 2099 2100
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	unsigned long pval;
	int i, indices, err = 0, change = 0;

2101
	mutex_lock(&codec->control_mutex);
T
Takashi Iwai 已提交
2102 2103 2104
	pval = kcontrol->private_value;
	indices = (pval & AMP_VAL_IDX_MASK) >> AMP_VAL_IDX_SHIFT;
	for (i = 0; i < indices; i++) {
T
Takashi Iwai 已提交
2105 2106
		kcontrol->private_value = (pval & ~AMP_VAL_IDX_MASK) |
			(i << AMP_VAL_IDX_SHIFT);
T
Takashi Iwai 已提交
2107 2108 2109 2110 2111 2112
		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
		if (err < 0)
			break;
		change |= err;
	}
	kcontrol->private_value = pval;
2113
	mutex_unlock(&codec->control_mutex);
T
Takashi Iwai 已提交
2114 2115
	return err < 0 ? err : change;
}
2116
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_switch_put);
T
Takashi Iwai 已提交
2117

2118 2119
/**
 * snd_hda_mixer_bind_ctls_info - Info callback for a generic bound control
2120 2121
 * @kcontrol: referred ctl element
 * @uinfo: pointer to get/store the data
2122 2123 2124
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros.
2125 2126 2127 2128 2129 2130 2131 2132
 */
int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol,
				 struct snd_ctl_elem_info *uinfo)
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	struct hda_bind_ctls *c;
	int err;

2133
	mutex_lock(&codec->control_mutex);
2134
	c = (struct hda_bind_ctls *)kcontrol->private_value;
2135 2136 2137
	kcontrol->private_value = *c->values;
	err = c->ops->info(kcontrol, uinfo);
	kcontrol->private_value = (long)c;
2138
	mutex_unlock(&codec->control_mutex);
2139 2140
	return err;
}
2141
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_ctls_info);
2142

2143 2144
/**
 * snd_hda_mixer_bind_ctls_get - Get callback for a generic bound control
2145 2146
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
2147 2148 2149 2150
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros.
 */
2151 2152 2153 2154 2155 2156 2157
int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	struct hda_bind_ctls *c;
	int err;

2158
	mutex_lock(&codec->control_mutex);
2159
	c = (struct hda_bind_ctls *)kcontrol->private_value;
2160 2161 2162
	kcontrol->private_value = *c->values;
	err = c->ops->get(kcontrol, ucontrol);
	kcontrol->private_value = (long)c;
2163
	mutex_unlock(&codec->control_mutex);
2164 2165
	return err;
}
2166
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_ctls_get);
2167

2168 2169
/**
 * snd_hda_mixer_bind_ctls_put - Put callback for a generic bound control
2170 2171
 * @kcontrol: ctl element
 * @ucontrol: pointer to get/store the data
2172 2173 2174 2175
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros.
 */
2176 2177 2178 2179 2180 2181 2182 2183
int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	struct hda_bind_ctls *c;
	unsigned long *vals;
	int err = 0, change = 0;

2184
	mutex_lock(&codec->control_mutex);
2185
	c = (struct hda_bind_ctls *)kcontrol->private_value;
2186 2187 2188 2189 2190 2191 2192 2193
	for (vals = c->values; *vals; vals++) {
		kcontrol->private_value = *vals;
		err = c->ops->put(kcontrol, ucontrol);
		if (err < 0)
			break;
		change |= err;
	}
	kcontrol->private_value = (long)c;
2194
	mutex_unlock(&codec->control_mutex);
2195 2196
	return err < 0 ? err : change;
}
2197
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_ctls_put);
2198

2199 2200
/**
 * snd_hda_mixer_bind_tlv - TLV callback for a generic bound control
2201 2202 2203 2204
 * @kcontrol: ctl element
 * @op_flag: operation flag
 * @size: byte size of input TLV
 * @tlv: TLV data
2205 2206 2207 2208
 *
 * The control element is supposed to have the private_value field
 * set up via HDA_BIND_VOL() macro.
 */
2209 2210 2211 2212 2213 2214 2215
int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag,
			   unsigned int size, unsigned int __user *tlv)
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	struct hda_bind_ctls *c;
	int err;

2216
	mutex_lock(&codec->control_mutex);
2217
	c = (struct hda_bind_ctls *)kcontrol->private_value;
2218 2219 2220
	kcontrol->private_value = *c->values;
	err = c->ops->tlv(kcontrol, op_flag, size, tlv);
	kcontrol->private_value = (long)c;
2221
	mutex_unlock(&codec->control_mutex);
2222 2223
	return err;
}
2224
EXPORT_SYMBOL_GPL(snd_hda_mixer_bind_tlv);
2225 2226 2227 2228 2229 2230 2231

struct hda_ctl_ops snd_hda_bind_vol = {
	.info = snd_hda_mixer_amp_volume_info,
	.get = snd_hda_mixer_amp_volume_get,
	.put = snd_hda_mixer_amp_volume_put,
	.tlv = snd_hda_mixer_amp_tlv
};
2232
EXPORT_SYMBOL_GPL(snd_hda_bind_vol);
2233 2234 2235 2236 2237 2238 2239

struct hda_ctl_ops snd_hda_bind_sw = {
	.info = snd_hda_mixer_amp_switch_info,
	.get = snd_hda_mixer_amp_switch_get,
	.put = snd_hda_mixer_amp_switch_put,
	.tlv = snd_hda_mixer_amp_tlv
};
2240
EXPORT_SYMBOL_GPL(snd_hda_bind_sw);
2241

L
Linus Torvalds 已提交
2242 2243 2244 2245
/*
 * SPDIF out controls
 */

T
Takashi Iwai 已提交
2246 2247
static int snd_hda_spdif_mask_info(struct snd_kcontrol *kcontrol,
				   struct snd_ctl_elem_info *uinfo)
L
Linus Torvalds 已提交
2248 2249 2250 2251 2252 2253
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
	uinfo->count = 1;
	return 0;
}

T
Takashi Iwai 已提交
2254 2255
static int snd_hda_spdif_cmask_get(struct snd_kcontrol *kcontrol,
				   struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2256 2257 2258 2259 2260 2261 2262 2263 2264 2265
{
	ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
					   IEC958_AES0_NONAUDIO |
					   IEC958_AES0_CON_EMPHASIS_5015 |
					   IEC958_AES0_CON_NOT_COPYRIGHT;
	ucontrol->value.iec958.status[1] = IEC958_AES1_CON_CATEGORY |
					   IEC958_AES1_CON_ORIGINAL;
	return 0;
}

T
Takashi Iwai 已提交
2266 2267
static int snd_hda_spdif_pmask_get(struct snd_kcontrol *kcontrol,
				   struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2268 2269 2270 2271 2272 2273 2274
{
	ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
					   IEC958_AES0_NONAUDIO |
					   IEC958_AES0_PRO_EMPHASIS_5015;
	return 0;
}

T
Takashi Iwai 已提交
2275 2276
static int snd_hda_spdif_default_get(struct snd_kcontrol *kcontrol,
				     struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2277 2278
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2279
	int idx = kcontrol->private_value;
2280
	struct hda_spdif_out *spdif;
L
Linus Torvalds 已提交
2281

2282 2283
	mutex_lock(&codec->spdif_mutex);
	spdif = snd_array_elem(&codec->spdif_out, idx);
2284 2285 2286 2287
	ucontrol->value.iec958.status[0] = spdif->status & 0xff;
	ucontrol->value.iec958.status[1] = (spdif->status >> 8) & 0xff;
	ucontrol->value.iec958.status[2] = (spdif->status >> 16) & 0xff;
	ucontrol->value.iec958.status[3] = (spdif->status >> 24) & 0xff;
2288
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300

	return 0;
}

/* convert from SPDIF status bits to HDA SPDIF bits
 * bit 0 (DigEn) is always set zero (to be filled later)
 */
static unsigned short convert_from_spdif_status(unsigned int sbits)
{
	unsigned short val = 0;

	if (sbits & IEC958_AES0_PROFESSIONAL)
T
Takashi Iwai 已提交
2301
		val |= AC_DIG1_PROFESSIONAL;
L
Linus Torvalds 已提交
2302
	if (sbits & IEC958_AES0_NONAUDIO)
T
Takashi Iwai 已提交
2303
		val |= AC_DIG1_NONAUDIO;
L
Linus Torvalds 已提交
2304
	if (sbits & IEC958_AES0_PROFESSIONAL) {
T
Takashi Iwai 已提交
2305 2306 2307
		if ((sbits & IEC958_AES0_PRO_EMPHASIS) ==
		    IEC958_AES0_PRO_EMPHASIS_5015)
			val |= AC_DIG1_EMPHASIS;
L
Linus Torvalds 已提交
2308
	} else {
T
Takashi Iwai 已提交
2309 2310 2311 2312 2313
		if ((sbits & IEC958_AES0_CON_EMPHASIS) ==
		    IEC958_AES0_CON_EMPHASIS_5015)
			val |= AC_DIG1_EMPHASIS;
		if (!(sbits & IEC958_AES0_CON_NOT_COPYRIGHT))
			val |= AC_DIG1_COPYRIGHT;
L
Linus Torvalds 已提交
2314
		if (sbits & (IEC958_AES1_CON_ORIGINAL << 8))
T
Takashi Iwai 已提交
2315
			val |= AC_DIG1_LEVEL;
L
Linus Torvalds 已提交
2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326
		val |= sbits & (IEC958_AES1_CON_CATEGORY << 8);
	}
	return val;
}

/* convert to SPDIF status bits from HDA SPDIF bits
 */
static unsigned int convert_to_spdif_status(unsigned short val)
{
	unsigned int sbits = 0;

T
Takashi Iwai 已提交
2327
	if (val & AC_DIG1_NONAUDIO)
L
Linus Torvalds 已提交
2328
		sbits |= IEC958_AES0_NONAUDIO;
T
Takashi Iwai 已提交
2329
	if (val & AC_DIG1_PROFESSIONAL)
L
Linus Torvalds 已提交
2330 2331
		sbits |= IEC958_AES0_PROFESSIONAL;
	if (sbits & IEC958_AES0_PROFESSIONAL) {
2332
		if (val & AC_DIG1_EMPHASIS)
L
Linus Torvalds 已提交
2333 2334
			sbits |= IEC958_AES0_PRO_EMPHASIS_5015;
	} else {
T
Takashi Iwai 已提交
2335
		if (val & AC_DIG1_EMPHASIS)
L
Linus Torvalds 已提交
2336
			sbits |= IEC958_AES0_CON_EMPHASIS_5015;
T
Takashi Iwai 已提交
2337
		if (!(val & AC_DIG1_COPYRIGHT))
L
Linus Torvalds 已提交
2338
			sbits |= IEC958_AES0_CON_NOT_COPYRIGHT;
T
Takashi Iwai 已提交
2339
		if (val & AC_DIG1_LEVEL)
L
Linus Torvalds 已提交
2340 2341 2342 2343 2344 2345
			sbits |= (IEC958_AES1_CON_ORIGINAL << 8);
		sbits |= val & (0x7f << 8);
	}
	return sbits;
}

2346 2347
/* set digital convert verbs both for the given NID and its slaves */
static void set_dig_out(struct hda_codec *codec, hda_nid_t nid,
2348
			int mask, int val)
2349
{
2350
	const hda_nid_t *d;
2351

2352 2353
	snd_hdac_regmap_update(&codec->core, nid, AC_VERB_SET_DIGI_CONVERT_1,
			       mask, val);
2354 2355 2356 2357
	d = codec->slave_dig_outs;
	if (!d)
		return;
	for (; *d; d++)
2358
		snd_hdac_regmap_update(&codec->core, *d,
2359
				       AC_VERB_SET_DIGI_CONVERT_1, mask, val);
2360 2361 2362 2363 2364
}

static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid,
				       int dig1, int dig2)
{
2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376
	unsigned int mask = 0;
	unsigned int val = 0;

	if (dig1 != -1) {
		mask |= 0xff;
		val = dig1;
	}
	if (dig2 != -1) {
		mask |= 0xff00;
		val |= dig2 << 8;
	}
	set_dig_out(codec, nid, mask, val);
2377 2378
}

T
Takashi Iwai 已提交
2379 2380
static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol,
				     struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2381 2382
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2383
	int idx = kcontrol->private_value;
2384 2385
	struct hda_spdif_out *spdif;
	hda_nid_t nid;
L
Linus Torvalds 已提交
2386 2387 2388
	unsigned short val;
	int change;

2389
	mutex_lock(&codec->spdif_mutex);
2390 2391
	spdif = snd_array_elem(&codec->spdif_out, idx);
	nid = spdif->nid;
2392
	spdif->status = ucontrol->value.iec958.status[0] |
L
Linus Torvalds 已提交
2393 2394 2395
		((unsigned int)ucontrol->value.iec958.status[1] << 8) |
		((unsigned int)ucontrol->value.iec958.status[2] << 16) |
		((unsigned int)ucontrol->value.iec958.status[3] << 24);
2396 2397 2398 2399
	val = convert_from_spdif_status(spdif->status);
	val |= spdif->ctls & 1;
	change = spdif->ctls != val;
	spdif->ctls = val;
2400
	if (change && nid != (u16)-1)
2401
		set_dig_out_convert(codec, nid, val & 0xff, (val >> 8) & 0xff);
2402
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2403 2404 2405
	return change;
}

2406
#define snd_hda_spdif_out_switch_info	snd_ctl_boolean_mono_info
L
Linus Torvalds 已提交
2407

T
Takashi Iwai 已提交
2408 2409
static int snd_hda_spdif_out_switch_get(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2410 2411
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2412
	int idx = kcontrol->private_value;
2413
	struct hda_spdif_out *spdif;
L
Linus Torvalds 已提交
2414

2415 2416
	mutex_lock(&codec->spdif_mutex);
	spdif = snd_array_elem(&codec->spdif_out, idx);
2417
	ucontrol->value.integer.value[0] = spdif->ctls & AC_DIG1_ENABLE;
2418
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2419 2420 2421
	return 0;
}

2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432
static inline void set_spdif_ctls(struct hda_codec *codec, hda_nid_t nid,
				  int dig1, int dig2)
{
	set_dig_out_convert(codec, nid, dig1, dig2);
	/* unmute amp switch (if any) */
	if ((get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) &&
	    (dig1 & AC_DIG1_ENABLE))
		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
					    HDA_AMP_MUTE, 0);
}

T
Takashi Iwai 已提交
2433 2434
static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2435 2436
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2437
	int idx = kcontrol->private_value;
2438 2439
	struct hda_spdif_out *spdif;
	hda_nid_t nid;
L
Linus Torvalds 已提交
2440 2441 2442
	unsigned short val;
	int change;

2443
	mutex_lock(&codec->spdif_mutex);
2444 2445
	spdif = snd_array_elem(&codec->spdif_out, idx);
	nid = spdif->nid;
2446
	val = spdif->ctls & ~AC_DIG1_ENABLE;
L
Linus Torvalds 已提交
2447
	if (ucontrol->value.integer.value[0])
T
Takashi Iwai 已提交
2448
		val |= AC_DIG1_ENABLE;
2449
	change = spdif->ctls != val;
2450 2451 2452
	spdif->ctls = val;
	if (change && nid != (u16)-1)
		set_spdif_ctls(codec, nid, val & 0xff, -1);
2453
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2454 2455 2456
	return change;
}

2457
static struct snd_kcontrol_new dig_mixes[] = {
L
Linus Torvalds 已提交
2458 2459 2460
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ,
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2461
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
L
Linus Torvalds 已提交
2462 2463 2464 2465 2466 2467
		.info = snd_hda_spdif_mask_info,
		.get = snd_hda_spdif_cmask_get,
	},
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ,
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2468
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PRO_MASK),
L
Linus Torvalds 已提交
2469 2470 2471 2472 2473
		.info = snd_hda_spdif_mask_info,
		.get = snd_hda_spdif_pmask_get,
	},
	{
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2474
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
L
Linus Torvalds 已提交
2475 2476 2477 2478 2479 2480
		.info = snd_hda_spdif_mask_info,
		.get = snd_hda_spdif_default_get,
		.put = snd_hda_spdif_default_put,
	},
	{
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2481
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
L
Linus Torvalds 已提交
2482 2483 2484 2485 2486 2487 2488 2489
		.info = snd_hda_spdif_out_switch_info,
		.get = snd_hda_spdif_out_switch_get,
		.put = snd_hda_spdif_out_switch_put,
	},
	{ } /* end */
};

/**
2490
 * snd_hda_create_dig_out_ctls - create Output SPDIF-related controls
L
Linus Torvalds 已提交
2491
 * @codec: the HDA codec
2492 2493 2494 2495 2496
 * @associated_nid: NID that new ctls associated with
 * @cvt_nid: converter NID
 * @type: HDA_PCM_TYPE_*
 * Creates controls related with the digital output.
 * Called from each patch supporting the digital out.
L
Linus Torvalds 已提交
2497 2498 2499
 *
 * Returns 0 if successful, or a negative error code.
 */
2500 2501 2502 2503
int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
				hda_nid_t associated_nid,
				hda_nid_t cvt_nid,
				int type)
L
Linus Torvalds 已提交
2504 2505
{
	int err;
2506 2507
	struct snd_kcontrol *kctl;
	struct snd_kcontrol_new *dig_mix;
2508
	int idx = 0;
2509
	int val = 0;
2510
	const int spdif_index = 16;
2511
	struct hda_spdif_out *spdif;
2512
	struct hda_bus *bus = codec->bus;
L
Linus Torvalds 已提交
2513

2514
	if (bus->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
2515
	    type == HDA_PCM_TYPE_SPDIF) {
2516 2517
		idx = spdif_index;
	} else if (bus->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
2518
		   type == HDA_PCM_TYPE_HDMI) {
2519 2520 2521 2522 2523 2524
		/* suppose a single SPDIF device */
		for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
			kctl = find_mixer_ctl(codec, dig_mix->name, 0, 0);
			if (!kctl)
				break;
			kctl->id.index = spdif_index;
2525
		}
2526
		bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
2527
	}
2528 2529
	if (!bus->primary_dig_out_type)
		bus->primary_dig_out_type = type;
2530

2531
	idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", idx);
2532
	if (idx < 0) {
2533
		codec_err(codec, "too many IEC958 outputs\n");
2534 2535
		return -EBUSY;
	}
2536
	spdif = snd_array_new(&codec->spdif_out);
2537 2538
	if (!spdif)
		return -ENOMEM;
L
Linus Torvalds 已提交
2539 2540
	for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
		kctl = snd_ctl_new1(dig_mix, codec);
2541 2542
		if (!kctl)
			return -ENOMEM;
2543
		kctl->id.index = idx;
2544
		kctl->private_value = codec->spdif_out.used - 1;
2545
		err = snd_hda_ctl_add(codec, associated_nid, kctl);
T
Takashi Iwai 已提交
2546
		if (err < 0)
L
Linus Torvalds 已提交
2547 2548
			return err;
	}
2549
	spdif->nid = cvt_nid;
2550 2551 2552
	snd_hdac_regmap_read(&codec->core, cvt_nid,
			     AC_VERB_GET_DIGI_CONVERT_1, &val);
	spdif->ctls = val;
2553
	spdif->status = convert_to_spdif_status(spdif->ctls);
L
Linus Torvalds 已提交
2554 2555
	return 0;
}
2556
EXPORT_SYMBOL_GPL(snd_hda_create_dig_out_ctls);
L
Linus Torvalds 已提交
2557

T
Takashi Iwai 已提交
2558 2559 2560 2561 2562
/**
 * snd_hda_spdif_out_of_nid - get the hda_spdif_out entry from the given NID
 * @codec: the HDA codec
 * @nid: widget NID
 *
2563 2564
 * call within spdif_mutex lock
 */
2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576
struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
					       hda_nid_t nid)
{
	int i;
	for (i = 0; i < codec->spdif_out.used; i++) {
		struct hda_spdif_out *spdif =
				snd_array_elem(&codec->spdif_out, i);
		if (spdif->nid == nid)
			return spdif;
	}
	return NULL;
}
2577
EXPORT_SYMBOL_GPL(snd_hda_spdif_out_of_nid);
2578

T
Takashi Iwai 已提交
2579 2580 2581 2582 2583 2584 2585
/**
 * snd_hda_spdif_ctls_unassign - Unassign the given SPDIF ctl
 * @codec: the HDA codec
 * @idx: the SPDIF ctl index
 *
 * Unassign the widget from the given SPDIF control.
 */
2586 2587
void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx)
{
2588
	struct hda_spdif_out *spdif;
2589 2590

	mutex_lock(&codec->spdif_mutex);
2591
	spdif = snd_array_elem(&codec->spdif_out, idx);
2592 2593 2594
	spdif->nid = (u16)-1;
	mutex_unlock(&codec->spdif_mutex);
}
2595
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_unassign);
2596

T
Takashi Iwai 已提交
2597 2598 2599 2600 2601 2602 2603 2604
/**
 * snd_hda_spdif_ctls_assign - Assign the SPDIF controls to the given NID
 * @codec: the HDA codec
 * @idx: the SPDIF ctl idx
 * @nid: widget NID
 *
 * Assign the widget to the SPDIF control with the given index.
 */
2605 2606
void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid)
{
2607
	struct hda_spdif_out *spdif;
2608 2609 2610
	unsigned short val;

	mutex_lock(&codec->spdif_mutex);
2611
	spdif = snd_array_elem(&codec->spdif_out, idx);
2612 2613 2614 2615 2616 2617 2618
	if (spdif->nid != nid) {
		spdif->nid = nid;
		val = spdif->ctls;
		set_spdif_ctls(codec, nid, val & 0xff, (val >> 8) & 0xff);
	}
	mutex_unlock(&codec->spdif_mutex);
}
2619
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_assign);
2620

2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647
/*
 * SPDIF sharing with analog output
 */
static int spdif_share_sw_get(struct snd_kcontrol *kcontrol,
			      struct snd_ctl_elem_value *ucontrol)
{
	struct hda_multi_out *mout = snd_kcontrol_chip(kcontrol);
	ucontrol->value.integer.value[0] = mout->share_spdif;
	return 0;
}

static int spdif_share_sw_put(struct snd_kcontrol *kcontrol,
			      struct snd_ctl_elem_value *ucontrol)
{
	struct hda_multi_out *mout = snd_kcontrol_chip(kcontrol);
	mout->share_spdif = !!ucontrol->value.integer.value[0];
	return 0;
}

static struct snd_kcontrol_new spdif_share_sw = {
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.name = "IEC958 Default PCM Playback Switch",
	.info = snd_ctl_boolean_mono_info,
	.get = spdif_share_sw_get,
	.put = spdif_share_sw_put,
};

2648 2649 2650 2651 2652
/**
 * snd_hda_create_spdif_share_sw - create Default PCM switch
 * @codec: the HDA codec
 * @mout: multi-out instance
 */
2653 2654 2655
int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
				  struct hda_multi_out *mout)
{
2656 2657
	struct snd_kcontrol *kctl;

2658 2659
	if (!mout->dig_out_nid)
		return 0;
2660 2661 2662 2663

	kctl = snd_ctl_new1(&spdif_share_sw, mout);
	if (!kctl)
		return -ENOMEM;
2664
	/* ATTENTION: here mout is passed as private_data, instead of codec */
2665
	return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl);
2666
}
2667
EXPORT_SYMBOL_GPL(snd_hda_create_spdif_share_sw);
2668

L
Linus Torvalds 已提交
2669 2670 2671 2672 2673 2674
/*
 * SPDIF input
 */

#define snd_hda_spdif_in_switch_info	snd_hda_spdif_out_switch_info

T
Takashi Iwai 已提交
2675 2676
static int snd_hda_spdif_in_switch_get(struct snd_kcontrol *kcontrol,
				       struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2677 2678 2679 2680 2681 2682 2683
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);

	ucontrol->value.integer.value[0] = codec->spdif_in_enable;
	return 0;
}

T
Takashi Iwai 已提交
2684 2685
static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol,
				       struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2686 2687 2688 2689 2690 2691
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = kcontrol->private_value;
	unsigned int val = !!ucontrol->value.integer.value[0];
	int change;

2692
	mutex_lock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2693
	change = codec->spdif_in_enable != val;
2694
	if (change) {
L
Linus Torvalds 已提交
2695
		codec->spdif_in_enable = val;
2696 2697
		snd_hdac_regmap_write(&codec->core, nid,
				      AC_VERB_SET_DIGI_CONVERT_1, val);
L
Linus Torvalds 已提交
2698
	}
2699
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
2700 2701 2702
	return change;
}

T
Takashi Iwai 已提交
2703 2704
static int snd_hda_spdif_in_status_get(struct snd_kcontrol *kcontrol,
				       struct snd_ctl_elem_value *ucontrol)
L
Linus Torvalds 已提交
2705 2706 2707
{
	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
	hda_nid_t nid = kcontrol->private_value;
2708
	unsigned int val;
L
Linus Torvalds 已提交
2709 2710
	unsigned int sbits;

2711 2712
	snd_hdac_regmap_read(&codec->core, nid,
			     AC_VERB_GET_DIGI_CONVERT_1, &val);
L
Linus Torvalds 已提交
2713 2714 2715 2716 2717 2718 2719 2720
	sbits = convert_to_spdif_status(val);
	ucontrol->value.iec958.status[0] = sbits;
	ucontrol->value.iec958.status[1] = sbits >> 8;
	ucontrol->value.iec958.status[2] = sbits >> 16;
	ucontrol->value.iec958.status[3] = sbits >> 24;
	return 0;
}

2721
static struct snd_kcontrol_new dig_in_ctls[] = {
L
Linus Torvalds 已提交
2722 2723
	{
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2724
		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, SWITCH),
L
Linus Torvalds 已提交
2725 2726 2727 2728 2729 2730 2731
		.info = snd_hda_spdif_in_switch_info,
		.get = snd_hda_spdif_in_switch_get,
		.put = snd_hda_spdif_in_switch_put,
	},
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ,
		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2732
		.name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
L
Linus Torvalds 已提交
2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748
		.info = snd_hda_spdif_mask_info,
		.get = snd_hda_spdif_in_status_get,
	},
	{ } /* end */
};

/**
 * snd_hda_create_spdif_in_ctls - create Input SPDIF-related controls
 * @codec: the HDA codec
 * @nid: audio in widget NID
 *
 * Creates controls related with the SPDIF input.
 * Called from each patch supporting the SPDIF in.
 *
 * Returns 0 if successful, or a negative error code.
 */
2749
int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid)
L
Linus Torvalds 已提交
2750 2751
{
	int err;
2752 2753
	struct snd_kcontrol *kctl;
	struct snd_kcontrol_new *dig_mix;
2754
	int idx;
L
Linus Torvalds 已提交
2755

2756
	idx = find_empty_mixer_ctl_idx(codec, "IEC958 Capture Switch", 0);
2757
	if (idx < 0) {
2758
		codec_err(codec, "too many IEC958 inputs\n");
2759 2760
		return -EBUSY;
	}
L
Linus Torvalds 已提交
2761 2762
	for (dig_mix = dig_in_ctls; dig_mix->name; dig_mix++) {
		kctl = snd_ctl_new1(dig_mix, codec);
2763 2764
		if (!kctl)
			return -ENOMEM;
L
Linus Torvalds 已提交
2765
		kctl->private_value = nid;
2766
		err = snd_hda_ctl_add(codec, nid, kctl);
T
Takashi Iwai 已提交
2767
		if (err < 0)
L
Linus Torvalds 已提交
2768 2769
			return err;
	}
T
Takashi Iwai 已提交
2770
	codec->spdif_in_enable =
2771 2772
		snd_hda_codec_read(codec, nid, 0,
				   AC_VERB_GET_DIGI_CONVERT_1, 0) &
T
Takashi Iwai 已提交
2773
		AC_DIG1_ENABLE;
L
Linus Torvalds 已提交
2774 2775
	return 0;
}
2776
EXPORT_SYMBOL_GPL(snd_hda_create_spdif_in_ctls);
L
Linus Torvalds 已提交
2777

T
Takashi Iwai 已提交
2778 2779 2780 2781 2782 2783 2784 2785 2786 2787
/**
 * snd_hda_codec_set_power_to_all - Set the power state to all widgets
 * @codec: the HDA codec
 * @fg: function group (not used now)
 * @power_state: the power state to set (AC_PWRST_*)
 *
 * Set the given power state to all widgets that have the power control.
 * If the codec has power_filter set, it evaluates the power state and
 * filter out if it's unchanged as D3.
 */
2788
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
2789
				    unsigned int power_state)
2790
{
2791
	hda_nid_t nid;
2792

2793
	for_each_hda_codec_node(nid, codec) {
2794
		unsigned int wcaps = get_wcaps(codec, nid);
2795
		unsigned int state = power_state;
2796 2797
		if (!(wcaps & AC_WCAP_POWER))
			continue;
2798 2799 2800
		if (codec->power_filter) {
			state = codec->power_filter(codec, nid, power_state);
			if (state != power_state && power_state == AC_PWRST_D3)
2801
				continue;
2802
		}
2803
		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE,
2804
				    state);
2805
	}
2806
}
2807
EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all);
2808

2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834
/*
 * wait until the state is reached, returns the current state
 */
static unsigned int hda_sync_power_state(struct hda_codec *codec,
					 hda_nid_t fg,
					 unsigned int power_state)
{
	unsigned long end_time = jiffies + msecs_to_jiffies(500);
	unsigned int state, actual_state;

	for (;;) {
		state = snd_hda_codec_read(codec, fg, 0,
					   AC_VERB_GET_POWER_STATE, 0);
		if (state & AC_PWRST_ERROR)
			break;
		actual_state = (state >> 4) & 0x0f;
		if (actual_state == power_state)
			break;
		if (time_after_eq(jiffies, end_time))
			break;
		/* wait until the codec reachs to the target state */
		msleep(1);
	}
	return state;
}

T
Takashi Iwai 已提交
2835 2836 2837 2838 2839 2840 2841 2842 2843
/**
 * snd_hda_codec_eapd_power_filter - A power filter callback for EAPD
 * @codec: the HDA codec
 * @nid: widget NID
 * @power_state: power state to evalue
 *
 * Don't power down the widget if it controls eapd and EAPD_BTLENABLE is set.
 * This can be used a codec power_filter callback.
 */
2844 2845 2846
unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
					     hda_nid_t nid,
					     unsigned int power_state)
2847
{
2848
	if (nid == codec->core.afg || nid == codec->core.mfg)
2849
		return power_state;
2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
	if (power_state == AC_PWRST_D3 &&
	    get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN &&
	    (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) {
		int eapd = snd_hda_codec_read(codec, nid, 0,
					      AC_VERB_GET_EAPD_BTLENABLE, 0);
		if (eapd & 0x02)
			return AC_PWRST_D0;
	}
	return power_state;
}
2860
EXPORT_SYMBOL_GPL(snd_hda_codec_eapd_power_filter);
2861

2862
/*
2863
 * set power state of the codec, and return the power state
2864
 */
2865
static unsigned int hda_set_power_state(struct hda_codec *codec,
2866
					unsigned int power_state)
2867
{
2868
	hda_nid_t fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
2869 2870
	int count;
	unsigned int state;
2871
	int flags = 0;
2872

2873
	/* this delay seems necessary to avoid click noise at power-down */
2874
	if (power_state == AC_PWRST_D3) {
2875
		if (codec->depop_delay < 0)
2876
			msleep(codec_has_epss(codec) ? 10 : 100);
2877 2878
		else if (codec->depop_delay > 0)
			msleep(codec->depop_delay);
2879
		flags = HDA_RW_NO_RESPONSE_FALLBACK;
2880
	}
2881 2882 2883

	/* repeat power states setting at most 10 times*/
	for (count = 0; count < 10; count++) {
2884 2885 2886 2887
		if (codec->patch_ops.set_power_state)
			codec->patch_ops.set_power_state(codec, fg,
							 power_state);
		else {
2888 2889 2890 2891 2892 2893 2894
			state = power_state;
			if (codec->power_filter)
				state = codec->power_filter(codec, fg, state);
			if (state == power_state || power_state != AC_PWRST_D3)
				snd_hda_codec_read(codec, fg, flags,
						   AC_VERB_SET_POWER_STATE,
						   state);
2895
			snd_hda_codec_set_power_to_all(codec, fg, power_state);
2896 2897
		}
		state = hda_sync_power_state(codec, fg, power_state);
2898 2899 2900
		if (!(state & AC_PWRST_ERROR))
			break;
	}
2901

2902
	return state;
2903
}
2904

2905 2906 2907 2908 2909
/* sync power states of all widgets;
 * this is called at the end of codec parsing
 */
static void sync_power_up_states(struct hda_codec *codec)
{
2910
	hda_nid_t nid;
2911

2912 2913
	/* don't care if no filter is used */
	if (!codec->power_filter)
2914 2915
		return;

2916
	for_each_hda_codec_node(nid, codec) {
2917
		unsigned int wcaps = get_wcaps(codec, nid);
2918
		unsigned int target;
2919 2920 2921 2922 2923
		if (!(wcaps & AC_WCAP_POWER))
			continue;
		target = codec->power_filter(codec, nid, AC_PWRST_D0);
		if (target == AC_PWRST_D0)
			continue;
2924
		if (!snd_hda_check_power_state(codec, nid, target))
2925 2926 2927 2928 2929
			snd_hda_codec_write(codec, nid, 0,
					    AC_VERB_SET_POWER_STATE, target);
	}
}

2930
#ifdef CONFIG_SND_HDA_RECONFIG
T
Takashi Iwai 已提交
2931 2932 2933 2934 2935 2936 2937 2938 2939 2940
/* execute additional init verbs */
static void hda_exec_init_verbs(struct hda_codec *codec)
{
	if (codec->init_verbs.list)
		snd_hda_sequence_write(codec, codec->init_verbs.list);
}
#else
static inline void hda_exec_init_verbs(struct hda_codec *codec) {}
#endif

2941
#ifdef CONFIG_PM
2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958
/* update the power on/off account with the current jiffies */
static void update_power_acct(struct hda_codec *codec, bool on)
{
	unsigned long delta = jiffies - codec->power_jiffies;

	if (on)
		codec->power_on_acct += delta;
	else
		codec->power_off_acct += delta;
	codec->power_jiffies += delta;
}

void snd_hda_update_power_acct(struct hda_codec *codec)
{
	update_power_acct(codec, hda_codec_is_power_on(codec));
}

2959 2960
/*
 * call suspend and power-down; used both from PM and power-save
2961
 * this function returns the power state in the end
2962
 */
2963
static unsigned int hda_call_codec_suspend(struct hda_codec *codec)
2964
{
2965 2966
	unsigned int state;

2967
	atomic_inc(&codec->core.in_pm);
2968

2969
	if (codec->patch_ops.suspend)
2970
		codec->patch_ops.suspend(codec);
2971
	hda_cleanup_all_streams(codec);
2972
	state = hda_set_power_state(codec, AC_PWRST_D3);
2973
	update_power_acct(codec, true);
2974
	atomic_dec(&codec->core.in_pm);
2975
	return state;
2976 2977
}

2978 2979 2980 2981 2982
/*
 * kick up codec; used both from PM and power-save
 */
static void hda_call_codec_resume(struct hda_codec *codec)
{
2983
	atomic_inc(&codec->core.in_pm);
2984

2985 2986 2987
	if (codec->core.regmap)
		regcache_mark_dirty(codec->core.regmap);

2988 2989
	codec->power_jiffies = jiffies;

2990
	hda_set_power_state(codec, AC_PWRST_D0);
2991
	restore_shutup_pins(codec);
T
Takashi Iwai 已提交
2992
	hda_exec_init_verbs(codec);
2993
	snd_hda_jack_set_dirty_all(codec);
2994 2995 2996
	if (codec->patch_ops.resume)
		codec->patch_ops.resume(codec);
	else {
2997 2998
		if (codec->patch_ops.init)
			codec->patch_ops.init(codec);
2999 3000
		if (codec->core.regmap)
			regcache_sync(codec->core.regmap);
3001
	}
3002 3003 3004

	if (codec->jackpoll_interval)
		hda_jackpoll_work(&codec->jackpoll_work.work);
3005
	else
3006
		snd_hda_jack_report_sync(codec);
3007
	atomic_dec(&codec->core.in_pm);
3008
}
3009

3010
static int hda_codec_runtime_suspend(struct device *dev)
3011 3012
{
	struct hda_codec *codec = dev_to_hda_codec(dev);
3013
	struct hda_pcm *pcm;
3014
	unsigned int state;
3015 3016

	cancel_delayed_work_sync(&codec->jackpoll_work);
3017 3018
	list_for_each_entry(pcm, &codec->pcm_list_head, list)
		snd_pcm_suspend_all(pcm->pcm);
3019
	state = hda_call_codec_suspend(codec);
3020 3021 3022
	if (codec_has_clkstop(codec) && codec_has_epss(codec) &&
	    (state & AC_PWRST_CLK_STOP_OK))
		snd_hdac_codec_link_down(&codec->core);
3023
	snd_hdac_link_power(&codec->core, false);
3024 3025 3026
	return 0;
}

3027
static int hda_codec_runtime_resume(struct device *dev)
3028
{
3029 3030
	struct hda_codec *codec = dev_to_hda_codec(dev);

3031
	snd_hdac_link_power(&codec->core, true);
3032
	snd_hdac_codec_link_up(&codec->core);
3033
	hda_call_codec_resume(codec);
3034
	pm_runtime_mark_last_busy(dev);
3035 3036
	return 0;
}
3037
#endif /* CONFIG_PM */
3038

3039 3040
/* referred in hda_bind.c */
const struct dev_pm_ops hda_codec_driver_pm = {
3041 3042 3043 3044
	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
				pm_runtime_force_resume)
	SET_RUNTIME_PM_OPS(hda_codec_runtime_suspend, hda_codec_runtime_resume,
			   NULL)
3045
};
3046

3047 3048 3049 3050 3051
/*
 * add standard channel maps if not specified
 */
static int add_std_chmaps(struct hda_codec *codec)
{
3052 3053
	struct hda_pcm *pcm;
	int str, err;
3054

3055
	list_for_each_entry(pcm, &codec->pcm_list_head, list) {
3056
		for (str = 0; str < 2; str++) {
3057
			struct hda_pcm_stream *hinfo = &pcm->stream[str];
3058
			struct snd_pcm_chmap *chmap;
3059
			const struct snd_pcm_chmap_elem *elem;
3060

3061
			if (!pcm->pcm || pcm->own_chmap || !hinfo->substreams)
3062
				continue;
3063
			elem = hinfo->chmap ? hinfo->chmap : snd_pcm_std_chmaps;
3064
			err = snd_pcm_add_chmap_ctls(pcm->pcm, str, elem,
3065 3066 3067 3068 3069 3070 3071 3072 3073 3074
						     hinfo->channels_max,
						     0, &chmap);
			if (err < 0)
				return err;
			chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
		}
	}
	return 0;
}

3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087
/* default channel maps for 2.1 speakers;
 * since HD-audio supports only stereo, odd number channels are omitted
 */
const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[] = {
	{ .channels = 2,
	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
	{ .channels = 4,
	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
		   SNDRV_CHMAP_LFE, SNDRV_CHMAP_LFE } },
	{ }
};
EXPORT_SYMBOL_GPL(snd_pcm_2_1_chmaps);

3088 3089 3090
int snd_hda_codec_build_controls(struct hda_codec *codec)
{
	int err = 0;
T
Takashi Iwai 已提交
3091
	hda_exec_init_verbs(codec);
3092 3093 3094 3095 3096 3097 3098
	/* continue to initialize... */
	if (codec->patch_ops.init)
		err = codec->patch_ops.init(codec);
	if (!err && codec->patch_ops.build_controls)
		err = codec->patch_ops.build_controls(codec);
	if (err < 0)
		return err;
3099 3100 3101 3102 3103 3104

	/* we create chmaps here instead of build_pcms */
	err = add_std_chmaps(codec);
	if (err < 0)
		return err;

3105 3106 3107 3108
	if (codec->jackpoll_interval)
		hda_jackpoll_work(&codec->jackpoll_work.work);
	else
		snd_hda_jack_report_sync(codec); /* call at the last init point */
3109
	sync_power_up_states(codec);
L
Linus Torvalds 已提交
3110 3111 3112 3113 3114 3115 3116 3117
	return 0;
}

/*
 * PCM stuff
 */
static int hda_pcm_default_open_close(struct hda_pcm_stream *hinfo,
				      struct hda_codec *codec,
3118
				      struct snd_pcm_substream *substream)
L
Linus Torvalds 已提交
3119 3120 3121 3122 3123 3124 3125 3126
{
	return 0;
}

static int hda_pcm_default_prepare(struct hda_pcm_stream *hinfo,
				   struct hda_codec *codec,
				   unsigned int stream_tag,
				   unsigned int format,
3127
				   struct snd_pcm_substream *substream)
L
Linus Torvalds 已提交
3128 3129 3130 3131 3132 3133 3134
{
	snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
	return 0;
}

static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo,
				   struct hda_codec *codec,
3135
				   struct snd_pcm_substream *substream)
L
Linus Torvalds 已提交
3136
{
3137
	snd_hda_codec_cleanup_stream(codec, hinfo->nid);
L
Linus Torvalds 已提交
3138 3139 3140
	return 0;
}

3141 3142
static int set_pcm_default_values(struct hda_codec *codec,
				  struct hda_pcm_stream *info)
L
Linus Torvalds 已提交
3143
{
3144 3145
	int err;

T
Takashi Iwai 已提交
3146 3147
	/* query support PCM information from the given NID */
	if (info->nid && (!info->rates || !info->formats)) {
3148
		err = snd_hda_query_supported_pcm(codec, info->nid,
T
Takashi Iwai 已提交
3149 3150 3151
				info->rates ? NULL : &info->rates,
				info->formats ? NULL : &info->formats,
				info->maxbps ? NULL : &info->maxbps);
3152 3153
		if (err < 0)
			return err;
L
Linus Torvalds 已提交
3154 3155 3156 3157 3158 3159
	}
	if (info->ops.open == NULL)
		info->ops.open = hda_pcm_default_open_close;
	if (info->ops.close == NULL)
		info->ops.close = hda_pcm_default_open_close;
	if (info->ops.prepare == NULL) {
3160 3161
		if (snd_BUG_ON(!info->nid))
			return -EINVAL;
L
Linus Torvalds 已提交
3162 3163 3164
		info->ops.prepare = hda_pcm_default_prepare;
	}
	if (info->ops.cleanup == NULL) {
3165 3166
		if (snd_BUG_ON(!info->nid))
			return -EINVAL;
L
Linus Torvalds 已提交
3167 3168 3169 3170 3171
		info->ops.cleanup = hda_pcm_default_cleanup;
	}
	return 0;
}

3172 3173 3174
/*
 * codec prepare/cleanup entries
 */
T
Takashi Iwai 已提交
3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185
/**
 * snd_hda_codec_prepare - Prepare a stream
 * @codec: the HDA codec
 * @hinfo: PCM information
 * @stream: stream tag to assign
 * @format: format id to assign
 * @substream: PCM substream to assign
 *
 * Calls the prepare callback set by the codec with the given arguments.
 * Clean up the inactive streams when successful.
 */
3186 3187 3188 3189 3190 3191 3192
int snd_hda_codec_prepare(struct hda_codec *codec,
			  struct hda_pcm_stream *hinfo,
			  unsigned int stream,
			  unsigned int format,
			  struct snd_pcm_substream *substream)
{
	int ret;
3193
	mutex_lock(&codec->bus->prepare_mutex);
3194 3195 3196 3197 3198
	if (hinfo->ops.prepare)
		ret = hinfo->ops.prepare(hinfo, codec, stream, format,
					 substream);
	else
		ret = -ENODEV;
3199 3200
	if (ret >= 0)
		purify_inactive_streams(codec);
3201
	mutex_unlock(&codec->bus->prepare_mutex);
3202 3203
	return ret;
}
3204
EXPORT_SYMBOL_GPL(snd_hda_codec_prepare);
3205

T
Takashi Iwai 已提交
3206 3207 3208 3209 3210 3211 3212 3213
/**
 * snd_hda_codec_cleanup - Prepare a stream
 * @codec: the HDA codec
 * @hinfo: PCM information
 * @substream: PCM substream
 *
 * Calls the cleanup callback set by the codec with the given arguments.
 */
3214 3215 3216 3217
void snd_hda_codec_cleanup(struct hda_codec *codec,
			   struct hda_pcm_stream *hinfo,
			   struct snd_pcm_substream *substream)
{
3218
	mutex_lock(&codec->bus->prepare_mutex);
3219 3220
	if (hinfo->ops.cleanup)
		hinfo->ops.cleanup(hinfo, codec, substream);
3221
	mutex_unlock(&codec->bus->prepare_mutex);
3222
}
3223
EXPORT_SYMBOL_GPL(snd_hda_codec_cleanup);
3224

3225
/* global */
3226 3227 3228 3229
const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = {
	"Audio", "SPDIF", "HDMI", "Modem"
};

T
Takashi Iwai 已提交
3230 3231 3232
/*
 * get the empty PCM device number to assign
 */
3233
static int get_empty_pcm_device(struct hda_bus *bus, unsigned int type)
T
Takashi Iwai 已提交
3234
{
3235
	/* audio device indices; not linear to keep compatibility */
3236 3237 3238
	/* assigned to static slots up to dev#10; if more needed, assign
	 * the later slot dynamically (when CONFIG_SND_DYNAMIC_MINORS=y)
	 */
3239 3240 3241
	static int audio_idx[HDA_PCM_NTYPES][5] = {
		[HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 },
		[HDA_PCM_TYPE_SPDIF] = { 1, -1 },
3242
		[HDA_PCM_TYPE_HDMI]  = { 3, 7, 8, 9, -1 },
3243
		[HDA_PCM_TYPE_MODEM] = { 6, -1 },
T
Takashi Iwai 已提交
3244
	};
3245 3246 3247
	int i;

	if (type >= HDA_PCM_NTYPES) {
3248
		dev_err(bus->card->dev, "Invalid PCM type %d\n", type);
T
Takashi Iwai 已提交
3249 3250
		return -EINVAL;
	}
3251

3252 3253 3254 3255 3256
	for (i = 0; audio_idx[type][i] >= 0; i++) {
#ifndef CONFIG_SND_DYNAMIC_MINORS
		if (audio_idx[type][i] >= 8)
			break;
#endif
3257 3258
		if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits))
			return audio_idx[type][i];
3259
	}
3260

3261
#ifdef CONFIG_SND_DYNAMIC_MINORS
3262 3263 3264 3265 3266
	/* non-fixed slots starting from 10 */
	for (i = 10; i < 32; i++) {
		if (!test_and_set_bit(i, bus->pcm_dev_bits))
			return i;
	}
3267
#endif
3268

3269
	dev_warn(bus->card->dev, "Too many %s devices\n",
3270
		snd_hda_pcm_type_name[type]);
3271
#ifndef CONFIG_SND_DYNAMIC_MINORS
3272 3273
	dev_warn(bus->card->dev,
		 "Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y\n");
3274
#endif
3275
	return -EAGAIN;
T
Takashi Iwai 已提交
3276 3277
}

3278 3279
/* call build_pcms ops of the given codec and set up the default parameters */
int snd_hda_codec_parse_pcms(struct hda_codec *codec)
3280
{
3281
	struct hda_pcm *cpcm;
3282
	int err;
3283

3284
	if (!list_empty(&codec->pcm_list_head))
3285 3286 3287 3288 3289 3290 3291 3292
		return 0; /* already parsed */

	if (!codec->patch_ops.build_pcms)
		return 0;

	err = codec->patch_ops.build_pcms(codec);
	if (err < 0) {
		codec_err(codec, "cannot build PCMs for #%d (error %d)\n",
3293
			  codec->core.addr, err);
3294 3295 3296
		return err;
	}

3297
	list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
3298 3299 3300 3301 3302 3303 3304
		int stream;

		for (stream = 0; stream < 2; stream++) {
			struct hda_pcm_stream *info = &cpcm->stream[stream];

			if (!info->substreams)
				continue;
3305
			err = set_pcm_default_values(codec, info);
3306 3307 3308 3309
			if (err < 0) {
				codec_warn(codec,
					   "fail to setup default for PCM %s\n",
					   cpcm->name);
3310
				return err;
3311
			}
3312 3313
		}
	}
3314 3315

	return 0;
3316 3317
}

T
Takashi Iwai 已提交
3318 3319 3320
/* assign all PCMs of the given codec */
int snd_hda_codec_build_pcms(struct hda_codec *codec)
{
3321
	struct hda_bus *bus = codec->bus;
3322
	struct hda_pcm *cpcm;
3323
	int dev, err;
T
Takashi Iwai 已提交
3324

3325
	err = snd_hda_codec_parse_pcms(codec);
3326
	if (err < 0)
3327 3328 3329
		return err;

	/* attach a new PCM streams */
3330
	list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
3331 3332
		if (cpcm->pcm)
			continue; /* already attached */
T
Takashi Iwai 已提交
3333
		if (!cpcm->stream[0].substreams && !cpcm->stream[1].substreams)
3334
			continue; /* no substreams assigned */
T
Takashi Iwai 已提交
3335

3336 3337 3338 3339
		dev = get_empty_pcm_device(bus, cpcm->pcm_type);
		if (dev < 0)
			continue; /* no fatal error */
		cpcm->device = dev;
3340
		err =  snd_hda_attach_pcm_stream(bus, codec, cpcm);
3341 3342 3343
		if (err < 0) {
			codec_err(codec,
				  "cannot attach PCM stream %d for codec #%d\n",
3344
				  dev, codec->core.addr);
3345
			continue; /* no fatal error */
T
Takashi Iwai 已提交
3346 3347
		}
	}
3348

T
Takashi Iwai 已提交
3349 3350 3351
	return 0;
}

L
Linus Torvalds 已提交
3352 3353 3354
/**
 * snd_hda_add_new_ctls - create controls from the array
 * @codec: the HDA codec
3355
 * @knew: the array of struct snd_kcontrol_new
L
Linus Torvalds 已提交
3356 3357 3358 3359 3360 3361
 *
 * This helper function creates and add new controls in the given array.
 * The array must be terminated with an empty entry as terminator.
 *
 * Returns 0 if successful, or a negative error code.
 */
3362 3363
int snd_hda_add_new_ctls(struct hda_codec *codec,
			 const struct snd_kcontrol_new *knew)
L
Linus Torvalds 已提交
3364
{
3365
	int err;
L
Linus Torvalds 已提交
3366 3367

	for (; knew->name; knew++) {
3368
		struct snd_kcontrol *kctl;
3369
		int addr = 0, idx = 0;
3370 3371
		if (knew->iface == -1)	/* skip this codec private value */
			continue;
3372
		for (;;) {
3373
			kctl = snd_ctl_new1(knew, codec);
T
Takashi Iwai 已提交
3374
			if (!kctl)
3375
				return -ENOMEM;
3376 3377 3378 3379
			if (addr > 0)
				kctl->id.device = addr;
			if (idx > 0)
				kctl->id.index = idx;
3380
			err = snd_hda_ctl_add(codec, 0, kctl);
3381 3382 3383 3384 3385 3386
			if (!err)
				break;
			/* try first with another device index corresponding to
			 * the codec addr; if it still fails (or it's the
			 * primary codec), then try another control index
			 */
3387 3388
			if (!addr && codec->core.addr)
				addr = codec->core.addr;
3389 3390
			else if (!idx && !knew->index) {
				idx = find_empty_mixer_ctl_idx(codec,
3391
							       knew->name, 0);
3392 3393 3394
				if (idx <= 0)
					return err;
			} else
3395 3396
				return err;
		}
L
Linus Torvalds 已提交
3397 3398 3399
	}
	return 0;
}
3400
EXPORT_SYMBOL_GPL(snd_hda_add_new_ctls);
L
Linus Torvalds 已提交
3401

3402
#ifdef CONFIG_PM
3403
static void codec_set_power_save(struct hda_codec *codec, int delay)
3404
{
3405 3406
	struct device *dev = hda_codec_dev(codec);

3407 3408 3409
	if (delay == 0 && codec->auto_runtime_pm)
		delay = 3000;

3410 3411 3412 3413 3414 3415 3416 3417 3418 3419
	if (delay > 0) {
		pm_runtime_set_autosuspend_delay(dev, delay);
		pm_runtime_use_autosuspend(dev);
		pm_runtime_allow(dev);
		if (!pm_runtime_suspended(dev))
			pm_runtime_mark_last_busy(dev);
	} else {
		pm_runtime_dont_use_autosuspend(dev);
		pm_runtime_forbid(dev);
	}
3420
}
3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432

/**
 * snd_hda_set_power_save - reprogram autosuspend for the given delay
 * @bus: HD-audio bus
 * @delay: autosuspend delay in msec, 0 = off
 *
 * Synchronize the runtime PM autosuspend state from the power_save option.
 */
void snd_hda_set_power_save(struct hda_bus *bus, int delay)
{
	struct hda_codec *c;

3433
	list_for_each_codec(c, bus)
3434 3435 3436
		codec_set_power_save(c, delay);
}
EXPORT_SYMBOL_GPL(snd_hda_set_power_save);
3437

3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449
/**
 * snd_hda_check_amp_list_power - Check the amp list and update the power
 * @codec: HD-audio codec
 * @check: the object containing an AMP list and the status
 * @nid: NID to check / update
 *
 * Check whether the given NID is in the amp list.  If it's in the list,
 * check the current AMP status, and update the the power-status according
 * to the mute status.
 *
 * This function is supposed to be set or called from the check_power_status
 * patch ops.
3450
 */
3451 3452 3453 3454
int snd_hda_check_amp_list_power(struct hda_codec *codec,
				 struct hda_loopback_check *check,
				 hda_nid_t nid)
{
3455
	const struct hda_amp_list *p;
3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473
	int ch, v;

	if (!check->amplist)
		return 0;
	for (p = check->amplist; p->nid; p++) {
		if (p->nid == nid)
			break;
	}
	if (!p->nid)
		return 0; /* nothing changed */

	for (p = check->amplist; p->nid; p++) {
		for (ch = 0; ch < 2; ch++) {
			v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
						   p->idx);
			if (!(v & HDA_AMP_MUTE) && v > 0) {
				if (!check->power_on) {
					check->power_on = 1;
3474
					snd_hda_power_up_pm(codec);
3475 3476 3477 3478 3479 3480 3481
				}
				return 1;
			}
		}
	}
	if (check->power_on) {
		check->power_on = 0;
3482
		snd_hda_power_down_pm(codec);
3483 3484 3485
	}
	return 0;
}
3486
EXPORT_SYMBOL_GPL(snd_hda_check_amp_list_power);
3487
#endif
L
Linus Torvalds 已提交
3488 3489 3490 3491

/*
 * input MUX helper
 */
3492 3493 3494

/**
 * snd_hda_input_mux_info_info - Info callback helper for the input-mux enum
3495 3496
 * @imux: imux helper object
 * @uinfo: pointer to get/store the data
3497
 */
T
Takashi Iwai 已提交
3498 3499
int snd_hda_input_mux_info(const struct hda_input_mux *imux,
			   struct snd_ctl_elem_info *uinfo)
L
Linus Torvalds 已提交
3500 3501 3502 3503 3504 3505
{
	unsigned int index;

	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
	uinfo->count = 1;
	uinfo->value.enumerated.items = imux->num_items;
3506 3507
	if (!imux->num_items)
		return 0;
L
Linus Torvalds 已提交
3508 3509 3510 3511 3512 3513
	index = uinfo->value.enumerated.item;
	if (index >= imux->num_items)
		index = imux->num_items - 1;
	strcpy(uinfo->value.enumerated.name, imux->items[index].label);
	return 0;
}
3514
EXPORT_SYMBOL_GPL(snd_hda_input_mux_info);
L
Linus Torvalds 已提交
3515

3516 3517
/**
 * snd_hda_input_mux_info_put - Put callback helper for the input-mux enum
3518 3519 3520 3521 3522
 * @codec: the HDA codec
 * @imux: imux helper object
 * @ucontrol: pointer to get/store the data
 * @nid: input mux NID
 * @cur_val: pointer to get/store the current imux value
3523
 */
T
Takashi Iwai 已提交
3524 3525 3526 3527
int snd_hda_input_mux_put(struct hda_codec *codec,
			  const struct hda_input_mux *imux,
			  struct snd_ctl_elem_value *ucontrol,
			  hda_nid_t nid,
L
Linus Torvalds 已提交
3528 3529 3530 3531
			  unsigned int *cur_val)
{
	unsigned int idx;

3532 3533
	if (!imux->num_items)
		return 0;
L
Linus Torvalds 已提交
3534 3535 3536
	idx = ucontrol->value.enumerated.item[0];
	if (idx >= imux->num_items)
		idx = imux->num_items - 1;
3537
	if (*cur_val == idx)
L
Linus Torvalds 已提交
3538
		return 0;
3539 3540
	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_CONNECT_SEL,
				  imux->items[idx].index);
L
Linus Torvalds 已提交
3541 3542 3543
	*cur_val = idx;
	return 1;
}
3544
EXPORT_SYMBOL_GPL(snd_hda_input_mux_put);
L
Linus Torvalds 已提交
3545 3546


3547 3548 3549 3550 3551 3552 3553
/**
 * snd_hda_enum_helper_info - Helper for simple enum ctls
 * @kcontrol: ctl element
 * @uinfo: pointer to get/store the data
 * @num_items: number of enum items
 * @texts: enum item string array
 *
3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569
 * process kcontrol info callback of a simple string enum array
 * when @num_items is 0 or @texts is NULL, assume a boolean enum array
 */
int snd_hda_enum_helper_info(struct snd_kcontrol *kcontrol,
			     struct snd_ctl_elem_info *uinfo,
			     int num_items, const char * const *texts)
{
	static const char * const texts_default[] = {
		"Disabled", "Enabled"
	};

	if (!texts || !num_items) {
		num_items = 2;
		texts = texts_default;
	}

T
Takashi Iwai 已提交
3570
	return snd_ctl_enum_info(uinfo, 1, num_items, texts);
3571
}
3572
EXPORT_SYMBOL_GPL(snd_hda_enum_helper_info);
3573

L
Linus Torvalds 已提交
3574 3575 3576 3577
/*
 * Multi-channel / digital-out PCM helper functions
 */

3578 3579 3580 3581
/* setup SPDIF output stream */
static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
				 unsigned int stream_tag, unsigned int format)
{
3582 3583 3584 3585 3586
	struct hda_spdif_out *spdif;
	unsigned int curr_fmt;
	bool reset;

	spdif = snd_hda_spdif_out_of_nid(codec, nid);
3587 3588 3589 3590 3591 3592
	/* Add sanity check to pass klockwork check.
	 * This should never happen.
	 */
	if (WARN_ON(spdif == NULL))
		return;

3593 3594 3595 3596 3597 3598 3599 3600 3601
	curr_fmt = snd_hda_codec_read(codec, nid, 0,
				      AC_VERB_GET_STREAM_FORMAT, 0);
	reset = codec->spdif_status_reset &&
		(spdif->ctls & AC_DIG1_ENABLE) &&
		curr_fmt != format;

	/* turn off SPDIF if needed; otherwise the IEC958 bits won't be
	   updated */
	if (reset)
3602
		set_dig_out_convert(codec, nid,
3603
				    spdif->ctls & ~AC_DIG1_ENABLE & 0xff,
3604
				    -1);
3605
	snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
3606
	if (codec->slave_dig_outs) {
3607
		const hda_nid_t *d;
3608 3609 3610 3611
		for (d = codec->slave_dig_outs; *d; d++)
			snd_hda_codec_setup_stream(codec, *d, stream_tag, 0,
						   format);
	}
3612
	/* turn on again (if needed) */
3613
	if (reset)
3614
		set_dig_out_convert(codec, nid,
3615
				    spdif->ctls & 0xff, -1);
3616
}
3617

3618 3619 3620 3621
static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid)
{
	snd_hda_codec_cleanup_stream(codec, nid);
	if (codec->slave_dig_outs) {
3622
		const hda_nid_t *d;
3623 3624
		for (d = codec->slave_dig_outs; *d; d++)
			snd_hda_codec_cleanup_stream(codec, *d);
3625
	}
3626 3627
}

3628 3629
/**
 * snd_hda_multi_out_dig_open - open the digital out in the exclusive mode
3630 3631
 * @codec: the HDA codec
 * @mout: hda_multi_out object
L
Linus Torvalds 已提交
3632
 */
T
Takashi Iwai 已提交
3633 3634
int snd_hda_multi_out_dig_open(struct hda_codec *codec,
			       struct hda_multi_out *mout)
L
Linus Torvalds 已提交
3635
{
3636
	mutex_lock(&codec->spdif_mutex);
3637 3638
	if (mout->dig_out_used == HDA_DIG_ANALOG_DUP)
		/* already opened as analog dup; reset it once */
3639
		cleanup_dig_out_stream(codec, mout->dig_out_nid);
L
Linus Torvalds 已提交
3640
	mout->dig_out_used = HDA_DIG_EXCLUSIVE;
3641
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3642 3643
	return 0;
}
3644
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_open);
L
Linus Torvalds 已提交
3645

3646 3647
/**
 * snd_hda_multi_out_dig_prepare - prepare the digital out stream
3648 3649 3650 3651 3652
 * @codec: the HDA codec
 * @mout: hda_multi_out object
 * @stream_tag: stream tag to assign
 * @format: format id to assign
 * @substream: PCM substream to assign
3653
 */
3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664
int snd_hda_multi_out_dig_prepare(struct hda_codec *codec,
				  struct hda_multi_out *mout,
				  unsigned int stream_tag,
				  unsigned int format,
				  struct snd_pcm_substream *substream)
{
	mutex_lock(&codec->spdif_mutex);
	setup_dig_out_stream(codec, mout->dig_out_nid, stream_tag, format);
	mutex_unlock(&codec->spdif_mutex);
	return 0;
}
3665
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_prepare);
3666

3667 3668
/**
 * snd_hda_multi_out_dig_cleanup - clean-up the digital out stream
3669 3670
 * @codec: the HDA codec
 * @mout: hda_multi_out object
3671
 */
3672 3673 3674 3675 3676 3677 3678 3679
int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
				  struct hda_multi_out *mout)
{
	mutex_lock(&codec->spdif_mutex);
	cleanup_dig_out_stream(codec, mout->dig_out_nid);
	mutex_unlock(&codec->spdif_mutex);
	return 0;
}
3680
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_cleanup);
3681

3682 3683
/**
 * snd_hda_multi_out_dig_close - release the digital out stream
3684 3685
 * @codec: the HDA codec
 * @mout: hda_multi_out object
L
Linus Torvalds 已提交
3686
 */
T
Takashi Iwai 已提交
3687 3688
int snd_hda_multi_out_dig_close(struct hda_codec *codec,
				struct hda_multi_out *mout)
L
Linus Torvalds 已提交
3689
{
3690
	mutex_lock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3691
	mout->dig_out_used = 0;
3692
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3693 3694
	return 0;
}
3695
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_close);
L
Linus Torvalds 已提交
3696

3697 3698
/**
 * snd_hda_multi_out_analog_open - open analog outputs
3699 3700 3701 3702
 * @codec: the HDA codec
 * @mout: hda_multi_out object
 * @substream: PCM substream to assign
 * @hinfo: PCM information to assign
3703 3704 3705 3706
 *
 * Open analog outputs and set up the hw-constraints.
 * If the digital outputs can be opened as slave, open the digital
 * outputs, too.
L
Linus Torvalds 已提交
3707
 */
T
Takashi Iwai 已提交
3708 3709
int snd_hda_multi_out_analog_open(struct hda_codec *codec,
				  struct hda_multi_out *mout,
3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732
				  struct snd_pcm_substream *substream,
				  struct hda_pcm_stream *hinfo)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	runtime->hw.channels_max = mout->max_channels;
	if (mout->dig_out_nid) {
		if (!mout->analog_rates) {
			mout->analog_rates = hinfo->rates;
			mout->analog_formats = hinfo->formats;
			mout->analog_maxbps = hinfo->maxbps;
		} else {
			runtime->hw.rates = mout->analog_rates;
			runtime->hw.formats = mout->analog_formats;
			hinfo->maxbps = mout->analog_maxbps;
		}
		if (!mout->spdif_rates) {
			snd_hda_query_supported_pcm(codec, mout->dig_out_nid,
						    &mout->spdif_rates,
						    &mout->spdif_formats,
						    &mout->spdif_maxbps);
		}
		mutex_lock(&codec->spdif_mutex);
		if (mout->share_spdif) {
3733 3734 3735 3736 3737 3738 3739 3740 3741 3742
			if ((runtime->hw.rates & mout->spdif_rates) &&
			    (runtime->hw.formats & mout->spdif_formats)) {
				runtime->hw.rates &= mout->spdif_rates;
				runtime->hw.formats &= mout->spdif_formats;
				if (mout->spdif_maxbps < hinfo->maxbps)
					hinfo->maxbps = mout->spdif_maxbps;
			} else {
				mout->share_spdif = 0;
				/* FIXME: need notify? */
			}
3743
		}
3744
		mutex_unlock(&codec->spdif_mutex);
3745
	}
L
Linus Torvalds 已提交
3746 3747 3748
	return snd_pcm_hw_constraint_step(substream->runtime, 0,
					  SNDRV_PCM_HW_PARAM_CHANNELS, 2);
}
3749
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_open);
L
Linus Torvalds 已提交
3750

3751 3752
/**
 * snd_hda_multi_out_analog_prepare - Preapre the analog outputs.
3753 3754 3755 3756 3757
 * @codec: the HDA codec
 * @mout: hda_multi_out object
 * @stream_tag: stream tag to assign
 * @format: format id to assign
 * @substream: PCM substream to assign
3758 3759 3760
 *
 * Set up the i/o for analog out.
 * When the digital out is available, copy the front out to digital out, too.
L
Linus Torvalds 已提交
3761
 */
T
Takashi Iwai 已提交
3762 3763
int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
				     struct hda_multi_out *mout,
L
Linus Torvalds 已提交
3764 3765
				     unsigned int stream_tag,
				     unsigned int format,
3766
				     struct snd_pcm_substream *substream)
L
Linus Torvalds 已提交
3767
{
3768
	const hda_nid_t *nids = mout->dac_nids;
L
Linus Torvalds 已提交
3769
	int chs = substream->runtime->channels;
3770
	struct hda_spdif_out *spdif;
L
Linus Torvalds 已提交
3771 3772
	int i;

3773
	mutex_lock(&codec->spdif_mutex);
3774
	spdif = snd_hda_spdif_out_of_nid(codec, mout->dig_out_nid);
3775 3776
	if (mout->dig_out_nid && mout->share_spdif &&
	    mout->dig_out_used != HDA_DIG_EXCLUSIVE) {
3777
		if (chs == 2 && spdif != NULL &&
T
Takashi Iwai 已提交
3778 3779
		    snd_hda_is_supported_format(codec, mout->dig_out_nid,
						format) &&
3780
		    !(spdif->status & IEC958_AES0_NONAUDIO)) {
L
Linus Torvalds 已提交
3781
			mout->dig_out_used = HDA_DIG_ANALOG_DUP;
3782 3783
			setup_dig_out_stream(codec, mout->dig_out_nid,
					     stream_tag, format);
L
Linus Torvalds 已提交
3784 3785
		} else {
			mout->dig_out_used = 0;
3786
			cleanup_dig_out_stream(codec, mout->dig_out_nid);
L
Linus Torvalds 已提交
3787 3788
		}
	}
3789
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3790 3791

	/* front */
T
Takashi Iwai 已提交
3792 3793
	snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag,
				   0, format);
3794 3795
	if (!mout->no_share_stream &&
	    mout->hp_nid && mout->hp_nid != nids[HDA_FRONT])
L
Linus Torvalds 已提交
3796
		/* headphone out will just decode front left/right (stereo) */
T
Takashi Iwai 已提交
3797 3798
		snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag,
					   0, format);
3799
	/* extra outputs copied from front */
3800 3801 3802 3803 3804
	for (i = 0; i < ARRAY_SIZE(mout->hp_out_nid); i++)
		if (!mout->no_share_stream && mout->hp_out_nid[i])
			snd_hda_codec_setup_stream(codec,
						   mout->hp_out_nid[i],
						   stream_tag, 0, format);
3805

L
Linus Torvalds 已提交
3806 3807
	/* surrounds */
	for (i = 1; i < mout->num_dacs; i++) {
3808
		if (chs >= (i + 1) * 2) /* independent out */
T
Takashi Iwai 已提交
3809 3810
			snd_hda_codec_setup_stream(codec, nids[i], stream_tag,
						   i * 2, format);
3811
		else if (!mout->no_share_stream) /* copy front */
T
Takashi Iwai 已提交
3812 3813
			snd_hda_codec_setup_stream(codec, nids[i], stream_tag,
						   0, format);
L
Linus Torvalds 已提交
3814
	}
3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828

	/* extra surrounds */
	for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) {
		int ch = 0;
		if (!mout->extra_out_nid[i])
			break;
		if (chs >= (i + 1) * 2)
			ch = i * 2;
		else if (!mout->no_share_stream)
			break;
		snd_hda_codec_setup_stream(codec, mout->extra_out_nid[i],
					   stream_tag, ch, format);
	}

L
Linus Torvalds 已提交
3829 3830
	return 0;
}
3831
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_prepare);
L
Linus Torvalds 已提交
3832

3833 3834
/**
 * snd_hda_multi_out_analog_cleanup - clean up the setting for analog out
3835 3836
 * @codec: the HDA codec
 * @mout: hda_multi_out object
L
Linus Torvalds 已提交
3837
 */
T
Takashi Iwai 已提交
3838 3839
int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
				     struct hda_multi_out *mout)
L
Linus Torvalds 已提交
3840
{
3841
	const hda_nid_t *nids = mout->dac_nids;
L
Linus Torvalds 已提交
3842 3843 3844
	int i;

	for (i = 0; i < mout->num_dacs; i++)
3845
		snd_hda_codec_cleanup_stream(codec, nids[i]);
L
Linus Torvalds 已提交
3846
	if (mout->hp_nid)
3847
		snd_hda_codec_cleanup_stream(codec, mout->hp_nid);
3848 3849 3850 3851
	for (i = 0; i < ARRAY_SIZE(mout->hp_out_nid); i++)
		if (mout->hp_out_nid[i])
			snd_hda_codec_cleanup_stream(codec,
						     mout->hp_out_nid[i]);
3852 3853
	for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++)
		if (mout->extra_out_nid[i])
3854 3855
			snd_hda_codec_cleanup_stream(codec,
						     mout->extra_out_nid[i]);
3856
	mutex_lock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3857
	if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) {
3858
		cleanup_dig_out_stream(codec, mout->dig_out_nid);
L
Linus Torvalds 已提交
3859 3860
		mout->dig_out_used = 0;
	}
3861
	mutex_unlock(&codec->spdif_mutex);
L
Linus Torvalds 已提交
3862 3863
	return 0;
}
3864
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_cleanup);
L
Linus Torvalds 已提交
3865

3866 3867
/**
 * snd_hda_get_default_vref - Get the default (mic) VREF pin bits
3868 3869
 * @codec: the HDA codec
 * @pin: referred pin NID
3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892
 *
 * Guess the suitable VREF pin bits to be set as the pin-control value.
 * Note: the function doesn't set the AC_PINCTL_IN_EN bit.
 */
unsigned int snd_hda_get_default_vref(struct hda_codec *codec, hda_nid_t pin)
{
	unsigned int pincap;
	unsigned int oldval;
	oldval = snd_hda_codec_read(codec, pin, 0,
				    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
	pincap = snd_hda_query_pin_caps(codec, pin);
	pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
	/* Exception: if the default pin setup is vref50, we give it priority */
	if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
		return AC_PINCTL_VREF_80;
	else if (pincap & AC_PINCAP_VREF_50)
		return AC_PINCTL_VREF_50;
	else if (pincap & AC_PINCAP_VREF_100)
		return AC_PINCTL_VREF_100;
	else if (pincap & AC_PINCAP_VREF_GRD)
		return AC_PINCTL_VREF_GRD;
	return AC_PINCTL_VREF_HIZ;
}
3893
EXPORT_SYMBOL_GPL(snd_hda_get_default_vref);
3894

3895 3896 3897 3898 3899 3900
/**
 * snd_hda_correct_pin_ctl - correct the pin ctl value for matching with the pin cap
 * @codec: the HDA codec
 * @pin: referred pin NID
 * @val: pin ctl value to audit
 */
3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948
unsigned int snd_hda_correct_pin_ctl(struct hda_codec *codec,
				     hda_nid_t pin, unsigned int val)
{
	static unsigned int cap_lists[][2] = {
		{ AC_PINCTL_VREF_100, AC_PINCAP_VREF_100 },
		{ AC_PINCTL_VREF_80, AC_PINCAP_VREF_80 },
		{ AC_PINCTL_VREF_50, AC_PINCAP_VREF_50 },
		{ AC_PINCTL_VREF_GRD, AC_PINCAP_VREF_GRD },
	};
	unsigned int cap;

	if (!val)
		return 0;
	cap = snd_hda_query_pin_caps(codec, pin);
	if (!cap)
		return val; /* don't know what to do... */

	if (val & AC_PINCTL_OUT_EN) {
		if (!(cap & AC_PINCAP_OUT))
			val &= ~(AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
		else if ((val & AC_PINCTL_HP_EN) && !(cap & AC_PINCAP_HP_DRV))
			val &= ~AC_PINCTL_HP_EN;
	}

	if (val & AC_PINCTL_IN_EN) {
		if (!(cap & AC_PINCAP_IN))
			val &= ~(AC_PINCTL_IN_EN | AC_PINCTL_VREFEN);
		else {
			unsigned int vcap, vref;
			int i;
			vcap = (cap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
			vref = val & AC_PINCTL_VREFEN;
			for (i = 0; i < ARRAY_SIZE(cap_lists); i++) {
				if (vref == cap_lists[i][0] &&
				    !(vcap & cap_lists[i][1])) {
					if (i == ARRAY_SIZE(cap_lists) - 1)
						vref = AC_PINCTL_VREF_HIZ;
					else
						vref = cap_lists[i + 1][0];
				}
			}
			val &= ~AC_PINCTL_VREFEN;
			val |= vref;
		}
	}

	return val;
}
3949
EXPORT_SYMBOL_GPL(snd_hda_correct_pin_ctl);
3950

3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963
/**
 * _snd_hda_pin_ctl - Helper to set pin ctl value
 * @codec: the HDA codec
 * @pin: referred pin NID
 * @val: pin control value to set
 * @cached: access over codec pinctl cache or direct write
 *
 * This function is a helper to set a pin ctl value more safely.
 * It corrects the pin ctl value via snd_hda_correct_pin_ctl(), stores the
 * value in pin target array via snd_hda_codec_set_pin_target(), then
 * actually writes the value via either snd_hda_codec_update_cache() or
 * snd_hda_codec_write() depending on @cached flag.
 */
3964 3965 3966
int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
			 unsigned int val, bool cached)
{
3967
	val = snd_hda_correct_pin_ctl(codec, pin, val);
3968
	snd_hda_codec_set_pin_target(codec, pin, val);
3969 3970 3971 3972 3973 3974 3975
	if (cached)
		return snd_hda_codec_update_cache(codec, pin, 0,
				AC_VERB_SET_PIN_WIDGET_CONTROL, val);
	else
		return snd_hda_codec_write(codec, pin, 0,
					   AC_VERB_SET_PIN_WIDGET_CONTROL, val);
}
3976
EXPORT_SYMBOL_GPL(_snd_hda_set_pin_ctl);
3977

3978 3979
/**
 * snd_hda_add_imux_item - Add an item to input_mux
3980 3981 3982 3983 3984
 * @codec: the HDA codec
 * @imux: imux helper object
 * @label: the name of imux item to assign
 * @index: index number of imux item to assign
 * @type_idx: pointer to store the resultant label index
3985 3986 3987 3988 3989
 *
 * When the same label is used already in the existing items, the number
 * suffix is appended to the label.  This label index number is stored
 * to type_idx when non-NULL pointer is given.
 */
3990 3991
int snd_hda_add_imux_item(struct hda_codec *codec,
			  struct hda_input_mux *imux, const char *label,
3992 3993 3994 3995
			  int index, int *type_idx)
{
	int i, label_idx = 0;
	if (imux->num_items >= HDA_MAX_NUM_INPUTS) {
3996
		codec_err(codec, "hda_codec: Too many imux items!\n");
3997 3998 3999 4000 4001
		return -EINVAL;
	}
	for (i = 0; i < imux->num_items; i++) {
		if (!strncmp(label, imux->items[i].label, strlen(label)))
			label_idx++;
4002
	}
4003 4004 4005 4006 4007 4008
	if (type_idx)
		*type_idx = label_idx;
	if (label_idx > 0)
		snprintf(imux->items[imux->num_items].label,
			 sizeof(imux->items[imux->num_items].label),
			 "%s %d", label, label_idx);
4009
	else
4010 4011 4012 4013 4014
		strlcpy(imux->items[imux->num_items].label, label,
			sizeof(imux->items[imux->num_items].label));
	imux->items[imux->num_items].index = index;
	imux->num_items++;
	return 0;
4015
}
4016
EXPORT_SYMBOL_GPL(snd_hda_add_imux_item);
4017

L
Linus Torvalds 已提交
4018
/**
4019
 * snd_hda_bus_reset_codecs - Reset the bus
4020
 * @bus: HD-audio bus
L
Linus Torvalds 已提交
4021
 */
4022
void snd_hda_bus_reset_codecs(struct hda_bus *bus)
L
Linus Torvalds 已提交
4023
{
T
Takashi Iwai 已提交
4024
	struct hda_codec *codec;
L
Linus Torvalds 已提交
4025

4026
	list_for_each_codec(codec, bus) {
4027
		/* FIXME: maybe a better way needed for forced reset */
4028
		cancel_delayed_work_sync(&codec->jackpoll_work);
4029
#ifdef CONFIG_PM
4030
		if (hda_codec_is_power_on(codec)) {
4031
			hda_call_codec_suspend(codec);
4032
			hda_call_codec_resume(codec);
4033 4034
		}
#endif
L
Linus Torvalds 已提交
4035 4036
	}
}
T
Takashi Iwai 已提交
4037

4038 4039 4040 4041 4042 4043 4044 4045
/**
 * snd_print_pcm_bits - Print the supported PCM fmt bits to the string buffer
 * @pcm: PCM caps bits
 * @buf: the string buffer to write
 * @buflen: the max buffer length
 *
 * used by hda_proc.c and hda_eld.c
 */
4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056
void snd_print_pcm_bits(int pcm, char *buf, int buflen)
{
	static unsigned int bits[] = { 8, 16, 20, 24, 32 };
	int i, j;

	for (i = 0, j = 0; i < ARRAY_SIZE(bits); i++)
		if (pcm & (AC_SUPPCM_BITS_8 << i))
			j += snprintf(buf + j, buflen - j,  " %d", bits[i]);

	buf[j] = '\0'; /* necessary when j == 0 */
}
4057
EXPORT_SYMBOL_GPL(snd_print_pcm_bits);
4058 4059 4060

MODULE_DESCRIPTION("HDA codec core");
MODULE_LICENSE("GPL");