X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=drivers%2Fstaging%2Fcomedi%2Fdrivers%2Fpcl818.c;h=e95229b13118e154ae6b63a4657fec3c4c3ebd67;hb=3d1c28848ea37bf117940e10826f7a485aa32337;hp=274741f76158721003ead1416b7eea9201f39d2a;hpb=4634b8154e23ced2f70a00ab3a22e6b1987fc348;p=safe%2Fjmp%2Flinux-2.6 diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c index 274741f..e95229b 100644 --- a/drivers/staging/comedi/drivers/pcl818.c +++ b/drivers/staging/comedi/drivers/pcl818.c @@ -107,9 +107,9 @@ A word or two about DMA. Driver support DMA operations at two ways: #include "8253.h" -// #define PCL818_MODE13_AO 1 +/* #define PCL818_MODE13_AO 1 */ -// boards constants +/* boards constants */ #define boardPCL818L 0 #define boardPCL818H 1 @@ -118,60 +118,60 @@ A word or two about DMA. Driver support DMA operations at two ways: #define boardPCL818 4 #define boardPCL718 5 -// IO space len +/* IO space len */ #define PCLx1x_RANGE 16 -// IO space len if we use FIFO +/* IO space len if we use FIFO */ #define PCLx1xFIFO_RANGE 32 -// W: clear INT request +/* W: clear INT request */ #define PCL818_CLRINT 8 -// R: return status byte +/* R: return status byte */ #define PCL818_STATUS 8 -// R: A/D high byte W: A/D range control +/* R: A/D high byte W: A/D range control */ #define PCL818_RANGE 1 -// R: next mux scan channel W: mux scan channel & range control pointer +/* R: next mux scan channel W: mux scan channel & range control pointer */ #define PCL818_MUX 2 -// R/W: operation control register +/* R/W: operation control register */ #define PCL818_CONTROL 9 -// W: counter enable +/* W: counter enable */ #define PCL818_CNTENABLE 10 -// R: low byte of A/D W: soft A/D trigger +/* R: low byte of A/D W: soft A/D trigger */ #define PCL818_AD_LO 0 -// R: high byte of A/D W: A/D range control +/* R: high byte of A/D W: A/D range control */ #define PCL818_AD_HI 1 -// W: D/A low&high byte +/* W: D/A low&high byte */ #define PCL818_DA_LO 4 #define PCL818_DA_HI 5 -// R: low&high byte of DI +/* R: low&high byte of DI */ #define PCL818_DI_LO 3 #define PCL818_DI_HI 11 -// W: low&high byte of DO +/* W: low&high byte of DO */ #define PCL818_DO_LO 3 #define PCL818_DO_HI 11 -// W: PCL718 second D/A +/* W: PCL718 second D/A */ #define PCL718_DA2_LO 6 #define PCL718_DA2_HI 7 -// counters +/* counters */ #define PCL818_CTR0 12 #define PCL818_CTR1 13 #define PCL818_CTR2 14 -// W: counter control +/* W: counter control */ #define PCL818_CTRCTL 15 -// W: fifo enable/disable +/* W: fifo enable/disable */ #define PCL818_FI_ENABLE 6 -// W: fifo interrupt clear +/* W: fifo interrupt clear */ #define PCL818_FI_INTCLR 20 -// W: fifo interrupt clear +/* W: fifo interrupt clear */ #define PCL818_FI_FLUSH 25 -// R: fifo status +/* R: fifo status */ #define PCL818_FI_STATUS 25 -// R: one record from FIFO +/* R: one record from FIFO */ #define PCL818_FI_DATALO 23 #define PCL818_FI_DATAHI 23 -// type of interrupt handler +/* type of interrupt handler */ #define INT_TYPE_AI1_INT 1 #define INT_TYPE_AI1_DMA 2 #define INT_TYPE_AI1_FIFO 3 @@ -184,7 +184,7 @@ A word or two about DMA. Driver support DMA operations at two ways: #endif #ifdef unused -// RTC stuff... +/* RTC stuff... */ #define INT_TYPE_AI1_DMA_RTC 9 #define INT_TYPE_AI3_DMA_RTC 10 @@ -195,57 +195,59 @@ A word or two about DMA. Driver support DMA operations at two ways: #define MAGIC_DMA_WORD 0x5a5a static const struct comedi_lrange range_pcl818h_ai = { 9, { - BIP_RANGE(5), - BIP_RANGE(2.5), - BIP_RANGE(1.25), - BIP_RANGE(0.625), - UNI_RANGE(10), - UNI_RANGE(5), - UNI_RANGE(2.5), - UNI_RANGE(1.25), - BIP_RANGE(10), - } + BIP_RANGE(5), + BIP_RANGE(2.5), + BIP_RANGE(1.25), + BIP_RANGE(0.625), + UNI_RANGE(10), + UNI_RANGE(5), + UNI_RANGE(2.5), + UNI_RANGE(1.25), + BIP_RANGE(10), + } }; static const struct comedi_lrange range_pcl818hg_ai = { 10, { - BIP_RANGE(5), - BIP_RANGE(0.5), - BIP_RANGE(0.05), - BIP_RANGE(0.005), - UNI_RANGE(10), - UNI_RANGE(1), - UNI_RANGE(0.1), - UNI_RANGE(0.01), - BIP_RANGE(10), - BIP_RANGE(1), - BIP_RANGE(0.1), - BIP_RANGE(0.01), - } + BIP_RANGE(5), + BIP_RANGE(0.5), + BIP_RANGE(0.05), + BIP_RANGE(0.005), + UNI_RANGE(10), + UNI_RANGE(1), + UNI_RANGE(0.1), + UNI_RANGE(0.01), + BIP_RANGE(10), + BIP_RANGE(1), + BIP_RANGE(0.1), + BIP_RANGE(0.01), + } }; static const struct comedi_lrange range_pcl818l_l_ai = { 4, { - BIP_RANGE(5), - BIP_RANGE(2.5), - BIP_RANGE(1.25), - BIP_RANGE(0.625), - } + BIP_RANGE(5), + BIP_RANGE(2.5), + BIP_RANGE(1.25), + BIP_RANGE(0.625), + } }; static const struct comedi_lrange range_pcl818l_h_ai = { 4, { - BIP_RANGE(10), - BIP_RANGE(5), - BIP_RANGE(2.5), - BIP_RANGE(1.25), - } + BIP_RANGE(10), + BIP_RANGE(5), + BIP_RANGE(2.5), + BIP_RANGE(1.25), + } }; static const struct comedi_lrange range718_bipolar1 = { 1, {BIP_RANGE(1),} }; -static const struct comedi_lrange range718_bipolar0_5 = { 1, {BIP_RANGE(0.5),} }; +static const struct comedi_lrange range718_bipolar0_5 = + { 1, {BIP_RANGE(0.5),} }; static const struct comedi_lrange range718_unipolar2 = { 1, {UNI_RANGE(2),} }; static const struct comedi_lrange range718_unipolar1 = { 1, {BIP_RANGE(1),} }; -static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * it); -static int pcl818_detach(struct comedi_device * dev); +static int pcl818_attach(struct comedi_device *dev, + struct comedi_devconfig *it); +static int pcl818_detach(struct comedi_device *dev); #ifdef unused static int RTC_lock = 0; /* RTC lock */ @@ -254,130 +256,134 @@ static int RTC_timer_lock = 0; /* RTC int lock */ struct pcl818_board { - const char *name; // driver name - int n_ranges; // len of range list - int n_aichan_se; // num of A/D chans in single ended mode - int n_aichan_diff; // num of A/D chans in diferencial mode - unsigned int ns_min; // minimal alllowed delay between samples (in ns) - int n_aochan; // num of D/A chans - int n_dichan; // num of DI chans - int n_dochan; // num of DO chans - const struct comedi_lrange *ai_range_type; // default A/D rangelist - const struct comedi_lrange *ao_range_type; // default D/A rangelist - unsigned int io_range; // len of IO space - unsigned int IRQbits; // allowed interrupts - unsigned int DMAbits; // allowed DMA chans - int ai_maxdata; // maxdata for A/D - int ao_maxdata; // maxdata for D/A - unsigned char fifo; // 1=board has FIFO + const char *name; /* driver name */ + int n_ranges; /* len of range list */ + int n_aichan_se; /* num of A/D chans in single ended mode */ + int n_aichan_diff; /* num of A/D chans in diferencial mode */ + unsigned int ns_min; /* minimal alllowed delay between samples (in ns) */ + int n_aochan; /* num of D/A chans */ + int n_dichan; /* num of DI chans */ + int n_dochan; /* num of DO chans */ + const struct comedi_lrange *ai_range_type; /* default A/D rangelist */ + const struct comedi_lrange *ao_range_type; /* default D/A rangelist */ + unsigned int io_range; /* len of IO space */ + unsigned int IRQbits; /* allowed interrupts */ + unsigned int DMAbits; /* allowed DMA chans */ + int ai_maxdata; /* maxdata for A/D */ + int ao_maxdata; /* maxdata for D/A */ + unsigned char fifo; /* 1=board has FIFO */ int is_818; }; - static const struct pcl818_board boardtypes[] = { {"pcl818l", 4, 16, 8, 25000, 1, 16, 16, &range_pcl818l_l_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 0, 1}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 0, 1}, {"pcl818h", 9, 16, 8, 10000, 1, 16, 16, &range_pcl818h_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 0, 1}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 0, 1}, {"pcl818hd", 9, 16, 8, 10000, 1, 16, 16, &range_pcl818h_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 1, 1}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 1, 1}, {"pcl818hg", 12, 16, 8, 10000, 1, 16, 16, &range_pcl818hg_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 1, 1}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 1, 1}, {"pcl818", 9, 16, 8, 10000, 2, 16, 16, &range_pcl818h_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 0, 1}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 0, 1}, {"pcl718", 1, 16, 8, 16000, 2, 16, 16, &range_unipolar5, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 0, 0}, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 0, 0}, /* pcm3718 */ {"pcm3718", 9, 16, 8, 10000, 0, 16, 16, &range_pcl818h_ai, - &range_unipolar5, PCLx1x_RANGE, 0x00fc, - 0x0a, 0xfff, 0xfff, 0, 1 /* XXX ? */ }, + &range_unipolar5, PCLx1x_RANGE, 0x00fc, + 0x0a, 0xfff, 0xfff, 0, 1 /* XXX ? */ }, }; #define n_boardtypes (sizeof(boardtypes)/sizeof(struct pcl818_board)) static struct comedi_driver driver_pcl818 = { - driver_name:"pcl818", - module:THIS_MODULE, - attach:pcl818_attach, - detach:pcl818_detach, - board_name:&boardtypes[0].name, - num_names:n_boardtypes, - offset:sizeof(struct pcl818_board), + .driver_name = "pcl818", + .module = THIS_MODULE, + .attach = pcl818_attach, + .detach = pcl818_detach, + .board_name = &boardtypes[0].name, + .num_names = n_boardtypes, + .offset = sizeof(struct pcl818_board), }; COMEDI_INITCLEANUP(driver_pcl818); -typedef struct { - unsigned int dma; // used DMA, 0=don't use DMA - int dma_rtc; // 1=RTC used with DMA, 0=no RTC alloc +struct pcl818_private { + + unsigned int dma; /* used DMA, 0=don't use DMA */ + int dma_rtc; /* 1=RTC used with DMA, 0=no RTC alloc */ unsigned int io_range; #ifdef unused - unsigned long rtc_iobase; // RTC port region + unsigned long rtc_iobase; /* RTC port region */ unsigned int rtc_iosize; unsigned int rtc_irq; - struct timer_list rtc_irq_timer; // timer for RTC sanity check - unsigned long rtc_freq; // RTC int freq - int rtc_irq_blocked; // 1=we now do AI with DMA&RTC + struct timer_list rtc_irq_timer; /* timer for RTC sanity check */ + unsigned long rtc_freq; /* RTC int freq */ + int rtc_irq_blocked; /* 1=we now do AI with DMA&RTC */ #endif - unsigned long dmabuf[2]; // pointers to begin of DMA buffers - unsigned int dmapages[2]; // len of DMA buffers in PAGE_SIZEs - unsigned int hwdmaptr[2]; // hardware address of DMA buffers - unsigned int hwdmasize[2]; // len of DMA buffers in Bytes - unsigned int dmasamplsize; // size in samples hwdmasize[0]/2 - unsigned int last_top_dma; // DMA pointer in last RTC int - int next_dma_buf; // which DMA buffer will be used next round - long dma_runs_to_end; // how many we must permorm DMA transfer to end of record - unsigned long last_dma_run; // how many bytes we must transfer on last DMA page - unsigned char neverending_ai; // if=1, then we do neverending record (you must use cancel()) - unsigned int ns_min; // manimal alllowed delay between samples (in us) for actual card - int i8253_osc_base; // 1/frequency of on board oscilator in ns - int irq_free; // 1=have allocated IRQ - int irq_blocked; // 1=IRQ now uses any subdev - int irq_was_now_closed; // when IRQ finish, there's stored int818_mode for last interrupt - int ai_mode; // who now uses IRQ - 1=AI1 int, 2=AI1 dma, 3=AI3 int, 4AI3 dma - struct comedi_subdevice *last_int_sub; // ptr to subdevice which now finish - int ai_act_scan; // how many scans we finished - int ai_act_chan; // actual position in actual scan - unsigned int act_chanlist[16]; // MUX setting for actual AI operations - unsigned int act_chanlist_len; // how long is actual MUX list - unsigned int act_chanlist_pos; // actual position in MUX list - unsigned int ai_scans; // len of scanlist - unsigned int ai_n_chan; // how many channels is measured - unsigned int *ai_chanlist; // actaul chanlist - unsigned int ai_flags; // flaglist - unsigned int ai_data_len; // len of data buffer - short *ai_data; // data buffer - unsigned int ai_timer1; // timers + unsigned long dmabuf[2]; /* pointers to begin of DMA buffers */ + unsigned int dmapages[2]; /* len of DMA buffers in PAGE_SIZEs */ + unsigned int hwdmaptr[2]; /* hardware address of DMA buffers */ + unsigned int hwdmasize[2]; /* len of DMA buffers in Bytes */ + unsigned int dmasamplsize; /* size in samples hwdmasize[0]/2 */ + unsigned int last_top_dma; /* DMA pointer in last RTC int */ + int next_dma_buf; /* which DMA buffer will be used next round */ + long dma_runs_to_end; /* how many we must permorm DMA transfer to end of record */ + unsigned long last_dma_run; /* how many bytes we must transfer on last DMA page */ + unsigned char neverending_ai; /* if=1, then we do neverending record (you must use cancel()) */ + unsigned int ns_min; /* manimal alllowed delay between samples (in us) for actual card */ + int i8253_osc_base; /* 1/frequency of on board oscilator in ns */ + int irq_free; /* 1=have allocated IRQ */ + int irq_blocked; /* 1=IRQ now uses any subdev */ + int irq_was_now_closed; /* when IRQ finish, there's stored int818_mode for last interrupt */ + int ai_mode; /* who now uses IRQ - 1=AI1 int, 2=AI1 dma, 3=AI3 int, 4AI3 dma */ + struct comedi_subdevice *last_int_sub; /* ptr to subdevice which now finish */ + int ai_act_scan; /* how many scans we finished */ + int ai_act_chan; /* actual position in actual scan */ + unsigned int act_chanlist[16]; /* MUX setting for actual AI operations */ + unsigned int act_chanlist_len; /* how long is actual MUX list */ + unsigned int act_chanlist_pos; /* actual position in MUX list */ + unsigned int ai_scans; /* len of scanlist */ + unsigned int ai_n_chan; /* how many channels is measured */ + unsigned int *ai_chanlist; /* actaul chanlist */ + unsigned int ai_flags; /* flaglist */ + unsigned int ai_data_len; /* len of data buffer */ + short *ai_data; /* data buffer */ + unsigned int ai_timer1; /* timers */ unsigned int ai_timer2; - struct comedi_subdevice *sub_ai; // ptr to AI subdevice - unsigned char usefifo; // 1=use fifo + struct comedi_subdevice *sub_ai; /* ptr to AI subdevice */ + unsigned char usefifo; /* 1=use fifo */ unsigned int ao_readback[2]; -} pcl818_private; +}; -static const unsigned int muxonechan[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // used for gain list programming +static const unsigned int muxonechan[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, /* used for gain list programming */ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; -#define devpriv ((pcl818_private *)dev->private) +#define devpriv ((struct pcl818_private *)dev->private) #define this_board ((const struct pcl818_board *)dev->board_ptr) /* ============================================================================== */ -static void setup_channel_list(struct comedi_device * dev, struct comedi_subdevice * s, - unsigned int *chanlist, unsigned int n_chan, unsigned int seglen); -static int check_channel_list(struct comedi_device * dev, struct comedi_subdevice * s, - unsigned int *chanlist, unsigned int n_chan); - -static int pcl818_ai_cancel(struct comedi_device * dev, struct comedi_subdevice * s); -static void start_pacer(struct comedi_device * dev, int mode, unsigned int divisor1, - unsigned int divisor2); +static void setup_channel_list(struct comedi_device *dev, + struct comedi_subdevice *s, + unsigned int *chanlist, unsigned int n_chan, + unsigned int seglen); +static int check_channel_list(struct comedi_device *dev, + struct comedi_subdevice *s, + unsigned int *chanlist, unsigned int n_chan); + +static int pcl818_ai_cancel(struct comedi_device *dev, + struct comedi_subdevice *s); +static void start_pacer(struct comedi_device *dev, int mode, + unsigned int divisor1, unsigned int divisor2); #ifdef unused static int set_rtc_irq_bit(unsigned char bit); @@ -389,8 +395,9 @@ static int rtc_setfreq_irq(int freq); ============================================================================== ANALOG INPUT MODE0, 818 cards, slow version */ -static int pcl818_ai_insn_read(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_insn * insn, unsigned int * data) +static int pcl818_ai_insn_read(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) { int n; int timeout; @@ -416,16 +423,16 @@ static int pcl818_ai_insn_read(struct comedi_device * dev, struct comedi_subdevi while (timeout--) { if (inb(dev->iobase + PCL818_STATUS) & 0x10) goto conv_finish; - comedi_udelay(1); + udelay(1); } comedi_error(dev, "A/D insn timeout"); /* clear INT (conversion end) flag */ outb(0, dev->iobase + PCL818_CLRINT); return -EIO; - conv_finish: +conv_finish: data[n] = ((inb(dev->iobase + PCL818_AD_HI) << 4) | - (inb(dev->iobase + PCL818_AD_LO) >> 4)); + (inb(dev->iobase + PCL818_AD_LO) >> 4)); } return n; @@ -436,8 +443,9 @@ static int pcl818_ai_insn_read(struct comedi_device * dev, struct comedi_subdevi ANALOG OUTPUT MODE0, 818 cards only one sample per call is supported */ -static int pcl818_ao_insn_read(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_insn * insn, unsigned int * data) +static int pcl818_ao_insn_read(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) { int n; int chan = CR_CHAN(insn->chanspec); @@ -449,8 +457,9 @@ static int pcl818_ao_insn_read(struct comedi_device * dev, struct comedi_subdevi return n; } -static int pcl818_ao_insn_write(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_insn * insn, unsigned int * data) +static int pcl818_ao_insn_write(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) { int n; int chan = CR_CHAN(insn->chanspec); @@ -458,9 +467,9 @@ static int pcl818_ao_insn_write(struct comedi_device * dev, struct comedi_subdev for (n = 0; n < insn->n; n++) { devpriv->ao_readback[chan] = data[n]; outb((data[n] & 0x000f) << 4, dev->iobase + - (chan) ? PCL718_DA2_LO : PCL818_DA_LO); + (chan ? PCL718_DA2_LO : PCL818_DA_LO)); outb((data[n] & 0x0ff0) >> 4, dev->iobase + - (chan) ? PCL718_DA2_HI : PCL818_DA_HI); + (chan ? PCL718_DA2_HI : PCL818_DA_HI)); } return n; @@ -472,14 +481,15 @@ static int pcl818_ao_insn_write(struct comedi_device * dev, struct comedi_subdev only one sample per call is supported */ -static int pcl818_di_insn_bits(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_insn * insn, unsigned int * data) +static int pcl818_di_insn_bits(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) { if (insn->n != 2) return -EINVAL; data[1] = inb(dev->iobase + PCL818_DI_LO) | - (inb(dev->iobase + PCL818_DI_HI) << 8); + (inb(dev->iobase + PCL818_DI_HI) << 8); return 2; } @@ -490,8 +500,9 @@ static int pcl818_di_insn_bits(struct comedi_device * dev, struct comedi_subdevi only one sample per call is supported */ -static int pcl818_do_insn_bits(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_insn * insn, unsigned int * data) +static int pcl818_do_insn_bits(struct comedi_device *dev, + struct comedi_subdevice *s, + struct comedi_insn *insn, unsigned int *data) { if (insn->n != 2) return -EINVAL; @@ -522,7 +533,7 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d) while (timeout--) { if (inb(dev->iobase + PCL818_STATUS) & 0x10) goto conv_finish; - comedi_udelay(1); + udelay(1); } outb(0, dev->iobase + PCL818_STATUS); /* clear INT request */ comedi_error(dev, "A/D mode1/3 IRQ without DRDY!"); @@ -531,23 +542,23 @@ static irqreturn_t interrupt_pcl818_ai_mode13_int(int irq, void *d) comedi_event(dev, s); return IRQ_HANDLED; - conv_finish: +conv_finish: low = inb(dev->iobase + PCL818_AD_LO); - comedi_buf_put(s->async, ((inb(dev->iobase + PCL818_AD_HI) << 4) | (low >> 4))); // get one sample + comedi_buf_put(s->async, ((inb(dev->iobase + PCL818_AD_HI) << 4) | (low >> 4))); /* get one sample */ outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */ - if ((low & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout! - rt_printk - ("comedi: A/D mode1/3 IRQ - channel dropout %x!=%x !\n", - (low & 0xf), - devpriv->act_chanlist[devpriv->act_chanlist_pos]); + if ((low & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { /* dropout! */ + printk + ("comedi: A/D mode1/3 IRQ - channel dropout %x!=%x !\n", + (low & 0xf), + devpriv->act_chanlist[devpriv->act_chanlist_pos]); pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; comedi_event(dev, s); return IRQ_HANDLED; } if (s->async->cur_chan == 0) { - // rt_printk("E"); + /* printk("E"); */ devpriv->ai_act_scan--; } @@ -575,44 +586,44 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d) disable_dma(devpriv->dma); devpriv->next_dma_buf = 1 - devpriv->next_dma_buf; - if ((devpriv->dma_runs_to_end) > -1 || devpriv->neverending_ai) { // switch dma bufs + if ((devpriv->dma_runs_to_end) > -1 || devpriv->neverending_ai) { /* switch dma bufs */ set_dma_mode(devpriv->dma, DMA_MODE_READ); flags = claim_dma_lock(); set_dma_addr(devpriv->dma, - devpriv->hwdmaptr[devpriv->next_dma_buf]); + devpriv->hwdmaptr[devpriv->next_dma_buf]); if (devpriv->dma_runs_to_end || devpriv->neverending_ai) { set_dma_count(devpriv->dma, - devpriv->hwdmasize[devpriv->next_dma_buf]); + devpriv->hwdmasize[devpriv-> + next_dma_buf]); } else { set_dma_count(devpriv->dma, devpriv->last_dma_run); } release_dma_lock(flags); enable_dma(devpriv->dma); } - rt_printk("comedi: A/D mode1/3 IRQ \n"); + printk("comedi: A/D mode1/3 IRQ \n"); devpriv->dma_runs_to_end--; outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */ - ptr = (short *) devpriv->dmabuf[1 - devpriv->next_dma_buf]; + ptr = (short *)devpriv->dmabuf[1 - devpriv->next_dma_buf]; len = devpriv->hwdmasize[0] >> 1; bufptr = 0; for (i = 0; i < len; i++) { - if ((ptr[bufptr] & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout! - rt_printk - ("comedi: A/D mode1/3 DMA - channel dropout %d(card)!=%d(chanlist) at %d !\n", - (ptr[bufptr] & 0xf), - devpriv->act_chanlist[devpriv-> - act_chanlist_pos], - devpriv->act_chanlist_pos); + if ((ptr[bufptr] & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { /* dropout! */ + printk + ("comedi: A/D mode1/3 DMA - channel dropout %d(card)!=%d(chanlist) at %d !\n", + (ptr[bufptr] & 0xf), + devpriv->act_chanlist[devpriv->act_chanlist_pos], + devpriv->act_chanlist_pos); pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; comedi_event(dev, s); return IRQ_HANDLED; } - comedi_buf_put(s->async, ptr[bufptr++] >> 4); // get one sample + comedi_buf_put(s->async, ptr[bufptr++] >> 4); /* get one sample */ devpriv->act_chanlist_pos++; if (devpriv->act_chanlist_pos >= devpriv->act_chanlist_len) { @@ -625,7 +636,7 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma(int irq, void *d) pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA; comedi_event(dev, s); - // printk("done int ai13 dma\n"); + /* printk("done int ai13 dma\n"); */ return IRQ_HANDLED; } } @@ -647,15 +658,15 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma_rtc(int irq, void *d) unsigned long tmp; unsigned int top1, top2, i, bufptr; long ofs_dats; - short *dmabuf = (short *) devpriv->dmabuf[0]; + short *dmabuf = (short *)devpriv->dmabuf[0]; - //outb(2,0x378); + /* outb(2,0x378); */ switch (devpriv->ai_mode) { case INT_TYPE_AI1_DMA_RTC: case INT_TYPE_AI3_DMA_RTC: tmp = (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); mod_timer(&devpriv->rtc_irq_timer, - jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100); + jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100); for (i = 0; i < 10; i++) { top1 = get_dma_residue(devpriv->dma); @@ -666,44 +677,44 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma_rtc(int irq, void *d) if (top1 != top2) return IRQ_HANDLED; - top1 = devpriv->hwdmasize[0] - top1; // where is now DMA in buffer + top1 = devpriv->hwdmasize[0] - top1; /* where is now DMA in buffer */ top1 >>= 1; - ofs_dats = top1 - devpriv->last_top_dma; // new samples from last call + ofs_dats = top1 - devpriv->last_top_dma; /* new samples from last call */ if (ofs_dats < 0) ofs_dats = (devpriv->dmasamplsize) + ofs_dats; if (!ofs_dats) - return IRQ_HANDLED; // exit=no new samples from last call - // obsluz data + return IRQ_HANDLED; /* exit=no new samples from last call */ + /* obsluz data */ i = devpriv->last_top_dma - 1; i &= (devpriv->dmasamplsize - 1); - if (dmabuf[i] != MAGIC_DMA_WORD) { // DMA overflow! + if (dmabuf[i] != MAGIC_DMA_WORD) { /* DMA overflow! */ comedi_error(dev, "A/D mode1/3 DMA buffer overflow!"); - //rt_printk("I %d dmabuf[i] %d %d\n",i,dmabuf[i],devpriv->dmasamplsize); + /* printk("I %d dmabuf[i] %d %d\n",i,dmabuf[i],devpriv->dmasamplsize); */ pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; comedi_event(dev, s); return IRQ_HANDLED; } - //rt_printk("r %ld ",ofs_dats); + /* printk("r %ld ",ofs_dats); */ bufptr = devpriv->last_top_dma; for (i = 0; i < ofs_dats; i++) { - if ((dmabuf[bufptr] & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout! - rt_printk - ("comedi: A/D mode1/3 DMA - channel dropout %d!=%d !\n", - (dmabuf[bufptr] & 0xf), - devpriv->act_chanlist[devpriv-> - act_chanlist_pos]); + if ((dmabuf[bufptr] & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { /* dropout! */ + printk + ("comedi: A/D mode1/3 DMA - channel dropout %d!=%d !\n", + (dmabuf[bufptr] & 0xf), + devpriv-> + act_chanlist[devpriv->act_chanlist_pos]); pcl818_ai_cancel(dev, s); s->async->events |= - COMEDI_CB_EOA | COMEDI_CB_ERROR; + COMEDI_CB_EOA | COMEDI_CB_ERROR; comedi_event(dev, s); return IRQ_HANDLED; } - comedi_buf_put(s->async, dmabuf[bufptr++] >> 4); // get one sample + comedi_buf_put(s->async, dmabuf[bufptr++] >> 4); /* get one sample */ bufptr &= (devpriv->dmasamplsize - 1); if (s->async->cur_chan == 0) { @@ -715,7 +726,7 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma_rtc(int irq, void *d) pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA; comedi_event(dev, s); - //printk("done int ai13 dma\n"); + /* printk("done int ai13 dma\n"); */ return IRQ_HANDLED; } } @@ -725,11 +736,11 @@ static irqreturn_t interrupt_pcl818_ai_mode13_dma_rtc(int irq, void *d) bufptr &= (devpriv->dmasamplsize - 1); dmabuf[bufptr] = MAGIC_DMA_WORD; comedi_event(dev, s); - //outb(0,0x378); + /* outb(0,0x378); */ return IRQ_HANDLED; } - //outb(0,0x378); + /* outb(0,0x378); */ return IRQ_HANDLED; } #endif @@ -744,7 +755,7 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d) struct comedi_subdevice *s = dev->subdevices + 0; int i, len, lo; - outb(0, dev->iobase + PCL818_FI_INTCLR); // clear fifo int request + outb(0, dev->iobase + PCL818_FI_INTCLR); /* clear fifo int request */ lo = inb(dev->iobase + PCL818_FI_STATUS); @@ -772,19 +783,18 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d) for (i = 0; i < len; i++) { lo = inb(dev->iobase + PCL818_FI_DATALO); - if ((lo & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { // dropout! - rt_printk - ("comedi: A/D mode1/3 FIFO - channel dropout %d!=%d !\n", - (lo & 0xf), - devpriv->act_chanlist[devpriv-> - act_chanlist_pos]); + if ((lo & 0xf) != devpriv->act_chanlist[devpriv->act_chanlist_pos]) { /* dropout! */ + printk + ("comedi: A/D mode1/3 FIFO - channel dropout %d!=%d !\n", + (lo & 0xf), + devpriv->act_chanlist[devpriv->act_chanlist_pos]); pcl818_ai_cancel(dev, s); s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; comedi_event(dev, s); return IRQ_HANDLED; } - comedi_buf_put(s->async, (lo >> 4) | (inb(dev->iobase + PCL818_FI_DATAHI) << 4)); // get one sample + comedi_buf_put(s->async, (lo >> 4) | (inb(dev->iobase + PCL818_FI_DATAHI) << 4)); /* get one sample */ if (s->async->cur_chan == 0) { devpriv->ai_act_scan--; @@ -808,7 +818,7 @@ static irqreturn_t interrupt_pcl818_ai_mode13_fifo(int irq, void *d) ============================================================================== INT procedure */ -static irqreturn_t interrupt_pcl818(int irq, void *d PT_REGS_ARG) +static irqreturn_t interrupt_pcl818(int irq, void *d) { struct comedi_device *dev = d; @@ -816,7 +826,28 @@ static irqreturn_t interrupt_pcl818(int irq, void *d PT_REGS_ARG) comedi_error(dev, "premature interrupt"); return IRQ_HANDLED; } - //rt_printk("I\n"); + /* printk("I\n"); */ + + if (devpriv->irq_blocked && devpriv->irq_was_now_closed) { + if ((devpriv->neverending_ai || (!devpriv->neverending_ai && + devpriv->ai_act_scan > 0)) && + (devpriv->ai_mode == INT_TYPE_AI1_DMA || + devpriv->ai_mode == INT_TYPE_AI3_DMA)) { + /* The cleanup from ai_cancel() has been delayed + until now because the card doesn't seem to like + being reprogrammed while a DMA transfer is in + progress. + */ + struct comedi_subdevice *s = dev->subdevices + 0; + devpriv->ai_act_scan = 0; + devpriv->neverending_ai = 0; + pcl818_ai_cancel(dev, s); + } + + outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */ + + return IRQ_HANDLED; + } switch (devpriv->ai_mode) { case INT_TYPE_AI1_DMA: @@ -840,26 +871,7 @@ static irqreturn_t interrupt_pcl818(int irq, void *d PT_REGS_ARG) outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */ if ((!dev->irq) || (!devpriv->irq_free) || (!devpriv->irq_blocked) - || (!devpriv->ai_mode)) { - if (devpriv->irq_was_now_closed) { - if (devpriv->neverending_ai && - (devpriv->ai_mode == INT_TYPE_AI1_DMA - || devpriv->ai_mode == - INT_TYPE_AI3_DMA)) { - /* we had neverending ai but ai_cancel() has been called - the cleanup from ai_cancel() has been delayed until know - because the card doesn't seem to like being reprogrammed - while a DMA transfer is in progress - */ - struct comedi_subdevice *s = dev->subdevices + 0; - devpriv->ai_mode = devpriv->irq_was_now_closed; - devpriv->irq_was_now_closed = 0; - devpriv->neverending_ai = 0; - pcl818_ai_cancel(dev, s); - } - devpriv->irq_was_now_closed = 0; - return IRQ_HANDLED; - } + || (!devpriv->ai_mode)) { comedi_error(dev, "bad IRQ!"); return IRQ_NONE; } @@ -872,19 +884,19 @@ static irqreturn_t interrupt_pcl818(int irq, void *d PT_REGS_ARG) ============================================================================== ANALOG INPUT MODE 1 or 3 DMA , 818 cards */ -static void pcl818_ai_mode13dma_int(int mode, struct comedi_device * dev, - struct comedi_subdevice * s) +static void pcl818_ai_mode13dma_int(int mode, struct comedi_device *dev, + struct comedi_subdevice *s) { unsigned int flags; unsigned int bytes; - rt_printk("mode13dma_int, mode: %d\n", mode); - disable_dma(devpriv->dma); // disable dma + printk("mode13dma_int, mode: %d\n", mode); + disable_dma(devpriv->dma); /* disable dma */ bytes = devpriv->hwdmasize[0]; if (!devpriv->neverending_ai) { - bytes = devpriv->ai_n_chan * devpriv->ai_scans * sizeof(short); // how many - devpriv->dma_runs_to_end = bytes / devpriv->hwdmasize[0]; // how many DMA pages we must fiil - devpriv->last_dma_run = bytes % devpriv->hwdmasize[0]; //on last dma transfer must be moved + bytes = devpriv->ai_n_chan * devpriv->ai_scans * sizeof(short); /* how many */ + devpriv->dma_runs_to_end = bytes / devpriv->hwdmasize[0]; /* how many DMA pages we must fiil */ + devpriv->last_dma_run = bytes % devpriv->hwdmasize[0]; /* on last dma transfer must be moved */ devpriv->dma_runs_to_end--; if (devpriv->dma_runs_to_end >= 0) bytes = devpriv->hwdmasize[0]; @@ -913,8 +925,8 @@ static void pcl818_ai_mode13dma_int(int mode, struct comedi_device * dev, ============================================================================== ANALOG INPUT MODE 1 or 3 DMA rtc, 818 cards */ -static void pcl818_ai_mode13dma_rtc(int mode, struct comedi_device * dev, - struct comedi_subdevice * s) +static void pcl818_ai_mode13dma_rtc(int mode, struct comedi_device *dev, + struct comedi_subdevice *s) { unsigned int flags; short *pole; @@ -926,14 +938,14 @@ static void pcl818_ai_mode13dma_rtc(int mode, struct comedi_device * dev, set_dma_count(devpriv->dma, devpriv->hwdmasize[0]); release_dma_lock(flags); enable_dma(devpriv->dma); - devpriv->last_top_dma = 0; //devpriv->hwdmasize[0]; - pole = (short *) devpriv->dmabuf[0]; + devpriv->last_top_dma = 0; /* devpriv->hwdmasize[0]; */ + pole = (short *)devpriv->dmabuf[0]; devpriv->dmasamplsize = devpriv->hwdmasize[0] / 2; pole[devpriv->dmasamplsize - 1] = MAGIC_DMA_WORD; #ifdef unused devpriv->rtc_freq = rtc_setfreq_irq(2048); devpriv->rtc_irq_timer.expires = - jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100; + jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100; devpriv->rtc_irq_timer.data = (unsigned long)dev; devpriv->rtc_irq_timer.function = rtc_dropped_irq; @@ -954,14 +966,14 @@ static void pcl818_ai_mode13dma_rtc(int mode, struct comedi_device * dev, ============================================================================== ANALOG INPUT MODE 1 or 3, 818 cards */ -static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, - struct comedi_subdevice * s) +static int pcl818_ai_cmd_mode(int mode, struct comedi_device *dev, + struct comedi_subdevice *s) { struct comedi_cmd *cmd = &s->async->cmd; int divisor1, divisor2; unsigned int seglen; - rt_printk("pcl818_ai_cmd_mode()\n"); + printk("pcl818_ai_cmd_mode()\n"); if ((!dev->irq) && (!devpriv->dma_rtc)) { comedi_error(dev, "IRQ not defined!"); return -EINVAL; @@ -970,16 +982,16 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, if (devpriv->irq_blocked) return -EBUSY; - start_pacer(dev, -1, 0, 0); // stop pacer + start_pacer(dev, -1, 0, 0); /* stop pacer */ seglen = check_channel_list(dev, s, devpriv->ai_chanlist, - devpriv->ai_n_chan); + devpriv->ai_n_chan); if (seglen < 1) return -EINVAL; setup_channel_list(dev, s, devpriv->ai_chanlist, - devpriv->ai_n_chan, seglen); + devpriv->ai_n_chan, seglen); - comedi_udelay(1); + udelay(1); devpriv->ai_act_scan = devpriv->ai_scans; devpriv->ai_act_chan = 0; @@ -990,11 +1002,12 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, devpriv->dma_runs_to_end = 0; if ((devpriv->ai_scans == 0) || (devpriv->ai_scans == -1)) - devpriv->neverending_ai = 1; //well, user want neverending + devpriv->neverending_ai = 1; /* well, user want neverending */ if (mode == 1) { i8253_cascade_ns_to_timer(devpriv->i8253_osc_base, &divisor1, - &divisor2, &cmd->convert_arg, TRIG_ROUND_NEAREST); + &divisor2, &cmd->convert_arg, + TRIG_ROUND_NEAREST); if (divisor1 == 1) { /* PCL718/818 crash if any divisor is set to 1 */ divisor1 = 2; divisor2 /= 2; @@ -1008,7 +1021,7 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, outb(0, dev->iobase + PCL818_CNTENABLE); /* enable pacer */ switch (devpriv->dma) { - case 1: // DMA + case 1: /* DMA */ case 3: if (devpriv->dma_rtc == 0) { pcl818_ai_mode13dma_int(mode, dev, s); @@ -1023,26 +1036,34 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, } #endif break; - case 0: // IRQ - // rt_printk("IRQ\n"); - if (mode == 1) { - devpriv->ai_mode = INT_TYPE_AI1_INT; - outb(0x83 | (dev->irq << 4), dev->iobase + PCL818_CONTROL); /* Pacer+IRQ */ - } else { - devpriv->ai_mode = INT_TYPE_AI3_INT; - outb(0x82 | (dev->irq << 4), dev->iobase + PCL818_CONTROL); /* Ext trig+IRQ */ - }; - break; - case -1: // FIFO - outb(1, dev->iobase + PCL818_FI_ENABLE); // enable FIFO - if (mode == 1) { - devpriv->ai_mode = INT_TYPE_AI1_FIFO; - outb(0x03, dev->iobase + PCL818_CONTROL); /* Pacer */ + case 0: + if (!devpriv->usefifo) { + /* IRQ */ + /* printk("IRQ\n"); */ + if (mode == 1) { + devpriv->ai_mode = INT_TYPE_AI1_INT; + /* Pacer+IRQ */ + outb(0x83 | (dev->irq << 4), + dev->iobase + PCL818_CONTROL); + } else { + devpriv->ai_mode = INT_TYPE_AI3_INT; + /* Ext trig+IRQ */ + outb(0x82 | (dev->irq << 4), + dev->iobase + PCL818_CONTROL); + } } else { - devpriv->ai_mode = INT_TYPE_AI3_FIFO; - outb(0x02, dev->iobase + PCL818_CONTROL); - }; /* Ext trig */ - break; + /* FIFO */ + /* enable FIFO */ + outb(1, dev->iobase + PCL818_FI_ENABLE); + if (mode == 1) { + devpriv->ai_mode = INT_TYPE_AI1_FIFO; + /* Pacer */ + outb(0x03, dev->iobase + PCL818_CONTROL); + } else { + devpriv->ai_mode = INT_TYPE_AI3_FIFO; + outb(0x02, dev->iobase + PCL818_CONTROL); + } + } } start_pacer(dev, mode, divisor1, divisor2); @@ -1055,7 +1076,7 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, break; } #endif - rt_printk("pcl818_ai_cmd_mode() end\n"); + printk("pcl818_ai_cmd_mode() end\n"); return 0; } @@ -1065,8 +1086,8 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device * dev, ANALOG OUTPUT MODE 1 or 3, 818 cards */ #ifdef PCL818_MODE13_AO -static int pcl818_ao_mode13(int mode, struct comedi_device * dev, struct comedi_subdevice * s, - comedi_trig * it) +static int pcl818_ao_mode13(int mode, struct comedi_device *dev, + struct comedi_subdevice *s, comedi_trig * it) { int divisor1, divisor2; @@ -1078,7 +1099,7 @@ static int pcl818_ao_mode13(int mode, struct comedi_device * dev, struct comedi_ if (devpriv->irq_blocked) return -EBUSY; - start_pacer(dev, -1, 0, 0); // stop pacer + start_pacer(dev, -1, 0, 0); /* stop pacer */ devpriv->int13_act_scan = it->n; devpriv->int13_act_chan = 0; @@ -1089,7 +1110,8 @@ static int pcl818_ao_mode13(int mode, struct comedi_device * dev, struct comedi_ if (mode == 1) { i8253_cascade_ns_to_timer(devpriv->i8253_osc_base, &divisor1, - &divisor2, &it->trigvar, TRIG_ROUND_NEAREST); + &divisor2, &it->trigvar, + TRIG_ROUND_NEAREST); if (divisor1 == 1) { /* PCL818 crash if any divisor is set to 1 */ divisor1 = 2; divisor2 /= 2; @@ -1118,8 +1140,8 @@ static int pcl818_ao_mode13(int mode, struct comedi_device * dev, struct comedi_ ============================================================================== ANALOG OUTPUT MODE 1, 818 cards */ -static int pcl818_ao_mode1(struct comedi_device * dev, struct comedi_subdevice * s, - comedi_trig * it) +static int pcl818_ao_mode1(struct comedi_device *dev, + struct comedi_subdevice *s, comedi_trig * it) { return pcl818_ao_mode13(1, dev, s, it); } @@ -1128,8 +1150,8 @@ static int pcl818_ao_mode1(struct comedi_device * dev, struct comedi_subdevice * ============================================================================== ANALOG OUTPUT MODE 3, 818 cards */ -static int pcl818_ao_mode3(struct comedi_device * dev, struct comedi_subdevice * s, - comedi_trig * it) +static int pcl818_ao_mode3(struct comedi_device *dev, + struct comedi_subdevice *s, comedi_trig * it) { return pcl818_ao_mode13(3, dev, s, it); } @@ -1140,12 +1162,12 @@ static int pcl818_ao_mode3(struct comedi_device * dev, struct comedi_subdevice * ============================================================================== Start/stop pacer onboard pacer */ -static void start_pacer(struct comedi_device * dev, int mode, unsigned int divisor1, - unsigned int divisor2) +static void start_pacer(struct comedi_device *dev, int mode, + unsigned int divisor1, unsigned int divisor2) { outb(0xb4, dev->iobase + PCL818_CTRCTL); outb(0x74, dev->iobase + PCL818_CTRCTL); - comedi_udelay(1); + udelay(1); if (mode == 1) { outb(divisor2 & 0xff, dev->iobase + PCL818_CTR2); @@ -1160,8 +1182,9 @@ static void start_pacer(struct comedi_device * dev, int mode, unsigned int divis Check if channel list from user is builded correctly If it's ok, then program scan/gain logic */ -static int check_channel_list(struct comedi_device * dev, struct comedi_subdevice * s, - unsigned int *chanlist, unsigned int n_chan) +static int check_channel_list(struct comedi_device *dev, + struct comedi_subdevice *s, + unsigned int *chanlist, unsigned int n_chan) { unsigned int chansegment[16]; unsigned int i, nowmustbechan, seglen, segpos; @@ -1173,68 +1196,75 @@ static int check_channel_list(struct comedi_device * dev, struct comedi_subdevic } if (n_chan > 1) { - // first channel is everytime ok + /* first channel is everytime ok */ chansegment[0] = chanlist[0]; - // build part of chanlist + /* build part of chanlist */ for (i = 1, seglen = 1; i < n_chan; i++, seglen++) { - // rt_printk("%d. %d %d\n",i,CR_CHAN(it->chanlist[i]),CR_RANGE(it->chanlist[i])); - // we detect loop, this must by finish + + /* printk("%d. %d * %d\n",i, + * CR_CHAN(it->chanlist[i]),CR_RANGE(it->chanlist[i]));*/ + + /* we detect loop, this must by finish */ + if (chanlist[0] == chanlist[i]) break; nowmustbechan = - (CR_CHAN(chansegment[i - 1]) + 1) % s->n_chan; - if (nowmustbechan != CR_CHAN(chanlist[i])) { // channel list isn't continous :-( - rt_printk - ("comedi%d: pcl818: channel list must be continous! chanlist[%i]=%d but must be %d or %d!\n", - dev->minor, i, CR_CHAN(chanlist[i]), - nowmustbechan, CR_CHAN(chanlist[0])); + (CR_CHAN(chansegment[i - 1]) + 1) % s->n_chan; + if (nowmustbechan != CR_CHAN(chanlist[i])) { /* channel list isn't continous :-( */ + printk + ("comedi%d: pcl818: channel list must be continous! chanlist[%i]=%d but must be %d or %d!\n", + dev->minor, i, CR_CHAN(chanlist[i]), + nowmustbechan, CR_CHAN(chanlist[0])); return 0; } - // well, this is next correct channel in list + /* well, this is next correct channel in list */ chansegment[i] = chanlist[i]; } - // check whole chanlist + /* check whole chanlist */ for (i = 0, segpos = 0; i < n_chan; i++) { - //rt_printk("%d %d=%d %d\n",CR_CHAN(chansegment[i%seglen]),CR_RANGE(chansegment[i%seglen]),CR_CHAN(it->chanlist[i]),CR_RANGE(it->chanlist[i])); + /* printk("%d %d=%d %d\n",CR_CHAN(chansegment[i%seglen]),CR_RANGE(chansegment[i%seglen]),CR_CHAN(it->chanlist[i]),CR_RANGE(it->chanlist[i])); */ if (chanlist[i] != chansegment[i % seglen]) { - rt_printk - ("comedi%d: pcl818: bad channel or range number! chanlist[%i]=%d,%d,%d and not %d,%d,%d!\n", - dev->minor, i, CR_CHAN(chansegment[i]), - CR_RANGE(chansegment[i]), - CR_AREF(chansegment[i]), - CR_CHAN(chanlist[i % seglen]), - CR_RANGE(chanlist[i % seglen]), - CR_AREF(chansegment[i % seglen])); - return 0; // chan/gain list is strange + printk + ("comedi%d: pcl818: bad channel or range number! chanlist[%i]=%d,%d,%d and not %d,%d,%d!\n", + dev->minor, i, CR_CHAN(chansegment[i]), + CR_RANGE(chansegment[i]), + CR_AREF(chansegment[i]), + CR_CHAN(chanlist[i % seglen]), + CR_RANGE(chanlist[i % seglen]), + CR_AREF(chansegment[i % seglen])); + return 0; /* chan/gain list is strange */ } } } else { seglen = 1; } - rt_printk("check_channel_list: seglen %d\n", seglen); + printk("check_channel_list: seglen %d\n", seglen); return seglen; } -static void setup_channel_list(struct comedi_device * dev, struct comedi_subdevice * s, - unsigned int *chanlist, unsigned int n_chan, unsigned int seglen) +static void setup_channel_list(struct comedi_device *dev, + struct comedi_subdevice *s, + unsigned int *chanlist, unsigned int n_chan, + unsigned int seglen) { int i; devpriv->act_chanlist_len = seglen; devpriv->act_chanlist_pos = 0; - for (i = 0; i < seglen; i++) { // store range list to card + for (i = 0; i < seglen; i++) { /* store range list to card */ devpriv->act_chanlist[i] = CR_CHAN(chanlist[i]); outb(muxonechan[CR_CHAN(chanlist[i])], dev->iobase + PCL818_MUX); /* select channel */ outb(CR_RANGE(chanlist[i]), dev->iobase + PCL818_RANGE); /* select gain */ } - comedi_udelay(1); + udelay(1); /* select channel interval to scan */ outb(devpriv->act_chanlist[0] | (devpriv->act_chanlist[seglen - - 1] << 4), dev->iobase + PCL818_MUX); + 1] << 4), + dev->iobase + PCL818_MUX); } /* @@ -1253,8 +1283,8 @@ static int check_single_ended(unsigned int port) /* ============================================================================== */ -static int ai_cmdtest(struct comedi_device * dev, struct comedi_subdevice * s, - struct comedi_cmd * cmd) +static int ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, + struct comedi_cmd *cmd) { int err = 0; int tmp, divisor1, divisor2; @@ -1372,8 +1402,8 @@ static int ai_cmdtest(struct comedi_device * dev, struct comedi_subdevice * s, if (cmd->convert_src == TRIG_TIMER) { tmp = cmd->convert_arg; i8253_cascade_ns_to_timer(devpriv->i8253_osc_base, &divisor1, - &divisor2, &cmd->convert_arg, - cmd->flags & TRIG_ROUND_MASK); + &divisor2, &cmd->convert_arg, + cmd->flags & TRIG_ROUND_MASK); if (cmd->convert_arg < this_board->ns_min) cmd->convert_arg = this_board->ns_min; if (tmp != cmd->convert_arg) @@ -1388,8 +1418,8 @@ static int ai_cmdtest(struct comedi_device * dev, struct comedi_subdevice * s, if (cmd->chanlist) { if (!check_channel_list(dev, s, cmd->chanlist, - cmd->chanlist_len)) - return 5; // incorrect channels list + cmd->chanlist_len)) + return 5; /* incorrect channels list */ } return 0; @@ -1398,12 +1428,12 @@ static int ai_cmdtest(struct comedi_device * dev, struct comedi_subdevice * s, /* ============================================================================== */ -static int ai_cmd(struct comedi_device * dev, struct comedi_subdevice * s) +static int ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) { struct comedi_cmd *cmd = &s->async->cmd; int retval; - rt_printk("pcl818_ai_cmd()\n"); + printk("pcl818_ai_cmd()\n"); devpriv->ai_n_chan = cmd->chanlist_len; devpriv->ai_chanlist = cmd->chanlist; devpriv->ai_flags = cmd->flags; @@ -1418,14 +1448,14 @@ static int ai_cmd(struct comedi_device * dev, struct comedi_subdevice * s) devpriv->ai_scans = 0; } - if (cmd->scan_begin_src == TRIG_FOLLOW) { // mode 1, 3 - if (cmd->convert_src == TRIG_TIMER) { // mode 1 + if (cmd->scan_begin_src == TRIG_FOLLOW) { /* mode 1, 3 */ + if (cmd->convert_src == TRIG_TIMER) { /* mode 1 */ devpriv->ai_timer1 = cmd->convert_arg; retval = pcl818_ai_cmd_mode(1, dev, s); - rt_printk("pcl818_ai_cmd() end\n"); + printk("pcl818_ai_cmd() end\n"); return retval; } - if (cmd->convert_src == TRIG_EXT) { // mode 3 + if (cmd->convert_src == TRIG_EXT) { /* mode 3 */ return pcl818_ai_cmd_mode(3, dev, s); } } @@ -1437,23 +1467,25 @@ static int ai_cmd(struct comedi_device * dev, struct comedi_subdevice * s) ============================================================================== cancel any mode 1-4 AI */ -static int pcl818_ai_cancel(struct comedi_device * dev, struct comedi_subdevice * s) +static int pcl818_ai_cancel(struct comedi_device *dev, + struct comedi_subdevice *s) { if (devpriv->irq_blocked > 0) { - rt_printk("pcl818_ai_cancel()\n"); - devpriv->irq_was_now_closed = devpriv->ai_mode; - devpriv->ai_mode = 0; + printk("pcl818_ai_cancel()\n"); + devpriv->irq_was_now_closed = 1; - switch (devpriv->irq_was_now_closed) { + switch (devpriv->ai_mode) { #ifdef unused case INT_TYPE_AI1_DMA_RTC: case INT_TYPE_AI3_DMA_RTC: - set_rtc_irq_bit(0); // stop RTC + set_rtc_irq_bit(0); /* stop RTC */ del_timer(&devpriv->rtc_irq_timer); #endif case INT_TYPE_AI1_DMA: case INT_TYPE_AI3_DMA: - if (devpriv->neverending_ai) { + if (devpriv->neverending_ai || + (!devpriv->neverending_ai && + devpriv->ai_act_scan > 0)) { /* wait for running dma transfer to end, do cleanup in interrupt */ goto end; } @@ -1467,14 +1499,14 @@ static int pcl818_ai_cancel(struct comedi_device * dev, struct comedi_subdevice case INT_TYPE_AO3_INT: #endif outb(inb(dev->iobase + PCL818_CONTROL) & 0x73, dev->iobase + PCL818_CONTROL); /* Stop A/D */ - comedi_udelay(1); + udelay(1); start_pacer(dev, -1, 0, 0); outb(0, dev->iobase + PCL818_AD_LO); inb(dev->iobase + PCL818_AD_LO); inb(dev->iobase + PCL818_AD_HI); outb(0, dev->iobase + PCL818_CLRINT); /* clear INT request */ outb(0, dev->iobase + PCL818_CONTROL); /* Stop A/D */ - if (devpriv->usefifo) { // FIFO shutdown + if (devpriv->usefifo) { /* FIFO shutdown */ outb(0, dev->iobase + PCL818_FI_INTCLR); outb(0, dev->iobase + PCL818_FI_FLUSH); outb(0, dev->iobase + PCL818_FI_ENABLE); @@ -1482,12 +1514,14 @@ static int pcl818_ai_cancel(struct comedi_device * dev, struct comedi_subdevice devpriv->irq_blocked = 0; devpriv->last_int_sub = s; devpriv->neverending_ai = 0; + devpriv->ai_mode = 0; + devpriv->irq_was_now_closed = 0; break; } } - end: - rt_printk("pcl818_ai_cancel() end\n"); +end: + printk("pcl818_ai_cancel() end\n"); return 0; } @@ -1498,39 +1532,39 @@ static int pcl818_ai_cancel(struct comedi_device * dev, struct comedi_subdevice static int pcl818_check(unsigned long iobase) { outb(0x00, iobase + PCL818_MUX); - comedi_udelay(1); + udelay(1); if (inb(iobase + PCL818_MUX) != 0x00) - return 1; //there isn't card + return 1; /* there isn't card */ outb(0x55, iobase + PCL818_MUX); - comedi_udelay(1); + udelay(1); if (inb(iobase + PCL818_MUX) != 0x55) - return 1; //there isn't card + return 1; /* there isn't card */ outb(0x00, iobase + PCL818_MUX); - comedi_udelay(1); + udelay(1); outb(0x18, iobase + PCL818_CONTROL); - comedi_udelay(1); + udelay(1); if (inb(iobase + PCL818_CONTROL) != 0x18) - return 1; //there isn't card - return 0; // ok, card exist + return 1; /* there isn't card */ + return 0; /* ok, card exist */ } /* ============================================================================== reset whole PCL-818 cards */ -static void pcl818_reset(struct comedi_device * dev) +static void pcl818_reset(struct comedi_device *dev) { - if (devpriv->usefifo) { // FIFO shutdown + if (devpriv->usefifo) { /* FIFO shutdown */ outb(0, dev->iobase + PCL818_FI_INTCLR); outb(0, dev->iobase + PCL818_FI_FLUSH); outb(0, dev->iobase + PCL818_FI_ENABLE); } - outb(0, dev->iobase + PCL818_DA_LO); // DAC=0V + outb(0, dev->iobase + PCL818_DA_LO); /* DAC=0V */ outb(0, dev->iobase + PCL818_DA_HI); - comedi_udelay(1); - outb(0, dev->iobase + PCL818_DO_HI); // DO=$0000 + udelay(1); + outb(0, dev->iobase + PCL818_DO_HI); /* DO=$0000 */ outb(0, dev->iobase + PCL818_DO_LO); - comedi_udelay(1); + udelay(1); outb(0, dev->iobase + PCL818_CONTROL); outb(0, dev->iobase + PCL818_CNTENABLE); outb(0, dev->iobase + PCL818_MUX); @@ -1595,7 +1629,7 @@ static void rtc_dropped_irq(unsigned long data) case INT_TYPE_AI1_DMA_RTC: case INT_TYPE_AI3_DMA_RTC: mod_timer(&devpriv->rtc_irq_timer, - jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100); + jiffies + HZ / devpriv->rtc_freq + 2 * HZ / 100); save_flags(flags); cli(); tmp = (CMOS_READ(RTC_INTR_FLAGS) & 0xF0); /* restart */ @@ -1639,9 +1673,9 @@ static int rtc_setfreq_irq(int freq) ============================================================================== Free any resources that we have claimed */ -static void free_resources(struct comedi_device * dev) +static void free_resources(struct comedi_device *dev) { - //rt_printk("free_resource()\n"); + /* printk("free_resource()\n"); */ if (dev->private) { pcl818_ai_cancel(dev, devpriv->sub_ai); pcl818_reset(dev); @@ -1653,11 +1687,11 @@ static void free_resources(struct comedi_device * dev) free_pages(devpriv->dmabuf[1], devpriv->dmapages[1]); #ifdef unused if (devpriv->rtc_irq) - comedi_free_irq(devpriv->rtc_irq, dev); + free_irq(devpriv->rtc_irq, dev); if ((devpriv->dma_rtc) && (RTC_lock == 1)) { if (devpriv->rtc_iobase) release_region(devpriv->rtc_iobase, - devpriv->rtc_iosize); + devpriv->rtc_iosize); } if (devpriv->dma_rtc) RTC_lock--; @@ -1668,7 +1702,7 @@ static void free_resources(struct comedi_device * dev) free_irq(dev->irq, dev); if (dev->iobase) release_region(dev->iobase, devpriv->io_range); - //rt_printk("free_resource() end\n"); + /* printk("free_resource() end\n"); */ } /* @@ -1677,35 +1711,37 @@ static void free_resources(struct comedi_device * dev) Initialization */ -static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * it) +static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it) { int ret; unsigned long iobase; - unsigned int irq, dma; + unsigned int irq; + int dma; unsigned long pages; struct comedi_subdevice *s; - if ((ret = alloc_private(dev, sizeof(pcl818_private))) < 0) + ret = alloc_private(dev, sizeof(struct pcl818_private)); + if (ret < 0) return ret; /* Can't alloc mem */ /* claim our I/O space */ iobase = it->options[0]; printk("comedi%d: pcl818: board=%s, ioport=0x%03lx", - dev->minor, this_board->name, iobase); + dev->minor, this_board->name, iobase); devpriv->io_range = this_board->io_range; - if ((this_board->fifo) && (it->options[2] == -1)) { // we've board with FIFO and we want to use FIFO + if ((this_board->fifo) && (it->options[2] == -1)) { /* we've board with FIFO and we want to use FIFO */ devpriv->io_range = PCLx1xFIFO_RANGE; devpriv->usefifo = 1; } if (!request_region(iobase, devpriv->io_range, "pcl818")) { - rt_printk("I/O port conflict\n"); + printk("I/O port conflict\n"); return -EIO; } dev->iobase = iobase; if (pcl818_check(iobase)) { - rt_printk(", I can't detect board. FAIL!\n"); + printk(", I can't detect board. FAIL!\n"); return -EIO; } @@ -1717,19 +1753,19 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i irq = it->options[1]; if (irq) { /* we want to use IRQ */ if (((1 << irq) & this_board->IRQbits) == 0) { - rt_printk - (", IRQ %u is out of allowed range, DISABLING IT", - irq); + printk + (", IRQ %u is out of allowed range, DISABLING IT", + irq); irq = 0; /* Bad IRQ */ } else { - if (comedi_request_irq(irq, interrupt_pcl818, 0, - "pcl818", dev)) { - rt_printk - (", unable to allocate IRQ %u, DISABLING IT", - irq); + if (request_irq + (irq, interrupt_pcl818, 0, "pcl818", dev)) { + printk + (", unable to allocate IRQ %u, DISABLING IT", + irq); irq = 0; /* Can't use IRQ */ } else { - rt_printk(", irq=%u", irq); + printk(", irq=%u", irq); } } } @@ -1748,34 +1784,33 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i #ifdef unused /* grab RTC for DMA operations */ devpriv->dma_rtc = 0; - if (it->options[2] > 0) { // we want to use DMA + if (it->options[2] > 0) { /* we want to use DMA */ if (RTC_lock == 0) { if (!request_region(RTC_PORT(0), RTC_IO_EXTENT, - "pcl818 (RTC)")) + "pcl818 (RTC)")) goto no_rtc; } devpriv->rtc_iobase = RTC_PORT(0); devpriv->rtc_iosize = RTC_IO_EXTENT; RTC_lock++; - if (!comedi_request_irq(RTC_IRQ, - interrupt_pcl818_ai_mode13_dma_rtc, 0, - "pcl818 DMA (RTC)", dev)) { + if (!request_irq(RTC_IRQ, interrupt_pcl818_ai_mode13_dma_rtc, 0, + "pcl818 DMA (RTC)", dev)) { devpriv->dma_rtc = 1; devpriv->rtc_irq = RTC_IRQ; - rt_printk(", dma_irq=%u", devpriv->rtc_irq); + printk(", dma_irq=%u", devpriv->rtc_irq); } else { RTC_lock--; if (RTC_lock == 0) { if (devpriv->rtc_iobase) release_region(devpriv->rtc_iobase, - devpriv->rtc_iosize); + devpriv->rtc_iosize); } devpriv->rtc_iobase = 0; devpriv->rtc_iosize = 0; } } - no_rtc: +no_rtc: #endif /* grab our DMA */ dma = 0; @@ -1787,44 +1822,45 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i if (dma < 1) goto no_dma; /* DMA disabled */ if (((1 << dma) & this_board->DMAbits) == 0) { - rt_printk(", DMA is out of allowed range, FAIL!\n"); + printk(", DMA is out of allowed range, FAIL!\n"); return -EINVAL; /* Bad DMA */ } ret = request_dma(dma, "pcl818"); if (ret) { - rt_printk(", unable to allocate DMA %u, FAIL!\n", dma); + printk(", unable to allocate DMA %u, FAIL!\n", dma); return -EBUSY; /* DMA isn't free */ } devpriv->dma = dma; - rt_printk(", dma=%u", dma); + printk(", dma=%u", dma); pages = 2; /* we need 16KB */ devpriv->dmabuf[0] = __get_dma_pages(GFP_KERNEL, pages); if (!devpriv->dmabuf[0]) { - rt_printk(", unable to allocate DMA buffer, FAIL!\n"); + printk(", unable to allocate DMA buffer, FAIL!\n"); /* maybe experiment with try_to_free_pages() will help .... */ return -EBUSY; /* no buffer :-( */ } devpriv->dmapages[0] = pages; devpriv->hwdmaptr[0] = virt_to_bus((void *)devpriv->dmabuf[0]); devpriv->hwdmasize[0] = (1 << pages) * PAGE_SIZE; - //rt_printk("%d %d %ld, ",devpriv->dmapages[0],devpriv->hwdmasize[0],PAGE_SIZE); - if (devpriv->dma_rtc == 0) { // we must do duble buff :-( + /* printk("%d %d %ld, ",devpriv->dmapages[0],devpriv->hwdmasize[0],PAGE_SIZE); */ + if (devpriv->dma_rtc == 0) { /* we must do duble buff :-( */ devpriv->dmabuf[1] = __get_dma_pages(GFP_KERNEL, pages); if (!devpriv->dmabuf[1]) { - rt_printk - (", unable to allocate DMA buffer, FAIL!\n"); + printk + (", unable to allocate DMA buffer, FAIL!\n"); return -EBUSY; } devpriv->dmapages[1] = pages; devpriv->hwdmaptr[1] = - virt_to_bus((void *)devpriv->dmabuf[1]); + virt_to_bus((void *)devpriv->dmabuf[1]); devpriv->hwdmasize[1] = (1 << pages) * PAGE_SIZE; } } - no_dma: +no_dma: - if ((ret = alloc_subdevices(dev, 4)) < 0) + ret = alloc_subdevices(dev, 4); + if (ret < 0) return ret; s = dev->subdevices + 0; @@ -1856,7 +1892,7 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i } if (this_board->is_818) { if ((it->options[4] == 1) || (it->options[4] == 10)) - s->range_table = &range_pcl818l_h_ai; // secondary range list jumper selectable + s->range_table = &range_pcl818l_h_ai; /* secondary range list jumper selectable */ } else { switch (it->options[4]) { case 0: @@ -1969,7 +2005,7 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i pcl818_reset(dev); - rt_printk("\n"); + printk("\n"); return 0; } @@ -1978,9 +2014,9 @@ static int pcl818_attach(struct comedi_device * dev, struct comedi_devconfig * i ============================================================================== Removes device */ -static int pcl818_detach(struct comedi_device * dev) +static int pcl818_detach(struct comedi_device *dev) { - // rt_printk("comedi%d: pcl818: remove\n", dev->minor); + /* printk("comedi%d: pcl818: remove\n", dev->minor); */ free_resources(dev); return 0; }