Commit fcddc06e authored by Federico Vaga's avatar Federico Vaga

sw:drv: use platform data to deliver carrier offset

At the end the carrier offset value for White-Rabbit has been always
constant and it depends on the hardware:
- SVEC: 3000 ps
- SPEC:    0 ps

so, instead of complicate users life by setting this module parameter,
here I am embedding it into the platform_data for the TDC.

The ideal solution would be to ignore this value in software and to
apply it in HDL directly.
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 085ad3ea
......@@ -25,12 +25,6 @@ module_param_named(wr_offset_fix, wr_calibration_offset, int, 0444);
MODULE_PARM_DESC(wr_offset_fix,
"Overwrite the White-Rabbit calibration offset for calibration value computer before 2018. (Default: 229460 [ps])");
static u32 wr_calibration_offset_carrier = 0;
module_param_named(wr_offset_carrier, wr_calibration_offset_carrier, int, 0444);
MODULE_PARM_DESC(wr_offset_carrier,
"White-Rabbit carrier calibration offset. (Default SPEC: 0 [ps])");
/* dummy calibration data - used in case of empty/corrupted EEPROM */
static struct ft_calibration default_calibration = {
{0, 86, 609, 572, 335}, /* zero_offset */
......@@ -124,7 +118,6 @@ static void ft_calib_cpy_from_raw(struct ft_calibration *calib,
calib->vcxo_default_tune = calib_raw->vcxo_default_tune / 100;
calib->calibration_temp = calib_raw->calibration_temp;
calib->wr_offset = calib_raw->wr_offset / 100;
calib->wr_offset += wr_calibration_offset_carrier;
}
static void ft_calib_cpy_to_raw(struct ft_calibration_raw *calib_raw,
......@@ -136,7 +129,7 @@ static void ft_calib_cpy_to_raw(struct ft_calibration_raw *calib_raw,
calib_raw->zero_offset[i - 1] = calib->zero_offset[i] * 100;
calib_raw->vcxo_default_tune = calib->vcxo_default_tune * 100;
calib_raw->calibration_temp = calib->calibration_temp;
calib_raw->wr_offset = (calib->wr_offset - wr_calibration_offset_carrier) * 100;
calib_raw->wr_offset = calib->wr_offset * 100;
ft_calib_cpu_to_le32s(calib_raw);
}
......@@ -206,7 +199,6 @@ int ft_calib_init(struct fmctdc_dev *ft)
ft->calib.wr_offset = wr_calibration_offset;
out:
ft->calib.wr_offset += wr_calibration_offset_carrier;
return 0;
}
......
......@@ -18,6 +18,7 @@ enum ft_spec_dev_offsets {
static const struct fmc_tdc_platform_data fmc_tdc_pdata = {
.flags = 0,
.wr_calibration_offset_carrier = 0,
};
static int ft_spec_probe(struct platform_device *pdev)
......
......@@ -21,6 +21,7 @@ enum ft_svec_dev_offsets {
static struct fmc_tdc_platform_data fmc_tdc_pdata = {
.flags = FMC_TDC_BIG_ENDIAN,
.wr_calibration_offset_carrier = 3000,
};
/* MFD devices */
......
......@@ -22,6 +22,7 @@
#include <linux/zio-trigger.h>
#include "fmc-tdc.h"
#include "platform_data/fmc-tdc.h"
#include "hw/channel_regs.h"
#include "hw/timestamp_fifo_regs.h"
#include "hw/tdc_onewire_regs.h"
......@@ -68,14 +69,17 @@ enum ft_devtype {
*/
static void ft_update_offsets(struct fmctdc_dev *ft, int channel)
{
struct fmc_tdc_platform_data *pdata = ft->pdev->dev.platform_data;
struct ft_channel_state *st = &ft->channels[channel];
struct ft_hw_timestamp hw_offset = {0, 0, 0, 0};
int32_t wr_offset = 0;
void *fifo_addr;
fifo_addr = ft->ft_fifo_base + TDC_FIFO_OFFSET * channel;
ft_ts_apply_offset(&hw_offset, ft->calib.zero_offset[channel]);
ft_ts_apply_offset(&hw_offset, -ft->calib.wr_offset);
wr_offset = ft->calib.wr_offset + pdata->wr_calibration_offset_carrier;
ft_ts_apply_offset(&hw_offset, -wr_offset);
if (st->user_offset)
ft_ts_apply_offset(&hw_offset, st->user_offset);
......
......@@ -11,6 +11,7 @@
struct fmc_tdc_platform_data {
unsigned long flags;
uint32_t wr_calibration_offset_carrier;
};
#endif
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