From bd02c3349fcf83c8262977ce20c9ad594552534c Mon Sep 17 00:00:00 2001 From: Karsten Keil Date: Tue, 27 Jan 2004 12:55:55 +0000 Subject: [PATCH] LED handler --- drivers/isdn/hardware/mISDN/w6692.c | 41 ++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/isdn/hardware/mISDN/w6692.c b/drivers/isdn/hardware/mISDN/w6692.c index 4512c99..f47c53b 100755 --- a/drivers/isdn/hardware/mISDN/w6692.c +++ b/drivers/isdn/hardware/mISDN/w6692.c @@ -58,6 +58,7 @@ typedef struct _w6692pci { u_int irqcnt; u_int addr; int pots; + int led; mISDN_HWlock_t lock; u_char imask; u_char pctl; @@ -68,6 +69,8 @@ typedef struct _w6692pci { bchannel_t bch[2]; } w6692pci; +#define W_LED1_ON 1 +#define W_LED1_S0STATUS 2 static int lock_dev(void *data, int nowait) { @@ -120,6 +123,20 @@ W6692Version(w6692pci *card, char *s) printk(KERN_INFO "%s Winbond W6692 version (%x): %s\n", s, val, W6692Ver[(val >> 6) & 3]); } +static void +w6692_led_handler(w6692pci *card, int on) +{ + if (!card->led) + return; + if (on) { + card->xdata &= 0xfb; /* LED ON */ + WriteW6692(card, W_XDATA, card->xdata); + } else { + card->xdata |= 0x04; /* LED OFF */ + WriteW6692(card, W_XDATA, card->xdata); + } +} + static void ph_command(w6692pci *card, u_char command) { @@ -404,6 +421,17 @@ handle_statusD(w6692pci *card) { mISDN_debugprint(&card->dch.inst, "ph_state_change %x -> %x", dch->ph_state, v1); dch->ph_state = v1; + if (card->led & W_LED1_S0STATUS) { + switch (v1) { + case W_L1IND_AI8: + case W_L1IND_AI10: + w6692_led_handler(card, 1); + break; + default: + w6692_led_handler(card, 0); + break; + } + } dchannel_sched_event(dch, D_L1STATECHANGE); } if (cir & W_CIR_SCC) { @@ -921,13 +949,17 @@ void initW6692(w6692pci *card) card->pctl = W_PCTL_OE5 | W_PCTL_OE4 | W_PCTL_OE2 | W_PCTL_OE1 | W_PCTL_OE0; if (card->pots) { card->xaddr = 0x00; /* all sw off */ - card->xdata = 0x06; /* LED off / POWER UP / ALAW */ + card->xdata = 0x06; /* LED OFF / POWER UP / ALAW */ WriteW6692(card, W_PCTL, card->pctl); WriteW6692(card, W_XADDR, card->xaddr); WriteW6692(card, W_XDATA, card->xdata); val = ReadW6692(card, W_XADDR); if (card->dch.debug & L1_DEB_ISAC) mISDN_debugprint(&card->dch.inst, "W_XADDR: %02x", val); + if (card->led & W_LED1_ON) + w6692_led_handler(card, 1); + else + w6692_led_handler(card, 0); } } @@ -987,6 +1019,7 @@ static int layermask[MAX_CARDS]; static mISDNobject_t w6692; static int debug; static int pots[MAX_CARDS]; +static int led[MAX_CARDS]; #ifdef MODULE MODULE_AUTHOR("Karsten Keil"); @@ -994,6 +1027,7 @@ MODULE_AUTHOR("Karsten Keil"); MODULE_LICENSE("GPL"); #endif MODULE_PARM(debug, "1i"); +MODULE_PARM(led, MODULE_PARM_T); MODULE_PARM(pots, MODULE_PARM_T); MODULE_PARM(protocol, MODULE_PARM_T); MODULE_PARM(layermask, MODULE_PARM_T); @@ -1234,6 +1268,10 @@ release_card(w6692pci *card) free_irq(card->irq, card); mode_w6692(&card->bch[0], 0, ISDN_PID_NONE); mode_w6692(&card->bch[1], 1, ISDN_PID_NONE); + if (card->led) { + card->xdata |= 0x04; /* LED OFF */ + WriteW6692(card, W_XDATA, card->xdata); + } release_region(card->addr, 256); mISDN_free_bch(&card->bch[1]); mISDN_free_bch(&card->bch[0]); @@ -1418,6 +1456,7 @@ static int __devinit setup_instance(w6692pci *card) return(err); } card->pots = pots[w6692_cnt]; + card->led = led[w6692_cnt]; w6692_cnt++; err = w6692.ctrl(NULL, MGR_NEWSTACK | REQUEST, &card->dch.inst); if (err) {