static void snd_ak4641_select_mic(struct snd_ak4641 *ak) { int mic = 0; u8 r_mic; if (ak->hp_connected) { /* check headset mic */ ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], R_MIC_MPWRE, R_MIC_MPWRE); snd_ak4641_hwsync_write(ak, R_MIC); snd_ak4641_hwsync_read(ak, R_STATUS); mic = (ak->regs[R_STATUS] & R_STATUS_DTMIC) == R_STATUS_DTMIC; printk("htcuniversal_ak4641_select_mic: mic=%d\n",mic); r_mic = WRITE_MASK(ak->regs[R_MIC], R_MIC_MSEL | (ak->capture_on ? R_MIC_MPWRE : 0x00), R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE); } else r_mic = WRITE_MASK(ak->regs[R_MIC], 0x00 | (ak->capture_on ? R_MIC_MPWRI : 0x00), R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE); if (r_mic != ak->regs[R_MIC]) { ak->regs[R_MIC] = r_mic; snd_ak4641_hwsync_write(ak, R_MIC); } }
static int snd_ak4641_init_regs(struct snd_ak4641 *ak) { snd_ak4641_hwsync_read_all(ak); //@@ MEMO: add some configs ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMVCM, R_PM1_PMVCM); ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC], 0x00, R_DAC_DATTC); snd_ak4641_hwsync_write(ak, R_PM1); snd_ak4641_hwsync_write(ak, R_DAC); return 0; }
static int snd_ak4641_playback_on(struct snd_ak4641 *ak) { if (ak->playback_on) return 0; ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], R_PM2_PMDAC, R_PM2_MCKPD | R_PM2_PMDAC); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO); snd_ak4641_hwsync_write(ak, R_PM2); snd_ak4641_hwsync_write(ak, R_PM1); if (ak->hp_connected) snd_ak4641_headphone_on(ak, 1); else snd_ak4641_speaker_on(ak, 1); ak->playback_on = 1; return 0; }
static int snd_ak4641_playback_off(struct snd_ak4641 *ak) { if (!ak->playback_on) return 0; ak->playback_on = 0; if (ak->hp_connected) snd_ak4641_headphone_on(ak, 0); else snd_ak4641_speaker_on(ak, 0); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO); ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], (!ak->capture_on ? R_PM2_MCKPD : 0x00) | R_PM2_PMDAC, R_PM2_MCKPD | R_PM2_PMDAC); snd_ak4641_hwsync_write(ak, R_PM1); snd_ak4641_hwsync_write(ak, R_PM2); return 0; }
static int snd_ak4641_capture_off(struct snd_ak4641 *ak) { if (!ak->capture_on) return 0; ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], 0x00, R_MIC_MPWRI | R_MIC_MPWRE | R_MIC_MSEL); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMMIC | R_PM1_PMADC); snd_ak4641_hwsync_write(ak, R_MIC); snd_ak4641_hwsync_write(ak, R_PM1); if (!ak->playback_on) { ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], R_PM2_MCKPD, R_PM2_MCKPD); snd_ak4641_hwsync_write(ak, R_PM2); } ak->capture_on = 0; return 0; }
static int snd_ak4641_uctl_mic_boost_set(struct snd_ak4641 *ak, int on) { snd_ak4641_lock(ak); ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], on ? R_MIC_MGAIN : 0x00, R_MIC_MGAIN); snd_ak4641_reg_changed(ak, R_MIC); snd_ak4641_unlock(ak); return 0; }
static int snd_ak4641_uctl_playback_switch_set(struct snd_ak4641 *ak, int on) { snd_ak4641_lock(ak); ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC], on ? 0x00 : R_DAC_SMUTE, R_DAC_SMUTE); snd_ak4641_reg_changed(ak, R_DAC); snd_ak4641_unlock(ak); return 0; }
static void snd_ak4641_speaker_on(struct snd_ak4641 *ak, int on) { if (on) { ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO); snd_ak4641_hwsync_write(ak, R_PM1); ak->speaker_out_on(1); ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], R_SEL2_PSLOL | R_SEL2_PSLOR, R_SEL2_PSLOL | R_SEL2_PSLOR); snd_ak4641_hwsync_write(ak, R_SEL2); } else { ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], 0x00, R_SEL2_PSLOL | R_SEL2_PSLOR); snd_ak4641_hwsync_write(ak, R_SEL2); ak->speaker_out_on(0); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO); snd_ak4641_hwsync_write(ak, R_PM1); } }
static int snd_ak4641_capture_on(struct snd_ak4641 *ak) { if (ak->capture_on) return 0; if (!ak->playback_on) { ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], 0x00, R_PM2_MCKPD); snd_ak4641_hwsync_write(ak, R_PM2); } ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMMIC | R_PM1_PMADC, R_PM1_PMMIC | R_PM1_PMADC); snd_ak4641_hwsync_write(ak, R_PM1); snd_ak4641_hwsync_write(ak, R_PGA); /* mic PGA gain is reset when PMMIC = 0 */ ak->capture_on = 1; snd_ak4641_select_mic(ak); msleep(47); /* accounts for ADC init cycle, time enough for fs >= 44.1 kHz */ return 0; }
static int snd_ak4641_uctl_mono_out_set(struct snd_ak4641 *ak, int on) { printk("phone mic enable called. on=%d\n",on); snd_ak4641_lock(ak); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? R_PM1_PMMIC : 0x00, R_PM1_PMMIC); ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? REG_PWR1_PMMO : 0x00, REG_PWR1_PMMO); snd_ak4641_reg_changed(ak, R_PM1); snd_ak4641_hwsync_write(ak, R_PGA); /* mic PGA gain is reset when PMMIC = 0 */ /* internal mic */ ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], on ? R_MIC_MPWRI : 0x0, R_MIC_MPWRI); ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], 0x0, R_MIC_MSEL); snd_ak4641_hwsync_write(ak, R_MIC); // ak->regs[REG_BTIF] = WRITE_MASK(ak->regs[REG_BTIF], 0x0, REG_BTIF_DAC2); // snd_ak4641_hwsync_write(ak, REG_BTIF); /* */ // ak->regs[REG_VOL] = WRITE_MASK(ak->regs[REG_VOL], on ? REG_VOL_ATTM : 0x00, REG_VOL_ATTM); // ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MOGN : 0x00, REG_SEL1_MOGN); ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MICM : 0x00, REG_SEL1_MICM); ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_PSMO : 0x00, REG_SEL1_PSMO); snd_ak4641_reg_changed(ak, R_SEL1); snd_ak4641_unlock(ak); return 0; }
ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_X), SRC0_NEG(0), SRC1_SEL(ALU_SRC_GPR_BASE + 1), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_X), SRC1_NEG(0), INDEX_MODE(SQ_INDEX_LOOP), PRED_SEL(SQ_PRED_SEL_OFF), LAST(1)), R7xx_ALU_DWORD1_OP2(SRC0_ABS(0), SRC1_ABS(0), UPDATE_EXECUTE_MASK(0), UPDATE_PRED(0), WRITE_MASK(0), FOG_MERGE(0), OMOD(SQ_ALU_OMOD_OFF), ALU_INST(SQ_OP2_INST_KILLNE), BANK_SWIZZLE(SQ_ALU_VEC_012), DST_GPR(0), DST_REL(ABSOLUTE), DST_ELEM(ELEM_X), CLAMP(0)), #endif /* TEX INST 0 */ TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0),