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; }
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); }
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); }
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); }