diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-02-04 23:42:56 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-02-05 19:18:57 (GMT) |
commit | c12717423e1c61682fada53193813248095cba44 (patch) | |
tree | b2b27e2159eecf8a3aa3ab5ce18168a9e4f688b9 /drivers | |
parent | 9c1dcce9c64c2b53042f2cfb730348201d176855 (diff) | |
download | linux-fsl-qoriq-c12717423e1c61682fada53193813248095cba44.tar.xz |
staging: comedi: quatech_daqp_cs: store private data in the comedi_device
All the comedi_subdevices in this driver use the same 'local' private data.
Instead of storing the pointer to the private data in each subdevice, just
store it in the comedi_device.
Also, instead of passing the private data pointer to pcmcia_request_irq()
in link->priv, pass the comedi_device pointer. This allows removing the
comedi_device and comedi_subdevice pointers from the private data. We can
get them as needed from the void * in the interrupt function.
Fix the pcmcia suspend/resume functions so they use the comedi_device
pointer stored in link->priv to then get the private data pointer.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/comedi/drivers/quatech_daqp_cs.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/drivers/staging/comedi/drivers/quatech_daqp_cs.c b/drivers/staging/comedi/drivers/quatech_daqp_cs.c index 40d525c..8b644f5 100644 --- a/drivers/staging/comedi/drivers/quatech_daqp_cs.c +++ b/drivers/staging/comedi/drivers/quatech_daqp_cs.c @@ -68,8 +68,6 @@ struct local_info_t { struct completion eos; - struct comedi_device *dev; - struct comedi_subdevice *s; int count; }; @@ -169,7 +167,7 @@ static const struct comedi_lrange range_daqp_ai = { static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; if (local->stop) return -EIO; @@ -196,13 +194,13 @@ static int daqp_ai_cancel(struct comedi_device *dev, struct comedi_subdevice *s) */ static enum irqreturn daqp_interrupt(int irq, void *dev_id) { - struct local_info_t *local = dev_id; - struct comedi_device *dev = local ? local->dev : NULL; - struct comedi_subdevice *s = local ? local->s : NULL; + struct comedi_device *dev = dev_id; + struct local_info_t *local = dev->private; + struct comedi_subdevice *s = dev->read_subdev; int loop_limit = 10000; int status; - if (!dev || !dev->attached || !s || s->private != local) + if (!dev->attached) return IRQ_NONE; switch (local->interrupt_mode) { @@ -270,7 +268,7 @@ static int daqp_ai_insn_read(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; int i; int v; int counter = 10000; @@ -327,8 +325,6 @@ static int daqp_ai_insn_read(struct comedi_device *dev, init_completion(&local->eos); local->interrupt_mode = semaphore; - local->dev = dev; - local->s = s; for (i = 0; i < insn->n; i++) { @@ -463,7 +459,7 @@ static int daqp_ai_cmdtest(struct comedi_device *dev, static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; struct comedi_cmd *cmd = &s->async->cmd; int counter; int scanlist_start_on_every_entry; @@ -649,8 +645,6 @@ static int daqp_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) } local->interrupt_mode = buffer; - local->dev = dev; - local->s = s; /* Start conversion */ outb(DAQP_COMMAND_ARM | DAQP_COMMAND_FIFO_DATA, @@ -665,7 +659,7 @@ static int daqp_ao_insn_write(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; int d; unsigned int chan; @@ -692,7 +686,7 @@ static int daqp_di_insn_read(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; if (local->stop) return -EIO; @@ -708,7 +702,7 @@ static int daqp_do_insn_write(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct local_info_t *local = s->private; + struct local_info_t *local = dev->private; if (local->stop) return -EIO; @@ -732,6 +726,7 @@ static int daqp_auto_attach(struct comedi_device *dev, local = kzalloc(sizeof(*local), GFP_KERNEL); if (!local) return -ENOMEM; + dev->private = local; link->config_flags |= CONF_AUTO_SET_IO | CONF_ENABLE_IRQ; ret = comedi_pcmcia_enable(dev); @@ -739,7 +734,7 @@ static int daqp_auto_attach(struct comedi_device *dev, return ret; dev->iobase = link->resource[0]->start; - link->priv = local; + link->priv = dev; ret = pcmcia_request_irq(link, daqp_interrupt); if (ret) return ret; @@ -750,7 +745,6 @@ static int daqp_auto_attach(struct comedi_device *dev, s = &dev->subdevices[0]; dev->read_subdev = s; - s->private = local; s->type = COMEDI_SUBD_AI; s->subdev_flags = SDF_READABLE | SDF_GROUND | SDF_DIFF | SDF_CMD_READ; s->n_chan = 8; @@ -763,7 +757,6 @@ static int daqp_auto_attach(struct comedi_device *dev, s->cancel = daqp_ai_cancel; s = &dev->subdevices[1]; - s->private = local; s->type = COMEDI_SUBD_AO; s->subdev_flags = SDF_WRITEABLE; s->n_chan = 2; @@ -772,14 +765,12 @@ static int daqp_auto_attach(struct comedi_device *dev, s->insn_write = daqp_ao_insn_write; s = &dev->subdevices[2]; - s->private = local; s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE; s->n_chan = 1; s->insn_read = daqp_di_insn_read; s = &dev->subdevices[3]; - s->private = local; s->type = COMEDI_SUBD_DO; s->subdev_flags = SDF_WRITEABLE; s->n_chan = 1; @@ -798,18 +789,23 @@ static struct comedi_driver driver_daqp = { static int daqp_cs_suspend(struct pcmcia_device *link) { - struct local_info_t *local = link->priv; + struct comedi_device *dev = link->priv; + struct local_info_t *local = dev ? dev->private : NULL; /* Mark the device as stopped, to block IO until later */ - local->stop = 1; + if (local) + local->stop = 1; + return 0; } static int daqp_cs_resume(struct pcmcia_device *link) { - struct local_info_t *local = link->priv; + struct comedi_device *dev = link->priv; + struct local_info_t *local = dev ? dev->private : NULL; - local->stop = 0; + if (local) + local->stop = 0; return 0; } |