diff options
Diffstat (limited to 'drivers/dahdi/wctdm24xxp/base.c')
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 85 |
1 files changed, 58 insertions, 27 deletions
diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index 05637a0..eaad245 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -1985,6 +1985,62 @@ wctdm_check_battery_present(struct wctdm *wc, struct wctdm_module *const mod) } static void +wctdm_fxo_check_polarity(struct wctdm *wc, struct wctdm_module *const mod, + const bool positive_polarity) +{ + struct fxo *const fxo = &mod->mod.fxo; + + switch (fxo->polarity_state) { + case UNKNOWN_POLARITY: + fxo->polarity_state = (positive_polarity) ? POLARITY_POSITIVE : + POLARITY_NEGATIVE; + break; + case POLARITY_DEBOUNCE_POSITIVE: + if (!positive_polarity) { + fxo->polarity_state = POLARITY_NEGATIVE; + } else if (time_after(wc->framecount, fxo->poldebounce_timer)) { + fxo->polarity_state = POLARITY_POSITIVE; + dahdi_qevent_lock(&mod->chan->chan, + DAHDI_EVENT_POLARITY); + if (debug & DEBUG_CARD) { + dev_info(&wc->vb.pdev->dev, + "%s: Polarity NEGATIVE -> POSITIVE\n", + mod->chan->chan.name); + } + } + break; + case POLARITY_POSITIVE: + if (!positive_polarity) { + fxo->polarity_state = POLARITY_DEBOUNCE_NEGATIVE; + fxo->poldebounce_timer = wc->framecount + + POLARITY_DEBOUNCE; + } + break; + case POLARITY_DEBOUNCE_NEGATIVE: + if (positive_polarity) { + fxo->polarity_state = POLARITY_POSITIVE; + } else if (time_after(wc->framecount, fxo->poldebounce_timer)) { + dahdi_qevent_lock(&mod->chan->chan, + DAHDI_EVENT_POLARITY); + if (debug & DEBUG_CARD) { + dev_info(&wc->vb.pdev->dev, + "%s: Polarity POSITIVE -> NEGATIVE\n", + mod->chan->chan.name); + } + fxo->polarity_state = POLARITY_NEGATIVE; + } + break; + case POLARITY_NEGATIVE: + if (positive_polarity) { + fxo->polarity_state = POLARITY_DEBOUNCE_POSITIVE; + fxo->poldebounce_timer = wc->framecount + + POLARITY_DEBOUNCE; + } + break; + }; +} + +static void wctdm_voicedaa_check_hook(struct wctdm *wc, struct wctdm_module *const mod) { signed char b; @@ -2033,35 +2089,10 @@ wctdm_voicedaa_check_hook(struct wctdm *wc, struct wctdm_module *const mod) wctdm_check_battery_lost(wc, mod); } else { wctdm_check_battery_present(wc, mod); - - if (fxo->lastpol >= 0) { - if (b < 0) { - fxo->lastpol = -1; - fxo->polaritydebounce = POLARITY_DEBOUNCE / MS_PER_CHECK_HOOK; - } - } - if (fxo->lastpol <= 0) { - if (b > 0) { - fxo->lastpol = 1; - fxo->polaritydebounce = POLARITY_DEBOUNCE / MS_PER_CHECK_HOOK; - } - } + wctdm_fxo_check_polarity(wc, mod, + (fxo->line_voltage_status > 0)); } - if (fxo->polaritydebounce) { - fxo->polaritydebounce--; - if (fxo->polaritydebounce < 1) { - if (fxo->lastpol != fxo->polarity) { - if (debug & DEBUG_CARD) - dev_info(&wc->vb.pdev->dev, "%lu Polarity reversed (%d -> %d)\n", jiffies, - fxo->polarity, - fxo->lastpol); - if (fxo->polarity) - dahdi_qevent_lock(&mod->chan->chan, DAHDI_EVENT_POLARITY); - fxo->polarity = fxo->lastpol; - } - } - } /* Look for neon mwi pulse */ if (neonmwi_monitor && !fxo->offhook) { /* Look for 4 consecutive voltage readings |