Commit 3a4fa1c7 authored by Federico Vaga's avatar Federico Vaga

drv: validate user input

the offset user input is validated; in fa_dac_offset_get() there is a
paranoid check; if the offset is still out of range, then there is
something big and wrong somewhere.
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent b0a46eac
......@@ -183,20 +183,18 @@ static int64_t fa_dac_offset_raw_calibrate(int32_t raw_offset,
return hwval;
}
#define DAC_SAT_LOW -5000000
#define DAC_SAT_UP 5000000
static int fa_dac_offset_get(struct fa_dev *fa, unsigned int chan)
{
int32_t off_uv = fa->user_offset[chan] + fa->zero_offset[chan];
if (off_uv < DAC_SAT_LOW) {
dev_warn(&fa->pdev->dev, "DAC lower saturation %d\n",
DAC_SAT_LOW);
if (WARN(off_uv < DAC_SAT_LOW,
"DAC lower saturation %d < %d\n",
off_uv, DAC_SAT_LOW)) {
off_uv = DAC_SAT_LOW;
}
if (off_uv > DAC_SAT_UP) {
dev_warn(&fa->pdev->dev, "DAC upper saturation %d\n",
DAC_SAT_UP);
if (WARN(off_uv > DAC_SAT_UP,
"DAC upper saturation %d > %d\n",
off_uv, DAC_SAT_UP)) {
off_uv = DAC_SAT_UP;
}
......
......@@ -160,6 +160,12 @@ int zfad_convert_user_range(uint32_t user_val)
return zfad_convert_hw_range(user_val);
}
static bool fa_is_dac_offset_valid(int32_t user, int32_t zero)
{
int32_t offset = user + zero;
return (offset >= DAC_SAT_LOW && offset <= DAC_SAT_UP);
}
/*
* zfad_conf_set
*
......@@ -202,13 +208,15 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
/*fallthrough*/
case ZFA_SW_CH4_OFFSET_ZERO:
i--;
chan = to_zio_cset(dev)->chan + i;
if (!fa_is_dac_offset_valid(fa->user_offset[chan->index],
usr_val))
return -EINVAL;
spin_lock(&fa->zdev->cset->lock);
fa->zero_offset[i] = usr_val;
spin_unlock(&fa->zdev->cset->lock);
fa_calib_dac_config(fa, ~0);
return err;
return 0;
case ZFA_CHx_SAT:
/* TODO when TLV */
break;
......@@ -235,8 +243,10 @@ static int zfad_conf_set(struct device *dev, struct zio_attribute *zattr,
/*fallthrough*/
case ZFA_CH4_OFFSET:
i--;
chan = to_zio_cset(dev)->chan + i;
chan = to_zio_cset(dev)->chan + i;
if (!fa_is_dac_offset_valid(usr_val,
fa->zero_offset[chan->index]))
return -EINVAL;
spin_lock(&fa->zdev->cset->lock);
fa->user_offset[chan->index] = usr_val;
spin_unlock(&fa->zdev->cset->lock);
......
......@@ -175,6 +175,9 @@ struct fa_calib {
#define ADC_SPI_OFF 0x1800
#define ADC_UTC_OFF 0x1900
#define DAC_SAT_LOW -5000000
#define DAC_SAT_UP 5000000
extern int fa_enable_test_data_adc;
#define ADC_DMA 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