You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer changes from Thomas Gleixner:
"This assorted collection provides:
- A new timer based timer broadcast feature for systems which do not
provide a global accessible timer device. That allows those
systems to put CPUs into deep idle states where the per cpu timer
device stops.
- A few NOHZ_FULL related improvements to the timer wheel
- The usual updates to timer devices found in ARM SoCs
- Small improvements and updates all over the place"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (44 commits)
tick: Remove code duplication in tick_handle_periodic()
tick: Fix spelling mistake in tick_handle_periodic()
x86: hpet: Use proper destructor for delayed work
workqueue: Provide destroy_delayed_work_on_stack()
clocksource: CMT, MTU2, TMU and STI should depend on GENERIC_CLOCKEVENTS
timer: Remove code redundancy while calling get_nohz_timer_target()
hrtimer: Rearrange comments in the order struct members are declared
timer: Use variable head instead of &work_list in __run_timers()
clocksource: exynos_mct: silence a static checker warning
arm: zynq: Add support for cpufreq
arm: zynq: Don't use arm_global_timer with cpufreq
clocksource/cadence_ttc: Overhaul clocksource frequency adjustment
clocksource/cadence_ttc: Call clockevents_update_freq() with IRQs enabled
clocksource: Add Kconfig entries for CMT, MTU2, TMU and STI
sh: Remove Kconfig entries for TMU, CMT and MTU2
ARM: shmobile: Remove CMT, TMU and STI Kconfig entries
clocksource: armada-370-xp: Use atomic access for shared registers
clocksource: orion: Use atomic access for shared registers
clocksource: timer-keystone: Delete unnecessary variable
clocksource: timer-keystone: introduce clocksource driver for Keystone
...
This commit is contained in:
@@ -2,7 +2,7 @@ Allwinner A1X SoCs Timer Controller
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "allwinner,sun4i-timer"
|
||||
- compatible : should be "allwinner,sun4i-a10-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)
|
||||
@@ -10,7 +10,7 @@ Required properties:
|
||||
Example:
|
||||
|
||||
timer {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0x400>;
|
||||
interrupts = <22>;
|
||||
clocks = <&osc>;
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
* Device tree bindings for Texas instruments Keystone timer
|
||||
|
||||
This document provides bindings for the 64-bit timer in the KeyStone
|
||||
architecture devices. The timer can be configured as a general-purpose 64-bit
|
||||
timer, dual general-purpose 32-bit timers. When configured as dual 32-bit
|
||||
timers, each half can operate in conjunction (chain mode) or independently
|
||||
(unchained mode) of each other.
|
||||
|
||||
It is global timer is a free running up-counter and can generate interrupt
|
||||
when the counter reaches preset counter values.
|
||||
|
||||
Documentation:
|
||||
http://www.ti.com/lit/ug/sprugv5a/sprugv5a.pdf
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "ti,keystone-timer".
|
||||
- reg : specifies base physical address and count of the registers.
|
||||
- interrupts : interrupt generated by the timer.
|
||||
- clocks : the clock feeding the timer clock.
|
||||
|
||||
Example:
|
||||
|
||||
timer@22f0000 {
|
||||
compatible = "ti,keystone-timer";
|
||||
reg = <0x022f0000 0x80>;
|
||||
interrupts = <GIC_SPI 110 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&clktimer15>;
|
||||
};
|
||||
@@ -1320,6 +1320,7 @@ M: Linus Walleij <linus.walleij@linaro.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: arch/arm/mach-u300/
|
||||
F: drivers/clocksource/timer-u300.c
|
||||
F: drivers/i2c/busses/i2c-stu300.c
|
||||
F: drivers/rtc/rtc-coh901331.c
|
||||
F: drivers/watchdog/coh901327_wdt.c
|
||||
|
||||
@@ -403,7 +403,7 @@
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0x90>;
|
||||
interrupts = <22>;
|
||||
clocks = <&osc24M>;
|
||||
|
||||
@@ -366,7 +366,7 @@
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0x90>;
|
||||
interrupts = <22>;
|
||||
clocks = <&osc24M>;
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0x90>;
|
||||
interrupts = <22>;
|
||||
clocks = <&osc24M>;
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0xa0>;
|
||||
interrupts = <0 18 4>,
|
||||
<0 19 4>,
|
||||
|
||||
@@ -435,7 +435,7 @@
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
compatible = "allwinner,sun4i-timer";
|
||||
compatible = "allwinner,sun4i-a10-timer";
|
||||
reg = <0x01c20c00 0x90>;
|
||||
interrupts = <0 22 4>,
|
||||
<0 23 4>,
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
clocks = <&clkc 3>;
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
666667 1000000
|
||||
333334 1000000
|
||||
222223 1000000
|
||||
>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
|
||||
@@ -24,17 +24,21 @@ comment "Renesas ARM SoCs System Type"
|
||||
|
||||
config ARCH_EMEV2
|
||||
bool "Emma Mobile EV2"
|
||||
select SYS_SUPPORTS_EM_STI
|
||||
|
||||
config ARCH_R7S72100
|
||||
bool "RZ/A1H (R7S72100)"
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
|
||||
config ARCH_R8A7790
|
||||
bool "R-Car H2 (R8A77900)"
|
||||
select RENESAS_IRQC
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
config ARCH_R8A7791
|
||||
bool "R-Car M2 (R8A77910)"
|
||||
select RENESAS_IRQC
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
comment "Renesas ARM SoCs Board Type"
|
||||
|
||||
@@ -68,6 +72,8 @@ config ARCH_SH7372
|
||||
select ARM_CPU_SUSPEND if PM || CPU_IDLE
|
||||
select CPU_V7
|
||||
select SH_CLK_CPG
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_SH73A0
|
||||
bool "SH-Mobile AG5 (R8A73A00)"
|
||||
@@ -77,6 +83,8 @@ config ARCH_SH73A0
|
||||
select I2C
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_INTC_IRQPIN
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_R8A73A4
|
||||
bool "R-Mobile APE6 (R8A73A40)"
|
||||
@@ -87,6 +95,8 @@ config ARCH_R8A73A4
|
||||
select RENESAS_IRQC
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select ARCH_HAS_OPP
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_R8A7740
|
||||
bool "R-Mobile A1 (R8A77400)"
|
||||
@@ -95,6 +105,8 @@ config ARCH_R8A7740
|
||||
select CPU_V7
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_INTC_IRQPIN
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_R8A7778
|
||||
bool "R-Car M1A (R8A77781)"
|
||||
@@ -104,6 +116,7 @@ config ARCH_R8A7778
|
||||
select ARM_GIC
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_R8A7779
|
||||
bool "R-Car H1 (R8A77790)"
|
||||
@@ -114,6 +127,7 @@ config ARCH_R8A7779
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select RENESAS_INTC_IRQPIN
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config ARCH_R8A7790
|
||||
bool "R-Car H2 (R8A77900)"
|
||||
@@ -123,6 +137,7 @@ config ARCH_R8A7790
|
||||
select MIGHT_HAVE_PCI
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_IRQC
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
config ARCH_R8A7791
|
||||
bool "R-Car M2 (R8A77910)"
|
||||
@@ -132,6 +147,7 @@ config ARCH_R8A7791
|
||||
select MIGHT_HAVE_PCI
|
||||
select SH_CLK_CPG
|
||||
select RENESAS_IRQC
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
config ARCH_EMEV2
|
||||
bool "Emma Mobile EV2"
|
||||
@@ -141,6 +157,7 @@ config ARCH_EMEV2
|
||||
select MIGHT_HAVE_PCI
|
||||
select USE_OF
|
||||
select AUTO_ZRELADDR
|
||||
select SYS_SUPPORTS_EM_STI
|
||||
|
||||
config ARCH_R7S72100
|
||||
bool "RZ/A1H (R7S72100)"
|
||||
@@ -148,6 +165,7 @@ config ARCH_R7S72100
|
||||
select ARM_GIC
|
||||
select CPU_V7
|
||||
select SH_CLK_CPG
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
|
||||
comment "Renesas ARM SoCs Board Type"
|
||||
|
||||
@@ -321,24 +339,6 @@ config SHMOBILE_TIMER_HZ
|
||||
want to select a HZ value such as 128 that can evenly divide RCLK.
|
||||
A HZ value that does not divide evenly may cause timer drift.
|
||||
|
||||
config SH_TIMER_CMT
|
||||
bool "CMT timer driver"
|
||||
default y
|
||||
help
|
||||
This enables build of the CMT timer driver.
|
||||
|
||||
config SH_TIMER_TMU
|
||||
bool "TMU timer driver"
|
||||
default y
|
||||
help
|
||||
This enables build of the TMU timer driver.
|
||||
|
||||
config EM_TIMER_STI
|
||||
bool "STI timer driver"
|
||||
default y
|
||||
help
|
||||
This enables build of the STI timer driver.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# Makefile for the linux kernel, U300 machine.
|
||||
#
|
||||
|
||||
obj-y := core.o timer.o
|
||||
obj-y := core.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
@@ -2,6 +2,8 @@ config ARCH_ZYNQ
|
||||
bool "Xilinx Zynq ARM Cortex A9 Platform" if ARCH_MULTI_V7
|
||||
select ARM_AMBA
|
||||
select ARM_GIC
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select ARCH_HAS_OPP
|
||||
select COMMON_CLK
|
||||
select CPU_V7
|
||||
select GENERIC_CLOCKEVENTS
|
||||
@@ -13,6 +15,6 @@ config ARCH_ZYNQ
|
||||
select HAVE_SMP
|
||||
select SPARSE_IRQ
|
||||
select CADENCE_TTC_TIMER
|
||||
select ARM_GLOBAL_TIMER
|
||||
select ARM_GLOBAL_TIMER if !CPU_FREQ
|
||||
help
|
||||
Support for Xilinx Zynq ARM Cortex A9 Platform
|
||||
|
||||
@@ -64,6 +64,8 @@ static struct platform_device zynq_cpuidle_device = {
|
||||
*/
|
||||
static void __init zynq_init_machine(void)
|
||||
{
|
||||
struct platform_device_info devinfo = { .name = "cpufreq-cpu0", };
|
||||
|
||||
/*
|
||||
* 64KB way size, 8-way associativity, parity disabled
|
||||
*/
|
||||
@@ -72,6 +74,7 @@ static void __init zynq_init_machine(void)
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
|
||||
platform_device_register(&zynq_cpuidle_device);
|
||||
platform_device_register_full(&devinfo);
|
||||
}
|
||||
|
||||
static void __init zynq_timer_init(void)
|
||||
|
||||
+23
-53
@@ -123,15 +123,6 @@ config SYS_SUPPORTS_NUMA
|
||||
config SYS_SUPPORTS_PCI
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_CMT
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_MTU2
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_TMU
|
||||
bool
|
||||
|
||||
config STACKTRACE_SUPPORT
|
||||
def_bool y
|
||||
|
||||
@@ -191,14 +182,14 @@ config CPU_SH3
|
||||
bool
|
||||
select CPU_HAS_INTEVT
|
||||
select CPU_HAS_SR_RB
|
||||
select SYS_SUPPORTS_TMU
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
|
||||
config CPU_SH4
|
||||
bool
|
||||
select CPU_HAS_INTEVT
|
||||
select CPU_HAS_SR_RB
|
||||
select CPU_HAS_FPU if !CPU_SH4AL_DSP
|
||||
select SYS_SUPPORTS_TMU
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
select SYS_SUPPORTS_HUGETLBFS if MMU
|
||||
|
||||
config CPU_SH4A
|
||||
@@ -213,7 +204,7 @@ config CPU_SH4AL_DSP
|
||||
config CPU_SH5
|
||||
bool
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_TMU
|
||||
select SYS_SUPPORTS_SH_TMU
|
||||
select SYS_SUPPORTS_HUGETLBFS if MMU
|
||||
|
||||
config CPU_SHX2
|
||||
@@ -250,7 +241,7 @@ choice
|
||||
config CPU_SUBTYPE_SH7619
|
||||
bool "Support SH7619 processor"
|
||||
select CPU_SH2
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
# SH-2A Processor Support
|
||||
|
||||
@@ -258,50 +249,50 @@ config CPU_SUBTYPE_SH7201
|
||||
bool "Support SH7201 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
|
||||
config CPU_SUBTYPE_SH7203
|
||||
bool "Support SH7203 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select PINCTRL
|
||||
|
||||
config CPU_SUBTYPE_SH7206
|
||||
bool "Support SH7206 processor"
|
||||
select CPU_SH2A
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
|
||||
config CPU_SUBTYPE_SH7263
|
||||
bool "Support SH7263 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
|
||||
config CPU_SUBTYPE_SH7264
|
||||
bool "Support SH7264 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
select PINCTRL
|
||||
|
||||
config CPU_SUBTYPE_SH7269
|
||||
bool "Support SH7269 processor"
|
||||
select CPU_SH2A
|
||||
select CPU_HAS_FPU
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
select PINCTRL
|
||||
|
||||
config CPU_SUBTYPE_MXG
|
||||
bool "Support MX-G processor"
|
||||
select CPU_SH2A
|
||||
select SYS_SUPPORTS_MTU2
|
||||
select SYS_SUPPORTS_SH_MTU2
|
||||
help
|
||||
Select MX-G if running on an R8A03022BG part.
|
||||
|
||||
@@ -354,7 +345,7 @@ config CPU_SUBTYPE_SH7720
|
||||
bool "Support SH7720 processor"
|
||||
select CPU_SH3
|
||||
select CPU_HAS_DSP
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select USB_OHCI_SH if USB_OHCI_HCD
|
||||
@@ -366,7 +357,7 @@ config CPU_SUBTYPE_SH7721
|
||||
bool "Support SH7721 processor"
|
||||
select CPU_SH3
|
||||
select CPU_HAS_DSP
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select USB_OHCI_SH if USB_OHCI_HCD
|
||||
help
|
||||
@@ -422,7 +413,7 @@ config CPU_SUBTYPE_SH7723
|
||||
select CPU_SHX2
|
||||
select ARCH_SHMOBILE
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select PINCTRL
|
||||
help
|
||||
@@ -434,7 +425,7 @@ config CPU_SUBTYPE_SH7724
|
||||
select CPU_SHX2
|
||||
select ARCH_SHMOBILE
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select PINCTRL
|
||||
help
|
||||
@@ -514,7 +505,7 @@ config CPU_SUBTYPE_SH7343
|
||||
bool "Support SH7343 processor"
|
||||
select CPU_SH4AL_DSP
|
||||
select ARCH_SHMOBILE
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
config CPU_SUBTYPE_SH7722
|
||||
bool "Support SH7722 processor"
|
||||
@@ -523,7 +514,7 @@ config CPU_SUBTYPE_SH7722
|
||||
select ARCH_SHMOBILE
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_NUMA
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select PINCTRL
|
||||
|
||||
@@ -534,7 +525,7 @@ config CPU_SUBTYPE_SH7366
|
||||
select ARCH_SHMOBILE
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select SYS_SUPPORTS_NUMA
|
||||
select SYS_SUPPORTS_CMT
|
||||
select SYS_SUPPORTS_SH_CMT
|
||||
|
||||
endchoice
|
||||
|
||||
@@ -567,27 +558,6 @@ source "arch/sh/boards/Kconfig"
|
||||
|
||||
menu "Timer and clock configuration"
|
||||
|
||||
config SH_TIMER_TMU
|
||||
bool "TMU timer driver"
|
||||
depends on SYS_SUPPORTS_TMU
|
||||
default y
|
||||
help
|
||||
This enables the build of the TMU timer driver.
|
||||
|
||||
config SH_TIMER_CMT
|
||||
bool "CMT timer driver"
|
||||
depends on SYS_SUPPORTS_CMT
|
||||
default y
|
||||
help
|
||||
This enables build of the CMT timer driver.
|
||||
|
||||
config SH_TIMER_MTU2
|
||||
bool "MTU2 timer driver"
|
||||
depends on SYS_SUPPORTS_MTU2
|
||||
default y
|
||||
help
|
||||
This enables build of the MTU2 timer driver.
|
||||
|
||||
config SH_PCLK_FREQ
|
||||
int "Peripheral clock frequency (in Hz)"
|
||||
depends on SH_CLK_CPG_LEGACY
|
||||
|
||||
@@ -699,7 +699,7 @@ static int hpet_cpuhp_notify(struct notifier_block *n,
|
||||
/* FIXME: add schedule_work_on() */
|
||||
schedule_delayed_work_on(cpu, &work.work, 0);
|
||||
wait_for_completion(&work.complete);
|
||||
destroy_timer_on_stack(&work.work.timer);
|
||||
destroy_delayed_work_on_stack(&work.work);
|
||||
break;
|
||||
case CPU_DEAD:
|
||||
if (hdev) {
|
||||
|
||||
@@ -140,3 +140,51 @@ config VF_PIT_TIMER
|
||||
bool
|
||||
help
|
||||
Support for Period Interrupt Timer on Freescale Vybrid Family SoCs.
|
||||
|
||||
config SYS_SUPPORTS_SH_CMT
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_SH_MTU2
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_SH_TMU
|
||||
bool
|
||||
|
||||
config SYS_SUPPORTS_EM_STI
|
||||
bool
|
||||
|
||||
config SH_TIMER_CMT
|
||||
bool "Renesas CMT timer driver" if COMPILE_TEST
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
default SYS_SUPPORTS_SH_CMT
|
||||
help
|
||||
This enables build of a clocksource and clockevent driver for
|
||||
the Compare Match Timer (CMT) hardware available in 16/32/48-bit
|
||||
variants on a wide range of Mobile and Automotive SoCs from Renesas.
|
||||
|
||||
config SH_TIMER_MTU2
|
||||
bool "Renesas MTU2 timer driver" if COMPILE_TEST
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
default SYS_SUPPORTS_SH_MTU2
|
||||
help
|
||||
This enables build of a clockevent driver for the Multi-Function
|
||||
Timer Pulse Unit 2 (TMU2) hardware available on SoCs from Renesas.
|
||||
This hardware comes with 16 bit-timer registers.
|
||||
|
||||
config SH_TIMER_TMU
|
||||
bool "Renesas TMU timer driver" if COMPILE_TEST
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
default SYS_SUPPORTS_SH_TMU
|
||||
help
|
||||
This enables build of a clocksource and clockevent driver for
|
||||
the 32-bit Timer Unit (TMU) hardware available on a wide range
|
||||
SoCs from Renesas.
|
||||
|
||||
config EM_TIMER_STI
|
||||
bool "Renesas STI timer driver" if COMPILE_TEST
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
default SYS_SUPPORTS_EM_STI
|
||||
help
|
||||
This enables build of a clocksource and clockevent driver for
|
||||
the 48-bit System Timer (STI) hardware available on a SoCs
|
||||
such as EMEV2 from former NEC Electronics.
|
||||
|
||||
@@ -21,6 +21,7 @@ obj-$(CONFIG_ARCH_MARCO) += timer-marco.o
|
||||
obj-$(CONFIG_ARCH_MOXART) += moxart_timer.o
|
||||
obj-$(CONFIG_ARCH_MXS) += mxs_timer.o
|
||||
obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o
|
||||
obj-$(CONFIG_ARCH_U300) += timer-u300.o
|
||||
obj-$(CONFIG_SUN4I_TIMER) += sun4i_timer.o
|
||||
obj-$(CONFIG_SUN5I_HSTIMER) += timer-sun5i.o
|
||||
obj-$(CONFIG_ARCH_TEGRA) += tegra20_timer.o
|
||||
@@ -37,3 +38,4 @@ obj-$(CONFIG_ARM_ARCH_TIMER) += arm_arch_timer.o
|
||||
obj-$(CONFIG_ARM_GLOBAL_TIMER) += arm_global_timer.o
|
||||
obj-$(CONFIG_CLKSRC_METAG_GENERIC) += metag_generic.o
|
||||
obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST) += dummy_timer.o
|
||||
obj-$(CONFIG_ARCH_KEYSTONE) += timer-keystone.o
|
||||
|
||||
@@ -277,6 +277,7 @@ static void __arch_timer_setup(unsigned type,
|
||||
clk->set_next_event = arch_timer_set_next_event_phys;
|
||||
}
|
||||
} else {
|
||||
clk->features |= CLOCK_EVT_FEAT_DYNIRQ;
|
||||
clk->name = "arch_mem_timer";
|
||||
clk->rating = 400;
|
||||
clk->cpumask = cpu_all_mask;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/of_address.h>
|
||||
@@ -52,6 +53,8 @@
|
||||
#define TTC_CNT_CNTRL_DISABLE_MASK 0x1
|
||||
|
||||
#define TTC_CLK_CNTRL_CSRC_MASK (1 << 5) /* clock source */
|
||||
#define TTC_CLK_CNTRL_PSV_MASK 0x1e
|
||||
#define TTC_CLK_CNTRL_PSV_SHIFT 1
|
||||
|
||||
/*
|
||||
* Setup the timers to use pre-scaling, using a fixed value for now that will
|
||||
@@ -63,6 +66,8 @@
|
||||
#define CLK_CNTRL_PRESCALE_EN 1
|
||||
#define CNT_CNTRL_RESET (1 << 4)
|
||||
|
||||
#define MAX_F_ERR 50
|
||||
|
||||
/**
|
||||
* struct ttc_timer - This definition defines local timer structure
|
||||
*
|
||||
@@ -82,6 +87,8 @@ struct ttc_timer {
|
||||
container_of(x, struct ttc_timer, clk_rate_change_nb)
|
||||
|
||||
struct ttc_timer_clocksource {
|
||||
u32 scale_clk_ctrl_reg_old;
|
||||
u32 scale_clk_ctrl_reg_new;
|
||||
struct ttc_timer ttc;
|
||||
struct clocksource cs;
|
||||
};
|
||||
@@ -229,32 +236,89 @@ static int ttc_rate_change_clocksource_cb(struct notifier_block *nb,
|
||||
struct ttc_timer_clocksource, ttc);
|
||||
|
||||
switch (event) {
|
||||
case POST_RATE_CHANGE:
|
||||
/*
|
||||
* Do whatever is necessary to maintain a proper time base
|
||||
*
|
||||
* I cannot find a way to adjust the currently used clocksource
|
||||
* to the new frequency. __clocksource_updatefreq_hz() sounds
|
||||
* good, but does not work. Not sure what's that missing.
|
||||
*
|
||||
* This approach works, but triggers two clocksource switches.
|
||||
* The first after unregister to clocksource jiffies. And
|
||||
* another one after the register to the newly registered timer.
|
||||
*
|
||||
* Alternatively we could 'waste' another HW timer to ping pong
|
||||
* between clock sources. That would also use one register and
|
||||
* one unregister call, but only trigger one clocksource switch
|
||||
* for the cost of another HW timer used by the OS.
|
||||
*/
|
||||
clocksource_unregister(&ttccs->cs);
|
||||
clocksource_register_hz(&ttccs->cs,
|
||||
ndata->new_rate / PRESCALE);
|
||||
/* fall through */
|
||||
case PRE_RATE_CHANGE:
|
||||
{
|
||||
u32 psv;
|
||||
unsigned long factor, rate_low, rate_high;
|
||||
|
||||
if (ndata->new_rate > ndata->old_rate) {
|
||||
factor = DIV_ROUND_CLOSEST(ndata->new_rate,
|
||||
ndata->old_rate);
|
||||
rate_low = ndata->old_rate;
|
||||
rate_high = ndata->new_rate;
|
||||
} else {
|
||||
factor = DIV_ROUND_CLOSEST(ndata->old_rate,
|
||||
ndata->new_rate);
|
||||
rate_low = ndata->new_rate;
|
||||
rate_high = ndata->old_rate;
|
||||
}
|
||||
|
||||
if (!is_power_of_2(factor))
|
||||
return NOTIFY_BAD;
|
||||
|
||||
if (abs(rate_high - (factor * rate_low)) > MAX_F_ERR)
|
||||
return NOTIFY_BAD;
|
||||
|
||||
factor = __ilog2_u32(factor);
|
||||
|
||||
/*
|
||||
* store timer clock ctrl register so we can restore it in case
|
||||
* of an abort.
|
||||
*/
|
||||
ttccs->scale_clk_ctrl_reg_old =
|
||||
__raw_readl(ttccs->ttc.base_addr +
|
||||
TTC_CLK_CNTRL_OFFSET);
|
||||
|
||||
psv = (ttccs->scale_clk_ctrl_reg_old &
|
||||
TTC_CLK_CNTRL_PSV_MASK) >>
|
||||
TTC_CLK_CNTRL_PSV_SHIFT;
|
||||
if (ndata->new_rate < ndata->old_rate)
|
||||
psv -= factor;
|
||||
else
|
||||
psv += factor;
|
||||
|
||||
/* prescaler within legal range? */
|
||||
if (psv & ~(TTC_CLK_CNTRL_PSV_MASK >> TTC_CLK_CNTRL_PSV_SHIFT))
|
||||
return NOTIFY_BAD;
|
||||
|
||||
ttccs->scale_clk_ctrl_reg_new = ttccs->scale_clk_ctrl_reg_old &
|
||||
~TTC_CLK_CNTRL_PSV_MASK;
|
||||
ttccs->scale_clk_ctrl_reg_new |= psv << TTC_CLK_CNTRL_PSV_SHIFT;
|
||||
|
||||
|
||||
/* scale down: adjust divider in post-change notification */
|
||||
if (ndata->new_rate < ndata->old_rate)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* scale up: adjust divider now - before frequency change */
|
||||
__raw_writel(ttccs->scale_clk_ctrl_reg_new,
|
||||
ttccs->ttc.base_addr + TTC_CLK_CNTRL_OFFSET);
|
||||
break;
|
||||
}
|
||||
case POST_RATE_CHANGE:
|
||||
/* scale up: pre-change notification did the adjustment */
|
||||
if (ndata->new_rate > ndata->old_rate)
|
||||
return NOTIFY_OK;
|
||||
|
||||
/* scale down: adjust divider now - after frequency change */
|
||||
__raw_writel(ttccs->scale_clk_ctrl_reg_new,
|
||||
ttccs->ttc.base_addr + TTC_CLK_CNTRL_OFFSET);
|
||||
break;
|
||||
|
||||
case ABORT_RATE_CHANGE:
|
||||
/* we have to undo the adjustment in case we scale up */
|
||||
if (ndata->new_rate < ndata->old_rate)
|
||||
return NOTIFY_OK;
|
||||
|
||||
/* restore original register value */
|
||||
__raw_writel(ttccs->scale_clk_ctrl_reg_old,
|
||||
ttccs->ttc.base_addr + TTC_CLK_CNTRL_OFFSET);
|
||||
/* fall through */
|
||||
default:
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base)
|
||||
@@ -321,25 +385,12 @@ static int ttc_rate_change_clockevent_cb(struct notifier_block *nb,
|
||||
|
||||
switch (event) {
|
||||
case POST_RATE_CHANGE:
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* clockevents_update_freq should be called with IRQ disabled on
|
||||
* the CPU the timer provides events for. The timer we use is
|
||||
* common to both CPUs, not sure if we need to run on both
|
||||
* cores.
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
clockevents_update_freq(&ttcce->ce,
|
||||
ndata->new_rate / PRESCALE);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* update cached frequency */
|
||||
ttc->freq = ndata->new_rate;
|
||||
|
||||
clockevents_update_freq(&ttcce->ce, ndata->new_rate / PRESCALE);
|
||||
|
||||
/* fall through */
|
||||
}
|
||||
case PRE_RATE_CHANGE:
|
||||
case ABORT_RATE_CHANGE:
|
||||
default:
|
||||
|
||||
@@ -410,7 +410,7 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt)
|
||||
mevt = container_of(evt, struct mct_clock_event_device, evt);
|
||||
|
||||
mevt->base = EXYNOS4_MCT_L_BASE(cpu);
|
||||
sprintf(mevt->name, "mct_tick%d", cpu);
|
||||
snprintf(mevt->name, sizeof(mevt->name), "mct_tick%d", cpu);
|
||||
|
||||
evt->name = mevt->name;
|
||||
evt->cpumask = cpumask_of(cpu);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user