Commit 2e2b7b59 authored by Tomasz Wlostowski's avatar Tomasz Wlostowski

kernel: initial support for White Rabbit

parent ebf39881
......@@ -82,10 +82,7 @@ struct fmctdc_dev;
struct ft_carrier_specific {
char *gateware_name;
int (*init) (struct fmctdc_dev *);
int (*reset_core) (struct fmctdc_dev *);
void (*exit) (struct fmctdc_dev *);
};
struct ft_calibration { /* All of these are big endian in the EEPROM */
......@@ -165,7 +162,7 @@ struct fmctdc_dev {
/* output lots of debug stuff? */
int verbose;
struct ft_channel_state channels[FT_NUM_CHANNELS];
int flags;
int wr_mode;
/* hardware buffer pointers / dacapo regs */
uint32_t cur_wr_ptr, prev_wr_ptr;
};
......@@ -204,8 +201,8 @@ int ft_get_tai_time(struct fmctdc_dev *ft, uint64_t * seconds,
uint32_t * coarse);
int ft_set_host_time(struct fmctdc_dev *ft);
int ft_enable_wr_mode(struct fmctdc_dev *ft, int enable);
int ft_check_wr_mode(struct fmctdc_dev *ft);
int ft_wr_mode(struct fmctdc_dev *ft, int on);
int ft_wr_query(struct fmctdc_dev *ft);
int ft_handle_eeprom_calibration(struct fmctdc_dev *ft);
......@@ -222,6 +219,8 @@ void ft_zio_unregister(void);
int ft_zio_init(struct fmctdc_dev *ft);
void ft_zio_exit(struct fmctdc_dev *ft);
void ft_set_vcxo_tune (struct fmctdc_dev *ft, int value);
struct zio_channel;
int ft_read_sw_fifo(struct fmctdc_dev *ft, int channel,
......
......@@ -124,22 +124,54 @@ int ft_set_host_time(struct fmctdc_dev *ft)
return 0;
}
int ft_enable_wr_mode(struct fmctdc_dev *ft, int enable)
void ft_set_vcxo_tune (struct fmctdc_dev *ft, int value)
{
return -ENOTSUPP;
ft_writel(ft, value, TDC_REG_DAC_TUNE);
ft_writel(ft, TDC_CTRL_CONFIG_DAC, TDC_REG_CTRL);
}
int ft_check_wr_mode(struct fmctdc_dev *ft)
int ft_wr_mode(struct fmctdc_dev *ft, int on)
{
return -ENOTSUPP;
unsigned long flags;
uint32_t wr_stat;
spin_lock_irqsave(&ft->lock, flags);
if (on) {
ft_writel(ft, TDC_WR_CTRL_ENABLE, TDC_REG_WR_CTRL);
ft->wr_mode = 1;
} else {
ft_writel(ft, 0, TDC_REG_WR_CTRL);
ft->wr_mode = 0;
ft_set_vcxo_tune (ft, ft->calib.vcxo_default_tune & 0xffff);
}
spin_unlock_irqrestore(&ft->lock, flags);
wr_stat = ft_readl(ft, TDC_REG_WR_STAT);
if( ! (wr_stat & TDC_WR_STAT_LINK))
return -ENOLINK;
return 0;
}
int ft_wr_query(struct fmctdc_dev *ft)
{
uint32_t wr_stat;
wr_stat = ft_readl(ft, TDC_REG_WR_STAT);
if (!ft->wr_mode)
return -ENODEV;
if (! (wr_stat & TDC_WR_STAT_LINK))
return -ENOLINK;
if (wr_stat & TDC_WR_STAT_AUX_LOCKED)
return 0;
return -EAGAIN;
}
int ft_time_init(struct fmctdc_dev *ft)
{
/* program the VCXO DAC to the default calibration value */
ft_writel(ft, ft->calib.vcxo_default_tune, TDC_REG_DAC_TUNE);
ft_writel(ft, TDC_CTRL_CONFIG_DAC, TDC_REG_CTRL);
ft_set_vcxo_tune(ft, ft->calib.vcxo_default_tune);
return ft_set_tai_time(ft, 0, 0);
}
......
......@@ -62,9 +62,6 @@ enum ft_devtype {
FT_TYPE_INPUT
};
static int ft_wr_mode(struct fmctdc_dev *fd, int on);
static int ft_wr_query(struct fmctdc_dev *ft);
static enum ft_devtype __ft_get_type(struct device *dev)
{
struct zio_obj_head *head = to_zio_head(dev);
......@@ -269,51 +266,6 @@ static int ft_zio_conf_set(struct device *dev, struct zio_attribute *zattr,
}
}
static int ft_wr_mode(struct fmctdc_dev *fd, int on)
{
#if 0
unsigned long flags;
uint32_t tcr;
spin_lock_irqsave(&ft->lock, flags);
// tcr = fd_readl(fd, FD_REG_TCR);
if (on) {
fd_writel(fd, FD_TCR_WR_ENABLE, FD_REG_TCR);
set_bit(FD_FLAG_WR_MODE, &fd->flags);
} else {
fd_writel(fd, 0, FD_REG_TCR);
clear_bit(FD_FLAG_WR_MODE, &fd->flags);
/* not white-rabbit: write default to DAC for VCXO */
fd_spi_xfer(fd, FD_CS_DAC, 24,
ft->calib.vcxo_default_tune & 0xffff, NULL);
}
spin_unlock_irqrestore(&fd->lock, flags);
if(! (tcr & FD_TCR_WR_PRESENT))
return -EOPNOTSUPP;
else if( ! (tcr & FD_TCR_WR_LINK))
return -ENOLINK;
else
return 0;
#endif
return 0;
}
static int ft_wr_query(struct fmctdc_dev *ft)
{
#if 0
int ena = test_bit(FD_FLAG_WR_MODE, &fd->flags);
if (!ena)
return -ENODEV;
if (! (fd_readl(fd, FD_REG_TCR) & FD_TCR_WR_LINK))
return -ENOLINK;
if (fd_readl(fd, FD_REG_TCR) & FD_TCR_WR_LOCKED)
return 0;
return -EAGAIN;
#endif
return 0;
}
/*
......
......@@ -25,6 +25,15 @@
#define TDC_REG_CURRENT_UTC 0x00a0
#define TDC_REG_BUFFER_PTR 0x00a8
#define TDC_REG_CTRL 0x00fc
#define TDC_REG_WR_CTRL 0x00b4
#define TDC_REG_WR_STAT 0x00b0
#define TDC_WR_CTRL_ENABLE BIT(0)
#define TDC_WR_STAT_ENABLED BIT(6)
#define TDC_WR_STAT_LINK BIT(2)
#define TDC_WR_STAT_TIME_VALID BIT(8)
#define TDC_WR_STAT_AUX_LOCKED BIT(4)
/* TDC_REG_CTRL bits */
#define TDC_CTRL_EN_ACQ BIT(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