Commit c7a235a4 authored by Federico Vaga's avatar Federico Vaga

drv: recalibrate only the channel that changes

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 35a54772
...@@ -130,8 +130,8 @@ static int fa_calib_dac_gain_fix(int range, uint32_t gain_c, ...@@ -130,8 +130,8 @@ static int fa_calib_dac_gain_fix(int range, uint32_t gain_c,
return gain_c - error; return gain_c - error;
} }
static void fa_calib_adc_config_chan(struct fa_dev *fa, unsigned int chan, void fa_calib_adc_config_chan(struct fa_dev *fa, unsigned int chan,
int32_t temperature) int32_t temperature)
{ {
int range = fa->range[chan]; int range = fa->range[chan];
struct fa_calib_stanza *cal = &fa->calib.adc[range]; struct fa_calib_stanza *cal = &fa->calib.adc[range];
...@@ -139,6 +139,8 @@ static void fa_calib_adc_config_chan(struct fa_dev *fa, unsigned int chan, ...@@ -139,6 +139,8 @@ static void fa_calib_adc_config_chan(struct fa_dev *fa, unsigned int chan,
int offset = cal->offset[chan]; int offset = cal->offset[chan];
int gain = cal->gain[chan]; int gain = cal->gain[chan];
if (temperature == 0xFFFFFFFF)
temperature = fa_temperature_read(fa);
if (unlikely(!(fa->flags & FA_DEV_F_PATTERN_DATA))) if (unlikely(!(fa->flags & FA_DEV_F_PATTERN_DATA)))
gain = fa_calib_adc_gain_fix(range, gain, delta_temp); gain = fa_calib_adc_gain_fix(range, gain, delta_temp);
...@@ -206,8 +208,8 @@ static int fa_dac_offset_get(struct fa_dev *fa, unsigned int chan) ...@@ -206,8 +208,8 @@ static int fa_dac_offset_get(struct fa_dev *fa, unsigned int chan)
return off_uv; return off_uv;
} }
static int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan, int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan,
int32_t temperature) int32_t temperature)
{ {
int range = fa->range[chan]; int range = fa->range[chan];
int32_t off_uv = fa_dac_offset_get(fa, chan); int32_t off_uv = fa_dac_offset_get(fa, chan);
...@@ -218,6 +220,9 @@ static int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan, ...@@ -218,6 +220,9 @@ static int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan,
int gain = cal->gain[chan]; int gain = cal->gain[chan];
int hwval; int hwval;
if (temperature == 0xFFFFFFFF)
temperature = fa_temperature_read(fa);
if (unlikely(!(fa->flags & FA_DEV_F_PATTERN_DATA))) if (unlikely(!(fa->flags & FA_DEV_F_PATTERN_DATA)))
gain = fa_calib_dac_gain_fix(range, gain, delta_temp); gain = fa_calib_dac_gain_fix(range, gain, delta_temp);
...@@ -228,12 +233,10 @@ static int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan, ...@@ -228,12 +233,10 @@ static int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan,
return fa_dac_offset_set(fa, chan, hwval); return fa_dac_offset_set(fa, chan, hwval);
} }
void fa_calib_dac_config(struct fa_dev *fa, int32_t temperature) static void fa_calib_dac_config(struct fa_dev *fa, int32_t temperature)
{ {
int i; int i;
if (temperature == 0xFFFFFFFF)
temperature = fa_temperature_read(fa);
dev_dbg(&fa->pdev->dev, "%s: {temperature: %d}\n", dev_dbg(&fa->pdev->dev, "%s: {temperature: %d}\n",
__func__, temperature); __func__, temperature);
...@@ -248,8 +251,6 @@ static void fa_calib_adc_config(struct fa_dev *fa, int32_t temperature) ...@@ -248,8 +251,6 @@ static void fa_calib_adc_config(struct fa_dev *fa, int32_t temperature)
int err; int err;
int i; int i;
if (temperature == 0xFFFFFFFF)
temperature = fa_temperature_read(fa);
dev_dbg(&fa->pdev->dev, "%s: {temperature: %d}\n", dev_dbg(&fa->pdev->dev, "%s: {temperature: %d}\n",
__func__, temperature); __func__, temperature);
......
...@@ -165,8 +165,8 @@ void zfad_reset_offset(struct fa_dev *fa) ...@@ -165,8 +165,8 @@ void zfad_reset_offset(struct fa_dev *fa)
for (i = 0; i < FA100M14B4C_NCHAN; ++i) { for (i = 0; i < FA100M14B4C_NCHAN; ++i) {
fa->user_offset[i] = 0; fa->user_offset[i] = 0;
fa->zero_offset[i] = 0; fa->zero_offset[i] = 0;
fa_calib_dac_config_chan(fa, i, ~0);
} }
fa_calib_dac_config(fa, ~0);
} }
/* /*
......
...@@ -214,7 +214,7 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr, ...@@ -214,7 +214,7 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
spin_lock(&fa->zdev->cset->lock); spin_lock(&fa->zdev->cset->lock);
fa->zero_offset[i] = usr_val; fa->zero_offset[i] = usr_val;
spin_unlock(&fa->zdev->cset->lock); spin_unlock(&fa->zdev->cset->lock);
fa_calib_dac_config(fa, ~0); fa_calib_dac_config_chan(fa, i, ~0);
return 0; return 0;
case ZFA_CHx_SAT: case ZFA_CHx_SAT:
/* TODO when TLV */ /* TODO when TLV */
...@@ -249,15 +249,13 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr, ...@@ -249,15 +249,13 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
spin_lock(&fa->zdev->cset->lock); spin_lock(&fa->zdev->cset->lock);
fa->user_offset[chan->index] = usr_val; fa->user_offset[chan->index] = usr_val;
spin_unlock(&fa->zdev->cset->lock); spin_unlock(&fa->zdev->cset->lock);
fa_calib_dac_config(fa, ~0); return fa_calib_dac_config_chan(fa, i, ~0);
return 0;
case ZFA_CHx_OFFSET: case ZFA_CHx_OFFSET:
chan = to_zio_chan(dev); chan = to_zio_chan(dev);
spin_lock(&fa->zdev->cset->lock); spin_lock(&fa->zdev->cset->lock);
fa->user_offset[chan->index] = usr_val; fa->user_offset[chan->index] = usr_val;
spin_unlock(&fa->zdev->cset->lock); spin_unlock(&fa->zdev->cset->lock);
fa_calib_dac_config(fa, ~0); return fa_calib_dac_config_chan(fa, chan->index, ~0);
return 0;
case ZFA_CTL_DAC_CLR_N: case ZFA_CTL_DAC_CLR_N:
zfad_reset_offset(fa); zfad_reset_offset(fa);
return 0; return 0;
...@@ -297,7 +295,8 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr, ...@@ -297,7 +295,8 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
err = fa_adc_range_set(fa, &to_zio_cset(dev)->chan[i], range); err = fa_adc_range_set(fa, &to_zio_cset(dev)->chan[i], range);
if (err) if (err)
return err; return err;
fa_calib_config(fa); fa_calib_adc_config_chan(fa, i, ~0);
fa_calib_dac_config_chan(fa, i, ~0);
return 0; return 0;
case ZFA_CHx_CTL_RANGE: case ZFA_CHx_CTL_RANGE:
...@@ -307,7 +306,8 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr, ...@@ -307,7 +306,8 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
err = fa_adc_range_set(fa, &to_zio_cset(dev)->chan[i], range); err = fa_adc_range_set(fa, &to_zio_cset(dev)->chan[i], range);
if (err) if (err)
return err; return err;
fa_calib_config(fa); fa_calib_adc_config_chan(fa, i, ~0);
fa_calib_dac_config_chan(fa, i, ~0);
return 0; return 0;
case ZFA_UTC_COARSE: case ZFA_UTC_COARSE:
......
...@@ -655,7 +655,10 @@ extern void fa_spi_exit(struct fa_dev *fd); ...@@ -655,7 +655,10 @@ extern void fa_spi_exit(struct fa_dev *fd);
extern int fa_calib_init(struct fa_dev *fa); extern int fa_calib_init(struct fa_dev *fa);
extern void fa_calib_exit(struct fa_dev *fa); extern void fa_calib_exit(struct fa_dev *fa);
extern void fa_calib_config(struct fa_dev *fa); extern void fa_calib_config(struct fa_dev *fa);
extern void fa_calib_dac_config(struct fa_dev *fa, int32_t temperature); extern void fa_calib_adc_config_chan(struct fa_dev *fa, unsigned int chan,
int32_t temperature);
extern int fa_calib_dac_config_chan(struct fa_dev *fa, unsigned int chan,
int32_t temperature);
/* functions exported by fa-debug.c */ /* functions exported by fa-debug.c */
extern int fa_debug_init(struct fa_dev *fa); extern int fa_debug_init(struct fa_dev *fa);
......
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