0001
0002 #include <linux/kernel.h>
0003 #include <linux/init.h>
0004 #include <linux/clocksource.h>
0005 #include <linux/clockchips.h>
0006 #include <linux/sched_clock.h>
0007 #include <linux/interrupt.h>
0008 #include <linux/irq.h>
0009 #include <linux/io.h>
0010 #include <asm/mach/time.h>
0011 #include "soc.h"
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #define EP93XX_TIMER_REG(x) (EP93XX_TIMER_BASE + (x))
0032 #define EP93XX_TIMER1_LOAD EP93XX_TIMER_REG(0x00)
0033 #define EP93XX_TIMER1_VALUE EP93XX_TIMER_REG(0x04)
0034 #define EP93XX_TIMER1_CONTROL EP93XX_TIMER_REG(0x08)
0035 #define EP93XX_TIMER123_CONTROL_ENABLE (1 << 7)
0036 #define EP93XX_TIMER123_CONTROL_MODE (1 << 6)
0037 #define EP93XX_TIMER123_CONTROL_CLKSEL (1 << 3)
0038 #define EP93XX_TIMER1_CLEAR EP93XX_TIMER_REG(0x0c)
0039 #define EP93XX_TIMER2_LOAD EP93XX_TIMER_REG(0x20)
0040 #define EP93XX_TIMER2_VALUE EP93XX_TIMER_REG(0x24)
0041 #define EP93XX_TIMER2_CONTROL EP93XX_TIMER_REG(0x28)
0042 #define EP93XX_TIMER2_CLEAR EP93XX_TIMER_REG(0x2c)
0043 #define EP93XX_TIMER4_VALUE_LOW EP93XX_TIMER_REG(0x60)
0044 #define EP93XX_TIMER4_VALUE_HIGH EP93XX_TIMER_REG(0x64)
0045 #define EP93XX_TIMER4_VALUE_HIGH_ENABLE (1 << 8)
0046 #define EP93XX_TIMER3_LOAD EP93XX_TIMER_REG(0x80)
0047 #define EP93XX_TIMER3_VALUE EP93XX_TIMER_REG(0x84)
0048 #define EP93XX_TIMER3_CONTROL EP93XX_TIMER_REG(0x88)
0049 #define EP93XX_TIMER3_CLEAR EP93XX_TIMER_REG(0x8c)
0050
0051 #define EP93XX_TIMER123_RATE 508469
0052 #define EP93XX_TIMER4_RATE 983040
0053
0054 static u64 notrace ep93xx_read_sched_clock(void)
0055 {
0056 u64 ret;
0057
0058 ret = readl(EP93XX_TIMER4_VALUE_LOW);
0059 ret |= ((u64) (readl(EP93XX_TIMER4_VALUE_HIGH) & 0xff) << 32);
0060 return ret;
0061 }
0062
0063 u64 ep93xx_clocksource_read(struct clocksource *c)
0064 {
0065 u64 ret;
0066
0067 ret = readl(EP93XX_TIMER4_VALUE_LOW);
0068 ret |= ((u64) (readl(EP93XX_TIMER4_VALUE_HIGH) & 0xff) << 32);
0069 return (u64) ret;
0070 }
0071
0072 static int ep93xx_clkevt_set_next_event(unsigned long next,
0073 struct clock_event_device *evt)
0074 {
0075
0076 u32 tmode = EP93XX_TIMER123_CONTROL_MODE |
0077 EP93XX_TIMER123_CONTROL_CLKSEL;
0078
0079
0080 writel(tmode, EP93XX_TIMER3_CONTROL);
0081
0082
0083 writel(next, EP93XX_TIMER3_LOAD);
0084 writel(tmode | EP93XX_TIMER123_CONTROL_ENABLE,
0085 EP93XX_TIMER3_CONTROL);
0086 return 0;
0087 }
0088
0089
0090 static int ep93xx_clkevt_shutdown(struct clock_event_device *evt)
0091 {
0092
0093 writel(0, EP93XX_TIMER3_CONTROL);
0094
0095 return 0;
0096 }
0097
0098 static struct clock_event_device ep93xx_clockevent = {
0099 .name = "timer1",
0100 .features = CLOCK_EVT_FEAT_ONESHOT,
0101 .set_state_shutdown = ep93xx_clkevt_shutdown,
0102 .set_state_oneshot = ep93xx_clkevt_shutdown,
0103 .tick_resume = ep93xx_clkevt_shutdown,
0104 .set_next_event = ep93xx_clkevt_set_next_event,
0105 .rating = 300,
0106 };
0107
0108 static irqreturn_t ep93xx_timer_interrupt(int irq, void *dev_id)
0109 {
0110 struct clock_event_device *evt = dev_id;
0111
0112
0113 writel(1, EP93XX_TIMER3_CLEAR);
0114
0115 evt->event_handler(evt);
0116
0117 return IRQ_HANDLED;
0118 }
0119
0120 void __init ep93xx_timer_init(void)
0121 {
0122 int irq = IRQ_EP93XX_TIMER3;
0123 unsigned long flags = IRQF_TIMER | IRQF_IRQPOLL;
0124
0125
0126 writel(EP93XX_TIMER4_VALUE_HIGH_ENABLE,
0127 EP93XX_TIMER4_VALUE_HIGH);
0128 clocksource_mmio_init(NULL, "timer4",
0129 EP93XX_TIMER4_RATE, 200, 40,
0130 ep93xx_clocksource_read);
0131 sched_clock_register(ep93xx_read_sched_clock, 40,
0132 EP93XX_TIMER4_RATE);
0133
0134
0135 if (request_irq(irq, ep93xx_timer_interrupt, flags, "ep93xx timer",
0136 &ep93xx_clockevent))
0137 pr_err("Failed to request irq %d (ep93xx timer)\n", irq);
0138 clockevents_config_and_register(&ep93xx_clockevent,
0139 EP93XX_TIMER123_RATE,
0140 1,
0141 0xffffffffU);
0142 }