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@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/drivers/quatech_daqp_cs.c | 46 +++++++++++------------- 1 file 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; } -- 1.8.1.1.293.gfe73786 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel