Commit a7aa94ce authored by Chase Southwood's avatar Chase Southwood Committed by Greg Kroah-Hartman

Staging: comedi: propagate timeout errors in s626.c

This patch for s626.c propagates the errors from the newly introduced
calls to comedi_timeout() as far as possible.
Signed-off-by: default avatarChase Southwood <chase.southwood@yahoo.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 59a32a46
...@@ -410,7 +410,7 @@ static int s626_send_dac_eoc(struct comedi_device *dev, ...@@ -410,7 +410,7 @@ static int s626_send_dac_eoc(struct comedi_device *dev,
* channel 2. Assumes: (1) TSL2 slot records initialized, and (2) * channel 2. Assumes: (1) TSL2 slot records initialized, and (2)
* dacpol contains valid target image. * dacpol contains valid target image.
*/ */
static void s626_send_dac(struct comedi_device *dev, uint32_t val) static int s626_send_dac(struct comedi_device *dev, uint32_t val)
{ {
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
int ret; int ret;
...@@ -461,8 +461,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val) ...@@ -461,8 +461,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val)
*/ */
ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc, ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc,
s626_send_dac_wait_not_mc1_a2out); s626_send_dac_wait_not_mc1_a2out);
if (ret) if (ret) {
comedi_error(dev, "DMA transfer timeout."); comedi_error(dev, "DMA transfer timeout.");
return ret;
}
/* START THE OUTPUT STREAM TO THE TARGET DAC -------------------- */ /* START THE OUTPUT STREAM TO THE TARGET DAC -------------------- */
...@@ -484,8 +486,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val) ...@@ -484,8 +486,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val)
*/ */
ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc, ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc,
s626_send_dac_wait_ssr_af2_out); s626_send_dac_wait_ssr_af2_out);
if (ret) if (ret) {
comedi_error(dev, "TSL timeout waiting for slot 1 to execute."); comedi_error(dev, "TSL timeout waiting for slot 1 to execute.");
return ret;
}
/* /*
* Set up to trap execution at slot 0 when the TSL sequencer cycles * Set up to trap execution at slot 0 when the TSL sequencer cycles
...@@ -527,8 +531,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val) ...@@ -527,8 +531,10 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val)
*/ */
ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc, ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc,
s626_send_dac_wait_fb_buffer2_msb_00); s626_send_dac_wait_fb_buffer2_msb_00);
if (ret) if (ret) {
comedi_error(dev, "TSL timeout waiting for slot 0 to execute."); comedi_error(dev, "TSL timeout waiting for slot 0 to execute.");
return ret;
}
} }
/* /*
* Either (1) we were too late setting the slot 0 trap; the TSL * Either (1) we were too late setting the slot 0 trap; the TSL
...@@ -549,14 +555,17 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val) ...@@ -549,14 +555,17 @@ static void s626_send_dac(struct comedi_device *dev, uint32_t val)
*/ */
ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc, ret = comedi_timeout(dev, NULL, NULL, s626_send_dac_eoc,
s626_send_dac_wait_fb_buffer2_msb_ff); s626_send_dac_wait_fb_buffer2_msb_ff);
if (ret) if (ret) {
comedi_error(dev, "TSL timeout waiting for slot 0 to execute."); comedi_error(dev, "TSL timeout waiting for slot 0 to execute.");
return ret;
}
return 0;
} }
/* /*
* Private helper function: Write setpoint to an application DAC channel. * Private helper function: Write setpoint to an application DAC channel.
*/ */
static void s626_set_dac(struct comedi_device *dev, uint16_t chan, static int s626_set_dac(struct comedi_device *dev, uint16_t chan,
int16_t dacdata) int16_t dacdata)
{ {
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
...@@ -619,10 +628,10 @@ static void s626_set_dac(struct comedi_device *dev, uint16_t chan, ...@@ -619,10 +628,10 @@ static void s626_set_dac(struct comedi_device *dev, uint16_t chan,
val |= ((uint32_t)(chan & 1) << 15); /* Address the DAC channel val |= ((uint32_t)(chan & 1) << 15); /* Address the DAC channel
* within the device. */ * within the device. */
val |= (uint32_t)dacdata; /* Include DAC setpoint data. */ val |= (uint32_t)dacdata; /* Include DAC setpoint data. */
s626_send_dac(dev, val); return s626_send_dac(dev, val);
} }
static void s626_write_trim_dac(struct comedi_device *dev, uint8_t logical_chan, static int s626_write_trim_dac(struct comedi_device *dev, uint8_t logical_chan,
uint8_t dac_data) uint8_t dac_data)
{ {
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
...@@ -669,17 +678,22 @@ static void s626_write_trim_dac(struct comedi_device *dev, uint8_t logical_chan, ...@@ -669,17 +678,22 @@ static void s626_write_trim_dac(struct comedi_device *dev, uint8_t logical_chan,
* Address the DAC channel within the trimdac device. * Address the DAC channel within the trimdac device.
* Include DAC setpoint data. * Include DAC setpoint data.
*/ */
s626_send_dac(dev, (chan << 8) | dac_data); return s626_send_dac(dev, (chan << 8) | dac_data);
} }
static void s626_load_trim_dacs(struct comedi_device *dev) static int s626_load_trim_dacs(struct comedi_device *dev)
{ {
uint8_t i; uint8_t i;
int ret;
/* Copy TrimDac setpoint values from EEPROM to TrimDacs. */ /* Copy TrimDac setpoint values from EEPROM to TrimDacs. */
for (i = 0; i < ARRAY_SIZE(s626_trimchan); i++) for (i = 0; i < ARRAY_SIZE(s626_trimchan); i++) {
s626_write_trim_dac(dev, i, ret = s626_write_trim_dac(dev, i,
s626_i2c_read(dev, s626_trimadrs[i])); s626_i2c_read(dev, s626_trimadrs[i]));
if (ret)
return ret;
}
return 0;
} }
/* ****** COUNTER FUNCTIONS ******* */ /* ****** COUNTER FUNCTIONS ******* */
...@@ -2378,6 +2392,7 @@ static int s626_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, ...@@ -2378,6 +2392,7 @@ static int s626_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
{ {
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
int i; int i;
int ret;
uint16_t chan = CR_CHAN(insn->chanspec); uint16_t chan = CR_CHAN(insn->chanspec);
int16_t dacdata; int16_t dacdata;
...@@ -2386,7 +2401,9 @@ static int s626_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, ...@@ -2386,7 +2401,9 @@ static int s626_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
devpriv->ao_readback[CR_CHAN(insn->chanspec)] = data[i]; devpriv->ao_readback[CR_CHAN(insn->chanspec)] = data[i];
dacdata -= (0x1fff); dacdata -= (0x1fff);
s626_set_dac(dev, chan, dacdata); ret = s626_set_dac(dev, chan, dacdata);
if (ret)
return ret;
} }
return i; return i;
...@@ -2622,12 +2639,13 @@ static int s626_allocate_dma_buffers(struct comedi_device *dev) ...@@ -2622,12 +2639,13 @@ static int s626_allocate_dma_buffers(struct comedi_device *dev)
return 0; return 0;
} }
static void s626_initialize(struct comedi_device *dev) static int s626_initialize(struct comedi_device *dev)
{ {
struct s626_private *devpriv = dev->private; struct s626_private *devpriv = dev->private;
dma_addr_t phys_buf; dma_addr_t phys_buf;
uint16_t chan; uint16_t chan;
int i; int i;
int ret;
/* Enable DEBI and audio pins, enable I2C interface */ /* Enable DEBI and audio pins, enable I2C interface */
s626_mc_enable(dev, S626_MC1_DEBI | S626_MC1_AUDIO | S626_MC1_I2C, s626_mc_enable(dev, S626_MC1_DEBI | S626_MC1_AUDIO | S626_MC1_I2C,
...@@ -2828,7 +2846,9 @@ static void s626_initialize(struct comedi_device *dev) ...@@ -2828,7 +2846,9 @@ static void s626_initialize(struct comedi_device *dev)
* sometimes causes the first few TrimDAC writes to malfunction. * sometimes causes the first few TrimDAC writes to malfunction.
*/ */
s626_load_trim_dacs(dev); s626_load_trim_dacs(dev);
s626_load_trim_dacs(dev); ret = s626_load_trim_dacs(dev);
if (ret)
return ret;
/* /*
* Manually init all gate array hardware in case this is a soft * Manually init all gate array hardware in case this is a soft
...@@ -2842,8 +2862,11 @@ static void s626_initialize(struct comedi_device *dev) ...@@ -2842,8 +2862,11 @@ static void s626_initialize(struct comedi_device *dev)
* Init all DAC outputs to 0V and init all DAC setpoint and * Init all DAC outputs to 0V and init all DAC setpoint and
* polarity images. * polarity images.
*/ */
for (chan = 0; chan < S626_DAC_CHANNELS; chan++) for (chan = 0; chan < S626_DAC_CHANNELS; chan++) {
s626_set_dac(dev, chan, 0); ret = s626_set_dac(dev, chan, 0);
if (ret)
return ret;
}
/* Init counters */ /* Init counters */
s626_counters_init(dev); s626_counters_init(dev);
...@@ -2859,6 +2882,8 @@ static void s626_initialize(struct comedi_device *dev) ...@@ -2859,6 +2882,8 @@ static void s626_initialize(struct comedi_device *dev)
/* Initialize the digital I/O subsystem */ /* Initialize the digital I/O subsystem */
s626_dio_init(dev); s626_dio_init(dev);
return 0;
} }
static int s626_auto_attach(struct comedi_device *dev, static int s626_auto_attach(struct comedi_device *dev,
...@@ -2979,7 +3004,9 @@ static int s626_auto_attach(struct comedi_device *dev, ...@@ -2979,7 +3004,9 @@ static int s626_auto_attach(struct comedi_device *dev,
s->insn_read = s626_enc_insn_read; s->insn_read = s626_enc_insn_read;
s->insn_write = s626_enc_insn_write; s->insn_write = s626_enc_insn_write;
s626_initialize(dev); ret = s626_initialize(dev);
if (ret)
return ret;
return 0; return 0;
} }
......
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