0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/i2c.h>
0016 #include <linux/kmod.h>
0017 #include <linux/slab.h>
0018 #include <linux/interrupt.h>
0019 #include <linux/string.h>
0020 #include <linux/of_irq.h>
0021 #include <linux/io.h>
0022 #include <sound/core.h>
0023 #include <asm/irq.h>
0024 #include <asm/machdep.h>
0025 #include <asm/pmac_feature.h>
0026 #include "pmac.h"
0027 #include "tumbler_volume.h"
0028
0029 #undef DEBUG
0030
0031 #ifdef DEBUG
0032 #define DBG(fmt...) printk(KERN_DEBUG fmt)
0033 #else
0034 #define DBG(fmt...)
0035 #endif
0036
0037 #define IS_G4DA (of_machine_is_compatible("PowerMac3,4"))
0038
0039
0040 #define TAS_I2C_ADDR 0x34
0041
0042
0043 #define TAS_REG_MCS 0x01
0044 #define TAS_REG_DRC 0x02
0045 #define TAS_REG_VOL 0x04
0046 #define TAS_REG_TREBLE 0x05
0047 #define TAS_REG_BASS 0x06
0048 #define TAS_REG_INPUT1 0x07
0049 #define TAS_REG_INPUT2 0x08
0050
0051
0052 #define TAS_REG_PCM TAS_REG_INPUT1
0053
0054
0055 #define TAS_REG_LMIX TAS_REG_INPUT1
0056 #define TAS_REG_RMIX TAS_REG_INPUT2
0057 #define TAS_REG_MCS2 0x43
0058 #define TAS_REG_ACS 0x40
0059
0060
0061 enum {
0062 VOL_IDX_PCM_MONO,
0063 VOL_IDX_BASS, VOL_IDX_TREBLE,
0064 VOL_IDX_LAST_MONO
0065 };
0066
0067
0068 enum {
0069 VOL_IDX_PCM, VOL_IDX_PCM2, VOL_IDX_ADC,
0070 VOL_IDX_LAST_MIX
0071 };
0072
0073 struct pmac_gpio {
0074 unsigned int addr;
0075 u8 active_val;
0076 u8 inactive_val;
0077 u8 active_state;
0078 };
0079
0080 struct pmac_tumbler {
0081 struct pmac_keywest i2c;
0082 struct pmac_gpio audio_reset;
0083 struct pmac_gpio amp_mute;
0084 struct pmac_gpio line_mute;
0085 struct pmac_gpio line_detect;
0086 struct pmac_gpio hp_mute;
0087 struct pmac_gpio hp_detect;
0088 int headphone_irq;
0089 int lineout_irq;
0090 unsigned int save_master_vol[2];
0091 unsigned int master_vol[2];
0092 unsigned int save_master_switch[2];
0093 unsigned int master_switch[2];
0094 unsigned int mono_vol[VOL_IDX_LAST_MONO];
0095 unsigned int mix_vol[VOL_IDX_LAST_MIX][2];
0096 int drc_range;
0097 int drc_enable;
0098 int capture_source;
0099 int anded_reset;
0100 int auto_mute_notify;
0101 int reset_on_sleep;
0102 u8 acs;
0103 };
0104
0105
0106
0107
0108
0109 static int send_init_client(struct pmac_keywest *i2c, const unsigned int *regs)
0110 {
0111 while (*regs > 0) {
0112 int err, count = 10;
0113 do {
0114 err = i2c_smbus_write_byte_data(i2c->client,
0115 regs[0], regs[1]);
0116 if (err >= 0)
0117 break;
0118 DBG("(W) i2c error %d\n", err);
0119 mdelay(10);
0120 } while (count--);
0121 if (err < 0)
0122 return -ENXIO;
0123 regs += 2;
0124 }
0125 return 0;
0126 }
0127
0128
0129 static int tumbler_init_client(struct pmac_keywest *i2c)
0130 {
0131 static const unsigned int regs[] = {
0132
0133 TAS_REG_MCS, (1<<6)|(2<<4)|(2<<2)|0,
0134 0,
0135 };
0136 DBG("(I) tumbler init client\n");
0137 return send_init_client(i2c, regs);
0138 }
0139
0140 static int snapper_init_client(struct pmac_keywest *i2c)
0141 {
0142 static const unsigned int regs[] = {
0143
0144 TAS_REG_MCS, (1<<6)|(2<<4)|0,
0145
0146 TAS_REG_MCS2, (1<<1),
0147
0148 TAS_REG_ACS, 0,
0149 0,
0150 };
0151 DBG("(I) snapper init client\n");
0152 return send_init_client(i2c, regs);
0153 }
0154
0155
0156
0157
0158 #define do_gpio_write(gp, val) \
0159 pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, (gp)->addr, val)
0160 #define do_gpio_read(gp) \
0161 pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, (gp)->addr, 0)
0162 #define tumbler_gpio_free(gp)
0163
0164 static void write_audio_gpio(struct pmac_gpio *gp, int active)
0165 {
0166 if (! gp->addr)
0167 return;
0168 active = active ? gp->active_val : gp->inactive_val;
0169 do_gpio_write(gp, active);
0170 DBG("(I) gpio %x write %d\n", gp->addr, active);
0171 }
0172
0173 static int check_audio_gpio(struct pmac_gpio *gp)
0174 {
0175 int ret;
0176
0177 if (! gp->addr)
0178 return 0;
0179
0180 ret = do_gpio_read(gp);
0181
0182 return (ret & 0x1) == (gp->active_val & 0x1);
0183 }
0184
0185 static int read_audio_gpio(struct pmac_gpio *gp)
0186 {
0187 int ret;
0188 if (! gp->addr)
0189 return 0;
0190 ret = do_gpio_read(gp);
0191 ret = (ret & 0x02) !=0;
0192 return ret == gp->active_state;
0193 }
0194
0195
0196
0197
0198 static int tumbler_set_master_volume(struct pmac_tumbler *mix)
0199 {
0200 unsigned char block[6];
0201 unsigned int left_vol, right_vol;
0202
0203 if (! mix->i2c.client)
0204 return -ENODEV;
0205
0206 if (! mix->master_switch[0])
0207 left_vol = 0;
0208 else {
0209 left_vol = mix->master_vol[0];
0210 if (left_vol >= ARRAY_SIZE(master_volume_table))
0211 left_vol = ARRAY_SIZE(master_volume_table) - 1;
0212 left_vol = master_volume_table[left_vol];
0213 }
0214 if (! mix->master_switch[1])
0215 right_vol = 0;
0216 else {
0217 right_vol = mix->master_vol[1];
0218 if (right_vol >= ARRAY_SIZE(master_volume_table))
0219 right_vol = ARRAY_SIZE(master_volume_table) - 1;
0220 right_vol = master_volume_table[right_vol];
0221 }
0222
0223 block[0] = (left_vol >> 16) & 0xff;
0224 block[1] = (left_vol >> 8) & 0xff;
0225 block[2] = (left_vol >> 0) & 0xff;
0226
0227 block[3] = (right_vol >> 16) & 0xff;
0228 block[4] = (right_vol >> 8) & 0xff;
0229 block[5] = (right_vol >> 0) & 0xff;
0230
0231 if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_VOL, 6,
0232 block) < 0) {
0233 snd_printk(KERN_ERR "failed to set volume \n");
0234 return -EINVAL;
0235 }
0236 DBG("(I) succeeded to set volume (%u, %u)\n", left_vol, right_vol);
0237 return 0;
0238 }
0239
0240
0241
0242 static int tumbler_info_master_volume(struct snd_kcontrol *kcontrol,
0243 struct snd_ctl_elem_info *uinfo)
0244 {
0245 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0246 uinfo->count = 2;
0247 uinfo->value.integer.min = 0;
0248 uinfo->value.integer.max = ARRAY_SIZE(master_volume_table) - 1;
0249 return 0;
0250 }
0251
0252 static int tumbler_get_master_volume(struct snd_kcontrol *kcontrol,
0253 struct snd_ctl_elem_value *ucontrol)
0254 {
0255 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0256 struct pmac_tumbler *mix = chip->mixer_data;
0257
0258 ucontrol->value.integer.value[0] = mix->master_vol[0];
0259 ucontrol->value.integer.value[1] = mix->master_vol[1];
0260 return 0;
0261 }
0262
0263 static int tumbler_put_master_volume(struct snd_kcontrol *kcontrol,
0264 struct snd_ctl_elem_value *ucontrol)
0265 {
0266 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0267 struct pmac_tumbler *mix = chip->mixer_data;
0268 unsigned int vol[2];
0269 int change;
0270
0271 vol[0] = ucontrol->value.integer.value[0];
0272 vol[1] = ucontrol->value.integer.value[1];
0273 if (vol[0] >= ARRAY_SIZE(master_volume_table) ||
0274 vol[1] >= ARRAY_SIZE(master_volume_table))
0275 return -EINVAL;
0276 change = mix->master_vol[0] != vol[0] ||
0277 mix->master_vol[1] != vol[1];
0278 if (change) {
0279 mix->master_vol[0] = vol[0];
0280 mix->master_vol[1] = vol[1];
0281 tumbler_set_master_volume(mix);
0282 }
0283 return change;
0284 }
0285
0286
0287 static int tumbler_get_master_switch(struct snd_kcontrol *kcontrol,
0288 struct snd_ctl_elem_value *ucontrol)
0289 {
0290 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0291 struct pmac_tumbler *mix = chip->mixer_data;
0292
0293 ucontrol->value.integer.value[0] = mix->master_switch[0];
0294 ucontrol->value.integer.value[1] = mix->master_switch[1];
0295 return 0;
0296 }
0297
0298 static int tumbler_put_master_switch(struct snd_kcontrol *kcontrol,
0299 struct snd_ctl_elem_value *ucontrol)
0300 {
0301 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0302 struct pmac_tumbler *mix = chip->mixer_data;
0303 int change;
0304
0305 change = mix->master_switch[0] != ucontrol->value.integer.value[0] ||
0306 mix->master_switch[1] != ucontrol->value.integer.value[1];
0307 if (change) {
0308 mix->master_switch[0] = !!ucontrol->value.integer.value[0];
0309 mix->master_switch[1] = !!ucontrol->value.integer.value[1];
0310 tumbler_set_master_volume(mix);
0311 }
0312 return change;
0313 }
0314
0315
0316
0317
0318
0319
0320 #define TAS3001_DRC_MAX 0x5f
0321
0322 static int tumbler_set_drc(struct pmac_tumbler *mix)
0323 {
0324 unsigned char val[2];
0325
0326 if (! mix->i2c.client)
0327 return -ENODEV;
0328
0329 if (mix->drc_enable) {
0330 val[0] = 0xc1;
0331 if (mix->drc_range > TAS3001_DRC_MAX)
0332 val[1] = 0xf0;
0333 else if (mix->drc_range < 0)
0334 val[1] = 0x91;
0335 else
0336 val[1] = mix->drc_range + 0x91;
0337 } else {
0338 val[0] = 0;
0339 val[1] = 0;
0340 }
0341
0342 if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
0343 2, val) < 0) {
0344 snd_printk(KERN_ERR "failed to set DRC\n");
0345 return -EINVAL;
0346 }
0347 DBG("(I) succeeded to set DRC (%u, %u)\n", val[0], val[1]);
0348 return 0;
0349 }
0350
0351
0352
0353
0354
0355 #define TAS3004_DRC_MAX 0xef
0356
0357 static int snapper_set_drc(struct pmac_tumbler *mix)
0358 {
0359 unsigned char val[6];
0360
0361 if (! mix->i2c.client)
0362 return -ENODEV;
0363
0364 if (mix->drc_enable)
0365 val[0] = 0x50;
0366 else
0367 val[0] = 0x51;
0368 val[1] = 0x02;
0369 if (mix->drc_range > 0xef)
0370 val[2] = 0xef;
0371 else if (mix->drc_range < 0)
0372 val[2] = 0x00;
0373 else
0374 val[2] = mix->drc_range;
0375 val[3] = 0xb0;
0376 val[4] = 0x60;
0377 val[5] = 0xa0;
0378
0379 if (i2c_smbus_write_i2c_block_data(mix->i2c.client, TAS_REG_DRC,
0380 6, val) < 0) {
0381 snd_printk(KERN_ERR "failed to set DRC\n");
0382 return -EINVAL;
0383 }
0384 DBG("(I) succeeded to set DRC (%u, %u)\n", val[0], val[1]);
0385 return 0;
0386 }
0387
0388 static int tumbler_info_drc_value(struct snd_kcontrol *kcontrol,
0389 struct snd_ctl_elem_info *uinfo)
0390 {
0391 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0392 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0393 uinfo->count = 1;
0394 uinfo->value.integer.min = 0;
0395 uinfo->value.integer.max =
0396 chip->model == PMAC_TUMBLER ? TAS3001_DRC_MAX : TAS3004_DRC_MAX;
0397 return 0;
0398 }
0399
0400 static int tumbler_get_drc_value(struct snd_kcontrol *kcontrol,
0401 struct snd_ctl_elem_value *ucontrol)
0402 {
0403 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0404 struct pmac_tumbler *mix;
0405 mix = chip->mixer_data;
0406 if (!mix)
0407 return -ENODEV;
0408 ucontrol->value.integer.value[0] = mix->drc_range;
0409 return 0;
0410 }
0411
0412 static int tumbler_put_drc_value(struct snd_kcontrol *kcontrol,
0413 struct snd_ctl_elem_value *ucontrol)
0414 {
0415 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0416 struct pmac_tumbler *mix;
0417 unsigned int val;
0418 int change;
0419
0420 mix = chip->mixer_data;
0421 if (!mix)
0422 return -ENODEV;
0423 val = ucontrol->value.integer.value[0];
0424 if (chip->model == PMAC_TUMBLER) {
0425 if (val > TAS3001_DRC_MAX)
0426 return -EINVAL;
0427 } else {
0428 if (val > TAS3004_DRC_MAX)
0429 return -EINVAL;
0430 }
0431 change = mix->drc_range != val;
0432 if (change) {
0433 mix->drc_range = val;
0434 if (chip->model == PMAC_TUMBLER)
0435 tumbler_set_drc(mix);
0436 else
0437 snapper_set_drc(mix);
0438 }
0439 return change;
0440 }
0441
0442 static int tumbler_get_drc_switch(struct snd_kcontrol *kcontrol,
0443 struct snd_ctl_elem_value *ucontrol)
0444 {
0445 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0446 struct pmac_tumbler *mix;
0447 mix = chip->mixer_data;
0448 if (!mix)
0449 return -ENODEV;
0450 ucontrol->value.integer.value[0] = mix->drc_enable;
0451 return 0;
0452 }
0453
0454 static int tumbler_put_drc_switch(struct snd_kcontrol *kcontrol,
0455 struct snd_ctl_elem_value *ucontrol)
0456 {
0457 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0458 struct pmac_tumbler *mix;
0459 int change;
0460
0461 mix = chip->mixer_data;
0462 if (!mix)
0463 return -ENODEV;
0464 change = mix->drc_enable != ucontrol->value.integer.value[0];
0465 if (change) {
0466 mix->drc_enable = !!ucontrol->value.integer.value[0];
0467 if (chip->model == PMAC_TUMBLER)
0468 tumbler_set_drc(mix);
0469 else
0470 snapper_set_drc(mix);
0471 }
0472 return change;
0473 }
0474
0475
0476
0477
0478
0479
0480 struct tumbler_mono_vol {
0481 int index;
0482 int reg;
0483 int bytes;
0484 unsigned int max;
0485 const unsigned int *table;
0486 };
0487
0488 static int tumbler_set_mono_volume(struct pmac_tumbler *mix,
0489 const struct tumbler_mono_vol *info)
0490 {
0491 unsigned char block[4];
0492 unsigned int vol;
0493 int i;
0494
0495 if (! mix->i2c.client)
0496 return -ENODEV;
0497
0498 vol = mix->mono_vol[info->index];
0499 if (vol >= info->max)
0500 vol = info->max - 1;
0501 vol = info->table[vol];
0502 for (i = 0; i < info->bytes; i++)
0503 block[i] = (vol >> ((info->bytes - i - 1) * 8)) & 0xff;
0504 if (i2c_smbus_write_i2c_block_data(mix->i2c.client, info->reg,
0505 info->bytes, block) < 0) {
0506 snd_printk(KERN_ERR "failed to set mono volume %d\n",
0507 info->index);
0508 return -EINVAL;
0509 }
0510 return 0;
0511 }
0512
0513 static int tumbler_info_mono(struct snd_kcontrol *kcontrol,
0514 struct snd_ctl_elem_info *uinfo)
0515 {
0516 struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
0517
0518 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0519 uinfo->count = 1;
0520 uinfo->value.integer.min = 0;
0521 uinfo->value.integer.max = info->max - 1;
0522 return 0;
0523 }
0524
0525 static int tumbler_get_mono(struct snd_kcontrol *kcontrol,
0526 struct snd_ctl_elem_value *ucontrol)
0527 {
0528 struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
0529 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0530 struct pmac_tumbler *mix;
0531 mix = chip->mixer_data;
0532 if (!mix)
0533 return -ENODEV;
0534 ucontrol->value.integer.value[0] = mix->mono_vol[info->index];
0535 return 0;
0536 }
0537
0538 static int tumbler_put_mono(struct snd_kcontrol *kcontrol,
0539 struct snd_ctl_elem_value *ucontrol)
0540 {
0541 struct tumbler_mono_vol *info = (struct tumbler_mono_vol *)kcontrol->private_value;
0542 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0543 struct pmac_tumbler *mix;
0544 unsigned int vol;
0545 int change;
0546
0547 mix = chip->mixer_data;
0548 if (!mix)
0549 return -ENODEV;
0550 vol = ucontrol->value.integer.value[0];
0551 if (vol >= info->max)
0552 return -EINVAL;
0553 change = mix->mono_vol[info->index] != vol;
0554 if (change) {
0555 mix->mono_vol[info->index] = vol;
0556 tumbler_set_mono_volume(mix, info);
0557 }
0558 return change;
0559 }
0560
0561
0562 static const struct tumbler_mono_vol tumbler_pcm_vol_info = {
0563 .index = VOL_IDX_PCM_MONO,
0564 .reg = TAS_REG_PCM,
0565 .bytes = 3,
0566 .max = ARRAY_SIZE(mixer_volume_table),
0567 .table = mixer_volume_table,
0568 };
0569
0570 static const struct tumbler_mono_vol tumbler_bass_vol_info = {
0571 .index = VOL_IDX_BASS,
0572 .reg = TAS_REG_BASS,
0573 .bytes = 1,
0574 .max = ARRAY_SIZE(bass_volume_table),
0575 .table = bass_volume_table,
0576 };
0577
0578 static const struct tumbler_mono_vol tumbler_treble_vol_info = {
0579 .index = VOL_IDX_TREBLE,
0580 .reg = TAS_REG_TREBLE,
0581 .bytes = 1,
0582 .max = ARRAY_SIZE(treble_volume_table),
0583 .table = treble_volume_table,
0584 };
0585
0586
0587 static const struct tumbler_mono_vol snapper_bass_vol_info = {
0588 .index = VOL_IDX_BASS,
0589 .reg = TAS_REG_BASS,
0590 .bytes = 1,
0591 .max = ARRAY_SIZE(snapper_bass_volume_table),
0592 .table = snapper_bass_volume_table,
0593 };
0594
0595 static const struct tumbler_mono_vol snapper_treble_vol_info = {
0596 .index = VOL_IDX_TREBLE,
0597 .reg = TAS_REG_TREBLE,
0598 .bytes = 1,
0599 .max = ARRAY_SIZE(snapper_treble_volume_table),
0600 .table = snapper_treble_volume_table,
0601 };
0602
0603
0604 #define DEFINE_MONO(xname,type) { \
0605 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
0606 .name = xname, \
0607 .info = tumbler_info_mono, \
0608 .get = tumbler_get_mono, \
0609 .put = tumbler_put_mono, \
0610 .private_value = (unsigned long)(&tumbler_##type##_vol_info), \
0611 }
0612
0613 #define DEFINE_SNAPPER_MONO(xname,type) { \
0614 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
0615 .name = xname, \
0616 .info = tumbler_info_mono, \
0617 .get = tumbler_get_mono, \
0618 .put = tumbler_put_mono, \
0619 .private_value = (unsigned long)(&snapper_##type##_vol_info), \
0620 }
0621
0622
0623
0624
0625
0626
0627 static int snapper_set_mix_vol1(struct pmac_tumbler *mix, int idx, int ch, int reg)
0628 {
0629 int i, j, vol;
0630 unsigned char block[9];
0631
0632 vol = mix->mix_vol[idx][ch];
0633 if (vol >= ARRAY_SIZE(mixer_volume_table)) {
0634 vol = ARRAY_SIZE(mixer_volume_table) - 1;
0635 mix->mix_vol[idx][ch] = vol;
0636 }
0637
0638 for (i = 0; i < 3; i++) {
0639 vol = mix->mix_vol[i][ch];
0640 vol = mixer_volume_table[vol];
0641 for (j = 0; j < 3; j++)
0642 block[i * 3 + j] = (vol >> ((2 - j) * 8)) & 0xff;
0643 }
0644 if (i2c_smbus_write_i2c_block_data(mix->i2c.client, reg,
0645 9, block) < 0) {
0646 snd_printk(KERN_ERR "failed to set mono volume %d\n", reg);
0647 return -EINVAL;
0648 }
0649 return 0;
0650 }
0651
0652 static int snapper_set_mix_vol(struct pmac_tumbler *mix, int idx)
0653 {
0654 if (! mix->i2c.client)
0655 return -ENODEV;
0656 if (snapper_set_mix_vol1(mix, idx, 0, TAS_REG_LMIX) < 0 ||
0657 snapper_set_mix_vol1(mix, idx, 1, TAS_REG_RMIX) < 0)
0658 return -EINVAL;
0659 return 0;
0660 }
0661
0662 static int snapper_info_mix(struct snd_kcontrol *kcontrol,
0663 struct snd_ctl_elem_info *uinfo)
0664 {
0665 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0666 uinfo->count = 2;
0667 uinfo->value.integer.min = 0;
0668 uinfo->value.integer.max = ARRAY_SIZE(mixer_volume_table) - 1;
0669 return 0;
0670 }
0671
0672 static int snapper_get_mix(struct snd_kcontrol *kcontrol,
0673 struct snd_ctl_elem_value *ucontrol)
0674 {
0675 int idx = (int)kcontrol->private_value;
0676 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0677 struct pmac_tumbler *mix;
0678 mix = chip->mixer_data;
0679 if (!mix)
0680 return -ENODEV;
0681 ucontrol->value.integer.value[0] = mix->mix_vol[idx][0];
0682 ucontrol->value.integer.value[1] = mix->mix_vol[idx][1];
0683 return 0;
0684 }
0685
0686 static int snapper_put_mix(struct snd_kcontrol *kcontrol,
0687 struct snd_ctl_elem_value *ucontrol)
0688 {
0689 int idx = (int)kcontrol->private_value;
0690 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0691 struct pmac_tumbler *mix;
0692 unsigned int vol[2];
0693 int change;
0694
0695 mix = chip->mixer_data;
0696 if (!mix)
0697 return -ENODEV;
0698 vol[0] = ucontrol->value.integer.value[0];
0699 vol[1] = ucontrol->value.integer.value[1];
0700 if (vol[0] >= ARRAY_SIZE(mixer_volume_table) ||
0701 vol[1] >= ARRAY_SIZE(mixer_volume_table))
0702 return -EINVAL;
0703 change = mix->mix_vol[idx][0] != vol[0] ||
0704 mix->mix_vol[idx][1] != vol[1];
0705 if (change) {
0706 mix->mix_vol[idx][0] = vol[0];
0707 mix->mix_vol[idx][1] = vol[1];
0708 snapper_set_mix_vol(mix, idx);
0709 }
0710 return change;
0711 }
0712
0713
0714
0715
0716
0717
0718
0719 enum { TUMBLER_MUTE_HP, TUMBLER_MUTE_AMP, TUMBLER_MUTE_LINE };
0720
0721 static int tumbler_get_mute_switch(struct snd_kcontrol *kcontrol,
0722 struct snd_ctl_elem_value *ucontrol)
0723 {
0724 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0725 struct pmac_tumbler *mix;
0726 struct pmac_gpio *gp;
0727 mix = chip->mixer_data;
0728 if (!mix)
0729 return -ENODEV;
0730 switch(kcontrol->private_value) {
0731 case TUMBLER_MUTE_HP:
0732 gp = &mix->hp_mute; break;
0733 case TUMBLER_MUTE_AMP:
0734 gp = &mix->amp_mute; break;
0735 case TUMBLER_MUTE_LINE:
0736 gp = &mix->line_mute; break;
0737 default:
0738 gp = NULL;
0739 }
0740 if (gp == NULL)
0741 return -EINVAL;
0742 ucontrol->value.integer.value[0] = !check_audio_gpio(gp);
0743 return 0;
0744 }
0745
0746 static int tumbler_put_mute_switch(struct snd_kcontrol *kcontrol,
0747 struct snd_ctl_elem_value *ucontrol)
0748 {
0749 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0750 struct pmac_tumbler *mix;
0751 struct pmac_gpio *gp;
0752 int val;
0753 #ifdef PMAC_SUPPORT_AUTOMUTE
0754 if (chip->update_automute && chip->auto_mute)
0755 return 0;
0756 #endif
0757 mix = chip->mixer_data;
0758 if (!mix)
0759 return -ENODEV;
0760 switch(kcontrol->private_value) {
0761 case TUMBLER_MUTE_HP:
0762 gp = &mix->hp_mute; break;
0763 case TUMBLER_MUTE_AMP:
0764 gp = &mix->amp_mute; break;
0765 case TUMBLER_MUTE_LINE:
0766 gp = &mix->line_mute; break;
0767 default:
0768 gp = NULL;
0769 }
0770 if (gp == NULL)
0771 return -EINVAL;
0772 val = ! check_audio_gpio(gp);
0773 if (val != ucontrol->value.integer.value[0]) {
0774 write_audio_gpio(gp, ! ucontrol->value.integer.value[0]);
0775 return 1;
0776 }
0777 return 0;
0778 }
0779
0780 static int snapper_set_capture_source(struct pmac_tumbler *mix)
0781 {
0782 if (! mix->i2c.client)
0783 return -ENODEV;
0784 if (mix->capture_source)
0785 mix->acs |= 2;
0786 else
0787 mix->acs &= ~2;
0788 return i2c_smbus_write_byte_data(mix->i2c.client, TAS_REG_ACS, mix->acs);
0789 }
0790
0791 static int snapper_info_capture_source(struct snd_kcontrol *kcontrol,
0792 struct snd_ctl_elem_info *uinfo)
0793 {
0794 static const char * const texts[2] = {
0795 "Line", "Mic"
0796 };
0797
0798 return snd_ctl_enum_info(uinfo, 1, 2, texts);
0799 }
0800
0801 static int snapper_get_capture_source(struct snd_kcontrol *kcontrol,
0802 struct snd_ctl_elem_value *ucontrol)
0803 {
0804 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0805 struct pmac_tumbler *mix = chip->mixer_data;
0806
0807 ucontrol->value.enumerated.item[0] = mix->capture_source;
0808 return 0;
0809 }
0810
0811 static int snapper_put_capture_source(struct snd_kcontrol *kcontrol,
0812 struct snd_ctl_elem_value *ucontrol)
0813 {
0814 struct snd_pmac *chip = snd_kcontrol_chip(kcontrol);
0815 struct pmac_tumbler *mix = chip->mixer_data;
0816 int change;
0817
0818 change = ucontrol->value.enumerated.item[0] != mix->capture_source;
0819 if (change) {
0820 mix->capture_source = !!ucontrol->value.enumerated.item[0];
0821 snapper_set_capture_source(mix);
0822 }
0823 return change;
0824 }
0825
0826 #define DEFINE_SNAPPER_MIX(xname,idx,ofs) { \
0827 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
0828 .name = xname, \
0829 .info = snapper_info_mix, \
0830 .get = snapper_get_mix, \
0831 .put = snapper_put_mix, \
0832 .index = idx,\
0833 .private_value = ofs, \
0834 }
0835
0836
0837
0838
0839 static const struct snd_kcontrol_new tumbler_mixers[] = {
0840 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0841 .name = "Master Playback Volume",
0842 .info = tumbler_info_master_volume,
0843 .get = tumbler_get_master_volume,
0844 .put = tumbler_put_master_volume
0845 },
0846 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0847 .name = "Master Playback Switch",
0848 .info = snd_pmac_boolean_stereo_info,
0849 .get = tumbler_get_master_switch,
0850 .put = tumbler_put_master_switch
0851 },
0852 DEFINE_MONO("Tone Control - Bass", bass),
0853 DEFINE_MONO("Tone Control - Treble", treble),
0854 DEFINE_MONO("PCM Playback Volume", pcm),
0855 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0856 .name = "DRC Range",
0857 .info = tumbler_info_drc_value,
0858 .get = tumbler_get_drc_value,
0859 .put = tumbler_put_drc_value
0860 },
0861 };
0862
0863 static const struct snd_kcontrol_new snapper_mixers[] = {
0864 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0865 .name = "Master Playback Volume",
0866 .info = tumbler_info_master_volume,
0867 .get = tumbler_get_master_volume,
0868 .put = tumbler_put_master_volume
0869 },
0870 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0871 .name = "Master Playback Switch",
0872 .info = snd_pmac_boolean_stereo_info,
0873 .get = tumbler_get_master_switch,
0874 .put = tumbler_put_master_switch
0875 },
0876 DEFINE_SNAPPER_MIX("PCM Playback Volume", 0, VOL_IDX_PCM),
0877
0878 DEFINE_SNAPPER_MIX("Mic Playback Volume", 0, VOL_IDX_PCM2),
0879 DEFINE_SNAPPER_MIX("Monitor Mix Volume", 0, VOL_IDX_ADC),
0880 DEFINE_SNAPPER_MONO("Tone Control - Bass", bass),
0881 DEFINE_SNAPPER_MONO("Tone Control - Treble", treble),
0882 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0883 .name = "DRC Range",
0884 .info = tumbler_info_drc_value,
0885 .get = tumbler_get_drc_value,
0886 .put = tumbler_put_drc_value
0887 },
0888 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0889 .name = "Input Source",
0890 .info = snapper_info_capture_source,
0891 .get = snapper_get_capture_source,
0892 .put = snapper_put_capture_source
0893 },
0894 };
0895
0896 static const struct snd_kcontrol_new tumbler_hp_sw = {
0897 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0898 .name = "Headphone Playback Switch",
0899 .info = snd_pmac_boolean_mono_info,
0900 .get = tumbler_get_mute_switch,
0901 .put = tumbler_put_mute_switch,
0902 .private_value = TUMBLER_MUTE_HP,
0903 };
0904 static const struct snd_kcontrol_new tumbler_speaker_sw = {
0905 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0906 .name = "Speaker Playback Switch",
0907 .info = snd_pmac_boolean_mono_info,
0908 .get = tumbler_get_mute_switch,
0909 .put = tumbler_put_mute_switch,
0910 .private_value = TUMBLER_MUTE_AMP,
0911 };
0912 static const struct snd_kcontrol_new tumbler_lineout_sw = {
0913 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0914 .name = "Line Out Playback Switch",
0915 .info = snd_pmac_boolean_mono_info,
0916 .get = tumbler_get_mute_switch,
0917 .put = tumbler_put_mute_switch,
0918 .private_value = TUMBLER_MUTE_LINE,
0919 };
0920 static const struct snd_kcontrol_new tumbler_drc_sw = {
0921 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
0922 .name = "DRC Switch",
0923 .info = snd_pmac_boolean_mono_info,
0924 .get = tumbler_get_drc_switch,
0925 .put = tumbler_put_drc_switch
0926 };
0927
0928
0929 #ifdef PMAC_SUPPORT_AUTOMUTE
0930
0931
0932
0933 static int tumbler_detect_headphone(struct snd_pmac *chip)
0934 {
0935 struct pmac_tumbler *mix = chip->mixer_data;
0936 int detect = 0;
0937
0938 if (mix->hp_detect.addr)
0939 detect |= read_audio_gpio(&mix->hp_detect);
0940 return detect;
0941 }
0942
0943 static int tumbler_detect_lineout(struct snd_pmac *chip)
0944 {
0945 struct pmac_tumbler *mix = chip->mixer_data;
0946 int detect = 0;
0947
0948 if (mix->line_detect.addr)
0949 detect |= read_audio_gpio(&mix->line_detect);
0950 return detect;
0951 }
0952
0953 static void check_mute(struct snd_pmac *chip, struct pmac_gpio *gp, int val, int do_notify,
0954 struct snd_kcontrol *sw)
0955 {
0956 if (check_audio_gpio(gp) != val) {
0957 write_audio_gpio(gp, val);
0958 if (do_notify)
0959 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
0960 &sw->id);
0961 }
0962 }
0963
0964 static struct work_struct device_change;
0965 static struct snd_pmac *device_change_chip;
0966
0967 static void device_change_handler(struct work_struct *work)
0968 {
0969 struct snd_pmac *chip = device_change_chip;
0970 struct pmac_tumbler *mix;
0971 int headphone, lineout;
0972
0973 if (!chip)
0974 return;
0975
0976 mix = chip->mixer_data;
0977 if (snd_BUG_ON(!mix))
0978 return;
0979
0980 headphone = tumbler_detect_headphone(chip);
0981 lineout = tumbler_detect_lineout(chip);
0982
0983 DBG("headphone: %d, lineout: %d\n", headphone, lineout);
0984
0985 if (headphone || lineout) {
0986
0987 if (headphone)
0988 check_mute(chip, &mix->hp_mute, 0, mix->auto_mute_notify,
0989 chip->master_sw_ctl);
0990 if (lineout && mix->line_mute.addr != 0)
0991 check_mute(chip, &mix->line_mute, 0, mix->auto_mute_notify,
0992 chip->lineout_sw_ctl);
0993 if (mix->anded_reset)
0994 msleep(10);
0995 check_mute(chip, &mix->amp_mute, !IS_G4DA, mix->auto_mute_notify,
0996 chip->speaker_sw_ctl);
0997 } else {
0998
0999 check_mute(chip, &mix->amp_mute, 0, mix->auto_mute_notify,
1000 chip->speaker_sw_ctl);
1001 if (mix->anded_reset)
1002 msleep(10);
1003 check_mute(chip, &mix->hp_mute, 1, mix->auto_mute_notify,
1004 chip->master_sw_ctl);
1005 if (mix->line_mute.addr != 0)
1006 check_mute(chip, &mix->line_mute, 1, mix->auto_mute_notify,
1007 chip->lineout_sw_ctl);
1008 }
1009 if (mix->auto_mute_notify)
1010 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1011 &chip->hp_detect_ctl->id);
1012
1013 #ifdef CONFIG_SND_POWERMAC_AUTO_DRC
1014 mix->drc_enable = ! (headphone || lineout);
1015 if (mix->auto_mute_notify)
1016 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1017 &chip->drc_sw_ctl->id);
1018 if (chip->model == PMAC_TUMBLER)
1019 tumbler_set_drc(mix);
1020 else
1021 snapper_set_drc(mix);
1022 #endif
1023
1024
1025 tumbler_set_master_volume(mix);
1026 }
1027
1028 static void tumbler_update_automute(struct snd_pmac *chip, int do_notify)
1029 {
1030 if (chip->auto_mute) {
1031 struct pmac_tumbler *mix;
1032 mix = chip->mixer_data;
1033 if (snd_BUG_ON(!mix))
1034 return;
1035 mix->auto_mute_notify = do_notify;
1036 schedule_work(&device_change);
1037 }
1038 }
1039 #endif
1040
1041
1042
1043 static irqreturn_t headphone_intr(int irq, void *devid)
1044 {
1045 struct snd_pmac *chip = devid;
1046 if (chip->update_automute && chip->initialized) {
1047 chip->update_automute(chip, 1);
1048 return IRQ_HANDLED;
1049 }
1050 return IRQ_NONE;
1051 }
1052
1053
1054 static struct device_node *find_audio_device(const char *name)
1055 {
1056 struct device_node *gpiop;
1057 struct device_node *np;
1058
1059 gpiop = of_find_node_by_name(NULL, "gpio");
1060 if (! gpiop)
1061 return NULL;
1062
1063 for (np = of_get_next_child(gpiop, NULL); np;
1064 np = of_get_next_child(gpiop, np)) {
1065 const char *property = of_get_property(np, "audio-gpio", NULL);
1066 if (property && strcmp(property, name) == 0)
1067 break;
1068 }
1069 of_node_put(gpiop);
1070 return np;
1071 }
1072
1073
1074 static struct device_node *find_compatible_audio_device(const char *name)
1075 {
1076 struct device_node *gpiop;
1077 struct device_node *np;
1078
1079 gpiop = of_find_node_by_name(NULL, "gpio");
1080 if (!gpiop)
1081 return NULL;
1082
1083 for (np = of_get_next_child(gpiop, NULL); np;
1084 np = of_get_next_child(gpiop, np)) {
1085 if (of_device_is_compatible(np, name))
1086 break;
1087 }
1088 of_node_put(gpiop);
1089 return np;
1090 }
1091
1092
1093 static long tumbler_find_device(const char *device, const char *platform,
1094 struct pmac_gpio *gp, int is_compatible)
1095 {
1096 struct device_node *node;
1097 const u32 *base;
1098 u32 addr;
1099 long ret;
1100
1101 if (is_compatible)
1102 node = find_compatible_audio_device(device);
1103 else
1104 node = find_audio_device(device);
1105 if (! node) {
1106 DBG("(W) cannot find audio device %s !\n", device);
1107 snd_printdd("cannot find device %s\n", device);
1108 return -ENODEV;
1109 }
1110
1111 base = of_get_property(node, "AAPL,address", NULL);
1112 if (! base) {
1113 base = of_get_property(node, "reg", NULL);
1114 if (!base) {
1115 DBG("(E) cannot find address for device %s !\n", device);
1116 snd_printd("cannot find address for device %s\n", device);
1117 of_node_put(node);
1118 return -ENODEV;
1119 }
1120 addr = *base;
1121 if (addr < 0x50)
1122 addr += 0x50;
1123 } else
1124 addr = *base;
1125
1126 gp->addr = addr & 0x0000ffff;
1127
1128 base = of_get_property(node, "audio-gpio-active-state", NULL);
1129 if (base) {
1130 gp->active_state = *base;
1131 gp->active_val = (*base) ? 0x5 : 0x4;
1132 gp->inactive_val = (*base) ? 0x4 : 0x5;
1133 } else {
1134 const u32 *prop = NULL;
1135 gp->active_state = IS_G4DA
1136 && !strncmp(device, "keywest-gpio1", 13);
1137 gp->active_val = 0x4;
1138 gp->inactive_val = 0x5;
1139
1140
1141
1142
1143 if (platform)
1144 prop = of_get_property(node, platform, NULL);
1145 if (prop) {
1146 if (prop[3] == 0x9 && prop[4] == 0x9) {
1147 gp->active_val = 0xd;
1148 gp->inactive_val = 0xc;
1149 }
1150 if (prop[3] == 0x1 && prop[4] == 0x1) {
1151 gp->active_val = 0x5;
1152 gp->inactive_val = 0x4;
1153 }
1154 }
1155 }
1156
1157 DBG("(I) GPIO device %s found, offset: %x, active state: %d !\n",
1158 device, gp->addr, gp->active_state);
1159
1160 ret = irq_of_parse_and_map(node, 0);
1161 of_node_put(node);
1162 return ret;
1163 }
1164
1165
1166 static void tumbler_reset_audio(struct snd_pmac *chip)
1167 {
1168 struct pmac_tumbler *mix = chip->mixer_data;
1169
1170 if (mix->anded_reset) {
1171 DBG("(I) codec anded reset !\n");
1172 write_audio_gpio(&mix->hp_mute, 0);
1173 write_audio_gpio(&mix->amp_mute, 0);
1174 msleep(200);
1175 write_audio_gpio(&mix->hp_mute, 1);
1176 write_audio_gpio(&mix->amp_mute, 1);
1177 msleep(100);
1178 write_audio_gpio(&mix->hp_mute, 0);
1179 write_audio_gpio(&mix->amp_mute, 0);
1180 msleep(100);
1181 } else {
1182 DBG("(I) codec normal reset !\n");
1183
1184 write_audio_gpio(&mix->audio_reset, 0);
1185 msleep(200);
1186 write_audio_gpio(&mix->audio_reset, 1);
1187 msleep(100);
1188 write_audio_gpio(&mix->audio_reset, 0);
1189 msleep(100);
1190 }
1191 }
1192
1193 #ifdef CONFIG_PM
1194
1195 static void tumbler_suspend(struct snd_pmac *chip)
1196 {
1197 struct pmac_tumbler *mix = chip->mixer_data;
1198
1199 if (mix->headphone_irq >= 0)
1200 disable_irq(mix->headphone_irq);
1201 if (mix->lineout_irq >= 0)
1202 disable_irq(mix->lineout_irq);
1203 mix->save_master_switch[0] = mix->master_switch[0];
1204 mix->save_master_switch[1] = mix->master_switch[1];
1205 mix->save_master_vol[0] = mix->master_vol[0];
1206 mix->save_master_vol[1] = mix->master_vol[1];
1207 mix->master_switch[0] = mix->master_switch[1] = 0;
1208 tumbler_set_master_volume(mix);
1209 if (!mix->anded_reset) {
1210 write_audio_gpio(&mix->amp_mute, 1);
1211 write_audio_gpio(&mix->hp_mute, 1);
1212 }
1213 if (chip->model == PMAC_SNAPPER) {
1214 mix->acs |= 1;
1215 i2c_smbus_write_byte_data(mix->i2c.client, TAS_REG_ACS, mix->acs);
1216 }
1217 if (mix->anded_reset) {
1218 write_audio_gpio(&mix->amp_mute, 1);
1219 write_audio_gpio(&mix->hp_mute, 1);
1220 } else
1221 write_audio_gpio(&mix->audio_reset, 1);
1222 }
1223
1224
1225 static void tumbler_resume(struct snd_pmac *chip)
1226 {
1227 struct pmac_tumbler *mix = chip->mixer_data;
1228
1229 mix->acs &= ~1;
1230 mix->master_switch[0] = mix->save_master_switch[0];
1231 mix->master_switch[1] = mix->save_master_switch[1];
1232 mix->master_vol[0] = mix->save_master_vol[0];
1233 mix->master_vol[1] = mix->save_master_vol[1];
1234 tumbler_reset_audio(chip);
1235 if (mix->i2c.client && mix->i2c.init_client) {
1236 if (mix->i2c.init_client(&mix->i2c) < 0)
1237 printk(KERN_ERR "tumbler_init_client error\n");
1238 } else
1239 printk(KERN_ERR "tumbler: i2c is not initialized\n");
1240 if (chip->model == PMAC_TUMBLER) {
1241 tumbler_set_mono_volume(mix, &tumbler_pcm_vol_info);
1242 tumbler_set_mono_volume(mix, &tumbler_bass_vol_info);
1243 tumbler_set_mono_volume(mix, &tumbler_treble_vol_info);
1244 tumbler_set_drc(mix);
1245 } else {
1246 snapper_set_mix_vol(mix, VOL_IDX_PCM);
1247 snapper_set_mix_vol(mix, VOL_IDX_PCM2);
1248 snapper_set_mix_vol(mix, VOL_IDX_ADC);
1249 tumbler_set_mono_volume(mix, &snapper_bass_vol_info);
1250 tumbler_set_mono_volume(mix, &snapper_treble_vol_info);
1251 snapper_set_drc(mix);
1252 snapper_set_capture_source(mix);
1253 }
1254 tumbler_set_master_volume(mix);
1255 if (chip->update_automute)
1256 chip->update_automute(chip, 0);
1257 if (mix->headphone_irq >= 0) {
1258 unsigned char val;
1259
1260 enable_irq(mix->headphone_irq);
1261
1262 val = do_gpio_read(&mix->hp_detect);
1263 do_gpio_write(&mix->hp_detect, val | 0x80);
1264 }
1265 if (mix->lineout_irq >= 0)
1266 enable_irq(mix->lineout_irq);
1267 }
1268 #endif
1269
1270
1271 static int tumbler_init(struct snd_pmac *chip)
1272 {
1273 int irq;
1274 struct pmac_tumbler *mix = chip->mixer_data;
1275
1276 if (tumbler_find_device("audio-hw-reset",
1277 "platform-do-hw-reset",
1278 &mix->audio_reset, 0) < 0)
1279 tumbler_find_device("hw-reset",
1280 "platform-do-hw-reset",
1281 &mix->audio_reset, 1);
1282 if (tumbler_find_device("amp-mute",
1283 "platform-do-amp-mute",
1284 &mix->amp_mute, 0) < 0)
1285 tumbler_find_device("amp-mute",
1286 "platform-do-amp-mute",
1287 &mix->amp_mute, 1);
1288 if (tumbler_find_device("headphone-mute",
1289 "platform-do-headphone-mute",
1290 &mix->hp_mute, 0) < 0)
1291 tumbler_find_device("headphone-mute",
1292 "platform-do-headphone-mute",
1293 &mix->hp_mute, 1);
1294 if (tumbler_find_device("line-output-mute",
1295 "platform-do-lineout-mute",
1296 &mix->line_mute, 0) < 0)
1297 tumbler_find_device("line-output-mute",
1298 "platform-do-lineout-mute",
1299 &mix->line_mute, 1);
1300 irq = tumbler_find_device("headphone-detect",
1301 NULL, &mix->hp_detect, 0);
1302 if (irq <= 0)
1303 irq = tumbler_find_device("headphone-detect",
1304 NULL, &mix->hp_detect, 1);
1305 if (irq <= 0)
1306 irq = tumbler_find_device("keywest-gpio15",
1307 NULL, &mix->hp_detect, 1);
1308 mix->headphone_irq = irq;
1309 irq = tumbler_find_device("line-output-detect",
1310 NULL, &mix->line_detect, 0);
1311 if (irq <= 0)
1312 irq = tumbler_find_device("line-output-detect",
1313 NULL, &mix->line_detect, 1);
1314 if (IS_G4DA && irq <= 0)
1315 irq = tumbler_find_device("keywest-gpio16",
1316 NULL, &mix->line_detect, 1);
1317 mix->lineout_irq = irq;
1318
1319 tumbler_reset_audio(chip);
1320
1321 return 0;
1322 }
1323
1324 static void tumbler_cleanup(struct snd_pmac *chip)
1325 {
1326 struct pmac_tumbler *mix = chip->mixer_data;
1327 if (! mix)
1328 return;
1329
1330 if (mix->headphone_irq >= 0)
1331 free_irq(mix->headphone_irq, chip);
1332 if (mix->lineout_irq >= 0)
1333 free_irq(mix->lineout_irq, chip);
1334 tumbler_gpio_free(&mix->audio_reset);
1335 tumbler_gpio_free(&mix->amp_mute);
1336 tumbler_gpio_free(&mix->hp_mute);
1337 tumbler_gpio_free(&mix->hp_detect);
1338 snd_pmac_keywest_cleanup(&mix->i2c);
1339 kfree(mix);
1340 chip->mixer_data = NULL;
1341 }
1342
1343
1344 int snd_pmac_tumbler_init(struct snd_pmac *chip)
1345 {
1346 int i, err;
1347 struct pmac_tumbler *mix;
1348 const u32 *paddr;
1349 struct device_node *tas_node, *np;
1350 char *chipname;
1351
1352 request_module("i2c-powermac");
1353
1354 mix = kzalloc(sizeof(*mix), GFP_KERNEL);
1355 if (! mix)
1356 return -ENOMEM;
1357 mix->headphone_irq = -1;
1358
1359 chip->mixer_data = mix;
1360 chip->mixer_free = tumbler_cleanup;
1361 mix->anded_reset = 0;
1362 mix->reset_on_sleep = 1;
1363
1364 for_each_child_of_node(chip->node, np) {
1365 if (of_node_name_eq(np, "sound")) {
1366 if (of_get_property(np, "has-anded-reset", NULL))
1367 mix->anded_reset = 1;
1368 if (of_get_property(np, "layout-id", NULL))
1369 mix->reset_on_sleep = 0;
1370 of_node_put(np);
1371 break;
1372 }
1373 }
1374 err = tumbler_init(chip);
1375 if (err < 0)
1376 return err;
1377
1378
1379 tas_node = of_find_node_by_name(NULL, "deq");
1380 if (tas_node == NULL)
1381 tas_node = of_find_node_by_name(NULL, "codec");
1382 if (tas_node == NULL)
1383 return -ENODEV;
1384
1385 paddr = of_get_property(tas_node, "i2c-address", NULL);
1386 if (paddr == NULL)
1387 paddr = of_get_property(tas_node, "reg", NULL);
1388 if (paddr)
1389 mix->i2c.addr = (*paddr) >> 1;
1390 else
1391 mix->i2c.addr = TAS_I2C_ADDR;
1392 of_node_put(tas_node);
1393
1394 DBG("(I) TAS i2c address is: %x\n", mix->i2c.addr);
1395
1396 if (chip->model == PMAC_TUMBLER) {
1397 mix->i2c.init_client = tumbler_init_client;
1398 mix->i2c.name = "TAS3001c";
1399 chipname = "Tumbler";
1400 } else {
1401 mix->i2c.init_client = snapper_init_client;
1402 mix->i2c.name = "TAS3004";
1403 chipname = "Snapper";
1404 }
1405
1406 err = snd_pmac_keywest_init(&mix->i2c);
1407 if (err < 0)
1408 return err;
1409
1410
1411
1412
1413 sprintf(chip->card->mixername, "PowerMac %s", chipname);
1414
1415 if (chip->model == PMAC_TUMBLER) {
1416 for (i = 0; i < ARRAY_SIZE(tumbler_mixers); i++) {
1417 err = snd_ctl_add(chip->card, snd_ctl_new1(&tumbler_mixers[i], chip));
1418 if (err < 0)
1419 return err;
1420 }
1421 } else {
1422 for (i = 0; i < ARRAY_SIZE(snapper_mixers); i++) {
1423 err = snd_ctl_add(chip->card, snd_ctl_new1(&snapper_mixers[i], chip));
1424 if (err < 0)
1425 return err;
1426 }
1427 }
1428 chip->master_sw_ctl = snd_ctl_new1(&tumbler_hp_sw, chip);
1429 err = snd_ctl_add(chip->card, chip->master_sw_ctl);
1430 if (err < 0)
1431 return err;
1432 chip->speaker_sw_ctl = snd_ctl_new1(&tumbler_speaker_sw, chip);
1433 err = snd_ctl_add(chip->card, chip->speaker_sw_ctl);
1434 if (err < 0)
1435 return err;
1436 if (mix->line_mute.addr != 0) {
1437 chip->lineout_sw_ctl = snd_ctl_new1(&tumbler_lineout_sw, chip);
1438 err = snd_ctl_add(chip->card, chip->lineout_sw_ctl);
1439 if (err < 0)
1440 return err;
1441 }
1442 chip->drc_sw_ctl = snd_ctl_new1(&tumbler_drc_sw, chip);
1443 err = snd_ctl_add(chip->card, chip->drc_sw_ctl);
1444 if (err < 0)
1445 return err;
1446
1447
1448 if (chip->model == PMAC_TUMBLER)
1449 mix->drc_range = (TAS3001_DRC_MAX * 6) / 10;
1450 else
1451 mix->drc_range = (TAS3004_DRC_MAX * 6) / 10;
1452 mix->drc_enable = 1;
1453 if (chip->model == PMAC_TUMBLER)
1454 tumbler_set_drc(mix);
1455 else
1456 snapper_set_drc(mix);
1457
1458 #ifdef CONFIG_PM
1459 chip->suspend = tumbler_suspend;
1460 chip->resume = tumbler_resume;
1461 #endif
1462
1463 INIT_WORK(&device_change, device_change_handler);
1464 device_change_chip = chip;
1465
1466 #ifdef PMAC_SUPPORT_AUTOMUTE
1467 if (mix->headphone_irq >= 0 || mix->lineout_irq >= 0) {
1468 err = snd_pmac_add_automute(chip);
1469 if (err < 0)
1470 return err;
1471 }
1472 chip->detect_headphone = tumbler_detect_headphone;
1473 chip->update_automute = tumbler_update_automute;
1474 tumbler_update_automute(chip, 0);
1475
1476
1477 if (mix->headphone_irq >= 0) {
1478 unsigned char val;
1479 err = request_irq(mix->headphone_irq, headphone_intr, 0,
1480 "Sound Headphone Detection", chip);
1481 if (err < 0)
1482 return 0;
1483
1484 val = do_gpio_read(&mix->hp_detect);
1485 do_gpio_write(&mix->hp_detect, val | 0x80);
1486 }
1487 if (mix->lineout_irq >= 0) {
1488 unsigned char val;
1489 err = request_irq(mix->lineout_irq, headphone_intr, 0,
1490 "Sound Lineout Detection", chip);
1491 if (err < 0)
1492 return 0;
1493
1494 val = do_gpio_read(&mix->line_detect);
1495 do_gpio_write(&mix->line_detect, val | 0x80);
1496 }
1497 #endif
1498
1499 return 0;
1500 }