Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM64: juno: add sp810 support and fix sp804 clock frequency

The clock generator in IOFPGA generates the two source clocks: 32kHz and
1MHz for the SP810 System Controller.

The SP810 System Controller selects 32kHz or 1MHz as the sources for
TIM_CLK[3:0], the SP804 timer clocks. The powerup default is 32kHz but
the maximum of "refclk" and "timclk" is chosen by the SP810 driver.

This patch adds support for SP810 system controller and also fixes the
SP804 timer clock frequency.

However the SP804 driver needs to be enabled on ARM64 to test this,
which requires SP804 driver to be moved out of arch/arm.

Fixes: 71f867ec130e ("arm64: Add Juno board device tree.")
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Olof Johansson <olof@lixom.net>
Acked-by: Liviu Dudau <Liviu.Dudau@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Sudeep Holla and committed by
Arnd Bergmann
3bb1555c b60e23ba

+27 -4
+27 -4
arch/arm64/boot/dts/arm/juno-motherboard.dtsi
··· 21 21 clock-output-names = "juno_mb:clk25mhz"; 22 22 }; 23 23 24 + v2m_refclk1mhz: refclk1mhz { 25 + compatible = "fixed-clock"; 26 + #clock-cells = <0>; 27 + clock-frequency = <1000000>; 28 + clock-output-names = "juno_mb:refclk1mhz"; 29 + }; 30 + 31 + v2m_refclk32khz: refclk32khz { 32 + compatible = "fixed-clock"; 33 + #clock-cells = <0>; 34 + clock-frequency = <32768>; 35 + clock-output-names = "juno_mb:refclk32khz"; 36 + }; 37 + 24 38 motherboard { 25 39 compatible = "arm,vexpress,v2p-p1", "simple-bus"; 26 40 #address-cells = <2>; /* SMB chipselect number and offset */ ··· 80 66 #size-cells = <1>; 81 67 ranges = <0 3 0 0x200000>; 82 68 69 + v2m_sysctl: sysctl@020000 { 70 + compatible = "arm,sp810", "arm,primecell"; 71 + reg = <0x020000 0x1000>; 72 + clocks = <&v2m_refclk32khz>, <&v2m_refclk1mhz>, <&mb_clk24mhz>; 73 + clock-names = "refclk", "timclk", "apb_pclk"; 74 + #clock-cells = <1>; 75 + clock-output-names = "timerclken0", "timerclken1", "timerclken2", "timerclken3"; 76 + }; 77 + 83 78 mmci@050000 { 84 79 compatible = "arm,pl180", "arm,primecell"; 85 80 reg = <0x050000 0x1000>; ··· 129 106 compatible = "arm,sp804", "arm,primecell"; 130 107 reg = <0x110000 0x10000>; 131 108 interrupts = <9>; 132 - clocks = <&mb_clk24mhz>, <&soc_smc50mhz>; 133 - clock-names = "timclken1", "apb_pclk"; 109 + clocks = <&v2m_sysctl 0>, <&v2m_sysctl 1>, <&mb_clk24mhz>; 110 + clock-names = "timclken1", "timclken2", "apb_pclk"; 134 111 }; 135 112 136 113 v2m_timer23: timer@120000 { 137 114 compatible = "arm,sp804", "arm,primecell"; 138 115 reg = <0x120000 0x10000>; 139 116 interrupts = <9>; 140 - clocks = <&mb_clk24mhz>, <&soc_smc50mhz>; 141 - clock-names = "timclken1", "apb_pclk"; 117 + clocks = <&v2m_sysctl 2>, <&v2m_sysctl 3>, <&mb_clk24mhz>; 118 + clock-names = "timclken1", "timclken2", "apb_pclk"; 142 119 }; 143 120 144 121 rtc@170000 {