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

drv: move sw trigger from ZIO to debugfs

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent e3d91fe0
......@@ -54,6 +54,34 @@ int32_t fa_temperature_read(struct fa_dev *fa)
return (raw_temp * 1000 + 8) / 16;
}
/**
* Do a software trigger
* @fa: the adc descriptor
*
* Return: 0 on success, otherwise a negative error number
*/
int fa_trigger_software(struct fa_dev *fa)
{
struct zio_ti *ti = fa->zdev->cset->ti;
/* Fire if software trigger is enabled (index 5) */
if (!(ti->zattr_set.ext_zattr[FA100M14B4C_TATTR_SRC].value &
FA100M14B4C_TRG_SRC_SW)) {
dev_info(&fa->pdev->dev, "sw trigger is not enabled\n");
return -EPERM;
}
/* Fire if nsamples!=0 */
if (!ti->nsamples) {
dev_info(&fa->pdev->dev, "pre + post = 0: cannot acquire\n");
return -EINVAL;
}
fa_writel(fa, fa->fa_adc_csr_base, &zfad_regs[ZFAT_SW], 1);
return 0;
}
/**
* Description:
* The version from the Linux kernel automatically squash contiguous pages.
......
......@@ -163,6 +163,24 @@ static const struct file_operations fa_regdump_ops = {
};
static ssize_t fa_trg_sw_write(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
struct fa_dev *fa = file->private_data;
int err;
err = fa_trigger_software(fa);
return err ? err : count;
}
static const struct file_operations fa_trg_sw_ops = {
.owner = THIS_MODULE,
.open = simple_open,
.write = fa_trg_sw_write,
};
int fa_debug_init(struct fa_dev *fa)
{
int err;
......@@ -196,6 +214,14 @@ int fa_debug_init(struct fa_dev *fa)
"Cannot create regdump debugfs file\n");
}
fa->dbg_trg_sw = debugfs_create_file("trigger_software", 0200,
fa->dbg_dir, fa,
&fa_trg_sw_ops);
if (IS_ERR_OR_NULL(fa->dbg_trg_sw)) {
dev_warn(&fa->pdev->dev,
"Cannot create software trigger file\n");
}
return 0;
}
......
......@@ -474,6 +474,7 @@ static inline int zfat_overflow_detection(struct zio_ti *ti)
static int zfad_input_cset_software(struct fa_dev *fa, struct zio_cset *cset)
{
struct zfad_block *tmp;
int err;
tmp = kzalloc(sizeof(struct zfad_block), GFP_ATOMIC);
if (!tmp)
......@@ -489,7 +490,9 @@ static int zfad_input_cset_software(struct fa_dev *fa, struct zio_cset *cset)
fa->n_shots = 1;
/* Fire software trigger */
fa_writel(fa, fa->fa_adc_csr_base, &zfad_regs[ZFAT_SW], 1);
err = fa_trigger_software(fa);
if (err)
return err;
return -EAGAIN;
}
......
......@@ -98,10 +98,6 @@ static struct zio_attribute zfat_ext_zattr[] = {
[FA100M14B4C_TATTR_EXT_DLY] = ZIO_ATTR_EXT("ext-delay", ZIO_RW_PERM,
ZFAT_EXT_DLY, 0),
/* Software Trigger */
[FA100M14B4C_TATTR_SW_FIRE] = ZIO_PARAM_EXT("sw-trg-fire", ZIO_WO_PERM,
ZFAT_SW, 0),
/* last trigger time stamp */
[FA100M14B4C_TATTR_TRG_SU] = ZIO_PARAM_EXT("tstamp-trg-lst-su",
ZIO_RO_PERM,
......@@ -133,7 +129,6 @@ static int zfat_conf_set(struct device *dev, struct zio_attribute *zattr,
uint32_t usr_val)
{
struct fa_dev *fa = get_zfadc(dev);
struct zio_ti *ti = to_zio_ti(dev);
void *baseoff = fa->fa_adc_csr_base;
uint32_t tmp_val = usr_val;
......@@ -155,24 +150,6 @@ static int zfat_conf_set(struct device *dev, struct zio_attribute *zattr,
}
tmp_val--; /* Remove one sample for the trigger */
break;
case ZFAT_SW:
/* Fire if software trigger is enabled (index 5) */
if (!(ti->zattr_set.ext_zattr[FA100M14B4C_TATTR_SRC].value &
FA100M14B4C_TRG_SRC_SW)) {
dev_info(fa->msgdev, "sw trigger is not enabled\n");
return -EPERM;
}
/* Fire if nsamples!=0 */
if (!ti->nsamples) {
dev_info(fa->msgdev, "pre + post = 0: cannot acquire\n");
return -EINVAL;
}
/*
* The software trigger will be fired to force
* acquisition, so we don't care about current
* acquisition or other problems:
*/
break;
case ZFAT_CFG_SRC:
/*
* Do not copy to hardware when globally disabled
......
......@@ -72,7 +72,6 @@ enum fa100m14b4c_trg_ext_attr {
FA100M14B4C_TATTR_TRG_TIM_C,
#ifdef __KERNEL__
FA100M14B4C_TATTR_SW_FIRE,
FA100M14B4C_TATTR_TRG_SU,
FA100M14B4C_TATTR_TRG_SL,
FA100M14B4C_TATTR_TRG_C,
......@@ -462,6 +461,7 @@ struct fa_dev {
struct debugfs_regset32 dbg_reg32;
struct dentry *dbg_reg;
struct dentry *dbg_reg_spi;
struct dentry *dbg_trg_sw;
/* Operations */
int (*sg_alloc_table_from_pages)(struct sg_table *sgt,
......@@ -606,6 +606,7 @@ extern int zfad_fsm_command(struct fa_dev *fa, uint32_t command);
extern void zfad_reset_offset(struct fa_dev *fa);
extern int zfad_convert_hw_range(uint32_t bitmask);
extern int32_t fa_temperature_read(struct fa_dev *fa);
extern int fa_trigger_software(struct fa_dev *fa);
/* Temporarily, user values are the same as hardware values */
extern int zfad_convert_user_range(uint32_t user_val);
......
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