Skip to content

Commit 5dacadc

Browse files
bigguinessgregkh
authored andcommitted
staging: comedi: drivers: use comedi_dio_insn_config() for complex cases
Convert the drivers with complex, port programmable i/o, to use the comedi_dio_insn_config() helper function. All of these drivers have some sort of 'port' programmable i/o where multiple i/o channels are configured as a group. The 'mask' associated with the group is passed to comedi_dio_insn_config() so that all the channels are configured. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e495dd8 commit 5dacadc

File tree

15 files changed

+263
-433
lines changed

15 files changed

+263
-433
lines changed

drivers/staging/comedi/drivers/8255.c

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -184,39 +184,29 @@ static void subdev_8255_do_config(struct comedi_device *dev,
184184

185185
static int subdev_8255_insn_config(struct comedi_device *dev,
186186
struct comedi_subdevice *s,
187-
struct comedi_insn *insn, unsigned int *data)
187+
struct comedi_insn *insn,
188+
unsigned int *data)
188189
{
190+
unsigned int chan = CR_CHAN(insn->chanspec);
189191
unsigned int mask;
190-
unsigned int bits;
192+
int ret;
191193

192-
mask = 1 << CR_CHAN(insn->chanspec);
193-
if (mask & 0x0000ff)
194-
bits = 0x0000ff;
195-
else if (mask & 0x00ff00)
196-
bits = 0x00ff00;
197-
else if (mask & 0x0f0000)
198-
bits = 0x0f0000;
194+
if (chan < 8)
195+
mask = 0x0000ff;
196+
else if (chan < 16)
197+
mask = 0x00ff00;
198+
else if (chan < 20)
199+
mask = 0x0f0000;
199200
else
200-
bits = 0xf00000;
201-
202-
switch (data[0]) {
203-
case INSN_CONFIG_DIO_INPUT:
204-
s->io_bits &= ~bits;
205-
break;
206-
case INSN_CONFIG_DIO_OUTPUT:
207-
s->io_bits |= bits;
208-
break;
209-
case INSN_CONFIG_DIO_QUERY:
210-
data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
211-
return insn->n;
212-
break;
213-
default:
214-
return -EINVAL;
215-
}
201+
mask = 0xf00000;
202+
203+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
204+
if (ret)
205+
return ret;
216206

217207
subdev_8255_do_config(dev, s);
218208

219-
return 1;
209+
return insn->n;
220210
}
221211

222212
static int subdev_8255_cmdtest(struct comedi_device *dev,

drivers/staging/comedi/drivers/addi_apci_16xx.c

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -60,36 +60,22 @@ static int apci16xx_insn_config(struct comedi_device *dev,
6060
struct comedi_insn *insn,
6161
unsigned int *data)
6262
{
63-
unsigned int chan_mask = 1 << CR_CHAN(insn->chanspec);
64-
unsigned int bits;
63+
unsigned int chan = CR_CHAN(insn->chanspec);
64+
unsigned int mask;
65+
int ret;
6566

66-
/*
67-
* Each 8-bit "port" is configurable as either input or
68-
* output. Changing the configuration of any channel in
69-
* a port changes the entire port.
70-
*/
71-
if (chan_mask & 0x000000ff)
72-
bits = 0x000000ff;
73-
else if (chan_mask & 0x0000ff00)
74-
bits = 0x0000ff00;
75-
else if (chan_mask & 0x00ff0000)
76-
bits = 0x00ff0000;
67+
if (chan < 8)
68+
mask = 0x000000ff;
69+
else if (chan < 16)
70+
mask = 0x0000ff00;
71+
else if (chan < 24)
72+
mask = 0x00ff0000;
7773
else
78-
bits = 0xff000000;
79-
80-
switch (data[0]) {
81-
case INSN_CONFIG_DIO_INPUT:
82-
s->io_bits &= ~bits;
83-
break;
84-
case INSN_CONFIG_DIO_OUTPUT:
85-
s->io_bits |= bits;
86-
break;
87-
case INSN_CONFIG_DIO_QUERY:
88-
data[1] = (s->io_bits & bits) ? COMEDI_INPUT : COMEDI_OUTPUT;
89-
return insn->n;
90-
default:
91-
return -EINVAL;
92-
}
74+
mask = 0xff000000;
75+
76+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
77+
if (ret)
78+
return ret;
9379

9480
outl(s->io_bits, dev->iobase + APCI16XX_DIR_REG(s->index));
9581

drivers/staging/comedi/drivers/addi_apci_3xxx.c

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -686,38 +686,28 @@ static int apci3xxx_dio_insn_config(struct comedi_device *dev,
686686
unsigned int *data)
687687
{
688688
unsigned int chan = CR_CHAN(insn->chanspec);
689-
unsigned int mask = 1 << chan;
690-
unsigned int bits;
689+
unsigned int mask;
690+
int ret;
691691

692692
/*
693693
* Port 0 (channels 0-7) are always inputs
694694
* Port 1 (channels 8-15) are always outputs
695695
* Port 2 (channels 16-23) are programmable i/o
696-
*
697-
* Changing any channel in port 2 changes the entire port.
698696
*/
699-
if (mask & 0xff0000)
700-
bits = 0xff0000;
701-
else
702-
bits = 0;
703-
704-
switch (data[0]) {
705-
case INSN_CONFIG_DIO_INPUT:
706-
s->io_bits &= ~bits;
707-
break;
708-
case INSN_CONFIG_DIO_OUTPUT:
709-
s->io_bits |= bits;
710-
break;
711-
case INSN_CONFIG_DIO_QUERY:
712-
data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
713-
return insn->n;
714-
default:
715-
return -EINVAL;
697+
if (chan < 16) {
698+
if (data[0] != INSN_CONFIG_DIO_QUERY)
699+
return -EINVAL;
700+
} else {
701+
/* changing any channel in port 2 changes the entire port */
702+
mask = 0xff0000;
716703
}
717704

705+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
706+
if (ret)
707+
return ret;
708+
718709
/* update port 2 configuration */
719-
if (bits)
720-
outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
710+
outl((s->io_bits >> 24) & 0xff, dev->iobase + 224);
721711

722712
return insn->n;
723713
}

drivers/staging/comedi/drivers/adv_pci1723.c

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -180,38 +180,29 @@ static int pci1723_dio_insn_config(struct comedi_device *dev,
180180
struct comedi_subdevice *s,
181181
struct comedi_insn *insn, unsigned int *data)
182182
{
183+
unsigned int chan = CR_CHAN(insn->chanspec);
183184
unsigned int mask;
184-
unsigned int bits;
185-
unsigned short dio_mode;
185+
unsigned short mode;
186+
int ret;
186187

187-
mask = 1 << CR_CHAN(insn->chanspec);
188-
if (mask & 0x00FF)
189-
bits = 0x00FF;
188+
if (chan < 8)
189+
mask = 0x00ff;
190190
else
191-
bits = 0xFF00;
191+
mask = 0xff00;
192192

193-
switch (data[0]) {
194-
case INSN_CONFIG_DIO_INPUT:
195-
s->io_bits &= ~bits;
196-
break;
197-
case INSN_CONFIG_DIO_OUTPUT:
198-
s->io_bits |= bits;
199-
break;
200-
case INSN_CONFIG_DIO_QUERY:
201-
data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
202-
return insn->n;
203-
default:
204-
return -EINVAL;
205-
}
193+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
194+
if (ret)
195+
return ret;
206196

207197
/* update hardware DIO mode */
208-
dio_mode = 0x0000; /* low byte output, high byte output */
209-
if ((s->io_bits & 0x00FF) == 0)
210-
dio_mode |= 0x0001; /* low byte input */
211-
if ((s->io_bits & 0xFF00) == 0)
212-
dio_mode |= 0x0002; /* high byte input */
213-
outw(dio_mode, dev->iobase + PCI1723_DIGITAL_IO_PORT_SET);
214-
return 1;
198+
mode = 0x0000; /* assume output */
199+
if (!(s->io_bits & 0x00ff))
200+
mode |= 0x0001; /* low byte input */
201+
if (!(s->io_bits & 0xff00))
202+
mode |= 0x0002; /* high byte input */
203+
outw(mode, dev->iobase + PCI1723_DIGITAL_IO_PORT_SET);
204+
205+
return insn->n;
215206
}
216207

217208
/*

drivers/staging/comedi/drivers/amplc_dio200_common.c

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -976,34 +976,26 @@ static int dio200_subdev_8255_config(struct comedi_device *dev,
976976
struct comedi_insn *insn,
977977
unsigned int *data)
978978
{
979+
unsigned int chan = CR_CHAN(insn->chanspec);
979980
unsigned int mask;
980-
unsigned int bits;
981-
982-
mask = 1 << CR_CHAN(insn->chanspec);
983-
if (mask & 0x0000ff)
984-
bits = 0x0000ff;
985-
else if (mask & 0x00ff00)
986-
bits = 0x00ff00;
987-
else if (mask & 0x0f0000)
988-
bits = 0x0f0000;
981+
int ret;
982+
983+
if (chan < 8)
984+
mask = 0x0000ff;
985+
else if (chan < 16)
986+
mask = 0x00ff00;
987+
else if (chan < 20)
988+
mask = 0x0f0000;
989989
else
990-
bits = 0xf00000;
991-
switch (data[0]) {
992-
case INSN_CONFIG_DIO_INPUT:
993-
s->io_bits &= ~bits;
994-
break;
995-
case INSN_CONFIG_DIO_OUTPUT:
996-
s->io_bits |= bits;
997-
break;
998-
case INSN_CONFIG_DIO_QUERY:
999-
data[1] = (s->io_bits & bits) ? COMEDI_OUTPUT : COMEDI_INPUT;
1000-
return insn->n;
1001-
break;
1002-
default:
1003-
return -EINVAL;
1004-
}
990+
mask = 0xf00000;
991+
992+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
993+
if (ret)
994+
return ret;
995+
1005996
dio200_subdev_8255_set_dir(dev, s);
1006-
return 1;
997+
998+
return insn->n;
1007999
}
10081000

10091001
/*

drivers/staging/comedi/drivers/cb_das16_cs.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -341,33 +341,22 @@ static int das16cs_dio_insn_bits(struct comedi_device *dev,
341341

342342
static int das16cs_dio_insn_config(struct comedi_device *dev,
343343
struct comedi_subdevice *s,
344-
struct comedi_insn *insn, unsigned int *data)
344+
struct comedi_insn *insn,
345+
unsigned int *data)
345346
{
346347
struct das16cs_private *devpriv = dev->private;
347-
int chan = CR_CHAN(insn->chanspec);
348-
int bits;
348+
unsigned int chan = CR_CHAN(insn->chanspec);
349+
unsigned int mask;
350+
int ret;
349351

350352
if (chan < 4)
351-
bits = 0x0f;
353+
mask = 0x0f;
352354
else
353-
bits = 0xf0;
355+
mask = 0xf0;
354356

355-
switch (data[0]) {
356-
case INSN_CONFIG_DIO_OUTPUT:
357-
s->io_bits |= bits;
358-
break;
359-
case INSN_CONFIG_DIO_INPUT:
360-
s->io_bits &= bits;
361-
break;
362-
case INSN_CONFIG_DIO_QUERY:
363-
data[1] =
364-
(s->io_bits & (1 << chan)) ? COMEDI_OUTPUT : COMEDI_INPUT;
365-
return insn->n;
366-
break;
367-
default:
368-
return -EINVAL;
369-
break;
370-
}
357+
ret = comedi_dio_insn_config(dev, s, insn, data, mask);
358+
if (ret)
359+
return ret;
371360

372361
devpriv->status2 &= ~0x00c0;
373362
devpriv->status2 |= (s->io_bits & 0xf0) ? 0x0080 : 0;

drivers/staging/comedi/drivers/dt2801.c

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -551,32 +551,19 @@ static int dt2801_dio_insn_bits(struct comedi_device *dev,
551551

552552
static int dt2801_dio_insn_config(struct comedi_device *dev,
553553
struct comedi_subdevice *s,
554-
struct comedi_insn *insn, unsigned int *data)
554+
struct comedi_insn *insn,
555+
unsigned int *data)
555556
{
556-
int which = 0;
557+
int ret;
557558

558-
if (s == &dev->subdevices[3])
559-
which = 1;
559+
ret = comedi_dio_insn_config(dev, s, insn, data, 0xff);
560+
if (ret)
561+
return ret;
560562

561-
/* configure */
562-
switch (data[0]) {
563-
case INSN_CONFIG_DIO_OUTPUT:
564-
s->io_bits = 0xff;
565-
dt2801_writecmd(dev, DT_C_SET_DIGOUT);
566-
break;
567-
case INSN_CONFIG_DIO_INPUT:
568-
s->io_bits = 0;
569-
dt2801_writecmd(dev, DT_C_SET_DIGIN);
570-
break;
571-
case INSN_CONFIG_DIO_QUERY:
572-
data[1] = s->io_bits ? COMEDI_OUTPUT : COMEDI_INPUT;
573-
return insn->n;
574-
default:
575-
return -EINVAL;
576-
}
577-
dt2801_writedata(dev, which);
563+
dt2801_writecmd(dev, s->io_bits ? DT_C_SET_DIGOUT : DT_C_SET_DIGIN);
564+
dt2801_writedata(dev, (s == &dev->subdevices[3]) ? 1 : 0);
578565

579-
return 1;
566+
return insn->n;
580567
}
581568

582569
/*

0 commit comments

Comments
 (0)