i8254
random ^= i8254();
struct comedi_8254 *i8254 = s->private;
offset = (void __iomem *)i8254->context - dev->mmio;
offset = i8254->context - dev->iobase;
struct comedi_8254 *i8254 = s->private;
i8254->gate_src[chan] = src;
data[2] = i8254->gate_src[chan];
i8254->clock_src[chan] = src;
data[1] = i8254->clock_src[chan];
data[2] = clock_period[i8254->clock_src[chan]];
struct comedi_8254 *i8254;
i8254 = comedi_8254_mm_alloc(dev->mmio + offset,
i8254 = comedi_8254_io_alloc(dev->iobase + offset,
if (IS_ERR(i8254))
return PTR_ERR(i8254);
comedi_8254_subdevice_init(s, i8254);
i8254->insn_config = dio200_subdev_8254_config;
static unsigned int i8254_io8_cb(struct comedi_8254 *i8254, int dir,
unsigned long iobase = i8254->context;
unsigned int reg_offset = (reg * I8254_IO8) << i8254->regshift;
static unsigned int i8254_io16_cb(struct comedi_8254 *i8254, int dir,
unsigned long iobase = i8254->context;
unsigned int reg_offset = (reg * I8254_IO16) << i8254->regshift;
static unsigned int i8254_io32_cb(struct comedi_8254 *i8254, int dir,
unsigned long iobase = i8254->context;
unsigned int reg_offset = (reg * I8254_IO32) << i8254->regshift;
static unsigned int i8254_mmio8_cb(struct comedi_8254 *i8254, int dir,
void __iomem *mmiobase = (void __iomem *)i8254->context;
unsigned int reg_offset = (reg * I8254_IO8) << i8254->regshift;
static unsigned int i8254_mmio16_cb(struct comedi_8254 *i8254, int dir,
void __iomem *mmiobase = (void __iomem *)i8254->context;
unsigned int reg_offset = (reg * I8254_IO16) << i8254->regshift;
static unsigned int i8254_mmio32_cb(struct comedi_8254 *i8254, int dir,
void __iomem *mmiobase = (void __iomem *)i8254->context;
unsigned int reg_offset = (reg * I8254_IO32) << i8254->regshift;
static unsigned int __i8254_read(struct comedi_8254 *i8254, unsigned int reg)
return 0xff & i8254->iocb(i8254, 0, reg, 0);
static void __i8254_write(struct comedi_8254 *i8254,
i8254->iocb(i8254, 1, reg, val);
unsigned int comedi_8254_status(struct comedi_8254 *i8254, unsigned int counter)
__i8254_write(i8254, cmd, I8254_CTRL_REG);
return __i8254_read(i8254, counter);
unsigned int comedi_8254_read(struct comedi_8254 *i8254, unsigned int counter)
__i8254_write(i8254, I8254_CTRL_SEL_CTR(counter) | I8254_CTRL_LATCH,
val = __i8254_read(i8254, counter);
val |= (__i8254_read(i8254, counter) << 8);
void comedi_8254_write(struct comedi_8254 *i8254,
__i8254_write(i8254, byte, counter);
__i8254_write(i8254, byte, counter);
int comedi_8254_set_mode(struct comedi_8254 *i8254, unsigned int counter,
__i8254_write(i8254, byte, I8254_CTRL_REG);
int comedi_8254_load(struct comedi_8254 *i8254, unsigned int counter,
comedi_8254_set_mode(i8254, counter, mode);
comedi_8254_write(i8254, counter, val);
void comedi_8254_pacer_enable(struct comedi_8254 *i8254,
comedi_8254_set_mode(i8254, counter1, mode);
comedi_8254_set_mode(i8254, counter2, mode);
comedi_8254_write(i8254, counter2, i8254->divisor2);
comedi_8254_write(i8254, counter1, i8254->divisor1);
void comedi_8254_update_divisors(struct comedi_8254 *i8254)
i8254->divisor = i8254->next_div & 0xffff;
i8254->divisor1 = i8254->next_div1 & 0xffff;
i8254->divisor2 = i8254->next_div2 & 0xffff;
void comedi_8254_cascade_ns_to_timer(struct comedi_8254 *i8254,
unsigned int d1 = i8254->next_div1 ? i8254->next_div1 : I8254_MAX_COUNT;
unsigned int d2 = i8254->next_div2 ? i8254->next_div2 : I8254_MAX_COUNT;
if (div * i8254->osc_base == *nanosec &&
div * i8254->osc_base > div &&
div * i8254->osc_base > i8254->osc_base)
div = *nanosec / i8254->osc_base;
ns = i8254->osc_base * d1 * d2;
ns_high = d1_lub * d2_lub * i8254->osc_base;
ns_low = d1_glb * d2_glb * i8254->osc_base;
*nanosec = d1 * d2 * i8254->osc_base;
i8254->next_div1 = d1;
i8254->next_div2 = d2;
void comedi_8254_ns_to_timer(struct comedi_8254 *i8254,
divisor = DIV_ROUND_CLOSEST(*nanosec, i8254->osc_base);
divisor = DIV_ROUND_UP(*nanosec, i8254->osc_base);
divisor = *nanosec / i8254->osc_base;
*nanosec = divisor * i8254->osc_base;
i8254->next_div = divisor;
void comedi_8254_set_busy(struct comedi_8254 *i8254,
i8254->busy[counter] = busy;
struct comedi_8254 *i8254 = s->private;
if (i8254->busy[chan])
data[i] = comedi_8254_read(i8254, chan);
struct comedi_8254 *i8254 = s->private;
if (i8254->busy[chan])
comedi_8254_write(i8254, chan, data[insn->n - 1]);
struct comedi_8254 *i8254 = s->private;
if (i8254->busy[chan])
ret = comedi_8254_set_mode(i8254, chan,
ret = comedi_8254_set_mode(i8254, chan, data[1]);
data[1] = comedi_8254_status(i8254, chan);
if (i8254->insn_config)
return i8254->insn_config(dev, s, insn, data);
struct comedi_8254 *i8254)
s->private = i8254;
struct comedi_8254 *i8254;
i8254 = kzalloc_obj(*i8254);
if (!i8254)
i8254->iocb = iocb;
i8254->context = context;
i8254->iosize = iosize;
i8254->regshift = regshift;
i8254->osc_base = osc_base ? osc_base : I8254_OSC_BASE_10MHZ;
comedi_8254_set_mode(i8254, i, I8254_MODE0 | I8254_BINARY);
return i8254;
struct i8254 *const priv = counter_priv(counter);
struct i8254 *const priv = counter_priv(counter);
const struct i8254 *const priv = counter_priv(counter);
struct i8254 *const priv = counter_priv(counter);
struct i8254 *const priv = counter_priv(counter);
const struct i8254 *const priv = counter_priv(counter);
struct i8254 *const priv = counter_priv(counter);
struct i8254 *priv;
struct i8254 *const priv = counter_priv(counter);
unsigned int comedi_8254_status(struct comedi_8254 *i8254,
unsigned int comedi_8254_read(struct comedi_8254 *i8254, unsigned int counter);
void comedi_8254_write(struct comedi_8254 *i8254,
int comedi_8254_set_mode(struct comedi_8254 *i8254,
int comedi_8254_load(struct comedi_8254 *i8254,
void comedi_8254_pacer_enable(struct comedi_8254 *i8254,
void comedi_8254_update_divisors(struct comedi_8254 *i8254);
void comedi_8254_cascade_ns_to_timer(struct comedi_8254 *i8254,
void comedi_8254_ns_to_timer(struct comedi_8254 *i8254,
void comedi_8254_set_busy(struct comedi_8254 *i8254,
struct comedi_8254 *i8254);
typedef unsigned int comedi_8254_iocb_fn(struct comedi_8254 *i8254, int dir,