static irqreturn_t detect_irq_handler(int irq, void *dev_id) { int value1, value2; int retry_limit = 10; unsigned long flags = 0; AJ_DBG(""); spin_lock_irqsave(&pjack_info->spin_lock, flags); pjack_info->hpin_jiffies = jiffies; spin_unlock_irqrestore(&pjack_info->spin_lock, flags); do { value1 = gpio_get_value(pjack_info->audio_jack_detect); set_irq_type(pjack_info->irq_jack, value1 ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); value2 = gpio_get_value(pjack_info->audio_jack_detect); } while (value1 != value2 && retry_limit-- > 0); AJ_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); if ((pjack_info->audio_jack_flag == 0) ^ value2) { if (pjack_info->wake_lock_ready) wake_lock_timeout (&pjack_info->audiojack_wake_lock, 4*HZ); /* Do the rest of the work in timer context */ hrtimer_start(&pjack_info->detection_timer, pjack_info->debounce_time, HRTIMER_MODE_REL); } return IRQ_HANDLED; }
static irqreturn_t detect_irq_handler(int irq, void *dev_id) { pr_info("DET IRQ Handler\n"); int value1, value2; int retry_limit = 10; hs_notify_hpin_irq(); AJ_DBG(""); do { value1 = gpio_get_value(pjack_info->audio_jack_detect); set_irq_type(pjack_info->irq_jack, value1 ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); value2 = gpio_get_value(pjack_info->audio_jack_detect); } while (value1 != value2 && retry_limit-- > 0); AJ_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); if ((pjack_info->audio_jack_flag == 0) ^ value2) { wake_lock_timeout(&pjack_info->audiojack_wake_lock, 4*HZ); /* Do the rest of the work in timer context */ hrtimer_start(&pjack_info->detection_timer, pjack_info->debounce_time, HRTIMER_MODE_REL); } return IRQ_HANDLED; }
static irqreturn_t mic_irq_handler(int irq, void *dev_id) { pr_info("MIC IRQ Handler\n"); int value1, value2; int retry_limit = 10; AJ_DBG(""); do { value1 = gpio_get_value(pjack_info->mic_detect); set_irq_type(pjack_info->irq_mic, value1 ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH); value2 = gpio_get_value(pjack_info->mic_detect); } while (value1 != value2 && retry_limit-- > 0); AJ_DBG("value2 = %d (%d retries)", value2, (10-retry_limit)); schedule_work(&pjack_info->mic_work); return IRQ_HANDLED; }
static enum hrtimer_restart detect_35mm_event_timer_func(struct hrtimer *data) { int state; AJ_DBG(""); state = !gpio_get_value(pjack_info->audio_jack_detect); if (pjack_info->audio_jack_flag != state) { pjack_info->audio_jack_flag = state; schedule_work(&pjack_info->work); } return HRTIMER_NORESTART; }
static enum hrtimer_restart detect_35mm_event_timer_func(struct hrtimer *data) { #ifdef CONFIG_HTC_HEADSET int state; AJ_DBG(""); state = !gpio_get_value(pjack_info->audio_jack_detect); if (pjack_info->audio_jack_flag != state) { pjack_info->audio_jack_flag = state; schedule_work(&pjack_info->work); } if (pjack_info->audio_jack_flag) pjack_info->debounce_time = ktime_set(0, 200000000); /*plug-out: 200ms*/ else pjack_info->debounce_time = ktime_set(0, 500000000); /*plug-in: 500ms*/ #endif return HRTIMER_NORESTART; }