Remove the `ai`, `ao`, `di` and `do` pointers from `struct das08_board_struct`. These were initialized in `das08_boards[]` and `das08_cs_boards[]` to point to comedi instruction handler functions for the subdevice, but there are only two sets of functions depending on whether the `is_jr` member is true or false, and some of the functions will be NULL if the corresponding `ai_nbits`, `ao_nbits`, `di_nchan` and `do_nchan` members are zero. Determine which handler functions to use in das08_common_attach(). One element of `das08_boards[]` had `ao` set to NULL and `ao_nbits` set to 12. Set `ao_nbits` to 0 in this case to let das08_common_attach() know this board has no AO subdevice. Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx> --- drivers/staging/comedi/drivers/das08.c | 81 +++++----------------------------- drivers/staging/comedi/drivers/das08.h | 4 -- 2 files changed, 11 insertions(+), 74 deletions(-) diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c index f6b5a4c..6ad4b9f 100644 --- a/drivers/staging/comedi/drivers/das08.c +++ b/drivers/staging/comedi/drivers/das08.c @@ -495,15 +495,10 @@ static const struct das08_board_struct das08_boards[] = { { .name = "isa-das08", /* cio-das08.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pg_none, .ai_encoding = das08_encode12, - .ao = NULL, - .ao_nbits = 12, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 8, .i8254_offset = 4, @@ -512,14 +507,10 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-pgm", /* cio-das08pgx.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgm, .ai_encoding = das08_encode12, - .ao = NULL, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0, .i8254_offset = 0x04, @@ -528,14 +519,10 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-pgh", /* cio-das08pgx.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgh, .ai_encoding = das08_encode12, - .ao = NULL, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0, .i8254_offset = 0x04, @@ -544,14 +531,10 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-pgl", /* cio-das08pgx.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgl, .ai_encoding = das08_encode12, - .ao = NULL, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0, .i8254_offset = 0x04, @@ -560,15 +543,11 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-aoh", /* cio-das08_aox.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgh, .ai_encoding = das08_encode12, - .ao = das08ao_ao_winsn, /* 8 */ .ao_nbits = 12, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0x0c, .i8254_offset = 0x04, @@ -577,15 +556,11 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-aol", /* cio-das08_aox.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgl, .ai_encoding = das08_encode12, - .ao = das08ao_ao_winsn, /* 8 */ .ao_nbits = 12, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0x0c, .i8254_offset = 0x04, @@ -594,15 +569,11 @@ static const struct das08_board_struct das08_boards[] = { { .name = "das08-aom", /* cio-das08_aox.pdf */ .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pgm, .ai_encoding = das08_encode12, - .ao = das08ao_ao_winsn, /* 8 */ .ao_nbits = 12, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0x0c, .i8254_offset = 0x04, @@ -612,15 +583,11 @@ static const struct das08_board_struct das08_boards[] = { .name = "das08/jr-ao", /* cio-das08-jr-ao.pdf */ .bustype = isa, .is_jr = true, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pg_none, .ai_encoding = das08_encode12, - .ao = das08jr_ao_winsn, .ao_nbits = 12, - .di = das08jr_di_rbits, .di_nchan = 8, - .do_ = das08jr_do_wbits, .do_nchan = 8, .i8255_offset = 0, .i8254_offset = 0, @@ -630,15 +597,11 @@ static const struct das08_board_struct das08_boards[] = { .name = "das08jr-16-ao", /* cio-das08jr-16-ao.pdf */ .bustype = isa, .is_jr = true, - .ai = das08_ai_rinsn, .ai_nbits = 16, .ai_pg = das08_pg_none, .ai_encoding = das08_encode16, - .ao = das08jr_ao_winsn, .ao_nbits = 16, - .di = das08jr_di_rbits, .di_nchan = 8, - .do_ = das08jr_do_wbits, .do_nchan = 8, .i8255_offset = 0, .i8254_offset = 0x04, @@ -647,15 +610,10 @@ static const struct das08_board_struct das08_boards[] = { { .name = "pc104-das08", .bustype = isa, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_pg_none, .ai_encoding = das08_encode12, - .ao = NULL, - .ao_nbits = 0, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0, .i8254_offset = 4, @@ -673,15 +631,10 @@ static const struct das08_board_struct das08_boards[] = { .name = "das08jr/16", .bustype = isa, .is_jr = true, - .ai = das08_ai_rinsn, .ai_nbits = 16, .ai_pg = das08_pg_none, .ai_encoding = das08_encode16, - .ao = NULL, - .ao_nbits = 0, - .di = das08jr_di_rbits, .di_nchan = 8, - .do_ = das08jr_do_wbits, .do_nchan = 8, .i8255_offset = 0, .i8254_offset = 0, @@ -701,15 +654,10 @@ static const struct das08_board_struct das08_boards[] = { .name = "pci-das08", /* pci-das08 */ .id = PCI_DEVICE_ID_PCIDAS08, .bustype = pci, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_bipolar5, .ai_encoding = das08_encode12, - .ao = NULL, - .ao_nbits = 0, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 4, .i8255_offset = 0, .i8254_offset = 4, @@ -730,15 +678,10 @@ struct das08_board_struct das08_cs_boards[NUM_DAS08_CS_BOARDS] = { .name = "pcm-das08", .id = 0x0, /* XXX */ .bustype = pcmcia, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_bipolar5, .ai_encoding = das08_pcm_encode12, - .ao = NULL, - .ao_nbits = 0, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 3, .i8255_offset = 0, .i8254_offset = 0, @@ -749,15 +692,10 @@ struct das08_board_struct das08_cs_boards[NUM_DAS08_CS_BOARDS] = { .name = "das08_cs", .id = 0x0, /* XXX */ .bustype = pcmcia, - .ai = das08_ai_rinsn, .ai_nbits = 12, .ai_pg = das08_bipolar5, .ai_encoding = das08_pcm_encode12, - .ao = NULL, - .ao_nbits = 0, - .di = das08_di_rbits, .di_nchan = 3, - .do_ = das08_do_wbits, .do_nchan = 3, .i8255_offset = 0, .i8254_offset = 0, @@ -784,7 +722,7 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase) s = dev->subdevices + 0; /* ai */ - if (thisboard->ai) { + if (thisboard->ai_nbits) { s->type = COMEDI_SUBD_AI; /* XXX some boards actually have differential * inputs instead of single ended. @@ -795,7 +733,7 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase) s->n_chan = 8; s->maxdata = (1 << thisboard->ai_nbits) - 1; s->range_table = das08_ai_lranges[thisboard->ai_pg]; - s->insn_read = thisboard->ai; + s->insn_read = das08_ai_rinsn; devpriv->pg_gainlist = das08_gainlists[thisboard->ai_pg]; } else { s->type = COMEDI_SUBD_UNUSED; @@ -803,40 +741,43 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase) s = dev->subdevices + 1; /* ao */ - if (thisboard->ao) { + if (thisboard->ao_nbits) { s->type = COMEDI_SUBD_AO; /* XXX lacks read-back insn */ s->subdev_flags = SDF_WRITABLE; s->n_chan = 2; s->maxdata = (1 << thisboard->ao_nbits) - 1; s->range_table = &range_bipolar5; - s->insn_write = thisboard->ao; + s->insn_write = + thisboard->is_jr ? das08jr_ao_winsn : das08ao_ao_winsn; } else { s->type = COMEDI_SUBD_UNUSED; } s = dev->subdevices + 2; /* di */ - if (thisboard->di) { + if (thisboard->di_nchan) { s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE; s->n_chan = thisboard->di_nchan; s->maxdata = 1; s->range_table = &range_digital; - s->insn_bits = thisboard->di; + s->insn_bits = + thisboard->is_jr ? das08jr_di_rbits : das08_di_rbits; } else { s->type = COMEDI_SUBD_UNUSED; } s = dev->subdevices + 3; /* do */ - if (thisboard->do_) { + if (thisboard->do_nchan) { s->type = COMEDI_SUBD_DO; s->subdev_flags = SDF_WRITABLE | SDF_READABLE; s->n_chan = thisboard->do_nchan; s->maxdata = 1; s->range_table = &range_digital; - s->insn_bits = thisboard->do_; + s->insn_bits = + thisboard->is_jr ? das08jr_do_wbits : das08_do_wbits; } else { s->type = COMEDI_SUBD_UNUSED; } diff --git a/drivers/staging/comedi/drivers/das08.h b/drivers/staging/comedi/drivers/das08.h index 5e00530..d70d319 100644 --- a/drivers/staging/comedi/drivers/das08.h +++ b/drivers/staging/comedi/drivers/das08.h @@ -36,15 +36,11 @@ struct das08_board_struct { unsigned int id; /* id for pci/pcmcia boards */ enum das08_bustype bustype; bool is_jr; /* true for 'JR' boards */ - void *ai; unsigned int ai_nbits; enum das08_lrange ai_pg; enum das08_ai_encoding ai_encoding; - void *ao; unsigned int ao_nbits; - void *di; unsigned int di_nchan; - void *do_; unsigned int do_nchan; unsigned int i8255_offset; unsigned int i8254_offset; -- 1.7.12 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel