Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
F
FMC TDC 1ns 5cha - Software
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
FMC TDC 1ns 5cha - Software
Commits
efe24285
Commit
efe24285
authored
Apr 23, 2015
by
Federico Vaga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel: use zio enable to really enable/disable channels
Signed-off-by:
Federico Vaga
<
federico.vaga@cern.ch
>
parent
aa3a6e15
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
66 deletions
+55
-66
ft-core.c
kernel/ft-core.c
+13
-46
ft-zio.c
kernel/ft-zio.c
+42
-20
No files found.
kernel/ft-core.c
View file @
efe24285
...
...
@@ -50,14 +50,6 @@ static int ft_init_channel(struct fmctdc_dev *ft, int channel)
return
0
;
}
static
void
ft_reset_channel
(
struct
fmctdc_dev
*
ft
,
int
channel
)
{
struct
ft_channel_state
*
st
=
&
ft
->
channels
[
channel
-
FT_CH_1
];
st
->
cur_seq_id
=
0
;
st
->
expected_edge
=
1
;
zio_trigger_abort_disable
(
&
ft
->
zdev
->
cset
[
channel
-
FT_CH_1
],
0
);
}
int
ft_enable_termination
(
struct
fmctdc_dev
*
ft
,
int
channel
,
int
enable
)
{
...
...
@@ -86,51 +78,27 @@ int ft_enable_termination(struct fmctdc_dev *ft, int channel, int enable)
return
0
;
}
void
ft_enable_acquisition
(
struct
fmctdc_dev
*
ft
,
int
enable
)
{
uint32_t
ien
,
cmd
;
int
i
;
if
(
ft
->
acquisition_on
==
(
enable
?
1
:
0
))
return
;
uint32_t
ien
;
ien
=
ft_readl
(
ft
,
TDC_REG_INPUT_ENABLE
);
if
(
enable
)
{
ien
|=
TDC_INPUT_ENABLE_FLAG
;
cmd
=
TDC_CTRL_EN_ACQ
;
}
else
{
ien
&=
~
TDC_INPUT_ENABLE_FLAG
;
cmd
=
TDC_CTRL_DIS_ACQ
;
}
spin_lock
(
&
ft
->
lock
);
ft_writel
(
ft
,
ien
,
TDC_REG_INPUT_ENABLE
);
ft_writel
(
ft
,
TDC_CTRL_CLEAR_DACAPO_FLAG
,
TDC_REG_CTRL
);
ft_writel
(
ft
,
cmd
,
TDC_REG_CTRL
);
ft
->
acquisition_on
=
enable
;
if
(
!
enable
)
ft
->
prev_wr_ptr
=
ft
->
cur_wr_ptr
=
0
;
spin_unlock
(
&
ft
->
lock
);
if
(
!
enable
)
{
/* Disable all running acquisition and reset channels */
for
(
i
=
0
;
i
<
ft
->
zdev
->
n_cset
;
++
i
)
ft_reset_channel
(
ft
,
i
+
FT_CH_1
);
/* Enable TDC acquisition */
ft_writel
(
ft
,
ien
|
TDC_INPUT_ENABLE_CH_ALL
|
TDC_INPUT_ENABLE_FLAG
,
TDC_REG_INPUT_ENABLE
);
/* Enable ACAM acquisition */
ft_writel
(
ft
,
TDC_CTRL_EN_ACQ
,
TDC_REG_CTRL
);
}
else
{
for
(
i
=
0
;
i
<
ft
->
zdev
->
n_cset
;
++
i
)
zio_arm_trigger
(
ft
->
zdev
->
cset
[
i
].
ti
);
/* Disable ACAM acquisition */
ft_writel
(
ft
,
TDC_CTRL_DIS_ACQ
,
TDC_REG_CTRL
);
/* Disable TDC acquisition */
ft_writel
(
ft
,
ien
&
~
(
TDC_INPUT_ENABLE_CH_ALL
|
TDC_INPUT_ENABLE_FLAG
),
TDC_REG_INPUT_ENABLE
);
}
if
(
ft
->
verbose
)
dev_info
(
&
ft
->
fmc
->
dev
,
"acquisition is %s
\n
"
,
enable
?
"on"
:
"off"
);
}
static
int
ft_channels_init
(
struct
fmctdc_dev
*
ft
)
{
int
i
,
ret
;
...
...
@@ -280,8 +248,7 @@ int ft_probe(struct fmc_device *fmc)
if
(
ret
<
0
)
goto
err
;
ft_enable_acquisition
(
ft
,
0
);
ft_enable_acquisition
(
ft
,
1
);
ft
->
initialized
=
1
;
ft
->
sequence
=
0
;
...
...
kernel/ft-zio.c
View file @
efe24285
...
...
@@ -27,8 +27,8 @@
#include <linux/fmc.h>
#include "fmc-tdc.h"
#include "hw/tdc_regs.h"
#define _RW_ (S_IRUGO | S_IWUGO)
/* I want 80-col lines so this lazy thing */
/* The sample size. Mandatory, device-wide */
ZIO_ATTR_DEFINE_STD
(
ZIO_DEV
,
ft_zattr_dev_std
)
=
{
...
...
@@ -41,7 +41,6 @@ static struct zio_attribute ft_zattr_dev[] = {
ZIO_ATTR_EXT
(
"seconds"
,
ZIO_RW_PERM
,
FT_ATTR_DEV_SECONDS
,
0
),
ZIO_ATTR_EXT
(
"coarse"
,
ZIO_RW_PERM
,
FT_ATTR_DEV_COARSE
,
0
),
ZIO_ATTR_EXT
(
"command"
,
ZIO_WO_PERM
,
FT_ATTR_DEV_COMMAND
,
0
),
ZIO_ATTR_EXT
(
"enable_inputs"
,
ZIO_RW_PERM
,
FT_ATTR_DEV_ENABLE_INPUTS
,
0
),
ZIO_ATTR_EXT
(
"sequence"
,
ZIO_RW_PERM
,
FT_ATTR_DEV_SEQUENCE
,
0
),
ZIO_ATTR_EXT
(
"wr-offset"
,
ZIO_RO_PERM
,
FT_ATTR_TDC_WR_OFFSET
,
0
),
ZIO_PARAM_EXT
(
"temperature"
,
ZIO_RO_PERM
,
FT_ATTR_PARAM_TEMP
,
0
),
...
...
@@ -154,11 +153,6 @@ static int ft_zio_info_get(struct device *dev, struct zio_attribute *zattr,
FT_ATTR_DEV_COARSE
?
coarse
:
(
uint32_t
)
seconds
);
break
;
}
case
FT_ATTR_DEV_ENABLE_INPUTS
:
attr
[
FT_ATTR_DEV_ENABLE_INPUTS
].
value
=
ft
->
acquisition_on
?
1
:
0
;
*
usr_val
=
ft
->
acquisition_on
?
1
:
0
;
break
;
case
FT_ATTR_TDC_WR_OFFSET
:
*
usr_val
=
ft
->
calib
.
wr_offset
;
break
;
...
...
@@ -235,14 +229,10 @@ static int ft_zio_conf_set(struct device *dev, struct zio_attribute *zattr,
if
(
zattr
->
id
==
FT_ATTR_DEV_SECONDS
)
{
attr
[
FT_ATTR_DEV_SECONDS
].
value
=
usr_val
;
return
ft_set_tai_time
(
ft
,
attr
[
FT_ATTR_DEV_SECONDS
].
value
,
attr
[
FT_ATTR_DEV_COARSE
].
value
);
return
-
ENOTSUPP
;
}
else
if
(
zattr
->
id
==
FT_ATTR_DEV_ENABLE_INPUTS
)
{
attr
[
FT_ATTR_DEV_ENABLE_INPUTS
].
value
=
usr_val
?
1
:
0
;
ft_enable_acquisition
(
ft
,
usr_val
);
ft_set_tai_time
(
ft
,
attr
[
FT_ATTR_DEV_SECONDS
].
value
,
attr
[
FT_ATTR_DEV_COARSE
].
value
);
return
0
;
}
/* Not command, nothing to do */
...
...
@@ -295,21 +285,52 @@ static const struct zio_sysfs_operations ft_zio_sysfs_ops = {
static
void
ft_change_flags
(
struct
zio_obj_head
*
head
,
unsigned
long
mask
)
{
struct
zio_channel
*
chan
;
struct
ft_channel_state
*
st
;
struct
fmctdc_dev
*
ft
;
u
nsigned
int
offset
;
u
int32_t
ien
;
/* We manage only status flag */
if
(
!
(
mask
&
ZIO_STATUS
))
return
;
ft
=
zdev
->
priv_d
;
chan
=
to_zio_chan
(
&
head
->
dev
);
offset
=
(
chan
->
flags
&
ZIO_STATUS
?
TDC_REG_EIC_IDR
:
TDC_REG_EIC_IER
);
fmc_writel
(
ft
->
fmc
,
1
<<
cset
->
index
,
ft
->
ft_irq_base
+
offset
);
ft
=
chan
->
cset
->
zdev
->
priv_d
;
st
=
&
ft
->
channels
[
chan
->
cset
->
index
];
dev_dbg
(
&
chan
->
head
.
dev
,
"change status flag to %d
\n
"
,
!!
(
chan
->
flags
&
ZIO_STATUS
));
ien
=
ft_readl
(
ft
,
TDC_REG_INPUT_ENABLE
);
if
(
chan
->
flags
&
ZIO_STATUS
)
{
/* DISABLED */
fmc_writel
(
ft
->
fmc
,
1
<<
chan
->
cset
->
index
,
ft
->
ft_irq_base
+
TDC_REG_EIC_IDR
);
st
->
cur_seq_id
=
0
;
st
->
expected_edge
=
1
;
zio_trigger_abort_disable
(
chan
->
cset
,
0
);
/* Reset last time-stamp (seq number and valid)*/
//ft_writel(ft, TDC_FIFO_LAST_CSR_VALID | TDC_FIFO_LAST_CSR_RST_SEQ,
// TDC_FIFO_LAST_CSR);
}
else
{
/* ENABLED */
fmc_writel
(
ft
->
fmc
,
1
<<
chan
->
cset
->
index
,
ft
->
ft_irq_base
+
TDC_REG_EIC_IER
);
zio_arm_trigger
(
chan
->
cset
->
ti
);
}
/*
* NOTE: above we have a little HACK. According to ZIO v1.1, ZIO invokes
* this function in a spin-lock context. The TDC assigns this function to
* the channel, so ZIO will take the channel lock. Then on arm() and
* abort() ZIO takes the cset flag. So this will not fail, but bear in
* mind that if you do this when it is assigned to a cset it wont work
*/
dev_dbg
(
&
chan
->
head
.
dev
,
"trigger status 0x%lx
\n
"
,
chan
->
cset
->
ti
->
flags
);
}
static
struct
zio_channel
ft_chan_tmpl
=
{
.
change_flags
=
ft_change_flags
,
.
flags
=
ZIO_DISABLED
,
};
#define DECLARE_CHANNEL(ch_name) \
...
...
@@ -319,7 +340,8 @@ static struct zio_channel ft_chan_tmpl = {
.chan_template = &ft_chan_tmpl,\
.n_chan = 1,\
.ssize = 4,
/* FIXME: 0? */
\
.flags = ZIO_DIR_INPUT | ZIO_CSET_TYPE_TIME | \
.flags = ZIO_DISABLED | \
ZIO_DIR_INPUT | ZIO_CSET_TYPE_TIME | \
ZIO_CSET_SELF_TIMED, \
.zattr_set = {\
.ext_zattr = ft_zattr_input,\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment