Lines Matching refs:p
54 static unsigned long timer8_get_counter(struct timer8_priv *p) in timer8_get_counter() argument
59 o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20; in timer8_get_counter()
64 v1 = ctrl_inw(p->mapbase + _8TCNT); in timer8_get_counter()
65 v2 = ctrl_inw(p->mapbase + _8TCNT); in timer8_get_counter()
66 v3 = ctrl_inw(p->mapbase + _8TCNT); in timer8_get_counter()
67 o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20; in timer8_get_counter()
77 struct timer8_priv *p = dev_id; in timer8_interrupt() local
79 ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x40, in timer8_interrupt()
80 p->mapbase + _8TCSR); in timer8_interrupt()
81 p->flags |= FLAG_IRQCONTEXT; in timer8_interrupt()
82 ctrl_outw(p->tcora, p->mapbase + TCORA); in timer8_interrupt()
83 if (!(p->flags & FLAG_SKIPEVENT)) { in timer8_interrupt()
84 if (clockevent_state_oneshot(&p->ced)) in timer8_interrupt()
85 ctrl_outw(0x0000, p->mapbase + _8TCR); in timer8_interrupt()
86 p->ced.event_handler(&p->ced); in timer8_interrupt()
88 p->flags &= ~(FLAG_SKIPEVENT | FLAG_IRQCONTEXT); in timer8_interrupt()
93 static void timer8_set_next(struct timer8_priv *p, unsigned long delta) in timer8_set_next() argument
98 raw_spin_lock_irqsave(&p->lock, flags); in timer8_set_next()
100 dev_warn(&p->pdev->dev, "delta out of range\n"); in timer8_set_next()
101 now = timer8_get_counter(p); in timer8_set_next()
102 p->tcora = delta; in timer8_set_next()
103 ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR); in timer8_set_next()
105 ctrl_outw(delta, p->mapbase + TCORA); in timer8_set_next()
107 ctrl_outw(now + 1, p->mapbase + TCORA); in timer8_set_next()
109 raw_spin_unlock_irqrestore(&p->lock, flags); in timer8_set_next()
112 static int timer8_enable(struct timer8_priv *p) in timer8_enable() argument
114 p->rate = clk_get_rate(p->pclk) / 64; in timer8_enable()
115 ctrl_outw(0xffff, p->mapbase + TCORA); in timer8_enable()
116 ctrl_outw(0x0000, p->mapbase + _8TCNT); in timer8_enable()
117 ctrl_outw(0x0c02, p->mapbase + _8TCR); in timer8_enable()
122 static int timer8_start(struct timer8_priv *p) in timer8_start() argument
127 raw_spin_lock_irqsave(&p->lock, flags); in timer8_start()
129 if (!(p->flags & FLAG_STARTED)) in timer8_start()
130 ret = timer8_enable(p); in timer8_start()
134 p->flags |= FLAG_STARTED; in timer8_start()
137 raw_spin_unlock_irqrestore(&p->lock, flags); in timer8_start()
142 static void timer8_stop(struct timer8_priv *p) in timer8_stop() argument
146 raw_spin_lock_irqsave(&p->lock, flags); in timer8_stop()
148 ctrl_outw(0x0000, p->mapbase + _8TCR); in timer8_stop()
150 raw_spin_unlock_irqrestore(&p->lock, flags); in timer8_stop()
158 static void timer8_clock_event_start(struct timer8_priv *p, int periodic) in timer8_clock_event_start() argument
160 struct clock_event_device *ced = &p->ced; in timer8_clock_event_start()
162 timer8_start(p); in timer8_clock_event_start()
165 ced->mult = div_sc(p->rate, NSEC_PER_SEC, ced->shift); in timer8_clock_event_start()
169 timer8_set_next(p, periodic?(p->rate + HZ/2) / HZ:0x10000); in timer8_clock_event_start()
180 struct timer8_priv *p = ced_to_priv(ced); in timer8_clock_event_periodic() local
182 dev_info(&p->pdev->dev, "used for periodic clock events\n"); in timer8_clock_event_periodic()
183 timer8_stop(p); in timer8_clock_event_periodic()
184 timer8_clock_event_start(p, PERIODIC); in timer8_clock_event_periodic()
191 struct timer8_priv *p = ced_to_priv(ced); in timer8_clock_event_oneshot() local
193 dev_info(&p->pdev->dev, "used for oneshot clock events\n"); in timer8_clock_event_oneshot()
194 timer8_stop(p); in timer8_clock_event_oneshot()
195 timer8_clock_event_start(p, ONESHOT); in timer8_clock_event_oneshot()
203 struct timer8_priv *p = ced_to_priv(ced); in timer8_clock_event_next() local
206 timer8_set_next(p, delta - 1); in timer8_clock_event_next()
211 static int timer8_setup(struct timer8_priv *p, in timer8_setup() argument
218 p->pdev = pdev; in timer8_setup()
220 res = platform_get_resource(p->pdev, IORESOURCE_MEM, 0); in timer8_setup()
222 dev_err(&p->pdev->dev, "failed to get I/O memory\n"); in timer8_setup()
226 irq = platform_get_irq(p->pdev, 0); in timer8_setup()
228 dev_err(&p->pdev->dev, "failed to get irq\n"); in timer8_setup()
232 p->mapbase = res->start; in timer8_setup()
234 p->irqaction.name = dev_name(&p->pdev->dev); in timer8_setup()
235 p->irqaction.handler = timer8_interrupt; in timer8_setup()
236 p->irqaction.dev_id = p; in timer8_setup()
237 p->irqaction.flags = IRQF_TIMER; in timer8_setup()
239 p->pclk = clk_get(&p->pdev->dev, "fck"); in timer8_setup()
240 if (IS_ERR(p->pclk)) { in timer8_setup()
241 dev_err(&p->pdev->dev, "can't get clk\n"); in timer8_setup()
242 return PTR_ERR(p->pclk); in timer8_setup()
245 p->ced.name = pdev->name; in timer8_setup()
246 p->ced.features = CLOCK_EVT_FEAT_PERIODIC | in timer8_setup()
248 p->ced.rating = 200; in timer8_setup()
249 p->ced.cpumask = cpumask_of(0); in timer8_setup()
250 p->ced.set_next_event = timer8_clock_event_next; in timer8_setup()
251 p->ced.set_state_shutdown = timer8_clock_event_shutdown; in timer8_setup()
252 p->ced.set_state_periodic = timer8_clock_event_periodic; in timer8_setup()
253 p->ced.set_state_oneshot = timer8_clock_event_oneshot; in timer8_setup()
255 ret = setup_irq(irq, &p->irqaction); in timer8_setup()
257 dev_err(&p->pdev->dev, in timer8_setup()
261 clockevents_register_device(&p->ced); in timer8_setup()
262 platform_set_drvdata(pdev, p); in timer8_setup()
269 struct timer8_priv *p = platform_get_drvdata(pdev); in timer8_probe() local
271 if (p) { in timer8_probe()
276 p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL); in timer8_probe()
277 if (!p) in timer8_probe()
280 return timer8_setup(p, pdev); in timer8_probe()