static void fs_pmic_irq_cb(void *cb_data, u8 value)
{
	struct mad_jack *mjack = NULL;
	struct snd_intelmad *intelmaddata = cb_data;
	unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;

	mjack = &intelmaddata->jack[0];

	if (value & 0x4) {
		if (!jack_det_enabled)
			fs_pmic_irq_enable(intelmaddata);

		/* send headphone detect */
		pr_debug(":MAD headphone %d\n", value & 0x4);
		present = !(mjack->jack_status);
		mjack->jack_status = present;
		jack_event_flag = 1;
		mjack->jack.type = SND_JACK_HEADPHONE;
	}

	if (value & 0x2) {
		/* send short push */
		pr_debug(":MAD short push %d\n", value & 0x2);
		present = 1;
		jack_event_flag = 1;
		buttonpressflag = 1;
		mjack->jack.type = MID_JACK_HS_SHORT_PRESS;
	}

	if (value & 0x1) {
		/* send long push */
		pr_debug(":MAD long push %d\n", value & 0x1);
		present = 1;
		jack_event_flag = 1;
		buttonpressflag = 1;
		mjack->jack.type = MID_JACK_HS_LONG_PRESS;
	}

	if (value & 0x8) {
		if (!jack_det_enabled)
			fs_pmic_irq_enable(intelmaddata);
		/* send headset detect */
		pr_debug(":MAD headset = %d\n", value & 0x8);
		present = !(mjack->jack_status);
		mjack->jack_status = present;
		jack_event_flag = 1;
		mjack->jack.type = SND_JACK_HEADSET;
	}


	if (jack_event_flag)
		sst_mad_send_jack_report(&mjack->jack,
						buttonpressflag, present);

	return;
}
Example #2
0
static void msic_pmic_irq_cb(void *cb_data, u8 intsts)
{
	struct mad_jack *mjack = NULL;
	unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
	struct snd_intelmad *intelmaddata = cb_data;
	int retval = 0;

	pr_debug("value returned = 0x%x\n", intsts);

	if (snd_msic_ops.card_status == SND_CARD_UN_INIT) {
		retval = msic_init_card();
		if (retval)
			return;
	  }

	mjack = &intelmaddata->jack[0];
	if (intsts & 0x1) {
		pr_debug("MAD short_push detected\n");
		present = SND_JACK_BTN_0;
		jack_event_flag = buttonpressflag = 1;
		mjack->jack.type = SND_JACK_BTN_0;
		mjack->jack.key[0] = BTN_0 ;
	}

	if (intsts & 0x2) {
		pr_debug(":MAD long_push detected\n");
		jack_event_flag = buttonpressflag = 1;
		mjack->jack.type = present = SND_JACK_BTN_1;
		mjack->jack.key[1] = BTN_1;
	}

	if (intsts & 0x4) {
		unsigned int mic_bias;
		jack_event_flag = 1;
		buttonpressflag = 0;
		mic_bias = msic_get_mic_bias(intelmaddata);
		pr_debug("mic_bias = %d\n", mic_bias);
		mic_bias = msic_convert_adc_to_mvolt(mic_bias);
		pr_debug("mic_bias after conversion = %d mV\n", mic_bias);
		mjack->jack_dev_state = msic_get_headset_state(mic_bias);
		mjack->jack.type = present = mjack->jack_dev_state;
	}

	if (intsts & 0x8) {
		mjack->jack.type = mjack->jack_dev_state;
		present = 0;
		jack_event_flag = 1;
		buttonpressflag = 0;
		msic_disable_jack_btn();
		msic_disable_mic_bias();
	}
	if (jack_event_flag)
		sst_mad_send_jack_report(&mjack->jack,
					buttonpressflag, present);
}
Example #3
0
static void nc_pmic_irq_cb(void *cb_data, u8 intsts)
{
	u8 value = 0;
	struct mad_jack *mjack = NULL;
	unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
	struct snd_intelmad *intelmaddata = cb_data;
	struct sc_reg_access sc_access_read = {0,};

	sc_access_read.reg_addr = 0x132;
	sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
	value = (sc_access_read.value);
	pr_debug("value returned = 0x%x\n", value);

	mjack = &intelmaddata->jack[0];
	if (intsts & 0x1) {
		pr_debug("SST DBG:MAD headset detected\n");
		/* send headset detect/undetect */
		present = (value == 0x1) ? 3 : 0;
		jack_event_flag = 1;
		mjack->jack.type = SND_JACK_HEADSET;
		hp_automute(SND_JACK_HEADSET, present);
	}

	if (intsts & 0x2) {
		pr_debug(":MAD headphone detected\n");
		/* send headphone detect/undetect */
		present = (value == 0x2) ? 1 : 0;
		jack_event_flag = 1;
		mjack->jack.type = SND_JACK_HEADPHONE;
		hp_automute(SND_JACK_HEADPHONE, present);
	}

	if (intsts & 0x4) {
		pr_debug("MAD short push detected\n");
		/* send short push */
		present = 1;
		jack_event_flag = 1;
		buttonpressflag = 1;
		mjack->jack.type = MID_JACK_HS_SHORT_PRESS;
	}

	if (intsts & 0x8) {
		pr_debug(":MAD long push detected\n");
		/* send long push */
		present = 1;
		jack_event_flag = 1;
		buttonpressflag = 1;
		mjack->jack.type = MID_JACK_HS_LONG_PRESS;
	}

	if (jack_event_flag)
		sst_mad_send_jack_report(&mjack->jack,
					buttonpressflag, present);
}
Example #4
0
static void mx_pmic_irq_cb(void *cb_data, u8 intsts)
{
	u8 jack_cur_status, jack_prev_state = 0;
	struct mad_jack *mjack = NULL;
	unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
	time_t  timediff;
	struct snd_intelmad *intelmaddata = cb_data;

	mjack = &intelmaddata->jack[0];
	if (intsts & 0x2) {
		jack_cur_status = mx_get_jack_status();
		jack_prev_state = intelmaddata->jack_prev_state;
		if ((jack_prev_state == 0xc0) && (jack_cur_status == 0x40)) {
			/*headset insert detected. */
			pr_debug("MAD headset inserted\n");
			present = 1;
			jack_event_flag = 1;
			mjack->jack_status = 1;
			mjack->jack.type = SND_JACK_HEADSET;
		}

		if ((jack_prev_state == 0xc0) && (jack_cur_status == 0x00)) {
			/* headphone insert detected. */
			pr_debug("MAD headphone inserted\n");
			present = 1;
			jack_event_flag = 1;
			mjack->jack.type = SND_JACK_HEADPHONE;
		}

		if ((jack_prev_state == 0x40) && (jack_cur_status == 0xc0)) {
			/* headset remove detected. */
			pr_debug("MAD headset removed\n");

			present = 0;
			jack_event_flag = 1;
			mjack->jack_status = 0;
			mjack->jack.type = SND_JACK_HEADSET;
		}

		if ((jack_prev_state == 0x00) && (jack_cur_status == 0xc0)) {
			/* headphone remove detected. */
			pr_debug("MAD headphone removed\n");
			present = 0;
			jack_event_flag = 1;
			mjack->jack.type = SND_JACK_HEADPHONE;
		}

		if ((jack_prev_state == 0x40) && (jack_cur_status == 0x00)) {
			/* button pressed */
			do_gettimeofday(&mjack->buttonpressed);
			pr_debug("MAD button press detected\n");
		}

		if ((jack_prev_state == 0x00) && (jack_cur_status == 0x40)) {
			if (mjack->jack_status) {
				/*button pressed */
				do_gettimeofday(
					&mjack->buttonreleased);
				/*button pressed */
				pr_debug("MAD Button Released detected\n");
				timediff = mjack->buttonreleased.tv_sec -
					mjack->buttonpressed.tv_sec;
				buttonpressflag = 1;

				if (timediff > 1) {
					pr_debug("MAD long press dtd\n");
					/* send headphone detect/undetect */
					present = 1;
					jack_event_flag = 1;
					mjack->jack.type =
							MID_JACK_HS_LONG_PRESS;
				} else {
					pr_debug("MAD short press dtd\n");
					/* send headphone detect/undetect */
					present = 1;
					jack_event_flag = 1;
					mjack->jack.type =
						MID_JACK_HS_SHORT_PRESS;
				}
			} else {
				/***workaround for maxim
				hw issue,0x00 t 0x40 is not
				a valid transiton for Headset insertion */
				/*headset insert detected. */
				pr_debug("MAD headset inserted\n");
				present = 1;
				jack_event_flag = 1;
				mjack->jack_status = 1;
				mjack->jack.type = SND_JACK_HEADSET;
			}
		}
		intelmaddata->jack_prev_state  = jack_cur_status;
		pr_debug("mx_pmic_irq_cb prv_state= 0x%x\n",
					intelmaddata->jack_prev_state);
	}

	if (jack_event_flag)
		sst_mad_send_jack_report(&mjack->jack,
						buttonpressflag, present);
}