92 |
snd_pmac_awacs_write(chip, val | (reg << 12)); |
snd_pmac_awacs_write(chip, val | (reg << 12)); |
93 |
} |
} |
94 |
|
|
|
static void do_mdelay(int msec, int can_schedule) |
|
|
{ |
|
|
if (can_schedule) { |
|
|
set_current_state(TASK_UNINTERRUPTIBLE); |
|
|
schedule_timeout((msec * HZ + 999) / 1000); |
|
|
} else |
|
|
mdelay(msec); |
|
|
} |
|
|
|
|
95 |
#ifdef CONFIG_PMAC_PBOOK |
#ifdef CONFIG_PMAC_PBOOK |
96 |
/* Recalibrate chip */ |
/* Recalibrate chip */ |
97 |
static void screamer_recalibrate(pmac_t *chip, int can_schedule) |
static void screamer_recalibrate(pmac_t *chip) |
98 |
{ |
{ |
99 |
if (chip->model != PMAC_SCREAMER) |
if (chip->model != PMAC_SCREAMER) |
100 |
return; |
return; |
105 |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
106 |
if (chip->manufacturer == 0x1) |
if (chip->manufacturer == 0x1) |
107 |
/* delay for broken crystal part */ |
/* delay for broken crystal part */ |
108 |
do_mdelay(750, can_schedule); |
big_mdelay(750); |
109 |
snd_pmac_awacs_write_noreg(chip, 1, |
snd_pmac_awacs_write_noreg(chip, 1, |
110 |
chip->awacs_reg[1] | MASK_RECALIBRATE | MASK_CMUTE | MASK_AMUTE); |
chip->awacs_reg[1] | MASK_RECALIBRATE | MASK_CMUTE | MASK_AMUTE); |
111 |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
113 |
} |
} |
114 |
|
|
115 |
#else |
#else |
116 |
#define screamer_recalibrate(chip, can_schedule) /* NOP */ |
#define screamer_recalibrate(chip) /* NOP */ |
117 |
#endif |
#endif |
118 |
|
|
119 |
|
|
622 |
/* |
/* |
623 |
* restore all registers |
* restore all registers |
624 |
*/ |
*/ |
625 |
static void awacs_restore_all_regs(pmac_t *chip, int can_schedule) |
static void awacs_restore_all_regs(pmac_t *chip) |
626 |
{ |
{ |
627 |
snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]); |
snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]); |
628 |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]); |
646 |
{ |
{ |
647 |
if (machine_is_compatible("PowerBook3,1") |
if (machine_is_compatible("PowerBook3,1") |
648 |
|| machine_is_compatible("PowerBook3,2")) { |
|| machine_is_compatible("PowerBook3,2")) { |
649 |
do_mdelay(100, 0); |
big_mdelay(100); |
650 |
snd_pmac_awacs_write_reg(chip, 1, |
snd_pmac_awacs_write_reg(chip, 1, |
651 |
chip->awacs_reg[1] & ~MASK_PAROUT); |
chip->awacs_reg[1] & ~MASK_PAROUT); |
652 |
do_mdelay(300, 0); |
big_mdelay(300); |
653 |
} |
} |
654 |
|
|
655 |
awacs_restore_all_regs(chip, 0); |
awacs_restore_all_regs(chip); |
656 |
if (chip->model == PMAC_SCREAMER) { |
if (chip->model == PMAC_SCREAMER) { |
657 |
/* reset power bits in reg 6 */ |
/* reset power bits in reg 6 */ |
658 |
mdelay(5); |
mdelay(5); |
659 |
snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]); |
snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]); |
660 |
} |
} |
661 |
screamer_recalibrate(chip, 0); |
screamer_recalibrate(chip); |
662 |
#ifdef PMAC_AMP_AVAIL |
#ifdef PMAC_AMP_AVAIL |
663 |
if (chip->mixer_data) { |
if (chip->mixer_data) { |
664 |
awacs_amp_t *amp = chip->mixer_data; |
awacs_amp_t *amp = chip->mixer_data; |
766 |
chip->awacs_reg[7] = 0; |
chip->awacs_reg[7] = 0; |
767 |
} |
} |
768 |
|
|
769 |
awacs_restore_all_regs(chip, 1); |
awacs_restore_all_regs(chip); |
770 |
chip->manufacturer = (in_le32(&chip->awacs->codec_stat) >> 8) & 0xf; |
chip->manufacturer = (in_le32(&chip->awacs->codec_stat) >> 8) & 0xf; |
771 |
screamer_recalibrate(chip, 1); |
screamer_recalibrate(chip); |
772 |
|
|
773 |
chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf; |
chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf; |
774 |
#ifdef PMAC_AMP_AVAIL |
#ifdef PMAC_AMP_AVAIL |