예제 #1
0
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);
	}
} 
예제 #2
0
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;
}
예제 #3
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;
}
예제 #4
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;
}
예제 #5
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;
}
예제 #6
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;
}
예제 #7
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;
}
예제 #8
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);
	}
}
예제 #9
0
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;
}
예제 #10
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;
}
예제 #11
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),