struct clock_base {
freq_khz_t freq_khz;
uint64_t clock_mult;
};
struct clock {
uint64_t (*read)(struct clock *);
char *name;
uint64_t mult;
fx32_32_t uncertainty_margin;
freq_khz_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);
void clock_unregister(struct clock *c);
void clock_suspend_all(void);
void clock_resume_all(void);
void clocks_init(void);
uint64_t clock_frequency_to_mult(struct clock *clock);
time_ns_t clock_cycles_to_ns(struct clock *clock, uint64_t cycles);