コード例 #1
0
static int mx_get_vol(int dev_id, int *value)
{
	struct sc_reg_access sc_access = {0,};
	int retval = 0, mask = 0, num_reg = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	switch (dev_id) {
	case PMIC_SND_CAPTURE_VOL:
		sc_access.reg_addr = 0x220;
		mask = MASK0|MASK1|MASK2|MASK3|MASK4;
		num_reg = 1;
		break;
	case PMIC_SND_LEFT_PB_VOL:
		sc_access.reg_addr = VOL_CTRL_LT;
		mask = MASK0|MASK1|MASK2|MASK3|MASK4|MASK5;
		num_reg = 1;
		break;
	case PMIC_SND_RIGHT_PB_VOL:
		sc_access.reg_addr = VOL_CTRL_RT;
		mask = MASK0|MASK1|MASK2|MASK3|MASK4|MASK5;
		num_reg = 1;
		break;
	}
	retval = sst_sc_reg_access(&sc_access, PMIC_READ, num_reg);
	if (retval)
		return retval;
	*value = -(sc_access.value & mask);
	pr_debug("get volume value extracted %d\n", *value);
	return retval;
}
コード例 #2
0
ファイル: intelmid_v1_control.c プロジェクト: pbugalski/linux
static int mx_power_down_pb(unsigned int device)
{
	struct sc_reg_access sc_access[3];
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	retval = mx_enable_audiodac(MUTE);
	if (retval)
		return retval;

	sc_access[0].reg_addr = ENABLE_OPDEV_CTRL;
	sc_access[0].mask  = MASK3|MASK2;
	sc_access[0].value = 0x00;

	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	return mx_enable_audiodac(UNMUTE);
}
コード例 #3
0
static int mx_set_pcm_voice_params(void)
{
	int retval = 0;
	struct sc_reg_access sc_access[] = {
		{0x200, 0x80, 0x00},
		{0x201, 0xC0, 0x00},
		{0x202, 0x00, 0x00},
		{0x203, 0x00, 0x00},
		{0x204, 0x0e, 0x00},
		{0x205, 0x20, 0x00},
		{0x206, 0x8f, 0x00},
		{0x207, 0x21, 0x00},
		{0x208, 0x18, 0x00},
		{0x209, 0x32, 0x00},
		{0x20a, 0x00, 0x00},
		{0x20b, 0x5A, 0x00},
		{0x20c, 0xBE, 0x00},/* 0x00 -> 0xBE Koski */
		{0x20d, 0x00, 0x00}, /* DAI2 'off' */
		{0x20e, 0x40, 0x00},
		{0x20f, 0x00, 0x00},
		{0x210, 0x84, 0x00},
		{0x211, 0x33, 0x00}, /* Voice filter */
		{0x212, 0x00, 0x00},
		{0x213, 0x00, 0x00},
		{0x214, 0x41, 0x00},
		{0x215, 0x00, 0x00},
		{0x216, 0x00, 0x00},
		{0x217, 0x20, 0x00},
		{0x218, 0x00, 0x00},
		{0x219, 0x00, 0x00},
		{0x21a, 0x40, 0x00},
		{0x21b, 0x40, 0x00},
		{0x21c, 0x09, 0x00},
		{0x21d, 0x09, 0x00},
		{0x21e, 0x00, 0x00},
		{0x21f, 0x00, 0x00},
		{0x220, 0x00, 0x00}, /* Microphone configurations */
		{0x221, 0x00, 0x00}, /* Microphone configurations */
		{0x222, 0x50, 0x00}, /* Microphone configurations */
		{0x223, 0x21, 0x00}, /* Microphone configurations */
		{0x224, 0x00, 0x00},
		{0x225, 0x80, 0x00},
		{0xf9, 0x40, 0x00},
		{0xfa, 0x19, 0x00},
		{0xfb, 0x19, 0x00},
		{0xfc, 0x12, 0x00},
		{0xfd, 0x12, 0x00},
		{0xfe, 0x00, 0x00},
	};

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	pr_debug("SST DBG:mx_set_pcm_voice_params called\n");
	return sst_sc_reg_access(sc_access, PMIC_WRITE, 44);
}
コード例 #4
0
static int mx_set_voice_port(int status)
{
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	if (status == ACTIVATE)
		retval = mx_set_pcm_voice_params();

	return retval;
}
コード例 #5
0
static int mx_get_mute(int dev_id, u8 *value)
{
	struct sc_reg_access sc_access[4] = {{0},};
	int retval = 0, num_reg = 0, mask = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	switch (dev_id) {
	case PMIC_SND_DMIC_MUTE:
	case PMIC_SND_AMIC_MUTE:
	case PMIC_SND_HP_MIC_MUTE:
		sc_access[0].reg_addr = 0x220;
		mask = MASK5|MASK6;
		num_reg = 1;
		retval = sst_sc_reg_access(sc_access, PMIC_READ, num_reg);
		if (retval)
			return retval;
		*value = sc_access[0].value & mask;
		if (*value)
			*value = UNMUTE;
		else
			*value = MUTE;
		return retval;
	case PMIC_SND_LEFT_HP_MUTE:
	case PMIC_SND_LEFT_SPEAKER_MUTE:
		sc_access[0].reg_addr = VOL_CTRL_LT;
		num_reg = 1;
		mask = MASK6;
		break;
	case PMIC_SND_RIGHT_HP_MUTE:
	case PMIC_SND_RIGHT_SPEAKER_MUTE:
		sc_access[0].reg_addr = VOL_CTRL_RT;
		num_reg = 1;
		mask = MASK6;
		break;
	}
	retval = sst_sc_reg_access(sc_access, PMIC_READ, num_reg);
	if (retval)
		return retval;
	*value = sc_access[0].value & mask;
	if (*value)
		*value = MUTE;
	else
		*value = UNMUTE;
	return retval;
}
コード例 #6
0
ファイル: intelmid_v1_control.c プロジェクト: pbugalski/linux
static int mx_power_down_cp(unsigned int device)
{
	struct sc_reg_access sc_access[] = {
		{ENABLE_OPDEV_CTRL, 0x00, MASK1|MASK0},
	};
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
}
コード例 #7
0
ファイル: intelmid_v1_control.c プロジェクト: pbugalski/linux
static int mx_power_up_cp(unsigned int port)
{
	int retval = 0;
	struct sc_reg_access sc_access[] = {
		{ENABLE_DEV_AND_USE_XTAL, 0x80, MASK7},
		{ENABLE_OPDEV_CTRL, 0x3, 0x3},
	};

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
}
コード例 #8
0
static int mx_set_selected_output_dev(u8 dev_id)
{
	struct sc_reg_access sc_access[2];
	int num_reg = 0;
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	pr_debug("mx_set_selected_output_dev dev_id:0x%x\n", dev_id);
	snd_pmic_ops_mx.output_dev_id = dev_id;
	switch (dev_id) {
	case STEREO_HEADPHONE:
		sc_access[0].reg_addr = 0xFF;
		sc_access[0].value = 0x8C;
		sc_access[0].mask =
			MASK2|MASK3|MASK5|MASK6|MASK4;

		num_reg = 1;
		break;
	case MONO_EARPIECE:
	case INTERNAL_SPKR:
		sc_access[0].reg_addr = 0xFF;
		sc_access[0].value = 0xb0;
		sc_access[0].mask =  MASK2|MASK3|MASK5|MASK6|MASK4;

		num_reg = 1;
		break;
	case RECEIVER:
		pr_debug("RECEIVER Koski selected\n");

		/* configuration - AS enable, receiver enable */
		sc_access[0].reg_addr = 0xFF;
		sc_access[0].value = 0x81;
		sc_access[0].mask = 0xff;

		num_reg = 1;
		break;
	default:
		pr_err("Not a valid output dev\n");
		return 0;
	}
	return sst_sc_reg_access(sc_access, PMIC_WRITE, num_reg);
}
コード例 #9
0
static int mx_set_selected_input_dev(u8 dev_id)
{
	struct sc_reg_access sc_access[2];
	int num_reg = 0;
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	snd_pmic_ops_mx.input_dev_id = dev_id;
	pr_debug("mx_set_selected_input_dev dev_id:0x%x\n", dev_id);

	switch (dev_id) {
	case AMIC:
		sc_access[0].reg_addr = 0x223;
		sc_access[0].value = 0x00;
		sc_access[0].mask = MASK7|MASK6|MASK5|MASK4|MASK0;
		sc_access[1].reg_addr = 0x222;
		sc_access[1].value = 0x50;
		sc_access[1].mask = MASK7|MASK6|MASK5|MASK4;
		num_reg = 2;
		break;

	case HS_MIC:
		sc_access[0].reg_addr = 0x223;
		sc_access[0].value = 0x20;
		sc_access[0].mask = MASK7|MASK6|MASK5|MASK4|MASK0;
		sc_access[1].reg_addr = 0x222;
		sc_access[1].value = 0x51;
		sc_access[1].mask = MASK7|MASK6|MASK5|MASK4;
		num_reg = 2;
		break;
	case DMIC:
		sc_access[1].reg_addr = 0x222;
		sc_access[1].value = 0x00;
		sc_access[1].mask = MASK7|MASK6|MASK5|MASK4|MASK0;
		sc_access[0].reg_addr = 0x223;
		sc_access[0].value = 0x20;
		sc_access[0].mask = MASK7|MASK6|MASK5|MASK4|MASK0;
		num_reg = 2;
		break;
	}
	return sst_sc_reg_access(sc_access, PMIC_WRITE, num_reg);
}
コード例 #10
0
static int mx_set_vol(int dev_id, int value)
{
	struct sc_reg_access sc_access[2] = {{0},};
	int num_reg = 0;
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	pr_debug("set_vol dev_id:0x%x ,value:%d\n", dev_id, value);
	switch (dev_id) {
	case PMIC_SND_RECEIVER_VOL:
		return 0;
		break;
	case PMIC_SND_CAPTURE_VOL:
		sc_access[0].reg_addr =	0x220;
		sc_access[1].reg_addr =	0x221;
		sc_access[0].value = sc_access[1].value = -value;
		sc_access[0].mask = sc_access[1].mask =
			(MASK0|MASK1|MASK2|MASK3|MASK4);
		num_reg = 2;
		break;
	case PMIC_SND_LEFT_PB_VOL:
		sc_access[0].value = -value;
		sc_access[0].reg_addr = VOL_CTRL_LT;
		sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
		num_reg = 1;
		break;
	case PMIC_SND_RIGHT_PB_VOL:
		sc_access[0].value = -value;
		sc_access[0].reg_addr = VOL_CTRL_RT;
		sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
		if (snd_pmic_ops_mx.num_channel == 1) {
			sc_access[0].value = 0x40;
			sc_access[0].mask = MASK6;
			sc_access[0].reg_addr = VOL_CTRL_RT;
		}
		num_reg = 1;
		break;
	}
	return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, num_reg);
}
コード例 #11
0
ファイル: intelmid_v1_control.c プロジェクト: pbugalski/linux
static int mx_power_up_pb(unsigned int port)
{

	int retval = 0;
	struct sc_reg_access sc_access[3];

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}
	retval = mx_enable_audiodac(MUTE);
	if (retval)
		return retval;

	msleep(10);

	sc_access[0].reg_addr = AS_CONFIG;
	sc_access[0].mask  = MASK7;
	sc_access[0].value = 0x80;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	sc_access[0].reg_addr = ENABLE_OPDEV_CTRL;
	sc_access[0].mask  = 0xff;
	sc_access[0].value = 0x3C;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	sc_access[0].reg_addr = ENABLE_DEV_AND_USE_XTAL;
	sc_access[0].mask  = 0x80;
	sc_access[0].value = 0x80;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	return mx_enable_audiodac(UNMUTE);
}
コード例 #12
0
ファイル: intelmid_v1_control.c プロジェクト: pbugalski/linux
static int mx_power_down(void)
{
	int retval = 0;
	struct sc_reg_access sc_access[3];

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	retval = mx_enable_audiodac(MUTE);
	if (retval)
		return retval;

	sc_access[0].reg_addr = AS_CONFIG;
	sc_access[0].mask  = MASK7;
	sc_access[0].value = 0x00;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	sc_access[0].reg_addr = ENABLE_DEV_AND_USE_XTAL;
	sc_access[0].mask  = MASK7;
	sc_access[0].value = 0x00;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	sc_access[0].reg_addr = ENABLE_OPDEV_CTRL;
	sc_access[0].mask  = MASK3|MASK2;
	sc_access[0].value = 0x00;
	retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
	if (retval)
		return retval;

	return mx_enable_audiodac(UNMUTE);
}
コード例 #13
0
static int mx_set_mute(int dev_id, u8 value)
{
	struct sc_reg_access sc_access[5];
	int num_reg = 0;
	int retval = 0;

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}


	pr_debug("set_mute dev_id:0x%x , value:%d\n", dev_id, value);

	switch (dev_id) {
	case PMIC_SND_DMIC_MUTE:
	case PMIC_SND_AMIC_MUTE:
	case PMIC_SND_HP_MIC_MUTE:
		sc_access[0].reg_addr =	0x220;
		sc_access[1].reg_addr =	0x221;
		sc_access[2].reg_addr =	0x223;
		if (value == MUTE) {
			sc_access[0].value = 0x00;
			sc_access[1].value = 0x00;
			if (snd_pmic_ops_mx.input_dev_id == DMIC)
				sc_access[2].value = 0x00;
			else
				sc_access[2].value = 0x20;
		} else {
			sc_access[0].value = 0x20;
			sc_access[1].value = 0x20;
			if (snd_pmic_ops_mx.input_dev_id == DMIC)
				sc_access[2].value = 0x20;
			else
				sc_access[2].value = 0x00;
		}
		sc_access[0].mask = MASK5|MASK6;
		sc_access[1].mask = MASK5|MASK6;
		sc_access[2].mask = MASK5|MASK6;
		num_reg = 3;
		break;
	case PMIC_SND_LEFT_SPEAKER_MUTE:
	case PMIC_SND_LEFT_HP_MUTE:
		sc_access[0].reg_addr =	VOL_CTRL_LT;
		if (value == MUTE)
			sc_access[0].value = 0x40;
		else
			sc_access[0].value = 0x00;
		sc_access[0].mask = MASK6;
		num_reg = 1;
		snd_pmic_ops_mx.mute_status = value;
		break;
	case PMIC_SND_RIGHT_SPEAKER_MUTE:
	case PMIC_SND_RIGHT_HP_MUTE:
		sc_access[0].reg_addr = VOL_CTRL_RT;
		if (snd_pmic_ops_mx.num_channel == 1)
			value = MUTE;
		if (value == MUTE)
			sc_access[0].value = 0x40;
		else
			sc_access[0].value = 0x00;
		sc_access[0].mask = MASK6;
		num_reg = 1;
		snd_pmic_ops_mx.mute_status = value;
		break;
	case PMIC_SND_MUTE_ALL:
		sc_access[0].reg_addr = VOL_CTRL_RT;
		sc_access[1].reg_addr = VOL_CTRL_LT;
		sc_access[2].reg_addr =	0x220;
		sc_access[3].reg_addr =	0x221;
		sc_access[4].reg_addr =	0x223;
		snd_pmic_ops_mx.master_mute = value;
		if (value == MUTE) {
			sc_access[0].value = sc_access[1].value = 0x40;
			sc_access[2].value = 0x00;
			sc_access[3].value = 0x00;
			if (snd_pmic_ops_mx.input_dev_id == DMIC)
				sc_access[4].value = 0x00;
			else
				sc_access[4].value = 0x20;

		} else {
			sc_access[0].value = sc_access[1].value = 0x00;
			sc_access[2].value = sc_access[3].value = 0x20;
				sc_access[4].value = 0x20;
			if (snd_pmic_ops_mx.input_dev_id == DMIC)
				sc_access[4].value = 0x20;
			else
				sc_access[4].value = 0x00;


		}
		if (snd_pmic_ops_mx.num_channel == 1)
			sc_access[0].value = 0x40;
		sc_access[0].mask = sc_access[1].mask = MASK6;
		sc_access[2].mask = MASK5|MASK6;
		sc_access[3].mask = MASK5|MASK6|MASK2|MASK4;
		sc_access[4].mask = MASK5|MASK6|MASK4;

		num_reg = 5;
		break;
	case PMIC_SND_RECEIVER_MUTE:
		sc_access[0].reg_addr =  VOL_CTRL_RT;
		if (value == MUTE)
			sc_access[0].value = 0x40;
		else
			sc_access[0].value = 0x00;
		sc_access[0].mask = MASK6;
		num_reg = 1;
		break;
	}

	return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, num_reg);
}
コード例 #14
0
static int mx_set_pcm_audio_params(int sfreq, int word_size, int num_channel)
{
	int retval = 0;

	int config1 = 0, config2 = 0, filter = 0xB3;
	struct sc_reg_access sc_access[5];

	if (snd_pmic_ops_mx.card_status == SND_CARD_UN_INIT) {
		retval = mx_init_card();
		if (retval)
			return retval;
	}

	switch (sfreq) {
	case 8000:
		config1 = 0x10;
		config2 = 0x00;
		filter = 0x33;
		break;
	case 11025:
		config1 = 0x16;
		config2 = 0x0d;
		break;
	case 12000:
		config1 = 0x18;
		config2 = 0x00;
		break;
	case 16000:
		config1 = 0x20;
		config2 = 0x00;
		break;
	case 22050:
		config1 = 0x2c;
		config2 = 0x1a;
		break;
	case 24000:
		config1 = 0x30;
		config2 = 0x00;
		break;
	case 32000:
		config1 = 0x40;
		config2 = 0x00;
		break;
	case 44100:
		config1 = 0x58;
		config2 = 0x33;
		break;
	case 48000:
		config1 = 0x60;
		config2 = 0x00;
		break;
	}
	snd_pmic_ops_mx.num_channel = num_channel;
	/*mute the right channel if MONO*/
	if (snd_pmic_ops_mx.num_channel == 1)	{
		sc_access[0].reg_addr = VOL_CTRL_RT;
		sc_access[0].value = 0x40;
		sc_access[0].mask = MASK6;

		sc_access[1].reg_addr = 0x224;
		sc_access[1].value = 0x05;
		sc_access[1].mask = MASK0|MASK1|MASK2;

		retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
		if (retval)
			return retval;
	} else {
		sc_access[0].reg_addr = VOL_CTRL_RT;
		sc_access[0].value = 0x00;
		sc_access[0].mask = MASK6;

		sc_access[1].reg_addr = 0x224;
		sc_access[1].value = 0x04;
		sc_access[1].mask = MASK0|MASK1|MASK2;

		retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
		if (retval)
			return retval;
	}
	sc_access[0].reg_addr =	0x206;
	sc_access[0].value = config1;
	sc_access[1].reg_addr = 0x207;
	sc_access[1].value = config2;

	if (word_size == 16) {
		sc_access[2].value = 0x51;
		sc_access[3].value = 0x31;
	} else if (word_size == 24) {
		sc_access[2].value = 0x52;
		sc_access[3].value = 0x92;
	}

	sc_access[2].reg_addr = 0x209;
	sc_access[3].reg_addr = 0x20e;

	sc_access[4].reg_addr = 0x211;
	sc_access[4].value = filter;

	return sst_sc_reg_access(sc_access, PMIC_WRITE, 5);
}