#include <linux/clocksource.h>
struct clocksource_mmio {
struct clocksource clksrc;
static inline struct clocksource_mmio *to_mmio_clksrc(struct clocksource *c)
return container_of(c, struct clocksource_mmio, clksrc);
u64 clocksource_mmio_readl_up(struct clocksource *c)
return (u64)readl_relaxed(to_mmio_clksrc(c)->reg);
u64 clocksource_mmio_readl_down(struct clocksource *c)
return ~(u64)readl_relaxed(to_mmio_clksrc(c)->reg) & c->mask;
u64 clocksource_mmio_readw_up(struct clocksource *c)
return (u64)readw_relaxed(to_mmio_clksrc(c)->reg);
u64 clocksource_mmio_readw_down(struct clocksource *c)
return ~(u64)readw_relaxed(to_mmio_clksrc(c)->reg) & c->mask;
int __init clocksource_mmio_init(void __iomem *base, const char *name,
unsigned long hz, int rating, unsigned bits,
u64 (*read)(struct clocksource *))
struct clocksource_mmio *cs;
if (bits > 64 || bits < 16)
cs = kzalloc(sizeof(struct clocksource_mmio), GFP_KERNEL);