staging: comedi: ii_pci20kc.c: break up the subdevice private data union
The union used for the subdevice private data just adds confusion. Split the union into two separate private data structs. 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>
This commit is contained in:
parent
57b2161f02
commit
04815a4b5e
1 changed files with 33 additions and 31 deletions
|
@ -178,17 +178,15 @@ static const struct comedi_lrange *const ii20k_ai_ranges[] = {
|
||||||
static const int pci20341_timebase[] = { 0x00, 0x00, 0x00, 0x04 };
|
static const int pci20341_timebase[] = { 0x00, 0x00, 0x00, 0x04 };
|
||||||
static const int pci20341_settling_time[] = { 0x58, 0x58, 0x93, 0x99 };
|
static const int pci20341_settling_time[] = { 0x58, 0x58, 0x93, 0x99 };
|
||||||
|
|
||||||
union pci20xxx_subdev_private {
|
struct ii20k_ao_private {
|
||||||
struct {
|
const struct comedi_lrange *ao_range_list[2];
|
||||||
const struct comedi_lrange *ao_range_list[2];
|
unsigned int last_data[2];
|
||||||
/* range of channels of ao module */
|
};
|
||||||
unsigned int last_data[2];
|
|
||||||
} pci20006;
|
struct ii20k_ai_private {
|
||||||
struct {
|
int timebase;
|
||||||
int timebase;
|
int settling_time;
|
||||||
int settling_time;
|
int ai_gain;
|
||||||
int ai_gain;
|
|
||||||
} pci20341;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci20xxx_private {
|
struct pci20xxx_private {
|
||||||
|
@ -208,9 +206,9 @@ static int ii20k_ao_insn_read(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned int *data)
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
union pci20xxx_subdev_private *sdp = s->private;
|
struct ii20k_ao_private *ao_spriv = s->private;
|
||||||
|
|
||||||
data[0] = sdp->pci20006.last_data[CR_CHAN(insn->chanspec)];
|
data[0] = ao_spriv->last_data[CR_CHAN(insn->chanspec)];
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -220,12 +218,12 @@ static int ii20k_ao_insn_write(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned int *data)
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
union pci20xxx_subdev_private *sdp = s->private;
|
struct ii20k_ao_private *ao_spriv = s->private;
|
||||||
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
||||||
int hi, lo;
|
int hi, lo;
|
||||||
unsigned int boarddata;
|
unsigned int boarddata;
|
||||||
|
|
||||||
sdp->pci20006.last_data[CR_CHAN(insn->chanspec)] = data[0];
|
ao_spriv->last_data[CR_CHAN(insn->chanspec)] = data[0];
|
||||||
boarddata = (((unsigned int)data[0] + 0x8000) & 0xffff);
|
boarddata = (((unsigned int)data[0] + 0x8000) & 0xffff);
|
||||||
/* comedi-data -> board-data */
|
/* comedi-data -> board-data */
|
||||||
lo = (boarddata & 0xff);
|
lo = (boarddata & 0xff);
|
||||||
|
@ -255,7 +253,7 @@ static int ii20k_ai_insn_read(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned int *data)
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
union pci20xxx_subdev_private *sdp = s->private;
|
struct ii20k_ai_private *ai_spriv = s->private;
|
||||||
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
||||||
unsigned int i = 0, j = 0;
|
unsigned int i = 0, j = 0;
|
||||||
int lo, hi;
|
int lo, hi;
|
||||||
|
@ -265,7 +263,7 @@ static int ii20k_ai_insn_read(struct comedi_device *dev,
|
||||||
|
|
||||||
/* write number of input channels */
|
/* write number of input channels */
|
||||||
writeb(1, iobase + PCI20341_LCHAN_ADDR_REG);
|
writeb(1, iobase + PCI20341_LCHAN_ADDR_REG);
|
||||||
clb = PCI20341_DAISY_CHAIN | PCI20341_MUX | (sdp->pci20341.ai_gain << 3)
|
clb = PCI20341_DAISY_CHAIN | PCI20341_MUX | (ai_spriv->ai_gain << 3)
|
||||||
| CR_CHAN(insn->chanspec);
|
| CR_CHAN(insn->chanspec);
|
||||||
writeb(clb, iobase + PCI20341_CHAN_LIST);
|
writeb(clb, iobase + PCI20341_CHAN_LIST);
|
||||||
|
|
||||||
|
@ -310,12 +308,12 @@ static int ii20k_ai_insn_read(struct comedi_device *dev,
|
||||||
static void ii20k_ai_init(struct comedi_device *dev,
|
static void ii20k_ai_init(struct comedi_device *dev,
|
||||||
struct comedi_subdevice *s)
|
struct comedi_subdevice *s)
|
||||||
{
|
{
|
||||||
union pci20xxx_subdev_private *sdp = s->private;
|
struct ii20k_ai_private *ai_spriv = s->private;
|
||||||
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
||||||
unsigned char option;
|
unsigned char option;
|
||||||
|
|
||||||
/* depends on gain, trigger, repetition mode */
|
/* depends on gain, trigger, repetition mode */
|
||||||
option = sdp->pci20341.timebase | PCI20341_REPMODE;
|
option = ai_spriv->timebase | PCI20341_REPMODE;
|
||||||
|
|
||||||
/* initialize Module */
|
/* initialize Module */
|
||||||
writeb(PCI20341_INIT, iobase + PCI20341_CONFIG_REG);
|
writeb(PCI20341_INIT, iobase + PCI20341_CONFIG_REG);
|
||||||
|
@ -324,8 +322,7 @@ static void ii20k_ai_init(struct comedi_device *dev,
|
||||||
/* option register */
|
/* option register */
|
||||||
writeb(option, iobase + PCI20341_OPT_REG);
|
writeb(option, iobase + PCI20341_OPT_REG);
|
||||||
/* settling time counter */
|
/* settling time counter */
|
||||||
writeb(sdp->pci20341.settling_time,
|
writeb(ai_spriv->settling_time, iobase + PCI20341_SET_TIME_REG);
|
||||||
iobase + PCI20341_SET_TIME_REG);
|
|
||||||
/* trigger not implemented */
|
/* trigger not implemented */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,16 +466,13 @@ static int ii20k_init_module(struct comedi_device *dev,
|
||||||
struct comedi_subdevice *s,
|
struct comedi_subdevice *s,
|
||||||
struct comedi_devconfig *it)
|
struct comedi_devconfig *it)
|
||||||
{
|
{
|
||||||
union pci20xxx_subdev_private *sdp;
|
struct ii20k_ao_private *ao_spriv;
|
||||||
|
struct ii20k_ai_private *ai_spriv;
|
||||||
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
void __iomem *iobase = ii20k_module_iobase(dev, s);
|
||||||
unsigned int opt0 = it->options[(2 * s->index) + 2];
|
unsigned int opt0 = it->options[(2 * s->index) + 2];
|
||||||
unsigned int opt1 = it->options[(2 * s->index) + 3];
|
unsigned int opt1 = it->options[(2 * s->index) + 3];
|
||||||
unsigned char id;
|
unsigned char id;
|
||||||
|
|
||||||
sdp = comedi_alloc_spriv(s, sizeof(*sdp));
|
|
||||||
if (!sdp)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
id = readb(iobase + II20K_ID_REG);
|
id = readb(iobase + II20K_ID_REG);
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case PCI20006_ID:
|
case PCI20006_ID:
|
||||||
|
@ -487,15 +481,19 @@ static int ii20k_init_module(struct comedi_device *dev,
|
||||||
if (opt1 < 0 || opt1 > 2)
|
if (opt1 < 0 || opt1 > 2)
|
||||||
opt1 = 0;
|
opt1 = 0;
|
||||||
|
|
||||||
sdp->pci20006.ao_range_list[0] = ii20k_ao_ranges[opt0];
|
ao_spriv = comedi_alloc_spriv(s, sizeof(*ao_spriv));
|
||||||
sdp->pci20006.ao_range_list[1] = ii20k_ao_ranges[opt1];
|
if (!ao_spriv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ao_spriv->ao_range_list[0] = ii20k_ao_ranges[opt0];
|
||||||
|
ao_spriv->ao_range_list[1] = ii20k_ao_ranges[opt1];
|
||||||
|
|
||||||
/* Analog Output subdevice */
|
/* Analog Output subdevice */
|
||||||
s->type = COMEDI_SUBD_AO;
|
s->type = COMEDI_SUBD_AO;
|
||||||
s->subdev_flags = SDF_WRITABLE;
|
s->subdev_flags = SDF_WRITABLE;
|
||||||
s->n_chan = 2;
|
s->n_chan = 2;
|
||||||
s->maxdata = 0xffff;
|
s->maxdata = 0xffff;
|
||||||
s->range_table_list = sdp->pci20006.ao_range_list;
|
s->range_table_list = ao_spriv->ao_range_list;
|
||||||
s->insn_read = ii20k_ao_insn_read;
|
s->insn_read = ii20k_ao_insn_read;
|
||||||
s->insn_write = ii20k_ao_insn_write;
|
s->insn_write = ii20k_ao_insn_write;
|
||||||
break;
|
break;
|
||||||
|
@ -503,8 +501,12 @@ static int ii20k_init_module(struct comedi_device *dev,
|
||||||
if (opt0 < 0 || opt0 > 3)
|
if (opt0 < 0 || opt0 > 3)
|
||||||
opt0 = 0;
|
opt0 = 0;
|
||||||
|
|
||||||
sdp->pci20341.timebase = pci20341_timebase[opt0];
|
ai_spriv = comedi_alloc_spriv(s, sizeof(*ai_spriv));
|
||||||
sdp->pci20341.settling_time = pci20341_settling_time[opt0];
|
if (!ai_spriv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ai_spriv->timebase = pci20341_timebase[opt0];
|
||||||
|
ai_spriv->settling_time = pci20341_settling_time[opt0];
|
||||||
|
|
||||||
/* Analog Input subdevice */
|
/* Analog Input subdevice */
|
||||||
s->type = COMEDI_SUBD_AI;
|
s->type = COMEDI_SUBD_AI;
|
||||||
|
|
Loading…
Reference in a new issue