Commit 35c5e884 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: pcmmio: remove subdevice private data

Only subdevice[2], the dio interrupt subdevice, uses the subdevice private data.
Move the members from struct pcmmio_subdev_private to struct pcmmio_private and
remove the subdevice private data. This also allows removing the allocation and
freeing of devpriv->sprivs.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 518bf39f
...@@ -201,35 +201,13 @@ static const struct comedi_lrange pcmmio_ao_ranges = { ...@@ -201,35 +201,13 @@ static const struct comedi_lrange pcmmio_ao_ranges = {
} }
}; };
/* this structure is for data unique to this subdevice. */
struct pcmmio_subdev_private {
union {
struct {
/* The below is only used for intr subdevices */
struct {
/*
* subdev-relative channel mask for channels
* we are interested in
*/
int enabled_mask;
int active;
int stop_count;
int continuous;
spinlock_t spinlock;
} intr;
} dio;
};
};
/*
* this structure is for data unique to this hardware driver. If
* several hardware drivers keep similar information in this structure,
* feel free to suggest moving the variable to the struct comedi_device struct.
*/
struct pcmmio_private { struct pcmmio_private {
spinlock_t pagelock; /* protects the page registers */ spinlock_t pagelock; /* protects the page registers */
spinlock_t spinlock; /* protects the member variables */
int enabled_mask;
int active;
int stop_count;
int continuous;
struct pcmmio_subdev_private *sprivs; struct pcmmio_subdev_private *sprivs;
unsigned int ao_readback[8]; unsigned int ao_readback[8];
...@@ -366,10 +344,10 @@ static void pcmmio_reset(struct comedi_device *dev) ...@@ -366,10 +344,10 @@ static void pcmmio_reset(struct comedi_device *dev)
static void pcmmio_stop_intr(struct comedi_device *dev, static void pcmmio_stop_intr(struct comedi_device *dev,
struct comedi_subdevice *s) struct comedi_subdevice *s)
{ {
struct pcmmio_subdev_private *subpriv = s->private; struct pcmmio_private *devpriv = dev->private;
subpriv->dio.intr.enabled_mask = 0; devpriv->enabled_mask = 0;
subpriv->dio.intr.active = 0; devpriv->active = 0;
s->async->inttrig = NULL; s->async->inttrig = NULL;
/* disable all dio interrupts */ /* disable all dio interrupts */
...@@ -381,7 +359,6 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d) ...@@ -381,7 +359,6 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
struct comedi_device *dev = d; struct comedi_device *dev = d;
struct pcmmio_private *devpriv = dev->private; struct pcmmio_private *devpriv = dev->private;
struct comedi_subdevice *s = dev->read_subdev; struct comedi_subdevice *s = dev->read_subdev;
struct pcmmio_subdev_private *subpriv = s->private;
int got1 = 0; int got1 = 0;
unsigned long flags; unsigned long flags;
...@@ -433,21 +410,19 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d) ...@@ -433,21 +410,19 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
unsigned long flags; unsigned long flags;
unsigned oldevents; unsigned oldevents;
spin_lock_irqsave(&subpriv->dio. spin_lock_irqsave(&devpriv->spinlock,
intr.spinlock,
flags); flags);
oldevents = s->async->events; oldevents = s->async->events;
if (subpriv->dio.intr.active) { if (devpriv->active) {
unsigned mytrig = unsigned mytrig =
((triggered >> 0) ((triggered >> 0)
& &
((0x1 << 24) - ((0x1 << 24) -
1)) << 0; 1)) << 0;
if (mytrig & if (mytrig &
subpriv->dio. devpriv->enabled_mask) {
intr.enabled_mask) {
unsigned int val unsigned int val
= 0; = 0;
unsigned int n, unsigned int n,
...@@ -479,11 +454,11 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d) ...@@ -479,11 +454,11 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
} }
/* Check for end of acquisition. */ /* Check for end of acquisition. */
if (!subpriv->dio.intr.continuous) { if (!devpriv->continuous) {
/* stop_src == TRIG_COUNT */ /* stop_src == TRIG_COUNT */
if (subpriv->dio.intr.stop_count > 0) { if (devpriv->stop_count > 0) {
subpriv->dio.intr.stop_count--; devpriv->stop_count--;
if (subpriv->dio.intr.stop_count == 0) { if (devpriv->stop_count == 0) {
s->async->events |= COMEDI_CB_EOA; s->async->events |= COMEDI_CB_EOA;
/* TODO: STOP_ACQUISITION_CALL_HERE!! */ /* TODO: STOP_ACQUISITION_CALL_HERE!! */
pcmmio_stop_intr pcmmio_stop_intr
...@@ -496,8 +471,7 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d) ...@@ -496,8 +471,7 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
} }
spin_unlock_irqrestore spin_unlock_irqrestore
(&subpriv->dio.intr. (&devpriv->spinlock, flags);
spinlock, flags);
if (oldevents != if (oldevents !=
s->async->events) { s->async->events) {
...@@ -514,20 +488,20 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d) ...@@ -514,20 +488,20 @@ static irqreturn_t interrupt_pcmmio(int irq, void *d)
static int pcmmio_start_intr(struct comedi_device *dev, static int pcmmio_start_intr(struct comedi_device *dev,
struct comedi_subdevice *s) struct comedi_subdevice *s)
{ {
struct pcmmio_subdev_private *subpriv = s->private; struct pcmmio_private *devpriv = dev->private;
if (!subpriv->dio.intr.continuous && subpriv->dio.intr.stop_count == 0) { if (!devpriv->continuous && devpriv->stop_count == 0) {
/* An empty acquisition! */ /* An empty acquisition! */
s->async->events |= COMEDI_CB_EOA; s->async->events |= COMEDI_CB_EOA;
subpriv->dio.intr.active = 0; devpriv->active = 0;
return 1; return 1;
} else { } else {
unsigned bits = 0, pol_bits = 0, n; unsigned bits = 0, pol_bits = 0, n;
int nports, firstport, port; int nports, firstport, port;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
subpriv->dio.intr.enabled_mask = 0; devpriv->enabled_mask = 0;
subpriv->dio.intr.active = 1; devpriv->active = 1;
nports = 24 / CHANS_PER_PORT; nports = 24 / CHANS_PER_PORT;
firstport = 0 / CHANS_PER_PORT; firstport = 0 / CHANS_PER_PORT;
if (cmd->chanlist) { if (cmd->chanlist) {
...@@ -540,7 +514,7 @@ static int pcmmio_start_intr(struct comedi_device *dev, ...@@ -540,7 +514,7 @@ static int pcmmio_start_intr(struct comedi_device *dev,
} }
} }
bits &= ((0x1 << 24) - 1) << 0; bits &= ((0x1 << 24) - 1) << 0;
subpriv->dio.intr.enabled_mask = bits; devpriv->enabled_mask = bits;
{ {
/* /*
...@@ -577,13 +551,13 @@ static int pcmmio_start_intr(struct comedi_device *dev, ...@@ -577,13 +551,13 @@ static int pcmmio_start_intr(struct comedi_device *dev,
static int pcmmio_cancel(struct comedi_device *dev, struct comedi_subdevice *s) static int pcmmio_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
{ {
struct pcmmio_subdev_private *subpriv = s->private; struct pcmmio_private *devpriv = dev->private;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&subpriv->dio.intr.spinlock, flags); spin_lock_irqsave(&devpriv->spinlock, flags);
if (subpriv->dio.intr.active) if (devpriv->active)
pcmmio_stop_intr(dev, s); pcmmio_stop_intr(dev, s);
spin_unlock_irqrestore(&subpriv->dio.intr.spinlock, flags); spin_unlock_irqrestore(&devpriv->spinlock, flags);
return 0; return 0;
} }
...@@ -595,18 +569,18 @@ static int ...@@ -595,18 +569,18 @@ static int
pcmmio_inttrig_start_intr(struct comedi_device *dev, struct comedi_subdevice *s, pcmmio_inttrig_start_intr(struct comedi_device *dev, struct comedi_subdevice *s,
unsigned int trignum) unsigned int trignum)
{ {
struct pcmmio_subdev_private *subpriv = s->private; struct pcmmio_private *devpriv = dev->private;
unsigned long flags; unsigned long flags;
int event = 0; int event = 0;
if (trignum != 0) if (trignum != 0)
return -EINVAL; return -EINVAL;
spin_lock_irqsave(&subpriv->dio.intr.spinlock, flags); spin_lock_irqsave(&devpriv->spinlock, flags);
s->async->inttrig = NULL; s->async->inttrig = NULL;
if (subpriv->dio.intr.active) if (devpriv->active)
event = pcmmio_start_intr(dev, s); event = pcmmio_start_intr(dev, s);
spin_unlock_irqrestore(&subpriv->dio.intr.spinlock, flags); spin_unlock_irqrestore(&devpriv->spinlock, flags);
if (event) if (event)
comedi_event(dev, s); comedi_event(dev, s);
...@@ -619,24 +593,24 @@ pcmmio_inttrig_start_intr(struct comedi_device *dev, struct comedi_subdevice *s, ...@@ -619,24 +593,24 @@ pcmmio_inttrig_start_intr(struct comedi_device *dev, struct comedi_subdevice *s,
*/ */
static int pcmmio_cmd(struct comedi_device *dev, struct comedi_subdevice *s) static int pcmmio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
{ {
struct pcmmio_subdev_private *subpriv = s->private; struct pcmmio_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
unsigned long flags; unsigned long flags;
int event = 0; int event = 0;
spin_lock_irqsave(&subpriv->dio.intr.spinlock, flags); spin_lock_irqsave(&devpriv->spinlock, flags);
subpriv->dio.intr.active = 1; devpriv->active = 1;
/* Set up end of acquisition. */ /* Set up end of acquisition. */
switch (cmd->stop_src) { switch (cmd->stop_src) {
case TRIG_COUNT: case TRIG_COUNT:
subpriv->dio.intr.continuous = 0; devpriv->continuous = 0;
subpriv->dio.intr.stop_count = cmd->stop_arg; devpriv->stop_count = cmd->stop_arg;
break; break;
default: default:
/* TRIG_NONE */ /* TRIG_NONE */
subpriv->dio.intr.continuous = 1; devpriv->continuous = 1;
subpriv->dio.intr.stop_count = 0; devpriv->stop_count = 0;
break; break;
} }
...@@ -650,7 +624,7 @@ static int pcmmio_cmd(struct comedi_device *dev, struct comedi_subdevice *s) ...@@ -650,7 +624,7 @@ static int pcmmio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
event = pcmmio_start_intr(dev, s); event = pcmmio_start_intr(dev, s);
break; break;
} }
spin_unlock_irqrestore(&subpriv->dio.intr.spinlock, flags); spin_unlock_irqrestore(&devpriv->spinlock, flags);
if (event) if (event)
comedi_event(dev, s); comedi_event(dev, s);
...@@ -875,7 +849,6 @@ static int pcmmio_ao_insn_write(struct comedi_device *dev, ...@@ -875,7 +849,6 @@ static int pcmmio_ao_insn_write(struct comedi_device *dev,
static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
{ {
struct pcmmio_private *devpriv; struct pcmmio_private *devpriv;
struct pcmmio_subdev_private *subpriv;
struct comedi_subdevice *s; struct comedi_subdevice *s;
int ret; int ret;
...@@ -889,11 +862,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) ...@@ -889,11 +862,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
spin_lock_init(&devpriv->pagelock); spin_lock_init(&devpriv->pagelock);
devpriv->sprivs = kcalloc(4, sizeof(struct pcmmio_subdev_private),
GFP_KERNEL);
if (!devpriv->sprivs)
return -ENOMEM;
ret = comedi_alloc_subdevices(dev, 4); ret = comedi_alloc_subdevices(dev, 4);
if (ret) if (ret)
return ret; return ret;
...@@ -945,12 +913,10 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) ...@@ -945,12 +913,10 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
s->do_cmd = pcmmio_cmd; s->do_cmd = pcmmio_cmd;
s->do_cmdtest = pcmmio_cmdtest; s->do_cmdtest = pcmmio_cmdtest;
s->private = &devpriv->sprivs[2]; devpriv->active = 0;
subpriv = s->private; devpriv->stop_count = 0;
subpriv->dio.intr.active = 0;
subpriv->dio.intr.stop_count = 0;
spin_lock_init(&subpriv->dio.intr.spinlock); spin_lock_init(&devpriv->spinlock);
/* Digital I/O subdevice */ /* Digital I/O subdevice */
s = &dev->subdevices[3]; s = &dev->subdevices[3];
...@@ -976,10 +942,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it) ...@@ -976,10 +942,6 @@ static int pcmmio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
static void pcmmio_detach(struct comedi_device *dev) static void pcmmio_detach(struct comedi_device *dev)
{ {
struct pcmmio_private *devpriv = dev->private;
if (devpriv)
kfree(devpriv->sprivs);
comedi_legacy_detach(dev); comedi_legacy_detach(dev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment