Merge tag 'timers-v5.18-rc1' of https://git.linaro.org/people/daniel.lezcano/linux...
authorThomas Gleixner <tglx@linutronix.de>
Mon, 14 Mar 2022 09:18:17 +0000 (10:18 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 14 Mar 2022 09:18:17 +0000 (10:18 +0100)
Pull clocksource/events updates from Daniel Lezcano:

  - Fix return error code check for the timer-of layer when getting
    the base address (Guillaume Ranquet)

  - Remove MMIO dependency, add notrace annotation for sched_clock
    and increase the timer resolution for the Microchip
    PIT64b (Claudiu Beznea)

  - Convert DT bindings to yaml for the Tegra timer (David Heidelberg)

  - Fix compilation error on architecture other than ARM for the
    i.MX TPM (Nathan Chancellor)

  - Add support for the event stream scaling for 1GHz counter on
    the arch ARM timer (Marc Zyngier)

  - Support a higher number of interrupts by the Exynos MCT timer
    driver (Alim Akhtar)

  - Detect and prevent memory corruption when the specified number
    of interrupts in the DTS is greater than the array size in the
    code for the Exynos MCT timer (Krzysztof Kozlowski)

  - Fix regression from a previous errata fix on the TI DM
    timer (Drew Fustini)

  - Several fixes and code improvements for the i.MX TPM
    driver (Peng Fan)

Link: https://lore.kernel.org/all/a8cd9be9-7d70-80df-2b74-1a8226a215e1@linaro.org
15 files changed:
Documentation/devicetree/bindings/timer/nvidia,tegra-timer.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/timer/nvidia,tegra20-timer.txt [deleted file]
Documentation/devicetree/bindings/timer/nvidia,tegra210-timer.txt [deleted file]
Documentation/devicetree/bindings/timer/nvidia,tegra30-timer.txt [deleted file]
arch/arm/boot/dts/dra7-l4.dtsi
arch/arm/boot/dts/dra7.dtsi
drivers/clocksource/Kconfig
drivers/clocksource/arm_arch_timer.c
drivers/clocksource/exynos_mct.c
drivers/clocksource/timer-imx-sysctr.c
drivers/clocksource/timer-imx-tpm.c
drivers/clocksource/timer-microchip-pit64b.c
drivers/clocksource/timer-of.c
drivers/clocksource/timer-ti-dm-systimer.c
include/clocksource/arm_arch_timer.h

diff --git a/Documentation/devicetree/bindings/timer/nvidia,tegra-timer.yaml b/Documentation/devicetree/bindings/timer/nvidia,tegra-timer.yaml
new file mode 100644 (file)
index 0000000..b78209c
--- /dev/null
@@ -0,0 +1,150 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: "http://devicetree.org/schemas/timer/nvidia,tegra-timer.yaml#"
+$schema: "http://devicetree.org/meta-schemas/core.yaml#"
+
+title: NVIDIA Tegra timer
+
+maintainers:
+  - Stephen Warren <swarren@nvidia.com>
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: nvidia,tegra210-timer
+    then:
+      properties:
+        interrupts:
+          # Either a single combined interrupt or up to 14 individual interrupts
+          minItems: 1
+          maxItems: 14
+          description: >
+            A list of 14 interrupts; one per each timer channels 0 through 13
+
+  - if:
+      properties:
+        compatible:
+          oneOf:
+            - items:
+                - enum:
+                    - nvidia,tegra114-timer
+                    - nvidia,tegra124-timer
+                    - nvidia,tegra132-timer
+                - const: nvidia,tegra30-timer
+            - items:
+                - const: nvidia,tegra30-timer
+                - const: nvidia,tegra20-timer
+    then:
+      properties:
+        interrupts:
+          # Either a single combined interrupt or up to 6 individual interrupts
+          minItems: 1
+          maxItems: 6
+          description: >
+            A list of 6 interrupts; one per each of timer channels 1 through 5,
+            and one for the shared interrupt for the remaining channels.
+
+  - if:
+      properties:
+        compatible:
+          const: nvidia,tegra20-timer
+    then:
+      properties:
+        interrupts:
+          # Either a single combined interrupt or up to 4 individual interrupts
+          minItems: 1
+          maxItems: 4
+          description: |
+            A list of 4 interrupts; one per timer channel.
+
+properties:
+  compatible:
+    oneOf:
+      - const: nvidia,tegra210-timer
+        description: >
+          The Tegra210 timer provides fourteen 29-bit timer counters and one 32-bit
+          timestamp counter. The TMRs run at either a fixed 1 MHz clock rate derived
+          from the oscillator clock (TMR0-TMR9) or directly at the oscillator clock
+          (TMR10-TMR13). Each TMR can be programmed to generate one-shot, periodic,
+          or watchdog interrupts.
+      - items:
+          - enum:
+              - nvidia,tegra114-timer
+              - nvidia,tegra124-timer
+              - nvidia,tegra132-timer
+          - const: nvidia,tegra30-timer
+      - items:
+          - const: nvidia,tegra30-timer
+          - const: nvidia,tegra20-timer
+        description: >
+          The Tegra30 timer provides ten 29-bit timer channels, a single 32-bit free
+          running counter, and 5 watchdog modules. The first two channels may also
+          trigger a legacy watchdog reset.
+      - const: nvidia,tegra20-timer
+        description: >
+          The Tegra20 timer provides four 29-bit timer channels and a single 32-bit free
+          running counter. The first two channels may also trigger a watchdog reset.
+
+  reg:
+    maxItems: 1
+
+  interrupts: true
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    items:
+      - const: timer
+
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    timer@60005000 {
+        compatible = "nvidia,tegra30-timer", "nvidia,tegra20-timer";
+        reg = <0x60005000 0x400>;
+        interrupts = <0 0 IRQ_TYPE_LEVEL_HIGH>,
+                     <0 1 IRQ_TYPE_LEVEL_HIGH>,
+                     <0 41 IRQ_TYPE_LEVEL_HIGH>,
+                     <0 42 IRQ_TYPE_LEVEL_HIGH>,
+                     <0 121 IRQ_TYPE_LEVEL_HIGH>,
+                     <0 122 IRQ_TYPE_LEVEL_HIGH>;
+        clocks = <&tegra_car 214>;
+    };
+  - |
+    #include <dt-bindings/clock/tegra210-car.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/interrupt-controller/irq.h>
+
+    timer@60005000 {
+        compatible = "nvidia,tegra210-timer";
+        reg = <0x60005000 0x400>;
+        interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>,
+                     <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
+        clocks = <&tegra_car TEGRA210_CLK_TIMER>;
+        clock-names = "timer";
+    };
diff --git a/Documentation/devicetree/bindings/timer/nvidia,tegra20-timer.txt b/Documentation/devicetree/bindings/timer/nvidia,tegra20-timer.txt
deleted file mode 100644 (file)
index 4a864bd..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-NVIDIA Tegra20 timer
-
-The Tegra20 timer provides four 29-bit timer channels and a single 32-bit free
-running counter. The first two channels may also trigger a watchdog reset.
-
-Required properties:
-
-- compatible : should be "nvidia,tegra20-timer".
-- reg : Specifies base physical address and size of the registers.
-- interrupts : A list of 4 interrupts; one per timer channel.
-- clocks : Must contain one entry, for the module clock.
-  See ../clocks/clock-bindings.txt for details.
-
-Example:
-
-timer {
-       compatible = "nvidia,tegra20-timer";
-       reg = <0x60005000 0x60>;
-       interrupts = <0 0 0x04
-                       0 1 0x04
-                       0 41 0x04
-                       0 42 0x04>;
-       clocks = <&tegra_car 132>;
-};
diff --git a/Documentation/devicetree/bindings/timer/nvidia,tegra210-timer.txt b/Documentation/devicetree/bindings/timer/nvidia,tegra210-timer.txt
deleted file mode 100644 (file)
index 032cda9..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-NVIDIA Tegra210 timer
-
-The Tegra210 timer provides fourteen 29-bit timer counters and one 32-bit
-timestamp counter. The TMRs run at either a fixed 1 MHz clock rate derived
-from the oscillator clock (TMR0-TMR9) or directly at the oscillator clock
-(TMR10-TMR13). Each TMR can be programmed to generate one-shot, periodic,
-or watchdog interrupts.
-
-Required properties:
-- compatible : "nvidia,tegra210-timer".
-- reg : Specifies base physical address and size of the registers.
-- interrupts : A list of 14 interrupts; one per each timer channels 0 through
-  13.
-- clocks : Must contain one entry, for the module clock.
-  See ../clocks/clock-bindings.txt for details.
-
-timer@60005000 {
-       compatible = "nvidia,tegra210-timer";
-       reg = <0x0 0x60005000 0x0 0x400>;
-       interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 176 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 178 IRQ_TYPE_LEVEL_HIGH>,
-                    <GIC_SPI 179 IRQ_TYPE_LEVEL_HIGH>;
-       clocks = <&tegra_car TEGRA210_CLK_TIMER>;
-       clock-names = "timer";
-};
diff --git a/Documentation/devicetree/bindings/timer/nvidia,tegra30-timer.txt b/Documentation/devicetree/bindings/timer/nvidia,tegra30-timer.txt
deleted file mode 100644 (file)
index 1761f53..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-NVIDIA Tegra30 timer
-
-The Tegra30 timer provides ten 29-bit timer channels, a single 32-bit free
-running counter, and 5 watchdog modules. The first two channels may also
-trigger a legacy watchdog reset.
-
-Required properties:
-
-- compatible : For Tegra30, must contain "nvidia,tegra30-timer".  Otherwise,
-  must contain '"nvidia,<chip>-timer", "nvidia,tegra30-timer"' where
-  <chip> is tegra124 or tegra132.
-- reg : Specifies base physical address and size of the registers.
-- interrupts : A list of 6 interrupts; one per each of timer channels 1
-    through 5, and one for the shared interrupt for the remaining channels.
-- clocks : Must contain one entry, for the module clock.
-  See ../clocks/clock-bindings.txt for details.
-
-timer {
-       compatible = "nvidia,tegra30-timer", "nvidia,tegra20-timer";
-       reg = <0x60005000 0x400>;
-       interrupts = <0 0 0x04
-                     0 1 0x04
-                     0 41 0x04
-                     0 42 0x04
-                     0 121 0x04
-                     0 122 0x04>;
-       clocks = <&tegra_car 214>;
-};
index 956a26d..0a11bac 100644 (file)
                                ti,timer-pwm;
                        };
                };
-
-               target-module@2c000 {                   /* 0x4882c000, ap 17 02.0 */
+               timer15_target: target-module@2c000 {   /* 0x4882c000, ap 17 02.0 */
                        compatible = "ti,sysc-omap4-timer", "ti,sysc";
                        reg = <0x2c000 0x4>,
                              <0x2c010 0x4>;
                        };
                };
 
-               target-module@2e000 {                   /* 0x4882e000, ap 19 14.0 */
+               timer16_target: target-module@2e000 {   /* 0x4882e000, ap 19 14.0 */
                        compatible = "ti,sysc-omap4-timer", "ti,sysc";
                        reg = <0x2e000 0x4>,
                              <0x2e010 0x4>;
index 42bff11..97ce0c4 100644 (file)
 };
 
 /* Local timers, see ARM architected timer wrap erratum i940 */
-&timer3_target {
+&timer15_target {
        ti,no-reset-on-init;
        ti,no-idle;
        timer@0 {
-               assigned-clocks = <&l4per_clkctrl DRA7_L4PER_TIMER3_CLKCTRL 24>;
+               assigned-clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER15_CLKCTRL 24>;
                assigned-clock-parents = <&timer_sys_clk_div>;
        };
 };
 
-&timer4_target {
+&timer16_target {
        ti,no-reset-on-init;
        ti,no-idle;
        timer@0 {
-               assigned-clocks = <&l4per_clkctrl DRA7_L4PER_TIMER4_CLKCTRL 24>;
+               assigned-clocks = <&l4per3_clkctrl DRA7_L4PER3_TIMER16_CLKCTRL 24>;
                assigned-clock-parents = <&timer_sys_clk_div>;
        };
 };
index cfb8ea0..1ea556e 100644 (file)
@@ -713,7 +713,6 @@ config INGENIC_OST
 config MICROCHIP_PIT64B
        bool "Microchip PIT64B support"
        depends on OF || COMPILE_TEST
-       select CLKSRC_MMIO
        select TIMER_OF
        help
          This option enables Microchip PIT64B timer for Atmel
index 1ecd52f..9ab8221 100644 (file)
@@ -880,10 +880,19 @@ static void __arch_timer_setup(unsigned type,
        clockevents_config_and_register(clk, arch_timer_rate, 0xf, max_delta);
 }
 
-static void arch_timer_evtstrm_enable(int divider)
+static void arch_timer_evtstrm_enable(unsigned int divider)
 {
        u32 cntkctl = arch_timer_get_cntkctl();
 
+#ifdef CONFIG_ARM64
+       /* ECV is likely to require a large divider. Use the EVNTIS flag. */
+       if (cpus_have_const_cap(ARM64_HAS_ECV) && divider > 15) {
+               cntkctl |= ARCH_TIMER_EVT_INTERVAL_SCALE;
+               divider -= 8;
+       }
+#endif
+
+       divider = min(divider, 15U);
        cntkctl &= ~ARCH_TIMER_EVT_TRIGGER_MASK;
        /* Set the divider and enable virtual event stream */
        cntkctl |= (divider << ARCH_TIMER_EVT_TRIGGER_SHIFT)
@@ -912,7 +921,7 @@ static void arch_timer_configure_evtstream(void)
                lsb++;
 
        /* enable event stream */
-       arch_timer_evtstrm_enable(max(0, min(lsb, 15)));
+       arch_timer_evtstrm_enable(max(0, lsb));
 }
 
 static void arch_counter_set_user_access(void)
index 6db3d55..f29c812 100644 (file)
 #define MCT_CLKEVENTS_RATING           350
 #endif
 
+/* There are four Global timers starting with 0 offset */
+#define MCT_G0_IRQ     0
+/* Local timers count starts after global timer count */
+#define MCT_L0_IRQ     4
+/* Max number of IRQ as per DT binding document */
+#define MCT_NR_IRQS    20
+
 enum {
        MCT_INT_SPI,
        MCT_INT_PPI
 };
 
-enum {
-       MCT_G0_IRQ,
-       MCT_G1_IRQ,
-       MCT_G2_IRQ,
-       MCT_G3_IRQ,
-       MCT_L0_IRQ,
-       MCT_L1_IRQ,
-       MCT_L2_IRQ,
-       MCT_L3_IRQ,
-       MCT_L4_IRQ,
-       MCT_L5_IRQ,
-       MCT_L6_IRQ,
-       MCT_L7_IRQ,
-       MCT_NR_IRQS,
-};
-
 static void __iomem *reg_base;
 static unsigned long clk_rate;
 static unsigned int mct_int_type;
@@ -89,7 +80,11 @@ static int mct_irqs[MCT_NR_IRQS];
 struct mct_clock_event_device {
        struct clock_event_device evt;
        unsigned long base;
-       char name[10];
+       /**
+        *  The length of the name must be adjusted if number of
+        *  local timer interrupts grow over two digits
+        */
+       char name[11];
 };
 
 static void exynos4_mct_write(unsigned int value, unsigned long offset)
@@ -541,6 +536,11 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
         * irqs are specified.
         */
        nr_irqs = of_irq_count(np);
+       if (nr_irqs > ARRAY_SIZE(mct_irqs)) {
+               pr_err("exynos-mct: too many (%d) interrupts configured in DT\n",
+                       nr_irqs);
+               nr_irqs = ARRAY_SIZE(mct_irqs);
+       }
        for (i = MCT_L0_IRQ; i < nr_irqs; i++)
                mct_irqs[i] = irq_of_parse_and_map(np, i);
 
@@ -553,11 +553,14 @@ static int __init exynos4_timer_interrupts(struct device_node *np,
                     mct_irqs[MCT_L0_IRQ], err);
        } else {
                for_each_possible_cpu(cpu) {
-                       int mct_irq = mct_irqs[MCT_L0_IRQ + cpu];
+                       int mct_irq;
                        struct mct_clock_event_device *pcpu_mevt =
                                per_cpu_ptr(&percpu_mct_tick, cpu);
 
                        pcpu_mevt->evt.irq = -1;
+                       if (MCT_L0_IRQ + cpu >= ARRAY_SIZE(mct_irqs))
+                               break;
+                       mct_irq = mct_irqs[MCT_L0_IRQ + cpu];
 
                        irq_set_status_flags(mct_irq, IRQ_NOAUTOEN);
                        if (request_irq(mct_irq,
index 55a8e19..523e376 100644 (file)
@@ -110,7 +110,7 @@ static struct timer_of to_sysctr = {
        },
        .of_irq = {
                .handler                = sysctr_timer_interrupt,
-               .flags                  = IRQF_TIMER | IRQF_IRQPOLL,
+               .flags                  = IRQF_TIMER,
        },
        .of_clk = {
                .name = "per",
index 2cdc077..bd64a8a 100644 (file)
@@ -32,8 +32,8 @@
 #define TPM_C0SC_CHF_MASK              (0x1 << 7)
 #define TPM_C0V                                0x24
 
-static int counter_width;
-static void __iomem *timer_base;
+static int counter_width __ro_after_init;
+static void __iomem *timer_base __ro_after_init;
 
 static inline void tpm_timer_disable(void)
 {
@@ -73,12 +73,12 @@ static unsigned long tpm_read_current_timer(void)
 {
        return tpm_read_counter();
 }
-#endif
 
 static u64 notrace tpm_read_sched_clock(void)
 {
        return tpm_read_counter();
 }
+#endif
 
 static int tpm_set_next_event(unsigned long delta,
                                struct clock_event_device *evt)
@@ -127,9 +127,9 @@ static irqreturn_t tpm_timer_interrupt(int irq, void *dev_id)
 static struct timer_of to_tpm = {
        .flags = TIMER_OF_IRQ | TIMER_OF_BASE | TIMER_OF_CLOCK,
        .clkevt = {
-               .name                   = "i.MX7ULP TPM Timer",
+               .name                   = "i.MX TPM Timer",
                .rating                 = 200,
-               .features               = CLOCK_EVT_FEAT_ONESHOT,
+               .features               = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_DYNIRQ,
                .set_state_shutdown     = tpm_set_state_shutdown,
                .set_state_oneshot      = tpm_set_state_oneshot,
                .set_next_event         = tpm_set_next_event,
@@ -137,7 +137,7 @@ static struct timer_of to_tpm = {
        },
        .of_irq = {
                .handler                = tpm_timer_interrupt,
-               .flags                  = IRQF_TIMER | IRQF_IRQPOLL,
+               .flags                  = IRQF_TIMER,
        },
        .of_clk = {
                .name = "per",
@@ -150,10 +150,10 @@ static int __init tpm_clocksource_init(void)
        tpm_delay_timer.read_current_timer = &tpm_read_current_timer;
        tpm_delay_timer.freq = timer_of_rate(&to_tpm) >> 3;
        register_current_timer_delay(&tpm_delay_timer);
-#endif
 
        sched_clock_register(tpm_read_sched_clock, counter_width,
                             timer_of_rate(&to_tpm) >> 3);
+#endif
 
        return clocksource_mmio_init(timer_base + TPM_CNT,
                                     "imx-tpm",
index cfa4ec7..abce83d 100644 (file)
@@ -42,8 +42,7 @@
 #define MCHP_PIT64B_LSBMASK            GENMASK_ULL(31, 0)
 #define MCHP_PIT64B_PRES_TO_MODE(p)    (MCHP_PIT64B_MR_PRES & ((p) << 8))
 #define MCHP_PIT64B_MODE_TO_PRES(m)    ((MCHP_PIT64B_MR_PRES & (m)) >> 8)
-#define MCHP_PIT64B_DEF_CS_FREQ                5000000UL       /* 5 MHz */
-#define MCHP_PIT64B_DEF_CE_FREQ                32768           /* 32 KHz */
+#define MCHP_PIT64B_DEF_FREQ           5000000UL       /* 5 MHz */
 
 #define MCHP_PIT64B_NAME               "pit64b"
 
@@ -165,7 +164,7 @@ static u64 mchp_pit64b_clksrc_read(struct clocksource *cs)
        return mchp_pit64b_cnt_read(mchp_pit64b_cs_base);
 }
 
-static u64 mchp_pit64b_sched_read_clk(void)
+static u64 notrace mchp_pit64b_sched_read_clk(void)
 {
        return mchp_pit64b_cnt_read(mchp_pit64b_cs_base);
 }
@@ -418,7 +417,6 @@ static int __init mchp_pit64b_init_clkevt(struct mchp_pit64b_timer *timer,
 static int __init mchp_pit64b_dt_init_timer(struct device_node *node,
                                            bool clkevt)
 {
-       u32 freq = clkevt ? MCHP_PIT64B_DEF_CE_FREQ : MCHP_PIT64B_DEF_CS_FREQ;
        struct mchp_pit64b_timer timer;
        unsigned long clk_rate;
        u32 irq = 0;
@@ -446,7 +444,7 @@ static int __init mchp_pit64b_dt_init_timer(struct device_node *node,
        }
 
        /* Initialize mode (prescaler + SGCK bit). To be used at runtime. */
-       ret = mchp_pit64b_init_mode(&timer, freq);
+       ret = mchp_pit64b_init_mode(&timer, MCHP_PIT64B_DEF_FREQ);
        if (ret)
                goto irq_unmap;
 
index 529cc6a..c3f54d9 100644 (file)
@@ -157,9 +157,9 @@ static __init int timer_of_base_init(struct device_node *np,
        of_base->base = of_base->name ?
                of_io_request_and_map(np, of_base->index, of_base->name) :
                of_iomap(np, of_base->index);
-       if (IS_ERR(of_base->base)) {
-               pr_err("Failed to iomap (%s)\n", of_base->name);
-               return PTR_ERR(of_base->base);
+       if (IS_ERR_OR_NULL(of_base->base)) {
+               pr_err("Failed to iomap (%s:%s)\n", np->name, of_base->name);
+               return of_base->base ? PTR_ERR(of_base->base) : -ENOMEM;
        }
 
        return 0;
index 5c40ca1..f19a1f0 100644 (file)
@@ -695,9 +695,9 @@ static int __init dmtimer_percpu_quirk_init(struct device_node *np, u32 pa)
                return 0;
        }
 
-       if (pa == 0x48034000)           /* dra7 dmtimer3 */
+       if (pa == 0x4882c000)           /* dra7 dmtimer15 */
                return dmtimer_percpu_timer_init(np, 0);
-       else if (pa == 0x48036000)      /* dra7 dmtimer4 */
+       else if (pa == 0x4882e000)      /* dra7 dmtimer16 */
                return dmtimer_percpu_timer_init(np, 1);
 
        return 0;
index e715bdb..057c896 100644 (file)
@@ -56,6 +56,7 @@ enum arch_timer_spi_nr {
 #define ARCH_TIMER_EVT_TRIGGER_MASK    (0xF << ARCH_TIMER_EVT_TRIGGER_SHIFT)
 #define ARCH_TIMER_USR_VT_ACCESS_EN    (1 << 8) /* virtual timer registers */
 #define ARCH_TIMER_USR_PT_ACCESS_EN    (1 << 9) /* physical timer registers */
+#define ARCH_TIMER_EVT_INTERVAL_SCALE  (1 << 17) /* EVNTIS in the ARMv8 ARM */
 
 #define ARCH_TIMER_EVT_STREAM_PERIOD_US        100
 #define ARCH_TIMER_EVT_STREAM_FREQ                             \