- Remove dev_err() when used with platform_get_irq (Stephen Boyd)
- Add DT binding and new compatible for Allwinner sun4i (Maxime Ripard) - Register the Atmel tcb clocksource for delays (Alexandre Belloni) - Add a clock divider for the Freescale imx platforms and new timer node in the DT (Anson Huang) - Use DIV_ROUND_CLOSEST macro for the Renesas OSTM (Geert Uytterhoeven) - Fix GENMASK and timer operation for the npcm timer (Avi Fishman) - Fix timer-of showing an error message when EPROBE_DEFER is returned (Jon Hunter) - Add new SoC DT binding and match for Renesas timers (Magnus Damm) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEGn3N4YVz0WNVyHskqDIjiipP6E8FAl1kXkMACgkQqDIjiipP 6E+ueQf7BpqpjmRa/YVUXXoX9G85nuSdwWvW8v1J14Drly7GvD0aYOX/TSzdqvV3 1cEVDiSSWD/tdp5e8L+ah1c60EvEv1O7eAhvRj3miaI/M35RyluL9yCntjtxSFT9 D9PHeR9u0fDzOfabJ04KrWOwwEyS5/BJfhsBX6rfF0AQkHfxNoU4VdwEBXDZkyfZ oVRcu75AIvvlqec32kCCF5veU3I4tdYYcnEKD3IEOKMbu84JUrVZtX3SdpJ9Pd1M pqm2ldP3S1Q1zryXOGJ9yzhrnhqO+jIoMQP0KscGQ7iQJhVvtOwDhMVp89ThNpZm PLw7chPsBLZrP2D6J7OvJFpRBDqCrw== =wXfz -----END PGP SIGNATURE----- Merge tag 'timers-v5.4' of https://git.linaro.org/people/daniel.lezcano/linux into timers/core Pull clocksource/events updates from Daniel Lezcano: - Remove dev_err() when used with platform_get_irq (Stephen Boyd) - Add DT binding and new compatible for Allwinner sun4i (Maxime Ripard) - Register the Atmel tcb clocksource for delays (Alexandre Belloni) - Add a clock divider for the Freescale imx platforms and new timer node in the DT (Anson Huang) - Use DIV_ROUND_CLOSEST macro for the Renesas OSTM (Geert Uytterhoeven) - Fix GENMASK and timer operation for the npcm timer (Avi Fishman) - Fix timer-of showing an error message when EPROBE_DEFER is returned (Jon Hunter) - Add new SoC DT binding and match for Renesas timers (Magnus Damm)
This commit is contained in:
commit
a42e43c3de
@ -0,0 +1,102 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/timer/allwinner,sun4i-a10-timer.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Allwinner A10 Timer Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
|
- Maxime Ripard <maxime.ripard@bootlin.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- allwinner,sun4i-a10-timer
|
||||||
|
- allwinner,sun8i-a23-timer
|
||||||
|
- allwinner,sun8i-v3s-timer
|
||||||
|
- allwinner,suniv-f1c100s-timer
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
description:
|
||||||
|
List of timers interrupts
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
const: allwinner,sun4i-a10-timer
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 6
|
||||||
|
maxItems: 6
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
const: allwinner,sun8i-a23-timer
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
const: allwinner,sun8i-v3s-timer
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 3
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
|
- if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
const: allwinner,suniv-f1c100s-timer
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 3
|
||||||
|
maxItems: 3
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
timer {
|
||||||
|
compatible = "allwinner,sun4i-a10-timer";
|
||||||
|
reg = <0x01c20c00 0x400>;
|
||||||
|
interrupts = <22>,
|
||||||
|
<23>,
|
||||||
|
<24>,
|
||||||
|
<25>,
|
||||||
|
<67>,
|
||||||
|
<68>;
|
||||||
|
clocks = <&osc>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -1,19 +0,0 @@
|
|||||||
Allwinner A1X SoCs Timer Controller
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
|
|
||||||
- compatible : should be one of the following:
|
|
||||||
"allwinner,sun4i-a10-timer"
|
|
||||||
"allwinner,suniv-f1c100s-timer"
|
|
||||||
- reg : Specifies base physical address and size of the registers.
|
|
||||||
- interrupts : The interrupt of the first timer
|
|
||||||
- clocks: phandle to the source clock (usually a 24 MHz fixed clock)
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
timer {
|
|
||||||
compatible = "allwinner,sun4i-a10-timer";
|
|
||||||
reg = <0x01c20c00 0x400>;
|
|
||||||
interrupts = <22>;
|
|
||||||
clocks = <&osc>;
|
|
||||||
};
|
|
@ -1,26 +0,0 @@
|
|||||||
Allwinner SoCs High Speed Timer Controller
|
|
||||||
|
|
||||||
Required properties:
|
|
||||||
|
|
||||||
- compatible : should be "allwinner,sun5i-a13-hstimer" or
|
|
||||||
"allwinner,sun7i-a20-hstimer"
|
|
||||||
- reg : Specifies base physical address and size of the registers.
|
|
||||||
- interrupts : The interrupts of these timers (2 for the sun5i IP, 4 for the sun7i
|
|
||||||
one)
|
|
||||||
- clocks: phandle to the source clock (usually the AHB clock)
|
|
||||||
|
|
||||||
Optional properties:
|
|
||||||
- resets: phandle to a reset controller asserting the timer
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
timer@1c60000 {
|
|
||||||
compatible = "allwinner,sun7i-a20-hstimer";
|
|
||||||
reg = <0x01c60000 0x1000>;
|
|
||||||
interrupts = <0 51 1>,
|
|
||||||
<0 52 1>,
|
|
||||||
<0 53 1>,
|
|
||||||
<0 54 1>;
|
|
||||||
clocks = <&ahb1_gates 19>;
|
|
||||||
resets = <&ahb1rst 19>;
|
|
||||||
};
|
|
@ -0,0 +1,79 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/timer/allwinner,sun5i-a13-hstimer.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Allwinner A13 High-Speed Timer Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
|
- Maxime Ripard <maxime.ripard@bootlin.com>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- const: allwinner,sun5i-a13-hstimer
|
||||||
|
- const: allwinner,sun7i-a20-hstimer
|
||||||
|
- items:
|
||||||
|
- const: allwinner,sun6i-a31-hstimer
|
||||||
|
- const: allwinner,sun7i-a20-hstimer
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 4
|
||||||
|
items:
|
||||||
|
- description: Timer 0 Interrupt
|
||||||
|
- description: Timer 1 Interrupt
|
||||||
|
- description: Timer 2 Interrupt
|
||||||
|
- description: Timer 3 Interrupt
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
resets:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- interrupts
|
||||||
|
- clocks
|
||||||
|
|
||||||
|
if:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
items:
|
||||||
|
const: allwinner,sun5i-a13-hstimer
|
||||||
|
|
||||||
|
then:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 2
|
||||||
|
maxItems: 2
|
||||||
|
|
||||||
|
else:
|
||||||
|
properties:
|
||||||
|
interrupts:
|
||||||
|
minItems: 4
|
||||||
|
maxItems: 4
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
timer@1c60000 {
|
||||||
|
compatible = "allwinner,sun7i-a20-hstimer";
|
||||||
|
reg = <0x01c60000 0x1000>;
|
||||||
|
interrupts = <0 51 1>,
|
||||||
|
<0 52 1>,
|
||||||
|
<0 53 1>,
|
||||||
|
<0 54 1>;
|
||||||
|
clocks = <&ahb1_gates 19>;
|
||||||
|
resets = <&ahb1rst 19>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
@ -12,16 +12,13 @@ datasheets.
|
|||||||
Required Properties:
|
Required Properties:
|
||||||
|
|
||||||
- compatible: must contain one or more of the following:
|
- compatible: must contain one or more of the following:
|
||||||
- "renesas,cmt-48-sh73a0" for the sh73A0 48-bit CMT
|
|
||||||
(CMT1)
|
|
||||||
- "renesas,cmt-48-r8a7740" for the r8a7740 48-bit CMT
|
|
||||||
(CMT1)
|
|
||||||
- "renesas,cmt-48" for all non-second generation 48-bit CMT
|
|
||||||
(CMT1 on sh73a0 and r8a7740)
|
|
||||||
This is a fallback for the above renesas,cmt-48-* entries.
|
|
||||||
|
|
||||||
- "renesas,r8a73a4-cmt0" for the 32-bit CMT0 device included in r8a73a4.
|
- "renesas,r8a73a4-cmt0" for the 32-bit CMT0 device included in r8a73a4.
|
||||||
- "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4.
|
- "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4.
|
||||||
|
- "renesas,r8a7740-cmt0" for the 32-bit CMT0 device included in r8a7740.
|
||||||
|
- "renesas,r8a7740-cmt1" for the 48-bit CMT1 device included in r8a7740.
|
||||||
|
- "renesas,r8a7740-cmt2" for the 32-bit CMT2 device included in r8a7740.
|
||||||
|
- "renesas,r8a7740-cmt3" for the 32-bit CMT3 device included in r8a7740.
|
||||||
|
- "renesas,r8a7740-cmt4" for the 32-bit CMT4 device included in r8a7740.
|
||||||
- "renesas,r8a7743-cmt0" for the 32-bit CMT0 device included in r8a7743.
|
- "renesas,r8a7743-cmt0" for the 32-bit CMT0 device included in r8a7743.
|
||||||
- "renesas,r8a7743-cmt1" for the 48-bit CMT1 device included in r8a7743.
|
- "renesas,r8a7743-cmt1" for the 48-bit CMT1 device included in r8a7743.
|
||||||
- "renesas,r8a7744-cmt0" for the 32-bit CMT0 device included in r8a7744.
|
- "renesas,r8a7744-cmt0" for the 32-bit CMT0 device included in r8a7744.
|
||||||
@ -31,29 +28,38 @@ Required Properties:
|
|||||||
- "renesas,r8a77470-cmt0" for the 32-bit CMT0 device included in r8a77470.
|
- "renesas,r8a77470-cmt0" for the 32-bit CMT0 device included in r8a77470.
|
||||||
- "renesas,r8a77470-cmt1" for the 48-bit CMT1 device included in r8a77470.
|
- "renesas,r8a77470-cmt1" for the 48-bit CMT1 device included in r8a77470.
|
||||||
- "renesas,r8a774a1-cmt0" for the 32-bit CMT0 device included in r8a774a1.
|
- "renesas,r8a774a1-cmt0" for the 32-bit CMT0 device included in r8a774a1.
|
||||||
- "renesas,r8a774a1-cmt1" for the 48-bit CMT1 device included in r8a774a1.
|
- "renesas,r8a774a1-cmt1" for the 48-bit CMT devices included in r8a774a1.
|
||||||
- "renesas,r8a774c0-cmt0" for the 32-bit CMT0 device included in r8a774c0.
|
- "renesas,r8a774c0-cmt0" for the 32-bit CMT0 device included in r8a774c0.
|
||||||
- "renesas,r8a774c0-cmt1" for the 48-bit CMT1 device included in r8a774c0.
|
- "renesas,r8a774c0-cmt1" for the 48-bit CMT devices included in r8a774c0.
|
||||||
- "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
|
- "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
|
||||||
- "renesas,r8a7790-cmt1" for the 48-bit CMT1 device included in r8a7790.
|
- "renesas,r8a7790-cmt1" for the 48-bit CMT1 device included in r8a7790.
|
||||||
- "renesas,r8a7791-cmt0" for the 32-bit CMT0 device included in r8a7791.
|
- "renesas,r8a7791-cmt0" for the 32-bit CMT0 device included in r8a7791.
|
||||||
- "renesas,r8a7791-cmt1" for the 48-bit CMT1 device included in r8a7791.
|
- "renesas,r8a7791-cmt1" for the 48-bit CMT1 device included in r8a7791.
|
||||||
|
- "renesas,r8a7792-cmt0" for the 32-bit CMT0 device included in r8a7792.
|
||||||
|
- "renesas,r8a7792-cmt1" for the 48-bit CMT1 device included in r8a7792.
|
||||||
- "renesas,r8a7793-cmt0" for the 32-bit CMT0 device included in r8a7793.
|
- "renesas,r8a7793-cmt0" for the 32-bit CMT0 device included in r8a7793.
|
||||||
- "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
|
- "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
|
||||||
- "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
|
- "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
|
||||||
- "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
|
- "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
|
||||||
- "renesas,r8a7795-cmt0" for the 32-bit CMT0 device included in r8a7795.
|
- "renesas,r8a7795-cmt0" for the 32-bit CMT0 device included in r8a7795.
|
||||||
- "renesas,r8a7795-cmt1" for the 48-bit CMT1 device included in r8a7795.
|
- "renesas,r8a7795-cmt1" for the 48-bit CMT devices included in r8a7795.
|
||||||
- "renesas,r8a7796-cmt0" for the 32-bit CMT0 device included in r8a7796.
|
- "renesas,r8a7796-cmt0" for the 32-bit CMT0 device included in r8a7796.
|
||||||
- "renesas,r8a7796-cmt1" for the 48-bit CMT1 device included in r8a7796.
|
- "renesas,r8a7796-cmt1" for the 48-bit CMT devices included in r8a7796.
|
||||||
- "renesas,r8a77965-cmt0" for the 32-bit CMT0 device included in r8a77965.
|
- "renesas,r8a77965-cmt0" for the 32-bit CMT0 device included in r8a77965.
|
||||||
- "renesas,r8a77965-cmt1" for the 48-bit CMT1 device included in r8a77965.
|
- "renesas,r8a77965-cmt1" for the 48-bit CMT devices included in r8a77965.
|
||||||
- "renesas,r8a77970-cmt0" for the 32-bit CMT0 device included in r8a77970.
|
- "renesas,r8a77970-cmt0" for the 32-bit CMT0 device included in r8a77970.
|
||||||
- "renesas,r8a77970-cmt1" for the 48-bit CMT1 device included in r8a77970.
|
- "renesas,r8a77970-cmt1" for the 48-bit CMT devices included in r8a77970.
|
||||||
- "renesas,r8a77980-cmt0" for the 32-bit CMT0 device included in r8a77980.
|
- "renesas,r8a77980-cmt0" for the 32-bit CMT0 device included in r8a77980.
|
||||||
- "renesas,r8a77980-cmt1" for the 48-bit CMT1 device included in r8a77980.
|
- "renesas,r8a77980-cmt1" for the 48-bit CMT devices included in r8a77980.
|
||||||
- "renesas,r8a77990-cmt0" for the 32-bit CMT0 device included in r8a77990.
|
- "renesas,r8a77990-cmt0" for the 32-bit CMT0 device included in r8a77990.
|
||||||
- "renesas,r8a77990-cmt1" for the 48-bit CMT1 device included in r8a77990.
|
- "renesas,r8a77990-cmt1" for the 48-bit CMT devices included in r8a77990.
|
||||||
|
- "renesas,r8a77995-cmt0" for the 32-bit CMT0 device included in r8a77995.
|
||||||
|
- "renesas,r8a77995-cmt1" for the 48-bit CMT devices included in r8a77995.
|
||||||
|
- "renesas,sh73a0-cmt0" for the 32-bit CMT0 device included in sh73a0.
|
||||||
|
- "renesas,sh73a0-cmt1" for the 48-bit CMT1 device included in sh73a0.
|
||||||
|
- "renesas,sh73a0-cmt2" for the 32-bit CMT2 device included in sh73a0.
|
||||||
|
- "renesas,sh73a0-cmt3" for the 32-bit CMT3 device included in sh73a0.
|
||||||
|
- "renesas,sh73a0-cmt4" for the 32-bit CMT4 device included in sh73a0.
|
||||||
|
|
||||||
- "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2
|
- "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2
|
||||||
and RZ/G1.
|
and RZ/G1.
|
||||||
@ -63,7 +69,7 @@ Required Properties:
|
|||||||
listed above.
|
listed above.
|
||||||
- "renesas,rcar-gen3-cmt0" for 32-bit CMT0 devices included in R-Car Gen3
|
- "renesas,rcar-gen3-cmt0" for 32-bit CMT0 devices included in R-Car Gen3
|
||||||
and RZ/G2.
|
and RZ/G2.
|
||||||
- "renesas,rcar-gen3-cmt1" for 48-bit CMT1 devices included in R-Car Gen3
|
- "renesas,rcar-gen3-cmt1" for 48-bit CMT devices included in R-Car Gen3
|
||||||
and RZ/G2.
|
and RZ/G2.
|
||||||
These are fallbacks for R-Car Gen3 and RZ/G2 entries listed
|
These are fallbacks for R-Car Gen3 and RZ/G2 entries listed
|
||||||
above.
|
above.
|
||||||
|
@ -510,6 +510,14 @@
|
|||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system_counter: timer@306a0000 {
|
||||||
|
compatible = "nxp,sysctr-timer";
|
||||||
|
reg = <0x306a0000 0x20000>;
|
||||||
|
interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&osc_24m>;
|
||||||
|
clock-names = "per";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
aips3: bus@30800000 {
|
aips3: bus@30800000 {
|
||||||
|
@ -635,6 +635,14 @@
|
|||||||
#pwm-cells = <2>;
|
#pwm-cells = <2>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system_counter: timer@306a0000 {
|
||||||
|
compatible = "nxp,sysctr-timer";
|
||||||
|
reg = <0x306a0000 0x20000>;
|
||||||
|
interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&osc_25m>;
|
||||||
|
clock-names = "per";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
bus@30800000 { /* AIPS3 */
|
bus@30800000 { /* AIPS3 */
|
||||||
|
@ -429,7 +429,7 @@ config ATMEL_ST
|
|||||||
|
|
||||||
config ATMEL_TCB_CLKSRC
|
config ATMEL_TCB_CLKSRC
|
||||||
bool "Atmel TC Block timer driver" if COMPILE_TEST
|
bool "Atmel TC Block timer driver" if COMPILE_TEST
|
||||||
depends on HAS_IOMEM
|
depends on ARM && HAS_IOMEM
|
||||||
select TIMER_OF if OF
|
select TIMER_OF if OF
|
||||||
help
|
help
|
||||||
Support for Timer Counter Blocks on Atmel SoCs.
|
Support for Timer Counter Blocks on Atmel SoCs.
|
||||||
|
@ -291,10 +291,8 @@ static int em_sti_probe(struct platform_device *pdev)
|
|||||||
platform_set_drvdata(pdev, p);
|
platform_set_drvdata(pdev, p);
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (irq < 0) {
|
if (irq < 0)
|
||||||
dev_err(&pdev->dev, "failed to get irq\n");
|
|
||||||
return irq;
|
return irq;
|
||||||
}
|
|
||||||
|
|
||||||
/* map memory, let base point to the STI instance */
|
/* map memory, let base point to the STI instance */
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
@ -221,7 +221,7 @@ static int __init ostm_init(struct device_node *np)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rate = clk_get_rate(ostm_clk);
|
rate = clk_get_rate(ostm_clk);
|
||||||
ostm->ticks_per_jiffy = (rate + HZ / 2) / HZ;
|
ostm->ticks_per_jiffy = DIV_ROUND_CLOSEST(rate, HZ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First probed device will be used as system clocksource. Any
|
* First probed device will be used as system clocksource. Any
|
||||||
|
@ -776,11 +776,8 @@ static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
irq = platform_get_irq(ch->cmt->pdev, ch->index);
|
irq = platform_get_irq(ch->cmt->pdev, ch->index);
|
||||||
if (irq < 0) {
|
if (irq < 0)
|
||||||
dev_err(&ch->cmt->pdev->dev, "ch%u: failed to get irq\n",
|
|
||||||
ch->index);
|
|
||||||
return irq;
|
return irq;
|
||||||
}
|
|
||||||
|
|
||||||
ret = request_irq(irq, sh_cmt_interrupt,
|
ret = request_irq(irq, sh_cmt_interrupt,
|
||||||
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
||||||
@ -921,12 +918,24 @@ static const struct platform_device_id sh_cmt_id_table[] = {
|
|||||||
MODULE_DEVICE_TABLE(platform, sh_cmt_id_table);
|
MODULE_DEVICE_TABLE(platform, sh_cmt_id_table);
|
||||||
|
|
||||||
static const struct of_device_id sh_cmt_of_table[] __maybe_unused = {
|
static const struct of_device_id sh_cmt_of_table[] __maybe_unused = {
|
||||||
{ .compatible = "renesas,cmt-48", .data = &sh_cmt_info[SH_CMT_48BIT] },
|
{
|
||||||
|
/* deprecated, preserved for backward compatibility */
|
||||||
|
.compatible = "renesas,cmt-48",
|
||||||
|
.data = &sh_cmt_info[SH_CMT_48BIT]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
/* deprecated, preserved for backward compatibility */
|
/* deprecated, preserved for backward compatibility */
|
||||||
.compatible = "renesas,cmt-48-gen2",
|
.compatible = "renesas,cmt-48-gen2",
|
||||||
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.compatible = "renesas,r8a7740-cmt1",
|
||||||
|
.data = &sh_cmt_info[SH_CMT_48BIT]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.compatible = "renesas,sh73a0-cmt1",
|
||||||
|
.data = &sh_cmt_info[SH_CMT_48BIT]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.compatible = "renesas,rcar-gen2-cmt0",
|
.compatible = "renesas,rcar-gen2-cmt0",
|
||||||
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
|
||||||
|
@ -462,11 +462,8 @@ static int sh_tmu_channel_setup(struct sh_tmu_channel *ch, unsigned int index,
|
|||||||
ch->base = tmu->mapbase + 8 + ch->index * 12;
|
ch->base = tmu->mapbase + 8 + ch->index * 12;
|
||||||
|
|
||||||
ch->irq = platform_get_irq(tmu->pdev, index);
|
ch->irq = platform_get_irq(tmu->pdev, index);
|
||||||
if (ch->irq < 0) {
|
if (ch->irq < 0)
|
||||||
dev_err(&tmu->pdev->dev, "ch%u: failed to get irq\n",
|
|
||||||
ch->index);
|
|
||||||
return ch->irq;
|
return ch->irq;
|
||||||
}
|
|
||||||
|
|
||||||
ch->cs_enabled = false;
|
ch->cs_enabled = false;
|
||||||
ch->enable_count = 0;
|
ch->enable_count = 0;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
@ -125,6 +126,18 @@ static u64 notrace tc_sched_clock_read32(void)
|
|||||||
return tc_get_cycles32(&clksrc);
|
return tc_get_cycles32(&clksrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct delay_timer tc_delay_timer;
|
||||||
|
|
||||||
|
static unsigned long tc_delay_timer_read(void)
|
||||||
|
{
|
||||||
|
return tc_get_cycles(&clksrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long notrace tc_delay_timer_read32(void)
|
||||||
|
{
|
||||||
|
return tc_get_cycles32(&clksrc);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
#ifdef CONFIG_GENERIC_CLOCKEVENTS
|
||||||
|
|
||||||
struct tc_clkevt_device {
|
struct tc_clkevt_device {
|
||||||
@ -432,6 +445,7 @@ static int __init tcb_clksrc_init(struct device_node *node)
|
|||||||
/* setup ony channel 0 */
|
/* setup ony channel 0 */
|
||||||
tcb_setup_single_chan(&tc, best_divisor_idx);
|
tcb_setup_single_chan(&tc, best_divisor_idx);
|
||||||
tc_sched_clock = tc_sched_clock_read32;
|
tc_sched_clock = tc_sched_clock_read32;
|
||||||
|
tc_delay_timer.read_current_timer = tc_delay_timer_read32;
|
||||||
} else {
|
} else {
|
||||||
/* we have three clocks no matter what the
|
/* we have three clocks no matter what the
|
||||||
* underlying platform supports.
|
* underlying platform supports.
|
||||||
@ -444,6 +458,7 @@ static int __init tcb_clksrc_init(struct device_node *node)
|
|||||||
/* setup both channel 0 & 1 */
|
/* setup both channel 0 & 1 */
|
||||||
tcb_setup_dual_chan(&tc, best_divisor_idx);
|
tcb_setup_dual_chan(&tc, best_divisor_idx);
|
||||||
tc_sched_clock = tc_sched_clock_read;
|
tc_sched_clock = tc_sched_clock_read;
|
||||||
|
tc_delay_timer.read_current_timer = tc_delay_timer_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* and away we go! */
|
/* and away we go! */
|
||||||
@ -458,6 +473,9 @@ static int __init tcb_clksrc_init(struct device_node *node)
|
|||||||
|
|
||||||
sched_clock_register(tc_sched_clock, 32, divided_rate);
|
sched_clock_register(tc_sched_clock, 32, divided_rate);
|
||||||
|
|
||||||
|
tc_delay_timer.freq = divided_rate;
|
||||||
|
register_current_timer_delay(&tc_delay_timer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_unregister_clksrc:
|
err_unregister_clksrc:
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#define SYS_CTR_EN 0x1
|
#define SYS_CTR_EN 0x1
|
||||||
#define SYS_CTR_IRQ_MASK 0x2
|
#define SYS_CTR_IRQ_MASK 0x2
|
||||||
|
|
||||||
|
#define SYS_CTR_CLK_DIV 0x3
|
||||||
|
|
||||||
static void __iomem *sys_ctr_base;
|
static void __iomem *sys_ctr_base;
|
||||||
static u32 cmpcr;
|
static u32 cmpcr;
|
||||||
|
|
||||||
@ -134,6 +136,9 @@ static int __init sysctr_timer_init(struct device_node *np)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* system counter clock is divided by 3 internally */
|
||||||
|
to_sysctr.of_clk.rate /= SYS_CTR_CLK_DIV;
|
||||||
|
|
||||||
sys_ctr_base = timer_of_base(&to_sysctr);
|
sys_ctr_base = timer_of_base(&to_sysctr);
|
||||||
cmpcr = readl(sys_ctr_base + CMPCR);
|
cmpcr = readl(sys_ctr_base + CMPCR);
|
||||||
cmpcr &= ~SYS_CTR_EN;
|
cmpcr &= ~SYS_CTR_EN;
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#define NPCM7XX_Tx_INTEN BIT(29)
|
#define NPCM7XX_Tx_INTEN BIT(29)
|
||||||
#define NPCM7XX_Tx_COUNTEN BIT(30)
|
#define NPCM7XX_Tx_COUNTEN BIT(30)
|
||||||
#define NPCM7XX_Tx_ONESHOT 0x0
|
#define NPCM7XX_Tx_ONESHOT 0x0
|
||||||
#define NPCM7XX_Tx_OPER GENMASK(27, 3)
|
#define NPCM7XX_Tx_OPER GENMASK(28, 27)
|
||||||
#define NPCM7XX_Tx_MIN_PRESCALE 0x1
|
#define NPCM7XX_Tx_MIN_PRESCALE 0x1
|
||||||
#define NPCM7XX_Tx_TDR_MASK_BITS 24
|
#define NPCM7XX_Tx_TDR_MASK_BITS 24
|
||||||
#define NPCM7XX_Tx_MAX_CNT 0xFFFFFF
|
#define NPCM7XX_Tx_MAX_CNT 0xFFFFFF
|
||||||
@ -84,8 +84,6 @@ static int npcm7xx_timer_oneshot(struct clock_event_device *evt)
|
|||||||
|
|
||||||
val = readl(timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
val = readl(timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
||||||
val &= ~NPCM7XX_Tx_OPER;
|
val &= ~NPCM7XX_Tx_OPER;
|
||||||
|
|
||||||
val = readl(timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
|
||||||
val |= NPCM7XX_START_ONESHOT_Tx;
|
val |= NPCM7XX_START_ONESHOT_Tx;
|
||||||
writel(val, timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
writel(val, timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
||||||
|
|
||||||
@ -97,12 +95,11 @@ static int npcm7xx_timer_periodic(struct clock_event_device *evt)
|
|||||||
struct timer_of *to = to_timer_of(evt);
|
struct timer_of *to = to_timer_of(evt);
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
writel(timer_of_period(to), timer_of_base(to) + NPCM7XX_REG_TICR0);
|
||||||
|
|
||||||
val = readl(timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
val = readl(timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
||||||
val &= ~NPCM7XX_Tx_OPER;
|
val &= ~NPCM7XX_Tx_OPER;
|
||||||
|
|
||||||
writel(timer_of_period(to), timer_of_base(to) + NPCM7XX_REG_TICR0);
|
|
||||||
val |= NPCM7XX_START_PERIODIC_Tx;
|
val |= NPCM7XX_START_PERIODIC_Tx;
|
||||||
|
|
||||||
writel(val, timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
writel(val, timer_of_base(to) + NPCM7XX_REG_TCSR0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -113,8 +113,10 @@ static __init int timer_of_clk_init(struct device_node *np,
|
|||||||
of_clk->clk = of_clk->name ? of_clk_get_by_name(np, of_clk->name) :
|
of_clk->clk = of_clk->name ? of_clk_get_by_name(np, of_clk->name) :
|
||||||
of_clk_get(np, of_clk->index);
|
of_clk_get(np, of_clk->index);
|
||||||
if (IS_ERR(of_clk->clk)) {
|
if (IS_ERR(of_clk->clk)) {
|
||||||
pr_err("Failed to get clock for %pOF\n", np);
|
ret = PTR_ERR(of_clk->clk);
|
||||||
return PTR_ERR(of_clk->clk);
|
if (ret != -EPROBE_DEFER)
|
||||||
|
pr_err("Failed to get clock for %pOF\n", np);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = clk_prepare_enable(of_clk->clk);
|
ret = clk_prepare_enable(of_clk->clk);
|
||||||
|
@ -29,7 +29,9 @@ void __init timer_probe(void)
|
|||||||
|
|
||||||
ret = init_func_ret(np);
|
ret = init_func_ret(np);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("Failed to initialize '%pOF': %d\n", np, ret);
|
if (ret != -EPROBE_DEFER)
|
||||||
|
pr_err("Failed to initialize '%pOF': %d\n", np,
|
||||||
|
ret);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,5 +219,9 @@ static int __init sun4i_timer_init(struct device_node *node)
|
|||||||
}
|
}
|
||||||
TIMER_OF_DECLARE(sun4i, "allwinner,sun4i-a10-timer",
|
TIMER_OF_DECLARE(sun4i, "allwinner,sun4i-a10-timer",
|
||||||
sun4i_timer_init);
|
sun4i_timer_init);
|
||||||
|
TIMER_OF_DECLARE(sun8i_a23, "allwinner,sun8i-a23-timer",
|
||||||
|
sun4i_timer_init);
|
||||||
|
TIMER_OF_DECLARE(sun8i_v3s, "allwinner,sun8i-v3s-timer",
|
||||||
|
sun4i_timer_init);
|
||||||
TIMER_OF_DECLARE(suniv, "allwinner,suniv-f1c100s-timer",
|
TIMER_OF_DECLARE(suniv, "allwinner,suniv-f1c100s-timer",
|
||||||
sun4i_timer_init);
|
sun4i_timer_init);
|
||||||
|
Loading…
Reference in New Issue
Block a user