clock: add clock_required_modes to obtain the required time stamping mode

Separate required_modes setting from clock_create so we can obtain the
required time stamping flags from other place.

Add enum timestamping in struct clock to store the time stamping mode.

Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
master
Hangbin Liu 2017-10-09 22:31:45 +08:00 committed by Richard Cochran
parent b65b1d5f3b
commit 1440f09384
2 changed files with 39 additions and 18 deletions

49
clock.c
View File

@ -105,6 +105,7 @@ struct clock {
int time_flags; /* grand master role */ int time_flags; /* grand master role */
int time_source; /* grand master role */ int time_source; /* grand master role */
enum servo_state servo_state; enum servo_state servo_state;
enum timestamp_type timestamping;
tmv_t master_offset; tmv_t master_offset;
tmv_t path_delay; tmv_t path_delay;
tmv_t ingress_ts; tmv_t ingress_ts;
@ -803,6 +804,34 @@ static void clock_remove_port(struct clock *c, struct port *p)
port_close(p); port_close(p);
} }
int clock_required_modes(struct clock *c)
{
int required_modes = 0;
switch (c->timestamping) {
case TS_SOFTWARE:
required_modes |= SOF_TIMESTAMPING_TX_SOFTWARE |
SOF_TIMESTAMPING_RX_SOFTWARE |
SOF_TIMESTAMPING_SOFTWARE;
break;
case TS_LEGACY_HW:
required_modes |= SOF_TIMESTAMPING_TX_HARDWARE |
SOF_TIMESTAMPING_RX_HARDWARE |
SOF_TIMESTAMPING_SYS_HARDWARE;
break;
case TS_HARDWARE:
case TS_ONESTEP:
required_modes |= SOF_TIMESTAMPING_TX_HARDWARE |
SOF_TIMESTAMPING_RX_HARDWARE |
SOF_TIMESTAMPING_RAW_HARDWARE;
break;
default:
break;
}
return required_modes;
}
struct clock *clock_create(enum clock_type type, struct config *config, struct clock *clock_create(enum clock_type type, struct config *config,
const char *phc_device) const char *phc_device)
{ {
@ -911,24 +940,8 @@ struct clock *clock_create(enum clock_type type, struct config *config,
} }
/* Check the time stamping mode on each interface. */ /* Check the time stamping mode on each interface. */
switch (timestamping) { c->timestamping = timestamping;
case TS_SOFTWARE: required_modes = clock_required_modes(c);
required_modes |= SOF_TIMESTAMPING_TX_SOFTWARE |
SOF_TIMESTAMPING_RX_SOFTWARE |
SOF_TIMESTAMPING_SOFTWARE;
break;
case TS_LEGACY_HW:
required_modes |= SOF_TIMESTAMPING_TX_HARDWARE |
SOF_TIMESTAMPING_RX_HARDWARE |
SOF_TIMESTAMPING_SYS_HARDWARE;
break;
case TS_HARDWARE:
case TS_ONESTEP:
required_modes |= SOF_TIMESTAMPING_TX_HARDWARE |
SOF_TIMESTAMPING_RX_HARDWARE |
SOF_TIMESTAMPING_RAW_HARDWARE;
break;
}
STAILQ_FOREACH(iface, &config->interfaces, list) { STAILQ_FOREACH(iface, &config->interfaces, list) {
if (iface->ts_info.valid && if (iface->ts_info.valid &&
((iface->ts_info.so_timestamping & required_modes) != required_modes)) { ((iface->ts_info.so_timestamping & required_modes) != required_modes)) {

View File

@ -72,6 +72,14 @@ UInteger8 clock_class(struct clock *c);
*/ */
struct config *clock_config(struct clock *c); struct config *clock_config(struct clock *c);
/**
* Obtains the required time stamping mode.
* @param c The clock instance.
* @return The value of required time stamping mode, which is a bit mask
* of SOF_TIMESTAMPING_ flags.
*/
int clock_required_modes(struct clock *c);
/** /**
* Create a clock instance. There can only be one clock in any system, * Create a clock instance. There can only be one clock in any system,
* so subsequent calls will destroy the previous clock instance. * so subsequent calls will destroy the previous clock instance.