Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * PMac AWACS lowlevel functions
   4 *
   5 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
   6 * code based on dmasound.c.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   7 */
   8
   9
  10#include <linux/io.h>
  11#include <asm/nvram.h>
  12#include <linux/init.h>
  13#include <linux/delay.h>
  14#include <linux/of.h>
  15#include <linux/slab.h>
  16#include <sound/core.h>
  17#include "pmac.h"
  18
  19
  20#ifdef CONFIG_ADB_CUDA
  21#define PMAC_AMP_AVAIL
  22#endif
  23
  24#ifdef PMAC_AMP_AVAIL
  25struct awacs_amp {
  26	unsigned char amp_master;
  27	unsigned char amp_vol[2][2];
  28	unsigned char amp_tone[2];
  29};
  30
  31#define CHECK_CUDA_AMP() (sys_ctrler == SYS_CTRLER_CUDA)
  32
  33#endif /* PMAC_AMP_AVAIL */
  34
  35
  36static void snd_pmac_screamer_wait(struct snd_pmac *chip)
  37{
  38	long timeout = 2000;
  39	while (!(in_le32(&chip->awacs->codec_stat) & MASK_VALID)) {
  40		mdelay(1);
  41		if (! --timeout) {
  42			dev_dbg(chip->card->dev, "%s timeout\n", __func__);
  43			break;
  44		}
  45	}
  46}
  47
  48/*
  49 * write AWACS register
  50 */
  51static void
  52snd_pmac_awacs_write(struct snd_pmac *chip, int val)
  53{
  54	long timeout = 5000000;
  55
  56	if (chip->model == PMAC_SCREAMER)
  57		snd_pmac_screamer_wait(chip);
  58	out_le32(&chip->awacs->codec_ctrl, val | (chip->subframe << 22));
  59	while (in_le32(&chip->awacs->codec_ctrl) & MASK_NEWECMD) {
  60		if (! --timeout) {
  61			dev_dbg(chip->card->dev, "%s timeout\n", __func__);
  62			break;
  63		}
  64	}
  65}
  66
  67static void
  68snd_pmac_awacs_write_reg(struct snd_pmac *chip, int reg, int val)
  69{
  70	snd_pmac_awacs_write(chip, val | (reg << 12));
  71	chip->awacs_reg[reg] = val;
  72}
  73
  74static void
  75snd_pmac_awacs_write_noreg(struct snd_pmac *chip, int reg, int val)
  76{
  77	snd_pmac_awacs_write(chip, val | (reg << 12));
  78}
  79
  80#ifdef CONFIG_PM
  81/* Recalibrate chip */
  82static void screamer_recalibrate(struct snd_pmac *chip)
  83{
  84	if (chip->model != PMAC_SCREAMER)
  85		return;
  86
  87	/* Sorry for the horrible delays... I hope to get that improved
  88	 * by making the whole PM process asynchronous in a future version
  89	 */
  90	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
  91	if (chip->manufacturer == 0x1)
  92		/* delay for broken crystal part */
  93		msleep(750);
  94	snd_pmac_awacs_write_noreg(chip, 1,
  95				   chip->awacs_reg[1] | MASK_RECALIBRATE |
  96				   MASK_CMUTE | MASK_AMUTE);
  97	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
  98	snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
  99}
 100
 101#else
 102#define screamer_recalibrate(chip) /* NOP */
 103#endif
 104
 105
 106/*
 107 * additional callback to set the pcm format
 108 */
 109static void snd_pmac_awacs_set_format(struct snd_pmac *chip)
 110{
 111	chip->awacs_reg[1] &= ~MASK_SAMPLERATE;
 112	chip->awacs_reg[1] |= chip->rate_index << 3;
 113	snd_pmac_awacs_write_reg(chip, 1, chip->awacs_reg[1]);
 114}
 115
 116
 117/*
 118 * AWACS volume callbacks
 119 */
 120/*
 121 * volumes: 0-15 stereo
 122 */
 123static int snd_pmac_awacs_info_volume(struct snd_kcontrol *kcontrol,
 124				      struct snd_ctl_elem_info *uinfo)
 125{
 126	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 127	uinfo->count = 2;
 128	uinfo->value.integer.min = 0;
 129	uinfo->value.integer.max = 15;
 130	return 0;
 131}
 132
 133static int snd_pmac_awacs_get_volume(struct snd_kcontrol *kcontrol,
 134				     struct snd_ctl_elem_value *ucontrol)
 135{
 136	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 137	int reg = kcontrol->private_value & 0xff;
 138	int lshift = (kcontrol->private_value >> 8) & 0xff;
 139	int inverted = (kcontrol->private_value >> 16) & 1;
 140	unsigned long flags;
 141	int vol[2];
 142
 143	spin_lock_irqsave(&chip->reg_lock, flags);
 144	vol[0] = (chip->awacs_reg[reg] >> lshift) & 0xf;
 145	vol[1] = chip->awacs_reg[reg] & 0xf;
 146	spin_unlock_irqrestore(&chip->reg_lock, flags);
 147	if (inverted) {
 148		vol[0] = 0x0f - vol[0];
 149		vol[1] = 0x0f - vol[1];
 150	}
 151	ucontrol->value.integer.value[0] = vol[0];
 152	ucontrol->value.integer.value[1] = vol[1];
 153	return 0;
 154}
 155
 156static int snd_pmac_awacs_put_volume(struct snd_kcontrol *kcontrol,
 157				     struct snd_ctl_elem_value *ucontrol)
 158{
 159	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 160	int reg = kcontrol->private_value & 0xff;
 161	int lshift = (kcontrol->private_value >> 8) & 0xff;
 162	int inverted = (kcontrol->private_value >> 16) & 1;
 163	int val, oldval;
 164	unsigned long flags;
 165	unsigned int vol[2];
 166
 167	vol[0] = ucontrol->value.integer.value[0];
 168	vol[1] = ucontrol->value.integer.value[1];
 169	if (vol[0] > 0x0f || vol[1] > 0x0f)
 170		return -EINVAL;
 171	if (inverted) {
 172		vol[0] = 0x0f - vol[0];
 173		vol[1] = 0x0f - vol[1];
 174	}
 175	vol[0] &= 0x0f;
 176	vol[1] &= 0x0f;
 177	spin_lock_irqsave(&chip->reg_lock, flags);
 178	oldval = chip->awacs_reg[reg];
 179	val = oldval & ~(0xf | (0xf << lshift));
 180	val |= vol[0] << lshift;
 181	val |= vol[1];
 182	if (oldval != val)
 183		snd_pmac_awacs_write_reg(chip, reg, val);
 184	spin_unlock_irqrestore(&chip->reg_lock, flags);
 185	return oldval != reg;
 186}
 187
 188
 189#define AWACS_VOLUME(xname, xreg, xshift, xinverted) \
 190{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
 191  .info = snd_pmac_awacs_info_volume, \
 192  .get = snd_pmac_awacs_get_volume, \
 193  .put = snd_pmac_awacs_put_volume, \
 194  .private_value = (xreg) | ((xshift) << 8) | ((xinverted) << 16) }
 195
 196/*
 197 * mute master/ogain for AWACS: mono
 198 */
 199static int snd_pmac_awacs_get_switch(struct snd_kcontrol *kcontrol,
 200				     struct snd_ctl_elem_value *ucontrol)
 201{
 202	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 203	int reg = kcontrol->private_value & 0xff;
 204	int shift = (kcontrol->private_value >> 8) & 0xff;
 205	int invert = (kcontrol->private_value >> 16) & 1;
 206	int val;
 207	unsigned long flags;
 208
 209	spin_lock_irqsave(&chip->reg_lock, flags);
 210	val = (chip->awacs_reg[reg] >> shift) & 1;
 211	spin_unlock_irqrestore(&chip->reg_lock, flags);
 212	if (invert)
 213		val = 1 - val;
 214	ucontrol->value.integer.value[0] = val;
 215	return 0;
 216}
 217
 218static int snd_pmac_awacs_put_switch(struct snd_kcontrol *kcontrol,
 219				     struct snd_ctl_elem_value *ucontrol)
 220{
 221	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 222	int reg = kcontrol->private_value & 0xff;
 223	int shift = (kcontrol->private_value >> 8) & 0xff;
 224	int invert = (kcontrol->private_value >> 16) & 1;
 225	int mask = 1 << shift;
 226	int val, changed;
 227	unsigned long flags;
 228
 229	spin_lock_irqsave(&chip->reg_lock, flags);
 230	val = chip->awacs_reg[reg] & ~mask;
 231	if (ucontrol->value.integer.value[0] != invert)
 232		val |= mask;
 233	changed = chip->awacs_reg[reg] != val;
 234	if (changed)
 235		snd_pmac_awacs_write_reg(chip, reg, val);
 236	spin_unlock_irqrestore(&chip->reg_lock, flags);
 237	return changed;
 238}
 239
 240#define AWACS_SWITCH(xname, xreg, xshift, xinvert) \
 241{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
 242  .info = snd_pmac_boolean_mono_info, \
 243  .get = snd_pmac_awacs_get_switch, \
 244  .put = snd_pmac_awacs_put_switch, \
 245  .private_value = (xreg) | ((xshift) << 8) | ((xinvert) << 16) }
 246
 247
 248#ifdef PMAC_AMP_AVAIL
 249/*
 250 * controls for perch/whisper extension cards, e.g. G3 desktop
 251 *
 252 * TDA7433 connected via i2c address 0x45 (= 0x8a),
 253 * accessed through cuda
 254 */
 255static void awacs_set_cuda(int reg, int val)
 256{
 257	struct adb_request req;
 258	cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC, 0x8a,
 259			reg, val);
 260	while (! req.complete)
 261		cuda_poll();
 262}
 263
 264/*
 265 * level = 0 - 14, 7 = 0 dB
 266 */
 267static void awacs_amp_set_tone(struct awacs_amp *amp, int bass, int treble)
 268{
 269	amp->amp_tone[0] = bass;
 270	amp->amp_tone[1] = treble;
 271	if (bass > 7)
 272		bass = (14 - bass) + 8;
 273	if (treble > 7)
 274		treble = (14 - treble) + 8;
 275	awacs_set_cuda(2, (bass << 4) | treble);
 276}
 277
 278/*
 279 * vol = 0 - 31 (attenuation), 32 = mute bit, stereo
 280 */
 281static int awacs_amp_set_vol(struct awacs_amp *amp, int index,
 282			     int lvol, int rvol, int do_check)
 283{
 284	if (do_check && amp->amp_vol[index][0] == lvol &&
 285			amp->amp_vol[index][1] == rvol)
 286		return 0;
 287	awacs_set_cuda(3 + index, lvol);
 288	awacs_set_cuda(5 + index, rvol);
 289	amp->amp_vol[index][0] = lvol;
 290	amp->amp_vol[index][1] = rvol;
 291	return 1;
 292}
 293
 294/*
 295 * 0 = -79 dB, 79 = 0 dB, 99 = +20 dB
 296 */
 297static void awacs_amp_set_master(struct awacs_amp *amp, int vol)
 298{
 299	amp->amp_master = vol;
 300	if (vol <= 79)
 301		vol = 32 + (79 - vol);
 302	else
 303		vol = 32 - (vol - 79);
 304	awacs_set_cuda(1, vol);
 305}
 306
 307static void awacs_amp_free(struct snd_pmac *chip)
 308{
 309	struct awacs_amp *amp = chip->mixer_data;
 310	if (!amp)
 311		return;
 312	kfree(amp);
 313	chip->mixer_data = NULL;
 314	chip->mixer_free = NULL;
 315}
 316
 317
 318/*
 319 * mixer controls
 320 */
 321static int snd_pmac_awacs_info_volume_amp(struct snd_kcontrol *kcontrol,
 322					  struct snd_ctl_elem_info *uinfo)
 323{
 324	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 325	uinfo->count = 2;
 326	uinfo->value.integer.min = 0;
 327	uinfo->value.integer.max = 31;
 328	return 0;
 329}
 330
 331static int snd_pmac_awacs_get_volume_amp(struct snd_kcontrol *kcontrol,
 332					 struct snd_ctl_elem_value *ucontrol)
 333{
 334	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 335	int index = kcontrol->private_value;
 336	struct awacs_amp *amp = chip->mixer_data;
 337
 338	ucontrol->value.integer.value[0] = 31 - (amp->amp_vol[index][0] & 31);
 339	ucontrol->value.integer.value[1] = 31 - (amp->amp_vol[index][1] & 31);
 340	return 0;
 341}
 342
 343static int snd_pmac_awacs_put_volume_amp(struct snd_kcontrol *kcontrol,
 344					 struct snd_ctl_elem_value *ucontrol)
 345{
 346	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 347	int index = kcontrol->private_value;
 348	int vol[2];
 349	struct awacs_amp *amp = chip->mixer_data;
 350
 351	vol[0] = (31 - (ucontrol->value.integer.value[0] & 31))
 352		| (amp->amp_vol[index][0] & 32);
 353	vol[1] = (31 - (ucontrol->value.integer.value[1] & 31))
 354		| (amp->amp_vol[index][1] & 32);
 355	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 356}
 357
 358static int snd_pmac_awacs_get_switch_amp(struct snd_kcontrol *kcontrol,
 359					 struct snd_ctl_elem_value *ucontrol)
 360{
 361	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 362	int index = kcontrol->private_value;
 363	struct awacs_amp *amp = chip->mixer_data;
 364
 365	ucontrol->value.integer.value[0] = (amp->amp_vol[index][0] & 32)
 366					? 0 : 1;
 367	ucontrol->value.integer.value[1] = (amp->amp_vol[index][1] & 32)
 368					? 0 : 1;
 369	return 0;
 370}
 371
 372static int snd_pmac_awacs_put_switch_amp(struct snd_kcontrol *kcontrol,
 373					 struct snd_ctl_elem_value *ucontrol)
 374{
 375	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 376	int index = kcontrol->private_value;
 377	int vol[2];
 378	struct awacs_amp *amp = chip->mixer_data;
 379
 380	vol[0] = (ucontrol->value.integer.value[0] ? 0 : 32)
 381		| (amp->amp_vol[index][0] & 31);
 382	vol[1] = (ucontrol->value.integer.value[1] ? 0 : 32)
 383		| (amp->amp_vol[index][1] & 31);
 384	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 385}
 386
 387static int snd_pmac_awacs_info_tone_amp(struct snd_kcontrol *kcontrol,
 388					struct snd_ctl_elem_info *uinfo)
 389{
 390	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 391	uinfo->count = 1;
 392	uinfo->value.integer.min = 0;
 393	uinfo->value.integer.max = 14;
 394	return 0;
 395}
 396
 397static int snd_pmac_awacs_get_tone_amp(struct snd_kcontrol *kcontrol,
 398				       struct snd_ctl_elem_value *ucontrol)
 399{
 400	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 401	int index = kcontrol->private_value;
 402	struct awacs_amp *amp = chip->mixer_data;
 403
 404	ucontrol->value.integer.value[0] = amp->amp_tone[index];
 405	return 0;
 406}
 407
 408static int snd_pmac_awacs_put_tone_amp(struct snd_kcontrol *kcontrol,
 409				       struct snd_ctl_elem_value *ucontrol)
 410{
 411	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 412	int index = kcontrol->private_value;
 413	struct awacs_amp *amp = chip->mixer_data;
 414	unsigned int val;
 415
 416	val = ucontrol->value.integer.value[0];
 417	if (val > 14)
 418		return -EINVAL;
 419	if (val != amp->amp_tone[index]) {
 420		amp->amp_tone[index] = val;
 421		awacs_amp_set_tone(amp, amp->amp_tone[0], amp->amp_tone[1]);
 422		return 1;
 423	}
 424	return 0;
 425}
 426
 427static int snd_pmac_awacs_info_master_amp(struct snd_kcontrol *kcontrol,
 428					  struct snd_ctl_elem_info *uinfo)
 429{
 430	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 431	uinfo->count = 1;
 432	uinfo->value.integer.min = 0;
 433	uinfo->value.integer.max = 99;
 434	return 0;
 435}
 436
 437static int snd_pmac_awacs_get_master_amp(struct snd_kcontrol *kcontrol,
 438					 struct snd_ctl_elem_value *ucontrol)
 439{
 440	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 441	struct awacs_amp *amp = chip->mixer_data;
 442
 443	ucontrol->value.integer.value[0] = amp->amp_master;
 444	return 0;
 445}
 446
 447static int snd_pmac_awacs_put_master_amp(struct snd_kcontrol *kcontrol,
 448					 struct snd_ctl_elem_value *ucontrol)
 449{
 450	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 451	struct awacs_amp *amp = chip->mixer_data;
 452	unsigned int val;
 453
 454	val = ucontrol->value.integer.value[0];
 455	if (val > 99)
 456		return -EINVAL;
 457	if (val != amp->amp_master) {
 458		amp->amp_master = val;
 459		awacs_amp_set_master(amp, amp->amp_master);
 460		return 1;
 461	}
 462	return 0;
 463}
 464
 465#define AMP_CH_SPK	0
 466#define AMP_CH_HD	1
 467
 468static const struct snd_kcontrol_new snd_pmac_awacs_amp_vol[] = {
 469	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 470	  .name = "Speaker Playback Volume",
 471	  .info = snd_pmac_awacs_info_volume_amp,
 472	  .get = snd_pmac_awacs_get_volume_amp,
 473	  .put = snd_pmac_awacs_put_volume_amp,
 474	  .private_value = AMP_CH_SPK,
 475	},
 476	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 477	  .name = "Headphone Playback Volume",
 478	  .info = snd_pmac_awacs_info_volume_amp,
 479	  .get = snd_pmac_awacs_get_volume_amp,
 480	  .put = snd_pmac_awacs_put_volume_amp,
 481	  .private_value = AMP_CH_HD,
 482	},
 483	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 484	  .name = "Tone Control - Bass",
 485	  .info = snd_pmac_awacs_info_tone_amp,
 486	  .get = snd_pmac_awacs_get_tone_amp,
 487	  .put = snd_pmac_awacs_put_tone_amp,
 488	  .private_value = 0,
 489	},
 490	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 491	  .name = "Tone Control - Treble",
 492	  .info = snd_pmac_awacs_info_tone_amp,
 493	  .get = snd_pmac_awacs_get_tone_amp,
 494	  .put = snd_pmac_awacs_put_tone_amp,
 495	  .private_value = 1,
 496	},
 497	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 498	  .name = "Amp Master Playback Volume",
 499	  .info = snd_pmac_awacs_info_master_amp,
 500	  .get = snd_pmac_awacs_get_master_amp,
 501	  .put = snd_pmac_awacs_put_master_amp,
 502	},
 503};
 504
 505static const struct snd_kcontrol_new snd_pmac_awacs_amp_hp_sw = {
 506	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 507	.name = "Headphone Playback Switch",
 508	.info = snd_pmac_boolean_stereo_info,
 509	.get = snd_pmac_awacs_get_switch_amp,
 510	.put = snd_pmac_awacs_put_switch_amp,
 511	.private_value = AMP_CH_HD,
 512};
 513
 514static const struct snd_kcontrol_new snd_pmac_awacs_amp_spk_sw = {
 515	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 516	.name = "Speaker Playback Switch",
 517	.info = snd_pmac_boolean_stereo_info,
 518	.get = snd_pmac_awacs_get_switch_amp,
 519	.put = snd_pmac_awacs_put_switch_amp,
 520	.private_value = AMP_CH_SPK,
 521};
 522
 523#endif /* PMAC_AMP_AVAIL */
 524
 525
 526/*
 527 * mic boost for screamer
 528 */
 529static int snd_pmac_screamer_mic_boost_info(struct snd_kcontrol *kcontrol,
 530					    struct snd_ctl_elem_info *uinfo)
 531{
 532	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 533	uinfo->count = 1;
 534	uinfo->value.integer.min = 0;
 535	uinfo->value.integer.max = 3;
 536	return 0;
 537}
 538
 539static int snd_pmac_screamer_mic_boost_get(struct snd_kcontrol *kcontrol,
 540					   struct snd_ctl_elem_value *ucontrol)
 541{
 542	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 543	int val = 0;
 544	unsigned long flags;
 545
 546	spin_lock_irqsave(&chip->reg_lock, flags);
 547	if (chip->awacs_reg[6] & MASK_MIC_BOOST)
 548		val |= 2;
 549	if (chip->awacs_reg[0] & MASK_GAINLINE)
 550		val |= 1;
 551	spin_unlock_irqrestore(&chip->reg_lock, flags);
 552	ucontrol->value.integer.value[0] = val;
 553	return 0;
 554}
 555
 556static int snd_pmac_screamer_mic_boost_put(struct snd_kcontrol *kcontrol,
 557					   struct snd_ctl_elem_value *ucontrol)
 558{
 559	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 560	int changed = 0;
 561	int val0, val6;
 562	unsigned long flags;
 563
 564	spin_lock_irqsave(&chip->reg_lock, flags);
 565	val0 = chip->awacs_reg[0] & ~MASK_GAINLINE;
 566	val6 = chip->awacs_reg[6] & ~MASK_MIC_BOOST;
 567	if (ucontrol->value.integer.value[0] & 1)
 568		val0 |= MASK_GAINLINE;
 569	if (ucontrol->value.integer.value[0] & 2)
 570		val6 |= MASK_MIC_BOOST;
 571	if (val0 != chip->awacs_reg[0]) {
 572		snd_pmac_awacs_write_reg(chip, 0, val0);
 573		changed = 1;
 574	}
 575	if (val6 != chip->awacs_reg[6]) {
 576		snd_pmac_awacs_write_reg(chip, 6, val6);
 577		changed = 1;
 578	}
 579	spin_unlock_irqrestore(&chip->reg_lock, flags);
 580	return changed;
 581}
 582
 583/*
 584 * lists of mixer elements
 585 */
 586static const struct snd_kcontrol_new snd_pmac_awacs_mixers[] = {
 587	AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
 588	AWACS_VOLUME("Master Capture Volume", 0, 4, 0),
 589/*	AWACS_SWITCH("Unknown Playback Switch", 6, SHIFT_PAROUT0, 0), */
 590};
 591
 592static const struct snd_kcontrol_new snd_pmac_screamer_mixers_beige[] = {
 593	AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
 594	AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
 595	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 596	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_LINE, 0),
 597};
 598
 599static const struct snd_kcontrol_new snd_pmac_screamer_mixers_lo[] = {
 600	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 601};
 602
 603static const struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] = {
 604	AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
 605	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 606};
 607
 608static const struct snd_kcontrol_new snd_pmac_screamer_mixers_g4agp[] = {
 609	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 610	AWACS_VOLUME("Master Playback Volume", 5, 6, 1),
 611	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 612	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 613};
 614
 615static const struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] = {
 616	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 617	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 618	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 619};
 620
 621static const struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac5500[] = {
 622	AWACS_VOLUME("Headphone Playback Volume", 2, 6, 1),
 623};
 624
 625static const struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac[] = {
 626	AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
 627	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 628};
 629
 630/* FIXME: is this correct order?
 631 * screamer (powerbook G3 pismo) seems to have different bits...
 632 */
 633static const struct snd_kcontrol_new snd_pmac_awacs_mixers2[] = {
 634	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
 635	AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
 636};
 637
 638static const struct snd_kcontrol_new snd_pmac_screamer_mixers2[] = {
 639	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 640	AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
 641};
 642
 643static const struct snd_kcontrol_new snd_pmac_awacs_mixers2_pmac5500[] = {
 644	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 645};
 646
 647static const struct snd_kcontrol_new snd_pmac_awacs_master_sw =
 648AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
 649
 650static const struct snd_kcontrol_new snd_pmac_awacs_master_sw_imac =
 651AWACS_SWITCH("Line out Playback Switch", 1, SHIFT_HDMUTE, 1);
 652
 653static const struct snd_kcontrol_new snd_pmac_awacs_master_sw_pmac5500 =
 654AWACS_SWITCH("Headphone Playback Switch", 1, SHIFT_HDMUTE, 1);
 655
 656static const struct snd_kcontrol_new snd_pmac_awacs_mic_boost[] = {
 657	AWACS_SWITCH("Mic Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 658};
 659
 660static const struct snd_kcontrol_new snd_pmac_screamer_mic_boost[] = {
 661	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 662	  .name = "Mic Boost Capture Volume",
 663	  .info = snd_pmac_screamer_mic_boost_info,
 664	  .get = snd_pmac_screamer_mic_boost_get,
 665	  .put = snd_pmac_screamer_mic_boost_put,
 666	},
 667};
 668
 669static const struct snd_kcontrol_new snd_pmac_awacs_mic_boost_pmac7500[] =
 670{
 671	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 672};
 673
 674static const struct snd_kcontrol_new snd_pmac_screamer_mic_boost_beige[] =
 675{
 676	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 677	AWACS_SWITCH("CD Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
 678};
 679
 680static const struct snd_kcontrol_new snd_pmac_screamer_mic_boost_imac[] =
 681{
 682	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 683	AWACS_SWITCH("Mic Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
 684};
 685
 686static const struct snd_kcontrol_new snd_pmac_awacs_speaker_vol[] = {
 687	AWACS_VOLUME("Speaker Playback Volume", 4, 6, 1),
 688};
 689
 690static const struct snd_kcontrol_new snd_pmac_awacs_speaker_sw =
 691AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
 692
 693static const struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac1 =
 694AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 1);
 695
 696static const struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac2 =
 697AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 0);
 698
 699
 700/*
 701 * add new mixer elements to the card
 702 */
 703static int build_mixers(struct snd_pmac *chip, int nums,
 704			const struct snd_kcontrol_new *mixers)
 705{
 706	int i, err;
 707
 708	for (i = 0; i < nums; i++) {
 709		err = snd_ctl_add(chip->card, snd_ctl_new1(&mixers[i], chip));
 710		if (err < 0)
 711			return err;
 712	}
 713	return 0;
 714}
 715
 716
 717/*
 718 * restore all registers
 719 */
 720static void awacs_restore_all_regs(struct snd_pmac *chip)
 721{
 722	snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]);
 723	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
 724	snd_pmac_awacs_write_noreg(chip, 2, chip->awacs_reg[2]);
 725	snd_pmac_awacs_write_noreg(chip, 4, chip->awacs_reg[4]);
 726	if (chip->model == PMAC_SCREAMER) {
 727		snd_pmac_awacs_write_noreg(chip, 5, chip->awacs_reg[5]);
 728		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 729		snd_pmac_awacs_write_noreg(chip, 7, chip->awacs_reg[7]);
 730	}
 731}
 732
 733#ifdef CONFIG_PM
 734static void snd_pmac_awacs_suspend(struct snd_pmac *chip)
 735{
 736	snd_pmac_awacs_write_noreg(chip, 1, (chip->awacs_reg[1]
 737					     | MASK_AMUTE | MASK_CMUTE));
 738}
 739
 740static void snd_pmac_awacs_resume(struct snd_pmac *chip)
 741{
 742	if (of_machine_is_compatible("PowerBook3,1")
 743	    || of_machine_is_compatible("PowerBook3,2")) {
 744		msleep(100);
 745		snd_pmac_awacs_write_reg(chip, 1,
 746			chip->awacs_reg[1] & ~MASK_PAROUT);
 747		msleep(300);
 748	}
 749
 750	awacs_restore_all_regs(chip);
 751	if (chip->model == PMAC_SCREAMER) {
 752		/* reset power bits in reg 6 */
 753		mdelay(5);
 754		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 755	}
 756	screamer_recalibrate(chip);
 757#ifdef PMAC_AMP_AVAIL
 758	if (chip->mixer_data) {
 759		struct awacs_amp *amp = chip->mixer_data;
 760		awacs_amp_set_vol(amp, 0,
 761				  amp->amp_vol[0][0], amp->amp_vol[0][1], 0);
 762		awacs_amp_set_vol(amp, 1,
 763				  amp->amp_vol[1][0], amp->amp_vol[1][1], 0);
 764		awacs_amp_set_tone(amp, amp->amp_tone[0], amp->amp_tone[1]);
 765		awacs_amp_set_master(amp, amp->amp_master);
 766	}
 767#endif
 768}
 769#endif /* CONFIG_PM */
 770
 771#define IS_PM7500 (of_machine_is_compatible("AAPL,7500") \
 772		|| of_machine_is_compatible("AAPL,8500") \
 773		|| of_machine_is_compatible("AAPL,9500"))
 774#define IS_PM5500 (of_machine_is_compatible("AAPL,e411"))
 775#define IS_BEIGE (of_machine_is_compatible("AAPL,Gossamer"))
 776#define IS_IMAC1 (of_machine_is_compatible("PowerMac2,1"))
 777#define IS_IMAC2 (of_machine_is_compatible("PowerMac2,2") \
 778		|| of_machine_is_compatible("PowerMac4,1"))
 779#define IS_G4AGP (of_machine_is_compatible("PowerMac3,1"))
 780#define IS_LOMBARD (of_machine_is_compatible("PowerBook1,1"))
 781
 782static int imac1, imac2;
 783
 784#ifdef PMAC_SUPPORT_AUTOMUTE
 785/*
 786 * auto-mute stuffs
 787 */
 788static int snd_pmac_awacs_detect_headphone(struct snd_pmac *chip)
 789{
 790	return (in_le32(&chip->awacs->codec_stat) & chip->hp_stat_mask) ? 1 : 0;
 791}
 792
 793#ifdef PMAC_AMP_AVAIL
 794static int toggle_amp_mute(struct awacs_amp *amp, int index, int mute)
 795{
 796	int vol[2];
 797	vol[0] = amp->amp_vol[index][0] & 31;
 798	vol[1] = amp->amp_vol[index][1] & 31;
 799	if (mute) {
 800		vol[0] |= 32;
 801		vol[1] |= 32;
 802	}
 803	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 804}
 805#endif
 806
 807static void snd_pmac_awacs_update_automute(struct snd_pmac *chip, int do_notify)
 808{
 809	if (chip->auto_mute) {
 810#ifdef PMAC_AMP_AVAIL
 811		if (chip->mixer_data) {
 812			struct awacs_amp *amp = chip->mixer_data;
 813			int changed;
 814			if (snd_pmac_awacs_detect_headphone(chip)) {
 815				changed = toggle_amp_mute(amp, AMP_CH_HD, 0);
 816				changed |= toggle_amp_mute(amp, AMP_CH_SPK, 1);
 817			} else {
 818				changed = toggle_amp_mute(amp, AMP_CH_HD, 1);
 819				changed |= toggle_amp_mute(amp, AMP_CH_SPK, 0);
 820			}
 821			if (do_notify && ! changed)
 822				return;
 823		} else
 824#endif
 825		{
 826			int reg = chip->awacs_reg[1]
 827				| (MASK_HDMUTE | MASK_SPKMUTE);
 828			if (imac1) {
 829				reg &= ~MASK_SPKMUTE;
 830				reg |= MASK_PAROUT1;
 831			} else if (imac2) {
 832				reg &= ~MASK_SPKMUTE;
 833				reg &= ~MASK_PAROUT1;
 834			}
 835			if (snd_pmac_awacs_detect_headphone(chip))
 836				reg &= ~MASK_HDMUTE;
 837			else if (imac1)
 838				reg &= ~MASK_PAROUT1;
 839			else if (imac2)
 840				reg |= MASK_PAROUT1;
 841			else
 842				reg &= ~MASK_SPKMUTE;
 843			if (do_notify && reg == chip->awacs_reg[1])
 844				return;
 845			snd_pmac_awacs_write_reg(chip, 1, reg);
 846		}
 847		if (do_notify) {
 848			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 849				       &chip->master_sw_ctl->id);
 850			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 851				       &chip->speaker_sw_ctl->id);
 852			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 853				       &chip->hp_detect_ctl->id);
 854		}
 855	}
 856}
 857#endif /* PMAC_SUPPORT_AUTOMUTE */
 858
 859
 860/*
 861 * initialize chip
 862 */
 863int
 864snd_pmac_awacs_init(struct snd_pmac *chip)
 865{
 866	int pm7500 = IS_PM7500;
 867	int pm5500 = IS_PM5500;
 868	int beige = IS_BEIGE;
 869	int g4agp = IS_G4AGP;
 870	int lombard = IS_LOMBARD;
 871	int imac;
 872	int err, vol;
 873	struct snd_kcontrol *vmaster_sw, *vmaster_vol;
 874	struct snd_kcontrol *master_vol, *speaker_vol;
 875
 876	imac1 = IS_IMAC1;
 877	imac2 = IS_IMAC2;
 878	imac = imac1 || imac2;
 879	/* looks like MASK_GAINLINE triggers something, so we set here
 880	 * as start-up
 881	 */
 882	chip->awacs_reg[0] = MASK_MUX_CD | 0xff | MASK_GAINLINE;
 883	chip->awacs_reg[1] = MASK_CMUTE | MASK_AMUTE;
 884	/* FIXME: Only machines with external SRS module need MASK_PAROUT */
 885	if (chip->has_iic || chip->device_id == 0x5 ||
 886	    /* chip->_device_id == 0x8 || */
 887	    chip->device_id == 0xb)
 888		chip->awacs_reg[1] |= MASK_PAROUT;
 889	/* get default volume from nvram */
 890	// vol = (~nvram_read_byte(0x1308) & 7) << 1;
 891	// vol = ((pmac_xpram_read( 8 ) & 7 ) << 1 );
 892	vol = 0x0f; /* no, on alsa, muted as default */
 893	vol = vol + (vol << 6);
 894	chip->awacs_reg[2] = vol;
 895	chip->awacs_reg[4] = vol;
 896	if (chip->model == PMAC_SCREAMER) {
 897		/* FIXME: screamer has loopthru vol control */
 898		chip->awacs_reg[5] = vol;
 899		/* FIXME: maybe should be vol << 3 for PCMCIA speaker */
 900		chip->awacs_reg[6] = MASK_MIC_BOOST;
 901		chip->awacs_reg[7] = 0;
 902	}
 903
 904	awacs_restore_all_regs(chip);
 905	chip->manufacturer = (in_le32(&chip->awacs->codec_stat) >> 8) & 0xf;
 906	screamer_recalibrate(chip);
 907
 908	chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf;
 909#ifdef PMAC_AMP_AVAIL
 910	if (chip->revision == 3 && chip->has_iic && CHECK_CUDA_AMP()) {
 911		struct awacs_amp *amp = kzalloc(sizeof(*amp), GFP_KERNEL);
 912		if (! amp)
 913			return -ENOMEM;
 914		chip->mixer_data = amp;
 915		chip->mixer_free = awacs_amp_free;
 916		/* mute and zero vol */
 917		awacs_amp_set_vol(amp, 0, 63, 63, 0);
 918		awacs_amp_set_vol(amp, 1, 63, 63, 0);
 919		awacs_amp_set_tone(amp, 7, 7); /* 0 dB */
 920		awacs_amp_set_master(amp, 79); /* 0 dB */
 921	}
 922#endif /* PMAC_AMP_AVAIL */
 923
 924	if (chip->hp_stat_mask == 0) {
 925		/* set headphone-jack detection bit */
 926		switch (chip->model) {
 927		case PMAC_AWACS:
 928			chip->hp_stat_mask = pm7500 || pm5500 ? MASK_HDPCONN
 929				: MASK_LOCONN;
 930			break;
 931		case PMAC_SCREAMER:
 932			switch (chip->device_id) {
 933			case 0x08:
 934			case 0x0B:
 935				chip->hp_stat_mask = imac
 936					? MASK_LOCONN_IMAC |
 937					MASK_HDPLCONN_IMAC |
 938					MASK_HDPRCONN_IMAC
 939					: MASK_HDPCONN;
 940				break;
 941			case 0x00:
 942			case 0x05:
 943				chip->hp_stat_mask = MASK_LOCONN;
 944				break;
 945			default:
 946				chip->hp_stat_mask = MASK_HDPCONN;
 947				break;
 948			}
 949			break;
 950		default:
 951			snd_BUG();
 952			break;
 953		}
 954	}
 955
 956	/*
 957	 * build mixers
 958	 */
 959	strcpy(chip->card->mixername, "PowerMac AWACS");
 960
 961	err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers),
 962				snd_pmac_awacs_mixers);
 963	if (err < 0)
 964		return err;
 965	if (beige || g4agp)
 966		;
 967	else if (chip->model == PMAC_SCREAMER || pm5500)
 968		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2),
 969				   snd_pmac_screamer_mixers2);
 970	else if (!pm7500)
 971		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers2),
 972				   snd_pmac_awacs_mixers2);
 973	if (err < 0)
 974		return err;
 975	if (pm5500) {
 976		err = build_mixers(chip,
 977				   ARRAY_SIZE(snd_pmac_awacs_mixers2_pmac5500),
 978				   snd_pmac_awacs_mixers2_pmac5500);
 979		if (err < 0)
 980			return err;
 981	}
 982	master_vol = NULL;
 983	if (pm7500)
 984		err = build_mixers(chip,
 985				   ARRAY_SIZE(snd_pmac_awacs_mixers_pmac7500),
 986				   snd_pmac_awacs_mixers_pmac7500);
 987	else if (pm5500)
 988		err = snd_ctl_add(chip->card,
 989		    (master_vol = snd_ctl_new1(snd_pmac_awacs_mixers_pmac5500,
 990						chip)));
 991	else if (beige)
 992		err = build_mixers(chip,
 993				   ARRAY_SIZE(snd_pmac_screamer_mixers_beige),
 994				   snd_pmac_screamer_mixers_beige);
 995	else if (imac || lombard) {
 996		err = snd_ctl_add(chip->card,
 997		    (master_vol = snd_ctl_new1(snd_pmac_screamer_mixers_lo,
 998						chip)));
 999		if (err < 0)
1000			return err;
1001		err = build_mixers(chip,
1002				   ARRAY_SIZE(snd_pmac_screamer_mixers_imac),
1003				   snd_pmac_screamer_mixers_imac);
1004	} else if (g4agp)
1005		err = build_mixers(chip,
1006				   ARRAY_SIZE(snd_pmac_screamer_mixers_g4agp),
1007				   snd_pmac_screamer_mixers_g4agp);
1008	else
1009		err = build_mixers(chip,
1010				   ARRAY_SIZE(snd_pmac_awacs_mixers_pmac),
1011				   snd_pmac_awacs_mixers_pmac);
1012	if (err < 0)
1013		return err;
1014	chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac || g4agp || lombard)
1015			? &snd_pmac_awacs_master_sw_imac
1016			: pm5500
1017			? &snd_pmac_awacs_master_sw_pmac5500
1018			: &snd_pmac_awacs_master_sw, chip);
1019	err = snd_ctl_add(chip->card, chip->master_sw_ctl);
1020	if (err < 0)
1021		return err;
1022#ifdef PMAC_AMP_AVAIL
1023	if (chip->mixer_data) {
1024		/* use amplifier.  the signal is connected from route A
1025		 * to the amp.  the amp has its headphone and speaker
1026		 * volumes and mute switches, so we use them instead of
1027		 * screamer registers.
1028		 * in this case, it seems the route C is not used.
1029		 */
1030		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_amp_vol),
1031					snd_pmac_awacs_amp_vol);
1032		if (err < 0)
1033			return err;
1034		/* overwrite */
1035		chip->master_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_amp_hp_sw,
1036							chip);
1037		err = snd_ctl_add(chip->card, chip->master_sw_ctl);
1038		if (err < 0)
1039			return err;
1040		chip->speaker_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_amp_spk_sw,
1041							chip);
1042		err = snd_ctl_add(chip->card, chip->speaker_sw_ctl);
1043		if (err < 0)
1044			return err;
1045	} else
1046#endif /* PMAC_AMP_AVAIL */
1047	{
1048		/* route A = headphone, route C = speaker */
1049		err = snd_ctl_add(chip->card,
1050		    (speaker_vol = snd_ctl_new1(snd_pmac_awacs_speaker_vol,
1051						chip)));
1052		if (err < 0)
1053			return err;
1054		chip->speaker_sw_ctl = snd_ctl_new1(imac1
1055				? &snd_pmac_awacs_speaker_sw_imac1
1056				: imac2
1057				? &snd_pmac_awacs_speaker_sw_imac2
1058				: &snd_pmac_awacs_speaker_sw, chip);
1059		err = snd_ctl_add(chip->card, chip->speaker_sw_ctl);
1060		if (err < 0)
1061			return err;
1062	}
1063
1064	if (pm5500 || imac || lombard) {
1065		vmaster_sw = snd_ctl_make_virtual_master(
1066			"Master Playback Switch", (unsigned int *) NULL);
1067		err = snd_ctl_add_follower_uncached(vmaster_sw,
1068						    chip->master_sw_ctl);
1069		if (err < 0)
1070			return err;
1071		err = snd_ctl_add_follower_uncached(vmaster_sw,
1072						    chip->speaker_sw_ctl);
1073		if (err < 0)
1074			return err;
1075		err = snd_ctl_add(chip->card, vmaster_sw);
1076		if (err < 0)
1077			return err;
1078		vmaster_vol = snd_ctl_make_virtual_master(
1079			"Master Playback Volume", (unsigned int *) NULL);
1080		err = snd_ctl_add_follower(vmaster_vol, master_vol);
1081		if (err < 0)
1082			return err;
1083		err = snd_ctl_add_follower(vmaster_vol, speaker_vol);
1084		if (err < 0)
1085			return err;
1086		err = snd_ctl_add(chip->card, vmaster_vol);
1087		if (err < 0)
1088			return err;
1089	}
1090
1091	if (beige || g4agp)
1092		err = build_mixers(chip,
1093				ARRAY_SIZE(snd_pmac_screamer_mic_boost_beige),
1094				snd_pmac_screamer_mic_boost_beige);
1095	else if (imac)
1096		err = build_mixers(chip,
1097				ARRAY_SIZE(snd_pmac_screamer_mic_boost_imac),
1098				snd_pmac_screamer_mic_boost_imac);
1099	else if (chip->model == PMAC_SCREAMER)
1100		err = build_mixers(chip,
1101				ARRAY_SIZE(snd_pmac_screamer_mic_boost),
1102				snd_pmac_screamer_mic_boost);
1103	else if (pm7500)
1104		err = build_mixers(chip,
1105				ARRAY_SIZE(snd_pmac_awacs_mic_boost_pmac7500),
1106				snd_pmac_awacs_mic_boost_pmac7500);
1107	else
1108		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mic_boost),
1109				snd_pmac_awacs_mic_boost);
1110	if (err < 0)
1111		return err;
1112
1113	/*
1114	 * set lowlevel callbacks
1115	 */
1116	chip->set_format = snd_pmac_awacs_set_format;
1117#ifdef CONFIG_PM
1118	chip->suspend = snd_pmac_awacs_suspend;
1119	chip->resume = snd_pmac_awacs_resume;
1120#endif
1121#ifdef PMAC_SUPPORT_AUTOMUTE
1122	err = snd_pmac_add_automute(chip);
1123	if (err < 0)
1124		return err;
1125	chip->detect_headphone = snd_pmac_awacs_detect_headphone;
1126	chip->update_automute = snd_pmac_awacs_update_automute;
1127	snd_pmac_awacs_update_automute(chip, 0); /* update the status only */
1128#endif
1129	if (chip->model == PMAC_SCREAMER) {
1130		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
1131		snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]);
1132	}
1133
1134	return 0;
1135}
v4.6
 
   1/*
   2 * PMac AWACS lowlevel functions
   3 *
   4 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
   5 * code based on dmasound.c.
   6 *
   7 *   This program is free software; you can redistribute it and/or modify
   8 *   it under the terms of the GNU General Public License as published by
   9 *   the Free Software Foundation; either version 2 of the License, or
  10 *   (at your option) any later version.
  11 *
  12 *   This program is distributed in the hope that it will be useful,
  13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 *   GNU General Public License for more details.
  16 *
  17 *   You should have received a copy of the GNU General Public License
  18 *   along with this program; if not, write to the Free Software
  19 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20 */
  21
  22
  23#include <linux/io.h>
  24#include <asm/nvram.h>
  25#include <linux/init.h>
  26#include <linux/delay.h>
 
  27#include <linux/slab.h>
  28#include <sound/core.h>
  29#include "pmac.h"
  30
  31
  32#ifdef CONFIG_ADB_CUDA
  33#define PMAC_AMP_AVAIL
  34#endif
  35
  36#ifdef PMAC_AMP_AVAIL
  37struct awacs_amp {
  38	unsigned char amp_master;
  39	unsigned char amp_vol[2][2];
  40	unsigned char amp_tone[2];
  41};
  42
  43#define CHECK_CUDA_AMP() (sys_ctrler == SYS_CTRLER_CUDA)
  44
  45#endif /* PMAC_AMP_AVAIL */
  46
  47
  48static void snd_pmac_screamer_wait(struct snd_pmac *chip)
  49{
  50	long timeout = 2000;
  51	while (!(in_le32(&chip->awacs->codec_stat) & MASK_VALID)) {
  52		mdelay(1);
  53		if (! --timeout) {
  54			snd_printd("snd_pmac_screamer_wait timeout\n");
  55			break;
  56		}
  57	}
  58}
  59
  60/*
  61 * write AWACS register
  62 */
  63static void
  64snd_pmac_awacs_write(struct snd_pmac *chip, int val)
  65{
  66	long timeout = 5000000;
  67
  68	if (chip->model == PMAC_SCREAMER)
  69		snd_pmac_screamer_wait(chip);
  70	out_le32(&chip->awacs->codec_ctrl, val | (chip->subframe << 22));
  71	while (in_le32(&chip->awacs->codec_ctrl) & MASK_NEWECMD) {
  72		if (! --timeout) {
  73			snd_printd("snd_pmac_awacs_write timeout\n");
  74			break;
  75		}
  76	}
  77}
  78
  79static void
  80snd_pmac_awacs_write_reg(struct snd_pmac *chip, int reg, int val)
  81{
  82	snd_pmac_awacs_write(chip, val | (reg << 12));
  83	chip->awacs_reg[reg] = val;
  84}
  85
  86static void
  87snd_pmac_awacs_write_noreg(struct snd_pmac *chip, int reg, int val)
  88{
  89	snd_pmac_awacs_write(chip, val | (reg << 12));
  90}
  91
  92#ifdef CONFIG_PM
  93/* Recalibrate chip */
  94static void screamer_recalibrate(struct snd_pmac *chip)
  95{
  96	if (chip->model != PMAC_SCREAMER)
  97		return;
  98
  99	/* Sorry for the horrible delays... I hope to get that improved
 100	 * by making the whole PM process asynchronous in a future version
 101	 */
 102	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
 103	if (chip->manufacturer == 0x1)
 104		/* delay for broken crystal part */
 105		msleep(750);
 106	snd_pmac_awacs_write_noreg(chip, 1,
 107				   chip->awacs_reg[1] | MASK_RECALIBRATE |
 108				   MASK_CMUTE | MASK_AMUTE);
 109	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
 110	snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 111}
 112
 113#else
 114#define screamer_recalibrate(chip) /* NOP */
 115#endif
 116
 117
 118/*
 119 * additional callback to set the pcm format
 120 */
 121static void snd_pmac_awacs_set_format(struct snd_pmac *chip)
 122{
 123	chip->awacs_reg[1] &= ~MASK_SAMPLERATE;
 124	chip->awacs_reg[1] |= chip->rate_index << 3;
 125	snd_pmac_awacs_write_reg(chip, 1, chip->awacs_reg[1]);
 126}
 127
 128
 129/*
 130 * AWACS volume callbacks
 131 */
 132/*
 133 * volumes: 0-15 stereo
 134 */
 135static int snd_pmac_awacs_info_volume(struct snd_kcontrol *kcontrol,
 136				      struct snd_ctl_elem_info *uinfo)
 137{
 138	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 139	uinfo->count = 2;
 140	uinfo->value.integer.min = 0;
 141	uinfo->value.integer.max = 15;
 142	return 0;
 143}
 144
 145static int snd_pmac_awacs_get_volume(struct snd_kcontrol *kcontrol,
 146				     struct snd_ctl_elem_value *ucontrol)
 147{
 148	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 149	int reg = kcontrol->private_value & 0xff;
 150	int lshift = (kcontrol->private_value >> 8) & 0xff;
 151	int inverted = (kcontrol->private_value >> 16) & 1;
 152	unsigned long flags;
 153	int vol[2];
 154
 155	spin_lock_irqsave(&chip->reg_lock, flags);
 156	vol[0] = (chip->awacs_reg[reg] >> lshift) & 0xf;
 157	vol[1] = chip->awacs_reg[reg] & 0xf;
 158	spin_unlock_irqrestore(&chip->reg_lock, flags);
 159	if (inverted) {
 160		vol[0] = 0x0f - vol[0];
 161		vol[1] = 0x0f - vol[1];
 162	}
 163	ucontrol->value.integer.value[0] = vol[0];
 164	ucontrol->value.integer.value[1] = vol[1];
 165	return 0;
 166}
 167
 168static int snd_pmac_awacs_put_volume(struct snd_kcontrol *kcontrol,
 169				     struct snd_ctl_elem_value *ucontrol)
 170{
 171	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 172	int reg = kcontrol->private_value & 0xff;
 173	int lshift = (kcontrol->private_value >> 8) & 0xff;
 174	int inverted = (kcontrol->private_value >> 16) & 1;
 175	int val, oldval;
 176	unsigned long flags;
 177	unsigned int vol[2];
 178
 179	vol[0] = ucontrol->value.integer.value[0];
 180	vol[1] = ucontrol->value.integer.value[1];
 181	if (vol[0] > 0x0f || vol[1] > 0x0f)
 182		return -EINVAL;
 183	if (inverted) {
 184		vol[0] = 0x0f - vol[0];
 185		vol[1] = 0x0f - vol[1];
 186	}
 187	vol[0] &= 0x0f;
 188	vol[1] &= 0x0f;
 189	spin_lock_irqsave(&chip->reg_lock, flags);
 190	oldval = chip->awacs_reg[reg];
 191	val = oldval & ~(0xf | (0xf << lshift));
 192	val |= vol[0] << lshift;
 193	val |= vol[1];
 194	if (oldval != val)
 195		snd_pmac_awacs_write_reg(chip, reg, val);
 196	spin_unlock_irqrestore(&chip->reg_lock, flags);
 197	return oldval != reg;
 198}
 199
 200
 201#define AWACS_VOLUME(xname, xreg, xshift, xinverted) \
 202{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
 203  .info = snd_pmac_awacs_info_volume, \
 204  .get = snd_pmac_awacs_get_volume, \
 205  .put = snd_pmac_awacs_put_volume, \
 206  .private_value = (xreg) | ((xshift) << 8) | ((xinverted) << 16) }
 207
 208/*
 209 * mute master/ogain for AWACS: mono
 210 */
 211static int snd_pmac_awacs_get_switch(struct snd_kcontrol *kcontrol,
 212				     struct snd_ctl_elem_value *ucontrol)
 213{
 214	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 215	int reg = kcontrol->private_value & 0xff;
 216	int shift = (kcontrol->private_value >> 8) & 0xff;
 217	int invert = (kcontrol->private_value >> 16) & 1;
 218	int val;
 219	unsigned long flags;
 220
 221	spin_lock_irqsave(&chip->reg_lock, flags);
 222	val = (chip->awacs_reg[reg] >> shift) & 1;
 223	spin_unlock_irqrestore(&chip->reg_lock, flags);
 224	if (invert)
 225		val = 1 - val;
 226	ucontrol->value.integer.value[0] = val;
 227	return 0;
 228}
 229
 230static int snd_pmac_awacs_put_switch(struct snd_kcontrol *kcontrol,
 231				     struct snd_ctl_elem_value *ucontrol)
 232{
 233	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 234	int reg = kcontrol->private_value & 0xff;
 235	int shift = (kcontrol->private_value >> 8) & 0xff;
 236	int invert = (kcontrol->private_value >> 16) & 1;
 237	int mask = 1 << shift;
 238	int val, changed;
 239	unsigned long flags;
 240
 241	spin_lock_irqsave(&chip->reg_lock, flags);
 242	val = chip->awacs_reg[reg] & ~mask;
 243	if (ucontrol->value.integer.value[0] != invert)
 244		val |= mask;
 245	changed = chip->awacs_reg[reg] != val;
 246	if (changed)
 247		snd_pmac_awacs_write_reg(chip, reg, val);
 248	spin_unlock_irqrestore(&chip->reg_lock, flags);
 249	return changed;
 250}
 251
 252#define AWACS_SWITCH(xname, xreg, xshift, xinvert) \
 253{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
 254  .info = snd_pmac_boolean_mono_info, \
 255  .get = snd_pmac_awacs_get_switch, \
 256  .put = snd_pmac_awacs_put_switch, \
 257  .private_value = (xreg) | ((xshift) << 8) | ((xinvert) << 16) }
 258
 259
 260#ifdef PMAC_AMP_AVAIL
 261/*
 262 * controls for perch/whisper extension cards, e.g. G3 desktop
 263 *
 264 * TDA7433 connected via i2c address 0x45 (= 0x8a),
 265 * accessed through cuda
 266 */
 267static void awacs_set_cuda(int reg, int val)
 268{
 269	struct adb_request req;
 270	cuda_request(&req, NULL, 5, CUDA_PACKET, CUDA_GET_SET_IIC, 0x8a,
 271			reg, val);
 272	while (! req.complete)
 273		cuda_poll();
 274}
 275
 276/*
 277 * level = 0 - 14, 7 = 0 dB
 278 */
 279static void awacs_amp_set_tone(struct awacs_amp *amp, int bass, int treble)
 280{
 281	amp->amp_tone[0] = bass;
 282	amp->amp_tone[1] = treble;
 283	if (bass > 7)
 284		bass = (14 - bass) + 8;
 285	if (treble > 7)
 286		treble = (14 - treble) + 8;
 287	awacs_set_cuda(2, (bass << 4) | treble);
 288}
 289
 290/*
 291 * vol = 0 - 31 (attenuation), 32 = mute bit, stereo
 292 */
 293static int awacs_amp_set_vol(struct awacs_amp *amp, int index,
 294			     int lvol, int rvol, int do_check)
 295{
 296	if (do_check && amp->amp_vol[index][0] == lvol &&
 297			amp->amp_vol[index][1] == rvol)
 298		return 0;
 299	awacs_set_cuda(3 + index, lvol);
 300	awacs_set_cuda(5 + index, rvol);
 301	amp->amp_vol[index][0] = lvol;
 302	amp->amp_vol[index][1] = rvol;
 303	return 1;
 304}
 305
 306/*
 307 * 0 = -79 dB, 79 = 0 dB, 99 = +20 dB
 308 */
 309static void awacs_amp_set_master(struct awacs_amp *amp, int vol)
 310{
 311	amp->amp_master = vol;
 312	if (vol <= 79)
 313		vol = 32 + (79 - vol);
 314	else
 315		vol = 32 - (vol - 79);
 316	awacs_set_cuda(1, vol);
 317}
 318
 319static void awacs_amp_free(struct snd_pmac *chip)
 320{
 321	struct awacs_amp *amp = chip->mixer_data;
 322	if (!amp)
 323		return;
 324	kfree(amp);
 325	chip->mixer_data = NULL;
 326	chip->mixer_free = NULL;
 327}
 328
 329
 330/*
 331 * mixer controls
 332 */
 333static int snd_pmac_awacs_info_volume_amp(struct snd_kcontrol *kcontrol,
 334					  struct snd_ctl_elem_info *uinfo)
 335{
 336	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 337	uinfo->count = 2;
 338	uinfo->value.integer.min = 0;
 339	uinfo->value.integer.max = 31;
 340	return 0;
 341}
 342
 343static int snd_pmac_awacs_get_volume_amp(struct snd_kcontrol *kcontrol,
 344					 struct snd_ctl_elem_value *ucontrol)
 345{
 346	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 347	int index = kcontrol->private_value;
 348	struct awacs_amp *amp = chip->mixer_data;
 349
 350	ucontrol->value.integer.value[0] = 31 - (amp->amp_vol[index][0] & 31);
 351	ucontrol->value.integer.value[1] = 31 - (amp->amp_vol[index][1] & 31);
 352	return 0;
 353}
 354
 355static int snd_pmac_awacs_put_volume_amp(struct snd_kcontrol *kcontrol,
 356					 struct snd_ctl_elem_value *ucontrol)
 357{
 358	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 359	int index = kcontrol->private_value;
 360	int vol[2];
 361	struct awacs_amp *amp = chip->mixer_data;
 362
 363	vol[0] = (31 - (ucontrol->value.integer.value[0] & 31))
 364		| (amp->amp_vol[index][0] & 32);
 365	vol[1] = (31 - (ucontrol->value.integer.value[1] & 31))
 366		| (amp->amp_vol[index][1] & 32);
 367	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 368}
 369
 370static int snd_pmac_awacs_get_switch_amp(struct snd_kcontrol *kcontrol,
 371					 struct snd_ctl_elem_value *ucontrol)
 372{
 373	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 374	int index = kcontrol->private_value;
 375	struct awacs_amp *amp = chip->mixer_data;
 376
 377	ucontrol->value.integer.value[0] = (amp->amp_vol[index][0] & 32)
 378					? 0 : 1;
 379	ucontrol->value.integer.value[1] = (amp->amp_vol[index][1] & 32)
 380					? 0 : 1;
 381	return 0;
 382}
 383
 384static int snd_pmac_awacs_put_switch_amp(struct snd_kcontrol *kcontrol,
 385					 struct snd_ctl_elem_value *ucontrol)
 386{
 387	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 388	int index = kcontrol->private_value;
 389	int vol[2];
 390	struct awacs_amp *amp = chip->mixer_data;
 391
 392	vol[0] = (ucontrol->value.integer.value[0] ? 0 : 32)
 393		| (amp->amp_vol[index][0] & 31);
 394	vol[1] = (ucontrol->value.integer.value[1] ? 0 : 32)
 395		| (amp->amp_vol[index][1] & 31);
 396	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 397}
 398
 399static int snd_pmac_awacs_info_tone_amp(struct snd_kcontrol *kcontrol,
 400					struct snd_ctl_elem_info *uinfo)
 401{
 402	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 403	uinfo->count = 1;
 404	uinfo->value.integer.min = 0;
 405	uinfo->value.integer.max = 14;
 406	return 0;
 407}
 408
 409static int snd_pmac_awacs_get_tone_amp(struct snd_kcontrol *kcontrol,
 410				       struct snd_ctl_elem_value *ucontrol)
 411{
 412	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 413	int index = kcontrol->private_value;
 414	struct awacs_amp *amp = chip->mixer_data;
 415
 416	ucontrol->value.integer.value[0] = amp->amp_tone[index];
 417	return 0;
 418}
 419
 420static int snd_pmac_awacs_put_tone_amp(struct snd_kcontrol *kcontrol,
 421				       struct snd_ctl_elem_value *ucontrol)
 422{
 423	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 424	int index = kcontrol->private_value;
 425	struct awacs_amp *amp = chip->mixer_data;
 426	unsigned int val;
 427
 428	val = ucontrol->value.integer.value[0];
 429	if (val > 14)
 430		return -EINVAL;
 431	if (val != amp->amp_tone[index]) {
 432		amp->amp_tone[index] = val;
 433		awacs_amp_set_tone(amp, amp->amp_tone[0], amp->amp_tone[1]);
 434		return 1;
 435	}
 436	return 0;
 437}
 438
 439static int snd_pmac_awacs_info_master_amp(struct snd_kcontrol *kcontrol,
 440					  struct snd_ctl_elem_info *uinfo)
 441{
 442	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 443	uinfo->count = 1;
 444	uinfo->value.integer.min = 0;
 445	uinfo->value.integer.max = 99;
 446	return 0;
 447}
 448
 449static int snd_pmac_awacs_get_master_amp(struct snd_kcontrol *kcontrol,
 450					 struct snd_ctl_elem_value *ucontrol)
 451{
 452	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 453	struct awacs_amp *amp = chip->mixer_data;
 454
 455	ucontrol->value.integer.value[0] = amp->amp_master;
 456	return 0;
 457}
 458
 459static int snd_pmac_awacs_put_master_amp(struct snd_kcontrol *kcontrol,
 460					 struct snd_ctl_elem_value *ucontrol)
 461{
 462	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 463	struct awacs_amp *amp = chip->mixer_data;
 464	unsigned int val;
 465
 466	val = ucontrol->value.integer.value[0];
 467	if (val > 99)
 468		return -EINVAL;
 469	if (val != amp->amp_master) {
 470		amp->amp_master = val;
 471		awacs_amp_set_master(amp, amp->amp_master);
 472		return 1;
 473	}
 474	return 0;
 475}
 476
 477#define AMP_CH_SPK	0
 478#define AMP_CH_HD	1
 479
 480static struct snd_kcontrol_new snd_pmac_awacs_amp_vol[] = {
 481	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 482	  .name = "Speaker Playback Volume",
 483	  .info = snd_pmac_awacs_info_volume_amp,
 484	  .get = snd_pmac_awacs_get_volume_amp,
 485	  .put = snd_pmac_awacs_put_volume_amp,
 486	  .private_value = AMP_CH_SPK,
 487	},
 488	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 489	  .name = "Headphone Playback Volume",
 490	  .info = snd_pmac_awacs_info_volume_amp,
 491	  .get = snd_pmac_awacs_get_volume_amp,
 492	  .put = snd_pmac_awacs_put_volume_amp,
 493	  .private_value = AMP_CH_HD,
 494	},
 495	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 496	  .name = "Tone Control - Bass",
 497	  .info = snd_pmac_awacs_info_tone_amp,
 498	  .get = snd_pmac_awacs_get_tone_amp,
 499	  .put = snd_pmac_awacs_put_tone_amp,
 500	  .private_value = 0,
 501	},
 502	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 503	  .name = "Tone Control - Treble",
 504	  .info = snd_pmac_awacs_info_tone_amp,
 505	  .get = snd_pmac_awacs_get_tone_amp,
 506	  .put = snd_pmac_awacs_put_tone_amp,
 507	  .private_value = 1,
 508	},
 509	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 510	  .name = "Amp Master Playback Volume",
 511	  .info = snd_pmac_awacs_info_master_amp,
 512	  .get = snd_pmac_awacs_get_master_amp,
 513	  .put = snd_pmac_awacs_put_master_amp,
 514	},
 515};
 516
 517static struct snd_kcontrol_new snd_pmac_awacs_amp_hp_sw = {
 518	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 519	.name = "Headphone Playback Switch",
 520	.info = snd_pmac_boolean_stereo_info,
 521	.get = snd_pmac_awacs_get_switch_amp,
 522	.put = snd_pmac_awacs_put_switch_amp,
 523	.private_value = AMP_CH_HD,
 524};
 525
 526static struct snd_kcontrol_new snd_pmac_awacs_amp_spk_sw = {
 527	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 528	.name = "Speaker Playback Switch",
 529	.info = snd_pmac_boolean_stereo_info,
 530	.get = snd_pmac_awacs_get_switch_amp,
 531	.put = snd_pmac_awacs_put_switch_amp,
 532	.private_value = AMP_CH_SPK,
 533};
 534
 535#endif /* PMAC_AMP_AVAIL */
 536
 537
 538/*
 539 * mic boost for screamer
 540 */
 541static int snd_pmac_screamer_mic_boost_info(struct snd_kcontrol *kcontrol,
 542					    struct snd_ctl_elem_info *uinfo)
 543{
 544	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 545	uinfo->count = 1;
 546	uinfo->value.integer.min = 0;
 547	uinfo->value.integer.max = 3;
 548	return 0;
 549}
 550
 551static int snd_pmac_screamer_mic_boost_get(struct snd_kcontrol *kcontrol,
 552					   struct snd_ctl_elem_value *ucontrol)
 553{
 554	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 555	int val = 0;
 556	unsigned long flags;
 557
 558	spin_lock_irqsave(&chip->reg_lock, flags);
 559	if (chip->awacs_reg[6] & MASK_MIC_BOOST)
 560		val |= 2;
 561	if (chip->awacs_reg[0] & MASK_GAINLINE)
 562		val |= 1;
 563	spin_unlock_irqrestore(&chip->reg_lock, flags);
 564	ucontrol->value.integer.value[0] = val;
 565	return 0;
 566}
 567
 568static int snd_pmac_screamer_mic_boost_put(struct snd_kcontrol *kcontrol,
 569					   struct snd_ctl_elem_value *ucontrol)
 570{
 571	struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
 572	int changed = 0;
 573	int val0, val6;
 574	unsigned long flags;
 575
 576	spin_lock_irqsave(&chip->reg_lock, flags);
 577	val0 = chip->awacs_reg[0] & ~MASK_GAINLINE;
 578	val6 = chip->awacs_reg[6] & ~MASK_MIC_BOOST;
 579	if (ucontrol->value.integer.value[0] & 1)
 580		val0 |= MASK_GAINLINE;
 581	if (ucontrol->value.integer.value[0] & 2)
 582		val6 |= MASK_MIC_BOOST;
 583	if (val0 != chip->awacs_reg[0]) {
 584		snd_pmac_awacs_write_reg(chip, 0, val0);
 585		changed = 1;
 586	}
 587	if (val6 != chip->awacs_reg[6]) {
 588		snd_pmac_awacs_write_reg(chip, 6, val6);
 589		changed = 1;
 590	}
 591	spin_unlock_irqrestore(&chip->reg_lock, flags);
 592	return changed;
 593}
 594
 595/*
 596 * lists of mixer elements
 597 */
 598static struct snd_kcontrol_new snd_pmac_awacs_mixers[] = {
 599	AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
 600	AWACS_VOLUME("Master Capture Volume", 0, 4, 0),
 601/*	AWACS_SWITCH("Unknown Playback Switch", 6, SHIFT_PAROUT0, 0), */
 602};
 603
 604static struct snd_kcontrol_new snd_pmac_screamer_mixers_beige[] = {
 605	AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
 606	AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
 607	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 608	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_LINE, 0),
 609};
 610
 611static struct snd_kcontrol_new snd_pmac_screamer_mixers_lo[] = {
 612	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 613};
 614
 615static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] = {
 616	AWACS_VOLUME("Play-through Playback Volume", 5, 6, 1),
 617	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 618};
 619
 620static struct snd_kcontrol_new snd_pmac_screamer_mixers_g4agp[] = {
 621	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 622	AWACS_VOLUME("Master Playback Volume", 5, 6, 1),
 623	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 624	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 625};
 626
 627static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] = {
 628	AWACS_VOLUME("Line out Playback Volume", 2, 6, 1),
 629	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 630	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 631};
 632
 633static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac5500[] = {
 634	AWACS_VOLUME("Headphone Playback Volume", 2, 6, 1),
 635};
 636
 637static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac[] = {
 638	AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
 639	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 640};
 641
 642/* FIXME: is this correct order?
 643 * screamer (powerbook G3 pismo) seems to have different bits...
 644 */
 645static struct snd_kcontrol_new snd_pmac_awacs_mixers2[] = {
 646	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
 647	AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
 648};
 649
 650static struct snd_kcontrol_new snd_pmac_screamer_mixers2[] = {
 651	AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
 652	AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
 653};
 654
 655static struct snd_kcontrol_new snd_pmac_awacs_mixers2_pmac5500[] = {
 656	AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
 657};
 658
 659static struct snd_kcontrol_new snd_pmac_awacs_master_sw =
 660AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
 661
 662static struct snd_kcontrol_new snd_pmac_awacs_master_sw_imac =
 663AWACS_SWITCH("Line out Playback Switch", 1, SHIFT_HDMUTE, 1);
 664
 665static struct snd_kcontrol_new snd_pmac_awacs_master_sw_pmac5500 =
 666AWACS_SWITCH("Headphone Playback Switch", 1, SHIFT_HDMUTE, 1);
 667
 668static struct snd_kcontrol_new snd_pmac_awacs_mic_boost[] = {
 669	AWACS_SWITCH("Mic Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 670};
 671
 672static struct snd_kcontrol_new snd_pmac_screamer_mic_boost[] = {
 673	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 674	  .name = "Mic Boost Capture Volume",
 675	  .info = snd_pmac_screamer_mic_boost_info,
 676	  .get = snd_pmac_screamer_mic_boost_get,
 677	  .put = snd_pmac_screamer_mic_boost_put,
 678	},
 679};
 680
 681static struct snd_kcontrol_new snd_pmac_awacs_mic_boost_pmac7500[] =
 682{
 683	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 684};
 685
 686static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_beige[] =
 687{
 688	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 689	AWACS_SWITCH("CD Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
 690};
 691
 692static struct snd_kcontrol_new snd_pmac_screamer_mic_boost_imac[] =
 693{
 694	AWACS_SWITCH("Line Boost Capture Switch", 0, SHIFT_GAINLINE, 0),
 695	AWACS_SWITCH("Mic Boost Capture Switch", 6, SHIFT_MIC_BOOST, 0),
 696};
 697
 698static struct snd_kcontrol_new snd_pmac_awacs_speaker_vol[] = {
 699	AWACS_VOLUME("Speaker Playback Volume", 4, 6, 1),
 700};
 701
 702static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw =
 703AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
 704
 705static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac1 =
 706AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 1);
 707
 708static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac2 =
 709AWACS_SWITCH("Speaker Playback Switch", 1, SHIFT_PAROUT1, 0);
 710
 711
 712/*
 713 * add new mixer elements to the card
 714 */
 715static int build_mixers(struct snd_pmac *chip, int nums,
 716			struct snd_kcontrol_new *mixers)
 717{
 718	int i, err;
 719
 720	for (i = 0; i < nums; i++) {
 721		err = snd_ctl_add(chip->card, snd_ctl_new1(&mixers[i], chip));
 722		if (err < 0)
 723			return err;
 724	}
 725	return 0;
 726}
 727
 728
 729/*
 730 * restore all registers
 731 */
 732static void awacs_restore_all_regs(struct snd_pmac *chip)
 733{
 734	snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]);
 735	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
 736	snd_pmac_awacs_write_noreg(chip, 2, chip->awacs_reg[2]);
 737	snd_pmac_awacs_write_noreg(chip, 4, chip->awacs_reg[4]);
 738	if (chip->model == PMAC_SCREAMER) {
 739		snd_pmac_awacs_write_noreg(chip, 5, chip->awacs_reg[5]);
 740		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 741		snd_pmac_awacs_write_noreg(chip, 7, chip->awacs_reg[7]);
 742	}
 743}
 744
 745#ifdef CONFIG_PM
 746static void snd_pmac_awacs_suspend(struct snd_pmac *chip)
 747{
 748	snd_pmac_awacs_write_noreg(chip, 1, (chip->awacs_reg[1]
 749					     | MASK_AMUTE | MASK_CMUTE));
 750}
 751
 752static void snd_pmac_awacs_resume(struct snd_pmac *chip)
 753{
 754	if (of_machine_is_compatible("PowerBook3,1")
 755	    || of_machine_is_compatible("PowerBook3,2")) {
 756		msleep(100);
 757		snd_pmac_awacs_write_reg(chip, 1,
 758			chip->awacs_reg[1] & ~MASK_PAROUT);
 759		msleep(300);
 760	}
 761
 762	awacs_restore_all_regs(chip);
 763	if (chip->model == PMAC_SCREAMER) {
 764		/* reset power bits in reg 6 */
 765		mdelay(5);
 766		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 767	}
 768	screamer_recalibrate(chip);
 769#ifdef PMAC_AMP_AVAIL
 770	if (chip->mixer_data) {
 771		struct awacs_amp *amp = chip->mixer_data;
 772		awacs_amp_set_vol(amp, 0,
 773				  amp->amp_vol[0][0], amp->amp_vol[0][1], 0);
 774		awacs_amp_set_vol(amp, 1,
 775				  amp->amp_vol[1][0], amp->amp_vol[1][1], 0);
 776		awacs_amp_set_tone(amp, amp->amp_tone[0], amp->amp_tone[1]);
 777		awacs_amp_set_master(amp, amp->amp_master);
 778	}
 779#endif
 780}
 781#endif /* CONFIG_PM */
 782
 783#define IS_PM7500 (of_machine_is_compatible("AAPL,7500") \
 784		|| of_machine_is_compatible("AAPL,8500") \
 785		|| of_machine_is_compatible("AAPL,9500"))
 786#define IS_PM5500 (of_machine_is_compatible("AAPL,e411"))
 787#define IS_BEIGE (of_machine_is_compatible("AAPL,Gossamer"))
 788#define IS_IMAC1 (of_machine_is_compatible("PowerMac2,1"))
 789#define IS_IMAC2 (of_machine_is_compatible("PowerMac2,2") \
 790		|| of_machine_is_compatible("PowerMac4,1"))
 791#define IS_G4AGP (of_machine_is_compatible("PowerMac3,1"))
 792#define IS_LOMBARD (of_machine_is_compatible("PowerBook1,1"))
 793
 794static int imac1, imac2;
 795
 796#ifdef PMAC_SUPPORT_AUTOMUTE
 797/*
 798 * auto-mute stuffs
 799 */
 800static int snd_pmac_awacs_detect_headphone(struct snd_pmac *chip)
 801{
 802	return (in_le32(&chip->awacs->codec_stat) & chip->hp_stat_mask) ? 1 : 0;
 803}
 804
 805#ifdef PMAC_AMP_AVAIL
 806static int toggle_amp_mute(struct awacs_amp *amp, int index, int mute)
 807{
 808	int vol[2];
 809	vol[0] = amp->amp_vol[index][0] & 31;
 810	vol[1] = amp->amp_vol[index][1] & 31;
 811	if (mute) {
 812		vol[0] |= 32;
 813		vol[1] |= 32;
 814	}
 815	return awacs_amp_set_vol(amp, index, vol[0], vol[1], 1);
 816}
 817#endif
 818
 819static void snd_pmac_awacs_update_automute(struct snd_pmac *chip, int do_notify)
 820{
 821	if (chip->auto_mute) {
 822#ifdef PMAC_AMP_AVAIL
 823		if (chip->mixer_data) {
 824			struct awacs_amp *amp = chip->mixer_data;
 825			int changed;
 826			if (snd_pmac_awacs_detect_headphone(chip)) {
 827				changed = toggle_amp_mute(amp, AMP_CH_HD, 0);
 828				changed |= toggle_amp_mute(amp, AMP_CH_SPK, 1);
 829			} else {
 830				changed = toggle_amp_mute(amp, AMP_CH_HD, 1);
 831				changed |= toggle_amp_mute(amp, AMP_CH_SPK, 0);
 832			}
 833			if (do_notify && ! changed)
 834				return;
 835		} else
 836#endif
 837		{
 838			int reg = chip->awacs_reg[1]
 839				| (MASK_HDMUTE | MASK_SPKMUTE);
 840			if (imac1) {
 841				reg &= ~MASK_SPKMUTE;
 842				reg |= MASK_PAROUT1;
 843			} else if (imac2) {
 844				reg &= ~MASK_SPKMUTE;
 845				reg &= ~MASK_PAROUT1;
 846			}
 847			if (snd_pmac_awacs_detect_headphone(chip))
 848				reg &= ~MASK_HDMUTE;
 849			else if (imac1)
 850				reg &= ~MASK_PAROUT1;
 851			else if (imac2)
 852				reg |= MASK_PAROUT1;
 853			else
 854				reg &= ~MASK_SPKMUTE;
 855			if (do_notify && reg == chip->awacs_reg[1])
 856				return;
 857			snd_pmac_awacs_write_reg(chip, 1, reg);
 858		}
 859		if (do_notify) {
 860			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 861				       &chip->master_sw_ctl->id);
 862			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 863				       &chip->speaker_sw_ctl->id);
 864			snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
 865				       &chip->hp_detect_ctl->id);
 866		}
 867	}
 868}
 869#endif /* PMAC_SUPPORT_AUTOMUTE */
 870
 871
 872/*
 873 * initialize chip
 874 */
 875int
 876snd_pmac_awacs_init(struct snd_pmac *chip)
 877{
 878	int pm7500 = IS_PM7500;
 879	int pm5500 = IS_PM5500;
 880	int beige = IS_BEIGE;
 881	int g4agp = IS_G4AGP;
 882	int lombard = IS_LOMBARD;
 883	int imac;
 884	int err, vol;
 885	struct snd_kcontrol *vmaster_sw, *vmaster_vol;
 886	struct snd_kcontrol *master_vol, *speaker_vol;
 887
 888	imac1 = IS_IMAC1;
 889	imac2 = IS_IMAC2;
 890	imac = imac1 || imac2;
 891	/* looks like MASK_GAINLINE triggers something, so we set here
 892	 * as start-up
 893	 */
 894	chip->awacs_reg[0] = MASK_MUX_CD | 0xff | MASK_GAINLINE;
 895	chip->awacs_reg[1] = MASK_CMUTE | MASK_AMUTE;
 896	/* FIXME: Only machines with external SRS module need MASK_PAROUT */
 897	if (chip->has_iic || chip->device_id == 0x5 ||
 898	    /* chip->_device_id == 0x8 || */
 899	    chip->device_id == 0xb)
 900		chip->awacs_reg[1] |= MASK_PAROUT;
 901	/* get default volume from nvram */
 902	// vol = (~nvram_read_byte(0x1308) & 7) << 1;
 903	// vol = ((pmac_xpram_read( 8 ) & 7 ) << 1 );
 904	vol = 0x0f; /* no, on alsa, muted as default */
 905	vol = vol + (vol << 6);
 906	chip->awacs_reg[2] = vol;
 907	chip->awacs_reg[4] = vol;
 908	if (chip->model == PMAC_SCREAMER) {
 909		/* FIXME: screamer has loopthru vol control */
 910		chip->awacs_reg[5] = vol;
 911		/* FIXME: maybe should be vol << 3 for PCMCIA speaker */
 912		chip->awacs_reg[6] = MASK_MIC_BOOST;
 913		chip->awacs_reg[7] = 0;
 914	}
 915
 916	awacs_restore_all_regs(chip);
 917	chip->manufacturer = (in_le32(&chip->awacs->codec_stat) >> 8) & 0xf;
 918	screamer_recalibrate(chip);
 919
 920	chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf;
 921#ifdef PMAC_AMP_AVAIL
 922	if (chip->revision == 3 && chip->has_iic && CHECK_CUDA_AMP()) {
 923		struct awacs_amp *amp = kzalloc(sizeof(*amp), GFP_KERNEL);
 924		if (! amp)
 925			return -ENOMEM;
 926		chip->mixer_data = amp;
 927		chip->mixer_free = awacs_amp_free;
 928		/* mute and zero vol */
 929		awacs_amp_set_vol(amp, 0, 63, 63, 0);
 930		awacs_amp_set_vol(amp, 1, 63, 63, 0);
 931		awacs_amp_set_tone(amp, 7, 7); /* 0 dB */
 932		awacs_amp_set_master(amp, 79); /* 0 dB */
 933	}
 934#endif /* PMAC_AMP_AVAIL */
 935
 936	if (chip->hp_stat_mask == 0) {
 937		/* set headphone-jack detection bit */
 938		switch (chip->model) {
 939		case PMAC_AWACS:
 940			chip->hp_stat_mask = pm7500 || pm5500 ? MASK_HDPCONN
 941				: MASK_LOCONN;
 942			break;
 943		case PMAC_SCREAMER:
 944			switch (chip->device_id) {
 945			case 0x08:
 946			case 0x0B:
 947				chip->hp_stat_mask = imac
 948					? MASK_LOCONN_IMAC |
 949					MASK_HDPLCONN_IMAC |
 950					MASK_HDPRCONN_IMAC
 951					: MASK_HDPCONN;
 952				break;
 953			case 0x00:
 954			case 0x05:
 955				chip->hp_stat_mask = MASK_LOCONN;
 956				break;
 957			default:
 958				chip->hp_stat_mask = MASK_HDPCONN;
 959				break;
 960			}
 961			break;
 962		default:
 963			snd_BUG();
 964			break;
 965		}
 966	}
 967
 968	/*
 969	 * build mixers
 970	 */
 971	strcpy(chip->card->mixername, "PowerMac AWACS");
 972
 973	err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers),
 974				snd_pmac_awacs_mixers);
 975	if (err < 0)
 976		return err;
 977	if (beige || g4agp)
 978		;
 979	else if (chip->model == PMAC_SCREAMER || pm5500)
 980		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2),
 981				   snd_pmac_screamer_mixers2);
 982	else if (!pm7500)
 983		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers2),
 984				   snd_pmac_awacs_mixers2);
 985	if (err < 0)
 986		return err;
 987	if (pm5500) {
 988		err = build_mixers(chip,
 989				   ARRAY_SIZE(snd_pmac_awacs_mixers2_pmac5500),
 990				   snd_pmac_awacs_mixers2_pmac5500);
 991		if (err < 0)
 992			return err;
 993	}
 
 994	if (pm7500)
 995		err = build_mixers(chip,
 996				   ARRAY_SIZE(snd_pmac_awacs_mixers_pmac7500),
 997				   snd_pmac_awacs_mixers_pmac7500);
 998	else if (pm5500)
 999		err = snd_ctl_add(chip->card,
1000		    (master_vol = snd_ctl_new1(snd_pmac_awacs_mixers_pmac5500,
1001						chip)));
1002	else if (beige)
1003		err = build_mixers(chip,
1004				   ARRAY_SIZE(snd_pmac_screamer_mixers_beige),
1005				   snd_pmac_screamer_mixers_beige);
1006	else if (imac || lombard) {
1007		err = snd_ctl_add(chip->card,
1008		    (master_vol = snd_ctl_new1(snd_pmac_screamer_mixers_lo,
1009						chip)));
1010		if (err < 0)
1011			return err;
1012		err = build_mixers(chip,
1013				   ARRAY_SIZE(snd_pmac_screamer_mixers_imac),
1014				   snd_pmac_screamer_mixers_imac);
1015	} else if (g4agp)
1016		err = build_mixers(chip,
1017				   ARRAY_SIZE(snd_pmac_screamer_mixers_g4agp),
1018				   snd_pmac_screamer_mixers_g4agp);
1019	else
1020		err = build_mixers(chip,
1021				   ARRAY_SIZE(snd_pmac_awacs_mixers_pmac),
1022				   snd_pmac_awacs_mixers_pmac);
1023	if (err < 0)
1024		return err;
1025	chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac || g4agp || lombard)
1026			? &snd_pmac_awacs_master_sw_imac
1027			: pm5500
1028			? &snd_pmac_awacs_master_sw_pmac5500
1029			: &snd_pmac_awacs_master_sw, chip);
1030	err = snd_ctl_add(chip->card, chip->master_sw_ctl);
1031	if (err < 0)
1032		return err;
1033#ifdef PMAC_AMP_AVAIL
1034	if (chip->mixer_data) {
1035		/* use amplifier.  the signal is connected from route A
1036		 * to the amp.  the amp has its headphone and speaker
1037		 * volumes and mute switches, so we use them instead of
1038		 * screamer registers.
1039		 * in this case, it seems the route C is not used.
1040		 */
1041		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_amp_vol),
1042					snd_pmac_awacs_amp_vol);
1043		if (err < 0)
1044			return err;
1045		/* overwrite */
1046		chip->master_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_amp_hp_sw,
1047							chip);
1048		err = snd_ctl_add(chip->card, chip->master_sw_ctl);
1049		if (err < 0)
1050			return err;
1051		chip->speaker_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_amp_spk_sw,
1052							chip);
1053		err = snd_ctl_add(chip->card, chip->speaker_sw_ctl);
1054		if (err < 0)
1055			return err;
1056	} else
1057#endif /* PMAC_AMP_AVAIL */
1058	{
1059		/* route A = headphone, route C = speaker */
1060		err = snd_ctl_add(chip->card,
1061		    (speaker_vol = snd_ctl_new1(snd_pmac_awacs_speaker_vol,
1062						chip)));
1063		if (err < 0)
1064			return err;
1065		chip->speaker_sw_ctl = snd_ctl_new1(imac1
1066				? &snd_pmac_awacs_speaker_sw_imac1
1067				: imac2
1068				? &snd_pmac_awacs_speaker_sw_imac2
1069				: &snd_pmac_awacs_speaker_sw, chip);
1070		err = snd_ctl_add(chip->card, chip->speaker_sw_ctl);
1071		if (err < 0)
1072			return err;
1073	}
1074
1075	if (pm5500 || imac || lombard) {
1076		vmaster_sw = snd_ctl_make_virtual_master(
1077			"Master Playback Switch", (unsigned int *) NULL);
1078		err = snd_ctl_add_slave_uncached(vmaster_sw,
1079						 chip->master_sw_ctl);
1080		if (err < 0)
1081			return err;
1082		err = snd_ctl_add_slave_uncached(vmaster_sw,
1083						  chip->speaker_sw_ctl);
1084		if (err < 0)
1085			return err;
1086		err = snd_ctl_add(chip->card, vmaster_sw);
1087		if (err < 0)
1088			return err;
1089		vmaster_vol = snd_ctl_make_virtual_master(
1090			"Master Playback Volume", (unsigned int *) NULL);
1091		err = snd_ctl_add_slave(vmaster_vol, master_vol);
1092		if (err < 0)
1093			return err;
1094		err = snd_ctl_add_slave(vmaster_vol, speaker_vol);
1095		if (err < 0)
1096			return err;
1097		err = snd_ctl_add(chip->card, vmaster_vol);
1098		if (err < 0)
1099			return err;
1100	}
1101
1102	if (beige || g4agp)
1103		err = build_mixers(chip,
1104				ARRAY_SIZE(snd_pmac_screamer_mic_boost_beige),
1105				snd_pmac_screamer_mic_boost_beige);
1106	else if (imac)
1107		err = build_mixers(chip,
1108				ARRAY_SIZE(snd_pmac_screamer_mic_boost_imac),
1109				snd_pmac_screamer_mic_boost_imac);
1110	else if (chip->model == PMAC_SCREAMER)
1111		err = build_mixers(chip,
1112				ARRAY_SIZE(snd_pmac_screamer_mic_boost),
1113				snd_pmac_screamer_mic_boost);
1114	else if (pm7500)
1115		err = build_mixers(chip,
1116				ARRAY_SIZE(snd_pmac_awacs_mic_boost_pmac7500),
1117				snd_pmac_awacs_mic_boost_pmac7500);
1118	else
1119		err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mic_boost),
1120				snd_pmac_awacs_mic_boost);
1121	if (err < 0)
1122		return err;
1123
1124	/*
1125	 * set lowlevel callbacks
1126	 */
1127	chip->set_format = snd_pmac_awacs_set_format;
1128#ifdef CONFIG_PM
1129	chip->suspend = snd_pmac_awacs_suspend;
1130	chip->resume = snd_pmac_awacs_resume;
1131#endif
1132#ifdef PMAC_SUPPORT_AUTOMUTE
1133	err = snd_pmac_add_automute(chip);
1134	if (err < 0)
1135		return err;
1136	chip->detect_headphone = snd_pmac_awacs_detect_headphone;
1137	chip->update_automute = snd_pmac_awacs_update_automute;
1138	snd_pmac_awacs_update_automute(chip, 0); /* update the status only */
1139#endif
1140	if (chip->model == PMAC_SCREAMER) {
1141		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
1142		snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]);
1143	}
1144
1145	return 0;
1146}