struct clock_base {
size_t freq_khz;
fx32_32_t clock_mult;
};
struct clock {
uint64_t (*read)(struct clock *);
char *name;
fx32_32_t mult;
fx32_32_t uncertainty_margin;
size_t frequency_khz;
struct list_head list_internal;
enum clock_state state;
enum clock_flags flags;
enum clock_rating rating;
struct clock_base *base;
enum errno (*enable)(struct clock *);
void (*disable)(struct clock *);
void (*suspend)(struct clock *);
void (*resume)(struct clock *);
void *private;
};
enum clock_rating {
CLOCK_RATING_UNSUITABLE,
CLOCK_RATING_BASE,
CLOCK_RATING_GOOD,
CLOCK_RATING_BETTER,
CLOCK_RATING_BEST,
CLOCK_RATING_MAX,
};
enum clock_flags {
CLOCK_FLAG_NONE = 0,
CLOCK_FLAG_WATCHDOG = 1,
CLOCK_FLAG_HRES = 1 << 1,
CLOCK_FLAG_UNSTABLE = 1 << 2,
CLOCK_FLAG_TIMESTAMP_SOURCE = 1 << 3,
};
enum clock_state {
CLOCK_STATE_OFF,
CLOCK_STATE_ON,
};
struct clock * clock_create(const char *fmt);
void clock_register(struct clock *c);
fx32_32_t clock_frequency_to_mult(struct clock *clock);
time_t clock_cycles_to_ns(struct clock *clock, uint64_t cycles);