linux/drivers/clocksource/timer-davinci.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * TI DaVinci clocksource driver
   4 *
   5 * Copyright (C) 2019 Texas Instruments
   6 * Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
   7 * (with tiny parts adopted from code by Kevin Hilman <khilman@baylibre.com>)
   8 */
   9
  10#define pr_fmt(fmt) "%s: " fmt, __func__
  11
  12#include <linux/clk.h>
  13#include <linux/clockchips.h>
  14#include <linux/interrupt.h>
  15#include <linux/kernel.h>
  16#include <linux/of_address.h>
  17#include <linux/of_irq.h>
  18#include <linux/sched_clock.h>
  19
  20#include <clocksource/timer-davinci.h>
  21
  22#define DAVINCI_TIMER_REG_TIM12                 0x10
  23#define DAVINCI_TIMER_REG_TIM34                 0x14
  24#define DAVINCI_TIMER_REG_PRD12                 0x18
  25#define DAVINCI_TIMER_REG_PRD34                 0x1c
  26#define DAVINCI_TIMER_REG_TCR                   0x20
  27#define DAVINCI_TIMER_REG_TGCR                  0x24
  28
  29#define DAVINCI_TIMER_TIMMODE_MASK              GENMASK(3, 2)
  30#define DAVINCI_TIMER_RESET_MASK                GENMASK(1, 0)
  31#define DAVINCI_TIMER_TIMMODE_32BIT_UNCHAINED   BIT(2)
  32#define DAVINCI_TIMER_UNRESET                   GENMASK(1, 0)
  33
  34#define DAVINCI_TIMER_ENAMODE_MASK              GENMASK(1, 0)
  35#define DAVINCI_TIMER_ENAMODE_DISABLED          0x00
  36#define DAVINCI_TIMER_ENAMODE_ONESHOT           BIT(0)
  37#define DAVINCI_TIMER_ENAMODE_PERIODIC          BIT(1)
  38
  39#define DAVINCI_TIMER_ENAMODE_SHIFT_TIM12       6
  40#define DAVINCI_TIMER_ENAMODE_SHIFT_TIM34       22
  41
  42#define DAVINCI_TIMER_MIN_DELTA                 0x01
  43#define DAVINCI_TIMER_MAX_DELTA                 0xfffffffe
  44
  45#define DAVINCI_TIMER_CLKSRC_BITS               32
  46
  47#define DAVINCI_TIMER_TGCR_DEFAULT \
  48                (DAVINCI_TIMER_TIMMODE_32BIT_UNCHAINED | DAVINCI_TIMER_UNRESET)
  49
  50struct davinci_clockevent {
  51        struct clock_event_device dev;
  52        void __iomem *base;
  53        unsigned int cmp_off;
  54};
  55
  56/*
  57 * This must be globally accessible by davinci_timer_read_sched_clock(), so
  58 * let's keep it here.
  59 */
  60static struct {
  61        struct clocksource dev;
  62        void __iomem *base;
  63        unsigned int tim_off;
  64} davinci_clocksource;
  65
  66static struct davinci_clockevent *
  67to_davinci_clockevent(struct clock_event_device *clockevent)
  68{
  69        return container_of(clockevent, struct davinci_clockevent, dev);
  70}
  71
  72static unsigned int
  73davinci_clockevent_read(struct davinci_clockevent *clockevent,
  74                        unsigned int reg)
  75{
  76        return readl_relaxed(clockevent->base + reg);
  77}
  78
  79static void davinci_clockevent_write(struct davinci_clockevent *clockevent,
  80                                     unsigned int reg, unsigned int val)
  81{
  82        writel_relaxed(val, clockevent->base + reg);
  83}
  84
  85static void davinci_tim12_shutdown(void __iomem *base)
  86{
  87        unsigned int tcr;
  88
  89        tcr = DAVINCI_TIMER_ENAMODE_DISABLED <<
  90                DAVINCI_TIMER_ENAMODE_SHIFT_TIM12;
  91        /*
  92         * This function is only ever called if we're using both timer
  93         * halves. In this case TIM34 runs in periodic mode and we must
  94         * not modify it.
  95         */
  96        tcr |= DAVINCI_TIMER_ENAMODE_PERIODIC <<
  97                DAVINCI_TIMER_ENAMODE_SHIFT_TIM34;
  98
  99        writel_relaxed(tcr, base + DAVINCI_TIMER_REG_TCR);
 100}
 101
 102static void davinci_tim12_set_oneshot(void __iomem *base)
 103{
 104        unsigned int tcr;
 105
 106        tcr = DAVINCI_TIMER_ENAMODE_ONESHOT <<
 107                DAVINCI_TIMER_ENAMODE_SHIFT_TIM12;
 108        /* Same as above. */
 109        tcr |= DAVINCI_TIMER_ENAMODE_PERIODIC <<
 110                DAVINCI_TIMER_ENAMODE_SHIFT_TIM34;
 111
 112        writel_relaxed(tcr, base + DAVINCI_TIMER_REG_TCR);
 113}
 114
 115static int davinci_clockevent_shutdown(struct clock_event_device *dev)
 116{
 117        struct davinci_clockevent *clockevent;
 118
 119        clockevent = to_davinci_clockevent(dev);
 120
 121        davinci_tim12_shutdown(clockevent->base);
 122
 123        return 0;
 124}
 125
 126static int davinci_clockevent_set_oneshot(struct clock_event_device *dev)
 127{
 128        struct davinci_clockevent *clockevent = to_davinci_clockevent(dev);
 129
 130        davinci_clockevent_write(clockevent, DAVINCI_TIMER_REG_TIM12, 0x0);
 131
 132        davinci_tim12_set_oneshot(clockevent->base);
 133
 134        return 0;
 135}
 136
 137static int
 138davinci_clockevent_set_next_event_std(unsigned long cycles,
 139                                      struct clock_event_device *dev)
 140{
 141        struct davinci_clockevent *clockevent = to_davinci_clockevent(dev);
 142
 143        davinci_clockevent_shutdown(dev);
 144
 145        davinci_clockevent_write(clockevent, DAVINCI_TIMER_REG_TIM12, 0x0);
 146        davinci_clockevent_write(clockevent, DAVINCI_TIMER_REG_PRD12, cycles);
 147
 148        davinci_clockevent_set_oneshot(dev);
 149
 150        return 0;
 151}
 152
 153static int
 154davinci_clockevent_set_next_event_cmp(unsigned long cycles,
 155                                      struct clock_event_device *dev)
 156{
 157        struct davinci_clockevent *clockevent = to_davinci_clockevent(dev);
 158        unsigned int curr_time;
 159
 160        curr_time = davinci_clockevent_read(clockevent,
 161                                            DAVINCI_TIMER_REG_TIM12);
 162        davinci_clockevent_write(clockevent,
 163                                 clockevent->cmp_off, curr_time + cycles);
 164
 165        return 0;
 166}
 167
 168static irqreturn_t davinci_timer_irq_timer(int irq, void *data)
 169{
 170        struct davinci_clockevent *clockevent = data;
 171
 172        if (!clockevent_state_oneshot(&clockevent->dev))
 173                davinci_tim12_shutdown(clockevent->base);
 174
 175        clockevent->dev.event_handler(&clockevent->dev);
 176
 177        return IRQ_HANDLED;
 178}
 179
 180static u64 notrace davinci_timer_read_sched_clock(void)
 181{
 182        return readl_relaxed(davinci_clocksource.base +
 183                             davinci_clocksource.tim_off);
 184}
 185
 186static u64 davinci_clocksource_read(struct clocksource *dev)
 187{
 188        return davinci_timer_read_sched_clock();
 189}
 190
 191/*
 192 * Standard use-case: we're using tim12 for clockevent and tim34 for
 193 * clocksource. The default is making the former run in oneshot mode
 194 * and the latter in periodic mode.
 195 */
 196static void davinci_clocksource_init_tim34(void __iomem *base)
 197{
 198        int tcr;
 199
 200        tcr = DAVINCI_TIMER_ENAMODE_PERIODIC <<
 201                DAVINCI_TIMER_ENAMODE_SHIFT_TIM34;
 202        tcr |= DAVINCI_TIMER_ENAMODE_ONESHOT <<
 203                DAVINCI_TIMER_ENAMODE_SHIFT_TIM12;
 204
 205        writel_relaxed(0x0, base + DAVINCI_TIMER_REG_TIM34);
 206        writel_relaxed(UINT_MAX, base + DAVINCI_TIMER_REG_PRD34);
 207        writel_relaxed(tcr, base + DAVINCI_TIMER_REG_TCR);
 208}
 209
 210/*
 211 * Special use-case on da830: the DSP may use tim34. We're using tim12 for
 212 * both clocksource and clockevent. We set tim12 to periodic and don't touch
 213 * tim34.
 214 */
 215static void davinci_clocksource_init_tim12(void __iomem *base)
 216{
 217        unsigned int tcr;
 218
 219        tcr = DAVINCI_TIMER_ENAMODE_PERIODIC <<
 220                DAVINCI_TIMER_ENAMODE_SHIFT_TIM12;
 221
 222        writel_relaxed(0x0, base + DAVINCI_TIMER_REG_TIM12);
 223        writel_relaxed(UINT_MAX, base + DAVINCI_TIMER_REG_PRD12);
 224        writel_relaxed(tcr, base + DAVINCI_TIMER_REG_TCR);
 225}
 226
 227static void davinci_timer_init(void __iomem *base)
 228{
 229        /* Set clock to internal mode and disable it. */
 230        writel_relaxed(0x0, base + DAVINCI_TIMER_REG_TCR);
 231        /*
 232         * Reset both 32-bit timers, set no prescaler for timer 34, set the
 233         * timer to dual 32-bit unchained mode, unreset both 32-bit timers.
 234         */
 235        writel_relaxed(DAVINCI_TIMER_TGCR_DEFAULT,
 236                       base + DAVINCI_TIMER_REG_TGCR);
 237        /* Init both counters to zero. */
 238        writel_relaxed(0x0, base + DAVINCI_TIMER_REG_TIM12);
 239        writel_relaxed(0x0, base + DAVINCI_TIMER_REG_TIM34);
 240}
 241
 242int __init davinci_timer_register(struct clk *clk,
 243                                  const struct davinci_timer_cfg *timer_cfg)
 244{
 245        struct davinci_clockevent *clockevent;
 246        unsigned int tick_rate;
 247        void __iomem *base;
 248        int rv;
 249
 250        rv = clk_prepare_enable(clk);
 251        if (rv) {
 252                pr_err("Unable to prepare and enable the timer clock\n");
 253                return rv;
 254        }
 255
 256        if (!request_mem_region(timer_cfg->reg.start,
 257                                resource_size(&timer_cfg->reg),
 258                                "davinci-timer")) {
 259                pr_err("Unable to request memory region\n");
 260                return -EBUSY;
 261        }
 262
 263        base = ioremap(timer_cfg->reg.start, resource_size(&timer_cfg->reg));
 264        if (!base) {
 265                pr_err("Unable to map the register range\n");
 266                return -ENOMEM;
 267        }
 268
 269        davinci_timer_init(base);
 270        tick_rate = clk_get_rate(clk);
 271
 272        clockevent = kzalloc(sizeof(*clockevent), GFP_KERNEL);
 273        if (!clockevent)
 274                return -ENOMEM;
 275
 276        clockevent->dev.name = "tim12";
 277        clockevent->dev.features = CLOCK_EVT_FEAT_ONESHOT;
 278        clockevent->dev.cpumask = cpumask_of(0);
 279        clockevent->base = base;
 280
 281        if (timer_cfg->cmp_off) {
 282                clockevent->cmp_off = timer_cfg->cmp_off;
 283                clockevent->dev.set_next_event =
 284                                davinci_clockevent_set_next_event_cmp;
 285        } else {
 286                clockevent->dev.set_next_event =
 287                                davinci_clockevent_set_next_event_std;
 288                clockevent->dev.set_state_oneshot =
 289                                davinci_clockevent_set_oneshot;
 290                clockevent->dev.set_state_shutdown =
 291                                davinci_clockevent_shutdown;
 292        }
 293
 294        rv = request_irq(timer_cfg->irq[DAVINCI_TIMER_CLOCKEVENT_IRQ].start,
 295                         davinci_timer_irq_timer, IRQF_TIMER,
 296                         "clockevent/tim12", clockevent);
 297        if (rv) {
 298                pr_err("Unable to request the clockevent interrupt\n");
 299                return rv;
 300        }
 301
 302        davinci_clocksource.dev.rating = 300;
 303        davinci_clocksource.dev.read = davinci_clocksource_read;
 304        davinci_clocksource.dev.mask =
 305                        CLOCKSOURCE_MASK(DAVINCI_TIMER_CLKSRC_BITS);
 306        davinci_clocksource.dev.flags = CLOCK_SOURCE_IS_CONTINUOUS;
 307        davinci_clocksource.base = base;
 308
 309        if (timer_cfg->cmp_off) {
 310                davinci_clocksource.dev.name = "tim12";
 311                davinci_clocksource.tim_off = DAVINCI_TIMER_REG_TIM12;
 312                davinci_clocksource_init_tim12(base);
 313        } else {
 314                davinci_clocksource.dev.name = "tim34";
 315                davinci_clocksource.tim_off = DAVINCI_TIMER_REG_TIM34;
 316                davinci_clocksource_init_tim34(base);
 317        }
 318
 319        clockevents_config_and_register(&clockevent->dev, tick_rate,
 320                                        DAVINCI_TIMER_MIN_DELTA,
 321                                        DAVINCI_TIMER_MAX_DELTA);
 322
 323        rv = clocksource_register_hz(&davinci_clocksource.dev, tick_rate);
 324        if (rv) {
 325                pr_err("Unable to register clocksource\n");
 326                return rv;
 327        }
 328
 329        sched_clock_register(davinci_timer_read_sched_clock,
 330                             DAVINCI_TIMER_CLKSRC_BITS, tick_rate);
 331
 332        return 0;
 333}
 334
 335static int __init of_davinci_timer_register(struct device_node *np)
 336{
 337        struct davinci_timer_cfg timer_cfg = { };
 338        struct clk *clk;
 339        int rv;
 340
 341        rv = of_address_to_resource(np, 0, &timer_cfg.reg);
 342        if (rv) {
 343                pr_err("Unable to get the register range for timer\n");
 344                return rv;
 345        }
 346
 347        rv = of_irq_to_resource_table(np, timer_cfg.irq,
 348                                      DAVINCI_TIMER_NUM_IRQS);
 349        if (rv != DAVINCI_TIMER_NUM_IRQS) {
 350                pr_err("Unable to get the interrupts for timer\n");
 351                return rv;
 352        }
 353
 354        clk = of_clk_get(np, 0);
 355        if (IS_ERR(clk)) {
 356                pr_err("Unable to get the timer clock\n");
 357                return PTR_ERR(clk);
 358        }
 359
 360        rv = davinci_timer_register(clk, &timer_cfg);
 361        if (rv)
 362                clk_put(clk);
 363
 364        return rv;
 365}
 366TIMER_OF_DECLARE(davinci_timer, "ti,da830-timer", of_davinci_timer_register);
 367