Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 304710
b: refs/heads/master
c: 5675d89
h: refs/heads/master
v: v3
  • Loading branch information
H Hartley Sweeten authored and Greg Kroah-Hartman committed May 16, 2012
1 parent 8b34f3c commit ef6cd6b
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 167 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 613e91213a0ec9e86a704070627790cc29c35e28
refs/heads/master: 5675d89927d428f7ea1bb6b0b3df06580bd55dcf
303 changes: 137 additions & 166 deletions trunk/drivers/staging/comedi/drivers/dt2811.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,61 +211,8 @@ struct dt2811_board {
const struct comedi_lrange *unip_5;
};

static const struct dt2811_board boardtypes[] = {
{"dt2811-pgh",
&range_dt2811_pgh_ai_5_bipolar,
&range_dt2811_pgh_ai_2_5_bipolar,
&range_dt2811_pgh_ai_5_unipolar,
},
{"dt2811-pgl",
&range_dt2811_pgl_ai_5_bipolar,
&range_dt2811_pgl_ai_2_5_bipolar,
&range_dt2811_pgl_ai_5_unipolar,
},
};

#define this_board ((const struct dt2811_board *)dev->board_ptr)

static int dt2811_attach(struct comedi_device *dev,
struct comedi_devconfig *it);
static int dt2811_detach(struct comedi_device *dev);
static struct comedi_driver driver_dt2811 = {
.driver_name = "dt2811",
.module = THIS_MODULE,
.attach = dt2811_attach,
.detach = dt2811_detach,
.board_name = &boardtypes[0].name,
.num_names = ARRAY_SIZE(boardtypes),
.offset = sizeof(struct dt2811_board),
};

static int __init driver_dt2811_init_module(void)
{
return comedi_driver_register(&driver_dt2811);
}

static void __exit driver_dt2811_cleanup_module(void)
{
comedi_driver_unregister(&driver_dt2811);
}

module_init(driver_dt2811_init_module);
module_exit(driver_dt2811_cleanup_module);

static int dt2811_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data);
static int dt2811_ao_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data);
static int dt2811_ao_insn_read(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data);
static int dt2811_di_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data);
static int dt2811_do_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data);

enum { card_2811_pgh, card_2811_pgl };

struct dt2811_private {
Expand Down Expand Up @@ -317,6 +264,120 @@ static irqreturn_t dt2811_interrupt(int irq, void *d)
}
#endif

static int dt2811_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int chan = CR_CHAN(insn->chanspec);
int timeout = DT2811_TIMEOUT;
int i;

for (i = 0; i < insn->n; i++) {
outb(chan, dev->iobase + DT2811_ADGCR);

while (timeout
&& inb(dev->iobase + DT2811_ADCSR) & DT2811_ADBUSY)
timeout--;
if (!timeout)
return -ETIME;

data[i] = inb(dev->iobase + DT2811_ADDATLO);
data[i] |= inb(dev->iobase + DT2811_ADDATHI) << 8;
data[i] &= 0xfff;
}

return i;
}

#if 0
/* Wow. This is code from the Comedi stone age. But it hasn't been
* replaced, so I'll let it stay. */
int dt2811_adtrig(kdev_t minor, comedi_adtrig *adtrig)
{
struct comedi_device *dev = comedi_devices + minor;

if (adtrig->n < 1)
return 0;
dev->curadchan = adtrig->chan;
switch (dev->i_admode) {
case COMEDI_MDEMAND:
dev->ntrig = adtrig->n - 1;
/* not necessary */
/*printk("dt2811: AD soft trigger\n"); */
/*outb(DT2811_CLRERROR|DT2811_INTENB,
dev->iobase+DT2811_ADCSR); */
outb(dev->curadchan, dev->iobase + DT2811_ADGCR);
do_gettimeofday(&trigtime);
break;
case COMEDI_MCONTS:
dev->ntrig = adtrig->n;
break;
}

return 0;
}
#endif

static int dt2811_ao_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int i;
int chan;

chan = CR_CHAN(insn->chanspec);

for (i = 0; i < insn->n; i++) {
outb(data[i] & 0xff, dev->iobase + DT2811_DADAT0LO + 2 * chan);
outb((data[i] >> 8) & 0xff,
dev->iobase + DT2811_DADAT0HI + 2 * chan);
devpriv->ao_readback[chan] = data[i];
}

return i;
}

static int dt2811_ao_insn_read(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int i;
int chan;

chan = CR_CHAN(insn->chanspec);

for (i = 0; i < insn->n; i++)
data[i] = devpriv->ao_readback[chan];

return i;
}

static int dt2811_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 + DT2811_DIO);

return 2;
}

static int dt2811_do_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
if (insn->n != 2)
return -EINVAL;

s->state &= ~data[0];
s->state |= data[0] & data[1];
outb(s->state, dev->iobase + DT2811_DIO);

data[1] = s->state;

return 2;
}

/*
options[0] Board base address
options[1] IRQ
Expand All @@ -337,7 +398,6 @@ static irqreturn_t dt2811_interrupt(int irq, void *d)
1 == bipolar 2.5V (-2.5V -- +2.5V)
2 == unipolar 5V (0V -- +5V)
*/

static int dt2811_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{
/* int i, irq; */
Expand Down Expand Up @@ -523,119 +583,30 @@ static int dt2811_detach(struct comedi_device *dev)
return 0;
}

static int dt2811_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int chan = CR_CHAN(insn->chanspec);
int timeout = DT2811_TIMEOUT;
int i;

for (i = 0; i < insn->n; i++) {
outb(chan, dev->iobase + DT2811_ADGCR);

while (timeout
&& inb(dev->iobase + DT2811_ADCSR) & DT2811_ADBUSY)
timeout--;
if (!timeout)
return -ETIME;

data[i] = inb(dev->iobase + DT2811_ADDATLO);
data[i] |= inb(dev->iobase + DT2811_ADDATHI) << 8;
data[i] &= 0xfff;
}

return i;
}

#if 0
/* Wow. This is code from the Comedi stone age. But it hasn't been
* replaced, so I'll let it stay. */
int dt2811_adtrig(kdev_t minor, comedi_adtrig *adtrig)
{
struct comedi_device *dev = comedi_devices + minor;

if (adtrig->n < 1)
return 0;
dev->curadchan = adtrig->chan;
switch (dev->i_admode) {
case COMEDI_MDEMAND:
dev->ntrig = adtrig->n - 1;
/* not necessary */
/*printk("dt2811: AD soft trigger\n"); */
/*outb(DT2811_CLRERROR|DT2811_INTENB,
dev->iobase+DT2811_ADCSR); */
outb(dev->curadchan, dev->iobase + DT2811_ADGCR);
do_gettimeofday(&trigtime);
break;
case COMEDI_MCONTS:
dev->ntrig = adtrig->n;
break;
}

return 0;
}
#endif

static int dt2811_ao_insn(struct comedi_device *dev, struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int i;
int chan;

chan = CR_CHAN(insn->chanspec);

for (i = 0; i < insn->n; i++) {
outb(data[i] & 0xff, dev->iobase + DT2811_DADAT0LO + 2 * chan);
outb((data[i] >> 8) & 0xff,
dev->iobase + DT2811_DADAT0HI + 2 * chan);
devpriv->ao_readback[chan] = data[i];
}

return i;
}

static int dt2811_ao_insn_read(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
int i;
int chan;

chan = CR_CHAN(insn->chanspec);

for (i = 0; i < insn->n; i++)
data[i] = devpriv->ao_readback[chan];

return i;
}

static int dt2811_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 + DT2811_DIO);

return 2;
}

static int dt2811_do_insn_bits(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_insn *insn, unsigned int *data)
{
if (insn->n != 2)
return -EINVAL;

s->state &= ~data[0];
s->state |= data[0] & data[1];
outb(s->state, dev->iobase + DT2811_DIO);

data[1] = s->state;
static const struct dt2811_board boardtypes[] = {
{
.name = "dt2811-pgh",
.bip_5 = &range_dt2811_pgh_ai_5_bipolar,
.bip_2_5 = &range_dt2811_pgh_ai_2_5_bipolar,
.unip_5 = &range_dt2811_pgh_ai_5_unipolar,
}, {
.name = "dt2811-pgl",
.bip_5 = &range_dt2811_pgl_ai_5_bipolar,
.bip_2_5 = &range_dt2811_pgl_ai_2_5_bipolar,
.unip_5 = &range_dt2811_pgl_ai_5_unipolar,
},
};

return 2;
}
static struct comedi_driver dt2811_driver = {
.driver_name = "dt2811",
.module = THIS_MODULE,
.attach = dt2811_attach,
.detach = dt2811_detach,
.board_name = &boardtypes[0].name,
.num_names = ARRAY_SIZE(boardtypes),
.offset = sizeof(struct dt2811_board),
};
module_comedi_driver(dt2811_driver);

MODULE_AUTHOR("Comedi http://www.comedi.org");
MODULE_DESCRIPTION("Comedi low-level driver");
Expand Down

0 comments on commit ef6cd6b

Please sign in to comment.