Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/ppc/tumbler.c
10814 views
1
/*
2
* PMac Tumbler/Snapper lowlevel functions
3
*
4
* Copyright (c) by Takashi Iwai <[email protected]>
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*
20
* Rene Rebe <[email protected]>:
21
* * update from shadow registers on wakeup and headphone plug
22
* * automatically toggle DRC on headphone plug
23
*
24
*/
25
26
27
#include <linux/init.h>
28
#include <linux/delay.h>
29
#include <linux/i2c.h>
30
#include <linux/kmod.h>
31
#include <linux/slab.h>
32
#include <linux/interrupt.h>
33
#include <linux/string.h>
34
#include <sound/core.h>
35
#include <asm/io.h>
36
#include <asm/irq.h>
37
#include <asm/machdep.h>
38
#include <asm/pmac_feature.h>
39
#include "pmac.h"
40
#include "tumbler_volume.h"
41
42
#undef DEBUG
43
44
#ifdef DEBUG
45
#define DBG(fmt...) printk(KERN_DEBUG fmt)
46
#else
47
#define DBG(fmt...)
48
#endif
49
50
#define IS_G4DA (of_machine_is_compatible("PowerMac3,4"))
51
52
/* i2c address for tumbler */
53
#define TAS_I2C_ADDR 0x34
54
55
/* registers */
56
#define TAS_REG_MCS 0x01 /* main control */
57
#define TAS_REG_DRC 0x02
58
#define TAS_REG_VOL 0x04
59
#define TAS_REG_TREBLE 0x05
60
#define TAS_REG_BASS 0x06
61
#define TAS_REG_INPUT1 0x07
62
#define TAS_REG_INPUT2 0x08
63
64
/* tas3001c */
65
#define TAS_REG_PCM TAS_REG_INPUT1
66
67
/* tas3004 */
68
#define TAS_REG_LMIX TAS_REG_INPUT1
69
#define TAS_REG_RMIX TAS_REG_INPUT2
70
#define TAS_REG_MCS2 0x43 /* main control 2 */
71
#define TAS_REG_ACS 0x40 /* analog control */
72
73
/* mono volumes for tas3001c/tas3004 */
74
enum {
75
VOL_IDX_PCM_MONO, /* tas3001c only */
76
VOL_IDX_BASS, VOL_IDX_TREBLE,
77
VOL_IDX_LAST_MONO
78
};
79
80
/* stereo volumes for tas3004 */
81
enum {
82
VOL_IDX_PCM, VOL_IDX_PCM2, VOL_IDX_ADC,
83
VOL_IDX_LAST_MIX
84
};
85
86
struct pmac_gpio {
87
unsigned int addr;
88
u8 active_val;
89
u8 inactive_val;
90
u8 active_state;
91
};
92
93
struct pmac_tumbler {
94
struct pmac_keywest i2c;
95
struct pmac_gpio audio_reset;
96
struct pmac_gpio amp_mute;
97
struct pmac_gpio line_mute;
98
struct pmac_gpio line_detect;
99
struct pmac_gpio hp_mute;
100
struct pmac_gpio hp_detect;
101
int headphone_irq;
102
int lineout_irq;
103
unsigned int save_master_vol[2];
104
unsigned int master_vol[2];
105
unsigned int save_master_switch[2];
106
unsigned int master_switch[2];
107
unsigned int mono_vol[VOL_IDX_LAST_MONO];
108
unsigned int mix_vol[VOL_IDX_LAST_MIX][2]; /* stereo volumes for tas3004 */
109
int drc_range;
110
int drc_enable;
111
int capture_source;
112
int anded_reset;
113
int auto_mute_notify;
114
int reset_on_sleep;
115
u8 acs;
116
};
117
118
119
/*
120
*/
121
122
static int send_init_client(struct pmac_keywest *i2c, unsigned int *regs)
123
{
124
while (*regs > 0) {
125
int err, count = 10;
126
do {
127
err = i2c_smbus_write_byte_data(i2c->client,
128
regs[0], regs[1]);
129
if (err >= 0)
130
break;
131
DBG("(W) i2c error %d\n", err);
132
mdelay(10);
133
} while (count--);
134
if (err < 0)
135
return -ENXIO;
136
regs += 2;
137
}
138
return 0;
139
}
140
141
142
static int tumbler_init_client(struct pmac_keywest *i2c)
143
{
144
static unsigned int regs[] = {
145
/* normal operation, SCLK=64fps, i2s output, i2s input, 16bit width */
146
TAS_REG_MCS, (1<<6)|(2<<4)|(2<<2)|0,
147
0, /* terminator */
148
};
149
DBG("(I) tumbler init client\n");
150
return send_init_client(i2c, regs);
151
}
152
153
static int snapper_init_client(struct pmac_keywest *i2c)
154
{
155
static unsigned int regs[] = {
156
/* normal operation, SCLK=64fps, i2s output, 16bit width */
157
TAS_REG_MCS, (1<<6)|(2<<4)|0,
158
/* normal operation, all-pass mode */
159
TAS_REG_MCS2, (1<<1),
160
/* normal output, no deemphasis, A input, power-up, line-in */
161
TAS_REG_ACS, 0,
162
0, /* terminator */
163
};
164
DBG("(I) snapper init client\n");
165
return send_init_client(i2c, regs);
166
}
167
168
/*
169
* gpio access
170
*/
171
#define do_gpio_write(gp, val) \
172
pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, (gp)->addr, val)
173
#define do_gpio_read(gp) \
174
pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, (gp)->addr, 0)
175
#define tumbler_gpio_free(gp) /* NOP */
176
177
static void write_audio_gpio(struct pmac_gpio *gp, int active)
178
{
179
if (! gp->addr)
180
return;
181
active = active ? gp->active_val : gp->inactive_val;
182
do_gpio_write(gp, active);
183
DBG("(I) gpio %x write %d\n", gp->addr, active);
184
}
185
186
static int check_audio_gpio(struct pmac_gpio *gp)
187
{
188
int ret;
189
190
if (! gp->addr)
191
return 0;
192
193
ret = do_gpio_read(gp);
194
195
return (ret & 0x1) == (gp->active_val & 0x1);
196
}
197
198
static int read_audio_gpio(struct pmac_gpio *gp)
199
{
200
int ret;
201
if (! gp->addr)
202
return 0;
203
ret = do_gpio_read(gp);
204
ret = (ret & 0x02) !=0;
205
return ret == gp->active_state;
206
}
207
208
/*
209
* update master volume
210
*/
211
static int tumbler_set_master_volume(struct pmac_tumbler *mix)
212
{
213
unsigned char block[6];
214
unsigned int left_vol, right_vol;
215
216
if (! mix->i2c.client)
217
return -ENODEV;
218
219
if (! mix->master_switch[0])
220
left_vol = 0;
221
else {
222
left_vol = mix->master_vol[0];
223
if (left_vol >= ARRAY_SIZE(master_volume_table))
224
left_vol = ARRAY_SIZE(master_volume_table) - 1;
225
left_vol = master_volume_table[left_vol];
226
}
227
if (! mix->master_switch[1])
228
right_vol = 0;
229
else {
230
right_vol = mix->master_vol[1];
231
if (right_vol >= ARRAY_SIZE(master_volume_table))
232
right_vol = ARRAY_SIZE(master_volume_table) - 1;
233
right_vol = master_volume_table[right_vol];
234
}
235
236
block[0] = (left_vol >> 16) & 0xff;
237
block[1] = (left_vol >> 8) & 0xff;
238
block[2] = (left_vol >> 0) & 0xff;
239
240
block[3] = (right_vol >> 16) & 0xff;
241
block[4] = (right_vol >> 8) & 0xff;
242
block[5] = (right_vol >> 0) & 0xff;
243
244
if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_VOL, 6,
245
block) < 0) {
246
snd_printk(KERN_ERR "failed to set volume \n");
247
return -EINVAL;
248
}
249
DBG("(I) succeeded to set volume (%u, %u)\n", left_vol, right_vol);
250
return 0;
251
}
252
253
254
/* output volume */
255
static int tumbler_info_master_volume(struct snd_kcontrol *kcontrol,
256
struct snd_ctl_elem_info *uinfo)
257
{
258
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
259
uinfo->count = 2;
260
uinfo->value.integer.min = 0;
261
uinfo->value.integer.max = ARRAY_SIZE(master_volume_table) - 1;
262
return 0;
263
}
264
265
static int tumbler_get_master_volume(struct snd_kcontrol *kcontrol,
266
struct snd_ctl_elem_value *ucontrol)
267
{
268
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
269
struct pmac_tumbler *mix = chip->mixer_data;
270
271
ucontrol->value.integer.value[0] = mix->master_vol[0];
272
ucontrol->value.integer.value[1] = mix->master_vol[1];
273
return 0;
274
}
275
276
static int tumbler_put_master_volume(struct snd_kcontrol *kcontrol,
277
struct snd_ctl_elem_value *ucontrol)
278
{
279
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
280
struct pmac_tumbler *mix = chip->mixer_data;
281
unsigned int vol[2];
282
int change;
283
284
vol[0] = ucontrol->value.integer.value[0];
285
vol[1] = ucontrol->value.integer.value[1];
286
if (vol[0] >= ARRAY_SIZE(master_volume_table) ||
287
vol[1] >= ARRAY_SIZE(master_volume_table))
288
return -EINVAL;
289
change = mix->master_vol[0] != vol[0] ||
290
mix->master_vol[1] != vol[1];
291
if (change) {
292
mix->master_vol[0] = vol[0];
293
mix->master_vol[1] = vol[1];
294
tumbler_set_master_volume(mix);
295
}
296
return change;
297
}
298
299
/* output switch */
300
static int tumbler_get_master_switch(struct snd_kcontrol *kcontrol,
301
struct snd_ctl_elem_value *ucontrol)
302
{
303
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
304
struct pmac_tumbler *mix = chip->mixer_data;
305
306
ucontrol->value.integer.value[0] = mix->master_switch[0];
307
ucontrol->value.integer.value[1] = mix->master_switch[1];
308
return 0;
309
}
310
311
static int tumbler_put_master_switch(struct snd_kcontrol *kcontrol,
312
struct snd_ctl_elem_value *ucontrol)
313
{
314
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
315
struct pmac_tumbler *mix = chip->mixer_data;
316
int change;
317
318
change = mix->master_switch[0] != ucontrol->value.integer.value[0] ||
319
mix->master_switch[1] != ucontrol->value.integer.value[1];
320
if (change) {
321
mix->master_switch[0] = !!ucontrol->value.integer.value[0];
322
mix->master_switch[1] = !!ucontrol->value.integer.value[1];
323
tumbler_set_master_volume(mix);
324
}
325
return change;
326
}
327
328
329
/*
330
* TAS3001c dynamic range compression
331
*/
332
333
#define TAS3001_DRC_MAX 0x5f
334
335
static int tumbler_set_drc(struct pmac_tumbler *mix)
336
{
337
unsigned char val[2];
338
339
if (! mix->i2c.client)
340
return -ENODEV;
341
342
if (mix->drc_enable) {
343
val[0] = 0xc1; /* enable, 3:1 compression */
344
if (mix->drc_range > TAS3001_DRC_MAX)
345
val[1] = 0xf0;
346
else if (mix->drc_range < 0)
347
val[1] = 0x91;
348
else
349
val[1] = mix->drc_range + 0x91;
350
} else {
351
val[0] = 0;
352
val[1] = 0;
353
}
354
355
if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
356
2, val) < 0) {
357
snd_printk(KERN_ERR "failed to set DRC\n");
358
return -EINVAL;
359
}
360
DBG("(I) succeeded to set DRC (%u, %u)\n", val[0], val[1]);
361
return 0;
362
}
363
364
/*
365
* TAS3004
366
*/
367
368
#define TAS3004_DRC_MAX 0xef
369
370
static int snapper_set_drc(struct pmac_tumbler *mix)
371
{
372
unsigned char val[6];
373
374
if (! mix->i2c.client)
375
return -ENODEV;
376
377
if (mix->drc_enable)
378
val[0] = 0x50; /* 3:1 above threshold */
379
else
380
val[0] = 0x51; /* disabled */
381
val[1] = 0x02; /* 1:1 below threshold */
382
if (mix->drc_range > 0xef)
383
val[2] = 0xef;
384
else if (mix->drc_range < 0)
385
val[2] = 0x00;
386
else
387
val[2] = mix->drc_range;
388
val[3] = 0xb0;
389
val[4] = 0x60;
390
val[5] = 0xa0;
391
392
if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
393
6, val) < 0) {
394
snd_printk(KERN_ERR "failed to set DRC\n");
395
return -EINVAL;
396
}
397
DBG("(I) succeeded to set DRC (%u, %u)\n", val[0], val[1]);
398
return 0;
399
}
400
401
static int tumbler_info_drc_value(struct snd_kcontrol *kcontrol,
402
struct snd_ctl_elem_info *uinfo)
403
{
404
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
405
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
406
uinfo->count = 1;
407
uinfo->value.integer.min = 0;
408
uinfo->value.integer.max =
409
chip->model == PMAC_TUMBLER ? TAS3001_DRC_MAX : TAS3004_DRC_MAX;
410
return 0;
411
}
412
413
static int tumbler_get_drc_value(struct snd_kcontrol *kcontrol,
414
struct snd_ctl_elem_value *ucontrol)
415
{
416
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
417
struct pmac_tumbler *mix;
418
if (! (mix = chip->mixer_data))
419
return -ENODEV;
420
ucontrol->value.integer.value[0] = mix->drc_range;
421
return 0;
422
}
423
424
static int tumbler_put_drc_value(struct snd_kcontrol *kcontrol,
425
struct snd_ctl_elem_value *ucontrol)
426
{
427
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
428
struct pmac_tumbler *mix;
429
unsigned int val;
430
int change;
431
432
if (! (mix = chip->mixer_data))
433
return -ENODEV;
434
val = ucontrol->value.integer.value[0];
435
if (chip->model == PMAC_TUMBLER) {
436
if (val > TAS3001_DRC_MAX)
437
return -EINVAL;
438
} else {
439
if (val > TAS3004_DRC_MAX)
440
return -EINVAL;
441
}
442
change = mix->drc_range != val;
443
if (change) {
444
mix->drc_range = val;
445
if (chip->model == PMAC_TUMBLER)
446
tumbler_set_drc(mix);
447
else
448
snapper_set_drc(mix);
449
}
450
return change;
451
}
452
453
static int tumbler_get_drc_switch(struct snd_kcontrol *kcontrol,
454
struct snd_ctl_elem_value *ucontrol)
455
{
456
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
457
struct pmac_tumbler *mix;
458
if (! (mix = chip->mixer_data))
459
return -ENODEV;
460
ucontrol->value.integer.value[0] = mix->drc_enable;
461
return 0;
462
}
463
464
static int tumbler_put_drc_switch(struct snd_kcontrol *kcontrol,
465
struct snd_ctl_elem_value *ucontrol)
466
{
467
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
468
struct pmac_tumbler *mix;
469
int change;
470
471
if (! (mix = chip->mixer_data))
472
return -ENODEV;
473
change = mix->drc_enable != ucontrol->value.integer.value[0];
474
if (change) {
475
mix->drc_enable = !!ucontrol->value.integer.value[0];
476
if (chip->model == PMAC_TUMBLER)
477
tumbler_set_drc(mix);
478
else
479
snapper_set_drc(mix);
480
}
481
return change;
482
}
483
484
485
/*
486
* mono volumes
487
*/
488
489
struct tumbler_mono_vol {
490
int index;
491
int reg;
492
int bytes;
493
unsigned int max;
494
unsigned int *table;
495
};
496
497
static int tumbler_set_mono_volume(struct pmac_tumbler *mix,
498
struct tumbler_mono_vol *info)
499
{
500
unsigned char block[4];
501
unsigned int vol;
502
int i;
503
504
if (! mix->i2c.client)
505
return -ENODEV;
506
507
vol = mix->mono_vol[info->index];
508
if (vol >= info->max)
509
vol = info->max - 1;
510
vol = info->table[vol];
511
for (i = 0; i < info->bytes; i++)
512
block[i] = (vol >> ((info->bytes - i - 1) * 8)) & 0xff;
513
if (i2c_smbus_write_i2c_block_data(mix->i2c.client, info->reg,
514
info->bytes, block) < 0) {
515
snd_printk(KERN_ERR "failed to set mono volume %d\n",
516
info->index);
517
return -EINVAL;
518
}
519
return 0;
520
}
521
522
static int tumbler_info_mono(struct snd_kcontrol *kcontrol,
523
struct snd_ctl_elem_info *uinfo)
524
{
525
struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
526
527
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
528
uinfo->count = 1;
529
uinfo->value.integer.min = 0;
530
uinfo->value.integer.max = info->max - 1;
531
return 0;
532
}
533
534
static int tumbler_get_mono(struct snd_kcontrol *kcontrol,
535
struct snd_ctl_elem_value *ucontrol)
536
{
537
struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
538
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
539
struct pmac_tumbler *mix;
540
if (! (mix = chip->mixer_data))
541
return -ENODEV;
542
ucontrol->value.integer.value[0] = mix->mono_vol[info->index];
543
return 0;
544
}
545
546
static int tumbler_put_mono(struct snd_kcontrol *kcontrol,
547
struct snd_ctl_elem_value *ucontrol)
548
{
549
struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
550
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
551
struct pmac_tumbler *mix;
552
unsigned int vol;
553
int change;
554
555
if (! (mix = chip->mixer_data))
556
return -ENODEV;
557
vol = ucontrol->value.integer.value[0];
558
if (vol >= info->max)
559
return -EINVAL;
560
change = mix->mono_vol[info->index] != vol;
561
if (change) {
562
mix->mono_vol[info->index] = vol;
563
tumbler_set_mono_volume(mix, info);
564
}
565
return change;
566
}
567
568
/* TAS3001c mono volumes */
569
static struct tumbler_mono_vol tumbler_pcm_vol_info = {
570
.index = VOL_IDX_PCM_MONO,
571
.reg = TAS_REG_PCM,
572
.bytes = 3,
573
.max = ARRAY_SIZE(mixer_volume_table),
574
.table = mixer_volume_table,
575
};
576
577
static struct tumbler_mono_vol tumbler_bass_vol_info = {
578
.index = VOL_IDX_BASS,
579
.reg = TAS_REG_BASS,
580
.bytes = 1,
581
.max = ARRAY_SIZE(bass_volume_table),
582
.table = bass_volume_table,
583
};
584
585
static struct tumbler_mono_vol tumbler_treble_vol_info = {
586
.index = VOL_IDX_TREBLE,
587
.reg = TAS_REG_TREBLE,
588
.bytes = 1,
589
.max = ARRAY_SIZE(treble_volume_table),
590
.table = treble_volume_table,
591
};
592
593
/* TAS3004 mono volumes */
594
static struct tumbler_mono_vol snapper_bass_vol_info = {
595
.index = VOL_IDX_BASS,
596
.reg = TAS_REG_BASS,
597
.bytes = 1,
598
.max = ARRAY_SIZE(snapper_bass_volume_table),
599
.table = snapper_bass_volume_table,
600
};
601
602
static struct tumbler_mono_vol snapper_treble_vol_info = {
603
.index = VOL_IDX_TREBLE,
604
.reg = TAS_REG_TREBLE,
605
.bytes = 1,
606
.max = ARRAY_SIZE(snapper_treble_volume_table),
607
.table = snapper_treble_volume_table,
608
};
609
610
611
#define DEFINE_MONO(xname,type) { \
612
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
613
.name = xname, \
614
.info = tumbler_info_mono, \
615
.get = tumbler_get_mono, \
616
.put = tumbler_put_mono, \
617
.private_value = (unsigned long)(&tumbler_##type##_vol_info), \
618
}
619
620
#define DEFINE_SNAPPER_MONO(xname,type) { \
621
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
622
.name = xname, \
623
.info = tumbler_info_mono, \
624
.get = tumbler_get_mono, \
625
.put = tumbler_put_mono, \
626
.private_value = (unsigned long)(&snapper_##type##_vol_info), \
627
}
628
629
630
/*
631
* snapper mixer volumes
632
*/
633
634
static int snapper_set_mix_vol1(struct pmac_tumbler *mix, int idx, int ch, int reg)
635
{
636
int i, j, vol;
637
unsigned char block[9];
638
639
vol = mix->mix_vol[idx][ch];
640
if (vol >= ARRAY_SIZE(mixer_volume_table)) {
641
vol = ARRAY_SIZE(mixer_volume_table) - 1;
642
mix->mix_vol[idx][ch] = vol;
643
}
644
645
for (i = 0; i < 3; i++) {
646
vol = mix->mix_vol[i][ch];
647
vol = mixer_volume_table[vol];
648
for (j = 0; j < 3; j++)
649
block[i * 3 + j] = (vol >> ((2 - j) * 8)) & 0xff;
650
}
651
if (i2c_smbus_write_i2c_block_data(mix->i2c.client, reg,
652
9, block) < 0) {
653
snd_printk(KERN_ERR "failed to set mono volume %d\n", reg);
654
return -EINVAL;
655
}
656
return 0;
657
}
658
659
static int snapper_set_mix_vol(struct pmac_tumbler *mix, int idx)
660
{
661
if (! mix->i2c.client)
662
return -ENODEV;
663
if (snapper_set_mix_vol1(mix, idx, 0, TAS_REG_LMIX) < 0 ||
664
snapper_set_mix_vol1(mix, idx, 1, TAS_REG_RMIX) < 0)
665
return -EINVAL;
666
return 0;
667
}
668
669
static int snapper_info_mix(struct snd_kcontrol *kcontrol,
670
struct snd_ctl_elem_info *uinfo)
671
{
672
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
673
uinfo->count = 2;
674
uinfo->value.integer.min = 0;
675
uinfo->value.integer.max = ARRAY_SIZE(mixer_volume_table) - 1;
676
return 0;
677
}
678
679
static int snapper_get_mix(struct snd_kcontrol *kcontrol,
680
struct snd_ctl_elem_value *ucontrol)
681
{
682
int idx = (int)kcontrol->private_value;
683
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
684
struct pmac_tumbler *mix;
685
if (! (mix = chip->mixer_data))
686
return -ENODEV;
687
ucontrol->value.integer.value[0] = mix->mix_vol[idx][0];
688
ucontrol->value.integer.value[1] = mix->mix_vol[idx][1];
689
return 0;
690
}
691
692
static int snapper_put_mix(struct snd_kcontrol *kcontrol,
693
struct snd_ctl_elem_value *ucontrol)
694
{
695
int idx = (int)kcontrol->private_value;
696
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
697
struct pmac_tumbler *mix;
698
unsigned int vol[2];
699
int change;
700
701
if (! (mix = chip->mixer_data))
702
return -ENODEV;
703
vol[0] = ucontrol->value.integer.value[0];
704
vol[1] = ucontrol->value.integer.value[1];
705
if (vol[0] >= ARRAY_SIZE(mixer_volume_table) ||
706
vol[1] >= ARRAY_SIZE(mixer_volume_table))
707
return -EINVAL;
708
change = mix->mix_vol[idx][0] != vol[0] ||
709
mix->mix_vol[idx][1] != vol[1];
710
if (change) {
711
mix->mix_vol[idx][0] = vol[0];
712
mix->mix_vol[idx][1] = vol[1];
713
snapper_set_mix_vol(mix, idx);
714
}
715
return change;
716
}
717
718
719
/*
720
* mute switches. FIXME: Turn that into software mute when both outputs are muted
721
* to avoid codec reset on ibook M7
722
*/
723
724
enum { TUMBLER_MUTE_HP, TUMBLER_MUTE_AMP, TUMBLER_MUTE_LINE };
725
726
static int tumbler_get_mute_switch(struct snd_kcontrol *kcontrol,
727
struct snd_ctl_elem_value *ucontrol)
728
{
729
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
730
struct pmac_tumbler *mix;
731
struct pmac_gpio *gp;
732
if (! (mix = chip->mixer_data))
733
return -ENODEV;
734
switch(kcontrol->private_value) {
735
case TUMBLER_MUTE_HP:
736
gp = &mix->hp_mute; break;
737
case TUMBLER_MUTE_AMP:
738
gp = &mix->amp_mute; break;
739
case TUMBLER_MUTE_LINE:
740
gp = &mix->line_mute; break;
741
default:
742
gp = NULL;
743
}
744
if (gp == NULL)
745
return -EINVAL;
746
ucontrol->value.integer.value[0] = !check_audio_gpio(gp);
747
return 0;
748
}
749
750
static int tumbler_put_mute_switch(struct snd_kcontrol *kcontrol,
751
struct snd_ctl_elem_value *ucontrol)
752
{
753
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
754
struct pmac_tumbler *mix;
755
struct pmac_gpio *gp;
756
int val;
757
#ifdef PMAC_SUPPORT_AUTOMUTE
758
if (chip->update_automute && chip->auto_mute)
759
return 0; /* don't touch in the auto-mute mode */
760
#endif
761
if (! (mix = chip->mixer_data))
762
return -ENODEV;
763
switch(kcontrol->private_value) {
764
case TUMBLER_MUTE_HP:
765
gp = &mix->hp_mute; break;
766
case TUMBLER_MUTE_AMP:
767
gp = &mix->amp_mute; break;
768
case TUMBLER_MUTE_LINE:
769
gp = &mix->line_mute; break;
770
default:
771
gp = NULL;
772
}
773
if (gp == NULL)
774
return -EINVAL;
775
val = ! check_audio_gpio(gp);
776
if (val != ucontrol->value.integer.value[0]) {
777
write_audio_gpio(gp, ! ucontrol->value.integer.value[0]);
778
return 1;
779
}
780
return 0;
781
}
782
783
static int snapper_set_capture_source(struct pmac_tumbler *mix)
784
{
785
if (! mix->i2c.client)
786
return -ENODEV;
787
if (mix->capture_source)
788
mix->acs |= 2;
789
else
790
mix->acs &= ~2;
791
return i2c_smbus_write_byte_data(mix->i2c.client, TAS_REG_ACS, mix->acs);
792
}
793
794
static int snapper_info_capture_source(struct snd_kcontrol *kcontrol,
795
struct snd_ctl_elem_info *uinfo)
796
{
797
static char *texts[2] = {
798
"Line", "Mic"
799
};
800
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
801
uinfo->count = 1;
802
uinfo->value.enumerated.items = 2;
803
if (uinfo->value.enumerated.item > 1)
804
uinfo->value.enumerated.item = 1;
805
strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
806
return 0;
807
}
808
809
static int snapper_get_capture_source(struct snd_kcontrol *kcontrol,
810
struct snd_ctl_elem_value *ucontrol)
811
{
812
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
813
struct pmac_tumbler *mix = chip->mixer_data;
814
815
ucontrol->value.enumerated.item[0] = mix->capture_source;
816
return 0;
817
}
818
819
static int snapper_put_capture_source(struct snd_kcontrol *kcontrol,
820
struct snd_ctl_elem_value *ucontrol)
821
{
822
struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
823
struct pmac_tumbler *mix = chip->mixer_data;
824
int change;
825
826
change = ucontrol->value.enumerated.item[0] != mix->capture_source;
827
if (change) {
828
mix->capture_source = !!ucontrol->value.enumerated.item[0];
829
snapper_set_capture_source(mix);
830
}
831
return change;
832
}
833
834
#define DEFINE_SNAPPER_MIX(xname,idx,ofs) { \
835
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
836
.name = xname, \
837
.info = snapper_info_mix, \
838
.get = snapper_get_mix, \
839
.put = snapper_put_mix, \
840
.index = idx,\
841
.private_value = ofs, \
842
}
843
844
845
/*
846
*/
847
static struct snd_kcontrol_new tumbler_mixers[] __devinitdata = {
848
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
849
.name = "Master Playback Volume",
850
.info = tumbler_info_master_volume,
851
.get = tumbler_get_master_volume,
852
.put = tumbler_put_master_volume
853
},
854
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
855
.name = "Master Playback Switch",
856
.info = snd_pmac_boolean_stereo_info,
857
.get = tumbler_get_master_switch,
858
.put = tumbler_put_master_switch
859
},
860
DEFINE_MONO("Tone Control - Bass", bass),
861
DEFINE_MONO("Tone Control - Treble", treble),
862
DEFINE_MONO("PCM Playback Volume", pcm),
863
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
864
.name = "DRC Range",
865
.info = tumbler_info_drc_value,
866
.get = tumbler_get_drc_value,
867
.put = tumbler_put_drc_value
868
},
869
};
870
871
static struct snd_kcontrol_new snapper_mixers[] __devinitdata = {
872
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
873
.name = "Master Playback Volume",
874
.info = tumbler_info_master_volume,
875
.get = tumbler_get_master_volume,
876
.put = tumbler_put_master_volume
877
},
878
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
879
.name = "Master Playback Switch",
880
.info = snd_pmac_boolean_stereo_info,
881
.get = tumbler_get_master_switch,
882
.put = tumbler_put_master_switch
883
},
884
DEFINE_SNAPPER_MIX("PCM Playback Volume", 0, VOL_IDX_PCM),
885
/* Alternative PCM is assigned to Mic analog loopback on iBook G4 */
886
DEFINE_SNAPPER_MIX("Mic Playback Volume", 0, VOL_IDX_PCM2),
887
DEFINE_SNAPPER_MIX("Monitor Mix Volume", 0, VOL_IDX_ADC),
888
DEFINE_SNAPPER_MONO("Tone Control - Bass", bass),
889
DEFINE_SNAPPER_MONO("Tone Control - Treble", treble),
890
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
891
.name = "DRC Range",
892
.info = tumbler_info_drc_value,
893
.get = tumbler_get_drc_value,
894
.put = tumbler_put_drc_value
895
},
896
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
897
.name = "Input Source", /* FIXME: "Capture Source" doesn't work properly */
898
.info = snapper_info_capture_source,
899
.get = snapper_get_capture_source,
900
.put = snapper_put_capture_source
901
},
902
};
903
904
static struct snd_kcontrol_new tumbler_hp_sw __devinitdata = {
905
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
906
.name = "Headphone Playback Switch",
907
.info = snd_pmac_boolean_mono_info,
908
.get = tumbler_get_mute_switch,
909
.put = tumbler_put_mute_switch,
910
.private_value = TUMBLER_MUTE_HP,
911
};
912
static struct snd_kcontrol_new tumbler_speaker_sw __devinitdata = {
913
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
914
.name = "Speaker Playback Switch",
915
.info = snd_pmac_boolean_mono_info,
916
.get = tumbler_get_mute_switch,
917
.put = tumbler_put_mute_switch,
918
.private_value = TUMBLER_MUTE_AMP,
919
};
920
static struct snd_kcontrol_new tumbler_lineout_sw __devinitdata = {
921
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
922
.name = "Line Out Playback Switch",
923
.info = snd_pmac_boolean_mono_info,
924
.get = tumbler_get_mute_switch,
925
.put = tumbler_put_mute_switch,
926
.private_value = TUMBLER_MUTE_LINE,
927
};
928
static struct snd_kcontrol_new tumbler_drc_sw __devinitdata = {
929
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
930
.name = "DRC Switch",
931
.info = snd_pmac_boolean_mono_info,
932
.get = tumbler_get_drc_switch,
933
.put = tumbler_put_drc_switch
934
};
935
936
937
#ifdef PMAC_SUPPORT_AUTOMUTE
938
/*
939
* auto-mute stuffs
940
*/
941
static int tumbler_detect_headphone(struct snd_pmac *chip)
942
{
943
struct pmac_tumbler *mix = chip->mixer_data;
944
int detect = 0;
945
946
if (mix->hp_detect.addr)
947
detect |= read_audio_gpio(&mix->hp_detect);
948
return detect;
949
}
950
951
static int tumbler_detect_lineout(struct snd_pmac *chip)
952
{
953
struct pmac_tumbler *mix = chip->mixer_data;
954
int detect = 0;
955
956
if (mix->line_detect.addr)
957
detect |= read_audio_gpio(&mix->line_detect);
958
return detect;
959
}
960
961
static void check_mute(struct snd_pmac *chip, struct pmac_gpio *gp, int val, int do_notify,
962
struct snd_kcontrol *sw)
963
{
964
if (check_audio_gpio(gp) != val) {
965
write_audio_gpio(gp, val);
966
if (do_notify)
967
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
968
&sw->id);
969
}
970
}
971
972
static struct work_struct device_change;
973
static struct snd_pmac *device_change_chip;
974
975
static void device_change_handler(struct work_struct *work)
976
{
977
struct snd_pmac *chip = device_change_chip;
978
struct pmac_tumbler *mix;
979
int headphone, lineout;
980
981
if (!chip)
982
return;
983
984
mix = chip->mixer_data;
985
if (snd_BUG_ON(!mix))
986
return;
987
988
headphone = tumbler_detect_headphone(chip);
989
lineout = tumbler_detect_lineout(chip);
990
991
DBG("headphone: %d, lineout: %d\n", headphone, lineout);
992
993
if (headphone || lineout) {
994
/* unmute headphone/lineout & mute speaker */
995
if (headphone)
996
check_mute(chip, &mix->hp_mute, 0, mix->auto_mute_notify,
997
chip->master_sw_ctl);
998
if (lineout && mix->line_mute.addr != 0)
999
check_mute(chip, &mix->line_mute, 0, mix->auto_mute_notify,
1000
chip->lineout_sw_ctl);
1001
if (mix->anded_reset)
1002
msleep(10);
1003
check_mute(chip, &mix->amp_mute, !IS_G4DA, mix->auto_mute_notify,
1004
chip->speaker_sw_ctl);
1005
} else {
1006
/* unmute speaker, mute others */
1007
check_mute(chip, &mix->amp_mute, 0, mix->auto_mute_notify,
1008
chip->speaker_sw_ctl);
1009
if (mix->anded_reset)
1010
msleep(10);
1011
check_mute(chip, &mix->hp_mute, 1, mix->auto_mute_notify,
1012
chip->master_sw_ctl);
1013
if (mix->line_mute.addr != 0)
1014
check_mute(chip, &mix->line_mute, 1, mix->auto_mute_notify,
1015
chip->lineout_sw_ctl);
1016
}
1017
if (mix->auto_mute_notify)
1018
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1019
&chip->hp_detect_ctl->id);
1020
1021
#ifdef CONFIG_SND_POWERMAC_AUTO_DRC
1022
mix->drc_enable = ! (headphone || lineout);
1023
if (mix->auto_mute_notify)
1024
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1025
&chip->drc_sw_ctl->id);
1026
if (chip->model == PMAC_TUMBLER)
1027
tumbler_set_drc(mix);
1028
else
1029
snapper_set_drc(mix);
1030
#endif
1031
1032
/* reset the master volume so the correct amplification is applied */
1033
tumbler_set_master_volume(mix);
1034
}
1035
1036
static void tumbler_update_automute(struct snd_pmac *chip, int do_notify)
1037
{
1038
if (chip->auto_mute) {
1039
struct pmac_tumbler *mix;
1040
mix = chip->mixer_data;
1041
if (snd_BUG_ON(!mix))
1042
return;
1043
mix->auto_mute_notify = do_notify;
1044
schedule_work(&device_change);
1045
}
1046
}
1047
#endif /* PMAC_SUPPORT_AUTOMUTE */
1048
1049
1050
/* interrupt - headphone plug changed */
1051
static irqreturn_t headphone_intr(int irq, void *devid)
1052
{
1053
struct snd_pmac *chip = devid;
1054
if (chip->update_automute && chip->initialized) {
1055
chip->update_automute(chip, 1);
1056
return IRQ_HANDLED;
1057
}
1058
return IRQ_NONE;
1059
}
1060
1061
/* look for audio-gpio device */
1062
static struct device_node *find_audio_device(const char *name)
1063
{
1064
struct device_node *gpiop;
1065
struct device_node *np;
1066
1067
gpiop = of_find_node_by_name(NULL, "gpio");
1068
if (! gpiop)
1069
return NULL;
1070
1071
for (np = of_get_next_child(gpiop, NULL); np;
1072
np = of_get_next_child(gpiop, np)) {
1073
const char *property = of_get_property(np, "audio-gpio", NULL);
1074
if (property && strcmp(property, name) == 0)
1075
break;
1076
}
1077
of_node_put(gpiop);
1078
return np;
1079
}
1080
1081
/* look for audio-gpio device */
1082
static struct device_node *find_compatible_audio_device(const char *name)
1083
{
1084
struct device_node *gpiop;
1085
struct device_node *np;
1086
1087
gpiop = of_find_node_by_name(NULL, "gpio");
1088
if (!gpiop)
1089
return NULL;
1090
1091
for (np = of_get_next_child(gpiop, NULL); np;
1092
np = of_get_next_child(gpiop, np)) {
1093
if (of_device_is_compatible(np, name))
1094
break;
1095
}
1096
of_node_put(gpiop);
1097
return np;
1098
}
1099
1100
/* find an audio device and get its address */
1101
static long tumbler_find_device(const char *device, const char *platform,
1102
struct pmac_gpio *gp, int is_compatible)
1103
{
1104
struct device_node *node;
1105
const u32 *base;
1106
u32 addr;
1107
long ret;
1108
1109
if (is_compatible)
1110
node = find_compatible_audio_device(device);
1111
else
1112
node = find_audio_device(device);
1113
if (! node) {
1114
DBG("(W) cannot find audio device %s !\n", device);
1115
snd_printdd("cannot find device %s\n", device);
1116
return -ENODEV;
1117
}
1118
1119
base = of_get_property(node, "AAPL,address", NULL);
1120
if (! base) {
1121
base = of_get_property(node, "reg", NULL);
1122
if (!base) {
1123
DBG("(E) cannot find address for device %s !\n", device);
1124
snd_printd("cannot find address for device %s\n", device);
1125
of_node_put(node);
1126
return -ENODEV;
1127
}
1128
addr = *base;
1129
if (addr < 0x50)
1130
addr += 0x50;
1131
} else
1132
addr = *base;
1133
1134
gp->addr = addr & 0x0000ffff;
1135
/* Try to find the active state, default to 0 ! */
1136
base = of_get_property(node, "audio-gpio-active-state", NULL);
1137
if (base) {
1138
gp->active_state = *base;
1139
gp->active_val = (*base) ? 0x5 : 0x4;
1140
gp->inactive_val = (*base) ? 0x4 : 0x5;
1141
} else {
1142
const u32 *prop = NULL;
1143
gp->active_state = IS_G4DA
1144
&& !strncmp(device, "keywest-gpio1", 13);
1145
gp->active_val = 0x4;
1146
gp->inactive_val = 0x5;
1147
/* Here are some crude hacks to extract the GPIO polarity and
1148
* open collector informations out of the do-platform script
1149
* as we don't yet have an interpreter for these things
1150
*/
1151
if (platform)
1152
prop = of_get_property(node, platform, NULL);
1153
if (prop) {
1154
if (prop[3] == 0x9 && prop[4] == 0x9) {
1155
gp->active_val = 0xd;
1156
gp->inactive_val = 0xc;
1157
}
1158
if (prop[3] == 0x1 && prop[4] == 0x1) {
1159
gp->active_val = 0x5;
1160
gp->inactive_val = 0x4;
1161
}
1162
}
1163
}
1164
1165
DBG("(I) GPIO device %s found, offset: %x, active state: %d !\n",
1166
device, gp->addr, gp->active_state);
1167
1168
ret = irq_of_parse_and_map(node, 0);
1169
of_node_put(node);
1170
return ret;
1171
}
1172
1173
/* reset audio */
1174
static void tumbler_reset_audio(struct snd_pmac *chip)
1175
{
1176
struct pmac_tumbler *mix = chip->mixer_data;
1177
1178
if (mix->anded_reset) {
1179
DBG("(I) codec anded reset !\n");
1180
write_audio_gpio(&mix->hp_mute, 0);
1181
write_audio_gpio(&mix->amp_mute, 0);
1182
msleep(200);
1183
write_audio_gpio(&mix->hp_mute, 1);
1184
write_audio_gpio(&mix->amp_mute, 1);
1185
msleep(100);
1186
write_audio_gpio(&mix->hp_mute, 0);
1187
write_audio_gpio(&mix->amp_mute, 0);
1188
msleep(100);
1189
} else {
1190
DBG("(I) codec normal reset !\n");
1191
1192
write_audio_gpio(&mix->audio_reset, 0);
1193
msleep(200);
1194
write_audio_gpio(&mix->audio_reset, 1);
1195
msleep(100);
1196
write_audio_gpio(&mix->audio_reset, 0);
1197
msleep(100);
1198
}
1199
}
1200
1201
#ifdef CONFIG_PM
1202
/* suspend mixer */
1203
static void tumbler_suspend(struct snd_pmac *chip)
1204
{
1205
struct pmac_tumbler *mix = chip->mixer_data;
1206
1207
if (mix->headphone_irq >= 0)
1208
disable_irq(mix->headphone_irq);
1209
if (mix->lineout_irq >= 0)
1210
disable_irq(mix->lineout_irq);
1211
mix->save_master_switch[0] = mix->master_switch[0];
1212
mix->save_master_switch[1] = mix->master_switch[1];
1213
mix->save_master_vol[0] = mix->master_vol[0];
1214
mix->save_master_vol[1] = mix->master_vol[1];
1215
mix->master_switch[0] = mix->master_switch[1] = 0;
1216
tumbler_set_master_volume(mix);
1217
if (!mix->anded_reset) {
1218
write_audio_gpio(&mix->amp_mute, 1);
1219
write_audio_gpio(&mix->hp_mute, 1);
1220
}
1221
if (chip->model == PMAC_SNAPPER) {
1222
mix->acs |= 1;
1223
i2c_smbus_write_byte_data(mix->i2c.client, TAS_REG_ACS, mix->acs);
1224
}
1225
if (mix->anded_reset) {
1226
write_audio_gpio(&mix->amp_mute, 1);
1227
write_audio_gpio(&mix->hp_mute, 1);
1228
} else
1229
write_audio_gpio(&mix->audio_reset, 1);
1230
}
1231
1232
/* resume mixer */
1233
static void tumbler_resume(struct snd_pmac *chip)
1234
{
1235
struct pmac_tumbler *mix = chip->mixer_data;
1236
1237
mix->acs &= ~1;
1238
mix->master_switch[0] = mix->save_master_switch[0];
1239
mix->master_switch[1] = mix->save_master_switch[1];
1240
mix->master_vol[0] = mix->save_master_vol[0];
1241
mix->master_vol[1] = mix->save_master_vol[1];
1242
tumbler_reset_audio(chip);
1243
if (mix->i2c.client && mix->i2c.init_client) {
1244
if (mix->i2c.init_client(&mix->i2c) < 0)
1245
printk(KERN_ERR "tumbler_init_client error\n");
1246
} else
1247
printk(KERN_ERR "tumbler: i2c is not initialized\n");
1248
if (chip->model == PMAC_TUMBLER) {
1249
tumbler_set_mono_volume(mix, &tumbler_pcm_vol_info);
1250
tumbler_set_mono_volume(mix, &tumbler_bass_vol_info);
1251
tumbler_set_mono_volume(mix, &tumbler_treble_vol_info);
1252
tumbler_set_drc(mix);
1253
} else {
1254
snapper_set_mix_vol(mix, VOL_IDX_PCM);
1255
snapper_set_mix_vol(mix, VOL_IDX_PCM2);
1256
snapper_set_mix_vol(mix, VOL_IDX_ADC);
1257
tumbler_set_mono_volume(mix, &snapper_bass_vol_info);
1258
tumbler_set_mono_volume(mix, &snapper_treble_vol_info);
1259
snapper_set_drc(mix);
1260
snapper_set_capture_source(mix);
1261
}
1262
tumbler_set_master_volume(mix);
1263
if (chip->update_automute)
1264
chip->update_automute(chip, 0);
1265
if (mix->headphone_irq >= 0) {
1266
unsigned char val;
1267
1268
enable_irq(mix->headphone_irq);
1269
/* activate headphone status interrupts */
1270
val = do_gpio_read(&mix->hp_detect);
1271
do_gpio_write(&mix->hp_detect, val | 0x80);
1272
}
1273
if (mix->lineout_irq >= 0)
1274
enable_irq(mix->lineout_irq);
1275
}
1276
#endif
1277
1278
/* initialize tumbler */
1279
static int __devinit tumbler_init(struct snd_pmac *chip)
1280
{
1281
int irq;
1282
struct pmac_tumbler *mix = chip->mixer_data;
1283
1284
if (tumbler_find_device("audio-hw-reset",
1285
"platform-do-hw-reset",
1286
&mix->audio_reset, 0) < 0)
1287
tumbler_find_device("hw-reset",
1288
"platform-do-hw-reset",
1289
&mix->audio_reset, 1);
1290
if (tumbler_find_device("amp-mute",
1291
"platform-do-amp-mute",
1292
&mix->amp_mute, 0) < 0)
1293
tumbler_find_device("amp-mute",
1294
"platform-do-amp-mute",
1295
&mix->amp_mute, 1);
1296
if (tumbler_find_device("headphone-mute",
1297
"platform-do-headphone-mute",
1298
&mix->hp_mute, 0) < 0)
1299
tumbler_find_device("headphone-mute",
1300
"platform-do-headphone-mute",
1301
&mix->hp_mute, 1);
1302
if (tumbler_find_device("line-output-mute",
1303
"platform-do-lineout-mute",
1304
&mix->line_mute, 0) < 0)
1305
tumbler_find_device("line-output-mute",
1306
"platform-do-lineout-mute",
1307
&mix->line_mute, 1);
1308
irq = tumbler_find_device("headphone-detect",
1309
NULL, &mix->hp_detect, 0);
1310
if (irq <= NO_IRQ)
1311
irq = tumbler_find_device("headphone-detect",
1312
NULL, &mix->hp_detect, 1);
1313
if (irq <= NO_IRQ)
1314
irq = tumbler_find_device("keywest-gpio15",
1315
NULL, &mix->hp_detect, 1);
1316
mix->headphone_irq = irq;
1317
irq = tumbler_find_device("line-output-detect",
1318
NULL, &mix->line_detect, 0);
1319
if (irq <= NO_IRQ)
1320
irq = tumbler_find_device("line-output-detect",
1321
NULL, &mix->line_detect, 1);
1322
if (IS_G4DA && irq <= NO_IRQ)
1323
irq = tumbler_find_device("keywest-gpio16",
1324
NULL, &mix->line_detect, 1);
1325
mix->lineout_irq = irq;
1326
1327
tumbler_reset_audio(chip);
1328
1329
return 0;
1330
}
1331
1332
static void tumbler_cleanup(struct snd_pmac *chip)
1333
{
1334
struct pmac_tumbler *mix = chip->mixer_data;
1335
if (! mix)
1336
return;
1337
1338
if (mix->headphone_irq >= 0)
1339
free_irq(mix->headphone_irq, chip);
1340
if (mix->lineout_irq >= 0)
1341
free_irq(mix->lineout_irq, chip);
1342
tumbler_gpio_free(&mix->audio_reset);
1343
tumbler_gpio_free(&mix->amp_mute);
1344
tumbler_gpio_free(&mix->hp_mute);
1345
tumbler_gpio_free(&mix->hp_detect);
1346
snd_pmac_keywest_cleanup(&mix->i2c);
1347
kfree(mix);
1348
chip->mixer_data = NULL;
1349
}
1350
1351
/* exported */
1352
int __devinit snd_pmac_tumbler_init(struct snd_pmac *chip)
1353
{
1354
int i, err;
1355
struct pmac_tumbler *mix;
1356
const u32 *paddr;
1357
struct device_node *tas_node, *np;
1358
char *chipname;
1359
1360
request_module("i2c-powermac");
1361
1362
mix = kzalloc(sizeof(*mix), GFP_KERNEL);
1363
if (! mix)
1364
return -ENOMEM;
1365
mix->headphone_irq = -1;
1366
1367
chip->mixer_data = mix;
1368
chip->mixer_free = tumbler_cleanup;
1369
mix->anded_reset = 0;
1370
mix->reset_on_sleep = 1;
1371
1372
for (np = chip->node->child; np; np = np->sibling) {
1373
if (!strcmp(np->name, "sound")) {
1374
if (of_get_property(np, "has-anded-reset", NULL))
1375
mix->anded_reset = 1;
1376
if (of_get_property(np, "layout-id", NULL))
1377
mix->reset_on_sleep = 0;
1378
break;
1379
}
1380
}
1381
if ((err = tumbler_init(chip)) < 0)
1382
return err;
1383
1384
/* set up TAS */
1385
tas_node = of_find_node_by_name(NULL, "deq");
1386
if (tas_node == NULL)
1387
tas_node = of_find_node_by_name(NULL, "codec");
1388
if (tas_node == NULL)
1389
return -ENODEV;
1390
1391
paddr = of_get_property(tas_node, "i2c-address", NULL);
1392
if (paddr == NULL)
1393
paddr = of_get_property(tas_node, "reg", NULL);
1394
if (paddr)
1395
mix->i2c.addr = (*paddr) >> 1;
1396
else
1397
mix->i2c.addr = TAS_I2C_ADDR;
1398
of_node_put(tas_node);
1399
1400
DBG("(I) TAS i2c address is: %x\n", mix->i2c.addr);
1401
1402
if (chip->model == PMAC_TUMBLER) {
1403
mix->i2c.init_client = tumbler_init_client;
1404
mix->i2c.name = "TAS3001c";
1405
chipname = "Tumbler";
1406
} else {
1407
mix->i2c.init_client = snapper_init_client;
1408
mix->i2c.name = "TAS3004";
1409
chipname = "Snapper";
1410
}
1411
1412
if ((err = snd_pmac_keywest_init(&mix->i2c)) < 0)
1413
return err;
1414
1415
/*
1416
* build mixers
1417
*/
1418
sprintf(chip->card->mixername, "PowerMac %s", chipname);
1419
1420
if (chip->model == PMAC_TUMBLER) {
1421
for (i = 0; i < ARRAY_SIZE(tumbler_mixers); i++) {
1422
if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&tumbler_mixers[i], chip))) < 0)
1423
return err;
1424
}
1425
} else {
1426
for (i = 0; i < ARRAY_SIZE(snapper_mixers); i++) {
1427
if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snapper_mixers[i], chip))) < 0)
1428
return err;
1429
}
1430
}
1431
chip->master_sw_ctl = snd_ctl_new1(&tumbler_hp_sw, chip);
1432
if ((err = snd_ctl_add(chip->card, chip->master_sw_ctl)) < 0)
1433
return err;
1434
chip->speaker_sw_ctl = snd_ctl_new1(&tumbler_speaker_sw, chip);
1435
if ((err = snd_ctl_add(chip->card, chip->speaker_sw_ctl)) < 0)
1436
return err;
1437
if (mix->line_mute.addr != 0) {
1438
chip->lineout_sw_ctl = snd_ctl_new1(&tumbler_lineout_sw, chip);
1439
if ((err = snd_ctl_add(chip->card, chip->lineout_sw_ctl)) < 0)
1440
return err;
1441
}
1442
chip->drc_sw_ctl = snd_ctl_new1(&tumbler_drc_sw, chip);
1443
if ((err = snd_ctl_add(chip->card, chip->drc_sw_ctl)) < 0)
1444
return err;
1445
1446
/* set initial DRC range to 60% */
1447
if (chip->model == PMAC_TUMBLER)
1448
mix->drc_range = (TAS3001_DRC_MAX * 6) / 10;
1449
else
1450
mix->drc_range = (TAS3004_DRC_MAX * 6) / 10;
1451
mix->drc_enable = 1; /* will be changed later if AUTO_DRC is set */
1452
if (chip->model == PMAC_TUMBLER)
1453
tumbler_set_drc(mix);
1454
else
1455
snapper_set_drc(mix);
1456
1457
#ifdef CONFIG_PM
1458
chip->suspend = tumbler_suspend;
1459
chip->resume = tumbler_resume;
1460
#endif
1461
1462
INIT_WORK(&device_change, device_change_handler);
1463
device_change_chip = chip;
1464
1465
#ifdef PMAC_SUPPORT_AUTOMUTE
1466
if ((mix->headphone_irq >=0 || mix->lineout_irq >= 0)
1467
&& (err = snd_pmac_add_automute(chip)) < 0)
1468
return err;
1469
chip->detect_headphone = tumbler_detect_headphone;
1470
chip->update_automute = tumbler_update_automute;
1471
tumbler_update_automute(chip, 0); /* update the status only */
1472
1473
/* activate headphone status interrupts */
1474
if (mix->headphone_irq >= 0) {
1475
unsigned char val;
1476
if ((err = request_irq(mix->headphone_irq, headphone_intr, 0,
1477
"Sound Headphone Detection", chip)) < 0)
1478
return 0;
1479
/* activate headphone status interrupts */
1480
val = do_gpio_read(&mix->hp_detect);
1481
do_gpio_write(&mix->hp_detect, val | 0x80);
1482
}
1483
if (mix->lineout_irq >= 0) {
1484
unsigned char val;
1485
if ((err = request_irq(mix->lineout_irq, headphone_intr, 0,
1486
"Sound Lineout Detection", chip)) < 0)
1487
return 0;
1488
/* activate headphone status interrupts */
1489
val = do_gpio_read(&mix->line_detect);
1490
do_gpio_write(&mix->line_detect, val | 0x80);
1491
}
1492
#endif
1493
1494
return 0;
1495
}
1496
1497