2 * Generic MMIO clocksource support
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 #include <linux/clocksource.h>
9 #include <linux/errno.h>
10 #include <linux/init.h>
11 #include <linux/slab.h>
13 struct clocksource_mmio
{
15 struct clocksource clksrc
;
18 static inline struct clocksource_mmio
*to_mmio_clksrc(struct clocksource
*c
)
20 return container_of(c
, struct clocksource_mmio
, clksrc
);
23 cycle_t
clocksource_mmio_readl_up(struct clocksource
*c
)
25 return (cycle_t
)readl_relaxed(to_mmio_clksrc(c
)->reg
);
28 cycle_t
clocksource_mmio_readl_down(struct clocksource
*c
)
30 return ~(cycle_t
)readl_relaxed(to_mmio_clksrc(c
)->reg
) & c
->mask
;
33 cycle_t
clocksource_mmio_readw_up(struct clocksource
*c
)
35 return (cycle_t
)readw_relaxed(to_mmio_clksrc(c
)->reg
);
38 cycle_t
clocksource_mmio_readw_down(struct clocksource
*c
)
40 return ~(cycle_t
)readw_relaxed(to_mmio_clksrc(c
)->reg
) & c
->mask
;
44 * clocksource_mmio_init - Initialize a simple mmio based clocksource
45 * @base: Virtual address of the clock readout register
46 * @name: Name of the clocksource
47 * @hz: Frequency of the clocksource in Hz
48 * @rating: Rating of the clocksource
49 * @bits: Number of valid bits
50 * @read: One of clocksource_mmio_read*() above
52 int __init
clocksource_mmio_init(void __iomem
*base
, const char *name
,
53 unsigned long hz
, int rating
, unsigned bits
,
54 cycle_t (*read
)(struct clocksource
*))
56 struct clocksource_mmio
*cs
;
58 if (bits
> 32 || bits
< 16)
61 cs
= kzalloc(sizeof(struct clocksource_mmio
), GFP_KERNEL
);
66 cs
->clksrc
.name
= name
;
67 cs
->clksrc
.rating
= rating
;
68 cs
->clksrc
.read
= read
;
69 cs
->clksrc
.mask
= CLOCKSOURCE_MASK(bits
);
70 cs
->clksrc
.flags
= CLOCK_SOURCE_IS_CONTINUOUS
;
72 return clocksource_register_hz(&cs
->clksrc
, hz
);