diff options
Diffstat (limited to 'drivers/clocksource/timer-sun5i.c')
-rw-r--r-- | drivers/clocksource/timer-sun5i.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c index c184eb84101e..4f87f3e76d83 100644 --- a/drivers/clocksource/timer-sun5i.c +++ b/drivers/clocksource/timer-sun5i.c | |||
@@ -152,6 +152,13 @@ static irqreturn_t sun5i_timer_interrupt(int irq, void *dev_id) | |||
152 | return IRQ_HANDLED; | 152 | return IRQ_HANDLED; |
153 | } | 153 | } |
154 | 154 | ||
155 | static cycle_t sun5i_clksrc_read(struct clocksource *clksrc) | ||
156 | { | ||
157 | struct sun5i_timer_clksrc *cs = to_sun5i_timer_clksrc(clksrc); | ||
158 | |||
159 | return ~readl(cs->timer.base + TIMER_CNTVAL_LO_REG(1)); | ||
160 | } | ||
161 | |||
155 | static int sun5i_rate_cb_clksrc(struct notifier_block *nb, | 162 | static int sun5i_rate_cb_clksrc(struct notifier_block *nb, |
156 | unsigned long event, void *data) | 163 | unsigned long event, void *data) |
157 | { | 164 | { |
@@ -210,8 +217,13 @@ static int __init sun5i_setup_clocksource(struct device_node *node, | |||
210 | writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD, | 217 | writel(TIMER_CTL_ENABLE | TIMER_CTL_RELOAD, |
211 | base + TIMER_CTL_REG(1)); | 218 | base + TIMER_CTL_REG(1)); |
212 | 219 | ||
213 | ret = clocksource_mmio_init(base + TIMER_CNTVAL_LO_REG(1), node->name, | 220 | cs->clksrc.name = node->name; |
214 | rate, 340, 32, clocksource_mmio_readl_down); | 221 | cs->clksrc.rating = 340; |
222 | cs->clksrc.read = sun5i_clksrc_read; | ||
223 | cs->clksrc.mask = CLOCKSOURCE_MASK(32); | ||
224 | cs->clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS; | ||
225 | |||
226 | ret = clocksource_register_hz(&cs->clksrc, rate); | ||
215 | if (ret) { | 227 | if (ret) { |
216 | pr_err("Couldn't register clock source.\n"); | 228 | pr_err("Couldn't register clock source.\n"); |
217 | goto err_remove_notifier; | 229 | goto err_remove_notifier; |