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

Merge tag 'clk-for-linus-3.12' of git://git.linaro.org/people/mturquette/linux

Pull clock framework changes from Michael Turquette:
"The common clk framework changes for 3.12 are dominated by clock
driver patches, both new drivers and fixes to existing. A high
percentage of these are for Samsung platforms like Exynos. Core
framework fixes and some new features like automagical clock
re-parenting round out the patches"

* tag 'clk-for-linus-3.12' of git://git.linaro.org/people/mturquette/linux: (102 commits)
clk: only call get_parent if there is one
clk: samsung: exynos5250: Simplify registration of PLL rate tables
clk: samsung: exynos4: Register PLL rate tables for Exynos4x12
clk: samsung: exynos4: Register PLL rate tables for Exynos4210
clk: samsung: exynos4: Reorder registration of mout_vpllsrc
clk: samsung: pll: Add support for rate configuration of PLL46xx
clk: samsung: pll: Use new registration method for PLL46xx
clk: samsung: pll: Add support for rate configuration of PLL45xx
clk: samsung: pll: Use new registration method for PLL45xx
clk: samsung: exynos4: Rename exynos4_plls to exynos4x12_plls
clk: samsung: exynos4: Remove checks for DT node
clk: samsung: exynos4: Remove unused static clkdev aliases
clk: samsung: Modify _get_rate() helper to use __clk_lookup()
clk: samsung: exynos4: Use separate aliases for cpufreq related clocks
clocksource: samsung_pwm_timer: Get clock from device tree
ARM: dts: exynos4: Specify PWM clocks in PWM node
pwm: samsung: Update DT bindings documentation to cover clocks
clk: Move symbol export to proper location
clk: fix new_parent dereference before null check
clk: wm831x: Initialise wm831x pointer on init
...

+3611 -1117
+26 -20
Documentation/clk.txt
··· 70 70 unsigned long parent_rate); 71 71 long (*round_rate)(struct clk_hw *hw, unsigned long, 72 72 unsigned long *); 73 + long (*determine_rate)(struct clk_hw *hw, 74 + unsigned long rate, 75 + unsigned long *best_parent_rate, 76 + struct clk **best_parent_clk); 73 77 int (*set_parent)(struct clk_hw *hw, u8 index); 74 78 u8 (*get_parent)(struct clk_hw *hw); 75 79 int (*set_rate)(struct clk_hw *hw, unsigned long); ··· 183 179 callback is invalid or otherwise unnecessary. Empty cells are either 184 180 optional or must be evaluated on a case-by-case basis. 185 181 186 - clock hardware characteristics 187 - ----------------------------------------------------------- 188 - | gate | change rate | single parent | multiplexer | root | 189 - |------|-------------|---------------|-------------|------| 190 - .prepare | | | | | | 191 - .unprepare | | | | | | 192 - | | | | | | 193 - .enable | y | | | | | 194 - .disable | y | | | | | 195 - .is_enabled | y | | | | | 196 - | | | | | | 197 - .recalc_rate | | y | | | | 198 - .round_rate | | y | | | | 199 - .set_rate | | y | | | | 200 - | | | | | | 201 - .set_parent | | | n | y | n | 202 - .get_parent | | | n | y | n | 203 - | | | | | | 204 - .init | | | | | | 205 - ----------------------------------------------------------- 182 + clock hardware characteristics 183 + ----------------------------------------------------------- 184 + | gate | change rate | single parent | multiplexer | root | 185 + |------|-------------|---------------|-------------|------| 186 + .prepare | | | | | | 187 + .unprepare | | | | | | 188 + | | | | | | 189 + .enable | y | | | | | 190 + .disable | y | | | | | 191 + .is_enabled | y | | | | | 192 + | | | | | | 193 + .recalc_rate | | y | | | | 194 + .round_rate | | y [1] | | | | 195 + .determine_rate | | y [1] | | | | 196 + .set_rate | | y | | | | 197 + | | | | | | 198 + .set_parent | | | n | y | n | 199 + .get_parent | | | n | y | n | 200 + | | | | | | 201 + .init | | | | | | 202 + ----------------------------------------------------------- 203 + [1] either one of round_rate or determine_rate is required. 206 204 207 205 Finally, register your clock at run-time with a hardware-specific 208 206 registration function. This function simply populates struct clk_foo's
+1
Documentation/devicetree/bindings/clock/exynos4-clock.txt
··· 236 236 spi0_isp_sclk 380 Exynos4x12 237 237 spi1_isp_sclk 381 Exynos4x12 238 238 uart_isp_sclk 382 Exynos4x12 239 + tmu_apbif 383 239 240 240 241 [Mux Clocks] 241 242
+13 -1
Documentation/devicetree/bindings/clock/exynos5250-clock.txt
··· 59 59 sclk_spi0 154 60 60 sclk_spi1 155 61 61 sclk_spi2 156 62 + div_i2s1 157 63 + div_i2s2 158 64 + sclk_hdmiphy 159 62 65 63 66 64 67 [Peripheral Clock Gates] ··· 157 154 dsim0 341 158 155 dp 342 159 156 mixer 343 160 - hdmi 345 157 + hdmi 344 158 + g2d 345 159 + 160 + 161 + [Clock Muxes] 162 + 163 + Clock ID 164 + ---------------------------- 165 + mout_hdmi 1024 166 + 161 167 162 168 Example 1: An example of a clock controller node is listed below. 163 169
+12
Documentation/devicetree/bindings/clock/exynos5420-clock.txt
··· 59 59 sclk_pwm 155 60 60 sclk_gscl_wa 156 61 61 sclk_gscl_wb 157 62 + sclk_hdmiphy 158 62 63 63 64 [Peripheral Clock Gates] 64 65 ··· 180 179 fimc_lite3 495 181 180 aclk_g3d 500 182 181 g3d 501 182 + smmu_mixer 502 183 + 184 + Mux ID 185 + ---------------------------- 186 + 187 + mout_hdmi 640 188 + 189 + Divider ID 190 + ---------------------------- 191 + 192 + dout_pixel 768 183 193 184 194 Example 1: An example of a clock controller node is listed below. 185 195
+77
Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt
··· 1 + * Samsung S3C64xx Clock Controller 2 + 3 + The S3C64xx clock controller generates and supplies clock to various controllers 4 + within the SoC. The clock binding described here is applicable to all SoCs in 5 + the S3C64xx family. 6 + 7 + Required Properties: 8 + 9 + - compatible: should be one of the following. 10 + - "samsung,s3c6400-clock" - controller compatible with S3C6400 SoC. 11 + - "samsung,s3c6410-clock" - controller compatible with S3C6410 SoC. 12 + 13 + - reg: physical base address of the controller and length of memory mapped 14 + region. 15 + 16 + - #clock-cells: should be 1. 17 + 18 + Each clock is assigned an identifier and client nodes can use this identifier 19 + to specify the clock which they consume. Some of the clocks are available only 20 + on a particular S3C64xx SoC and this is specified where applicable. 21 + 22 + All available clocks are defined as preprocessor macros in 23 + dt-bindings/clock/samsung,s3c64xx-clock.h header and can be used in device 24 + tree sources. 25 + 26 + External clocks: 27 + 28 + There are several clocks that are generated outside the SoC. It is expected 29 + that they are defined using standard clock bindings with following 30 + clock-output-names: 31 + - "fin_pll" - PLL input clock (xtal/extclk) - required, 32 + - "xusbxti" - USB xtal - required, 33 + - "iiscdclk0" - I2S0 codec clock - optional, 34 + - "iiscdclk1" - I2S1 codec clock - optional, 35 + - "iiscdclk2" - I2S2 codec clock - optional, 36 + - "pcmcdclk0" - PCM0 codec clock - optional, 37 + - "pcmcdclk1" - PCM1 codec clock - optional, only S3C6410. 38 + 39 + Example: Clock controller node: 40 + 41 + clock: clock-controller@7e00f000 { 42 + compatible = "samsung,s3c6410-clock"; 43 + reg = <0x7e00f000 0x1000>; 44 + #clock-cells = <1>; 45 + }; 46 + 47 + Example: Required external clocks: 48 + 49 + fin_pll: clock-fin-pll { 50 + compatible = "fixed-clock"; 51 + clock-output-names = "fin_pll"; 52 + clock-frequency = <12000000>; 53 + #clock-cells = <0>; 54 + }; 55 + 56 + xusbxti: clock-xusbxti { 57 + compatible = "fixed-clock"; 58 + clock-output-names = "xusbxti"; 59 + clock-frequency = <48000000>; 60 + #clock-cells = <0>; 61 + }; 62 + 63 + Example: UART controller node that consumes the clock generated by the clock 64 + controller (refer to the standard clock bindings for information about 65 + "clocks" and "clock-names" properties): 66 + 67 + uart0: serial@7f005000 { 68 + compatible = "samsung,s3c6400-uart"; 69 + reg = <0x7f005000 0x100>; 70 + interrupt-parent = <&vic1>; 71 + interrupts = <5>; 72 + clock-names = "uart", "clk_uart_baud2", 73 + "clk_uart_baud3"; 74 + clocks = <&clock PCLK_UART0>, <&clocks PCLK_UART0>, 75 + <&clock SCLK_UART>; 76 + status = "disabled"; 77 + };
+12
Documentation/devicetree/bindings/clock/sunxi.txt
··· 8 8 - compatible : shall be one of the following: 9 9 "allwinner,sun4i-osc-clk" - for a gatable oscillator 10 10 "allwinner,sun4i-pll1-clk" - for the main PLL clock 11 + "allwinner,sun6i-a31-pll1-clk" - for the main PLL clock on A31 11 12 "allwinner,sun4i-cpu-clk" - for the CPU multiplexer clock 12 13 "allwinner,sun4i-axi-clk" - for the AXI clock 13 14 "allwinner,sun4i-axi-gates-clk" - for the AXI gates 14 15 "allwinner,sun4i-ahb-clk" - for the AHB clock 15 16 "allwinner,sun4i-ahb-gates-clk" - for the AHB gates on A10 16 17 "allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13 18 + "allwinner,sun5i-a10s-ahb-gates-clk" - for the AHB gates on A10s 19 + "allwinner,sun7i-a20-ahb-gates-clk" - for the AHB gates on A20 20 + "allwinner,sun6i-a31-ahb1-mux-clk" - for the AHB1 multiplexer on A31 21 + "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31 17 22 "allwinner,sun4i-apb0-clk" - for the APB0 clock 18 23 "allwinner,sun4i-apb0-gates-clk" - for the APB0 gates on A10 19 24 "allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13 25 + "allwinner,sun5i-a10s-apb0-gates-clk" - for the APB0 gates on A10s 26 + "allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20 20 27 "allwinner,sun4i-apb1-clk" - for the APB1 clock 21 28 "allwinner,sun4i-apb1-mux-clk" - for the APB1 clock muxing 22 29 "allwinner,sun4i-apb1-gates-clk" - for the APB1 gates on A10 23 30 "allwinner,sun5i-a13-apb1-gates-clk" - for the APB1 gates on A13 31 + "allwinner,sun5i-a10s-apb1-gates-clk" - for the APB1 gates on A10s 32 + "allwinner,sun6i-a31-apb1-gates-clk" - for the APB1 gates on A31 33 + "allwinner,sun7i-a20-apb1-gates-clk" - for the APB1 gates on A20 34 + "allwinner,sun6i-a31-apb2-div-clk" - for the APB2 gates on A31 35 + "allwinner,sun6i-a31-apb2-gates-clk" - for the APB2 gates on A31 24 36 25 37 Required properties for all clocks: 26 38 - reg : shall be the control register address for the clock.
+75
Documentation/devicetree/bindings/clock/sunxi/sun5i-a10s-gates.txt
··· 1 + Gate clock outputs 2 + ------------------ 3 + 4 + * AXI gates ("allwinner,sun4i-axi-gates-clk") 5 + 6 + DRAM 0 7 + 8 + * AHB gates ("allwinner,sun5i-a10s-ahb-gates-clk") 9 + 10 + USB0 0 11 + EHCI0 1 12 + OHCI0 2 13 + 14 + SS 5 15 + DMA 6 16 + BIST 7 17 + MMC0 8 18 + MMC1 9 19 + MMC2 10 20 + 21 + NAND 13 22 + SDRAM 14 23 + 24 + EMAC 17 25 + TS 18 26 + 27 + SPI0 20 28 + SPI1 21 29 + SPI2 22 30 + 31 + GPS 26 32 + 33 + HSTIMER 28 34 + 35 + VE 32 36 + 37 + TVE 34 38 + 39 + LCD 36 40 + 41 + CSI 40 42 + 43 + HDMI 43 44 + DE_BE 44 45 + 46 + DE_FE 46 47 + 48 + IEP 51 49 + MALI400 52 50 + 51 + * APB0 gates ("allwinner,sun5i-a10s-apb0-gates-clk") 52 + 53 + CODEC 0 54 + 55 + IIS 3 56 + 57 + PIO 5 58 + IR 6 59 + 60 + KEYPAD 10 61 + 62 + * APB1 gates ("allwinner,sun5i-a10s-apb1-gates-clk") 63 + 64 + I2C0 0 65 + I2C1 1 66 + I2C2 2 67 + 68 + UART0 16 69 + UART1 17 70 + UART2 18 71 + UART3 19 72 + 73 + Notation: 74 + [*]: The datasheet didn't mention these, but they are present on AW code 75 + [**]: The datasheet had this marked as "NC" but they are used on AW code
+83
Documentation/devicetree/bindings/clock/sunxi/sun6i-a31-gates.txt
··· 1 + Gate clock outputs 2 + ------------------ 3 + 4 + * AHB1 gates ("allwinner,sun6i-a31-ahb1-gates-clk") 5 + 6 + MIPI DSI 1 7 + 8 + SS 5 9 + DMA 6 10 + 11 + MMC0 8 12 + MMC1 9 13 + MMC2 10 14 + MMC3 11 15 + 16 + NAND1 12 17 + NAND0 13 18 + SDRAM 14 19 + 20 + GMAC 17 21 + TS 18 22 + HSTIMER 19 23 + SPI0 20 24 + SPI1 21 25 + SPI2 22 26 + SPI3 23 27 + USB_OTG 24 28 + 29 + EHCI0 26 30 + EHCI1 27 31 + 32 + OHCI0 29 33 + OHCI1 30 34 + OHCI2 31 35 + VE 32 36 + 37 + LCD0 36 38 + LCD1 37 39 + 40 + CSI 40 41 + 42 + HDMI 43 43 + DE_BE0 44 44 + DE_BE1 45 45 + DE_FE1 46 46 + DE_FE1 47 47 + 48 + MP 50 49 + 50 + GPU 52 51 + 52 + DEU0 55 53 + DEU1 56 54 + DRC0 57 55 + DRC1 58 56 + 57 + * APB1 gates ("allwinner,sun6i-a31-apb1-gates-clk") 58 + 59 + CODEC 0 60 + 61 + DIGITAL MIC 4 62 + PIO 5 63 + 64 + DAUDIO0 12 65 + DAUDIO1 13 66 + 67 + * APB2 gates ("allwinner,sun6i-a31-apb2-gates-clk") 68 + 69 + I2C0 0 70 + I2C1 1 71 + I2C2 2 72 + I2C3 3 73 + 74 + UART0 16 75 + UART1 17 76 + UART2 18 77 + UART3 19 78 + UART4 20 79 + UART5 21 80 + 81 + Notation: 82 + [*]: The datasheet didn't mention these, but they are present on AW code 83 + [**]: The datasheet had this marked as "NC" but they are used on AW code
+98
Documentation/devicetree/bindings/clock/sunxi/sun7i-a20-gates.txt
··· 1 + Gate clock outputs 2 + ------------------ 3 + 4 + * AXI gates ("allwinner,sun4i-axi-gates-clk") 5 + 6 + DRAM 0 7 + 8 + * AHB gates ("allwinner,sun7i-a20-ahb-gates-clk") 9 + 10 + USB0 0 11 + EHCI0 1 12 + OHCI0 2 13 + EHCI1 3 14 + OHCI1 4 15 + SS 5 16 + DMA 6 17 + BIST 7 18 + MMC0 8 19 + MMC1 9 20 + MMC2 10 21 + MMC3 11 22 + MS 12 23 + NAND 13 24 + SDRAM 14 25 + 26 + ACE 16 27 + EMAC 17 28 + TS 18 29 + 30 + SPI0 20 31 + SPI1 21 32 + SPI2 22 33 + SPI3 23 34 + 35 + SATA 25 36 + 37 + HSTIMER 28 38 + 39 + VE 32 40 + TVD 33 41 + TVE0 34 42 + TVE1 35 43 + LCD0 36 44 + LCD1 37 45 + 46 + CSI0 40 47 + CSI1 41 48 + 49 + HDMI1 42 50 + HDMI0 43 51 + DE_BE0 44 52 + DE_BE1 45 53 + DE_FE1 46 54 + DE_FE1 47 55 + 56 + GMAC 49 57 + MP 50 58 + 59 + MALI400 52 60 + 61 + * APB0 gates ("allwinner,sun7i-a20-apb0-gates-clk") 62 + 63 + CODEC 0 64 + SPDIF 1 65 + AC97 2 66 + IIS0 3 67 + IIS1 4 68 + PIO 5 69 + IR0 6 70 + IR1 7 71 + IIS2 8 72 + 73 + KEYPAD 10 74 + 75 + * APB1 gates ("allwinner,sun7i-a20-apb1-gates-clk") 76 + 77 + I2C0 0 78 + I2C1 1 79 + I2C2 2 80 + I2C3 3 81 + CAN 4 82 + SCR 5 83 + PS20 6 84 + PS21 7 85 + 86 + I2C4 15 87 + UART0 16 88 + UART1 17 89 + UART2 18 90 + UART3 19 91 + UART4 20 92 + UART5 21 93 + UART6 22 94 + UART7 23 95 + 96 + Notation: 97 + [*]: The datasheet didn't mention these, but they are present on AW code 98 + [**]: The datasheet had this marked as "NC" but they are used on AW code
+5 -2
Documentation/devicetree/bindings/gpu/samsung-g2d.txt
··· 11 11 12 12 - interrupts : G2D interrupt number to the CPU. 13 13 - clocks : from common clock binding: handle to G2D clocks. 14 - - clock-names : from common clock binding: must contain "sclk_fimg2d" and 15 - "fimg2d", corresponding to entries in the clocks property. 14 + - clock-names : names of clocks listed in clocks property, in the same 15 + order, depending on SoC type: 16 + - for S5PV210 and Exynos4 based SoCs: "fimg2d" and 17 + "sclk_fimg2d" 18 + - for Exynos5250 SoC: "fimg2d". 16 19 17 20 Example: 18 21 g2d@12800000 {
+12
Documentation/devicetree/bindings/pwm/pwm-samsung.txt
··· 19 19 - reg: base address and size of register area 20 20 - interrupts: list of timer interrupts (one interrupt per timer, starting at 21 21 timer 0) 22 + - clock-names: should contain all following required clock names: 23 + - "timers" - PWM base clock used to generate PWM signals, 24 + and any subset of following optional clock names: 25 + - "pwm-tclk0" - first external PWM clock source, 26 + - "pwm-tclk1" - second external PWM clock source. 27 + Note that not all IP variants allow using all external clock sources. 28 + Refer to SoC documentation to learn which clock source configurations 29 + are available. 30 + - clocks: should contain clock specifiers of all clocks, which input names 31 + have been specified in clock-names property, in same order. 22 32 - #pwm-cells: should be 3. See pwm.txt in this directory for a description of 23 33 the cells format. The only third cell flag supported by this binding is 24 34 PWM_POLARITY_INVERTED. ··· 44 34 reg = <0x7f006000 0x1000>; 45 35 interrupt-parent = <&vic0>; 46 36 interrupts = <23>, <24>, <25>, <27>, <28>; 37 + clocks = <&clock 67>; 38 + clock-names = "timers"; 47 39 samsung,pwm-outputs = <0>, <1>; 48 40 #pwm-cells = <3>; 49 41 }
+2
arch/arm/boot/dts/exynos4.dtsi
··· 448 448 compatible = "samsung,exynos4210-pwm"; 449 449 reg = <0x139D0000 0x1000>; 450 450 interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>; 451 + clocks = <&clock 336>; 452 + clock-names = "timers"; 451 453 #pwm-cells = <2>; 452 454 status = "disabled"; 453 455 };
+3 -2
arch/arm/mach-imx/clk.h
··· 89 89 static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg, 90 90 u8 shift, u8 width, const char **parents, int num_parents) 91 91 { 92 - return clk_register_mux(NULL, name, parents, num_parents, 0, reg, shift, 92 + return clk_register_mux(NULL, name, parents, num_parents, 93 + CLK_SET_RATE_NO_REPARENT, reg, shift, 93 94 width, 0, &imx_ccm_lock); 94 95 } 95 96 ··· 99 98 int num_parents, unsigned long flags) 100 99 { 101 100 return clk_register_mux(NULL, name, parents, num_parents, 102 - flags, reg, shift, width, 0, 101 + flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0, 103 102 &imx_ccm_lock); 104 103 } 105 104
+7 -1
drivers/clk/Kconfig
··· 27 27 bool "DebugFS representation of clock tree" 28 28 select DEBUG_FS 29 29 ---help--- 30 - Creates a directory hierchy in debugfs for visualizing the clk 30 + Creates a directory hierarchy in debugfs for visualizing the clk 31 31 tree structure. Each directory contains read-only members 32 32 that export information specific to that clk node: clk_rate, 33 33 clk_flags, clk_prepare_count, clk_enable_count & ··· 63 63 ---help--- 64 64 This driver supports Silicon Labs 5351A/B/C programmable clock 65 65 generators. 66 + 67 + config COMMON_CLK_S2MPS11 68 + tristate "Clock driver for S2MPS11 MFD" 69 + depends on MFD_SEC_CORE 70 + ---help--- 71 + This driver supports S2MPS11 crystal oscillator clock. 66 72 67 73 config CLK_TWL6040 68 74 tristate "External McPDM functional clock from twl6040"
+1
drivers/clk/Makefile
··· 40 40 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o 41 41 obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o 42 42 obj-$(CONFIG_COMMON_CLK_SI5351) += clk-si5351.o 43 + obj-$(CONFIG_COMMON_CLK_S2MPS11) += clk-s2mps11.o 43 44 obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o 44 45 obj-$(CONFIG_CLK_PPC_CORENET) += clk-ppc-corenet.o
+1 -1
drivers/clk/clk-bcm2835.c
··· 23 23 #include <linux/clk-provider.h> 24 24 #include <linux/of.h> 25 25 26 - static const __initconst struct of_device_id clk_match[] = { 26 + static const struct of_device_id clk_match[] __initconst = { 27 27 { .compatible = "fixed-clock", .data = of_fixed_clk_setup, }, 28 28 { } 29 29 };
+5 -3
drivers/clk/clk-divider.c
··· 104 104 struct clk_divider *divider = to_clk_divider(hw); 105 105 unsigned int div, val; 106 106 107 - val = readl(divider->reg) >> divider->shift; 107 + val = clk_readl(divider->reg) >> divider->shift; 108 108 val &= div_mask(divider); 109 109 110 110 div = _get_div(divider, val); ··· 230 230 if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { 231 231 val = div_mask(divider) << (divider->shift + 16); 232 232 } else { 233 - val = readl(divider->reg); 233 + val = clk_readl(divider->reg); 234 234 val &= ~(div_mask(divider) << divider->shift); 235 235 } 236 236 val |= value << divider->shift; 237 - writel(val, divider->reg); 237 + clk_writel(val, divider->reg); 238 238 239 239 if (divider->lock) 240 240 spin_unlock_irqrestore(divider->lock, flags); ··· 317 317 return _register_divider(dev, name, parent_name, flags, reg, shift, 318 318 width, clk_divider_flags, NULL, lock); 319 319 } 320 + EXPORT_SYMBOL_GPL(clk_register_divider); 320 321 321 322 /** 322 323 * clk_register_divider_table - register a table based divider clock with ··· 342 341 return _register_divider(dev, name, parent_name, flags, reg, shift, 343 342 width, clk_divider_flags, table, lock); 344 343 } 344 + EXPORT_SYMBOL_GPL(clk_register_divider_table);
+2
drivers/clk/clk-fixed-factor.c
··· 97 97 98 98 return clk; 99 99 } 100 + EXPORT_SYMBOL_GPL(clk_register_fixed_factor); 101 + 100 102 #ifdef CONFIG_OF 101 103 /** 102 104 * of_fixed_factor_clk_setup() - Setup function for simple fixed factor clock
+1
drivers/clk/clk-fixed-rate.c
··· 80 80 81 81 return clk; 82 82 } 83 + EXPORT_SYMBOL_GPL(clk_register_fixed_rate); 83 84 84 85 #ifdef CONFIG_OF 85 86 /**
+4 -3
drivers/clk/clk-gate.c
··· 58 58 if (set) 59 59 reg |= BIT(gate->bit_idx); 60 60 } else { 61 - reg = readl(gate->reg); 61 + reg = clk_readl(gate->reg); 62 62 63 63 if (set) 64 64 reg |= BIT(gate->bit_idx); ··· 66 66 reg &= ~BIT(gate->bit_idx); 67 67 } 68 68 69 - writel(reg, gate->reg); 69 + clk_writel(reg, gate->reg); 70 70 71 71 if (gate->lock) 72 72 spin_unlock_irqrestore(gate->lock, flags); ··· 89 89 u32 reg; 90 90 struct clk_gate *gate = to_clk_gate(hw); 91 91 92 - reg = readl(gate->reg); 92 + reg = clk_readl(gate->reg); 93 93 94 94 /* if a set bit disables this clk, flip it before masking */ 95 95 if (gate->flags & CLK_GATE_SET_TO_DISABLE) ··· 161 161 162 162 return clk; 163 163 } 164 + EXPORT_SYMBOL_GPL(clk_register_gate);
+15 -4
drivers/clk/clk-mux.c
··· 42 42 * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so 43 43 * val = 0x4 really means "bit 2, index starts at bit 0" 44 44 */ 45 - val = readl(mux->reg) >> mux->shift; 45 + val = clk_readl(mux->reg) >> mux->shift; 46 46 val &= mux->mask; 47 47 48 48 if (mux->table) { ··· 89 89 if (mux->flags & CLK_MUX_HIWORD_MASK) { 90 90 val = mux->mask << (mux->shift + 16); 91 91 } else { 92 - val = readl(mux->reg); 92 + val = clk_readl(mux->reg); 93 93 val &= ~(mux->mask << mux->shift); 94 94 } 95 95 val |= index << mux->shift; 96 - writel(val, mux->reg); 96 + clk_writel(val, mux->reg); 97 97 98 98 if (mux->lock) 99 99 spin_unlock_irqrestore(mux->lock, flags); ··· 104 104 const struct clk_ops clk_mux_ops = { 105 105 .get_parent = clk_mux_get_parent, 106 106 .set_parent = clk_mux_set_parent, 107 + .determine_rate = __clk_mux_determine_rate, 107 108 }; 108 109 EXPORT_SYMBOL_GPL(clk_mux_ops); 110 + 111 + const struct clk_ops clk_mux_ro_ops = { 112 + .get_parent = clk_mux_get_parent, 113 + }; 114 + EXPORT_SYMBOL_GPL(clk_mux_ro_ops); 109 115 110 116 struct clk *clk_register_mux_table(struct device *dev, const char *name, 111 117 const char **parent_names, u8 num_parents, unsigned long flags, ··· 139 133 } 140 134 141 135 init.name = name; 142 - init.ops = &clk_mux_ops; 136 + if (clk_mux_flags & CLK_MUX_READ_ONLY) 137 + init.ops = &clk_mux_ro_ops; 138 + else 139 + init.ops = &clk_mux_ops; 143 140 init.flags = flags | CLK_IS_BASIC; 144 141 init.parent_names = parent_names; 145 142 init.num_parents = num_parents; ··· 163 154 164 155 return clk; 165 156 } 157 + EXPORT_SYMBOL_GPL(clk_register_mux_table); 166 158 167 159 struct clk *clk_register_mux(struct device *dev, const char *name, 168 160 const char **parent_names, u8 num_parents, unsigned long flags, ··· 176 166 flags, reg, shift, mask, clk_mux_flags, 177 167 NULL, lock); 178 168 } 169 + EXPORT_SYMBOL_GPL(clk_register_mux);
+2 -2
drivers/clk/clk-nomadik.c
··· 479 479 of_clk_add_provider(np, of_clk_src_simple_get, clk); 480 480 } 481 481 482 - static const __initconst struct of_device_id nomadik_src_match[] = { 482 + static const struct of_device_id nomadik_src_match[] __initconst = { 483 483 { .compatible = "stericsson,nomadik-src" }, 484 484 { /* sentinel */ } 485 485 }; 486 486 487 - static const __initconst struct of_device_id nomadik_src_clk_match[] = { 487 + static const struct of_device_id nomadik_src_clk_match[] __initconst = { 488 488 { 489 489 .compatible = "fixed-clock", 490 490 .data = of_fixed_clk_setup,
+1 -1
drivers/clk/clk-prima2.c
··· 1034 1034 usb0, usb1, maxclk, 1035 1035 }; 1036 1036 1037 - static __initdata struct clk_hw* prima2_clk_hw_array[maxclk] = { 1037 + static struct clk_hw *prima2_clk_hw_array[maxclk] __initdata = { 1038 1038 NULL, /* dummy */ 1039 1039 NULL, 1040 1040 &clk_pll1.hw,
+273
drivers/clk/clk-s2mps11.c
··· 1 + /* 2 + * clk-s2mps11.c - Clock driver for S2MPS11. 3 + * 4 + * Copyright (C) 2013 Samsung Electornics 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License as published by the 8 + * Free Software Foundation; either version 2 of the License, or (at your 9 + * option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 + * 20 + */ 21 + 22 + #include <linux/module.h> 23 + #include <linux/err.h> 24 + #include <linux/of.h> 25 + #include <linux/clkdev.h> 26 + #include <linux/regmap.h> 27 + #include <linux/clk-provider.h> 28 + #include <linux/platform_device.h> 29 + #include <linux/mfd/samsung/s2mps11.h> 30 + #include <linux/mfd/samsung/core.h> 31 + 32 + #define s2mps11_name(a) (a->hw.init->name) 33 + 34 + static struct clk **clk_table; 35 + static struct clk_onecell_data clk_data; 36 + 37 + enum { 38 + S2MPS11_CLK_AP = 0, 39 + S2MPS11_CLK_CP, 40 + S2MPS11_CLK_BT, 41 + S2MPS11_CLKS_NUM, 42 + }; 43 + 44 + struct s2mps11_clk { 45 + struct sec_pmic_dev *iodev; 46 + struct clk_hw hw; 47 + struct clk *clk; 48 + struct clk_lookup *lookup; 49 + u32 mask; 50 + bool enabled; 51 + }; 52 + 53 + static struct s2mps11_clk *to_s2mps11_clk(struct clk_hw *hw) 54 + { 55 + return container_of(hw, struct s2mps11_clk, hw); 56 + } 57 + 58 + static int s2mps11_clk_prepare(struct clk_hw *hw) 59 + { 60 + struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); 61 + int ret; 62 + 63 + ret = regmap_update_bits(s2mps11->iodev->regmap, 64 + S2MPS11_REG_RTC_CTRL, 65 + s2mps11->mask, s2mps11->mask); 66 + if (!ret) 67 + s2mps11->enabled = true; 68 + 69 + return ret; 70 + } 71 + 72 + static void s2mps11_clk_unprepare(struct clk_hw *hw) 73 + { 74 + struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); 75 + int ret; 76 + 77 + ret = regmap_update_bits(s2mps11->iodev->regmap, S2MPS11_REG_RTC_CTRL, 78 + s2mps11->mask, ~s2mps11->mask); 79 + 80 + if (!ret) 81 + s2mps11->enabled = false; 82 + } 83 + 84 + static int s2mps11_clk_is_enabled(struct clk_hw *hw) 85 + { 86 + struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); 87 + 88 + return s2mps11->enabled; 89 + } 90 + 91 + static unsigned long s2mps11_clk_recalc_rate(struct clk_hw *hw, 92 + unsigned long parent_rate) 93 + { 94 + struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); 95 + if (s2mps11->enabled) 96 + return 32768; 97 + else 98 + return 0; 99 + } 100 + 101 + static struct clk_ops s2mps11_clk_ops = { 102 + .prepare = s2mps11_clk_prepare, 103 + .unprepare = s2mps11_clk_unprepare, 104 + .is_enabled = s2mps11_clk_is_enabled, 105 + .recalc_rate = s2mps11_clk_recalc_rate, 106 + }; 107 + 108 + static struct clk_init_data s2mps11_clks_init[S2MPS11_CLKS_NUM] = { 109 + [S2MPS11_CLK_AP] = { 110 + .name = "s2mps11_ap", 111 + .ops = &s2mps11_clk_ops, 112 + .flags = CLK_IS_ROOT, 113 + }, 114 + [S2MPS11_CLK_CP] = { 115 + .name = "s2mps11_cp", 116 + .ops = &s2mps11_clk_ops, 117 + .flags = CLK_IS_ROOT, 118 + }, 119 + [S2MPS11_CLK_BT] = { 120 + .name = "s2mps11_bt", 121 + .ops = &s2mps11_clk_ops, 122 + .flags = CLK_IS_ROOT, 123 + }, 124 + }; 125 + 126 + static struct device_node *s2mps11_clk_parse_dt(struct platform_device *pdev) 127 + { 128 + struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); 129 + struct device_node *clk_np; 130 + int i; 131 + 132 + if (!iodev->dev->of_node) 133 + return NULL; 134 + 135 + clk_np = of_find_node_by_name(iodev->dev->of_node, "clocks"); 136 + if (!clk_np) { 137 + dev_err(&pdev->dev, "could not find clock sub-node\n"); 138 + return ERR_PTR(-EINVAL); 139 + } 140 + 141 + clk_table = devm_kzalloc(&pdev->dev, sizeof(struct clk *) * 142 + S2MPS11_CLKS_NUM, GFP_KERNEL); 143 + if (!clk_table) 144 + return ERR_PTR(-ENOMEM); 145 + 146 + for (i = 0; i < S2MPS11_CLKS_NUM; i++) 147 + of_property_read_string_index(clk_np, "clock-output-names", i, 148 + &s2mps11_clks_init[i].name); 149 + 150 + return clk_np; 151 + } 152 + 153 + static int s2mps11_clk_probe(struct platform_device *pdev) 154 + { 155 + struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); 156 + struct s2mps11_clk *s2mps11_clks, *s2mps11_clk; 157 + struct device_node *clk_np = NULL; 158 + int i, ret = 0; 159 + u32 val; 160 + 161 + s2mps11_clks = devm_kzalloc(&pdev->dev, sizeof(*s2mps11_clk) * 162 + S2MPS11_CLKS_NUM, GFP_KERNEL); 163 + if (!s2mps11_clks) 164 + return -ENOMEM; 165 + 166 + s2mps11_clk = s2mps11_clks; 167 + 168 + clk_np = s2mps11_clk_parse_dt(pdev); 169 + if (IS_ERR(clk_np)) 170 + return PTR_ERR(clk_np); 171 + 172 + for (i = 0; i < S2MPS11_CLKS_NUM; i++, s2mps11_clk++) { 173 + s2mps11_clk->iodev = iodev; 174 + s2mps11_clk->hw.init = &s2mps11_clks_init[i]; 175 + s2mps11_clk->mask = 1 << i; 176 + 177 + ret = regmap_read(s2mps11_clk->iodev->regmap, 178 + S2MPS11_REG_RTC_CTRL, &val); 179 + if (ret < 0) 180 + goto err_reg; 181 + 182 + s2mps11_clk->enabled = val & s2mps11_clk->mask; 183 + 184 + s2mps11_clk->clk = devm_clk_register(&pdev->dev, 185 + &s2mps11_clk->hw); 186 + if (IS_ERR(s2mps11_clk->clk)) { 187 + dev_err(&pdev->dev, "Fail to register : %s\n", 188 + s2mps11_name(s2mps11_clk)); 189 + ret = PTR_ERR(s2mps11_clk->clk); 190 + goto err_reg; 191 + } 192 + 193 + s2mps11_clk->lookup = devm_kzalloc(&pdev->dev, 194 + sizeof(struct clk_lookup), GFP_KERNEL); 195 + if (!s2mps11_clk->lookup) { 196 + ret = -ENOMEM; 197 + goto err_lup; 198 + } 199 + 200 + s2mps11_clk->lookup->con_id = s2mps11_name(s2mps11_clk); 201 + s2mps11_clk->lookup->clk = s2mps11_clk->clk; 202 + 203 + clkdev_add(s2mps11_clk->lookup); 204 + } 205 + 206 + if (clk_table) { 207 + for (i = 0; i < S2MPS11_CLKS_NUM; i++) 208 + clk_table[i] = s2mps11_clks[i].clk; 209 + 210 + clk_data.clks = clk_table; 211 + clk_data.clk_num = S2MPS11_CLKS_NUM; 212 + of_clk_add_provider(clk_np, of_clk_src_onecell_get, &clk_data); 213 + } 214 + 215 + platform_set_drvdata(pdev, s2mps11_clks); 216 + 217 + return ret; 218 + err_lup: 219 + devm_clk_unregister(&pdev->dev, s2mps11_clk->clk); 220 + err_reg: 221 + while (s2mps11_clk > s2mps11_clks) { 222 + if (s2mps11_clk->lookup) { 223 + clkdev_drop(s2mps11_clk->lookup); 224 + devm_clk_unregister(&pdev->dev, s2mps11_clk->clk); 225 + } 226 + s2mps11_clk--; 227 + } 228 + 229 + return ret; 230 + } 231 + 232 + static int s2mps11_clk_remove(struct platform_device *pdev) 233 + { 234 + struct s2mps11_clk *s2mps11_clks = platform_get_drvdata(pdev); 235 + int i; 236 + 237 + for (i = 0; i < S2MPS11_CLKS_NUM; i++) 238 + clkdev_drop(s2mps11_clks[i].lookup); 239 + 240 + return 0; 241 + } 242 + 243 + static const struct platform_device_id s2mps11_clk_id[] = { 244 + { "s2mps11-clk", 0}, 245 + { }, 246 + }; 247 + MODULE_DEVICE_TABLE(platform, s2mps11_clk_id); 248 + 249 + static struct platform_driver s2mps11_clk_driver = { 250 + .driver = { 251 + .name = "s2mps11-clk", 252 + .owner = THIS_MODULE, 253 + }, 254 + .probe = s2mps11_clk_probe, 255 + .remove = s2mps11_clk_remove, 256 + .id_table = s2mps11_clk_id, 257 + }; 258 + 259 + static int __init s2mps11_clk_init(void) 260 + { 261 + return platform_driver_register(&s2mps11_clk_driver); 262 + } 263 + subsys_initcall(s2mps11_clk_init); 264 + 265 + static void __init s2mps11_clk_cleanup(void) 266 + { 267 + platform_driver_unregister(&s2mps11_clk_driver); 268 + } 269 + module_exit(s2mps11_clk_cleanup); 270 + 271 + MODULE_DESCRIPTION("S2MPS11 Clock Driver"); 272 + MODULE_AUTHOR("Yadwinder Singh Brar <yadi.brar@samsung.com>"); 273 + MODULE_LICENSE("GPL");
+2 -2
drivers/clk/clk-u300.c
··· 746 746 u16 clk_val; 747 747 }; 748 748 749 - struct u300_clock const __initconst u300_clk_lookup[] = { 749 + static struct u300_clock const u300_clk_lookup[] __initconst = { 750 750 { 751 751 .type = U300_CLK_TYPE_REST, 752 752 .id = 3, ··· 1151 1151 of_clk_add_provider(np, of_clk_src_simple_get, clk); 1152 1152 } 1153 1153 1154 - static const __initconst struct of_device_id u300_clk_match[] = { 1154 + static const struct of_device_id u300_clk_match[] __initconst = { 1155 1155 { 1156 1156 .compatible = "fixed-clock", 1157 1157 .data = of_fixed_clk_setup,
+9 -7
drivers/clk/clk-wm831x.c
··· 31 31 bool xtal_ena; 32 32 }; 33 33 34 - static int wm831x_xtal_is_enabled(struct clk_hw *hw) 34 + static int wm831x_xtal_is_prepared(struct clk_hw *hw) 35 35 { 36 36 struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, 37 37 xtal_hw); ··· 52 52 } 53 53 54 54 static const struct clk_ops wm831x_xtal_ops = { 55 - .is_enabled = wm831x_xtal_is_enabled, 55 + .is_prepared = wm831x_xtal_is_prepared, 56 56 .recalc_rate = wm831x_xtal_recalc_rate, 57 57 }; 58 58 ··· 73 73 24576000, 74 74 }; 75 75 76 - static int wm831x_fll_is_enabled(struct clk_hw *hw) 76 + static int wm831x_fll_is_prepared(struct clk_hw *hw) 77 77 { 78 78 struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, 79 79 fll_hw); ··· 170 170 if (i == ARRAY_SIZE(wm831x_fll_auto_rates)) 171 171 return -EINVAL; 172 172 173 - if (wm831x_fll_is_enabled(hw)) 173 + if (wm831x_fll_is_prepared(hw)) 174 174 return -EPERM; 175 175 176 176 return wm831x_set_bits(wm831x, WM831X_CLOCK_CONTROL_2, ··· 220 220 } 221 221 222 222 static const struct clk_ops wm831x_fll_ops = { 223 - .is_enabled = wm831x_fll_is_enabled, 223 + .is_prepared = wm831x_fll_is_prepared, 224 224 .prepare = wm831x_fll_prepare, 225 225 .unprepare = wm831x_fll_unprepare, 226 226 .round_rate = wm831x_fll_round_rate, ··· 237 237 .flags = CLK_SET_RATE_GATE, 238 238 }; 239 239 240 - static int wm831x_clkout_is_enabled(struct clk_hw *hw) 240 + static int wm831x_clkout_is_prepared(struct clk_hw *hw) 241 241 { 242 242 struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, 243 243 clkout_hw); ··· 335 335 } 336 336 337 337 static const struct clk_ops wm831x_clkout_ops = { 338 - .is_enabled = wm831x_clkout_is_enabled, 338 + .is_prepared = wm831x_clkout_is_prepared, 339 339 .prepare = wm831x_clkout_prepare, 340 340 .unprepare = wm831x_clkout_unprepare, 341 341 .get_parent = wm831x_clkout_get_parent, ··· 359 359 clkdata = devm_kzalloc(&pdev->dev, sizeof(*clkdata), GFP_KERNEL); 360 360 if (!clkdata) 361 361 return -ENOMEM; 362 + 363 + clkdata->wm831x = wm831x; 362 364 363 365 /* XTAL_ENA can only be set via OTP/InstantConfig so just read once */ 364 366 ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2);
+280 -166
drivers/clk/clk.c
··· 458 458 clk->ops->unprepare(clk->hw); 459 459 } 460 460 } 461 - EXPORT_SYMBOL_GPL(__clk_get_flags); 462 461 463 462 /* caller must hold prepare_lock */ 464 463 static void clk_disable_unused_subtree(struct clk *clk) ··· 558 559 return !clk ? NULL : clk->parent; 559 560 } 560 561 562 + struct clk *clk_get_parent_by_index(struct clk *clk, u8 index) 563 + { 564 + if (!clk || index >= clk->num_parents) 565 + return NULL; 566 + else if (!clk->parents) 567 + return __clk_lookup(clk->parent_names[index]); 568 + else if (!clk->parents[index]) 569 + return clk->parents[index] = 570 + __clk_lookup(clk->parent_names[index]); 571 + else 572 + return clk->parents[index]; 573 + } 574 + 561 575 unsigned int __clk_get_enable_count(struct clk *clk) 562 576 { 563 577 return !clk ? 0 : clk->enable_count; ··· 606 594 { 607 595 return !clk ? 0 : clk->flags; 608 596 } 597 + EXPORT_SYMBOL_GPL(__clk_get_flags); 609 598 610 599 bool __clk_is_prepared(struct clk *clk) 611 600 { ··· 692 679 return NULL; 693 680 } 694 681 682 + /* 683 + * Helper for finding best parent to provide a given frequency. This can be used 684 + * directly as a determine_rate callback (e.g. for a mux), or from a more 685 + * complex clock that may combine a mux with other operations. 686 + */ 687 + long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, 688 + unsigned long *best_parent_rate, 689 + struct clk **best_parent_p) 690 + { 691 + struct clk *clk = hw->clk, *parent, *best_parent = NULL; 692 + int i, num_parents; 693 + unsigned long parent_rate, best = 0; 694 + 695 + /* if NO_REPARENT flag set, pass through to current parent */ 696 + if (clk->flags & CLK_SET_RATE_NO_REPARENT) { 697 + parent = clk->parent; 698 + if (clk->flags & CLK_SET_RATE_PARENT) 699 + best = __clk_round_rate(parent, rate); 700 + else if (parent) 701 + best = __clk_get_rate(parent); 702 + else 703 + best = __clk_get_rate(clk); 704 + goto out; 705 + } 706 + 707 + /* find the parent that can provide the fastest rate <= rate */ 708 + num_parents = clk->num_parents; 709 + for (i = 0; i < num_parents; i++) { 710 + parent = clk_get_parent_by_index(clk, i); 711 + if (!parent) 712 + continue; 713 + if (clk->flags & CLK_SET_RATE_PARENT) 714 + parent_rate = __clk_round_rate(parent, rate); 715 + else 716 + parent_rate = __clk_get_rate(parent); 717 + if (parent_rate <= rate && parent_rate > best) { 718 + best_parent = parent; 719 + best = parent_rate; 720 + } 721 + } 722 + 723 + out: 724 + if (best_parent) 725 + *best_parent_p = best_parent; 726 + *best_parent_rate = best; 727 + 728 + return best; 729 + } 730 + 695 731 /*** clk api ***/ 696 732 697 733 void __clk_unprepare(struct clk *clk) ··· 764 702 765 703 /** 766 704 * clk_unprepare - undo preparation of a clock source 767 - * @clk: the clk being unprepare 705 + * @clk: the clk being unprepared 768 706 * 769 707 * clk_unprepare may sleep, which differentiates it from clk_disable. In a 770 708 * simple case, clk_unprepare can be used instead of clk_disable to gate a clk ··· 931 869 /** 932 870 * __clk_round_rate - round the given rate for a clk 933 871 * @clk: round the rate of this clock 872 + * @rate: the rate which is to be rounded 934 873 * 935 874 * Caller must hold prepare_lock. Useful for clk_ops such as .set_rate 936 875 */ 937 876 unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) 938 877 { 939 878 unsigned long parent_rate = 0; 879 + struct clk *parent; 940 880 941 881 if (!clk) 942 882 return 0; 943 883 944 - if (!clk->ops->round_rate) { 945 - if (clk->flags & CLK_SET_RATE_PARENT) 946 - return __clk_round_rate(clk->parent, rate); 947 - else 948 - return clk->rate; 949 - } 884 + parent = clk->parent; 885 + if (parent) 886 + parent_rate = parent->rate; 950 887 951 - if (clk->parent) 952 - parent_rate = clk->parent->rate; 953 - 954 - return clk->ops->round_rate(clk->hw, rate, &parent_rate); 888 + if (clk->ops->determine_rate) 889 + return clk->ops->determine_rate(clk->hw, rate, &parent_rate, 890 + &parent); 891 + else if (clk->ops->round_rate) 892 + return clk->ops->round_rate(clk->hw, rate, &parent_rate); 893 + else if (clk->flags & CLK_SET_RATE_PARENT) 894 + return __clk_round_rate(clk->parent, rate); 895 + else 896 + return clk->rate; 955 897 } 956 898 957 899 /** ··· 1022 956 * 1023 957 * Walks the subtree of clks starting with clk and recalculates rates as it 1024 958 * goes. Note that if a clk does not implement the .recalc_rate callback then 1025 - * it is assumed that the clock will take on the rate of it's parent. 959 + * it is assumed that the clock will take on the rate of its parent. 1026 960 * 1027 961 * clk_recalc_rates also propagates the POST_RATE_CHANGE notification, 1028 962 * if necessary. ··· 1080 1014 } 1081 1015 EXPORT_SYMBOL_GPL(clk_get_rate); 1082 1016 1017 + static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent) 1018 + { 1019 + u8 i; 1020 + 1021 + if (!clk->parents) 1022 + clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), 1023 + GFP_KERNEL); 1024 + 1025 + /* 1026 + * find index of new parent clock using cached parent ptrs, 1027 + * or if not yet cached, use string name comparison and cache 1028 + * them now to avoid future calls to __clk_lookup. 1029 + */ 1030 + for (i = 0; i < clk->num_parents; i++) { 1031 + if (clk->parents && clk->parents[i] == parent) 1032 + break; 1033 + else if (!strcmp(clk->parent_names[i], parent->name)) { 1034 + if (clk->parents) 1035 + clk->parents[i] = __clk_lookup(parent->name); 1036 + break; 1037 + } 1038 + } 1039 + 1040 + return i; 1041 + } 1042 + 1043 + static void clk_reparent(struct clk *clk, struct clk *new_parent) 1044 + { 1045 + hlist_del(&clk->child_node); 1046 + 1047 + if (new_parent) { 1048 + /* avoid duplicate POST_RATE_CHANGE notifications */ 1049 + if (new_parent->new_child == clk) 1050 + new_parent->new_child = NULL; 1051 + 1052 + hlist_add_head(&clk->child_node, &new_parent->children); 1053 + } else { 1054 + hlist_add_head(&clk->child_node, &clk_orphan_list); 1055 + } 1056 + 1057 + clk->parent = new_parent; 1058 + } 1059 + 1060 + static int __clk_set_parent(struct clk *clk, struct clk *parent, u8 p_index) 1061 + { 1062 + unsigned long flags; 1063 + int ret = 0; 1064 + struct clk *old_parent = clk->parent; 1065 + 1066 + /* 1067 + * Migrate prepare state between parents and prevent race with 1068 + * clk_enable(). 1069 + * 1070 + * If the clock is not prepared, then a race with 1071 + * clk_enable/disable() is impossible since we already have the 1072 + * prepare lock (future calls to clk_enable() need to be preceded by 1073 + * a clk_prepare()). 1074 + * 1075 + * If the clock is prepared, migrate the prepared state to the new 1076 + * parent and also protect against a race with clk_enable() by 1077 + * forcing the clock and the new parent on. This ensures that all 1078 + * future calls to clk_enable() are practically NOPs with respect to 1079 + * hardware and software states. 1080 + * 1081 + * See also: Comment for clk_set_parent() below. 1082 + */ 1083 + if (clk->prepare_count) { 1084 + __clk_prepare(parent); 1085 + clk_enable(parent); 1086 + clk_enable(clk); 1087 + } 1088 + 1089 + /* update the clk tree topology */ 1090 + flags = clk_enable_lock(); 1091 + clk_reparent(clk, parent); 1092 + clk_enable_unlock(flags); 1093 + 1094 + /* change clock input source */ 1095 + if (parent && clk->ops->set_parent) 1096 + ret = clk->ops->set_parent(clk->hw, p_index); 1097 + 1098 + if (ret) { 1099 + flags = clk_enable_lock(); 1100 + clk_reparent(clk, old_parent); 1101 + clk_enable_unlock(flags); 1102 + 1103 + if (clk->prepare_count) { 1104 + clk_disable(clk); 1105 + clk_disable(parent); 1106 + __clk_unprepare(parent); 1107 + } 1108 + return ret; 1109 + } 1110 + 1111 + /* 1112 + * Finish the migration of prepare state and undo the changes done 1113 + * for preventing a race with clk_enable(). 1114 + */ 1115 + if (clk->prepare_count) { 1116 + clk_disable(clk); 1117 + clk_disable(old_parent); 1118 + __clk_unprepare(old_parent); 1119 + } 1120 + 1121 + /* update debugfs with new clk tree topology */ 1122 + clk_debug_reparent(clk, parent); 1123 + return 0; 1124 + } 1125 + 1083 1126 /** 1084 1127 * __clk_speculate_rates 1085 1128 * @clk: first clk in the subtree ··· 1201 1026 * pre-rate change notifications and returns early if no clks in the 1202 1027 * subtree have subscribed to the notifications. Note that if a clk does not 1203 1028 * implement the .recalc_rate callback then it is assumed that the clock will 1204 - * take on the rate of it's parent. 1029 + * take on the rate of its parent. 1205 1030 * 1206 1031 * Caller must hold prepare_lock. 1207 1032 */ ··· 1233 1058 return ret; 1234 1059 } 1235 1060 1236 - static void clk_calc_subtree(struct clk *clk, unsigned long new_rate) 1061 + static void clk_calc_subtree(struct clk *clk, unsigned long new_rate, 1062 + struct clk *new_parent, u8 p_index) 1237 1063 { 1238 1064 struct clk *child; 1239 1065 1240 1066 clk->new_rate = new_rate; 1067 + clk->new_parent = new_parent; 1068 + clk->new_parent_index = p_index; 1069 + /* include clk in new parent's PRE_RATE_CHANGE notifications */ 1070 + clk->new_child = NULL; 1071 + if (new_parent && new_parent != clk->parent) 1072 + new_parent->new_child = clk; 1241 1073 1242 1074 hlist_for_each_entry(child, &clk->children, child_node) { 1243 1075 if (child->ops->recalc_rate) 1244 1076 child->new_rate = child->ops->recalc_rate(child->hw, new_rate); 1245 1077 else 1246 1078 child->new_rate = new_rate; 1247 - clk_calc_subtree(child, child->new_rate); 1079 + clk_calc_subtree(child, child->new_rate, NULL, 0); 1248 1080 } 1249 1081 } 1250 1082 ··· 1262 1080 static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) 1263 1081 { 1264 1082 struct clk *top = clk; 1083 + struct clk *old_parent, *parent; 1265 1084 unsigned long best_parent_rate = 0; 1266 1085 unsigned long new_rate; 1086 + u8 p_index = 0; 1267 1087 1268 1088 /* sanity */ 1269 1089 if (IS_ERR_OR_NULL(clk)) 1270 1090 return NULL; 1271 1091 1272 1092 /* save parent rate, if it exists */ 1273 - if (clk->parent) 1274 - best_parent_rate = clk->parent->rate; 1093 + parent = old_parent = clk->parent; 1094 + if (parent) 1095 + best_parent_rate = parent->rate; 1275 1096 1276 - /* never propagate up to the parent */ 1277 - if (!(clk->flags & CLK_SET_RATE_PARENT)) { 1278 - if (!clk->ops->round_rate) { 1279 - clk->new_rate = clk->rate; 1280 - return NULL; 1281 - } 1282 - new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); 1097 + /* find the closest rate and parent clk/rate */ 1098 + if (clk->ops->determine_rate) { 1099 + new_rate = clk->ops->determine_rate(clk->hw, rate, 1100 + &best_parent_rate, 1101 + &parent); 1102 + } else if (clk->ops->round_rate) { 1103 + new_rate = clk->ops->round_rate(clk->hw, rate, 1104 + &best_parent_rate); 1105 + } else if (!parent || !(clk->flags & CLK_SET_RATE_PARENT)) { 1106 + /* pass-through clock without adjustable parent */ 1107 + clk->new_rate = clk->rate; 1108 + return NULL; 1109 + } else { 1110 + /* pass-through clock with adjustable parent */ 1111 + top = clk_calc_new_rates(parent, rate); 1112 + new_rate = parent->new_rate; 1283 1113 goto out; 1284 1114 } 1285 1115 1286 - /* need clk->parent from here on out */ 1287 - if (!clk->parent) { 1288 - pr_debug("%s: %s has NULL parent\n", __func__, clk->name); 1116 + /* some clocks must be gated to change parent */ 1117 + if (parent != old_parent && 1118 + (clk->flags & CLK_SET_PARENT_GATE) && clk->prepare_count) { 1119 + pr_debug("%s: %s not gated but wants to reparent\n", 1120 + __func__, clk->name); 1289 1121 return NULL; 1290 1122 } 1291 1123 1292 - if (!clk->ops->round_rate) { 1293 - top = clk_calc_new_rates(clk->parent, rate); 1294 - new_rate = clk->parent->new_rate; 1295 - 1296 - goto out; 1124 + /* try finding the new parent index */ 1125 + if (parent) { 1126 + p_index = clk_fetch_parent_index(clk, parent); 1127 + if (p_index == clk->num_parents) { 1128 + pr_debug("%s: clk %s can not be parent of clk %s\n", 1129 + __func__, parent->name, clk->name); 1130 + return NULL; 1131 + } 1297 1132 } 1298 1133 1299 - new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); 1300 - 1301 - if (best_parent_rate != clk->parent->rate) { 1302 - top = clk_calc_new_rates(clk->parent, best_parent_rate); 1303 - 1304 - goto out; 1305 - } 1134 + if ((clk->flags & CLK_SET_RATE_PARENT) && parent && 1135 + best_parent_rate != parent->rate) 1136 + top = clk_calc_new_rates(parent, best_parent_rate); 1306 1137 1307 1138 out: 1308 - clk_calc_subtree(clk, new_rate); 1139 + clk_calc_subtree(clk, new_rate, parent, p_index); 1309 1140 1310 1141 return top; 1311 1142 } ··· 1330 1135 */ 1331 1136 static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long event) 1332 1137 { 1333 - struct clk *child, *fail_clk = NULL; 1138 + struct clk *child, *tmp_clk, *fail_clk = NULL; 1334 1139 int ret = NOTIFY_DONE; 1335 1140 1336 1141 if (clk->rate == clk->new_rate) ··· 1343 1148 } 1344 1149 1345 1150 hlist_for_each_entry(child, &clk->children, child_node) { 1346 - clk = clk_propagate_rate_change(child, event); 1347 - if (clk) 1348 - fail_clk = clk; 1151 + /* Skip children who will be reparented to another clock */ 1152 + if (child->new_parent && child->new_parent != clk) 1153 + continue; 1154 + tmp_clk = clk_propagate_rate_change(child, event); 1155 + if (tmp_clk) 1156 + fail_clk = tmp_clk; 1157 + } 1158 + 1159 + /* handle the new child who might not be in clk->children yet */ 1160 + if (clk->new_child) { 1161 + tmp_clk = clk_propagate_rate_change(clk->new_child, event); 1162 + if (tmp_clk) 1163 + fail_clk = tmp_clk; 1349 1164 } 1350 1165 1351 1166 return fail_clk; ··· 1373 1168 1374 1169 old_rate = clk->rate; 1375 1170 1171 + /* set parent */ 1172 + if (clk->new_parent && clk->new_parent != clk->parent) 1173 + __clk_set_parent(clk, clk->new_parent, clk->new_parent_index); 1174 + 1376 1175 if (clk->parent) 1377 1176 best_parent_rate = clk->parent->rate; 1378 1177 ··· 1391 1182 if (clk->notifier_count && old_rate != clk->rate) 1392 1183 __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); 1393 1184 1394 - hlist_for_each_entry(child, &clk->children, child_node) 1185 + hlist_for_each_entry(child, &clk->children, child_node) { 1186 + /* Skip children who will be reparented to another clock */ 1187 + if (child->new_parent && child->new_parent != clk) 1188 + continue; 1395 1189 clk_change_rate(child); 1190 + } 1191 + 1192 + /* handle the new child who might not be in clk->children yet */ 1193 + if (clk->new_child) 1194 + clk_change_rate(clk->new_child); 1396 1195 } 1397 1196 1398 1197 /** ··· 1415 1198 * outcome of clk's .round_rate implementation. If *parent_rate is unchanged 1416 1199 * after calling .round_rate then upstream parent propagation is ignored. If 1417 1200 * *parent_rate comes back with a new rate for clk's parent then we propagate 1418 - * up to clk's parent and set it's rate. Upward propagation will continue 1201 + * up to clk's parent and set its rate. Upward propagation will continue 1419 1202 * until either a clk does not support the CLK_SET_RATE_PARENT flag or 1420 1203 * .round_rate stops requesting changes to clk's parent_rate. 1421 1204 * ··· 1428 1211 { 1429 1212 struct clk *top, *fail_clk; 1430 1213 int ret = 0; 1214 + 1215 + if (!clk) 1216 + return 0; 1431 1217 1432 1218 /* prevent racing with updates to the clock topology */ 1433 1219 clk_prepare_lock(); ··· 1535 1315 kzalloc((sizeof(struct clk*) * clk->num_parents), 1536 1316 GFP_KERNEL); 1537 1317 1538 - if (!clk->parents) 1539 - ret = __clk_lookup(clk->parent_names[index]); 1540 - else if (!clk->parents[index]) 1541 - ret = clk->parents[index] = 1542 - __clk_lookup(clk->parent_names[index]); 1543 - else 1544 - ret = clk->parents[index]; 1318 + ret = clk_get_parent_by_index(clk, index); 1545 1319 1546 1320 out: 1547 1321 return ret; 1548 - } 1549 - 1550 - static void clk_reparent(struct clk *clk, struct clk *new_parent) 1551 - { 1552 - hlist_del(&clk->child_node); 1553 - 1554 - if (new_parent) 1555 - hlist_add_head(&clk->child_node, &new_parent->children); 1556 - else 1557 - hlist_add_head(&clk->child_node, &clk_orphan_list); 1558 - 1559 - clk->parent = new_parent; 1560 1322 } 1561 1323 1562 1324 void __clk_reparent(struct clk *clk, struct clk *new_parent) ··· 1546 1344 clk_reparent(clk, new_parent); 1547 1345 clk_debug_reparent(clk, new_parent); 1548 1346 __clk_recalc_rates(clk, POST_RATE_CHANGE); 1549 - } 1550 - 1551 - static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent) 1552 - { 1553 - u8 i; 1554 - 1555 - if (!clk->parents) 1556 - clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), 1557 - GFP_KERNEL); 1558 - 1559 - /* 1560 - * find index of new parent clock using cached parent ptrs, 1561 - * or if not yet cached, use string name comparison and cache 1562 - * them now to avoid future calls to __clk_lookup. 1563 - */ 1564 - for (i = 0; i < clk->num_parents; i++) { 1565 - if (clk->parents && clk->parents[i] == parent) 1566 - break; 1567 - else if (!strcmp(clk->parent_names[i], parent->name)) { 1568 - if (clk->parents) 1569 - clk->parents[i] = __clk_lookup(parent->name); 1570 - break; 1571 - } 1572 - } 1573 - 1574 - return i; 1575 - } 1576 - 1577 - static int __clk_set_parent(struct clk *clk, struct clk *parent, u8 p_index) 1578 - { 1579 - unsigned long flags; 1580 - int ret = 0; 1581 - struct clk *old_parent = clk->parent; 1582 - 1583 - /* 1584 - * Migrate prepare state between parents and prevent race with 1585 - * clk_enable(). 1586 - * 1587 - * If the clock is not prepared, then a race with 1588 - * clk_enable/disable() is impossible since we already have the 1589 - * prepare lock (future calls to clk_enable() need to be preceded by 1590 - * a clk_prepare()). 1591 - * 1592 - * If the clock is prepared, migrate the prepared state to the new 1593 - * parent and also protect against a race with clk_enable() by 1594 - * forcing the clock and the new parent on. This ensures that all 1595 - * future calls to clk_enable() are practically NOPs with respect to 1596 - * hardware and software states. 1597 - * 1598 - * See also: Comment for clk_set_parent() below. 1599 - */ 1600 - if (clk->prepare_count) { 1601 - __clk_prepare(parent); 1602 - clk_enable(parent); 1603 - clk_enable(clk); 1604 - } 1605 - 1606 - /* update the clk tree topology */ 1607 - flags = clk_enable_lock(); 1608 - clk_reparent(clk, parent); 1609 - clk_enable_unlock(flags); 1610 - 1611 - /* change clock input source */ 1612 - if (parent && clk->ops->set_parent) 1613 - ret = clk->ops->set_parent(clk->hw, p_index); 1614 - 1615 - if (ret) { 1616 - flags = clk_enable_lock(); 1617 - clk_reparent(clk, old_parent); 1618 - clk_enable_unlock(flags); 1619 - 1620 - if (clk->prepare_count) { 1621 - clk_disable(clk); 1622 - clk_disable(parent); 1623 - __clk_unprepare(parent); 1624 - } 1625 - return ret; 1626 - } 1627 - 1628 - /* 1629 - * Finish the migration of prepare state and undo the changes done 1630 - * for preventing a race with clk_enable(). 1631 - */ 1632 - if (clk->prepare_count) { 1633 - clk_disable(clk); 1634 - clk_disable(old_parent); 1635 - __clk_unprepare(old_parent); 1636 - } 1637 - 1638 - /* update debugfs with new clk tree topology */ 1639 - clk_debug_reparent(clk, parent); 1640 - return 0; 1641 1347 } 1642 1348 1643 1349 /** ··· 1571 1461 u8 p_index = 0; 1572 1462 unsigned long p_rate = 0; 1573 1463 1574 - if (!clk || !clk->ops) 1464 + if (!clk) 1465 + return 0; 1466 + 1467 + if (!clk->ops) 1575 1468 return -EINVAL; 1576 1469 1577 1470 /* verify ops for for multi-parent clks */ ··· 1657 1544 1658 1545 /* check that clk_ops are sane. See Documentation/clk.txt */ 1659 1546 if (clk->ops->set_rate && 1660 - !(clk->ops->round_rate && clk->ops->recalc_rate)) { 1661 - pr_warning("%s: %s must implement .round_rate & .recalc_rate\n", 1547 + !((clk->ops->round_rate || clk->ops->determine_rate) && 1548 + clk->ops->recalc_rate)) { 1549 + pr_warning("%s: %s must implement .round_rate or .determine_rate in addition to .recalc_rate\n", 1662 1550 __func__, clk->name); 1663 1551 ret = -EINVAL; 1664 1552 goto out; ··· 1742 1628 * this clock 1743 1629 */ 1744 1630 hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { 1745 - if (orphan->ops->get_parent) { 1631 + if (orphan->num_parents && orphan->ops->get_parent) { 1746 1632 i = orphan->ops->get_parent(orphan->hw); 1747 1633 if (!strcmp(clk->name, orphan->parent_names[i])) 1748 1634 __clk_reparent(orphan, clk); ··· 1762 1648 * The .init callback is not used by any of the basic clock types, but 1763 1649 * exists for weird hardware that must perform initialization magic. 1764 1650 * Please consider other ways of solving initialization problems before 1765 - * using this callback, as it's use is discouraged. 1651 + * using this callback, as its use is discouraged. 1766 1652 */ 1767 1653 if (clk->ops->init) 1768 1654 clk->ops->init(clk->hw); ··· 1789 1675 * very large numbers of clocks that need to be statically initialized. It is 1790 1676 * a layering violation to include clk-private.h from any code which implements 1791 1677 * a clock's .ops; as such any statically initialized clock data MUST be in a 1792 - * separate C file from the logic that implements it's operations. Returns 0 1678 + * separate C file from the logic that implements its operations. Returns 0 1793 1679 * on success, otherwise an error code. 1794 1680 */ 1795 1681 struct clk *__clk_register(struct device *dev, struct clk_hw *hw) ··· 2229 2115 */ 2230 2116 void __init of_clk_init(const struct of_device_id *matches) 2231 2117 { 2118 + const struct of_device_id *match; 2232 2119 struct device_node *np; 2233 2120 2234 2121 if (!matches) 2235 2122 matches = __clk_of_table; 2236 2123 2237 - for_each_matching_node(np, matches) { 2238 - const struct of_device_id *match = of_match_node(matches, np); 2124 + for_each_matching_node_and_match(np, matches, &match) { 2239 2125 of_clk_init_cb_t clk_init_cb = match->data; 2240 2126 clk_init_cb(np); 2241 2127 }
+26 -13
drivers/clk/mmp/clk-mmp2.c
··· 248 248 clk_register_clkdev(clk, NULL, "mmp2-pwm.3"); 249 249 250 250 clk = clk_register_mux(NULL, "uart0_mux", uart_parent, 251 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 251 + ARRAY_SIZE(uart_parent), 252 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 252 253 apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); 253 254 clk_set_parent(clk, vctcxo); 254 255 clk_register_clkdev(clk, "uart_mux.0", NULL); ··· 259 258 clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); 260 259 261 260 clk = clk_register_mux(NULL, "uart1_mux", uart_parent, 262 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 261 + ARRAY_SIZE(uart_parent), 262 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 263 263 apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); 264 264 clk_set_parent(clk, vctcxo); 265 265 clk_register_clkdev(clk, "uart_mux.1", NULL); ··· 270 268 clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); 271 269 272 270 clk = clk_register_mux(NULL, "uart2_mux", uart_parent, 273 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 271 + ARRAY_SIZE(uart_parent), 272 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 274 273 apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); 275 274 clk_set_parent(clk, vctcxo); 276 275 clk_register_clkdev(clk, "uart_mux.2", NULL); ··· 281 278 clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); 282 279 283 280 clk = clk_register_mux(NULL, "uart3_mux", uart_parent, 284 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 281 + ARRAY_SIZE(uart_parent), 282 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 285 283 apbc_base + APBC_UART3, 4, 3, 0, &clk_lock); 286 284 clk_set_parent(clk, vctcxo); 287 285 clk_register_clkdev(clk, "uart_mux.3", NULL); ··· 292 288 clk_register_clkdev(clk, NULL, "pxa2xx-uart.3"); 293 289 294 290 clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, 295 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 291 + ARRAY_SIZE(ssp_parent), 292 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 296 293 apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); 297 294 clk_register_clkdev(clk, "uart_mux.0", NULL); 298 295 ··· 302 297 clk_register_clkdev(clk, NULL, "mmp-ssp.0"); 303 298 304 299 clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, 305 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 300 + ARRAY_SIZE(ssp_parent), 301 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 306 302 apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); 307 303 clk_register_clkdev(clk, "ssp_mux.1", NULL); 308 304 ··· 312 306 clk_register_clkdev(clk, NULL, "mmp-ssp.1"); 313 307 314 308 clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, 315 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 309 + ARRAY_SIZE(ssp_parent), 310 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 316 311 apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); 317 312 clk_register_clkdev(clk, "ssp_mux.2", NULL); 318 313 ··· 322 315 clk_register_clkdev(clk, NULL, "mmp-ssp.2"); 323 316 324 317 clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, 325 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 318 + ARRAY_SIZE(ssp_parent), 319 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 326 320 apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); 327 321 clk_register_clkdev(clk, "ssp_mux.3", NULL); 328 322 ··· 332 324 clk_register_clkdev(clk, NULL, "mmp-ssp.3"); 333 325 334 326 clk = clk_register_mux(NULL, "sdh_mux", sdh_parent, 335 - ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, 327 + ARRAY_SIZE(sdh_parent), 328 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 336 329 apmu_base + APMU_SDH0, 8, 2, 0, &clk_lock); 337 330 clk_register_clkdev(clk, "sdh_mux", NULL); 338 331 ··· 363 354 clk_register_clkdev(clk, "usb_clk", NULL); 364 355 365 356 clk = clk_register_mux(NULL, "disp0_mux", disp_parent, 366 - ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, 357 + ARRAY_SIZE(disp_parent), 358 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 367 359 apmu_base + APMU_DISP0, 6, 2, 0, &clk_lock); 368 360 clk_register_clkdev(clk, "disp_mux.0", NULL); 369 361 ··· 386 376 clk_register_clkdev(clk, "disp_sphy.0", NULL); 387 377 388 378 clk = clk_register_mux(NULL, "disp1_mux", disp_parent, 389 - ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, 379 + ARRAY_SIZE(disp_parent), 380 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 390 381 apmu_base + APMU_DISP1, 6, 2, 0, &clk_lock); 391 382 clk_register_clkdev(clk, "disp_mux.1", NULL); 392 383 ··· 405 394 clk_register_clkdev(clk, "ccic_arbiter", NULL); 406 395 407 396 clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, 408 - ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, 397 + ARRAY_SIZE(ccic_parent), 398 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 409 399 apmu_base + APMU_CCIC0, 6, 2, 0, &clk_lock); 410 400 clk_register_clkdev(clk, "ccic_mux.0", NULL); 411 401 ··· 433 421 clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0"); 434 422 435 423 clk = clk_register_mux(NULL, "ccic1_mux", ccic_parent, 436 - ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, 424 + ARRAY_SIZE(ccic_parent), 425 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 437 426 apmu_base + APMU_CCIC1, 6, 2, 0, &clk_lock); 438 427 clk_register_clkdev(clk, "ccic_mux.1", NULL); 439 428
+26 -14
drivers/clk/mmp/clk-pxa168.c
··· 199 199 clk_register_clkdev(clk, NULL, "pxa168-pwm.3"); 200 200 201 201 clk = clk_register_mux(NULL, "uart0_mux", uart_parent, 202 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 202 + ARRAY_SIZE(uart_parent), 203 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 203 204 apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); 204 205 clk_set_parent(clk, uart_pll); 205 206 clk_register_clkdev(clk, "uart_mux.0", NULL); ··· 210 209 clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); 211 210 212 211 clk = clk_register_mux(NULL, "uart1_mux", uart_parent, 213 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 212 + ARRAY_SIZE(uart_parent), 213 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 214 214 apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); 215 215 clk_set_parent(clk, uart_pll); 216 216 clk_register_clkdev(clk, "uart_mux.1", NULL); ··· 221 219 clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); 222 220 223 221 clk = clk_register_mux(NULL, "uart2_mux", uart_parent, 224 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 222 + ARRAY_SIZE(uart_parent), 223 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 225 224 apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); 226 225 clk_set_parent(clk, uart_pll); 227 226 clk_register_clkdev(clk, "uart_mux.2", NULL); ··· 232 229 clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); 233 230 234 231 clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, 235 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 232 + ARRAY_SIZE(ssp_parent), 233 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 236 234 apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); 237 235 clk_register_clkdev(clk, "uart_mux.0", NULL); 238 236 ··· 242 238 clk_register_clkdev(clk, NULL, "mmp-ssp.0"); 243 239 244 240 clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, 245 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 241 + ARRAY_SIZE(ssp_parent), 242 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 246 243 apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); 247 244 clk_register_clkdev(clk, "ssp_mux.1", NULL); 248 245 ··· 252 247 clk_register_clkdev(clk, NULL, "mmp-ssp.1"); 253 248 254 249 clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, 255 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 250 + ARRAY_SIZE(ssp_parent), 251 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 256 252 apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); 257 253 clk_register_clkdev(clk, "ssp_mux.2", NULL); 258 254 ··· 262 256 clk_register_clkdev(clk, NULL, "mmp-ssp.2"); 263 257 264 258 clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, 265 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 259 + ARRAY_SIZE(ssp_parent), 260 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 266 261 apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); 267 262 clk_register_clkdev(clk, "ssp_mux.3", NULL); 268 263 ··· 272 265 clk_register_clkdev(clk, NULL, "mmp-ssp.3"); 273 266 274 267 clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent, 275 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 268 + ARRAY_SIZE(ssp_parent), 269 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 276 270 apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock); 277 271 clk_register_clkdev(clk, "ssp_mux.4", NULL); 278 272 ··· 286 278 clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); 287 279 288 280 clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, 289 - ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, 281 + ARRAY_SIZE(sdh_parent), 282 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 290 283 apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); 291 284 clk_register_clkdev(clk, "sdh0_mux", NULL); 292 285 ··· 296 287 clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); 297 288 298 289 clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, 299 - ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, 290 + ARRAY_SIZE(sdh_parent), 291 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 300 292 apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); 301 293 clk_register_clkdev(clk, "sdh1_mux", NULL); 302 294 ··· 314 304 clk_register_clkdev(clk, "sph_clk", NULL); 315 305 316 306 clk = clk_register_mux(NULL, "disp0_mux", disp_parent, 317 - ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, 307 + ARRAY_SIZE(disp_parent), 308 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 318 309 apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); 319 310 clk_register_clkdev(clk, "disp_mux.0", NULL); 320 311 ··· 328 317 clk_register_clkdev(clk, "hclk", "mmp-disp.0"); 329 318 330 319 clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, 331 - ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, 320 + ARRAY_SIZE(ccic_parent), 321 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 332 322 apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); 333 323 clk_register_clkdev(clk, "ccic_mux.0", NULL); 334 324 ··· 339 327 340 328 clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, 341 329 ARRAY_SIZE(ccic_phy_parent), 342 - CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, 343 - 7, 1, 0, &clk_lock); 330 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 331 + apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock); 344 332 clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); 345 333 346 334 clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
+20 -11
drivers/clk/mmp/clk-pxa910.c
··· 204 204 clk_register_clkdev(clk, NULL, "pxa910-pwm.3"); 205 205 206 206 clk = clk_register_mux(NULL, "uart0_mux", uart_parent, 207 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 207 + ARRAY_SIZE(uart_parent), 208 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 208 209 apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); 209 210 clk_set_parent(clk, uart_pll); 210 211 clk_register_clkdev(clk, "uart_mux.0", NULL); ··· 215 214 clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); 216 215 217 216 clk = clk_register_mux(NULL, "uart1_mux", uart_parent, 218 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 217 + ARRAY_SIZE(uart_parent), 218 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 219 219 apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); 220 220 clk_set_parent(clk, uart_pll); 221 221 clk_register_clkdev(clk, "uart_mux.1", NULL); ··· 226 224 clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); 227 225 228 226 clk = clk_register_mux(NULL, "uart2_mux", uart_parent, 229 - ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, 227 + ARRAY_SIZE(uart_parent), 228 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 230 229 apbcp_base + APBCP_UART2, 4, 3, 0, &clk_lock); 231 230 clk_set_parent(clk, uart_pll); 232 231 clk_register_clkdev(clk, "uart_mux.2", NULL); ··· 237 234 clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); 238 235 239 236 clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, 240 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 237 + ARRAY_SIZE(ssp_parent), 238 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 241 239 apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); 242 240 clk_register_clkdev(clk, "uart_mux.0", NULL); 243 241 ··· 247 243 clk_register_clkdev(clk, NULL, "mmp-ssp.0"); 248 244 249 245 clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, 250 - ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, 246 + ARRAY_SIZE(ssp_parent), 247 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 251 248 apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); 252 249 clk_register_clkdev(clk, "ssp_mux.1", NULL); 253 250 ··· 261 256 clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); 262 257 263 258 clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, 264 - ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, 259 + ARRAY_SIZE(sdh_parent), 260 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 265 261 apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); 266 262 clk_register_clkdev(clk, "sdh0_mux", NULL); 267 263 ··· 271 265 clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); 272 266 273 267 clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, 274 - ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, 268 + ARRAY_SIZE(sdh_parent), 269 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 275 270 apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); 276 271 clk_register_clkdev(clk, "sdh1_mux", NULL); 277 272 ··· 289 282 clk_register_clkdev(clk, "sph_clk", NULL); 290 283 291 284 clk = clk_register_mux(NULL, "disp0_mux", disp_parent, 292 - ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, 285 + ARRAY_SIZE(disp_parent), 286 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 293 287 apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); 294 288 clk_register_clkdev(clk, "disp_mux.0", NULL); 295 289 ··· 299 291 clk_register_clkdev(clk, NULL, "mmp-disp.0"); 300 292 301 293 clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, 302 - ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, 294 + ARRAY_SIZE(ccic_parent), 295 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 303 296 apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); 304 297 clk_register_clkdev(clk, "ccic_mux.0", NULL); 305 298 ··· 310 301 311 302 clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, 312 303 ARRAY_SIZE(ccic_phy_parent), 313 - CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, 314 - 7, 1, 0, &clk_lock); 304 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 305 + apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock); 315 306 clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); 316 307 317 308 clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
+7 -7
drivers/clk/mvebu/armada-370.c
··· 32 32 33 33 enum { A370_CPU_TO_NBCLK, A370_CPU_TO_HCLK, A370_CPU_TO_DRAMCLK }; 34 34 35 - static const struct coreclk_ratio __initconst a370_coreclk_ratios[] = { 35 + static const struct coreclk_ratio a370_coreclk_ratios[] __initconst = { 36 36 { .id = A370_CPU_TO_NBCLK, .name = "nbclk" }, 37 37 { .id = A370_CPU_TO_HCLK, .name = "hclk" }, 38 38 { .id = A370_CPU_TO_DRAMCLK, .name = "dramclk" }, 39 39 }; 40 40 41 - static const u32 __initconst a370_tclk_freqs[] = { 41 + static const u32 a370_tclk_freqs[] __initconst = { 42 42 16600000, 43 43 20000000, 44 44 }; ··· 52 52 return a370_tclk_freqs[tclk_freq_select]; 53 53 } 54 54 55 - static const u32 __initconst a370_cpu_freqs[] = { 55 + static const u32 a370_cpu_freqs[] __initconst = { 56 56 400000000, 57 57 533000000, 58 58 667000000, ··· 78 78 return cpu_freq; 79 79 } 80 80 81 - static const int __initconst a370_nbclk_ratios[32][2] = { 81 + static const int a370_nbclk_ratios[32][2] __initconst = { 82 82 {0, 1}, {1, 2}, {2, 2}, {2, 2}, 83 83 {1, 2}, {1, 2}, {1, 1}, {2, 3}, 84 84 {0, 1}, {1, 2}, {2, 4}, {0, 1}, ··· 89 89 {0, 1}, {0, 1}, {0, 1}, {0, 1}, 90 90 }; 91 91 92 - static const int __initconst a370_hclk_ratios[32][2] = { 92 + static const int a370_hclk_ratios[32][2] __initconst = { 93 93 {0, 1}, {1, 2}, {2, 6}, {2, 3}, 94 94 {1, 3}, {1, 4}, {1, 2}, {2, 6}, 95 95 {0, 1}, {1, 6}, {2, 10}, {0, 1}, ··· 100 100 {0, 1}, {0, 1}, {0, 1}, {0, 1}, 101 101 }; 102 102 103 - static const int __initconst a370_dramclk_ratios[32][2] = { 103 + static const int a370_dramclk_ratios[32][2] __initconst = { 104 104 {0, 1}, {1, 2}, {2, 3}, {2, 3}, 105 105 {1, 3}, {1, 2}, {1, 2}, {2, 6}, 106 106 {0, 1}, {1, 3}, {2, 5}, {0, 1}, ··· 152 152 * Clock Gating Control 153 153 */ 154 154 155 - static const struct clk_gating_soc_desc __initconst a370_gating_desc[] = { 155 + static const struct clk_gating_soc_desc a370_gating_desc[] __initconst = { 156 156 { "audio", NULL, 0, 0 }, 157 157 { "pex0_en", NULL, 1, 0 }, 158 158 { "pex1_en", NULL, 2, 0 },
+6 -6
drivers/clk/mvebu/armada-xp.c
··· 40 40 41 41 enum { AXP_CPU_TO_NBCLK, AXP_CPU_TO_HCLK, AXP_CPU_TO_DRAMCLK }; 42 42 43 - static const struct coreclk_ratio __initconst axp_coreclk_ratios[] = { 43 + static const struct coreclk_ratio axp_coreclk_ratios[] __initconst = { 44 44 { .id = AXP_CPU_TO_NBCLK, .name = "nbclk" }, 45 45 { .id = AXP_CPU_TO_HCLK, .name = "hclk" }, 46 46 { .id = AXP_CPU_TO_DRAMCLK, .name = "dramclk" }, ··· 52 52 return 250000000; 53 53 } 54 54 55 - static const u32 __initconst axp_cpu_freqs[] = { 55 + static const u32 axp_cpu_freqs[] __initconst = { 56 56 1000000000, 57 57 1066000000, 58 58 1200000000, ··· 89 89 return cpu_freq; 90 90 } 91 91 92 - static const int __initconst axp_nbclk_ratios[32][2] = { 92 + static const int axp_nbclk_ratios[32][2] __initconst = { 93 93 {0, 1}, {1, 2}, {2, 2}, {2, 2}, 94 94 {1, 2}, {1, 2}, {1, 1}, {2, 3}, 95 95 {0, 1}, {1, 2}, {2, 4}, {0, 1}, ··· 100 100 {0, 1}, {0, 1}, {0, 1}, {0, 1}, 101 101 }; 102 102 103 - static const int __initconst axp_hclk_ratios[32][2] = { 103 + static const int axp_hclk_ratios[32][2] __initconst = { 104 104 {0, 1}, {1, 2}, {2, 6}, {2, 3}, 105 105 {1, 3}, {1, 4}, {1, 2}, {2, 6}, 106 106 {0, 1}, {1, 6}, {2, 10}, {0, 1}, ··· 111 111 {0, 1}, {0, 1}, {0, 1}, {0, 1}, 112 112 }; 113 113 114 - static const int __initconst axp_dramclk_ratios[32][2] = { 114 + static const int axp_dramclk_ratios[32][2] __initconst = { 115 115 {0, 1}, {1, 2}, {2, 3}, {2, 3}, 116 116 {1, 3}, {1, 2}, {1, 2}, {2, 6}, 117 117 {0, 1}, {1, 3}, {2, 5}, {0, 1}, ··· 169 169 * Clock Gating Control 170 170 */ 171 171 172 - static const struct clk_gating_soc_desc __initconst axp_gating_desc[] = { 172 + static const struct clk_gating_soc_desc axp_gating_desc[] __initconst = { 173 173 { "audio", NULL, 0, 0 }, 174 174 { "ge3", NULL, 1, 0 }, 175 175 { "ge2", NULL, 2, 0 },
+3 -1
drivers/clk/mvebu/clk-cpu.c
··· 119 119 120 120 cpuclk = kzalloc(ncpus * sizeof(*cpuclk), GFP_KERNEL); 121 121 if (WARN_ON(!cpuclk)) 122 - return; 122 + goto cpuclk_out; 123 123 124 124 clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL); 125 125 if (WARN_ON(!clks)) ··· 170 170 kfree(cpuclk[ncpus].clk_name); 171 171 clks_out: 172 172 kfree(cpuclk); 173 + cpuclk_out: 174 + iounmap(clock_complex_base); 173 175 } 174 176 175 177 CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock",
+12 -6
drivers/clk/mvebu/common.c
··· 45 45 clk_data.clk_num = 2 + desc->num_ratios; 46 46 clk_data.clks = kzalloc(clk_data.clk_num * sizeof(struct clk *), 47 47 GFP_KERNEL); 48 - if (WARN_ON(!clk_data.clks)) 48 + if (WARN_ON(!clk_data.clks)) { 49 + iounmap(base); 49 50 return; 51 + } 50 52 51 53 /* Register TCLK */ 52 54 of_property_read_string_index(np, "clock-output-names", 0, ··· 136 134 137 135 ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); 138 136 if (WARN_ON(!ctrl)) 139 - return; 137 + goto ctrl_out; 140 138 141 139 spin_lock_init(&ctrl->lock); 142 140 ··· 147 145 ctrl->num_gates = n; 148 146 ctrl->gates = kzalloc(ctrl->num_gates * sizeof(struct clk *), 149 147 GFP_KERNEL); 150 - if (WARN_ON(!ctrl->gates)) { 151 - kfree(ctrl); 152 - return; 153 - } 148 + if (WARN_ON(!ctrl->gates)) 149 + goto gates_out; 154 150 155 151 for (n = 0; n < ctrl->num_gates; n++) { 156 152 const char *parent = ··· 160 160 } 161 161 162 162 of_clk_add_provider(np, clk_gating_get_src, ctrl); 163 + 164 + return; 165 + gates_out: 166 + kfree(ctrl); 167 + ctrl_out: 168 + iounmap(base); 163 169 }
+6 -6
drivers/clk/mvebu/dove.c
··· 74 74 75 75 enum { DOVE_CPU_TO_L2, DOVE_CPU_TO_DDR }; 76 76 77 - static const struct coreclk_ratio __initconst dove_coreclk_ratios[] = { 77 + static const struct coreclk_ratio dove_coreclk_ratios[] __initconst = { 78 78 { .id = DOVE_CPU_TO_L2, .name = "l2clk", }, 79 79 { .id = DOVE_CPU_TO_DDR, .name = "ddrclk", } 80 80 }; 81 81 82 - static const u32 __initconst dove_tclk_freqs[] = { 82 + static const u32 dove_tclk_freqs[] __initconst = { 83 83 166666667, 84 84 125000000, 85 85 0, 0 ··· 92 92 return dove_tclk_freqs[opt]; 93 93 } 94 94 95 - static const u32 __initconst dove_cpu_freqs[] = { 95 + static const u32 dove_cpu_freqs[] __initconst = { 96 96 0, 0, 0, 0, 0, 97 97 1000000000, 98 98 933333333, 933333333, ··· 111 111 return dove_cpu_freqs[opt]; 112 112 } 113 113 114 - static const int __initconst dove_cpu_l2_ratios[8][2] = { 114 + static const int dove_cpu_l2_ratios[8][2] __initconst = { 115 115 { 1, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, 116 116 { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 } 117 117 }; 118 118 119 - static const int __initconst dove_cpu_ddr_ratios[16][2] = { 119 + static const int dove_cpu_ddr_ratios[16][2] __initconst = { 120 120 { 1, 1 }, { 0, 1 }, { 1, 2 }, { 2, 5 }, 121 121 { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 }, 122 122 { 1, 5 }, { 0, 1 }, { 1, 6 }, { 0, 1 }, ··· 164 164 * Clock Gating Control 165 165 */ 166 166 167 - static const struct clk_gating_soc_desc __initconst dove_gating_desc[] = { 167 + static const struct clk_gating_soc_desc dove_gating_desc[] __initconst = { 168 168 { "usb0", NULL, 0, 0 }, 169 169 { "usb1", NULL, 1, 0 }, 170 170 { "ge", "gephy", 2, 0 },
+7 -7
drivers/clk/mvebu/kirkwood.c
··· 78 78 79 79 enum { KIRKWOOD_CPU_TO_L2, KIRKWOOD_CPU_TO_DDR }; 80 80 81 - static const struct coreclk_ratio __initconst kirkwood_coreclk_ratios[] = { 81 + static const struct coreclk_ratio kirkwood_coreclk_ratios[] __initconst = { 82 82 { .id = KIRKWOOD_CPU_TO_L2, .name = "l2clk", }, 83 83 { .id = KIRKWOOD_CPU_TO_DDR, .name = "ddrclk", } 84 84 }; ··· 90 90 return (opt) ? 166666667 : 200000000; 91 91 } 92 92 93 - static const u32 __initconst kirkwood_cpu_freqs[] = { 93 + static const u32 kirkwood_cpu_freqs[] __initconst = { 94 94 0, 0, 0, 0, 95 95 600000000, 96 96 0, ··· 111 111 return kirkwood_cpu_freqs[opt]; 112 112 } 113 113 114 - static const int __initconst kirkwood_cpu_l2_ratios[8][2] = { 114 + static const int kirkwood_cpu_l2_ratios[8][2] __initconst = { 115 115 { 0, 1 }, { 1, 2 }, { 0, 1 }, { 1, 3 }, 116 116 { 0, 1 }, { 1, 4 }, { 0, 1 }, { 0, 1 } 117 117 }; 118 118 119 - static const int __initconst kirkwood_cpu_ddr_ratios[16][2] = { 119 + static const int kirkwood_cpu_ddr_ratios[16][2] __initconst = { 120 120 { 0, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, 121 121 { 1, 3 }, { 0, 1 }, { 1, 4 }, { 2, 9 }, 122 122 { 1, 5 }, { 1, 6 }, { 0, 1 }, { 0, 1 }, ··· 145 145 } 146 146 } 147 147 148 - static const u32 __initconst mv88f6180_cpu_freqs[] = { 148 + static const u32 mv88f6180_cpu_freqs[] __initconst = { 149 149 0, 0, 0, 0, 0, 150 150 600000000, 151 151 800000000, ··· 158 158 return mv88f6180_cpu_freqs[opt]; 159 159 } 160 160 161 - static const int __initconst mv88f6180_cpu_ddr_ratios[8][2] = { 161 + static const int mv88f6180_cpu_ddr_ratios[8][2] __initconst = { 162 162 { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 }, 163 163 { 0, 1 }, { 1, 3 }, { 1, 4 }, { 1, 5 } 164 164 }; ··· 219 219 * Clock Gating Control 220 220 */ 221 221 222 - static const struct clk_gating_soc_desc __initconst kirkwood_gating_desc[] = { 222 + static const struct clk_gating_soc_desc kirkwood_gating_desc[] __initconst = { 223 223 { "ge0", NULL, 0, 0 }, 224 224 { "pex0", NULL, 2, 0 }, 225 225 { "usb0", NULL, 3, 0 },
+1
drivers/clk/mxs/clk-imx23.c
··· 10 10 */ 11 11 12 12 #include <linux/clk.h> 13 + #include <linux/clk/mxs.h> 13 14 #include <linux/clkdev.h> 14 15 #include <linux/err.h> 15 16 #include <linux/init.h>
+2 -2
drivers/clk/mxs/clk.h
··· 52 52 u8 shift, u8 width, const char **parent_names, int num_parents) 53 53 { 54 54 return clk_register_mux(NULL, name, parent_names, num_parents, 55 - CLK_SET_RATE_PARENT, reg, shift, width, 56 - 0, &mxs_lock); 55 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 56 + reg, shift, width, 0, &mxs_lock); 57 57 } 58 58 59 59 static inline struct clk *mxs_clk_fixed_factor(const char *name,
+3
drivers/clk/samsung/Makefile
··· 8 8 obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o 9 9 obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o 10 10 obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o 11 + ifdef CONFIG_COMMON_CLK 12 + obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o 13 + endif
+5 -3
drivers/clk/samsung/clk-exynos-audss.c
··· 62 62 #endif /* CONFIG_PM_SLEEP */ 63 63 64 64 /* register exynos_audss clocks */ 65 - void __init exynos_audss_clk_init(struct device_node *np) 65 + static void __init exynos_audss_clk_init(struct device_node *np) 66 66 { 67 67 reg_base = of_iomap(np, 0); 68 68 if (!reg_base) { ··· 82 82 of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); 83 83 84 84 clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", 85 - mout_audss_p, ARRAY_SIZE(mout_audss_p), 0, 85 + mout_audss_p, ARRAY_SIZE(mout_audss_p), 86 + CLK_SET_RATE_NO_REPARENT, 86 87 reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); 87 88 88 89 clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", 89 - mout_i2s_p, ARRAY_SIZE(mout_i2s_p), 0, 90 + mout_i2s_p, ARRAY_SIZE(mout_i2s_p), 91 + CLK_SET_RATE_NO_REPARENT, 90 92 reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); 91 93 92 94 clk_table[EXYNOS_DOUT_SRP] = clk_register_divider(NULL, "dout_srp",
+357 -252
drivers/clk/samsung/clk-exynos4.c
··· 17 17 #include <linux/of_address.h> 18 18 19 19 #include "clk.h" 20 - #include "clk-pll.h" 21 20 22 21 /* Exynos4 clock controller register offsets */ 23 22 #define SRC_LEFTBUS 0x4200 ··· 96 97 #define GATE_IP_PERIL 0xc950 97 98 #define E4210_GATE_IP_PERIR 0xc960 98 99 #define GATE_BLOCK 0xc970 100 + #define E4X12_MPLL_LOCK 0x10008 99 101 #define E4X12_MPLL_CON0 0x10108 100 102 #define SRC_DMC 0x10200 101 103 #define SRC_MASK_DMC 0x10300 102 104 #define DIV_DMC0 0x10500 103 105 #define DIV_DMC1 0x10504 104 106 #define GATE_IP_DMC 0x10900 107 + #define APLL_LOCK 0x14000 108 + #define E4210_MPLL_LOCK 0x14008 105 109 #define APLL_CON0 0x14100 106 110 #define E4210_MPLL_CON0 0x14108 107 111 #define SRC_CPU 0x14200 ··· 121 119 enum exynos4_soc { 122 120 EXYNOS4210, 123 121 EXYNOS4X12, 122 + }; 123 + 124 + /* list of PLLs to be registered */ 125 + enum exynos4_plls { 126 + apll, mpll, epll, vpll, 127 + nr_plls /* number of PLLs */ 124 128 }; 125 129 126 130 /* ··· 177 169 gicisp, smmu_isp, smmu_drc, smmu_fd, smmu_lite0, smmu_lite1, mcuctl_isp, 178 170 mpwm_isp, i2c0_isp, i2c1_isp, mtcadc_isp, pwm_isp, wdt_isp, uart_isp, 179 171 asyncaxim, smmu_ispcx, spi0_isp, spi1_isp, pwm_isp_sclk, spi0_isp_sclk, 180 - spi1_isp_sclk, uart_isp_sclk, 172 + spi1_isp_sclk, uart_isp_sclk, tmu_apbif, 181 173 182 174 /* mux clocks */ 183 175 mout_fimc0 = 384, mout_fimc1, mout_fimc2, mout_fimc3, mout_cam0, ··· 195 187 * list of controller registers to be saved and restored during a 196 188 * suspend/resume cycle. 197 189 */ 198 - static __initdata unsigned long exynos4210_clk_save[] = { 190 + static unsigned long exynos4210_clk_save[] __initdata = { 199 191 E4210_SRC_IMAGE, 200 192 E4210_SRC_LCD1, 201 193 E4210_SRC_MASK_LCD1, ··· 206 198 E4210_MPLL_CON0, 207 199 }; 208 200 209 - static __initdata unsigned long exynos4x12_clk_save[] = { 201 + static unsigned long exynos4x12_clk_save[] __initdata = { 210 202 E4X12_GATE_IP_IMAGE, 211 203 E4X12_GATE_IP_PERIR, 212 204 E4X12_SRC_CAM1, ··· 215 207 E4X12_MPLL_CON0, 216 208 }; 217 209 218 - static __initdata unsigned long exynos4_clk_regs[] = { 210 + static unsigned long exynos4_clk_regs[] __initdata = { 219 211 SRC_LEFTBUS, 220 212 DIV_LEFTBUS, 221 213 GATE_IP_LEFTBUS, ··· 346 338 PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; 347 339 348 340 /* fixed rate clocks generated outside the soc */ 349 - struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { 341 + static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { 350 342 FRATE(xxti, "xxti", NULL, CLK_IS_ROOT, 0), 351 343 FRATE(xusbxti, "xusbxti", NULL, CLK_IS_ROOT, 0), 352 344 }; 353 345 354 346 /* fixed rate clocks generated inside the soc */ 355 - struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { 347 + static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { 356 348 FRATE(none, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), 357 349 FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), 358 350 FRATE(none, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), 359 351 }; 360 352 361 - struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = { 353 + static struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = { 362 354 FRATE(none, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000), 363 355 }; 364 356 365 357 /* list of mux clocks supported in all exynos4 soc's */ 366 - struct samsung_mux_clock exynos4_mux_clks[] __initdata = { 358 + static struct samsung_mux_clock exynos4_mux_clks[] __initdata = { 367 359 MUX_FA(mout_apll, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, 368 360 CLK_SET_RATE_PARENT, 0, "mout_apll"), 369 361 MUX(none, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), ··· 375 367 CLK_SET_RATE_PARENT, 0), 376 368 MUX(none, "mout_spdif", mout_spdif_p, SRC_PERIL1, 8, 2), 377 369 MUX(none, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), 378 - MUX_A(sclk_epll, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1, "sclk_epll"), 370 + MUX(sclk_epll, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1), 379 371 MUX(none, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), 380 372 }; 381 373 382 374 /* list of mux clocks supported in exynos4210 soc */ 383 - struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { 375 + static struct samsung_mux_clock exynos4210_mux_early[] __initdata = { 376 + MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), 377 + }; 378 + 379 + static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { 384 380 MUX(none, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), 385 381 MUX(none, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), 386 382 MUX(none, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), 387 383 MUX(none, "mout_aclk133", sclk_ampll_p4210, SRC_TOP0, 24, 1), 388 - MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), 389 384 MUX(none, "mout_mixer", mout_mixer_p4210, SRC_TV, 4, 1), 390 385 MUX(none, "mout_dac", mout_dac_p4210, SRC_TV, 8, 1), 391 386 MUX(none, "mout_g2d0", sclk_ampll_p4210, E4210_SRC_IMAGE, 0, 1), ··· 396 385 MUX(none, "mout_g2d", mout_g2d_p, E4210_SRC_IMAGE, 8, 1), 397 386 MUX(none, "mout_fimd1", group1_p4210, E4210_SRC_LCD1, 0, 4), 398 387 MUX(none, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), 399 - MUX_A(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1, "mout_mpll"), 400 - MUX_A(mout_core, "mout_core", mout_core_p4210, 401 - SRC_CPU, 16, 1, "moutcore"), 402 - MUX_A(sclk_vpll, "sclk_vpll", sclk_vpll_p4210, 403 - SRC_TOP0, 8, 1, "sclk_vpll"), 388 + MUX(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1), 389 + MUX(mout_core, "mout_core", mout_core_p4210, SRC_CPU, 16, 1), 390 + MUX(sclk_vpll, "sclk_vpll", sclk_vpll_p4210, SRC_TOP0, 8, 1), 404 391 MUX(mout_fimc0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), 405 392 MUX(mout_fimc1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), 406 393 MUX(mout_fimc2, "mout_fimc2", group1_p4210, SRC_CAM, 8, 4), ··· 432 423 }; 433 424 434 425 /* list of mux clocks supported in exynos4x12 soc */ 435 - struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { 436 - MUX_A(mout_mpll_user_c, "mout_mpll_user_c", mout_mpll_user_p4x12, 437 - SRC_CPU, 24, 1, "mout_mpll"), 426 + static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { 427 + MUX(mout_mpll_user_c, "mout_mpll_user_c", mout_mpll_user_p4x12, 428 + SRC_CPU, 24, 1), 438 429 MUX(none, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), 439 430 MUX(none, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), 440 431 MUX(mout_mpll_user_t, "mout_mpll_user_t", mout_mpll_user_p4x12, ··· 454 445 MUX(none, "mout_jpeg0", sclk_ampll_p4x12, E4X12_SRC_CAM1, 0, 1), 455 446 MUX(none, "mout_jpeg1", sclk_evpll_p, E4X12_SRC_CAM1, 4, 1), 456 447 MUX(none, "mout_jpeg", mout_jpeg_p, E4X12_SRC_CAM1, 8, 1), 457 - MUX_A(sclk_mpll, "sclk_mpll", mout_mpll_p, 458 - SRC_DMC, 12, 1, "sclk_mpll"), 459 - MUX_A(sclk_vpll, "sclk_vpll", mout_vpll_p, 460 - SRC_TOP0, 8, 1, "sclk_vpll"), 461 - MUX_A(mout_core, "mout_core", mout_core_p4x12, 462 - SRC_CPU, 16, 1, "moutcore"), 448 + MUX(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_DMC, 12, 1), 449 + MUX(sclk_vpll, "sclk_vpll", mout_vpll_p, SRC_TOP0, 8, 1), 450 + MUX(mout_core, "mout_core", mout_core_p4x12, SRC_CPU, 16, 1), 463 451 MUX(mout_fimc0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), 464 452 MUX(mout_fimc1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), 465 453 MUX(mout_fimc2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), ··· 497 491 }; 498 492 499 493 /* list of divider clocks supported in all exynos4 soc's */ 500 - struct samsung_div_clock exynos4_div_clks[] __initdata = { 494 + static struct samsung_div_clock exynos4_div_clks[] __initdata = { 501 495 DIV(none, "div_core", "mout_core", DIV_CPU0, 0, 3), 502 496 DIV(none, "div_core2", "div_core", DIV_CPU0, 28, 3), 503 497 DIV(none, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), ··· 544 538 DIV(none, "div_spi_pre2", "div_spi2", DIV_PERIL2, 8, 8), 545 539 DIV(none, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), 546 540 DIV(none, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), 547 - DIV_A(arm_clk, "arm_clk", "div_core2", DIV_CPU0, 28, 3, "armclk"), 548 - DIV_A(sclk_apll, "sclk_apll", "mout_apll", 549 - DIV_CPU0, 24, 3, "sclk_apll"), 541 + DIV(arm_clk, "arm_clk", "div_core2", DIV_CPU0, 28, 3), 542 + DIV(sclk_apll, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), 550 543 DIV_F(none, "div_mipi_pre0", "div_mipi0", DIV_LCD0, 20, 4, 551 544 CLK_SET_RATE_PARENT, 0), 552 545 DIV_F(none, "div_mmc_pre0", "div_mmc0", DIV_FSYS1, 8, 8, ··· 559 554 }; 560 555 561 556 /* list of divider clocks supported in exynos4210 soc */ 562 - struct samsung_div_clock exynos4210_div_clks[] __initdata = { 557 + static struct samsung_div_clock exynos4210_div_clks[] __initdata = { 563 558 DIV(aclk200, "aclk200", "mout_aclk200", DIV_TOP, 0, 3), 564 559 DIV(sclk_fimg2d, "sclk_fimg2d", "mout_g2d", DIV_IMAGE, 0, 4), 565 560 DIV(none, "div_fimd1", "mout_fimd1", E4210_DIV_LCD1, 0, 4), ··· 570 565 }; 571 566 572 567 /* list of divider clocks supported in exynos4x12 soc */ 573 - struct samsung_div_clock exynos4x12_div_clks[] __initdata = { 568 + static struct samsung_div_clock exynos4x12_div_clks[] __initdata = { 574 569 DIV(none, "div_mdnie0", "mout_mdnie0", DIV_LCD0, 4, 4), 575 570 DIV(none, "div_mdnie_pwm0", "mout_mdnie_pwm0", DIV_LCD0, 8, 4), 576 571 DIV(none, "div_mdnie_pwm_pre0", "div_mdnie_pwm0", DIV_LCD0, 12, 4), ··· 599 594 }; 600 595 601 596 /* list of gate clocks supported in all exynos4 soc's */ 602 - struct samsung_gate_clock exynos4_gate_clks[] __initdata = { 597 + static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { 603 598 /* 604 599 * After all Exynos4 based platforms are migrated to use device tree, 605 600 * the device name and clock alias names specified below for some ··· 634 629 CLK_SET_RATE_PARENT, 0), 635 630 GATE(sclk_audio1, "sclk_audio1", "div_audio1", SRC_MASK_PERIL1, 0, 636 631 CLK_SET_RATE_PARENT, 0), 637 - GATE_D(vp, "s5p-mixer", "vp", "aclk160", GATE_IP_TV, 0, 0, 0), 638 - GATE_D(mixer, "s5p-mixer", "mixer", "aclk160", GATE_IP_TV, 1, 0, 0), 639 - GATE_D(hdmi, "exynos4-hdmi", "hdmi", "aclk160", GATE_IP_TV, 3, 0, 0), 640 - GATE_A(pwm, "pwm", "aclk100", GATE_IP_PERIL, 24, 0, 0, "timers"), 641 - GATE_A(sdmmc4, "sdmmc4", "aclk133", GATE_IP_FSYS, 9, 0, 0, "biu"), 642 - GATE_A(usb_host, "usb_host", "aclk133", 643 - GATE_IP_FSYS, 12, 0, 0, "usbhost"), 644 - GATE_DA(sclk_fimc0, "exynos4-fimc.0", "sclk_fimc0", "div_fimc0", 645 - SRC_MASK_CAM, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), 646 - GATE_DA(sclk_fimc1, "exynos4-fimc.1", "sclk_fimc1", "div_fimc1", 647 - SRC_MASK_CAM, 4, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), 648 - GATE_DA(sclk_fimc2, "exynos4-fimc.2", "sclk_fimc2", "div_fimc2", 649 - SRC_MASK_CAM, 8, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), 650 - GATE_DA(sclk_fimc3, "exynos4-fimc.3", "sclk_fimc3", "div_fimc3", 651 - SRC_MASK_CAM, 12, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), 652 - GATE_DA(sclk_csis0, "s5p-mipi-csis.0", "sclk_csis0", "div_csis0", 653 - SRC_MASK_CAM, 24, CLK_SET_RATE_PARENT, 0, "sclk_csis"), 654 - GATE_DA(sclk_csis1, "s5p-mipi-csis.1", "sclk_csis1", "div_csis1", 655 - SRC_MASK_CAM, 28, CLK_SET_RATE_PARENT, 0, "sclk_csis"), 656 - GATE_DA(sclk_fimd0, "exynos4-fb.0", "sclk_fimd0", "div_fimd0", 657 - SRC_MASK_LCD0, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimd"), 658 - GATE_DA(sclk_mmc0, "exynos4-sdhci.0", "sclk_mmc0", "div_mmc_pre0", 659 - SRC_MASK_FSYS, 0, CLK_SET_RATE_PARENT, 0, 660 - "mmc_busclk.2"), 661 - GATE_DA(sclk_mmc1, "exynos4-sdhci.1", "sclk_mmc1", "div_mmc_pre1", 662 - SRC_MASK_FSYS, 4, CLK_SET_RATE_PARENT, 0, 663 - "mmc_busclk.2"), 664 - GATE_DA(sclk_mmc2, "exynos4-sdhci.2", "sclk_mmc2", "div_mmc_pre2", 665 - SRC_MASK_FSYS, 8, CLK_SET_RATE_PARENT, 0, 666 - "mmc_busclk.2"), 667 - GATE_DA(sclk_mmc3, "exynos4-sdhci.3", "sclk_mmc3", "div_mmc_pre3", 668 - SRC_MASK_FSYS, 12, CLK_SET_RATE_PARENT, 0, 669 - "mmc_busclk.2"), 670 - GATE_DA(sclk_mmc4, NULL, "sclk_mmc4", "div_mmc_pre4", 671 - SRC_MASK_FSYS, 16, CLK_SET_RATE_PARENT, 0, "ciu"), 672 - GATE_DA(sclk_uart0, "exynos4210-uart.0", "uclk0", "div_uart0", 673 - SRC_MASK_PERIL0, 0, CLK_SET_RATE_PARENT, 674 - 0, "clk_uart_baud0"), 675 - GATE_DA(sclk_uart1, "exynos4210-uart.1", "uclk1", "div_uart1", 676 - SRC_MASK_PERIL0, 4, CLK_SET_RATE_PARENT, 677 - 0, "clk_uart_baud0"), 678 - GATE_DA(sclk_uart2, "exynos4210-uart.2", "uclk2", "div_uart2", 679 - SRC_MASK_PERIL0, 8, CLK_SET_RATE_PARENT, 680 - 0, "clk_uart_baud0"), 681 - GATE_DA(sclk_uart3, "exynos4210-uart.3", "uclk3", "div_uart3", 682 - SRC_MASK_PERIL0, 12, CLK_SET_RATE_PARENT, 683 - 0, "clk_uart_baud0"), 684 - GATE_DA(sclk_uart4, "exynos4210-uart.4", "uclk4", "div_uart4", 685 - SRC_MASK_PERIL0, 16, CLK_SET_RATE_PARENT, 686 - 0, "clk_uart_baud0"), 632 + GATE(vp, "vp", "aclk160", GATE_IP_TV, 0, 0, 0), 633 + GATE(mixer, "mixer", "aclk160", GATE_IP_TV, 1, 0, 0), 634 + GATE(hdmi, "hdmi", "aclk160", GATE_IP_TV, 3, 0, 0), 635 + GATE(pwm, "pwm", "aclk100", GATE_IP_PERIL, 24, 0, 0), 636 + GATE(sdmmc4, "sdmmc4", "aclk133", GATE_IP_FSYS, 9, 0, 0), 637 + GATE(usb_host, "usb_host", "aclk133", GATE_IP_FSYS, 12, 0, 0), 638 + GATE(sclk_fimc0, "sclk_fimc0", "div_fimc0", SRC_MASK_CAM, 0, 639 + CLK_SET_RATE_PARENT, 0), 640 + GATE(sclk_fimc1, "sclk_fimc1", "div_fimc1", SRC_MASK_CAM, 4, 641 + CLK_SET_RATE_PARENT, 0), 642 + GATE(sclk_fimc2, "sclk_fimc2", "div_fimc2", SRC_MASK_CAM, 8, 643 + CLK_SET_RATE_PARENT, 0), 644 + GATE(sclk_fimc3, "sclk_fimc3", "div_fimc3", SRC_MASK_CAM, 12, 645 + CLK_SET_RATE_PARENT, 0), 646 + GATE(sclk_csis0, "sclk_csis0", "div_csis0", SRC_MASK_CAM, 24, 647 + CLK_SET_RATE_PARENT, 0), 648 + GATE(sclk_csis1, "sclk_csis1", "div_csis1", SRC_MASK_CAM, 28, 649 + CLK_SET_RATE_PARENT, 0), 650 + GATE(sclk_fimd0, "sclk_fimd0", "div_fimd0", SRC_MASK_LCD0, 0, 651 + CLK_SET_RATE_PARENT, 0), 652 + GATE(sclk_mmc0, "sclk_mmc0", "div_mmc_pre0", SRC_MASK_FSYS, 0, 653 + CLK_SET_RATE_PARENT, 0), 654 + GATE(sclk_mmc1, "sclk_mmc1", "div_mmc_pre1", SRC_MASK_FSYS, 4, 655 + CLK_SET_RATE_PARENT, 0), 656 + GATE(sclk_mmc2, "sclk_mmc2", "div_mmc_pre2", SRC_MASK_FSYS, 8, 657 + CLK_SET_RATE_PARENT, 0), 658 + GATE(sclk_mmc3, "sclk_mmc3", "div_mmc_pre3", SRC_MASK_FSYS, 12, 659 + CLK_SET_RATE_PARENT, 0), 660 + GATE(sclk_mmc4, "sclk_mmc4", "div_mmc_pre4", SRC_MASK_FSYS, 16, 661 + CLK_SET_RATE_PARENT, 0), 662 + GATE(sclk_uart0, "uclk0", "div_uart0", SRC_MASK_PERIL0, 0, 663 + CLK_SET_RATE_PARENT, 0), 664 + GATE(sclk_uart1, "uclk1", "div_uart1", SRC_MASK_PERIL0, 4, 665 + CLK_SET_RATE_PARENT, 0), 666 + GATE(sclk_uart2, "uclk2", "div_uart2", SRC_MASK_PERIL0, 8, 667 + CLK_SET_RATE_PARENT, 0), 668 + GATE(sclk_uart3, "uclk3", "div_uart3", SRC_MASK_PERIL0, 12, 669 + CLK_SET_RATE_PARENT, 0), 670 + GATE(sclk_uart4, "uclk4", "div_uart4", SRC_MASK_PERIL0, 16, 671 + CLK_SET_RATE_PARENT, 0), 687 672 GATE(sclk_audio2, "sclk_audio2", "div_audio2", SRC_MASK_PERIL1, 4, 688 673 CLK_SET_RATE_PARENT, 0), 689 - GATE_DA(sclk_spi0, "exynos4210-spi.0", "sclk_spi0", "div_spi_pre0", 690 - SRC_MASK_PERIL1, 16, CLK_SET_RATE_PARENT, 691 - 0, "spi_busclk0"), 692 - GATE_DA(sclk_spi1, "exynos4210-spi.1", "sclk_spi1", "div_spi_pre1", 693 - SRC_MASK_PERIL1, 20, CLK_SET_RATE_PARENT, 694 - 0, "spi_busclk0"), 695 - GATE_DA(sclk_spi2, "exynos4210-spi.2", "sclk_spi2", "div_spi_pre2", 696 - SRC_MASK_PERIL1, 24, CLK_SET_RATE_PARENT, 697 - 0, "spi_busclk0"), 698 - GATE_DA(fimc0, "exynos4-fimc.0", "fimc0", "aclk160", 699 - GATE_IP_CAM, 0, 0, 0, "fimc"), 700 - GATE_DA(fimc1, "exynos4-fimc.1", "fimc1", "aclk160", 701 - GATE_IP_CAM, 1, 0, 0, "fimc"), 702 - GATE_DA(fimc2, "exynos4-fimc.2", "fimc2", "aclk160", 703 - GATE_IP_CAM, 2, 0, 0, "fimc"), 704 - GATE_DA(fimc3, "exynos4-fimc.3", "fimc3", "aclk160", 705 - GATE_IP_CAM, 3, 0, 0, "fimc"), 706 - GATE_DA(csis0, "s5p-mipi-csis.0", "csis0", "aclk160", 707 - GATE_IP_CAM, 4, 0, 0, "fimc"), 708 - GATE_DA(csis1, "s5p-mipi-csis.1", "csis1", "aclk160", 709 - GATE_IP_CAM, 5, 0, 0, "fimc"), 710 - GATE_DA(smmu_fimc0, "exynos-sysmmu.5", "smmu_fimc0", "aclk160", 711 - GATE_IP_CAM, 7, 0, 0, "sysmmu"), 712 - GATE_DA(smmu_fimc1, "exynos-sysmmu.6", "smmu_fimc1", "aclk160", 713 - GATE_IP_CAM, 8, 0, 0, "sysmmu"), 714 - GATE_DA(smmu_fimc2, "exynos-sysmmu.7", "smmu_fimc2", "aclk160", 715 - GATE_IP_CAM, 9, 0, 0, "sysmmu"), 716 - GATE_DA(smmu_fimc3, "exynos-sysmmu.8", "smmu_fimc3", "aclk160", 717 - GATE_IP_CAM, 10, 0, 0, "sysmmu"), 718 - GATE_DA(smmu_jpeg, "exynos-sysmmu.3", "smmu_jpeg", "aclk160", 719 - GATE_IP_CAM, 11, 0, 0, "sysmmu"), 674 + GATE(sclk_spi0, "sclk_spi0", "div_spi_pre0", SRC_MASK_PERIL1, 16, 675 + CLK_SET_RATE_PARENT, 0), 676 + GATE(sclk_spi1, "sclk_spi1", "div_spi_pre1", SRC_MASK_PERIL1, 20, 677 + CLK_SET_RATE_PARENT, 0), 678 + GATE(sclk_spi2, "sclk_spi2", "div_spi_pre2", SRC_MASK_PERIL1, 24, 679 + CLK_SET_RATE_PARENT, 0), 680 + GATE(fimc0, "fimc0", "aclk160", GATE_IP_CAM, 0, 681 + 0, 0), 682 + GATE(fimc1, "fimc1", "aclk160", GATE_IP_CAM, 1, 683 + 0, 0), 684 + GATE(fimc2, "fimc2", "aclk160", GATE_IP_CAM, 2, 685 + 0, 0), 686 + GATE(fimc3, "fimc3", "aclk160", GATE_IP_CAM, 3, 687 + 0, 0), 688 + GATE(csis0, "csis0", "aclk160", GATE_IP_CAM, 4, 689 + 0, 0), 690 + GATE(csis1, "csis1", "aclk160", GATE_IP_CAM, 5, 691 + 0, 0), 692 + GATE(smmu_fimc0, "smmu_fimc0", "aclk160", GATE_IP_CAM, 7, 693 + 0, 0), 694 + GATE(smmu_fimc1, "smmu_fimc1", "aclk160", GATE_IP_CAM, 8, 695 + 0, 0), 696 + GATE(smmu_fimc2, "smmu_fimc2", "aclk160", GATE_IP_CAM, 9, 697 + 0, 0), 698 + GATE(smmu_fimc3, "smmu_fimc3", "aclk160", GATE_IP_CAM, 10, 699 + 0, 0), 700 + GATE(smmu_jpeg, "smmu_jpeg", "aclk160", GATE_IP_CAM, 11, 701 + 0, 0), 720 702 GATE(pixelasyncm0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), 721 703 GATE(pixelasyncm1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), 722 - GATE_DA(smmu_tv, "exynos-sysmmu.2", "smmu_tv", "aclk160", 723 - GATE_IP_TV, 4, 0, 0, "sysmmu"), 724 - GATE_DA(mfc, "s5p-mfc", "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0, "mfc"), 725 - GATE_DA(smmu_mfcl, "exynos-sysmmu.0", "smmu_mfcl", "aclk100", 726 - GATE_IP_MFC, 1, 0, 0, "sysmmu"), 727 - GATE_DA(smmu_mfcr, "exynos-sysmmu.1", "smmu_mfcr", "aclk100", 728 - GATE_IP_MFC, 2, 0, 0, "sysmmu"), 729 - GATE_DA(fimd0, "exynos4-fb.0", "fimd0", "aclk160", 730 - GATE_IP_LCD0, 0, 0, 0, "fimd"), 731 - GATE_DA(smmu_fimd0, "exynos-sysmmu.10", "smmu_fimd0", "aclk160", 732 - GATE_IP_LCD0, 4, 0, 0, "sysmmu"), 733 - GATE_DA(pdma0, "dma-pl330.0", "pdma0", "aclk133", 734 - GATE_IP_FSYS, 0, 0, 0, "dma"), 735 - GATE_DA(pdma1, "dma-pl330.1", "pdma1", "aclk133", 736 - GATE_IP_FSYS, 1, 0, 0, "dma"), 737 - GATE_DA(sdmmc0, "exynos4-sdhci.0", "sdmmc0", "aclk133", 738 - GATE_IP_FSYS, 5, 0, 0, "hsmmc"), 739 - GATE_DA(sdmmc1, "exynos4-sdhci.1", "sdmmc1", "aclk133", 740 - GATE_IP_FSYS, 6, 0, 0, "hsmmc"), 741 - GATE_DA(sdmmc2, "exynos4-sdhci.2", "sdmmc2", "aclk133", 742 - GATE_IP_FSYS, 7, 0, 0, "hsmmc"), 743 - GATE_DA(sdmmc3, "exynos4-sdhci.3", "sdmmc3", "aclk133", 744 - GATE_IP_FSYS, 8, 0, 0, "hsmmc"), 745 - GATE_DA(uart0, "exynos4210-uart.0", "uart0", "aclk100", 746 - GATE_IP_PERIL, 0, 0, 0, "uart"), 747 - GATE_DA(uart1, "exynos4210-uart.1", "uart1", "aclk100", 748 - GATE_IP_PERIL, 1, 0, 0, "uart"), 749 - GATE_DA(uart2, "exynos4210-uart.2", "uart2", "aclk100", 750 - GATE_IP_PERIL, 2, 0, 0, "uart"), 751 - GATE_DA(uart3, "exynos4210-uart.3", "uart3", "aclk100", 752 - GATE_IP_PERIL, 3, 0, 0, "uart"), 753 - GATE_DA(uart4, "exynos4210-uart.4", "uart4", "aclk100", 754 - GATE_IP_PERIL, 4, 0, 0, "uart"), 755 - GATE_DA(i2c0, "s3c2440-i2c.0", "i2c0", "aclk100", 756 - GATE_IP_PERIL, 6, 0, 0, "i2c"), 757 - GATE_DA(i2c1, "s3c2440-i2c.1", "i2c1", "aclk100", 758 - GATE_IP_PERIL, 7, 0, 0, "i2c"), 759 - GATE_DA(i2c2, "s3c2440-i2c.2", "i2c2", "aclk100", 760 - GATE_IP_PERIL, 8, 0, 0, "i2c"), 761 - GATE_DA(i2c3, "s3c2440-i2c.3", "i2c3", "aclk100", 762 - GATE_IP_PERIL, 9, 0, 0, "i2c"), 763 - GATE_DA(i2c4, "s3c2440-i2c.4", "i2c4", "aclk100", 764 - GATE_IP_PERIL, 10, 0, 0, "i2c"), 765 - GATE_DA(i2c5, "s3c2440-i2c.5", "i2c5", "aclk100", 766 - GATE_IP_PERIL, 11, 0, 0, "i2c"), 767 - GATE_DA(i2c6, "s3c2440-i2c.6", "i2c6", "aclk100", 768 - GATE_IP_PERIL, 12, 0, 0, "i2c"), 769 - GATE_DA(i2c7, "s3c2440-i2c.7", "i2c7", "aclk100", 770 - GATE_IP_PERIL, 13, 0, 0, "i2c"), 771 - GATE_DA(i2c_hdmi, "s3c2440-hdmiphy-i2c", "i2c-hdmi", "aclk100", 772 - GATE_IP_PERIL, 14, 0, 0, "i2c"), 773 - GATE_DA(spi0, "exynos4210-spi.0", "spi0", "aclk100", 774 - GATE_IP_PERIL, 16, 0, 0, "spi"), 775 - GATE_DA(spi1, "exynos4210-spi.1", "spi1", "aclk100", 776 - GATE_IP_PERIL, 17, 0, 0, "spi"), 777 - GATE_DA(spi2, "exynos4210-spi.2", "spi2", "aclk100", 778 - GATE_IP_PERIL, 18, 0, 0, "spi"), 779 - GATE_DA(i2s1, "samsung-i2s.1", "i2s1", "aclk100", 780 - GATE_IP_PERIL, 20, 0, 0, "iis"), 781 - GATE_DA(i2s2, "samsung-i2s.2", "i2s2", "aclk100", 782 - GATE_IP_PERIL, 21, 0, 0, "iis"), 783 - GATE_DA(pcm1, "samsung-pcm.1", "pcm1", "aclk100", 784 - GATE_IP_PERIL, 22, 0, 0, "pcm"), 785 - GATE_DA(pcm2, "samsung-pcm.2", "pcm2", "aclk100", 786 - GATE_IP_PERIL, 23, 0, 0, "pcm"), 787 - GATE_DA(spdif, "samsung-spdif", "spdif", "aclk100", 788 - GATE_IP_PERIL, 26, 0, 0, "spdif"), 789 - GATE_DA(ac97, "samsung-ac97", "ac97", "aclk100", 790 - GATE_IP_PERIL, 27, 0, 0, "ac97"), 704 + GATE(smmu_tv, "smmu_tv", "aclk160", GATE_IP_TV, 4, 705 + 0, 0), 706 + GATE(mfc, "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0), 707 + GATE(smmu_mfcl, "smmu_mfcl", "aclk100", GATE_IP_MFC, 1, 708 + 0, 0), 709 + GATE(smmu_mfcr, "smmu_mfcr", "aclk100", GATE_IP_MFC, 2, 710 + 0, 0), 711 + GATE(fimd0, "fimd0", "aclk160", GATE_IP_LCD0, 0, 712 + 0, 0), 713 + GATE(smmu_fimd0, "smmu_fimd0", "aclk160", GATE_IP_LCD0, 4, 714 + 0, 0), 715 + GATE(pdma0, "pdma0", "aclk133", GATE_IP_FSYS, 0, 716 + 0, 0), 717 + GATE(pdma1, "pdma1", "aclk133", GATE_IP_FSYS, 1, 718 + 0, 0), 719 + GATE(sdmmc0, "sdmmc0", "aclk133", GATE_IP_FSYS, 5, 720 + 0, 0), 721 + GATE(sdmmc1, "sdmmc1", "aclk133", GATE_IP_FSYS, 6, 722 + 0, 0), 723 + GATE(sdmmc2, "sdmmc2", "aclk133", GATE_IP_FSYS, 7, 724 + 0, 0), 725 + GATE(sdmmc3, "sdmmc3", "aclk133", GATE_IP_FSYS, 8, 726 + 0, 0), 727 + GATE(uart0, "uart0", "aclk100", GATE_IP_PERIL, 0, 728 + 0, 0), 729 + GATE(uart1, "uart1", "aclk100", GATE_IP_PERIL, 1, 730 + 0, 0), 731 + GATE(uart2, "uart2", "aclk100", GATE_IP_PERIL, 2, 732 + 0, 0), 733 + GATE(uart3, "uart3", "aclk100", GATE_IP_PERIL, 3, 734 + 0, 0), 735 + GATE(uart4, "uart4", "aclk100", GATE_IP_PERIL, 4, 736 + 0, 0), 737 + GATE(i2c0, "i2c0", "aclk100", GATE_IP_PERIL, 6, 738 + 0, 0), 739 + GATE(i2c1, "i2c1", "aclk100", GATE_IP_PERIL, 7, 740 + 0, 0), 741 + GATE(i2c2, "i2c2", "aclk100", GATE_IP_PERIL, 8, 742 + 0, 0), 743 + GATE(i2c3, "i2c3", "aclk100", GATE_IP_PERIL, 9, 744 + 0, 0), 745 + GATE(i2c4, "i2c4", "aclk100", GATE_IP_PERIL, 10, 746 + 0, 0), 747 + GATE(i2c5, "i2c5", "aclk100", GATE_IP_PERIL, 11, 748 + 0, 0), 749 + GATE(i2c6, "i2c6", "aclk100", GATE_IP_PERIL, 12, 750 + 0, 0), 751 + GATE(i2c7, "i2c7", "aclk100", GATE_IP_PERIL, 13, 752 + 0, 0), 753 + GATE(i2c_hdmi, "i2c-hdmi", "aclk100", GATE_IP_PERIL, 14, 754 + 0, 0), 755 + GATE(spi0, "spi0", "aclk100", GATE_IP_PERIL, 16, 756 + 0, 0), 757 + GATE(spi1, "spi1", "aclk100", GATE_IP_PERIL, 17, 758 + 0, 0), 759 + GATE(spi2, "spi2", "aclk100", GATE_IP_PERIL, 18, 760 + 0, 0), 761 + GATE(i2s1, "i2s1", "aclk100", GATE_IP_PERIL, 20, 762 + 0, 0), 763 + GATE(i2s2, "i2s2", "aclk100", GATE_IP_PERIL, 21, 764 + 0, 0), 765 + GATE(pcm1, "pcm1", "aclk100", GATE_IP_PERIL, 22, 766 + 0, 0), 767 + GATE(pcm2, "pcm2", "aclk100", GATE_IP_PERIL, 23, 768 + 0, 0), 769 + GATE(spdif, "spdif", "aclk100", GATE_IP_PERIL, 26, 770 + 0, 0), 771 + GATE(ac97, "ac97", "aclk100", GATE_IP_PERIL, 27, 772 + 0, 0), 791 773 }; 792 774 793 775 /* list of gate clocks supported in exynos4210 soc */ 794 - struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { 776 + static struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { 795 777 GATE(tvenc, "tvenc", "aclk160", GATE_IP_TV, 2, 0, 0), 796 778 GATE(g2d, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0), 797 779 GATE(rotator, "rotator", "aclk200", E4210_GATE_IP_IMAGE, 1, 0, 0), ··· 803 811 SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), 804 812 GATE(sclk_mixer, "sclk_mixer", "mout_mixer", SRC_MASK_TV, 4, 0, 0), 805 813 GATE(sclk_dac, "sclk_dac", "mout_dac", SRC_MASK_TV, 8, 0, 0), 806 - GATE_A(tsadc, "tsadc", "aclk100", GATE_IP_PERIL, 15, 0, 0, "adc"), 807 - GATE_A(mct, "mct", "aclk100", E4210_GATE_IP_PERIR, 13, 0, 0, "mct"), 808 - GATE_A(wdt, "watchdog", "aclk100", E4210_GATE_IP_PERIR, 14, 0, 0, "watchdog"), 809 - GATE_A(rtc, "rtc", "aclk100", E4210_GATE_IP_PERIR, 15, 0, 0, "rtc"), 810 - GATE_A(keyif, "keyif", "aclk100", E4210_GATE_IP_PERIR, 16, 0, 0, "keypad"), 811 - GATE_DA(sclk_fimd1, "exynos4-fb.1", "sclk_fimd1", "div_fimd1", 812 - E4210_SRC_MASK_LCD1, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimd"), 814 + GATE(tsadc, "tsadc", "aclk100", GATE_IP_PERIL, 15, 815 + 0, 0), 816 + GATE(mct, "mct", "aclk100", E4210_GATE_IP_PERIR, 13, 817 + 0, 0), 818 + GATE(wdt, "watchdog", "aclk100", E4210_GATE_IP_PERIR, 14, 819 + 0, 0), 820 + GATE(rtc, "rtc", "aclk100", E4210_GATE_IP_PERIR, 15, 821 + 0, 0), 822 + GATE(keyif, "keyif", "aclk100", E4210_GATE_IP_PERIR, 16, 823 + 0, 0), 824 + GATE(sclk_fimd1, "sclk_fimd1", "div_fimd1", E4210_SRC_MASK_LCD1, 0, 825 + CLK_SET_RATE_PARENT, 0), 826 + GATE(tmu_apbif, "tmu_apbif", "aclk100", E4210_GATE_IP_PERIR, 17, 0, 0), 813 827 }; 814 828 815 829 /* list of gate clocks supported in exynos4x12 soc */ 816 - struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { 830 + static struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { 817 831 GATE(audss, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), 818 832 GATE(mdnie0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), 819 833 GATE(rotator, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), ··· 838 840 SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), 839 841 GATE(smmu_rotator, "smmu_rotator", "aclk200", 840 842 E4X12_GATE_IP_IMAGE, 4, 0, 0), 841 - GATE_A(mct, "mct", "aclk100", E4X12_GATE_IP_PERIR, 13, 0, 0, "mct"), 842 - GATE_A(rtc, "rtc", "aclk100", E4X12_GATE_IP_PERIR, 15, 0, 0, "rtc"), 843 - GATE_A(keyif, "keyif", "aclk100", 844 - E4X12_GATE_IP_PERIR, 16, 0, 0, "keypad"), 843 + GATE(mct, "mct", "aclk100", E4X12_GATE_IP_PERIR, 13, 844 + 0, 0), 845 + GATE(rtc, "rtc", "aclk100", E4X12_GATE_IP_PERIR, 15, 846 + 0, 0), 847 + GATE(keyif, "keyif", "aclk100", E4X12_GATE_IP_PERIR, 16, 0, 0), 845 848 GATE(sclk_pwm_isp, "sclk_pwm_isp", "div_pwm_isp", 846 849 E4X12_SRC_MASK_ISP, 0, CLK_SET_RATE_PARENT, 0), 847 850 GATE(sclk_spi0_isp, "sclk_spi0_isp", "div_spi0_isp_pre", ··· 859 860 E4X12_GATE_IP_ISP, 2, 0, 0), 860 861 GATE(uart_isp_sclk, "uart_isp_sclk", "sclk_uart_isp", 861 862 E4X12_GATE_IP_ISP, 3, 0, 0), 862 - GATE_A(wdt, "watchdog", "aclk100", 863 - E4X12_GATE_IP_PERIR, 14, 0, 0, "watchdog"), 864 - GATE_DA(pcm0, "samsung-pcm.0", "pcm0", "aclk100", 865 - E4X12_GATE_IP_MAUDIO, 2, 0, 0, "pcm"), 866 - GATE_DA(i2s0, "samsung-i2s.0", "i2s0", "aclk100", 867 - E4X12_GATE_IP_MAUDIO, 3, 0, 0, "iis"), 863 + GATE(wdt, "watchdog", "aclk100", E4X12_GATE_IP_PERIR, 14, 0, 0), 864 + GATE(pcm0, "pcm0", "aclk100", E4X12_GATE_IP_MAUDIO, 2, 865 + 0, 0), 866 + GATE(i2s0, "i2s0", "aclk100", E4X12_GATE_IP_MAUDIO, 3, 867 + 0, 0), 868 868 GATE(fimc_isp, "isp", "aclk200", E4X12_GATE_ISP0, 0, 869 869 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), 870 870 GATE(fimc_drc, "drc", "aclk200", E4X12_GATE_ISP0, 1, ··· 917 919 GATE(spi1_isp, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, 918 920 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), 919 921 GATE(g2d, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0), 922 + GATE(tmu_apbif, "tmu_apbif", "aclk100", E4X12_GATE_IP_PERIR, 17, 0, 0), 923 + }; 924 + 925 + static struct samsung_clock_alias exynos4_aliases[] __initdata = { 926 + ALIAS(mout_core, NULL, "moutcore"), 927 + ALIAS(arm_clk, NULL, "armclk"), 928 + ALIAS(sclk_apll, NULL, "mout_apll"), 929 + }; 930 + 931 + static struct samsung_clock_alias exynos4210_aliases[] __initdata = { 932 + ALIAS(sclk_mpll, NULL, "mout_mpll"), 933 + }; 934 + 935 + static struct samsung_clock_alias exynos4x12_aliases[] __initdata = { 936 + ALIAS(mout_mpll_user_c, NULL, "mout_mpll"), 920 937 }; 921 938 922 939 /* ··· 986 973 987 974 } 988 975 989 - /* 990 - * This function allows non-dt platforms to specify the clock speed of the 991 - * xxti and xusbxti clocks. These clocks are then registered with the specified 992 - * clock speed. 993 - */ 994 - void __init exynos4_clk_register_fixed_ext(unsigned long xxti_f, 995 - unsigned long xusbxti_f) 996 - { 997 - exynos4_fixed_rate_ext_clks[0].fixed_rate = xxti_f; 998 - exynos4_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f; 999 - samsung_clk_register_fixed_rate(exynos4_fixed_rate_ext_clks, 1000 - ARRAY_SIZE(exynos4_fixed_rate_ext_clks)); 1001 - } 1002 - 1003 - static __initdata struct of_device_id ext_clk_match[] = { 976 + static struct of_device_id ext_clk_match[] __initdata = { 1004 977 { .compatible = "samsung,clock-xxti", .data = (void *)0, }, 1005 978 { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, 1006 979 {}, 1007 980 }; 1008 981 1009 - /* register exynos4 clocks */ 1010 - void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_soc, void __iomem *reg_base, unsigned long xom) 1011 - { 1012 - struct clk *apll, *mpll, *epll, *vpll; 982 + /* PLLs PMS values */ 983 + static struct samsung_pll_rate_table exynos4210_apll_rates[] __initdata = { 984 + PLL_45XX_RATE(1200000000, 150, 3, 1, 28), 985 + PLL_45XX_RATE(1000000000, 250, 6, 1, 28), 986 + PLL_45XX_RATE( 800000000, 200, 6, 1, 28), 987 + PLL_45XX_RATE( 666857142, 389, 14, 1, 13), 988 + PLL_45XX_RATE( 600000000, 100, 4, 1, 13), 989 + PLL_45XX_RATE( 533000000, 533, 24, 1, 5), 990 + PLL_45XX_RATE( 500000000, 250, 6, 2, 28), 991 + PLL_45XX_RATE( 400000000, 200, 6, 2, 28), 992 + PLL_45XX_RATE( 200000000, 200, 6, 3, 28), 993 + { /* sentinel */ } 994 + }; 1013 995 1014 - if (np) { 1015 - reg_base = of_iomap(np, 0); 1016 - if (!reg_base) 1017 - panic("%s: failed to map registers\n", __func__); 1018 - } 996 + static struct samsung_pll_rate_table exynos4210_epll_rates[] __initdata = { 997 + PLL_4600_RATE(192000000, 48, 3, 1, 0, 0), 998 + PLL_4600_RATE(180633605, 45, 3, 1, 10381, 0), 999 + PLL_4600_RATE(180000000, 45, 3, 1, 0, 0), 1000 + PLL_4600_RATE( 73727996, 73, 3, 3, 47710, 1), 1001 + PLL_4600_RATE( 67737602, 90, 4, 3, 20762, 1), 1002 + PLL_4600_RATE( 49151992, 49, 3, 3, 9961, 0), 1003 + PLL_4600_RATE( 45158401, 45, 3, 3, 10381, 0), 1004 + { /* sentinel */ } 1005 + }; 1006 + 1007 + static struct samsung_pll_rate_table exynos4210_vpll_rates[] __initdata = { 1008 + PLL_4650_RATE(360000000, 44, 3, 0, 1024, 0, 14, 0), 1009 + PLL_4650_RATE(324000000, 53, 2, 1, 1024, 1, 1, 1), 1010 + PLL_4650_RATE(259617187, 63, 3, 1, 1950, 0, 20, 1), 1011 + PLL_4650_RATE(110000000, 53, 3, 2, 2048, 0, 17, 0), 1012 + PLL_4650_RATE( 55360351, 53, 3, 3, 2417, 0, 17, 0), 1013 + { /* sentinel */ } 1014 + }; 1015 + 1016 + static struct samsung_pll_rate_table exynos4x12_apll_rates[] __initdata = { 1017 + PLL_35XX_RATE(1500000000, 250, 4, 0), 1018 + PLL_35XX_RATE(1400000000, 175, 3, 0), 1019 + PLL_35XX_RATE(1300000000, 325, 6, 0), 1020 + PLL_35XX_RATE(1200000000, 200, 4, 0), 1021 + PLL_35XX_RATE(1100000000, 275, 6, 0), 1022 + PLL_35XX_RATE(1000000000, 125, 3, 0), 1023 + PLL_35XX_RATE( 900000000, 150, 4, 0), 1024 + PLL_35XX_RATE( 800000000, 100, 3, 0), 1025 + PLL_35XX_RATE( 700000000, 175, 3, 1), 1026 + PLL_35XX_RATE( 600000000, 200, 4, 1), 1027 + PLL_35XX_RATE( 500000000, 125, 3, 1), 1028 + PLL_35XX_RATE( 400000000, 100, 3, 1), 1029 + PLL_35XX_RATE( 300000000, 200, 4, 2), 1030 + PLL_35XX_RATE( 200000000, 100, 3, 2), 1031 + { /* sentinel */ } 1032 + }; 1033 + 1034 + static struct samsung_pll_rate_table exynos4x12_epll_rates[] __initdata = { 1035 + PLL_36XX_RATE(192000000, 48, 3, 1, 0), 1036 + PLL_36XX_RATE(180633605, 45, 3, 1, 10381), 1037 + PLL_36XX_RATE(180000000, 45, 3, 1, 0), 1038 + PLL_36XX_RATE( 73727996, 73, 3, 3, 47710), 1039 + PLL_36XX_RATE( 67737602, 90, 4, 3, 20762), 1040 + PLL_36XX_RATE( 49151992, 49, 3, 3, 9961), 1041 + PLL_36XX_RATE( 45158401, 45, 3, 3, 10381), 1042 + { /* sentinel */ } 1043 + }; 1044 + 1045 + static struct samsung_pll_rate_table exynos4x12_vpll_rates[] __initdata = { 1046 + PLL_36XX_RATE(533000000, 133, 3, 1, 16384), 1047 + PLL_36XX_RATE(440000000, 110, 3, 1, 0), 1048 + PLL_36XX_RATE(350000000, 175, 3, 2, 0), 1049 + PLL_36XX_RATE(266000000, 133, 3, 2, 0), 1050 + PLL_36XX_RATE(160000000, 160, 3, 3, 0), 1051 + PLL_36XX_RATE(106031250, 53, 3, 2, 1024), 1052 + PLL_36XX_RATE( 53015625, 53, 3, 3, 1024), 1053 + { /* sentinel */ } 1054 + }; 1055 + 1056 + static struct samsung_pll_clock exynos4210_plls[nr_plls] __initdata = { 1057 + [apll] = PLL_A(pll_4508, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, 1058 + APLL_CON0, "fout_apll", NULL), 1059 + [mpll] = PLL_A(pll_4508, fout_mpll, "fout_mpll", "fin_pll", 1060 + E4210_MPLL_LOCK, E4210_MPLL_CON0, "fout_mpll", NULL), 1061 + [epll] = PLL_A(pll_4600, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, 1062 + EPLL_CON0, "fout_epll", NULL), 1063 + [vpll] = PLL_A(pll_4650c, fout_vpll, "fout_vpll", "mout_vpllsrc", 1064 + VPLL_LOCK, VPLL_CON0, "fout_vpll", NULL), 1065 + }; 1066 + 1067 + static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = { 1068 + [apll] = PLL(pll_35xx, fout_apll, "fout_apll", "fin_pll", 1069 + APLL_LOCK, APLL_CON0, NULL), 1070 + [mpll] = PLL(pll_35xx, fout_mpll, "fout_mpll", "fin_pll", 1071 + E4X12_MPLL_LOCK, E4X12_MPLL_CON0, NULL), 1072 + [epll] = PLL(pll_36xx, fout_epll, "fout_epll", "fin_pll", 1073 + EPLL_LOCK, EPLL_CON0, NULL), 1074 + [vpll] = PLL(pll_36xx, fout_vpll, "fout_vpll", "fin_pll", 1075 + VPLL_LOCK, VPLL_CON0, NULL), 1076 + }; 1077 + 1078 + /* register exynos4 clocks */ 1079 + static void __init exynos4_clk_init(struct device_node *np, 1080 + enum exynos4_soc exynos4_soc, 1081 + void __iomem *reg_base, unsigned long xom) 1082 + { 1083 + reg_base = of_iomap(np, 0); 1084 + if (!reg_base) 1085 + panic("%s: failed to map registers\n", __func__); 1019 1086 1020 1087 if (exynos4_soc == EXYNOS4210) 1021 1088 samsung_clk_init(np, reg_base, nr_clks, ··· 1106 1013 exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs), 1107 1014 exynos4x12_clk_save, ARRAY_SIZE(exynos4x12_clk_save)); 1108 1015 1109 - if (np) 1110 - samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks, 1016 + samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks, 1111 1017 ARRAY_SIZE(exynos4_fixed_rate_ext_clks), 1112 1018 ext_clk_match); 1113 1019 1114 1020 exynos4_clk_register_finpll(xom); 1115 1021 1116 1022 if (exynos4_soc == EXYNOS4210) { 1117 - apll = samsung_clk_register_pll45xx("fout_apll", "fin_pll", 1118 - reg_base + APLL_CON0, pll_4508); 1119 - mpll = samsung_clk_register_pll45xx("fout_mpll", "fin_pll", 1120 - reg_base + E4210_MPLL_CON0, pll_4508); 1121 - epll = samsung_clk_register_pll46xx("fout_epll", "fin_pll", 1122 - reg_base + EPLL_CON0, pll_4600); 1123 - vpll = samsung_clk_register_pll46xx("fout_vpll", "mout_vpllsrc", 1124 - reg_base + VPLL_CON0, pll_4650c); 1125 - } else { 1126 - apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", 1127 - reg_base + APLL_CON0); 1128 - mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", 1129 - reg_base + E4X12_MPLL_CON0); 1130 - epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", 1131 - reg_base + EPLL_CON0); 1132 - vpll = samsung_clk_register_pll36xx("fout_vpll", "fin_pll", 1133 - reg_base + VPLL_CON0); 1134 - } 1023 + samsung_clk_register_mux(exynos4210_mux_early, 1024 + ARRAY_SIZE(exynos4210_mux_early)); 1135 1025 1136 - samsung_clk_add_lookup(apll, fout_apll); 1137 - samsung_clk_add_lookup(mpll, fout_mpll); 1138 - samsung_clk_add_lookup(epll, fout_epll); 1139 - samsung_clk_add_lookup(vpll, fout_vpll); 1026 + if (_get_rate("fin_pll") == 24000000) { 1027 + exynos4210_plls[apll].rate_table = 1028 + exynos4210_apll_rates; 1029 + exynos4210_plls[epll].rate_table = 1030 + exynos4210_epll_rates; 1031 + } 1032 + 1033 + if (_get_rate("mout_vpllsrc") == 24000000) 1034 + exynos4210_plls[vpll].rate_table = 1035 + exynos4210_vpll_rates; 1036 + 1037 + samsung_clk_register_pll(exynos4210_plls, 1038 + ARRAY_SIZE(exynos4210_plls), reg_base); 1039 + } else { 1040 + if (_get_rate("fin_pll") == 24000000) { 1041 + exynos4x12_plls[apll].rate_table = 1042 + exynos4x12_apll_rates; 1043 + exynos4x12_plls[epll].rate_table = 1044 + exynos4x12_epll_rates; 1045 + exynos4x12_plls[vpll].rate_table = 1046 + exynos4x12_vpll_rates; 1047 + } 1048 + 1049 + samsung_clk_register_pll(exynos4x12_plls, 1050 + ARRAY_SIZE(exynos4x12_plls), reg_base); 1051 + } 1140 1052 1141 1053 samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks, 1142 1054 ARRAY_SIZE(exynos4_fixed_rate_clks)); ··· 1161 1063 ARRAY_SIZE(exynos4210_div_clks)); 1162 1064 samsung_clk_register_gate(exynos4210_gate_clks, 1163 1065 ARRAY_SIZE(exynos4210_gate_clks)); 1066 + samsung_clk_register_alias(exynos4210_aliases, 1067 + ARRAY_SIZE(exynos4210_aliases)); 1164 1068 } else { 1165 1069 samsung_clk_register_mux(exynos4x12_mux_clks, 1166 1070 ARRAY_SIZE(exynos4x12_mux_clks)); ··· 1170 1070 ARRAY_SIZE(exynos4x12_div_clks)); 1171 1071 samsung_clk_register_gate(exynos4x12_gate_clks, 1172 1072 ARRAY_SIZE(exynos4x12_gate_clks)); 1073 + samsung_clk_register_alias(exynos4x12_aliases, 1074 + ARRAY_SIZE(exynos4x12_aliases)); 1173 1075 } 1076 + 1077 + samsung_clk_register_alias(exynos4_aliases, 1078 + ARRAY_SIZE(exynos4_aliases)); 1174 1079 1175 1080 pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" 1176 1081 "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", 1177 1082 exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", 1178 - _get_rate("sclk_apll"), _get_rate("mout_mpll"), 1083 + _get_rate("sclk_apll"), _get_rate("sclk_mpll"), 1179 1084 _get_rate("sclk_epll"), _get_rate("sclk_vpll"), 1180 - _get_rate("armclk")); 1085 + _get_rate("arm_clk")); 1181 1086 } 1182 1087 1183 1088
+96 -33
drivers/clk/samsung/clk-exynos5250.c
··· 17 17 #include <linux/of_address.h> 18 18 19 19 #include "clk.h" 20 - #include "clk-pll.h" 21 20 21 + #define APLL_LOCK 0x0 22 + #define APLL_CON0 0x100 22 23 #define SRC_CPU 0x200 23 24 #define DIV_CPU0 0x500 25 + #define MPLL_LOCK 0x4000 26 + #define MPLL_CON0 0x4100 24 27 #define SRC_CORE1 0x4204 28 + #define CPLL_LOCK 0x10020 29 + #define EPLL_LOCK 0x10030 30 + #define VPLL_LOCK 0x10040 31 + #define GPLL_LOCK 0x10050 32 + #define CPLL_CON0 0x10120 33 + #define EPLL_CON0 0x10130 34 + #define VPLL_CON0 0x10140 35 + #define GPLL_CON0 0x10150 25 36 #define SRC_TOP0 0x10210 26 37 #define SRC_TOP2 0x10218 27 38 #define SRC_GSCL 0x10220 ··· 70 59 #define GATE_IP_FSYS 0x10944 71 60 #define GATE_IP_PERIC 0x10950 72 61 #define GATE_IP_PERIS 0x10960 62 + #define BPLL_LOCK 0x20010 63 + #define BPLL_CON0 0x20110 73 64 #define SRC_CDREX 0x20200 74 65 #define PLL_DIV2_SEL 0x20a24 75 66 #define GATE_IP_DISP1 0x10928 67 + #define GATE_IP_ACP 0x10000 68 + 69 + /* list of PLLs to be registered */ 70 + enum exynos5250_plls { 71 + apll, mpll, cpll, epll, vpll, gpll, bpll, 72 + nr_plls /* number of PLLs */ 73 + }; 76 74 77 75 /* 78 76 * Let each supported clock get a unique id. This id is used to lookup the clock ··· 99 79 none, 100 80 101 81 /* core clocks */ 102 - fin_pll, 82 + fin_pll, fout_apll, fout_mpll, fout_bpll, fout_gpll, fout_cpll, 83 + fout_epll, fout_vpll, 103 84 104 85 /* gate for special clocks (sclk) */ 105 86 sclk_cam_bayer = 128, sclk_cam0, sclk_cam1, sclk_gscl_wa, sclk_gscl_wb, ··· 108 87 sclk_mmc0, sclk_mmc1, sclk_mmc2, sclk_mmc3, sclk_sata, sclk_usb3, 109 88 sclk_jpeg, sclk_uart0, sclk_uart1, sclk_uart2, sclk_uart3, sclk_pwm, 110 89 sclk_audio1, sclk_audio2, sclk_spdif, sclk_spi0, sclk_spi1, sclk_spi2, 111 - div_i2s1, div_i2s2, 90 + div_i2s1, div_i2s2, sclk_hdmiphy, 112 91 113 92 /* gate clocks */ 114 93 gscl0 = 256, gscl1, gscl2, gscl3, gscl_wa, gscl_wb, smmu_gscl0, ··· 120 99 spi2, i2s1, i2s2, pcm1, pcm2, pwm, spdif, ac97, hsi2c0, hsi2c1, hsi2c2, 121 100 hsi2c3, chipid, sysreg, pmu, cmu_top, cmu_core, cmu_mem, tzpc0, tzpc1, 122 101 tzpc2, tzpc3, tzpc4, tzpc5, tzpc6, tzpc7, tzpc8, tzpc9, hdmi_cec, mct, 123 - wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, 102 + wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, g2d, 103 + 104 + /* mux clocks */ 105 + mout_hdmi = 1024, 124 106 125 107 nr_clks, 126 108 }; ··· 132 108 * list of controller registers to be saved and restored during a 133 109 * suspend/resume cycle. 134 110 */ 135 - static __initdata unsigned long exynos5250_clk_regs[] = { 111 + static unsigned long exynos5250_clk_regs[] __initdata = { 136 112 SRC_CPU, 137 113 DIV_CPU0, 138 114 SRC_CORE1, ··· 176 152 SRC_CDREX, 177 153 PLL_DIV2_SEL, 178 154 GATE_IP_DISP1, 155 + GATE_IP_ACP, 179 156 }; 180 157 181 158 /* list of all parent clock list */ ··· 216 191 "spdif_extclk" }; 217 192 218 193 /* fixed rate clocks generated outside the soc */ 219 - struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initdata = { 194 + static struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initdata = { 220 195 FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), 221 196 }; 222 197 223 198 /* fixed rate clocks generated inside the soc */ 224 - struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initdata = { 225 - FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), 199 + static struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initdata = { 200 + FRATE(sclk_hdmiphy, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), 226 201 FRATE(none, "sclk_hdmi27m", NULL, CLK_IS_ROOT, 27000000), 227 202 FRATE(none, "sclk_dptxphy", NULL, CLK_IS_ROOT, 24000000), 228 203 FRATE(none, "sclk_uhostphy", NULL, CLK_IS_ROOT, 48000000), 229 204 }; 230 205 231 - struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { 206 + static struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { 232 207 FFACTOR(none, "fout_mplldiv2", "fout_mpll", 1, 2, 0), 233 208 FFACTOR(none, "fout_bplldiv2", "fout_bpll", 1, 2, 0), 234 209 }; 235 210 236 - struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { 211 + static struct samsung_mux_clock exynos5250_pll_pmux_clks[] __initdata = { 212 + MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), 213 + }; 214 + 215 + static struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { 237 216 MUX_A(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, "mout_apll"), 238 217 MUX_A(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), 239 218 MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), 240 219 MUX_A(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), 241 220 MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), 242 221 MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), 243 - MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), 244 222 MUX(none, "sclk_vpll", mout_vpll_p, SRC_TOP2, 16, 1), 245 223 MUX(none, "sclk_epll", mout_epll_p, SRC_TOP2, 12, 1), 246 224 MUX(none, "sclk_cpll", mout_cpll_p, SRC_TOP2, 8, 1), ··· 260 232 MUX(none, "mout_fimd1", mout_group1_p, SRC_DISP1_0, 0, 4), 261 233 MUX(none, "mout_mipi1", mout_group1_p, SRC_DISP1_0, 12, 4), 262 234 MUX(none, "mout_dp", mout_group1_p, SRC_DISP1_0, 16, 4), 263 - MUX(none, "mout_hdmi", mout_hdmi_p, SRC_DISP1_0, 20, 1), 235 + MUX(mout_hdmi, "mout_hdmi", mout_hdmi_p, SRC_DISP1_0, 20, 1), 264 236 MUX(none, "mout_audio0", mout_audio0_p, SRC_MAU, 0, 4), 265 237 MUX(none, "mout_mmc0", mout_group1_p, SRC_FSYS, 0, 4), 266 238 MUX(none, "mout_mmc1", mout_group1_p, SRC_FSYS, 4, 4), ··· 282 254 MUX(none, "mout_spi2", mout_group1_p, SRC_PERIC1, 24, 4), 283 255 }; 284 256 285 - struct samsung_div_clock exynos5250_div_clks[] __initdata = { 257 + static struct samsung_div_clock exynos5250_div_clks[] __initdata = { 286 258 DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), 287 259 DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), 288 260 DIV(none, "aclk66_pre", "sclk_mpll_user", DIV_TOP1, 24, 3), ··· 342 314 DIV_PERIC2, 8, 8, CLK_SET_RATE_PARENT, 0), 343 315 }; 344 316 345 - struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { 317 + static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { 346 318 GATE(gscl0, "gscl0", "none", GATE_IP_GSCL, 0, 0, 0), 347 319 GATE(gscl1, "gscl1", "none", GATE_IP_GSCL, 1, 0, 0), 348 320 GATE(gscl2, "gscl2", "aclk266", GATE_IP_GSCL, 2, 0, 0), ··· 489 461 GATE(mie1, "mie1", "aclk200", GATE_IP_DISP1, 1, 0, 0), 490 462 GATE(dsim0, "dsim0", "aclk200", GATE_IP_DISP1, 3, 0, 0), 491 463 GATE(dp, "dp", "aclk200", GATE_IP_DISP1, 4, 0, 0), 492 - GATE(mixer, "mixer", "aclk200", GATE_IP_DISP1, 5, 0, 0), 493 - GATE(hdmi, "hdmi", "aclk200", GATE_IP_DISP1, 6, 0, 0), 464 + GATE(mixer, "mixer", "mout_aclk200_disp1", GATE_IP_DISP1, 5, 0, 0), 465 + GATE(hdmi, "hdmi", "mout_aclk200_disp1", GATE_IP_DISP1, 6, 0, 0), 466 + GATE(g2d, "g2d", "aclk200", GATE_IP_ACP, 3, 0, 0), 494 467 }; 495 468 496 - static __initdata struct of_device_id ext_clk_match[] = { 469 + static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = { 470 + /* sorted in descending order */ 471 + /* PLL_36XX_RATE(rate, m, p, s, k) */ 472 + PLL_36XX_RATE(266000000, 266, 3, 3, 0), 473 + /* Not in UM, but need for eDP on snow */ 474 + PLL_36XX_RATE(70500000, 94, 2, 4, 0), 475 + { }, 476 + }; 477 + 478 + static struct samsung_pll_rate_table epll_24mhz_tbl[] __initdata = { 479 + /* sorted in descending order */ 480 + /* PLL_36XX_RATE(rate, m, p, s, k) */ 481 + PLL_36XX_RATE(192000000, 64, 2, 2, 0), 482 + PLL_36XX_RATE(180633600, 90, 3, 2, 20762), 483 + PLL_36XX_RATE(180000000, 90, 3, 2, 0), 484 + PLL_36XX_RATE(73728000, 98, 2, 4, 19923), 485 + PLL_36XX_RATE(67737600, 90, 2, 4, 20762), 486 + PLL_36XX_RATE(49152000, 98, 3, 4, 19923), 487 + PLL_36XX_RATE(45158400, 90, 3, 4, 20762), 488 + PLL_36XX_RATE(32768000, 131, 3, 5, 4719), 489 + { }, 490 + }; 491 + 492 + static struct samsung_pll_clock exynos5250_plls[nr_plls] __initdata = { 493 + [apll] = PLL_A(pll_35xx, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, 494 + APLL_CON0, "fout_apll", NULL), 495 + [mpll] = PLL_A(pll_35xx, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, 496 + MPLL_CON0, "fout_mpll", NULL), 497 + [bpll] = PLL(pll_35xx, fout_bpll, "fout_bpll", "fin_pll", BPLL_LOCK, 498 + BPLL_CON0, NULL), 499 + [gpll] = PLL(pll_35xx, fout_gpll, "fout_gpll", "fin_pll", GPLL_LOCK, 500 + GPLL_CON0, NULL), 501 + [cpll] = PLL(pll_35xx, fout_cpll, "fout_cpll", "fin_pll", CPLL_LOCK, 502 + CPLL_CON0, NULL), 503 + [epll] = PLL(pll_36xx, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, 504 + EPLL_CON0, NULL), 505 + [vpll] = PLL(pll_36xx, fout_vpll, "fout_vpll", "mout_vpllsrc", 506 + VPLL_LOCK, VPLL_CON0, NULL), 507 + }; 508 + 509 + static struct of_device_id ext_clk_match[] __initdata = { 497 510 { .compatible = "samsung,clock-xxti", .data = (void *)0, }, 498 511 { }, 499 512 }; 500 513 501 514 /* register exynox5250 clocks */ 502 - void __init exynos5250_clk_init(struct device_node *np) 515 + static void __init exynos5250_clk_init(struct device_node *np) 503 516 { 504 517 void __iomem *reg_base; 505 - struct clk *apll, *mpll, *epll, *vpll, *bpll, *gpll, *cpll; 506 518 507 519 if (np) { 508 520 reg_base = of_iomap(np, 0); ··· 558 490 samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks, 559 491 ARRAY_SIZE(exynos5250_fixed_rate_ext_clks), 560 492 ext_clk_match); 493 + samsung_clk_register_mux(exynos5250_pll_pmux_clks, 494 + ARRAY_SIZE(exynos5250_pll_pmux_clks)); 561 495 562 - apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", 563 - reg_base + 0x100); 564 - mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", 565 - reg_base + 0x4100); 566 - bpll = samsung_clk_register_pll35xx("fout_bpll", "fin_pll", 567 - reg_base + 0x20110); 568 - gpll = samsung_clk_register_pll35xx("fout_gpll", "fin_pll", 569 - reg_base + 0x10150); 570 - cpll = samsung_clk_register_pll35xx("fout_cpll", "fin_pll", 571 - reg_base + 0x10120); 572 - epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", 573 - reg_base + 0x10130); 574 - vpll = samsung_clk_register_pll36xx("fout_vpll", "mout_vpllsrc", 575 - reg_base + 0x10140); 496 + if (_get_rate("fin_pll") == 24 * MHZ) 497 + exynos5250_plls[epll].rate_table = epll_24mhz_tbl; 576 498 499 + if (_get_rate("mout_vpllsrc") == 24 * MHZ) 500 + exynos5250_plls[vpll].rate_table = vpll_24mhz_tbl; 501 + 502 + samsung_clk_register_pll(exynos5250_plls, ARRAY_SIZE(exynos5250_plls), 503 + reg_base); 577 504 samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks, 578 505 ARRAY_SIZE(exynos5250_fixed_rate_clks)); 579 506 samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks,
+80 -43
drivers/clk/samsung/clk-exynos5420.c
··· 17 17 #include <linux/of_address.h> 18 18 19 19 #include "clk.h" 20 - #include "clk-pll.h" 21 20 21 + #define APLL_LOCK 0x0 22 + #define APLL_CON0 0x100 22 23 #define SRC_CPU 0x200 23 24 #define DIV_CPU0 0x500 24 25 #define DIV_CPU1 0x504 25 26 #define GATE_BUS_CPU 0x700 26 27 #define GATE_SCLK_CPU 0x800 28 + #define CPLL_LOCK 0x10020 29 + #define DPLL_LOCK 0x10030 30 + #define EPLL_LOCK 0x10040 31 + #define RPLL_LOCK 0x10050 32 + #define IPLL_LOCK 0x10060 33 + #define SPLL_LOCK 0x10070 34 + #define VPLL_LOCK 0x10070 35 + #define MPLL_LOCK 0x10090 36 + #define CPLL_CON0 0x10120 37 + #define DPLL_CON0 0x10128 38 + #define EPLL_CON0 0x10130 39 + #define RPLL_CON0 0x10140 40 + #define IPLL_CON0 0x10150 41 + #define SPLL_CON0 0x10160 42 + #define VPLL_CON0 0x10170 43 + #define MPLL_CON0 0x10180 27 44 #define SRC_TOP0 0x10200 28 45 #define SRC_TOP1 0x10204 29 46 #define SRC_TOP2 0x10208 ··· 92 75 #define GATE_TOP_SCLK_MAU 0x1083c 93 76 #define GATE_TOP_SCLK_FSYS 0x10840 94 77 #define GATE_TOP_SCLK_PERIC 0x10850 78 + #define BPLL_LOCK 0x20010 79 + #define BPLL_CON0 0x20110 95 80 #define SRC_CDREX 0x20200 81 + #define KPLL_LOCK 0x28000 82 + #define KPLL_CON0 0x28100 96 83 #define SRC_KFC 0x28200 97 84 #define DIV_KFC0 0x28500 85 + 86 + /* list of PLLs */ 87 + enum exynos5420_plls { 88 + apll, cpll, dpll, epll, rpll, ipll, spll, vpll, mpll, 89 + bpll, kpll, 90 + nr_plls /* number of PLLs */ 91 + }; 98 92 99 93 enum exynos5420_clks { 100 94 none, 101 95 102 96 /* core clocks */ 103 - fin_pll, 97 + fin_pll, fout_apll, fout_cpll, fout_dpll, fout_epll, fout_rpll, 98 + fout_ipll, fout_spll, fout_vpll, fout_mpll, fout_bpll, fout_kpll, 104 99 105 100 /* gate for special clocks (sclk) */ 106 101 sclk_uart0 = 128, sclk_uart1, sclk_uart2, sclk_uart3, sclk_mmc0, ··· 120 91 sclk_i2s2, sclk_pcm1, sclk_pcm2, sclk_spdif, sclk_hdmi, sclk_pixel, 121 92 sclk_dp1, sclk_mipi1, sclk_fimd1, sclk_maudio0, sclk_maupcm0, 122 93 sclk_usbd300, sclk_usbd301, sclk_usbphy300, sclk_usbphy301, sclk_unipro, 123 - sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, 94 + sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, sclk_hdmiphy, 124 95 125 96 /* gate clocks */ 126 97 aclk66_peric = 256, uart0, uart1, uart2, uart3, i2c0, i2c1, i2c2, i2c3, ··· 138 109 aclk300_gscl = 460, smmu_gscl0, smmu_gscl1, gscl_wa, gscl_wb, gscl0, 139 110 gscl1, clk_3aa, aclk266_g2d = 470, sss, slim_sss, mdma0, 140 111 aclk333_g2d = 480, g2d, aclk333_432_gscl = 490, smmu_3aa, smmu_fimcl0, 141 - smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, 112 + smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, smmu_mixer, 113 + 114 + /* mux clocks */ 115 + mout_hdmi = 640, 116 + 117 + /* divider clocks */ 118 + dout_pixel = 768, 142 119 143 120 nr_clks, 144 121 }; ··· 153 118 * list of controller registers to be saved and restored during a 154 119 * suspend/resume cycle. 155 120 */ 156 - static __initdata unsigned long exynos5420_clk_regs[] = { 121 + static unsigned long exynos5420_clk_regs[] __initdata = { 157 122 SRC_CPU, 158 123 DIV_CPU0, 159 124 DIV_CPU1, ··· 292 257 "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 293 258 PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", 294 259 "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 295 - PNAME(hdmi_p) = { "sclk_hdmiphy", "dout_hdmi_pixel" }; 260 + PNAME(hdmi_p) = { "dout_hdmi_pixel", "sclk_hdmiphy" }; 296 261 PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", 297 262 "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; 298 263 299 264 /* fixed rate clocks generated outside the soc */ 300 - struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { 265 + static struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { 301 266 FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), 302 267 }; 303 268 304 269 /* fixed rate clocks generated inside the soc */ 305 - struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { 306 - FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), 270 + static struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { 271 + FRATE(sclk_hdmiphy, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), 307 272 FRATE(none, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), 308 273 FRATE(none, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), 309 274 FRATE(none, "mphy_refclk_ixtal24", NULL, CLK_IS_ROOT, 48000000), 310 275 FRATE(none, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), 311 276 }; 312 277 313 - struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { 278 + static struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { 314 279 FFACTOR(none, "sclk_hsic_12m", "fin_pll", 1, 2, 0), 315 280 }; 316 281 317 - struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { 282 + static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { 318 283 MUX(none, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), 319 284 MUX(none, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), 320 285 MUX(none, "mout_apll", apll_p, SRC_CPU, 0, 1), ··· 406 371 MUX(none, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), 407 372 MUX(none, "mout_dp1", group2_p, SRC_DISP10, 20, 3), 408 373 MUX(none, "mout_pixel", group2_p, SRC_DISP10, 24, 3), 409 - MUX(none, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), 374 + MUX(mout_hdmi, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), 410 375 411 376 /* MAU Block */ 412 377 MUX(none, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), ··· 434 399 MUX(none, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), 435 400 }; 436 401 437 - struct samsung_div_clock exynos5420_div_clks[] __initdata = { 402 + static struct samsung_div_clock exynos5420_div_clks[] __initdata = { 438 403 DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), 439 404 DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), 440 405 DIV(none, "armclk2", "div_arm", DIV_CPU0, 28, 3), ··· 466 431 DIV(none, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), 467 432 DIV(none, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), 468 433 DIV(none, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), 469 - DIV(none, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), 434 + DIV(dout_pixel, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), 470 435 471 436 /* Audio Block */ 472 437 DIV(none, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), ··· 514 479 DIV(none, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), 515 480 }; 516 481 517 - struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { 482 + static struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { 518 483 /* TODO: Re-verify the CG bits for all the gate clocks */ 519 484 GATE_A(mct, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, "mct"), 520 485 ··· 731 696 GATE(smmu_mscl0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 0), 732 697 GATE(smmu_mscl1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 0), 733 698 GATE(smmu_mscl2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 0), 699 + GATE(smmu_mixer, "smmu_mixer", "aclk200_disp1", GATE_IP_DISP1, 9, 0, 0), 734 700 }; 735 701 736 - static __initdata struct of_device_id ext_clk_match[] = { 702 + static struct samsung_pll_clock exynos5420_plls[nr_plls] __initdata = { 703 + [apll] = PLL(pll_2550, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, 704 + APLL_CON0, NULL), 705 + [cpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, 706 + MPLL_CON0, NULL), 707 + [dpll] = PLL(pll_2550, fout_dpll, "fout_dpll", "fin_pll", DPLL_LOCK, 708 + DPLL_CON0, NULL), 709 + [epll] = PLL(pll_2650, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, 710 + EPLL_CON0, NULL), 711 + [rpll] = PLL(pll_2650, fout_rpll, "fout_rpll", "fin_pll", RPLL_LOCK, 712 + RPLL_CON0, NULL), 713 + [ipll] = PLL(pll_2550, fout_ipll, "fout_ipll", "fin_pll", IPLL_LOCK, 714 + IPLL_CON0, NULL), 715 + [spll] = PLL(pll_2550, fout_spll, "fout_spll", "fin_pll", SPLL_LOCK, 716 + SPLL_CON0, NULL), 717 + [vpll] = PLL(pll_2550, fout_vpll, "fout_vpll", "fin_pll", VPLL_LOCK, 718 + VPLL_CON0, NULL), 719 + [mpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, 720 + MPLL_CON0, NULL), 721 + [bpll] = PLL(pll_2550, fout_bpll, "fout_bpll", "fin_pll", BPLL_LOCK, 722 + BPLL_CON0, NULL), 723 + [kpll] = PLL(pll_2550, fout_kpll, "fout_kpll", "fin_pll", KPLL_LOCK, 724 + KPLL_CON0, NULL), 725 + }; 726 + 727 + static struct of_device_id ext_clk_match[] __initdata = { 737 728 { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, 738 729 { }, 739 730 }; 740 731 741 732 /* register exynos5420 clocks */ 742 - void __init exynos5420_clk_init(struct device_node *np) 733 + static void __init exynos5420_clk_init(struct device_node *np) 743 734 { 744 735 void __iomem *reg_base; 745 - struct clk *apll, *bpll, *cpll, *dpll, *epll, *ipll, *kpll, *mpll; 746 - struct clk *rpll, *spll, *vpll; 747 736 748 737 if (np) { 749 738 reg_base = of_iomap(np, 0); ··· 783 724 samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, 784 725 ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), 785 726 ext_clk_match); 786 - 787 - apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", 788 - reg_base + 0x100); 789 - bpll = samsung_clk_register_pll35xx("fout_bpll", "fin_pll", 790 - reg_base + 0x20110); 791 - cpll = samsung_clk_register_pll35xx("fout_cpll", "fin_pll", 792 - reg_base + 0x10120); 793 - dpll = samsung_clk_register_pll35xx("fout_dpll", "fin_pll", 794 - reg_base + 0x10128); 795 - epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", 796 - reg_base + 0x10130); 797 - ipll = samsung_clk_register_pll35xx("fout_ipll", "fin_pll", 798 - reg_base + 0x10150); 799 - kpll = samsung_clk_register_pll35xx("fout_kpll", "fin_pll", 800 - reg_base + 0x28100); 801 - mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", 802 - reg_base + 0x10180); 803 - rpll = samsung_clk_register_pll36xx("fout_rpll", "fin_pll", 804 - reg_base + 0x10140); 805 - spll = samsung_clk_register_pll35xx("fout_spll", "fin_pll", 806 - reg_base + 0x10160); 807 - vpll = samsung_clk_register_pll35xx("fout_vpll", "fin_pll", 808 - reg_base + 0x10170); 809 - 727 + samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls), 728 + reg_base); 810 729 samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, 811 730 ARRAY_SIZE(exynos5420_fixed_rate_clks)); 812 731 samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks,
+9 -9
drivers/clk/samsung/clk-exynos5440.c
··· 41 41 PNAME(mout_spi_p) = { "div125", "div200" }; 42 42 43 43 /* fixed rate clocks generated outside the soc */ 44 - struct samsung_fixed_rate_clock exynos5440_fixed_rate_ext_clks[] __initdata = { 44 + static struct samsung_fixed_rate_clock exynos5440_fixed_rate_ext_clks[] __initdata = { 45 45 FRATE(none, "xtal", NULL, CLK_IS_ROOT, 0), 46 46 }; 47 47 48 48 /* fixed rate clocks */ 49 - struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initdata = { 49 + static struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initdata = { 50 50 FRATE(none, "ppll", NULL, CLK_IS_ROOT, 1000000000), 51 51 FRATE(none, "usb_phy0", NULL, CLK_IS_ROOT, 60000000), 52 52 FRATE(none, "usb_phy1", NULL, CLK_IS_ROOT, 60000000), ··· 55 55 }; 56 56 57 57 /* fixed factor clocks */ 58 - struct samsung_fixed_factor_clock exynos5440_fixed_factor_clks[] __initdata = { 58 + static struct samsung_fixed_factor_clock exynos5440_fixed_factor_clks[] __initdata = { 59 59 FFACTOR(none, "div250", "ppll", 1, 4, 0), 60 60 FFACTOR(none, "div200", "ppll", 1, 5, 0), 61 61 FFACTOR(none, "div125", "div250", 1, 2, 0), 62 62 }; 63 63 64 64 /* mux clocks */ 65 - struct samsung_mux_clock exynos5440_mux_clks[] __initdata = { 65 + static struct samsung_mux_clock exynos5440_mux_clks[] __initdata = { 66 66 MUX(none, "mout_spi", mout_spi_p, MISC_DOUT1, 5, 1), 67 67 MUX_A(arm_clk, "arm_clk", mout_armclk_p, 68 68 CPU_CLK_STATUS, 0, 1, "armclk"), 69 69 }; 70 70 71 71 /* divider clocks */ 72 - struct samsung_div_clock exynos5440_div_clks[] __initdata = { 72 + static struct samsung_div_clock exynos5440_div_clks[] __initdata = { 73 73 DIV(spi_baud, "div_spi", "mout_spi", MISC_DOUT1, 3, 2), 74 74 }; 75 75 76 76 /* gate clocks */ 77 - struct samsung_gate_clock exynos5440_gate_clks[] __initdata = { 77 + static struct samsung_gate_clock exynos5440_gate_clks[] __initdata = { 78 78 GATE(pb0_250, "pb0_250", "div250", CLKEN_OV_VAL, 3, 0, 0), 79 79 GATE(pr0_250, "pr0_250", "div250", CLKEN_OV_VAL, 4, 0, 0), 80 80 GATE(pr1_250, "pr1_250", "div250", CLKEN_OV_VAL, 5, 0, 0), ··· 97 97 GATE(cs250_o, "cs250_o", "cs250", CLKEN_OV_VAL, 19, 0, 0), 98 98 }; 99 99 100 - static __initdata struct of_device_id ext_clk_match[] = { 100 + static struct of_device_id ext_clk_match[] __initdata = { 101 101 { .compatible = "samsung,clock-xtal", .data = (void *)0, }, 102 102 {}, 103 103 }; 104 104 105 105 /* register exynos5440 clocks */ 106 - void __init exynos5440_clk_init(struct device_node *np) 106 + static void __init exynos5440_clk_init(struct device_node *np) 107 107 { 108 108 void __iomem *reg_base; 109 109 ··· 132 132 samsung_clk_register_gate(exynos5440_gate_clks, 133 133 ARRAY_SIZE(exynos5440_gate_clks)); 134 134 135 - pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("armclk")); 135 + pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk")); 136 136 pr_info("exynos5440 clock initialization complete\n"); 137 137 } 138 138 CLK_OF_DECLARE(exynos5440_clk, "samsung,exynos5440-clock", exynos5440_clk_init);
+572 -167
drivers/clk/samsung/clk-pll.c
··· 10 10 */ 11 11 12 12 #include <linux/errno.h> 13 + #include <linux/hrtimer.h> 13 14 #include "clk.h" 14 15 #include "clk-pll.h" 16 + 17 + #define PLL_TIMEOUT_MS 10 18 + 19 + struct samsung_clk_pll { 20 + struct clk_hw hw; 21 + void __iomem *lock_reg; 22 + void __iomem *con_reg; 23 + enum samsung_pll_type type; 24 + unsigned int rate_count; 25 + const struct samsung_pll_rate_table *rate_table; 26 + }; 27 + 28 + #define to_clk_pll(_hw) container_of(_hw, struct samsung_clk_pll, hw) 29 + 30 + static const struct samsung_pll_rate_table *samsung_get_pll_settings( 31 + struct samsung_clk_pll *pll, unsigned long rate) 32 + { 33 + const struct samsung_pll_rate_table *rate_table = pll->rate_table; 34 + int i; 35 + 36 + for (i = 0; i < pll->rate_count; i++) { 37 + if (rate == rate_table[i].rate) 38 + return &rate_table[i]; 39 + } 40 + 41 + return NULL; 42 + } 43 + 44 + static long samsung_pll_round_rate(struct clk_hw *hw, 45 + unsigned long drate, unsigned long *prate) 46 + { 47 + struct samsung_clk_pll *pll = to_clk_pll(hw); 48 + const struct samsung_pll_rate_table *rate_table = pll->rate_table; 49 + int i; 50 + 51 + /* Assumming rate_table is in descending order */ 52 + for (i = 0; i < pll->rate_count; i++) { 53 + if (drate >= rate_table[i].rate) 54 + return rate_table[i].rate; 55 + } 56 + 57 + /* return minimum supported value */ 58 + return rate_table[i - 1].rate; 59 + } 15 60 16 61 /* 17 62 * PLL35xx Clock Type 18 63 */ 64 + /* Maximum lock time can be 270 * PDIV cycles */ 65 + #define PLL35XX_LOCK_FACTOR (270) 19 66 20 67 #define PLL35XX_MDIV_MASK (0x3FF) 21 68 #define PLL35XX_PDIV_MASK (0x3F) 22 69 #define PLL35XX_SDIV_MASK (0x7) 70 + #define PLL35XX_LOCK_STAT_MASK (0x1) 23 71 #define PLL35XX_MDIV_SHIFT (16) 24 72 #define PLL35XX_PDIV_SHIFT (8) 25 73 #define PLL35XX_SDIV_SHIFT (0) 26 - 27 - struct samsung_clk_pll35xx { 28 - struct clk_hw hw; 29 - const void __iomem *con_reg; 30 - }; 31 - 32 - #define to_clk_pll35xx(_hw) container_of(_hw, struct samsung_clk_pll35xx, hw) 74 + #define PLL35XX_LOCK_STAT_SHIFT (29) 33 75 34 76 static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw, 35 77 unsigned long parent_rate) 36 78 { 37 - struct samsung_clk_pll35xx *pll = to_clk_pll35xx(hw); 79 + struct samsung_clk_pll *pll = to_clk_pll(hw); 38 80 u32 mdiv, pdiv, sdiv, pll_con; 39 81 u64 fvco = parent_rate; 40 82 ··· 91 49 return (unsigned long)fvco; 92 50 } 93 51 52 + static inline bool samsung_pll35xx_mp_change( 53 + const struct samsung_pll_rate_table *rate, u32 pll_con) 54 + { 55 + u32 old_mdiv, old_pdiv; 56 + 57 + old_mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK; 58 + old_pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK; 59 + 60 + return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv); 61 + } 62 + 63 + static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate, 64 + unsigned long prate) 65 + { 66 + struct samsung_clk_pll *pll = to_clk_pll(hw); 67 + const struct samsung_pll_rate_table *rate; 68 + u32 tmp; 69 + 70 + /* Get required rate settings from table */ 71 + rate = samsung_get_pll_settings(pll, drate); 72 + if (!rate) { 73 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 74 + drate, __clk_get_name(hw->clk)); 75 + return -EINVAL; 76 + } 77 + 78 + tmp = __raw_readl(pll->con_reg); 79 + 80 + if (!(samsung_pll35xx_mp_change(rate, tmp))) { 81 + /* If only s change, change just s value only*/ 82 + tmp &= ~(PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT); 83 + tmp |= rate->sdiv << PLL35XX_SDIV_SHIFT; 84 + __raw_writel(tmp, pll->con_reg); 85 + 86 + return 0; 87 + } 88 + 89 + /* Set PLL lock time. */ 90 + __raw_writel(rate->pdiv * PLL35XX_LOCK_FACTOR, 91 + pll->lock_reg); 92 + 93 + /* Change PLL PMS values */ 94 + tmp &= ~((PLL35XX_MDIV_MASK << PLL35XX_MDIV_SHIFT) | 95 + (PLL35XX_PDIV_MASK << PLL35XX_PDIV_SHIFT) | 96 + (PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT)); 97 + tmp |= (rate->mdiv << PLL35XX_MDIV_SHIFT) | 98 + (rate->pdiv << PLL35XX_PDIV_SHIFT) | 99 + (rate->sdiv << PLL35XX_SDIV_SHIFT); 100 + __raw_writel(tmp, pll->con_reg); 101 + 102 + /* wait_lock_time */ 103 + do { 104 + cpu_relax(); 105 + tmp = __raw_readl(pll->con_reg); 106 + } while (!(tmp & (PLL35XX_LOCK_STAT_MASK 107 + << PLL35XX_LOCK_STAT_SHIFT))); 108 + return 0; 109 + } 110 + 94 111 static const struct clk_ops samsung_pll35xx_clk_ops = { 95 112 .recalc_rate = samsung_pll35xx_recalc_rate, 113 + .round_rate = samsung_pll_round_rate, 114 + .set_rate = samsung_pll35xx_set_rate, 96 115 }; 97 116 98 - struct clk * __init samsung_clk_register_pll35xx(const char *name, 99 - const char *pname, const void __iomem *con_reg) 100 - { 101 - struct samsung_clk_pll35xx *pll; 102 - struct clk *clk; 103 - struct clk_init_data init; 104 - 105 - pll = kzalloc(sizeof(*pll), GFP_KERNEL); 106 - if (!pll) { 107 - pr_err("%s: could not allocate pll clk %s\n", __func__, name); 108 - return NULL; 109 - } 110 - 111 - init.name = name; 112 - init.ops = &samsung_pll35xx_clk_ops; 113 - init.flags = CLK_GET_RATE_NOCACHE; 114 - init.parent_names = &pname; 115 - init.num_parents = 1; 116 - 117 - pll->hw.init = &init; 118 - pll->con_reg = con_reg; 119 - 120 - clk = clk_register(NULL, &pll->hw); 121 - if (IS_ERR(clk)) { 122 - pr_err("%s: failed to register pll clock %s\n", __func__, 123 - name); 124 - kfree(pll); 125 - } 126 - 127 - if (clk_register_clkdev(clk, name, NULL)) 128 - pr_err("%s: failed to register lookup for %s", __func__, name); 129 - 130 - return clk; 131 - } 117 + static const struct clk_ops samsung_pll35xx_clk_min_ops = { 118 + .recalc_rate = samsung_pll35xx_recalc_rate, 119 + }; 132 120 133 121 /* 134 122 * PLL36xx Clock Type 135 123 */ 124 + /* Maximum lock time can be 3000 * PDIV cycles */ 125 + #define PLL36XX_LOCK_FACTOR (3000) 136 126 137 127 #define PLL36XX_KDIV_MASK (0xFFFF) 138 128 #define PLL36XX_MDIV_MASK (0x1FF) ··· 173 99 #define PLL36XX_MDIV_SHIFT (16) 174 100 #define PLL36XX_PDIV_SHIFT (8) 175 101 #define PLL36XX_SDIV_SHIFT (0) 176 - 177 - struct samsung_clk_pll36xx { 178 - struct clk_hw hw; 179 - const void __iomem *con_reg; 180 - }; 181 - 182 - #define to_clk_pll36xx(_hw) container_of(_hw, struct samsung_clk_pll36xx, hw) 102 + #define PLL36XX_KDIV_SHIFT (0) 103 + #define PLL36XX_LOCK_STAT_SHIFT (29) 183 104 184 105 static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, 185 106 unsigned long parent_rate) 186 107 { 187 - struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); 108 + struct samsung_clk_pll *pll = to_clk_pll(hw); 188 109 u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; 189 110 s16 kdiv; 190 111 u64 fvco = parent_rate; ··· 198 129 return (unsigned long)fvco; 199 130 } 200 131 132 + static inline bool samsung_pll36xx_mpk_change( 133 + const struct samsung_pll_rate_table *rate, u32 pll_con0, u32 pll_con1) 134 + { 135 + u32 old_mdiv, old_pdiv, old_kdiv; 136 + 137 + old_mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; 138 + old_pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; 139 + old_kdiv = (pll_con1 >> PLL36XX_KDIV_SHIFT) & PLL36XX_KDIV_MASK; 140 + 141 + return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || 142 + rate->kdiv != old_kdiv); 143 + } 144 + 145 + static int samsung_pll36xx_set_rate(struct clk_hw *hw, unsigned long drate, 146 + unsigned long parent_rate) 147 + { 148 + struct samsung_clk_pll *pll = to_clk_pll(hw); 149 + u32 tmp, pll_con0, pll_con1; 150 + const struct samsung_pll_rate_table *rate; 151 + 152 + rate = samsung_get_pll_settings(pll, drate); 153 + if (!rate) { 154 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 155 + drate, __clk_get_name(hw->clk)); 156 + return -EINVAL; 157 + } 158 + 159 + pll_con0 = __raw_readl(pll->con_reg); 160 + pll_con1 = __raw_readl(pll->con_reg + 4); 161 + 162 + if (!(samsung_pll36xx_mpk_change(rate, pll_con0, pll_con1))) { 163 + /* If only s change, change just s value only*/ 164 + pll_con0 &= ~(PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT); 165 + pll_con0 |= (rate->sdiv << PLL36XX_SDIV_SHIFT); 166 + __raw_writel(pll_con0, pll->con_reg); 167 + 168 + return 0; 169 + } 170 + 171 + /* Set PLL lock time. */ 172 + __raw_writel(rate->pdiv * PLL36XX_LOCK_FACTOR, pll->lock_reg); 173 + 174 + /* Change PLL PMS values */ 175 + pll_con0 &= ~((PLL36XX_MDIV_MASK << PLL36XX_MDIV_SHIFT) | 176 + (PLL36XX_PDIV_MASK << PLL36XX_PDIV_SHIFT) | 177 + (PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT)); 178 + pll_con0 |= (rate->mdiv << PLL36XX_MDIV_SHIFT) | 179 + (rate->pdiv << PLL36XX_PDIV_SHIFT) | 180 + (rate->sdiv << PLL36XX_SDIV_SHIFT); 181 + __raw_writel(pll_con0, pll->con_reg); 182 + 183 + pll_con1 &= ~(PLL36XX_KDIV_MASK << PLL36XX_KDIV_SHIFT); 184 + pll_con1 |= rate->kdiv << PLL36XX_KDIV_SHIFT; 185 + __raw_writel(pll_con1, pll->con_reg + 4); 186 + 187 + /* wait_lock_time */ 188 + do { 189 + cpu_relax(); 190 + tmp = __raw_readl(pll->con_reg); 191 + } while (!(tmp & (1 << PLL36XX_LOCK_STAT_SHIFT))); 192 + 193 + return 0; 194 + } 195 + 201 196 static const struct clk_ops samsung_pll36xx_clk_ops = { 202 197 .recalc_rate = samsung_pll36xx_recalc_rate, 198 + .set_rate = samsung_pll36xx_set_rate, 199 + .round_rate = samsung_pll_round_rate, 203 200 }; 204 201 205 - struct clk * __init samsung_clk_register_pll36xx(const char *name, 206 - const char *pname, const void __iomem *con_reg) 207 - { 208 - struct samsung_clk_pll36xx *pll; 209 - struct clk *clk; 210 - struct clk_init_data init; 211 - 212 - pll = kzalloc(sizeof(*pll), GFP_KERNEL); 213 - if (!pll) { 214 - pr_err("%s: could not allocate pll clk %s\n", __func__, name); 215 - return NULL; 216 - } 217 - 218 - init.name = name; 219 - init.ops = &samsung_pll36xx_clk_ops; 220 - init.flags = CLK_GET_RATE_NOCACHE; 221 - init.parent_names = &pname; 222 - init.num_parents = 1; 223 - 224 - pll->hw.init = &init; 225 - pll->con_reg = con_reg; 226 - 227 - clk = clk_register(NULL, &pll->hw); 228 - if (IS_ERR(clk)) { 229 - pr_err("%s: failed to register pll clock %s\n", __func__, 230 - name); 231 - kfree(pll); 232 - } 233 - 234 - if (clk_register_clkdev(clk, name, NULL)) 235 - pr_err("%s: failed to register lookup for %s", __func__, name); 236 - 237 - return clk; 238 - } 202 + static const struct clk_ops samsung_pll36xx_clk_min_ops = { 203 + .recalc_rate = samsung_pll36xx_recalc_rate, 204 + }; 239 205 240 206 /* 241 207 * PLL45xx Clock Type 242 208 */ 209 + #define PLL4502_LOCK_FACTOR 400 210 + #define PLL4508_LOCK_FACTOR 240 243 211 244 212 #define PLL45XX_MDIV_MASK (0x3FF) 245 213 #define PLL45XX_PDIV_MASK (0x3F) 246 214 #define PLL45XX_SDIV_MASK (0x7) 215 + #define PLL45XX_AFC_MASK (0x1F) 247 216 #define PLL45XX_MDIV_SHIFT (16) 248 217 #define PLL45XX_PDIV_SHIFT (8) 249 218 #define PLL45XX_SDIV_SHIFT (0) 219 + #define PLL45XX_AFC_SHIFT (0) 250 220 251 - struct samsung_clk_pll45xx { 252 - struct clk_hw hw; 253 - enum pll45xx_type type; 254 - const void __iomem *con_reg; 255 - }; 256 - 257 - #define to_clk_pll45xx(_hw) container_of(_hw, struct samsung_clk_pll45xx, hw) 221 + #define PLL45XX_ENABLE BIT(31) 222 + #define PLL45XX_LOCKED BIT(29) 258 223 259 224 static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw, 260 225 unsigned long parent_rate) 261 226 { 262 - struct samsung_clk_pll45xx *pll = to_clk_pll45xx(hw); 227 + struct samsung_clk_pll *pll = to_clk_pll(hw); 263 228 u32 mdiv, pdiv, sdiv, pll_con; 264 229 u64 fvco = parent_rate; 265 230 ··· 311 208 return (unsigned long)fvco; 312 209 } 313 210 211 + static bool samsung_pll45xx_mp_change(u32 pll_con0, u32 pll_con1, 212 + const struct samsung_pll_rate_table *rate) 213 + { 214 + u32 old_mdiv, old_pdiv, old_afc; 215 + 216 + old_mdiv = (pll_con0 >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK; 217 + old_pdiv = (pll_con0 >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK; 218 + old_afc = (pll_con1 >> PLL45XX_AFC_SHIFT) & PLL45XX_AFC_MASK; 219 + 220 + return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv 221 + || old_afc != rate->afc); 222 + } 223 + 224 + static int samsung_pll45xx_set_rate(struct clk_hw *hw, unsigned long drate, 225 + unsigned long prate) 226 + { 227 + struct samsung_clk_pll *pll = to_clk_pll(hw); 228 + const struct samsung_pll_rate_table *rate; 229 + u32 con0, con1; 230 + ktime_t start; 231 + 232 + /* Get required rate settings from table */ 233 + rate = samsung_get_pll_settings(pll, drate); 234 + if (!rate) { 235 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 236 + drate, __clk_get_name(hw->clk)); 237 + return -EINVAL; 238 + } 239 + 240 + con0 = __raw_readl(pll->con_reg); 241 + con1 = __raw_readl(pll->con_reg + 0x4); 242 + 243 + if (!(samsung_pll45xx_mp_change(con0, con1, rate))) { 244 + /* If only s change, change just s value only*/ 245 + con0 &= ~(PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT); 246 + con0 |= rate->sdiv << PLL45XX_SDIV_SHIFT; 247 + __raw_writel(con0, pll->con_reg); 248 + 249 + return 0; 250 + } 251 + 252 + /* Set PLL PMS values. */ 253 + con0 &= ~((PLL45XX_MDIV_MASK << PLL45XX_MDIV_SHIFT) | 254 + (PLL45XX_PDIV_MASK << PLL45XX_PDIV_SHIFT) | 255 + (PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT)); 256 + con0 |= (rate->mdiv << PLL45XX_MDIV_SHIFT) | 257 + (rate->pdiv << PLL45XX_PDIV_SHIFT) | 258 + (rate->sdiv << PLL45XX_SDIV_SHIFT); 259 + 260 + /* Set PLL AFC value. */ 261 + con1 = __raw_readl(pll->con_reg + 0x4); 262 + con1 &= ~(PLL45XX_AFC_MASK << PLL45XX_AFC_SHIFT); 263 + con1 |= (rate->afc << PLL45XX_AFC_SHIFT); 264 + 265 + /* Set PLL lock time. */ 266 + switch (pll->type) { 267 + case pll_4502: 268 + __raw_writel(rate->pdiv * PLL4502_LOCK_FACTOR, pll->lock_reg); 269 + break; 270 + case pll_4508: 271 + __raw_writel(rate->pdiv * PLL4508_LOCK_FACTOR, pll->lock_reg); 272 + break; 273 + default: 274 + break; 275 + }; 276 + 277 + /* Set new configuration. */ 278 + __raw_writel(con1, pll->con_reg + 0x4); 279 + __raw_writel(con0, pll->con_reg); 280 + 281 + /* Wait for locking. */ 282 + start = ktime_get(); 283 + while (!(__raw_readl(pll->con_reg) & PLL45XX_LOCKED)) { 284 + ktime_t delta = ktime_sub(ktime_get(), start); 285 + 286 + if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { 287 + pr_err("%s: could not lock PLL %s\n", 288 + __func__, __clk_get_name(hw->clk)); 289 + return -EFAULT; 290 + } 291 + 292 + cpu_relax(); 293 + } 294 + 295 + return 0; 296 + } 297 + 314 298 static const struct clk_ops samsung_pll45xx_clk_ops = { 315 299 .recalc_rate = samsung_pll45xx_recalc_rate, 300 + .round_rate = samsung_pll_round_rate, 301 + .set_rate = samsung_pll45xx_set_rate, 316 302 }; 317 303 318 - struct clk * __init samsung_clk_register_pll45xx(const char *name, 319 - const char *pname, const void __iomem *con_reg, 320 - enum pll45xx_type type) 321 - { 322 - struct samsung_clk_pll45xx *pll; 323 - struct clk *clk; 324 - struct clk_init_data init; 325 - 326 - pll = kzalloc(sizeof(*pll), GFP_KERNEL); 327 - if (!pll) { 328 - pr_err("%s: could not allocate pll clk %s\n", __func__, name); 329 - return NULL; 330 - } 331 - 332 - init.name = name; 333 - init.ops = &samsung_pll45xx_clk_ops; 334 - init.flags = CLK_GET_RATE_NOCACHE; 335 - init.parent_names = &pname; 336 - init.num_parents = 1; 337 - 338 - pll->hw.init = &init; 339 - pll->con_reg = con_reg; 340 - pll->type = type; 341 - 342 - clk = clk_register(NULL, &pll->hw); 343 - if (IS_ERR(clk)) { 344 - pr_err("%s: failed to register pll clock %s\n", __func__, 345 - name); 346 - kfree(pll); 347 - } 348 - 349 - if (clk_register_clkdev(clk, name, NULL)) 350 - pr_err("%s: failed to register lookup for %s", __func__, name); 351 - 352 - return clk; 353 - } 304 + static const struct clk_ops samsung_pll45xx_clk_min_ops = { 305 + .recalc_rate = samsung_pll45xx_recalc_rate, 306 + }; 354 307 355 308 /* 356 309 * PLL46xx Clock Type 357 310 */ 311 + #define PLL46XX_LOCK_FACTOR 3000 358 312 313 + #define PLL46XX_VSEL_MASK (1) 359 314 #define PLL46XX_MDIV_MASK (0x1FF) 360 315 #define PLL46XX_PDIV_MASK (0x3F) 361 316 #define PLL46XX_SDIV_MASK (0x7) 317 + #define PLL46XX_VSEL_SHIFT (27) 362 318 #define PLL46XX_MDIV_SHIFT (16) 363 319 #define PLL46XX_PDIV_SHIFT (8) 364 320 #define PLL46XX_SDIV_SHIFT (0) ··· 425 263 #define PLL46XX_KDIV_MASK (0xFFFF) 426 264 #define PLL4650C_KDIV_MASK (0xFFF) 427 265 #define PLL46XX_KDIV_SHIFT (0) 266 + #define PLL46XX_MFR_MASK (0x3F) 267 + #define PLL46XX_MRR_MASK (0x1F) 268 + #define PLL46XX_KDIV_SHIFT (0) 269 + #define PLL46XX_MFR_SHIFT (16) 270 + #define PLL46XX_MRR_SHIFT (24) 428 271 429 - struct samsung_clk_pll46xx { 430 - struct clk_hw hw; 431 - enum pll46xx_type type; 432 - const void __iomem *con_reg; 433 - }; 434 - 435 - #define to_clk_pll46xx(_hw) container_of(_hw, struct samsung_clk_pll46xx, hw) 272 + #define PLL46XX_ENABLE BIT(31) 273 + #define PLL46XX_LOCKED BIT(29) 274 + #define PLL46XX_VSEL BIT(27) 436 275 437 276 static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, 438 277 unsigned long parent_rate) 439 278 { 440 - struct samsung_clk_pll46xx *pll = to_clk_pll46xx(hw); 279 + struct samsung_clk_pll *pll = to_clk_pll(hw); 441 280 u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1, shift; 442 281 u64 fvco = parent_rate; 443 282 ··· 458 295 return (unsigned long)fvco; 459 296 } 460 297 298 + static bool samsung_pll46xx_mpk_change(u32 pll_con0, u32 pll_con1, 299 + const struct samsung_pll_rate_table *rate) 300 + { 301 + u32 old_mdiv, old_pdiv, old_kdiv; 302 + 303 + old_mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK; 304 + old_pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; 305 + old_kdiv = (pll_con1 >> PLL46XX_KDIV_SHIFT) & PLL46XX_KDIV_MASK; 306 + 307 + return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv 308 + || old_kdiv != rate->kdiv); 309 + } 310 + 311 + static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate, 312 + unsigned long prate) 313 + { 314 + struct samsung_clk_pll *pll = to_clk_pll(hw); 315 + const struct samsung_pll_rate_table *rate; 316 + u32 con0, con1, lock; 317 + ktime_t start; 318 + 319 + /* Get required rate settings from table */ 320 + rate = samsung_get_pll_settings(pll, drate); 321 + if (!rate) { 322 + pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, 323 + drate, __clk_get_name(hw->clk)); 324 + return -EINVAL; 325 + } 326 + 327 + con0 = __raw_readl(pll->con_reg); 328 + con1 = __raw_readl(pll->con_reg + 0x4); 329 + 330 + if (!(samsung_pll46xx_mpk_change(con0, con1, rate))) { 331 + /* If only s change, change just s value only*/ 332 + con0 &= ~(PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT); 333 + con0 |= rate->sdiv << PLL46XX_SDIV_SHIFT; 334 + __raw_writel(con0, pll->con_reg); 335 + 336 + return 0; 337 + } 338 + 339 + /* Set PLL lock time. */ 340 + lock = rate->pdiv * PLL46XX_LOCK_FACTOR; 341 + if (lock > 0xffff) 342 + /* Maximum lock time bitfield is 16-bit. */ 343 + lock = 0xffff; 344 + 345 + /* Set PLL PMS and VSEL values. */ 346 + con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | 347 + (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | 348 + (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | 349 + (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); 350 + con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | 351 + (rate->pdiv << PLL46XX_PDIV_SHIFT) | 352 + (rate->sdiv << PLL46XX_SDIV_SHIFT) | 353 + (rate->vsel << PLL46XX_VSEL_SHIFT); 354 + 355 + /* Set PLL K, MFR and MRR values. */ 356 + con1 = __raw_readl(pll->con_reg + 0x4); 357 + con1 &= ~((PLL46XX_KDIV_MASK << PLL46XX_KDIV_SHIFT) | 358 + (PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT) | 359 + (PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT)); 360 + con1 |= (rate->kdiv << PLL46XX_KDIV_SHIFT) | 361 + (rate->mfr << PLL46XX_MFR_SHIFT) | 362 + (rate->mrr << PLL46XX_MRR_SHIFT); 363 + 364 + /* Write configuration to PLL */ 365 + __raw_writel(lock, pll->lock_reg); 366 + __raw_writel(con0, pll->con_reg); 367 + __raw_writel(con1, pll->con_reg + 0x4); 368 + 369 + /* Wait for locking. */ 370 + start = ktime_get(); 371 + while (!(__raw_readl(pll->con_reg) & PLL46XX_LOCKED)) { 372 + ktime_t delta = ktime_sub(ktime_get(), start); 373 + 374 + if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { 375 + pr_err("%s: could not lock PLL %s\n", 376 + __func__, __clk_get_name(hw->clk)); 377 + return -EFAULT; 378 + } 379 + 380 + cpu_relax(); 381 + } 382 + 383 + return 0; 384 + } 385 + 461 386 static const struct clk_ops samsung_pll46xx_clk_ops = { 387 + .recalc_rate = samsung_pll46xx_recalc_rate, 388 + .round_rate = samsung_pll_round_rate, 389 + .set_rate = samsung_pll46xx_set_rate, 390 + }; 391 + 392 + static const struct clk_ops samsung_pll46xx_clk_min_ops = { 462 393 .recalc_rate = samsung_pll46xx_recalc_rate, 463 394 }; 464 395 465 - struct clk * __init samsung_clk_register_pll46xx(const char *name, 466 - const char *pname, const void __iomem *con_reg, 467 - enum pll46xx_type type) 396 + /* 397 + * PLL6552 Clock Type 398 + */ 399 + 400 + #define PLL6552_MDIV_MASK 0x3ff 401 + #define PLL6552_PDIV_MASK 0x3f 402 + #define PLL6552_SDIV_MASK 0x7 403 + #define PLL6552_MDIV_SHIFT 16 404 + #define PLL6552_PDIV_SHIFT 8 405 + #define PLL6552_SDIV_SHIFT 0 406 + 407 + static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw, 408 + unsigned long parent_rate) 468 409 { 469 - struct samsung_clk_pll46xx *pll; 470 - struct clk *clk; 471 - struct clk_init_data init; 410 + struct samsung_clk_pll *pll = to_clk_pll(hw); 411 + u32 mdiv, pdiv, sdiv, pll_con; 412 + u64 fvco = parent_rate; 472 413 473 - pll = kzalloc(sizeof(*pll), GFP_KERNEL); 474 - if (!pll) { 475 - pr_err("%s: could not allocate pll clk %s\n", __func__, name); 476 - return NULL; 477 - } 414 + pll_con = __raw_readl(pll->con_reg); 415 + mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; 416 + pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; 417 + sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK; 478 418 479 - init.name = name; 480 - init.ops = &samsung_pll46xx_clk_ops; 481 - init.flags = CLK_GET_RATE_NOCACHE; 482 - init.parent_names = &pname; 483 - init.num_parents = 1; 419 + fvco *= mdiv; 420 + do_div(fvco, (pdiv << sdiv)); 484 421 485 - pll->hw.init = &init; 486 - pll->con_reg = con_reg; 487 - pll->type = type; 488 - 489 - clk = clk_register(NULL, &pll->hw); 490 - if (IS_ERR(clk)) { 491 - pr_err("%s: failed to register pll clock %s\n", __func__, 492 - name); 493 - kfree(pll); 494 - } 495 - 496 - if (clk_register_clkdev(clk, name, NULL)) 497 - pr_err("%s: failed to register lookup for %s", __func__, name); 498 - 499 - return clk; 422 + return (unsigned long)fvco; 500 423 } 424 + 425 + static const struct clk_ops samsung_pll6552_clk_ops = { 426 + .recalc_rate = samsung_pll6552_recalc_rate, 427 + }; 428 + 429 + /* 430 + * PLL6553 Clock Type 431 + */ 432 + 433 + #define PLL6553_MDIV_MASK 0xff 434 + #define PLL6553_PDIV_MASK 0x3f 435 + #define PLL6553_SDIV_MASK 0x7 436 + #define PLL6553_KDIV_MASK 0xffff 437 + #define PLL6553_MDIV_SHIFT 16 438 + #define PLL6553_PDIV_SHIFT 8 439 + #define PLL6553_SDIV_SHIFT 0 440 + #define PLL6553_KDIV_SHIFT 0 441 + 442 + static unsigned long samsung_pll6553_recalc_rate(struct clk_hw *hw, 443 + unsigned long parent_rate) 444 + { 445 + struct samsung_clk_pll *pll = to_clk_pll(hw); 446 + u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1; 447 + u64 fvco = parent_rate; 448 + 449 + pll_con0 = __raw_readl(pll->con_reg); 450 + pll_con1 = __raw_readl(pll->con_reg + 0x4); 451 + mdiv = (pll_con0 >> PLL6553_MDIV_SHIFT) & PLL6553_MDIV_MASK; 452 + pdiv = (pll_con0 >> PLL6553_PDIV_SHIFT) & PLL6553_PDIV_MASK; 453 + sdiv = (pll_con0 >> PLL6553_SDIV_SHIFT) & PLL6553_SDIV_MASK; 454 + kdiv = (pll_con1 >> PLL6553_KDIV_SHIFT) & PLL6553_KDIV_MASK; 455 + 456 + fvco *= (mdiv << 16) + kdiv; 457 + do_div(fvco, (pdiv << sdiv)); 458 + fvco >>= 16; 459 + 460 + return (unsigned long)fvco; 461 + } 462 + 463 + static const struct clk_ops samsung_pll6553_clk_ops = { 464 + .recalc_rate = samsung_pll6553_recalc_rate, 465 + }; 501 466 502 467 /* 503 468 * PLL2550x Clock Type ··· 708 417 pr_err("%s: failed to register lookup for %s", __func__, name); 709 418 710 419 return clk; 420 + } 421 + 422 + static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk, 423 + void __iomem *base) 424 + { 425 + struct samsung_clk_pll *pll; 426 + struct clk *clk; 427 + struct clk_init_data init; 428 + int ret, len; 429 + 430 + pll = kzalloc(sizeof(*pll), GFP_KERNEL); 431 + if (!pll) { 432 + pr_err("%s: could not allocate pll clk %s\n", 433 + __func__, pll_clk->name); 434 + return; 435 + } 436 + 437 + init.name = pll_clk->name; 438 + init.flags = pll_clk->flags; 439 + init.parent_names = &pll_clk->parent_name; 440 + init.num_parents = 1; 441 + 442 + if (pll_clk->rate_table) { 443 + /* find count of rates in rate_table */ 444 + for (len = 0; pll_clk->rate_table[len].rate != 0; ) 445 + len++; 446 + 447 + pll->rate_count = len; 448 + pll->rate_table = kmemdup(pll_clk->rate_table, 449 + pll->rate_count * 450 + sizeof(struct samsung_pll_rate_table), 451 + GFP_KERNEL); 452 + WARN(!pll->rate_table, 453 + "%s: could not allocate rate table for %s\n", 454 + __func__, pll_clk->name); 455 + } 456 + 457 + switch (pll_clk->type) { 458 + /* clk_ops for 35xx and 2550 are similar */ 459 + case pll_35xx: 460 + case pll_2550: 461 + if (!pll->rate_table) 462 + init.ops = &samsung_pll35xx_clk_min_ops; 463 + else 464 + init.ops = &samsung_pll35xx_clk_ops; 465 + break; 466 + case pll_4500: 467 + init.ops = &samsung_pll45xx_clk_min_ops; 468 + break; 469 + case pll_4502: 470 + case pll_4508: 471 + if (!pll->rate_table) 472 + init.ops = &samsung_pll45xx_clk_min_ops; 473 + else 474 + init.ops = &samsung_pll45xx_clk_ops; 475 + break; 476 + /* clk_ops for 36xx and 2650 are similar */ 477 + case pll_36xx: 478 + case pll_2650: 479 + if (!pll->rate_table) 480 + init.ops = &samsung_pll36xx_clk_min_ops; 481 + else 482 + init.ops = &samsung_pll36xx_clk_ops; 483 + break; 484 + case pll_6552: 485 + init.ops = &samsung_pll6552_clk_ops; 486 + break; 487 + case pll_6553: 488 + init.ops = &samsung_pll6553_clk_ops; 489 + break; 490 + case pll_4600: 491 + case pll_4650: 492 + case pll_4650c: 493 + if (!pll->rate_table) 494 + init.ops = &samsung_pll46xx_clk_min_ops; 495 + else 496 + init.ops = &samsung_pll46xx_clk_ops; 497 + break; 498 + default: 499 + pr_warn("%s: Unknown pll type for pll clk %s\n", 500 + __func__, pll_clk->name); 501 + } 502 + 503 + pll->hw.init = &init; 504 + pll->type = pll_clk->type; 505 + pll->lock_reg = base + pll_clk->lock_offset; 506 + pll->con_reg = base + pll_clk->con_offset; 507 + 508 + clk = clk_register(NULL, &pll->hw); 509 + if (IS_ERR(clk)) { 510 + pr_err("%s: failed to register pll clock %s : %ld\n", 511 + __func__, pll_clk->name, PTR_ERR(clk)); 512 + kfree(pll); 513 + return; 514 + } 515 + 516 + samsung_clk_add_lookup(clk, pll_clk->id); 517 + 518 + if (!pll_clk->alias) 519 + return; 520 + 521 + ret = clk_register_clkdev(clk, pll_clk->alias, pll_clk->dev_name); 522 + if (ret) 523 + pr_err("%s: failed to register lookup for %s : %d", 524 + __func__, pll_clk->name, ret); 525 + } 526 + 527 + void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, 528 + unsigned int nr_pll, void __iomem *base) 529 + { 530 + int cnt; 531 + 532 + for (cnt = 0; cnt < nr_pll; cnt++) 533 + _samsung_clk_register_pll(&pll_list[cnt], base); 711 534 }
+70 -15
drivers/clk/samsung/clk-pll.h
··· 12 12 #ifndef __SAMSUNG_CLK_PLL_H 13 13 #define __SAMSUNG_CLK_PLL_H 14 14 15 - enum pll45xx_type { 15 + enum samsung_pll_type { 16 + pll_35xx, 17 + pll_36xx, 18 + pll_2550, 19 + pll_2650, 16 20 pll_4500, 17 21 pll_4502, 18 - pll_4508 19 - }; 20 - 21 - enum pll46xx_type { 22 + pll_4508, 22 23 pll_4600, 23 24 pll_4650, 24 25 pll_4650c, 26 + pll_6552, 27 + pll_6553, 25 28 }; 26 29 27 - extern struct clk * __init samsung_clk_register_pll35xx(const char *name, 28 - const char *pname, const void __iomem *con_reg); 29 - extern struct clk * __init samsung_clk_register_pll36xx(const char *name, 30 - const char *pname, const void __iomem *con_reg); 31 - extern struct clk * __init samsung_clk_register_pll45xx(const char *name, 32 - const char *pname, const void __iomem *con_reg, 33 - enum pll45xx_type type); 34 - extern struct clk * __init samsung_clk_register_pll46xx(const char *name, 35 - const char *pname, const void __iomem *con_reg, 36 - enum pll46xx_type type); 30 + #define PLL_35XX_RATE(_rate, _m, _p, _s) \ 31 + { \ 32 + .rate = (_rate), \ 33 + .mdiv = (_m), \ 34 + .pdiv = (_p), \ 35 + .sdiv = (_s), \ 36 + } 37 + 38 + #define PLL_36XX_RATE(_rate, _m, _p, _s, _k) \ 39 + { \ 40 + .rate = (_rate), \ 41 + .mdiv = (_m), \ 42 + .pdiv = (_p), \ 43 + .sdiv = (_s), \ 44 + .kdiv = (_k), \ 45 + } 46 + 47 + #define PLL_45XX_RATE(_rate, _m, _p, _s, _afc) \ 48 + { \ 49 + .rate = (_rate), \ 50 + .mdiv = (_m), \ 51 + .pdiv = (_p), \ 52 + .sdiv = (_s), \ 53 + .afc = (_afc), \ 54 + } 55 + 56 + #define PLL_4600_RATE(_rate, _m, _p, _s, _k, _vsel) \ 57 + { \ 58 + .rate = (_rate), \ 59 + .mdiv = (_m), \ 60 + .pdiv = (_p), \ 61 + .sdiv = (_s), \ 62 + .kdiv = (_k), \ 63 + .vsel = (_vsel), \ 64 + } 65 + 66 + #define PLL_4650_RATE(_rate, _m, _p, _s, _k, _mfr, _mrr, _vsel) \ 67 + { \ 68 + .rate = (_rate), \ 69 + .mdiv = (_m), \ 70 + .pdiv = (_p), \ 71 + .sdiv = (_s), \ 72 + .kdiv = (_k), \ 73 + .mfr = (_mfr), \ 74 + .mrr = (_mrr), \ 75 + .vsel = (_vsel), \ 76 + } 77 + 78 + /* NOTE: Rate table should be kept sorted in descending order. */ 79 + 80 + struct samsung_pll_rate_table { 81 + unsigned int rate; 82 + unsigned int pdiv; 83 + unsigned int mdiv; 84 + unsigned int sdiv; 85 + unsigned int kdiv; 86 + unsigned int afc; 87 + unsigned int mfr; 88 + unsigned int mrr; 89 + unsigned int vsel; 90 + }; 91 + 37 92 extern struct clk * __init samsung_clk_register_pll2550x(const char *name, 38 93 const char *pname, const void __iomem *reg_base, 39 94 const unsigned long offset);
+473
drivers/clk/samsung/clk-s3c64xx.c
··· 1 + /* 2 + * Copyright (c) 2013 Tomasz Figa <tomasz.figa at gmail.com> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Common Clock Framework support for all S3C64xx SoCs. 9 + */ 10 + 11 + #include <linux/clk.h> 12 + #include <linux/clkdev.h> 13 + #include <linux/clk-provider.h> 14 + #include <linux/of.h> 15 + #include <linux/of_address.h> 16 + 17 + #include <dt-bindings/clock/samsung,s3c64xx-clock.h> 18 + 19 + #include "clk.h" 20 + #include "clk-pll.h" 21 + 22 + /* S3C64xx clock controller register offsets. */ 23 + #define APLL_LOCK 0x000 24 + #define MPLL_LOCK 0x004 25 + #define EPLL_LOCK 0x008 26 + #define APLL_CON 0x00c 27 + #define MPLL_CON 0x010 28 + #define EPLL_CON0 0x014 29 + #define EPLL_CON1 0x018 30 + #define CLK_SRC 0x01c 31 + #define CLK_DIV0 0x020 32 + #define CLK_DIV1 0x024 33 + #define CLK_DIV2 0x028 34 + #define HCLK_GATE 0x030 35 + #define PCLK_GATE 0x034 36 + #define SCLK_GATE 0x038 37 + #define MEM0_GATE 0x03c 38 + #define CLK_SRC2 0x10c 39 + #define OTHERS 0x900 40 + 41 + /* Helper macros to define clock arrays. */ 42 + #define FIXED_RATE_CLOCKS(name) \ 43 + static struct samsung_fixed_rate_clock name[] 44 + #define MUX_CLOCKS(name) \ 45 + static struct samsung_mux_clock name[] 46 + #define DIV_CLOCKS(name) \ 47 + static struct samsung_div_clock name[] 48 + #define GATE_CLOCKS(name) \ 49 + static struct samsung_gate_clock name[] 50 + 51 + /* Helper macros for gate types present on S3C64xx. */ 52 + #define GATE_BUS(_id, cname, pname, o, b) \ 53 + GATE(_id, cname, pname, o, b, 0, 0) 54 + #define GATE_SCLK(_id, cname, pname, o, b) \ 55 + GATE(_id, cname, pname, o, b, CLK_SET_RATE_PARENT, 0) 56 + #define GATE_ON(_id, cname, pname, o, b) \ 57 + GATE(_id, cname, pname, o, b, CLK_IGNORE_UNUSED, 0) 58 + 59 + /* list of PLLs to be registered */ 60 + enum s3c64xx_plls { 61 + apll, mpll, epll, 62 + }; 63 + 64 + /* 65 + * List of controller registers to be saved and restored during 66 + * a suspend/resume cycle. 67 + */ 68 + static unsigned long s3c64xx_clk_regs[] __initdata = { 69 + APLL_LOCK, 70 + MPLL_LOCK, 71 + EPLL_LOCK, 72 + APLL_CON, 73 + MPLL_CON, 74 + EPLL_CON0, 75 + EPLL_CON1, 76 + CLK_SRC, 77 + CLK_DIV0, 78 + CLK_DIV1, 79 + CLK_DIV2, 80 + HCLK_GATE, 81 + PCLK_GATE, 82 + SCLK_GATE, 83 + }; 84 + 85 + static unsigned long s3c6410_clk_regs[] __initdata = { 86 + CLK_SRC2, 87 + MEM0_GATE, 88 + }; 89 + 90 + /* List of parent clocks common for all S3C64xx SoCs. */ 91 + PNAME(spi_mmc_p) = { "mout_epll", "dout_mpll", "fin_pll", "clk27m" }; 92 + PNAME(uart_p) = { "mout_epll", "dout_mpll" }; 93 + PNAME(audio0_p) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk0", 94 + "pcmcdclk0", "none", "none", "none" }; 95 + PNAME(audio1_p) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk1", 96 + "pcmcdclk0", "none", "none", "none" }; 97 + PNAME(mfc_p) = { "hclkx2", "mout_epll" }; 98 + PNAME(apll_p) = { "fin_pll", "fout_apll" }; 99 + PNAME(mpll_p) = { "fin_pll", "fout_mpll" }; 100 + PNAME(epll_p) = { "fin_pll", "fout_epll" }; 101 + PNAME(hclkx2_p) = { "mout_mpll", "mout_apll" }; 102 + 103 + /* S3C6400-specific parent clocks. */ 104 + PNAME(scaler_lcd_p6400) = { "mout_epll", "dout_mpll", "none", "none" }; 105 + PNAME(irda_p6400) = { "mout_epll", "dout_mpll", "none", "clk48m" }; 106 + PNAME(uhost_p6400) = { "clk48m", "mout_epll", "dout_mpll", "none" }; 107 + 108 + /* S3C6410-specific parent clocks. */ 109 + PNAME(clk27_p6410) = { "clk27m", "fin_pll" }; 110 + PNAME(scaler_lcd_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "none" }; 111 + PNAME(irda_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "clk48m" }; 112 + PNAME(uhost_p6410) = { "clk48m", "mout_epll", "dout_mpll", "fin_pll" }; 113 + PNAME(audio2_p6410) = { "mout_epll", "dout_mpll", "fin_pll", "iiscdclk2", 114 + "pcmcdclk1", "none", "none", "none" }; 115 + 116 + /* Fixed rate clocks generated outside the SoC. */ 117 + FIXED_RATE_CLOCKS(s3c64xx_fixed_rate_ext_clks) __initdata = { 118 + FRATE(0, "fin_pll", NULL, CLK_IS_ROOT, 0), 119 + FRATE(0, "xusbxti", NULL, CLK_IS_ROOT, 0), 120 + }; 121 + 122 + /* Fixed rate clocks generated inside the SoC. */ 123 + FIXED_RATE_CLOCKS(s3c64xx_fixed_rate_clks) __initdata = { 124 + FRATE(CLK27M, "clk27m", NULL, CLK_IS_ROOT, 27000000), 125 + FRATE(CLK48M, "clk48m", NULL, CLK_IS_ROOT, 48000000), 126 + }; 127 + 128 + /* List of clock muxes present on all S3C64xx SoCs. */ 129 + MUX_CLOCKS(s3c64xx_mux_clks) __initdata = { 130 + MUX_F(0, "mout_syncmux", hclkx2_p, OTHERS, 6, 1, 0, CLK_MUX_READ_ONLY), 131 + MUX(MOUT_APLL, "mout_apll", apll_p, CLK_SRC, 0, 1), 132 + MUX(MOUT_MPLL, "mout_mpll", mpll_p, CLK_SRC, 1, 1), 133 + MUX(MOUT_EPLL, "mout_epll", epll_p, CLK_SRC, 2, 1), 134 + MUX(MOUT_MFC, "mout_mfc", mfc_p, CLK_SRC, 4, 1), 135 + MUX(MOUT_AUDIO0, "mout_audio0", audio0_p, CLK_SRC, 7, 3), 136 + MUX(MOUT_AUDIO1, "mout_audio1", audio1_p, CLK_SRC, 10, 3), 137 + MUX(MOUT_UART, "mout_uart", uart_p, CLK_SRC, 13, 1), 138 + MUX(MOUT_SPI0, "mout_spi0", spi_mmc_p, CLK_SRC, 14, 2), 139 + MUX(MOUT_SPI1, "mout_spi1", spi_mmc_p, CLK_SRC, 16, 2), 140 + MUX(MOUT_MMC0, "mout_mmc0", spi_mmc_p, CLK_SRC, 18, 2), 141 + MUX(MOUT_MMC1, "mout_mmc1", spi_mmc_p, CLK_SRC, 20, 2), 142 + MUX(MOUT_MMC2, "mout_mmc2", spi_mmc_p, CLK_SRC, 22, 2), 143 + }; 144 + 145 + /* List of clock muxes present on S3C6400. */ 146 + MUX_CLOCKS(s3c6400_mux_clks) __initdata = { 147 + MUX(MOUT_UHOST, "mout_uhost", uhost_p6400, CLK_SRC, 5, 2), 148 + MUX(MOUT_IRDA, "mout_irda", irda_p6400, CLK_SRC, 24, 2), 149 + MUX(MOUT_LCD, "mout_lcd", scaler_lcd_p6400, CLK_SRC, 26, 2), 150 + MUX(MOUT_SCALER, "mout_scaler", scaler_lcd_p6400, CLK_SRC, 28, 2), 151 + }; 152 + 153 + /* List of clock muxes present on S3C6410. */ 154 + MUX_CLOCKS(s3c6410_mux_clks) __initdata = { 155 + MUX(MOUT_UHOST, "mout_uhost", uhost_p6410, CLK_SRC, 5, 2), 156 + MUX(MOUT_IRDA, "mout_irda", irda_p6410, CLK_SRC, 24, 2), 157 + MUX(MOUT_LCD, "mout_lcd", scaler_lcd_p6410, CLK_SRC, 26, 2), 158 + MUX(MOUT_SCALER, "mout_scaler", scaler_lcd_p6410, CLK_SRC, 28, 2), 159 + MUX(MOUT_DAC27, "mout_dac27", clk27_p6410, CLK_SRC, 30, 1), 160 + MUX(MOUT_TV27, "mout_tv27", clk27_p6410, CLK_SRC, 31, 1), 161 + MUX(MOUT_AUDIO2, "mout_audio2", audio2_p6410, CLK_SRC2, 0, 3), 162 + }; 163 + 164 + /* List of clock dividers present on all S3C64xx SoCs. */ 165 + DIV_CLOCKS(s3c64xx_div_clks) __initdata = { 166 + DIV(DOUT_MPLL, "dout_mpll", "mout_mpll", CLK_DIV0, 4, 1), 167 + DIV(HCLKX2, "hclkx2", "mout_syncmux", CLK_DIV0, 9, 3), 168 + DIV(HCLK, "hclk", "hclkx2", CLK_DIV0, 8, 1), 169 + DIV(PCLK, "pclk", "hclkx2", CLK_DIV0, 12, 4), 170 + DIV(DOUT_SECUR, "dout_secur", "hclkx2", CLK_DIV0, 18, 2), 171 + DIV(DOUT_CAM, "dout_cam", "hclkx2", CLK_DIV0, 20, 4), 172 + DIV(DOUT_JPEG, "dout_jpeg", "hclkx2", CLK_DIV0, 24, 4), 173 + DIV(DOUT_MFC, "dout_mfc", "mout_mfc", CLK_DIV0, 28, 4), 174 + DIV(DOUT_MMC0, "dout_mmc0", "mout_mmc0", CLK_DIV1, 0, 4), 175 + DIV(DOUT_MMC1, "dout_mmc1", "mout_mmc1", CLK_DIV1, 4, 4), 176 + DIV(DOUT_MMC2, "dout_mmc2", "mout_mmc2", CLK_DIV1, 8, 4), 177 + DIV(DOUT_LCD, "dout_lcd", "mout_lcd", CLK_DIV1, 12, 4), 178 + DIV(DOUT_SCALER, "dout_scaler", "mout_scaler", CLK_DIV1, 16, 4), 179 + DIV(DOUT_UHOST, "dout_uhost", "mout_uhost", CLK_DIV1, 20, 4), 180 + DIV(DOUT_SPI0, "dout_spi0", "mout_spi0", CLK_DIV2, 0, 4), 181 + DIV(DOUT_SPI1, "dout_spi1", "mout_spi1", CLK_DIV2, 4, 4), 182 + DIV(DOUT_AUDIO0, "dout_audio0", "mout_audio0", CLK_DIV2, 8, 4), 183 + DIV(DOUT_AUDIO1, "dout_audio1", "mout_audio1", CLK_DIV2, 12, 4), 184 + DIV(DOUT_UART, "dout_uart", "mout_uart", CLK_DIV2, 16, 4), 185 + DIV(DOUT_IRDA, "dout_irda", "mout_irda", CLK_DIV2, 20, 4), 186 + }; 187 + 188 + /* List of clock dividers present on S3C6400. */ 189 + DIV_CLOCKS(s3c6400_div_clks) __initdata = { 190 + DIV(ARMCLK, "armclk", "mout_apll", CLK_DIV0, 0, 3), 191 + }; 192 + 193 + /* List of clock dividers present on S3C6410. */ 194 + DIV_CLOCKS(s3c6410_div_clks) __initdata = { 195 + DIV(ARMCLK, "armclk", "mout_apll", CLK_DIV0, 0, 4), 196 + DIV(DOUT_FIMC, "dout_fimc", "hclk", CLK_DIV1, 24, 4), 197 + DIV(DOUT_AUDIO2, "dout_audio2", "mout_audio2", CLK_DIV2, 24, 4), 198 + }; 199 + 200 + /* List of clock gates present on all S3C64xx SoCs. */ 201 + GATE_CLOCKS(s3c64xx_gate_clks) __initdata = { 202 + GATE_BUS(HCLK_UHOST, "hclk_uhost", "hclk", HCLK_GATE, 29), 203 + GATE_BUS(HCLK_SECUR, "hclk_secur", "hclk", HCLK_GATE, 28), 204 + GATE_BUS(HCLK_SDMA1, "hclk_sdma1", "hclk", HCLK_GATE, 27), 205 + GATE_BUS(HCLK_SDMA0, "hclk_sdma0", "hclk", HCLK_GATE, 26), 206 + GATE_ON(HCLK_DDR1, "hclk_ddr1", "hclk", HCLK_GATE, 24), 207 + GATE_BUS(HCLK_USB, "hclk_usb", "hclk", HCLK_GATE, 20), 208 + GATE_BUS(HCLK_HSMMC2, "hclk_hsmmc2", "hclk", HCLK_GATE, 19), 209 + GATE_BUS(HCLK_HSMMC1, "hclk_hsmmc1", "hclk", HCLK_GATE, 18), 210 + GATE_BUS(HCLK_HSMMC0, "hclk_hsmmc0", "hclk", HCLK_GATE, 17), 211 + GATE_BUS(HCLK_MDP, "hclk_mdp", "hclk", HCLK_GATE, 16), 212 + GATE_BUS(HCLK_DHOST, "hclk_dhost", "hclk", HCLK_GATE, 15), 213 + GATE_BUS(HCLK_IHOST, "hclk_ihost", "hclk", HCLK_GATE, 14), 214 + GATE_BUS(HCLK_DMA1, "hclk_dma1", "hclk", HCLK_GATE, 13), 215 + GATE_BUS(HCLK_DMA0, "hclk_dma0", "hclk", HCLK_GATE, 12), 216 + GATE_BUS(HCLK_JPEG, "hclk_jpeg", "hclk", HCLK_GATE, 11), 217 + GATE_BUS(HCLK_CAMIF, "hclk_camif", "hclk", HCLK_GATE, 10), 218 + GATE_BUS(HCLK_SCALER, "hclk_scaler", "hclk", HCLK_GATE, 9), 219 + GATE_BUS(HCLK_2D, "hclk_2d", "hclk", HCLK_GATE, 8), 220 + GATE_BUS(HCLK_TV, "hclk_tv", "hclk", HCLK_GATE, 7), 221 + GATE_BUS(HCLK_POST0, "hclk_post0", "hclk", HCLK_GATE, 5), 222 + GATE_BUS(HCLK_ROT, "hclk_rot", "hclk", HCLK_GATE, 4), 223 + GATE_BUS(HCLK_LCD, "hclk_lcd", "hclk", HCLK_GATE, 3), 224 + GATE_BUS(HCLK_TZIC, "hclk_tzic", "hclk", HCLK_GATE, 2), 225 + GATE_ON(HCLK_INTC, "hclk_intc", "hclk", HCLK_GATE, 1), 226 + GATE_ON(PCLK_SKEY, "pclk_skey", "pclk", PCLK_GATE, 24), 227 + GATE_ON(PCLK_CHIPID, "pclk_chipid", "pclk", PCLK_GATE, 23), 228 + GATE_BUS(PCLK_SPI1, "pclk_spi1", "pclk", PCLK_GATE, 22), 229 + GATE_BUS(PCLK_SPI0, "pclk_spi0", "pclk", PCLK_GATE, 21), 230 + GATE_BUS(PCLK_HSIRX, "pclk_hsirx", "pclk", PCLK_GATE, 20), 231 + GATE_BUS(PCLK_HSITX, "pclk_hsitx", "pclk", PCLK_GATE, 19), 232 + GATE_ON(PCLK_GPIO, "pclk_gpio", "pclk", PCLK_GATE, 18), 233 + GATE_BUS(PCLK_IIC0, "pclk_iic0", "pclk", PCLK_GATE, 17), 234 + GATE_BUS(PCLK_IIS1, "pclk_iis1", "pclk", PCLK_GATE, 16), 235 + GATE_BUS(PCLK_IIS0, "pclk_iis0", "pclk", PCLK_GATE, 15), 236 + GATE_BUS(PCLK_AC97, "pclk_ac97", "pclk", PCLK_GATE, 14), 237 + GATE_BUS(PCLK_TZPC, "pclk_tzpc", "pclk", PCLK_GATE, 13), 238 + GATE_BUS(PCLK_TSADC, "pclk_tsadc", "pclk", PCLK_GATE, 12), 239 + GATE_BUS(PCLK_KEYPAD, "pclk_keypad", "pclk", PCLK_GATE, 11), 240 + GATE_BUS(PCLK_IRDA, "pclk_irda", "pclk", PCLK_GATE, 10), 241 + GATE_BUS(PCLK_PCM1, "pclk_pcm1", "pclk", PCLK_GATE, 9), 242 + GATE_BUS(PCLK_PCM0, "pclk_pcm0", "pclk", PCLK_GATE, 8), 243 + GATE_BUS(PCLK_PWM, "pclk_pwm", "pclk", PCLK_GATE, 7), 244 + GATE_BUS(PCLK_RTC, "pclk_rtc", "pclk", PCLK_GATE, 6), 245 + GATE_BUS(PCLK_WDT, "pclk_wdt", "pclk", PCLK_GATE, 5), 246 + GATE_BUS(PCLK_UART3, "pclk_uart3", "pclk", PCLK_GATE, 4), 247 + GATE_BUS(PCLK_UART2, "pclk_uart2", "pclk", PCLK_GATE, 3), 248 + GATE_BUS(PCLK_UART1, "pclk_uart1", "pclk", PCLK_GATE, 2), 249 + GATE_BUS(PCLK_UART0, "pclk_uart0", "pclk", PCLK_GATE, 1), 250 + GATE_BUS(PCLK_MFC, "pclk_mfc", "pclk", PCLK_GATE, 0), 251 + GATE_SCLK(SCLK_UHOST, "sclk_uhost", "dout_uhost", SCLK_GATE, 30), 252 + GATE_SCLK(SCLK_MMC2_48, "sclk_mmc2_48", "clk48m", SCLK_GATE, 29), 253 + GATE_SCLK(SCLK_MMC1_48, "sclk_mmc1_48", "clk48m", SCLK_GATE, 28), 254 + GATE_SCLK(SCLK_MMC0_48, "sclk_mmc0_48", "clk48m", SCLK_GATE, 27), 255 + GATE_SCLK(SCLK_MMC2, "sclk_mmc2", "dout_mmc2", SCLK_GATE, 26), 256 + GATE_SCLK(SCLK_MMC1, "sclk_mmc1", "dout_mmc1", SCLK_GATE, 25), 257 + GATE_SCLK(SCLK_MMC0, "sclk_mmc0", "dout_mmc0", SCLK_GATE, 24), 258 + GATE_SCLK(SCLK_SPI1_48, "sclk_spi1_48", "clk48m", SCLK_GATE, 23), 259 + GATE_SCLK(SCLK_SPI0_48, "sclk_spi0_48", "clk48m", SCLK_GATE, 22), 260 + GATE_SCLK(SCLK_SPI1, "sclk_spi1", "dout_spi1", SCLK_GATE, 21), 261 + GATE_SCLK(SCLK_SPI0, "sclk_spi0", "dout_spi0", SCLK_GATE, 20), 262 + GATE_SCLK(SCLK_DAC27, "sclk_dac27", "mout_dac27", SCLK_GATE, 19), 263 + GATE_SCLK(SCLK_TV27, "sclk_tv27", "mout_tv27", SCLK_GATE, 18), 264 + GATE_SCLK(SCLK_SCALER27, "sclk_scaler27", "clk27m", SCLK_GATE, 17), 265 + GATE_SCLK(SCLK_SCALER, "sclk_scaler", "dout_scaler", SCLK_GATE, 16), 266 + GATE_SCLK(SCLK_LCD27, "sclk_lcd27", "clk27m", SCLK_GATE, 15), 267 + GATE_SCLK(SCLK_LCD, "sclk_lcd", "dout_lcd", SCLK_GATE, 14), 268 + GATE_SCLK(SCLK_POST0_27, "sclk_post0_27", "clk27m", SCLK_GATE, 12), 269 + GATE_SCLK(SCLK_POST0, "sclk_post0", "dout_lcd", SCLK_GATE, 10), 270 + GATE_SCLK(SCLK_AUDIO1, "sclk_audio1", "dout_audio1", SCLK_GATE, 9), 271 + GATE_SCLK(SCLK_AUDIO0, "sclk_audio0", "dout_audio0", SCLK_GATE, 8), 272 + GATE_SCLK(SCLK_SECUR, "sclk_secur", "dout_secur", SCLK_GATE, 7), 273 + GATE_SCLK(SCLK_IRDA, "sclk_irda", "dout_irda", SCLK_GATE, 6), 274 + GATE_SCLK(SCLK_UART, "sclk_uart", "dout_uart", SCLK_GATE, 5), 275 + GATE_SCLK(SCLK_MFC, "sclk_mfc", "dout_mfc", SCLK_GATE, 3), 276 + GATE_SCLK(SCLK_CAM, "sclk_cam", "dout_cam", SCLK_GATE, 2), 277 + GATE_SCLK(SCLK_JPEG, "sclk_jpeg", "dout_jpeg", SCLK_GATE, 1), 278 + }; 279 + 280 + /* List of clock gates present on S3C6400. */ 281 + GATE_CLOCKS(s3c6400_gate_clks) __initdata = { 282 + GATE_ON(HCLK_DDR0, "hclk_ddr0", "hclk", HCLK_GATE, 23), 283 + GATE_SCLK(SCLK_ONENAND, "sclk_onenand", "parent", SCLK_GATE, 4), 284 + }; 285 + 286 + /* List of clock gates present on S3C6410. */ 287 + GATE_CLOCKS(s3c6410_gate_clks) __initdata = { 288 + GATE_BUS(HCLK_3DSE, "hclk_3dse", "hclk", HCLK_GATE, 31), 289 + GATE_ON(HCLK_IROM, "hclk_irom", "hclk", HCLK_GATE, 25), 290 + GATE_ON(HCLK_MEM1, "hclk_mem1", "hclk", HCLK_GATE, 22), 291 + GATE_ON(HCLK_MEM0, "hclk_mem0", "hclk", HCLK_GATE, 21), 292 + GATE_BUS(HCLK_MFC, "hclk_mfc", "hclk", HCLK_GATE, 0), 293 + GATE_BUS(PCLK_IIC1, "pclk_iic1", "pclk", PCLK_GATE, 27), 294 + GATE_BUS(PCLK_IIS2, "pclk_iis2", "pclk", PCLK_GATE, 26), 295 + GATE_SCLK(SCLK_FIMC, "sclk_fimc", "dout_fimc", SCLK_GATE, 13), 296 + GATE_SCLK(SCLK_AUDIO2, "sclk_audio2", "dout_audio2", SCLK_GATE, 11), 297 + GATE_BUS(MEM0_CFCON, "mem0_cfcon", "hclk_mem0", MEM0_GATE, 5), 298 + GATE_BUS(MEM0_ONENAND1, "mem0_onenand1", "hclk_mem0", MEM0_GATE, 4), 299 + GATE_BUS(MEM0_ONENAND0, "mem0_onenand0", "hclk_mem0", MEM0_GATE, 3), 300 + GATE_BUS(MEM0_NFCON, "mem0_nfcon", "hclk_mem0", MEM0_GATE, 2), 301 + GATE_ON(MEM0_SROM, "mem0_srom", "hclk_mem0", MEM0_GATE, 1), 302 + }; 303 + 304 + /* List of PLL clocks. */ 305 + static struct samsung_pll_clock s3c64xx_pll_clks[] __initdata = { 306 + [apll] = PLL(pll_6552, FOUT_APLL, "fout_apll", "fin_pll", 307 + APLL_LOCK, APLL_CON, NULL), 308 + [mpll] = PLL(pll_6552, FOUT_MPLL, "fout_mpll", "fin_pll", 309 + MPLL_LOCK, MPLL_CON, NULL), 310 + [epll] = PLL(pll_6553, FOUT_EPLL, "fout_epll", "fin_pll", 311 + EPLL_LOCK, EPLL_CON0, NULL), 312 + }; 313 + 314 + /* Aliases for common s3c64xx clocks. */ 315 + static struct samsung_clock_alias s3c64xx_clock_aliases[] = { 316 + ALIAS(FOUT_APLL, NULL, "fout_apll"), 317 + ALIAS(FOUT_MPLL, NULL, "fout_mpll"), 318 + ALIAS(FOUT_EPLL, NULL, "fout_epll"), 319 + ALIAS(MOUT_EPLL, NULL, "mout_epll"), 320 + ALIAS(DOUT_MPLL, NULL, "dout_mpll"), 321 + ALIAS(HCLKX2, NULL, "hclk2"), 322 + ALIAS(HCLK, NULL, "hclk"), 323 + ALIAS(PCLK, NULL, "pclk"), 324 + ALIAS(PCLK, NULL, "clk_uart_baud2"), 325 + ALIAS(ARMCLK, NULL, "armclk"), 326 + ALIAS(HCLK_UHOST, "s3c2410-ohci", "usb-host"), 327 + ALIAS(HCLK_USB, "s3c-hsotg", "otg"), 328 + ALIAS(HCLK_HSMMC2, "s3c-sdhci.2", "hsmmc"), 329 + ALIAS(HCLK_HSMMC2, "s3c-sdhci.2", "mmc_busclk.0"), 330 + ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "hsmmc"), 331 + ALIAS(HCLK_HSMMC1, "s3c-sdhci.1", "mmc_busclk.0"), 332 + ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "hsmmc"), 333 + ALIAS(HCLK_HSMMC0, "s3c-sdhci.0", "mmc_busclk.0"), 334 + ALIAS(HCLK_DMA1, NULL, "dma1"), 335 + ALIAS(HCLK_DMA0, NULL, "dma0"), 336 + ALIAS(HCLK_CAMIF, "s3c-camif", "camif"), 337 + ALIAS(HCLK_LCD, "s3c-fb", "lcd"), 338 + ALIAS(PCLK_SPI1, "s3c6410-spi.1", "spi"), 339 + ALIAS(PCLK_SPI0, "s3c6410-spi.0", "spi"), 340 + ALIAS(PCLK_IIC0, "s3c2440-i2c.0", "i2c"), 341 + ALIAS(PCLK_IIS1, "samsung-i2s.1", "iis"), 342 + ALIAS(PCLK_IIS0, "samsung-i2s.0", "iis"), 343 + ALIAS(PCLK_AC97, "samsung-ac97", "ac97"), 344 + ALIAS(PCLK_TSADC, "s3c64xx-adc", "adc"), 345 + ALIAS(PCLK_KEYPAD, "samsung-keypad", "keypad"), 346 + ALIAS(PCLK_PCM1, "samsung-pcm.1", "pcm"), 347 + ALIAS(PCLK_PCM0, "samsung-pcm.0", "pcm"), 348 + ALIAS(PCLK_PWM, NULL, "timers"), 349 + ALIAS(PCLK_RTC, "s3c64xx-rtc", "rtc"), 350 + ALIAS(PCLK_WDT, NULL, "watchdog"), 351 + ALIAS(PCLK_UART3, "s3c6400-uart.3", "uart"), 352 + ALIAS(PCLK_UART2, "s3c6400-uart.2", "uart"), 353 + ALIAS(PCLK_UART1, "s3c6400-uart.1", "uart"), 354 + ALIAS(PCLK_UART0, "s3c6400-uart.0", "uart"), 355 + ALIAS(SCLK_UHOST, "s3c2410-ohci", "usb-bus-host"), 356 + ALIAS(SCLK_MMC2, "s3c-sdhci.2", "mmc_busclk.2"), 357 + ALIAS(SCLK_MMC1, "s3c-sdhci.1", "mmc_busclk.2"), 358 + ALIAS(SCLK_MMC0, "s3c-sdhci.0", "mmc_busclk.2"), 359 + ALIAS(SCLK_SPI1, "s3c6410-spi.1", "spi-bus"), 360 + ALIAS(SCLK_SPI0, "s3c6410-spi.0", "spi-bus"), 361 + ALIAS(SCLK_AUDIO1, "samsung-pcm.1", "audio-bus"), 362 + ALIAS(SCLK_AUDIO1, "samsung-i2s.1", "audio-bus"), 363 + ALIAS(SCLK_AUDIO0, "samsung-pcm.0", "audio-bus"), 364 + ALIAS(SCLK_AUDIO0, "samsung-i2s.0", "audio-bus"), 365 + ALIAS(SCLK_UART, NULL, "clk_uart_baud3"), 366 + ALIAS(SCLK_CAM, "s3c-camif", "camera"), 367 + }; 368 + 369 + /* Aliases for s3c6400-specific clocks. */ 370 + static struct samsung_clock_alias s3c6400_clock_aliases[] = { 371 + /* Nothing to place here yet. */ 372 + }; 373 + 374 + /* Aliases for s3c6410-specific clocks. */ 375 + static struct samsung_clock_alias s3c6410_clock_aliases[] = { 376 + ALIAS(PCLK_IIC1, "s3c2440-i2c.1", "i2c"), 377 + ALIAS(PCLK_IIS2, "samsung-i2s.2", "iis"), 378 + ALIAS(SCLK_FIMC, "s3c-camif", "fimc"), 379 + ALIAS(SCLK_AUDIO2, "samsung-i2s.2", "audio-bus"), 380 + ALIAS(MEM0_SROM, NULL, "srom"), 381 + }; 382 + 383 + static void __init s3c64xx_clk_register_fixed_ext(unsigned long fin_pll_f, 384 + unsigned long xusbxti_f) 385 + { 386 + s3c64xx_fixed_rate_ext_clks[0].fixed_rate = fin_pll_f; 387 + s3c64xx_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f; 388 + samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_ext_clks, 389 + ARRAY_SIZE(s3c64xx_fixed_rate_ext_clks)); 390 + } 391 + 392 + /* Register s3c64xx clocks. */ 393 + void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f, 394 + unsigned long xusbxti_f, bool is_s3c6400, 395 + void __iomem *reg_base) 396 + { 397 + unsigned long *soc_regs = NULL; 398 + unsigned long nr_soc_regs = 0; 399 + 400 + if (np) { 401 + reg_base = of_iomap(np, 0); 402 + if (!reg_base) 403 + panic("%s: failed to map registers\n", __func__); 404 + } 405 + 406 + if (!is_s3c6400) { 407 + soc_regs = s3c6410_clk_regs; 408 + nr_soc_regs = ARRAY_SIZE(s3c6410_clk_regs); 409 + } 410 + 411 + samsung_clk_init(np, reg_base, NR_CLKS, s3c64xx_clk_regs, 412 + ARRAY_SIZE(s3c64xx_clk_regs), soc_regs, nr_soc_regs); 413 + 414 + /* Register external clocks. */ 415 + if (!np) 416 + s3c64xx_clk_register_fixed_ext(xtal_f, xusbxti_f); 417 + 418 + /* Register PLLs. */ 419 + samsung_clk_register_pll(s3c64xx_pll_clks, 420 + ARRAY_SIZE(s3c64xx_pll_clks), reg_base); 421 + 422 + /* Register common internal clocks. */ 423 + samsung_clk_register_fixed_rate(s3c64xx_fixed_rate_clks, 424 + ARRAY_SIZE(s3c64xx_fixed_rate_clks)); 425 + samsung_clk_register_mux(s3c64xx_mux_clks, 426 + ARRAY_SIZE(s3c64xx_mux_clks)); 427 + samsung_clk_register_div(s3c64xx_div_clks, 428 + ARRAY_SIZE(s3c64xx_div_clks)); 429 + samsung_clk_register_gate(s3c64xx_gate_clks, 430 + ARRAY_SIZE(s3c64xx_gate_clks)); 431 + 432 + /* Register SoC-specific clocks. */ 433 + if (is_s3c6400) { 434 + samsung_clk_register_mux(s3c6400_mux_clks, 435 + ARRAY_SIZE(s3c6400_mux_clks)); 436 + samsung_clk_register_div(s3c6400_div_clks, 437 + ARRAY_SIZE(s3c6400_div_clks)); 438 + samsung_clk_register_gate(s3c6400_gate_clks, 439 + ARRAY_SIZE(s3c6400_gate_clks)); 440 + samsung_clk_register_alias(s3c6400_clock_aliases, 441 + ARRAY_SIZE(s3c6400_clock_aliases)); 442 + } else { 443 + samsung_clk_register_mux(s3c6410_mux_clks, 444 + ARRAY_SIZE(s3c6410_mux_clks)); 445 + samsung_clk_register_div(s3c6410_div_clks, 446 + ARRAY_SIZE(s3c6410_div_clks)); 447 + samsung_clk_register_gate(s3c6410_gate_clks, 448 + ARRAY_SIZE(s3c6410_gate_clks)); 449 + samsung_clk_register_alias(s3c6410_clock_aliases, 450 + ARRAY_SIZE(s3c6410_clock_aliases)); 451 + } 452 + 453 + samsung_clk_register_alias(s3c64xx_clock_aliases, 454 + ARRAY_SIZE(s3c64xx_clock_aliases)); 455 + 456 + pr_info("%s clocks: apll = %lu, mpll = %lu\n" 457 + "\tepll = %lu, arm_clk = %lu\n", 458 + is_s3c6400 ? "S3C6400" : "S3C6410", 459 + _get_rate("fout_apll"), _get_rate("fout_mpll"), 460 + _get_rate("fout_epll"), _get_rate("armclk")); 461 + } 462 + 463 + static void __init s3c6400_clk_init(struct device_node *np) 464 + { 465 + s3c64xx_clk_init(np, 0, 0, true, NULL); 466 + } 467 + CLK_OF_DECLARE(s3c6400_clk, "samsung,s3c6400-clock", s3c6400_clk_init); 468 + 469 + static void __init s3c6410_clk_init(struct device_node *np) 470 + { 471 + s3c64xx_clk_init(np, 0, 0, false, NULL); 472 + } 473 + CLK_OF_DECLARE(s3c6410_clk, "samsung,s3c6410-clock", s3c6410_clk_init);
+4 -6
drivers/clk/samsung/clk.c
··· 307 307 unsigned long _get_rate(const char *clk_name) 308 308 { 309 309 struct clk *clk; 310 - unsigned long rate; 311 310 312 - clk = clk_get(NULL, clk_name); 313 - if (IS_ERR(clk)) { 311 + clk = __clk_lookup(clk_name); 312 + if (!clk) { 314 313 pr_err("%s: could not find clock %s\n", __func__, clk_name); 315 314 return 0; 316 315 } 317 - rate = clk_get_rate(clk); 318 - clk_put(clk); 319 - return rate; 316 + 317 + return clk_get_rate(clk); 320 318 }
+54 -1
drivers/clk/samsung/clk.h
··· 19 19 #include <linux/clk-provider.h> 20 20 #include <linux/of.h> 21 21 #include <linux/of_address.h> 22 + #include "clk-pll.h" 22 23 23 24 /** 24 25 * struct samsung_clock_alias: information about mux clock ··· 39 38 .dev_name = dname, \ 40 39 .alias = a, \ 41 40 } 41 + 42 + #define MHZ (1000 * 1000) 42 43 43 44 /** 44 45 * struct samsung_fixed_rate_clock: information about fixed-rate clock ··· 130 127 .name = cname, \ 131 128 .parent_names = pnames, \ 132 129 .num_parents = ARRAY_SIZE(pnames), \ 133 - .flags = f, \ 130 + .flags = (f) | CLK_SET_RATE_NO_REPARENT, \ 134 131 .offset = o, \ 135 132 .shift = s, \ 136 133 .width = w, \ ··· 264 261 u32 value; 265 262 }; 266 263 264 + /** 265 + * struct samsung_pll_clock: information about pll clock 266 + * @id: platform specific id of the clock. 267 + * @dev_name: name of the device to which this clock belongs. 268 + * @name: name of this pll clock. 269 + * @parent_name: name of the parent clock. 270 + * @flags: optional flags for basic clock. 271 + * @con_offset: offset of the register for configuring the PLL. 272 + * @lock_offset: offset of the register for locking the PLL. 273 + * @type: Type of PLL to be registered. 274 + * @alias: optional clock alias name to be assigned to this clock. 275 + */ 276 + struct samsung_pll_clock { 277 + unsigned int id; 278 + const char *dev_name; 279 + const char *name; 280 + const char *parent_name; 281 + unsigned long flags; 282 + int con_offset; 283 + int lock_offset; 284 + enum samsung_pll_type type; 285 + const struct samsung_pll_rate_table *rate_table; 286 + const char *alias; 287 + }; 288 + 289 + #define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con, \ 290 + _rtable, _alias) \ 291 + { \ 292 + .id = _id, \ 293 + .type = _typ, \ 294 + .dev_name = _dname, \ 295 + .name = _name, \ 296 + .parent_name = _pname, \ 297 + .flags = CLK_GET_RATE_NOCACHE, \ 298 + .con_offset = _con, \ 299 + .lock_offset = _lock, \ 300 + .rate_table = _rtable, \ 301 + .alias = _alias, \ 302 + } 303 + 304 + #define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable) \ 305 + __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ 306 + _lock, _con, _rtable, _name) 307 + 308 + #define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \ 309 + __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ 310 + _lock, _con, _rtable, _alias) 311 + 267 312 extern void __init samsung_clk_init(struct device_node *np, void __iomem *base, 268 313 unsigned long nr_clks, unsigned long *rdump, 269 314 unsigned long nr_rdump, unsigned long *soc_rdump, ··· 335 284 unsigned int nr_clk); 336 285 extern void __init samsung_clk_register_gate( 337 286 struct samsung_gate_clock *clk_list, unsigned int nr_clk); 287 + extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, 288 + unsigned int nr_clk, void __iomem *base); 338 289 339 290 extern unsigned long _get_rate(const char *clk_name); 340 291
+93 -86
drivers/clk/spear/spear1310_clock.c
··· 416 416 /* clock derived from 24 or 25 MHz osc clk */ 417 417 /* vco-pll */ 418 418 clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, 419 - ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, 420 - SPEAR1310_PLL1_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, 421 - &_lock); 419 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 420 + SPEAR1310_PLL_CFG, SPEAR1310_PLL1_CLK_SHIFT, 421 + SPEAR1310_PLL_CLK_MASK, 0, &_lock); 422 422 clk_register_clkdev(clk, "vco1_mclk", NULL); 423 423 clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 424 424 0, SPEAR1310_PLL1_CTR, SPEAR1310_PLL1_FRQ, pll_rtbl, ··· 427 427 clk_register_clkdev(clk1, "pll1_clk", NULL); 428 428 429 429 clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, 430 - ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, 431 - SPEAR1310_PLL2_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, 432 - &_lock); 430 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 431 + SPEAR1310_PLL_CFG, SPEAR1310_PLL2_CLK_SHIFT, 432 + SPEAR1310_PLL_CLK_MASK, 0, &_lock); 433 433 clk_register_clkdev(clk, "vco2_mclk", NULL); 434 434 clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 435 435 0, SPEAR1310_PLL2_CTR, SPEAR1310_PLL2_FRQ, pll_rtbl, ··· 438 438 clk_register_clkdev(clk1, "pll2_clk", NULL); 439 439 440 440 clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, 441 - ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, 442 - SPEAR1310_PLL3_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, 443 - &_lock); 441 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 442 + SPEAR1310_PLL_CFG, SPEAR1310_PLL3_CLK_SHIFT, 443 + SPEAR1310_PLL_CLK_MASK, 0, &_lock); 444 444 clk_register_clkdev(clk, "vco3_mclk", NULL); 445 445 clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 446 446 0, SPEAR1310_PLL3_CTR, SPEAR1310_PLL3_FRQ, pll_rtbl, ··· 515 515 516 516 /* gpt clocks */ 517 517 clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, 518 - ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, 519 - SPEAR1310_GPT0_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, 520 - &_lock); 518 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 519 + SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT0_CLK_SHIFT, 520 + SPEAR1310_GPT_CLK_MASK, 0, &_lock); 521 521 clk_register_clkdev(clk, "gpt0_mclk", NULL); 522 522 clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, 523 523 SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT0_CLK_ENB, 0, ··· 525 525 clk_register_clkdev(clk, NULL, "gpt0"); 526 526 527 527 clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, 528 - ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, 529 - SPEAR1310_GPT1_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, 530 - &_lock); 528 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 529 + SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT1_CLK_SHIFT, 530 + SPEAR1310_GPT_CLK_MASK, 0, &_lock); 531 531 clk_register_clkdev(clk, "gpt1_mclk", NULL); 532 532 clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, 533 533 SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT1_CLK_ENB, 0, ··· 535 535 clk_register_clkdev(clk, NULL, "gpt1"); 536 536 537 537 clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, 538 - ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, 539 - SPEAR1310_GPT2_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, 540 - &_lock); 538 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 539 + SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT2_CLK_SHIFT, 540 + SPEAR1310_GPT_CLK_MASK, 0, &_lock); 541 541 clk_register_clkdev(clk, "gpt2_mclk", NULL); 542 542 clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, 543 543 SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT2_CLK_ENB, 0, ··· 545 545 clk_register_clkdev(clk, NULL, "gpt2"); 546 546 547 547 clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, 548 - ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, 549 - SPEAR1310_GPT3_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, 550 - &_lock); 548 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 549 + SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT3_CLK_SHIFT, 550 + SPEAR1310_GPT_CLK_MASK, 0, &_lock); 551 551 clk_register_clkdev(clk, "gpt3_mclk", NULL); 552 552 clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, 553 553 SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT3_CLK_ENB, 0, ··· 562 562 clk_register_clkdev(clk1, "uart_syn_gclk", NULL); 563 563 564 564 clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, 565 - ARRAY_SIZE(uart0_parents), CLK_SET_RATE_PARENT, 565 + ARRAY_SIZE(uart0_parents), 566 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 566 567 SPEAR1310_PERIP_CLK_CFG, SPEAR1310_UART_CLK_SHIFT, 567 568 SPEAR1310_UART_CLK_MASK, 0, &_lock); 568 569 clk_register_clkdev(clk, "uart0_mclk", NULL); ··· 603 602 clk_register_clkdev(clk1, "c3_syn_gclk", NULL); 604 603 605 604 clk = clk_register_mux(NULL, "c3_mclk", c3_parents, 606 - ARRAY_SIZE(c3_parents), CLK_SET_RATE_PARENT, 605 + ARRAY_SIZE(c3_parents), 606 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 607 607 SPEAR1310_PERIP_CLK_CFG, SPEAR1310_C3_CLK_SHIFT, 608 608 SPEAR1310_C3_CLK_MASK, 0, &_lock); 609 609 clk_register_clkdev(clk, "c3_mclk", NULL); ··· 616 614 617 615 /* gmac */ 618 616 clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, 619 - ARRAY_SIZE(gmac_phy_input_parents), 0, 620 - SPEAR1310_GMAC_CLK_CFG, 617 + ARRAY_SIZE(gmac_phy_input_parents), 618 + CLK_SET_RATE_NO_REPARENT, SPEAR1310_GMAC_CLK_CFG, 621 619 SPEAR1310_GMAC_PHY_INPUT_CLK_SHIFT, 622 620 SPEAR1310_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); 623 621 clk_register_clkdev(clk, "phy_input_mclk", NULL); ··· 629 627 clk_register_clkdev(clk1, "phy_syn_gclk", NULL); 630 628 631 629 clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, 632 - ARRAY_SIZE(gmac_phy_parents), 0, 630 + ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT, 633 631 SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GMAC_PHY_CLK_SHIFT, 634 632 SPEAR1310_GMAC_PHY_CLK_MASK, 0, &_lock); 635 633 clk_register_clkdev(clk, "stmmacphy.0", NULL); 636 634 637 635 /* clcd */ 638 636 clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, 639 - ARRAY_SIZE(clcd_synth_parents), 0, 640 - SPEAR1310_CLCD_CLK_SYNT, SPEAR1310_CLCD_SYNT_CLK_SHIFT, 637 + ARRAY_SIZE(clcd_synth_parents), 638 + CLK_SET_RATE_NO_REPARENT, SPEAR1310_CLCD_CLK_SYNT, 639 + SPEAR1310_CLCD_SYNT_CLK_SHIFT, 641 640 SPEAR1310_CLCD_SYNT_CLK_MASK, 0, &_lock); 642 641 clk_register_clkdev(clk, "clcd_syn_mclk", NULL); 643 642 ··· 648 645 clk_register_clkdev(clk, "clcd_syn_clk", NULL); 649 646 650 647 clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, 651 - ARRAY_SIZE(clcd_pixel_parents), CLK_SET_RATE_PARENT, 648 + ARRAY_SIZE(clcd_pixel_parents), 649 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 652 650 SPEAR1310_PERIP_CLK_CFG, SPEAR1310_CLCD_CLK_SHIFT, 653 651 SPEAR1310_CLCD_CLK_MASK, 0, &_lock); 654 652 clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); ··· 661 657 662 658 /* i2s */ 663 659 clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, 664 - ARRAY_SIZE(i2s_src_parents), 0, SPEAR1310_I2S_CLK_CFG, 665 - SPEAR1310_I2S_SRC_CLK_SHIFT, SPEAR1310_I2S_SRC_CLK_MASK, 666 - 0, &_lock); 660 + ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT, 661 + SPEAR1310_I2S_CLK_CFG, SPEAR1310_I2S_SRC_CLK_SHIFT, 662 + SPEAR1310_I2S_SRC_CLK_MASK, 0, &_lock); 667 663 clk_register_clkdev(clk, "i2s_src_mclk", NULL); 668 664 669 665 clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", 0, ··· 672 668 clk_register_clkdev(clk, "i2s_prs1_clk", NULL); 673 669 674 670 clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, 675 - ARRAY_SIZE(i2s_ref_parents), CLK_SET_RATE_PARENT, 671 + ARRAY_SIZE(i2s_ref_parents), 672 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 676 673 SPEAR1310_I2S_CLK_CFG, SPEAR1310_I2S_REF_SHIFT, 677 674 SPEAR1310_I2S_REF_SEL_MASK, 0, &_lock); 678 675 clk_register_clkdev(clk, "i2s_ref_mclk", NULL); ··· 811 806 812 807 /* RAS clks */ 813 808 clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, 814 - ARRAY_SIZE(gen_synth0_1_parents), 0, SPEAR1310_PLL_CFG, 809 + ARRAY_SIZE(gen_synth0_1_parents), 810 + CLK_SET_RATE_NO_REPARENT, SPEAR1310_PLL_CFG, 815 811 SPEAR1310_RAS_SYNT0_1_CLK_SHIFT, 816 812 SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); 817 813 clk_register_clkdev(clk, "gen_syn0_1_clk", NULL); 818 814 819 815 clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, 820 - ARRAY_SIZE(gen_synth2_3_parents), 0, SPEAR1310_PLL_CFG, 816 + ARRAY_SIZE(gen_synth2_3_parents), 817 + CLK_SET_RATE_NO_REPARENT, SPEAR1310_PLL_CFG, 821 818 SPEAR1310_RAS_SYNT2_3_CLK_SHIFT, 822 819 SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); 823 820 clk_register_clkdev(clk, "gen_syn2_3_clk", NULL); ··· 936 929 937 930 clk = clk_register_mux(NULL, "smii_rgmii_phy_mclk", 938 931 smii_rgmii_phy_parents, 939 - ARRAY_SIZE(smii_rgmii_phy_parents), 0, 940 - SPEAR1310_RAS_CTRL_REG1, 932 + ARRAY_SIZE(smii_rgmii_phy_parents), 933 + CLK_SET_RATE_NO_REPARENT, SPEAR1310_RAS_CTRL_REG1, 941 934 SPEAR1310_SMII_RGMII_PHY_CLK_SHIFT, 942 935 SPEAR1310_PHY_CLK_MASK, 0, &_lock); 943 936 clk_register_clkdev(clk, "stmmacphy.1", NULL); ··· 945 938 clk_register_clkdev(clk, "stmmacphy.4", NULL); 946 939 947 940 clk = clk_register_mux(NULL, "rmii_phy_mclk", rmii_phy_parents, 948 - ARRAY_SIZE(rmii_phy_parents), 0, 941 + ARRAY_SIZE(rmii_phy_parents), CLK_SET_RATE_NO_REPARENT, 949 942 SPEAR1310_RAS_CTRL_REG1, SPEAR1310_RMII_PHY_CLK_SHIFT, 950 943 SPEAR1310_PHY_CLK_MASK, 0, &_lock); 951 944 clk_register_clkdev(clk, "stmmacphy.3", NULL); 952 945 953 946 clk = clk_register_mux(NULL, "uart1_mclk", uart_parents, 954 - ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, 955 - SPEAR1310_UART1_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, 956 - 0, &_lock); 947 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 948 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART1_CLK_SHIFT, 949 + SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); 957 950 clk_register_clkdev(clk, "uart1_mclk", NULL); 958 951 959 952 clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, ··· 962 955 clk_register_clkdev(clk, NULL, "5c800000.serial"); 963 956 964 957 clk = clk_register_mux(NULL, "uart2_mclk", uart_parents, 965 - ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, 966 - SPEAR1310_UART2_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, 967 - 0, &_lock); 958 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 959 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART2_CLK_SHIFT, 960 + SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); 968 961 clk_register_clkdev(clk, "uart2_mclk", NULL); 969 962 970 963 clk = clk_register_gate(NULL, "uart2_clk", "uart2_mclk", 0, ··· 973 966 clk_register_clkdev(clk, NULL, "5c900000.serial"); 974 967 975 968 clk = clk_register_mux(NULL, "uart3_mclk", uart_parents, 976 - ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, 977 - SPEAR1310_UART3_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, 978 - 0, &_lock); 969 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 970 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART3_CLK_SHIFT, 971 + SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); 979 972 clk_register_clkdev(clk, "uart3_mclk", NULL); 980 973 981 974 clk = clk_register_gate(NULL, "uart3_clk", "uart3_mclk", 0, ··· 984 977 clk_register_clkdev(clk, NULL, "5ca00000.serial"); 985 978 986 979 clk = clk_register_mux(NULL, "uart4_mclk", uart_parents, 987 - ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, 988 - SPEAR1310_UART4_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, 989 - 0, &_lock); 980 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 981 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART4_CLK_SHIFT, 982 + SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); 990 983 clk_register_clkdev(clk, "uart4_mclk", NULL); 991 984 992 985 clk = clk_register_gate(NULL, "uart4_clk", "uart4_mclk", 0, ··· 995 988 clk_register_clkdev(clk, NULL, "5cb00000.serial"); 996 989 997 990 clk = clk_register_mux(NULL, "uart5_mclk", uart_parents, 998 - ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, 999 - SPEAR1310_UART5_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, 1000 - 0, &_lock); 991 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 992 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART5_CLK_SHIFT, 993 + SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); 1001 994 clk_register_clkdev(clk, "uart5_mclk", NULL); 1002 995 1003 996 clk = clk_register_gate(NULL, "uart5_clk", "uart5_mclk", 0, ··· 1006 999 clk_register_clkdev(clk, NULL, "5cc00000.serial"); 1007 1000 1008 1001 clk = clk_register_mux(NULL, "i2c1_mclk", i2c_parents, 1009 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1010 - SPEAR1310_I2C1_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1011 - &_lock); 1002 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1003 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C1_CLK_SHIFT, 1004 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1012 1005 clk_register_clkdev(clk, "i2c1_mclk", NULL); 1013 1006 1014 1007 clk = clk_register_gate(NULL, "i2c1_clk", "i2c1_mclk", 0, ··· 1017 1010 clk_register_clkdev(clk, NULL, "5cd00000.i2c"); 1018 1011 1019 1012 clk = clk_register_mux(NULL, "i2c2_mclk", i2c_parents, 1020 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1021 - SPEAR1310_I2C2_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1022 - &_lock); 1013 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1014 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C2_CLK_SHIFT, 1015 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1023 1016 clk_register_clkdev(clk, "i2c2_mclk", NULL); 1024 1017 1025 1018 clk = clk_register_gate(NULL, "i2c2_clk", "i2c2_mclk", 0, ··· 1028 1021 clk_register_clkdev(clk, NULL, "5ce00000.i2c"); 1029 1022 1030 1023 clk = clk_register_mux(NULL, "i2c3_mclk", i2c_parents, 1031 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1032 - SPEAR1310_I2C3_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1033 - &_lock); 1024 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1025 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C3_CLK_SHIFT, 1026 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1034 1027 clk_register_clkdev(clk, "i2c3_mclk", NULL); 1035 1028 1036 1029 clk = clk_register_gate(NULL, "i2c3_clk", "i2c3_mclk", 0, ··· 1039 1032 clk_register_clkdev(clk, NULL, "5cf00000.i2c"); 1040 1033 1041 1034 clk = clk_register_mux(NULL, "i2c4_mclk", i2c_parents, 1042 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1043 - SPEAR1310_I2C4_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1044 - &_lock); 1035 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1036 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C4_CLK_SHIFT, 1037 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1045 1038 clk_register_clkdev(clk, "i2c4_mclk", NULL); 1046 1039 1047 1040 clk = clk_register_gate(NULL, "i2c4_clk", "i2c4_mclk", 0, ··· 1050 1043 clk_register_clkdev(clk, NULL, "5d000000.i2c"); 1051 1044 1052 1045 clk = clk_register_mux(NULL, "i2c5_mclk", i2c_parents, 1053 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1054 - SPEAR1310_I2C5_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1055 - &_lock); 1046 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1047 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C5_CLK_SHIFT, 1048 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1056 1049 clk_register_clkdev(clk, "i2c5_mclk", NULL); 1057 1050 1058 1051 clk = clk_register_gate(NULL, "i2c5_clk", "i2c5_mclk", 0, ··· 1061 1054 clk_register_clkdev(clk, NULL, "5d100000.i2c"); 1062 1055 1063 1056 clk = clk_register_mux(NULL, "i2c6_mclk", i2c_parents, 1064 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1065 - SPEAR1310_I2C6_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1066 - &_lock); 1057 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1058 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C6_CLK_SHIFT, 1059 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1067 1060 clk_register_clkdev(clk, "i2c6_mclk", NULL); 1068 1061 1069 1062 clk = clk_register_gate(NULL, "i2c6_clk", "i2c6_mclk", 0, ··· 1072 1065 clk_register_clkdev(clk, NULL, "5d200000.i2c"); 1073 1066 1074 1067 clk = clk_register_mux(NULL, "i2c7_mclk", i2c_parents, 1075 - ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1076 - SPEAR1310_I2C7_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, 1077 - &_lock); 1068 + ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, 1069 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C7_CLK_SHIFT, 1070 + SPEAR1310_I2C_CLK_MASK, 0, &_lock); 1078 1071 clk_register_clkdev(clk, "i2c7_mclk", NULL); 1079 1072 1080 1073 clk = clk_register_gate(NULL, "i2c7_clk", "i2c7_mclk", 0, ··· 1083 1076 clk_register_clkdev(clk, NULL, "5d300000.i2c"); 1084 1077 1085 1078 clk = clk_register_mux(NULL, "ssp1_mclk", ssp1_parents, 1086 - ARRAY_SIZE(ssp1_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1087 - SPEAR1310_SSP1_CLK_SHIFT, SPEAR1310_SSP1_CLK_MASK, 0, 1088 - &_lock); 1079 + ARRAY_SIZE(ssp1_parents), CLK_SET_RATE_NO_REPARENT, 1080 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_SSP1_CLK_SHIFT, 1081 + SPEAR1310_SSP1_CLK_MASK, 0, &_lock); 1089 1082 clk_register_clkdev(clk, "ssp1_mclk", NULL); 1090 1083 1091 1084 clk = clk_register_gate(NULL, "ssp1_clk", "ssp1_mclk", 0, ··· 1094 1087 clk_register_clkdev(clk, NULL, "5d400000.spi"); 1095 1088 1096 1089 clk = clk_register_mux(NULL, "pci_mclk", pci_parents, 1097 - ARRAY_SIZE(pci_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1098 - SPEAR1310_PCI_CLK_SHIFT, SPEAR1310_PCI_CLK_MASK, 0, 1099 - &_lock); 1090 + ARRAY_SIZE(pci_parents), CLK_SET_RATE_NO_REPARENT, 1091 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_PCI_CLK_SHIFT, 1092 + SPEAR1310_PCI_CLK_MASK, 0, &_lock); 1100 1093 clk_register_clkdev(clk, "pci_mclk", NULL); 1101 1094 1102 1095 clk = clk_register_gate(NULL, "pci_clk", "pci_mclk", 0, ··· 1105 1098 clk_register_clkdev(clk, NULL, "pci"); 1106 1099 1107 1100 clk = clk_register_mux(NULL, "tdm1_mclk", tdm_parents, 1108 - ARRAY_SIZE(tdm_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1109 - SPEAR1310_TDM1_CLK_SHIFT, SPEAR1310_TDM_CLK_MASK, 0, 1110 - &_lock); 1101 + ARRAY_SIZE(tdm_parents), CLK_SET_RATE_NO_REPARENT, 1102 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_TDM1_CLK_SHIFT, 1103 + SPEAR1310_TDM_CLK_MASK, 0, &_lock); 1111 1104 clk_register_clkdev(clk, "tdm1_mclk", NULL); 1112 1105 1113 1106 clk = clk_register_gate(NULL, "tdm1_clk", "tdm1_mclk", 0, ··· 1116 1109 clk_register_clkdev(clk, NULL, "tdm_hdlc.0"); 1117 1110 1118 1111 clk = clk_register_mux(NULL, "tdm2_mclk", tdm_parents, 1119 - ARRAY_SIZE(tdm_parents), 0, SPEAR1310_RAS_CTRL_REG0, 1120 - SPEAR1310_TDM2_CLK_SHIFT, SPEAR1310_TDM_CLK_MASK, 0, 1121 - &_lock); 1112 + ARRAY_SIZE(tdm_parents), CLK_SET_RATE_NO_REPARENT, 1113 + SPEAR1310_RAS_CTRL_REG0, SPEAR1310_TDM2_CLK_SHIFT, 1114 + SPEAR1310_TDM_CLK_MASK, 0, &_lock); 1122 1115 clk_register_clkdev(clk, "tdm2_mclk", NULL); 1123 1116 1124 1117 clk = clk_register_gate(NULL, "tdm2_clk", "tdm2_mclk", 0,
+53 -44
drivers/clk/spear/spear1340_clock.c
··· 473 473 /* clock derived from 24 or 25 MHz osc clk */ 474 474 /* vco-pll */ 475 475 clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, 476 - ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, 477 - SPEAR1340_PLL1_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, 478 - &_lock); 476 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 477 + SPEAR1340_PLL_CFG, SPEAR1340_PLL1_CLK_SHIFT, 478 + SPEAR1340_PLL_CLK_MASK, 0, &_lock); 479 479 clk_register_clkdev(clk, "vco1_mclk", NULL); 480 480 clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 0, 481 481 SPEAR1340_PLL1_CTR, SPEAR1340_PLL1_FRQ, pll_rtbl, ··· 484 484 clk_register_clkdev(clk1, "pll1_clk", NULL); 485 485 486 486 clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, 487 - ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, 488 - SPEAR1340_PLL2_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, 489 - &_lock); 487 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 488 + SPEAR1340_PLL_CFG, SPEAR1340_PLL2_CLK_SHIFT, 489 + SPEAR1340_PLL_CLK_MASK, 0, &_lock); 490 490 clk_register_clkdev(clk, "vco2_mclk", NULL); 491 491 clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 0, 492 492 SPEAR1340_PLL2_CTR, SPEAR1340_PLL2_FRQ, pll_rtbl, ··· 495 495 clk_register_clkdev(clk1, "pll2_clk", NULL); 496 496 497 497 clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, 498 - ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, 499 - SPEAR1340_PLL3_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, 500 - &_lock); 498 + ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, 499 + SPEAR1340_PLL_CFG, SPEAR1340_PLL3_CLK_SHIFT, 500 + SPEAR1340_PLL_CLK_MASK, 0, &_lock); 501 501 clk_register_clkdev(clk, "vco3_mclk", NULL); 502 502 clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 0, 503 503 SPEAR1340_PLL3_CTR, SPEAR1340_PLL3_FRQ, pll_rtbl, ··· 561 561 clk_register_clkdev(clk, "amba_syn_clk", NULL); 562 562 563 563 clk = clk_register_mux(NULL, "sys_mclk", sys_parents, 564 - ARRAY_SIZE(sys_parents), 0, SPEAR1340_SYS_CLK_CTRL, 565 - SPEAR1340_SCLK_SRC_SEL_SHIFT, 564 + ARRAY_SIZE(sys_parents), CLK_SET_RATE_NO_REPARENT, 565 + SPEAR1340_SYS_CLK_CTRL, SPEAR1340_SCLK_SRC_SEL_SHIFT, 566 566 SPEAR1340_SCLK_SRC_SEL_MASK, 0, &_lock); 567 567 clk_register_clkdev(clk, "sys_mclk", NULL); 568 568 ··· 583 583 clk_register_clkdev(clk, NULL, "smp_twd"); 584 584 585 585 clk = clk_register_mux(NULL, "ahb_clk", ahb_parents, 586 - ARRAY_SIZE(ahb_parents), 0, SPEAR1340_SYS_CLK_CTRL, 587 - SPEAR1340_HCLK_SRC_SEL_SHIFT, 586 + ARRAY_SIZE(ahb_parents), CLK_SET_RATE_NO_REPARENT, 587 + SPEAR1340_SYS_CLK_CTRL, SPEAR1340_HCLK_SRC_SEL_SHIFT, 588 588 SPEAR1340_HCLK_SRC_SEL_MASK, 0, &_lock); 589 589 clk_register_clkdev(clk, "ahb_clk", NULL); 590 590 ··· 594 594 595 595 /* gpt clocks */ 596 596 clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, 597 - ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, 598 - SPEAR1340_GPT0_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, 599 - &_lock); 597 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 598 + SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT0_CLK_SHIFT, 599 + SPEAR1340_GPT_CLK_MASK, 0, &_lock); 600 600 clk_register_clkdev(clk, "gpt0_mclk", NULL); 601 601 clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, 602 602 SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT0_CLK_ENB, 0, ··· 604 604 clk_register_clkdev(clk, NULL, "gpt0"); 605 605 606 606 clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, 607 - ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, 608 - SPEAR1340_GPT1_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, 609 - &_lock); 607 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 608 + SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT1_CLK_SHIFT, 609 + SPEAR1340_GPT_CLK_MASK, 0, &_lock); 610 610 clk_register_clkdev(clk, "gpt1_mclk", NULL); 611 611 clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, 612 612 SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT1_CLK_ENB, 0, ··· 614 614 clk_register_clkdev(clk, NULL, "gpt1"); 615 615 616 616 clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, 617 - ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, 618 - SPEAR1340_GPT2_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, 619 - &_lock); 617 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 618 + SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT2_CLK_SHIFT, 619 + SPEAR1340_GPT_CLK_MASK, 0, &_lock); 620 620 clk_register_clkdev(clk, "gpt2_mclk", NULL); 621 621 clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, 622 622 SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT2_CLK_ENB, 0, ··· 624 624 clk_register_clkdev(clk, NULL, "gpt2"); 625 625 626 626 clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, 627 - ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, 628 - SPEAR1340_GPT3_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, 629 - &_lock); 627 + ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, 628 + SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT3_CLK_SHIFT, 629 + SPEAR1340_GPT_CLK_MASK, 0, &_lock); 630 630 clk_register_clkdev(clk, "gpt3_mclk", NULL); 631 631 clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, 632 632 SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT3_CLK_ENB, 0, ··· 641 641 clk_register_clkdev(clk1, "uart0_syn_gclk", NULL); 642 642 643 643 clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, 644 - ARRAY_SIZE(uart0_parents), CLK_SET_RATE_PARENT, 644 + ARRAY_SIZE(uart0_parents), 645 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 645 646 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART0_CLK_SHIFT, 646 647 SPEAR1340_UART_CLK_MASK, 0, &_lock); 647 648 clk_register_clkdev(clk, "uart0_mclk", NULL); ··· 659 658 clk_register_clkdev(clk1, "uart1_syn_gclk", NULL); 660 659 661 660 clk = clk_register_mux(NULL, "uart1_mclk", uart1_parents, 662 - ARRAY_SIZE(uart1_parents), 0, SPEAR1340_PERIP_CLK_CFG, 663 - SPEAR1340_UART1_CLK_SHIFT, SPEAR1340_UART_CLK_MASK, 0, 664 - &_lock); 661 + ARRAY_SIZE(uart1_parents), CLK_SET_RATE_NO_REPARENT, 662 + SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART1_CLK_SHIFT, 663 + SPEAR1340_UART_CLK_MASK, 0, &_lock); 665 664 clk_register_clkdev(clk, "uart1_mclk", NULL); 666 665 667 666 clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, ··· 699 698 clk_register_clkdev(clk1, "c3_syn_gclk", NULL); 700 699 701 700 clk = clk_register_mux(NULL, "c3_mclk", c3_parents, 702 - ARRAY_SIZE(c3_parents), CLK_SET_RATE_PARENT, 701 + ARRAY_SIZE(c3_parents), 702 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 703 703 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_C3_CLK_SHIFT, 704 704 SPEAR1340_C3_CLK_MASK, 0, &_lock); 705 705 clk_register_clkdev(clk, "c3_mclk", NULL); ··· 712 710 713 711 /* gmac */ 714 712 clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, 715 - ARRAY_SIZE(gmac_phy_input_parents), 0, 716 - SPEAR1340_GMAC_CLK_CFG, 713 + ARRAY_SIZE(gmac_phy_input_parents), 714 + CLK_SET_RATE_NO_REPARENT, SPEAR1340_GMAC_CLK_CFG, 717 715 SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT, 718 716 SPEAR1340_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); 719 717 clk_register_clkdev(clk, "phy_input_mclk", NULL); ··· 725 723 clk_register_clkdev(clk1, "phy_syn_gclk", NULL); 726 724 727 725 clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, 728 - ARRAY_SIZE(gmac_phy_parents), 0, 726 + ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT, 729 727 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GMAC_PHY_CLK_SHIFT, 730 728 SPEAR1340_GMAC_PHY_CLK_MASK, 0, &_lock); 731 729 clk_register_clkdev(clk, "stmmacphy.0", NULL); 732 730 733 731 /* clcd */ 734 732 clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, 735 - ARRAY_SIZE(clcd_synth_parents), 0, 736 - SPEAR1340_CLCD_CLK_SYNT, SPEAR1340_CLCD_SYNT_CLK_SHIFT, 733 + ARRAY_SIZE(clcd_synth_parents), 734 + CLK_SET_RATE_NO_REPARENT, SPEAR1340_CLCD_CLK_SYNT, 735 + SPEAR1340_CLCD_SYNT_CLK_SHIFT, 737 736 SPEAR1340_CLCD_SYNT_CLK_MASK, 0, &_lock); 738 737 clk_register_clkdev(clk, "clcd_syn_mclk", NULL); 739 738 ··· 744 741 clk_register_clkdev(clk, "clcd_syn_clk", NULL); 745 742 746 743 clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, 747 - ARRAY_SIZE(clcd_pixel_parents), CLK_SET_RATE_PARENT, 744 + ARRAY_SIZE(clcd_pixel_parents), 745 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 748 746 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_CLCD_CLK_SHIFT, 749 747 SPEAR1340_CLCD_CLK_MASK, 0, &_lock); 750 748 clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); ··· 757 753 758 754 /* i2s */ 759 755 clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, 760 - ARRAY_SIZE(i2s_src_parents), 0, SPEAR1340_I2S_CLK_CFG, 761 - SPEAR1340_I2S_SRC_CLK_SHIFT, SPEAR1340_I2S_SRC_CLK_MASK, 762 - 0, &_lock); 756 + ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT, 757 + SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_SRC_CLK_SHIFT, 758 + SPEAR1340_I2S_SRC_CLK_MASK, 0, &_lock); 763 759 clk_register_clkdev(clk, "i2s_src_mclk", NULL); 764 760 765 761 clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", ··· 769 765 clk_register_clkdev(clk, "i2s_prs1_clk", NULL); 770 766 771 767 clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, 772 - ARRAY_SIZE(i2s_ref_parents), CLK_SET_RATE_PARENT, 768 + ARRAY_SIZE(i2s_ref_parents), 769 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 773 770 SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_REF_SHIFT, 774 771 SPEAR1340_I2S_REF_SEL_MASK, 0, &_lock); 775 772 clk_register_clkdev(clk, "i2s_ref_mclk", NULL); ··· 896 891 897 892 /* RAS clks */ 898 893 clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, 899 - ARRAY_SIZE(gen_synth0_1_parents), 0, SPEAR1340_PLL_CFG, 894 + ARRAY_SIZE(gen_synth0_1_parents), 895 + CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG, 900 896 SPEAR1340_GEN_SYNT0_1_CLK_SHIFT, 901 897 SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); 902 898 clk_register_clkdev(clk, "gen_syn0_1_mclk", NULL); 903 899 904 900 clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, 905 - ARRAY_SIZE(gen_synth2_3_parents), 0, SPEAR1340_PLL_CFG, 901 + ARRAY_SIZE(gen_synth2_3_parents), 902 + CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG, 906 903 SPEAR1340_GEN_SYNT2_3_CLK_SHIFT, 907 904 SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); 908 905 clk_register_clkdev(clk, "gen_syn2_3_mclk", NULL); ··· 945 938 clk_register_clkdev(clk, NULL, "spear_cec.1"); 946 939 947 940 clk = clk_register_mux(NULL, "spdif_out_mclk", spdif_out_parents, 948 - ARRAY_SIZE(spdif_out_parents), CLK_SET_RATE_PARENT, 941 + ARRAY_SIZE(spdif_out_parents), 942 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 949 943 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_OUT_CLK_SHIFT, 950 944 SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); 951 945 clk_register_clkdev(clk, "spdif_out_mclk", NULL); ··· 957 949 clk_register_clkdev(clk, NULL, "d0000000.spdif-out"); 958 950 959 951 clk = clk_register_mux(NULL, "spdif_in_mclk", spdif_in_parents, 960 - ARRAY_SIZE(spdif_in_parents), CLK_SET_RATE_PARENT, 952 + ARRAY_SIZE(spdif_in_parents), 953 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 961 954 SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_IN_CLK_SHIFT, 962 955 SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); 963 956 clk_register_clkdev(clk, "spdif_in_mclk", NULL);
+36 -21
drivers/clk/spear/spear3xx_clock.c
··· 294 294 clk_register_clkdev(clk, NULL, "a9400000.i2s"); 295 295 296 296 clk = clk_register_mux(NULL, "i2s_ref_clk", i2s_ref_parents, 297 - ARRAY_SIZE(i2s_ref_parents), CLK_SET_RATE_PARENT, 297 + ARRAY_SIZE(i2s_ref_parents), 298 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 298 299 SPEAR320_CONTROL_REG, I2S_REF_PCLK_SHIFT, 299 300 I2S_REF_PCLK_MASK, 0, &_lock); 300 301 clk_register_clkdev(clk, "i2s_ref_clk", NULL); ··· 314 313 clk_register_clkdev(clk, "hclk", "ab000000.eth"); 315 314 316 315 clk = clk_register_mux(NULL, "rs485_clk", uartx_parents, 317 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 316 + ARRAY_SIZE(uartx_parents), 317 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 318 318 SPEAR320_EXT_CTRL_REG, SPEAR320_RS485_PCLK_SHIFT, 319 319 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 320 320 clk_register_clkdev(clk, NULL, "a9300000.serial"); 321 321 322 322 clk = clk_register_mux(NULL, "sdhci_clk", sdhci_parents, 323 - ARRAY_SIZE(sdhci_parents), CLK_SET_RATE_PARENT, 323 + ARRAY_SIZE(sdhci_parents), 324 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 324 325 SPEAR320_CONTROL_REG, SDHCI_PCLK_SHIFT, SDHCI_PCLK_MASK, 325 326 0, &_lock); 326 327 clk_register_clkdev(clk, NULL, "70000000.sdhci"); 327 328 328 329 clk = clk_register_mux(NULL, "smii_pclk", smii0_parents, 329 - ARRAY_SIZE(smii0_parents), 0, SPEAR320_CONTROL_REG, 330 - SMII_PCLK_SHIFT, SMII_PCLK_MASK, 0, &_lock); 330 + ARRAY_SIZE(smii0_parents), CLK_SET_RATE_NO_REPARENT, 331 + SPEAR320_CONTROL_REG, SMII_PCLK_SHIFT, SMII_PCLK_MASK, 332 + 0, &_lock); 331 333 clk_register_clkdev(clk, NULL, "smii_pclk"); 332 334 333 335 clk = clk_register_fixed_factor(NULL, "smii_clk", "smii_pclk", 0, 1, 1); 334 336 clk_register_clkdev(clk, NULL, "smii"); 335 337 336 338 clk = clk_register_mux(NULL, "uart1_clk", uartx_parents, 337 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 339 + ARRAY_SIZE(uartx_parents), 340 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 338 341 SPEAR320_CONTROL_REG, UART1_PCLK_SHIFT, UART1_PCLK_MASK, 339 342 0, &_lock); 340 343 clk_register_clkdev(clk, NULL, "a3000000.serial"); 341 344 342 345 clk = clk_register_mux(NULL, "uart2_clk", uartx_parents, 343 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 346 + ARRAY_SIZE(uartx_parents), 347 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 344 348 SPEAR320_EXT_CTRL_REG, SPEAR320_UART2_PCLK_SHIFT, 345 349 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 346 350 clk_register_clkdev(clk, NULL, "a4000000.serial"); 347 351 348 352 clk = clk_register_mux(NULL, "uart3_clk", uartx_parents, 349 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 353 + ARRAY_SIZE(uartx_parents), 354 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 350 355 SPEAR320_EXT_CTRL_REG, SPEAR320_UART3_PCLK_SHIFT, 351 356 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 352 357 clk_register_clkdev(clk, NULL, "a9100000.serial"); 353 358 354 359 clk = clk_register_mux(NULL, "uart4_clk", uartx_parents, 355 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 360 + ARRAY_SIZE(uartx_parents), 361 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 356 362 SPEAR320_EXT_CTRL_REG, SPEAR320_UART4_PCLK_SHIFT, 357 363 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 358 364 clk_register_clkdev(clk, NULL, "a9200000.serial"); 359 365 360 366 clk = clk_register_mux(NULL, "uart5_clk", uartx_parents, 361 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 367 + ARRAY_SIZE(uartx_parents), 368 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 362 369 SPEAR320_EXT_CTRL_REG, SPEAR320_UART5_PCLK_SHIFT, 363 370 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 364 371 clk_register_clkdev(clk, NULL, "60000000.serial"); 365 372 366 373 clk = clk_register_mux(NULL, "uart6_clk", uartx_parents, 367 - ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, 374 + ARRAY_SIZE(uartx_parents), 375 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 368 376 SPEAR320_EXT_CTRL_REG, SPEAR320_UART6_PCLK_SHIFT, 369 377 SPEAR320_UARTX_PCLK_MASK, 0, &_lock); 370 378 clk_register_clkdev(clk, NULL, "60100000.serial"); ··· 437 427 clk_register_clkdev(clk1, "uart_syn_gclk", NULL); 438 428 439 429 clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, 440 - ARRAY_SIZE(uart0_parents), CLK_SET_RATE_PARENT, 430 + ARRAY_SIZE(uart0_parents), 431 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 441 432 PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0, 442 433 &_lock); 443 434 clk_register_clkdev(clk, "uart0_mclk", NULL); ··· 455 444 clk_register_clkdev(clk1, "firda_syn_gclk", NULL); 456 445 457 446 clk = clk_register_mux(NULL, "firda_mclk", firda_parents, 458 - ARRAY_SIZE(firda_parents), CLK_SET_RATE_PARENT, 447 + ARRAY_SIZE(firda_parents), 448 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 459 449 PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, 460 450 &_lock); 461 451 clk_register_clkdev(clk, "firda_mclk", NULL); ··· 470 458 clk_register_gpt("gpt0_syn_clk", "pll1_clk", 0, PRSC0_CLK_CFG, gpt_rtbl, 471 459 ARRAY_SIZE(gpt_rtbl), &_lock); 472 460 clk = clk_register_mux(NULL, "gpt0_clk", gpt0_parents, 473 - ARRAY_SIZE(gpt0_parents), CLK_SET_RATE_PARENT, 461 + ARRAY_SIZE(gpt0_parents), 462 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 474 463 PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 475 464 clk_register_clkdev(clk, NULL, "gpt0"); 476 465 477 466 clk_register_gpt("gpt1_syn_clk", "pll1_clk", 0, PRSC1_CLK_CFG, gpt_rtbl, 478 467 ARRAY_SIZE(gpt_rtbl), &_lock); 479 468 clk = clk_register_mux(NULL, "gpt1_mclk", gpt1_parents, 480 - ARRAY_SIZE(gpt1_parents), CLK_SET_RATE_PARENT, 469 + ARRAY_SIZE(gpt1_parents), 470 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 481 471 PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 482 472 clk_register_clkdev(clk, "gpt1_mclk", NULL); 483 473 clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", ··· 490 476 clk_register_gpt("gpt2_syn_clk", "pll1_clk", 0, PRSC2_CLK_CFG, gpt_rtbl, 491 477 ARRAY_SIZE(gpt_rtbl), &_lock); 492 478 clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, 493 - ARRAY_SIZE(gpt2_parents), CLK_SET_RATE_PARENT, 479 + ARRAY_SIZE(gpt2_parents), 480 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 494 481 PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 495 482 clk_register_clkdev(clk, "gpt2_mclk", NULL); 496 483 clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", ··· 513 498 clk_register_clkdev(clk1, "gen1_syn_gclk", NULL); 514 499 515 500 clk = clk_register_mux(NULL, "gen2_3_par_clk", gen2_3_parents, 516 - ARRAY_SIZE(gen2_3_parents), 0, CORE_CLK_CFG, 517 - GEN_SYNTH2_3_CLK_SHIFT, GEN_SYNTH2_3_CLK_MASK, 0, 518 - &_lock); 501 + ARRAY_SIZE(gen2_3_parents), CLK_SET_RATE_NO_REPARENT, 502 + CORE_CLK_CFG, GEN_SYNTH2_3_CLK_SHIFT, 503 + GEN_SYNTH2_3_CLK_MASK, 0, &_lock); 519 504 clk_register_clkdev(clk, "gen2_3_par_clk", NULL); 520 505 521 506 clk = clk_register_aux("gen2_syn_clk", "gen2_syn_gclk", ··· 555 540 clk_register_clkdev(clk, "ahbmult2_clk", NULL); 556 541 557 542 clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, 558 - ARRAY_SIZE(ddr_parents), 0, PLL_CLK_CFG, MCTR_CLK_SHIFT, 559 - MCTR_CLK_MASK, 0, &_lock); 543 + ARRAY_SIZE(ddr_parents), CLK_SET_RATE_NO_REPARENT, 544 + PLL_CLK_CFG, MCTR_CLK_SHIFT, MCTR_CLK_MASK, 0, &_lock); 560 545 clk_register_clkdev(clk, "ddr_clk", NULL); 561 546 562 547 clk = clk_register_divider(NULL, "apb_clk", "ahb_clk",
+19 -16
drivers/clk/spear/spear6xx_clock.c
··· 169 169 clk_register_clkdev(clk1, "uart_syn_gclk", NULL); 170 170 171 171 clk = clk_register_mux(NULL, "uart_mclk", uart_parents, 172 - ARRAY_SIZE(uart_parents), 0, PERIP_CLK_CFG, 173 - UART_CLK_SHIFT, UART_CLK_MASK, 0, &_lock); 172 + ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, 173 + PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0, 174 + &_lock); 174 175 clk_register_clkdev(clk, "uart_mclk", NULL); 175 176 176 177 clk = clk_register_gate(NULL, "uart0", "uart_mclk", 0, PERIP1_CLK_ENB, ··· 189 188 clk_register_clkdev(clk1, "firda_syn_gclk", NULL); 190 189 191 190 clk = clk_register_mux(NULL, "firda_mclk", firda_parents, 192 - ARRAY_SIZE(firda_parents), 0, PERIP_CLK_CFG, 193 - FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, &_lock); 191 + ARRAY_SIZE(firda_parents), CLK_SET_RATE_NO_REPARENT, 192 + PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, 193 + &_lock); 194 194 clk_register_clkdev(clk, "firda_mclk", NULL); 195 195 196 196 clk = clk_register_gate(NULL, "firda_clk", "firda_mclk", 0, ··· 205 203 clk_register_clkdev(clk1, "clcd_syn_gclk", NULL); 206 204 207 205 clk = clk_register_mux(NULL, "clcd_mclk", clcd_parents, 208 - ARRAY_SIZE(clcd_parents), 0, PERIP_CLK_CFG, 209 - CLCD_CLK_SHIFT, CLCD_CLK_MASK, 0, &_lock); 206 + ARRAY_SIZE(clcd_parents), CLK_SET_RATE_NO_REPARENT, 207 + PERIP_CLK_CFG, CLCD_CLK_SHIFT, CLCD_CLK_MASK, 0, 208 + &_lock); 210 209 clk_register_clkdev(clk, "clcd_mclk", NULL); 211 210 212 211 clk = clk_register_gate(NULL, "clcd_clk", "clcd_mclk", 0, ··· 220 217 clk_register_clkdev(clk, "gpt0_1_syn_clk", NULL); 221 218 222 219 clk = clk_register_mux(NULL, "gpt0_mclk", gpt0_1_parents, 223 - ARRAY_SIZE(gpt0_1_parents), 0, PERIP_CLK_CFG, 224 - GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 220 + ARRAY_SIZE(gpt0_1_parents), CLK_SET_RATE_NO_REPARENT, 221 + PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 225 222 clk_register_clkdev(clk, NULL, "gpt0"); 226 223 227 224 clk = clk_register_mux(NULL, "gpt1_mclk", gpt0_1_parents, 228 - ARRAY_SIZE(gpt0_1_parents), 0, PERIP_CLK_CFG, 229 - GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 225 + ARRAY_SIZE(gpt0_1_parents), CLK_SET_RATE_NO_REPARENT, 226 + PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 230 227 clk_register_clkdev(clk, "gpt1_mclk", NULL); 231 228 232 229 clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, ··· 238 235 clk_register_clkdev(clk, "gpt2_syn_clk", NULL); 239 236 240 237 clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, 241 - ARRAY_SIZE(gpt2_parents), 0, PERIP_CLK_CFG, 242 - GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 238 + ARRAY_SIZE(gpt2_parents), CLK_SET_RATE_NO_REPARENT, 239 + PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 243 240 clk_register_clkdev(clk, "gpt2_mclk", NULL); 244 241 245 242 clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, ··· 251 248 clk_register_clkdev(clk, "gpt3_syn_clk", NULL); 252 249 253 250 clk = clk_register_mux(NULL, "gpt3_mclk", gpt3_parents, 254 - ARRAY_SIZE(gpt3_parents), 0, PERIP_CLK_CFG, 255 - GPT3_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 251 + ARRAY_SIZE(gpt3_parents), CLK_SET_RATE_NO_REPARENT, 252 + PERIP_CLK_CFG, GPT3_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); 256 253 clk_register_clkdev(clk, "gpt3_mclk", NULL); 257 254 258 255 clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, ··· 280 277 clk_register_clkdev(clk, "ahbmult2_clk", NULL); 281 278 282 279 clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, 283 - ARRAY_SIZE(ddr_parents), 0, PLL_CLK_CFG, MCTR_CLK_SHIFT, 284 - MCTR_CLK_MASK, 0, &_lock); 280 + ARRAY_SIZE(ddr_parents), CLK_SET_RATE_NO_REPARENT, 281 + PLL_CLK_CFG, MCTR_CLK_SHIFT, MCTR_CLK_MASK, 0, &_lock); 285 282 clk_register_clkdev(clk, "ddr_clk", NULL); 286 283 287 284 clk = clk_register_divider(NULL, "apb_clk", "ahb_clk",
+211 -59
drivers/clk/sunxi/clk-sunxi.c
··· 25 25 static DEFINE_SPINLOCK(clk_lock); 26 26 27 27 /** 28 - * sunxi_osc_clk_setup() - Setup function for gatable oscillator 28 + * sun4i_osc_clk_setup() - Setup function for gatable oscillator 29 29 */ 30 30 31 31 #define SUNXI_OSC24M_GATE 0 32 32 33 - static void __init sunxi_osc_clk_setup(struct device_node *node) 33 + static void __init sun4i_osc_clk_setup(struct device_node *node) 34 34 { 35 35 struct clk *clk; 36 36 struct clk_fixed_rate *fixed; ··· 64 64 &gate->hw, &clk_gate_ops, 65 65 CLK_IS_ROOT); 66 66 67 - if (clk) { 67 + if (!IS_ERR(clk)) { 68 68 of_clk_add_provider(node, of_clk_src_simple_get, clk); 69 69 clk_register_clkdev(clk, clk_name, NULL); 70 70 } 71 71 } 72 + CLK_OF_DECLARE(sun4i_osc, "allwinner,sun4i-osc-clk", sun4i_osc_clk_setup); 72 73 73 74 74 75 75 76 /** 76 - * sunxi_get_pll1_factors() - calculates n, k, m, p factors for PLL1 77 + * sun4i_get_pll1_factors() - calculates n, k, m, p factors for PLL1 77 78 * PLL1 rate is calculated as follows 78 79 * rate = (parent_rate * n * (k + 1) >> p) / (m + 1); 79 80 * parent_rate is always 24Mhz 80 81 */ 81 82 82 - static void sunxi_get_pll1_factors(u32 *freq, u32 parent_rate, 83 + static void sun4i_get_pll1_factors(u32 *freq, u32 parent_rate, 83 84 u8 *n, u8 *k, u8 *m, u8 *p) 84 85 { 85 86 u8 div; ··· 125 124 *n = div / 4; 126 125 } 127 126 127 + /** 128 + * sun6i_a31_get_pll1_factors() - calculates n, k and m factors for PLL1 129 + * PLL1 rate is calculated as follows 130 + * rate = parent_rate * (n + 1) * (k + 1) / (m + 1); 131 + * parent_rate should always be 24MHz 132 + */ 133 + static void sun6i_a31_get_pll1_factors(u32 *freq, u32 parent_rate, 134 + u8 *n, u8 *k, u8 *m, u8 *p) 135 + { 136 + /* 137 + * We can operate only on MHz, this will make our life easier 138 + * later. 139 + */ 140 + u32 freq_mhz = *freq / 1000000; 141 + u32 parent_freq_mhz = parent_rate / 1000000; 128 142 143 + /* 144 + * Round down the frequency to the closest multiple of either 145 + * 6 or 16 146 + */ 147 + u32 round_freq_6 = round_down(freq_mhz, 6); 148 + u32 round_freq_16 = round_down(freq_mhz, 16); 149 + 150 + if (round_freq_6 > round_freq_16) 151 + freq_mhz = round_freq_6; 152 + else 153 + freq_mhz = round_freq_16; 154 + 155 + *freq = freq_mhz * 1000000; 156 + 157 + /* 158 + * If the factors pointer are null, we were just called to 159 + * round down the frequency. 160 + * Exit. 161 + */ 162 + if (n == NULL) 163 + return; 164 + 165 + /* If the frequency is a multiple of 32 MHz, k is always 3 */ 166 + if (!(freq_mhz % 32)) 167 + *k = 3; 168 + /* If the frequency is a multiple of 9 MHz, k is always 2 */ 169 + else if (!(freq_mhz % 9)) 170 + *k = 2; 171 + /* If the frequency is a multiple of 8 MHz, k is always 1 */ 172 + else if (!(freq_mhz % 8)) 173 + *k = 1; 174 + /* Otherwise, we don't use the k factor */ 175 + else 176 + *k = 0; 177 + 178 + /* 179 + * If the frequency is a multiple of 2 but not a multiple of 180 + * 3, m is 3. This is the first time we use 6 here, yet we 181 + * will use it on several other places. 182 + * We use this number because it's the lowest frequency we can 183 + * generate (with n = 0, k = 0, m = 3), so every other frequency 184 + * somehow relates to this frequency. 185 + */ 186 + if ((freq_mhz % 6) == 2 || (freq_mhz % 6) == 4) 187 + *m = 2; 188 + /* 189 + * If the frequency is a multiple of 6MHz, but the factor is 190 + * odd, m will be 3 191 + */ 192 + else if ((freq_mhz / 6) & 1) 193 + *m = 3; 194 + /* Otherwise, we end up with m = 1 */ 195 + else 196 + *m = 1; 197 + 198 + /* Calculate n thanks to the above factors we already got */ 199 + *n = freq_mhz * (*m + 1) / ((*k + 1) * parent_freq_mhz) - 1; 200 + 201 + /* 202 + * If n end up being outbound, and that we can still decrease 203 + * m, do it. 204 + */ 205 + if ((*n + 1) > 31 && (*m + 1) > 1) { 206 + *n = (*n + 1) / 2 - 1; 207 + *m = (*m + 1) / 2 - 1; 208 + } 209 + } 129 210 130 211 /** 131 - * sunxi_get_apb1_factors() - calculates m, p factors for APB1 212 + * sun4i_get_apb1_factors() - calculates m, p factors for APB1 132 213 * APB1 rate is calculated as follows 133 214 * rate = (parent_rate >> p) / (m + 1); 134 215 */ 135 216 136 - static void sunxi_get_apb1_factors(u32 *freq, u32 parent_rate, 217 + static void sun4i_get_apb1_factors(u32 *freq, u32 parent_rate, 137 218 u8 *n, u8 *k, u8 *m, u8 *p) 138 219 { 139 220 u8 calcm, calcp; ··· 261 178 void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p); 262 179 }; 263 180 264 - static struct clk_factors_config pll1_config = { 181 + static struct clk_factors_config sun4i_pll1_config = { 265 182 .nshift = 8, 266 183 .nwidth = 5, 267 184 .kshift = 4, ··· 272 189 .pwidth = 2, 273 190 }; 274 191 275 - static struct clk_factors_config apb1_config = { 192 + static struct clk_factors_config sun6i_a31_pll1_config = { 193 + .nshift = 8, 194 + .nwidth = 5, 195 + .kshift = 4, 196 + .kwidth = 2, 197 + .mshift = 0, 198 + .mwidth = 2, 199 + }; 200 + 201 + static struct clk_factors_config sun4i_apb1_config = { 276 202 .mshift = 0, 277 203 .mwidth = 5, 278 204 .pshift = 16, 279 205 .pwidth = 2, 280 206 }; 281 207 282 - static const __initconst struct factors_data pll1_data = { 283 - .table = &pll1_config, 284 - .getter = sunxi_get_pll1_factors, 208 + static const struct factors_data sun4i_pll1_data __initconst = { 209 + .table = &sun4i_pll1_config, 210 + .getter = sun4i_get_pll1_factors, 285 211 }; 286 212 287 - static const __initconst struct factors_data apb1_data = { 288 - .table = &apb1_config, 289 - .getter = sunxi_get_apb1_factors, 213 + static const struct factors_data sun6i_a31_pll1_data __initconst = { 214 + .table = &sun6i_a31_pll1_config, 215 + .getter = sun6i_a31_get_pll1_factors, 216 + }; 217 + 218 + static const struct factors_data sun4i_apb1_data __initconst = { 219 + .table = &sun4i_apb1_config, 220 + .getter = sun4i_get_apb1_factors, 290 221 }; 291 222 292 223 static void __init sunxi_factors_clk_setup(struct device_node *node, ··· 318 221 clk = clk_register_factors(NULL, clk_name, parent, 0, reg, 319 222 data->table, data->getter, &clk_lock); 320 223 321 - if (clk) { 224 + if (!IS_ERR(clk)) { 322 225 of_clk_add_provider(node, of_clk_src_simple_get, clk); 323 226 clk_register_clkdev(clk, clk_name, NULL); 324 227 } ··· 336 239 u8 shift; 337 240 }; 338 241 339 - static const __initconst struct mux_data cpu_mux_data = { 242 + static const struct mux_data sun4i_cpu_mux_data __initconst = { 340 243 .shift = 16, 341 244 }; 342 245 343 - static const __initconst struct mux_data apb1_mux_data = { 246 + static const struct mux_data sun6i_a31_ahb1_mux_data __initconst = { 247 + .shift = 12, 248 + }; 249 + 250 + static const struct mux_data sun4i_apb1_mux_data __initconst = { 344 251 .shift = 24, 345 252 }; 346 253 ··· 362 261 while (i < 5 && (parents[i] = of_clk_get_parent_name(node, i)) != NULL) 363 262 i++; 364 263 365 - clk = clk_register_mux(NULL, clk_name, parents, i, 0, reg, 264 + clk = clk_register_mux(NULL, clk_name, parents, i, 265 + CLK_SET_RATE_NO_REPARENT, reg, 366 266 data->shift, SUNXI_MUX_GATE_WIDTH, 367 267 0, &clk_lock); 368 268 ··· 379 277 * sunxi_divider_clk_setup() - Setup function for simple divider clocks 380 278 */ 381 279 382 - #define SUNXI_DIVISOR_WIDTH 2 383 - 384 280 struct div_data { 385 - u8 shift; 386 - u8 pow; 281 + u8 shift; 282 + u8 pow; 283 + u8 width; 387 284 }; 388 285 389 - static const __initconst struct div_data axi_data = { 390 - .shift = 0, 391 - .pow = 0, 286 + static const struct div_data sun4i_axi_data __initconst = { 287 + .shift = 0, 288 + .pow = 0, 289 + .width = 2, 392 290 }; 393 291 394 - static const __initconst struct div_data ahb_data = { 395 - .shift = 4, 396 - .pow = 1, 292 + static const struct div_data sun4i_ahb_data __initconst = { 293 + .shift = 4, 294 + .pow = 1, 295 + .width = 2, 397 296 }; 398 297 399 - static const __initconst struct div_data apb0_data = { 400 - .shift = 8, 401 - .pow = 1, 298 + static const struct div_data sun4i_apb0_data __initconst = { 299 + .shift = 8, 300 + .pow = 1, 301 + .width = 2, 302 + }; 303 + 304 + static const struct div_data sun6i_a31_apb2_div_data __initconst = { 305 + .shift = 0, 306 + .pow = 0, 307 + .width = 4, 402 308 }; 403 309 404 310 static void __init sunxi_divider_clk_setup(struct device_node *node, ··· 422 312 clk_parent = of_clk_get_parent_name(node, 0); 423 313 424 314 clk = clk_register_divider(NULL, clk_name, clk_parent, 0, 425 - reg, data->shift, SUNXI_DIVISOR_WIDTH, 315 + reg, data->shift, data->width, 426 316 data->pow ? CLK_DIVIDER_POWER_OF_TWO : 0, 427 317 &clk_lock); 428 318 if (clk) { ··· 443 333 DECLARE_BITMAP(mask, SUNXI_GATES_MAX_SIZE); 444 334 }; 445 335 446 - static const __initconst struct gates_data sun4i_axi_gates_data = { 336 + static const struct gates_data sun4i_axi_gates_data __initconst = { 447 337 .mask = {1}, 448 338 }; 449 339 450 - static const __initconst struct gates_data sun4i_ahb_gates_data = { 340 + static const struct gates_data sun4i_ahb_gates_data __initconst = { 451 341 .mask = {0x7F77FFF, 0x14FB3F}, 452 342 }; 453 343 454 - static const __initconst struct gates_data sun5i_a13_ahb_gates_data = { 344 + static const struct gates_data sun5i_a10s_ahb_gates_data __initconst = { 345 + .mask = {0x147667e7, 0x185915}, 346 + }; 347 + 348 + static const struct gates_data sun5i_a13_ahb_gates_data __initconst = { 455 349 .mask = {0x107067e7, 0x185111}, 456 350 }; 457 351 458 - static const __initconst struct gates_data sun4i_apb0_gates_data = { 352 + static const struct gates_data sun6i_a31_ahb1_gates_data __initconst = { 353 + .mask = {0xEDFE7F62, 0x794F931}, 354 + }; 355 + 356 + static const struct gates_data sun7i_a20_ahb_gates_data __initconst = { 357 + .mask = { 0x12f77fff, 0x16ff3f }, 358 + }; 359 + 360 + static const struct gates_data sun4i_apb0_gates_data __initconst = { 459 361 .mask = {0x4EF}, 460 362 }; 461 363 462 - static const __initconst struct gates_data sun5i_a13_apb0_gates_data = { 364 + static const struct gates_data sun5i_a10s_apb0_gates_data __initconst = { 365 + .mask = {0x469}, 366 + }; 367 + 368 + static const struct gates_data sun5i_a13_apb0_gates_data __initconst = { 463 369 .mask = {0x61}, 464 370 }; 465 371 466 - static const __initconst struct gates_data sun4i_apb1_gates_data = { 372 + static const struct gates_data sun7i_a20_apb0_gates_data __initconst = { 373 + .mask = { 0x4ff }, 374 + }; 375 + 376 + static const struct gates_data sun4i_apb1_gates_data __initconst = { 467 377 .mask = {0xFF00F7}, 468 378 }; 469 379 470 - static const __initconst struct gates_data sun5i_a13_apb1_gates_data = { 380 + static const struct gates_data sun5i_a10s_apb1_gates_data __initconst = { 381 + .mask = {0xf0007}, 382 + }; 383 + 384 + static const struct gates_data sun5i_a13_apb1_gates_data __initconst = { 471 385 .mask = {0xa0007}, 386 + }; 387 + 388 + static const struct gates_data sun6i_a31_apb1_gates_data __initconst = { 389 + .mask = {0x3031}, 390 + }; 391 + 392 + static const struct gates_data sun6i_a31_apb2_gates_data __initconst = { 393 + .mask = {0x3F000F}, 394 + }; 395 + 396 + static const struct gates_data sun7i_a20_apb1_gates_data __initconst = { 397 + .mask = { 0xff80ff }, 472 398 }; 473 399 474 400 static void __init sunxi_gates_clk_setup(struct device_node *node, ··· 556 410 of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 557 411 } 558 412 559 - /* Matches for of_clk_init */ 560 - static const __initconst struct of_device_id clk_match[] = { 561 - {.compatible = "allwinner,sun4i-osc-clk", .data = sunxi_osc_clk_setup,}, 562 - {} 563 - }; 564 - 565 413 /* Matches for factors clocks */ 566 - static const __initconst struct of_device_id clk_factors_match[] = { 567 - {.compatible = "allwinner,sun4i-pll1-clk", .data = &pll1_data,}, 568 - {.compatible = "allwinner,sun4i-apb1-clk", .data = &apb1_data,}, 414 + static const struct of_device_id clk_factors_match[] __initconst = { 415 + {.compatible = "allwinner,sun4i-pll1-clk", .data = &sun4i_pll1_data,}, 416 + {.compatible = "allwinner,sun6i-a31-pll1-clk", .data = &sun6i_a31_pll1_data,}, 417 + {.compatible = "allwinner,sun4i-apb1-clk", .data = &sun4i_apb1_data,}, 569 418 {} 570 419 }; 571 420 572 421 /* Matches for divider clocks */ 573 - static const __initconst struct of_device_id clk_div_match[] = { 574 - {.compatible = "allwinner,sun4i-axi-clk", .data = &axi_data,}, 575 - {.compatible = "allwinner,sun4i-ahb-clk", .data = &ahb_data,}, 576 - {.compatible = "allwinner,sun4i-apb0-clk", .data = &apb0_data,}, 422 + static const struct of_device_id clk_div_match[] __initconst = { 423 + {.compatible = "allwinner,sun4i-axi-clk", .data = &sun4i_axi_data,}, 424 + {.compatible = "allwinner,sun4i-ahb-clk", .data = &sun4i_ahb_data,}, 425 + {.compatible = "allwinner,sun4i-apb0-clk", .data = &sun4i_apb0_data,}, 426 + {.compatible = "allwinner,sun6i-a31-apb2-div-clk", .data = &sun6i_a31_apb2_div_data,}, 577 427 {} 578 428 }; 579 429 580 430 /* Matches for mux clocks */ 581 - static const __initconst struct of_device_id clk_mux_match[] = { 582 - {.compatible = "allwinner,sun4i-cpu-clk", .data = &cpu_mux_data,}, 583 - {.compatible = "allwinner,sun4i-apb1-mux-clk", .data = &apb1_mux_data,}, 431 + static const struct of_device_id clk_mux_match[] __initconst = { 432 + {.compatible = "allwinner,sun4i-cpu-clk", .data = &sun4i_cpu_mux_data,}, 433 + {.compatible = "allwinner,sun4i-apb1-mux-clk", .data = &sun4i_apb1_mux_data,}, 434 + {.compatible = "allwinner,sun6i-a31-ahb1-mux-clk", .data = &sun6i_a31_ahb1_mux_data,}, 584 435 {} 585 436 }; 586 437 587 438 /* Matches for gate clocks */ 588 - static const __initconst struct of_device_id clk_gates_match[] = { 439 + static const struct of_device_id clk_gates_match[] __initconst = { 589 440 {.compatible = "allwinner,sun4i-axi-gates-clk", .data = &sun4i_axi_gates_data,}, 590 441 {.compatible = "allwinner,sun4i-ahb-gates-clk", .data = &sun4i_ahb_gates_data,}, 442 + {.compatible = "allwinner,sun5i-a10s-ahb-gates-clk", .data = &sun5i_a10s_ahb_gates_data,}, 591 443 {.compatible = "allwinner,sun5i-a13-ahb-gates-clk", .data = &sun5i_a13_ahb_gates_data,}, 444 + {.compatible = "allwinner,sun6i-a31-ahb1-gates-clk", .data = &sun6i_a31_ahb1_gates_data,}, 445 + {.compatible = "allwinner,sun7i-a20-ahb-gates-clk", .data = &sun7i_a20_ahb_gates_data,}, 592 446 {.compatible = "allwinner,sun4i-apb0-gates-clk", .data = &sun4i_apb0_gates_data,}, 447 + {.compatible = "allwinner,sun5i-a10s-apb0-gates-clk", .data = &sun5i_a10s_apb0_gates_data,}, 593 448 {.compatible = "allwinner,sun5i-a13-apb0-gates-clk", .data = &sun5i_a13_apb0_gates_data,}, 449 + {.compatible = "allwinner,sun7i-a20-apb0-gates-clk", .data = &sun7i_a20_apb0_gates_data,}, 594 450 {.compatible = "allwinner,sun4i-apb1-gates-clk", .data = &sun4i_apb1_gates_data,}, 451 + {.compatible = "allwinner,sun5i-a10s-apb1-gates-clk", .data = &sun5i_a10s_apb1_gates_data,}, 595 452 {.compatible = "allwinner,sun5i-a13-apb1-gates-clk", .data = &sun5i_a13_apb1_gates_data,}, 453 + {.compatible = "allwinner,sun6i-a31-apb1-gates-clk", .data = &sun6i_a31_apb1_gates_data,}, 454 + {.compatible = "allwinner,sun7i-a20-apb1-gates-clk", .data = &sun7i_a20_apb1_gates_data,}, 455 + {.compatible = "allwinner,sun6i-a31-apb2-gates-clk", .data = &sun6i_a31_apb2_gates_data,}, 596 456 {} 597 457 }; 598 458 ··· 619 467 620 468 void __init sunxi_init_clocks(void) 621 469 { 622 - /* Register all the simple sunxi clocks on DT */ 623 - of_clk_init(clk_match); 470 + /* Register all the simple and basic clocks on DT */ 471 + of_clk_init(NULL); 624 472 625 473 /* Register factor clocks */ 626 474 of_sunxi_table_clock_setup(clk_factors_match, sunxi_factors_clk_setup);
+25 -13
drivers/clk/tegra/clk-tegra114.c
··· 1566 1566 1567 1567 /* audio0 */ 1568 1568 clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, 1569 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1569 + ARRAY_SIZE(mux_audio_sync_clk), 1570 + CLK_SET_RATE_NO_REPARENT, 1570 1571 clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, 1571 1572 NULL); 1572 1573 clks[audio0_mux] = clk; ··· 1579 1578 1580 1579 /* audio1 */ 1581 1580 clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, 1582 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1581 + ARRAY_SIZE(mux_audio_sync_clk), 1582 + CLK_SET_RATE_NO_REPARENT, 1583 1583 clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, 1584 1584 NULL); 1585 1585 clks[audio1_mux] = clk; ··· 1592 1590 1593 1591 /* audio2 */ 1594 1592 clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, 1595 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1593 + ARRAY_SIZE(mux_audio_sync_clk), 1594 + CLK_SET_RATE_NO_REPARENT, 1596 1595 clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, 1597 1596 NULL); 1598 1597 clks[audio2_mux] = clk; ··· 1605 1602 1606 1603 /* audio3 */ 1607 1604 clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, 1608 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1605 + ARRAY_SIZE(mux_audio_sync_clk), 1606 + CLK_SET_RATE_NO_REPARENT, 1609 1607 clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, 1610 1608 NULL); 1611 1609 clks[audio3_mux] = clk; ··· 1618 1614 1619 1615 /* audio4 */ 1620 1616 clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, 1621 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1617 + ARRAY_SIZE(mux_audio_sync_clk), 1618 + CLK_SET_RATE_NO_REPARENT, 1622 1619 clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, 1623 1620 NULL); 1624 1621 clks[audio4_mux] = clk; ··· 1631 1626 1632 1627 /* spdif */ 1633 1628 clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, 1634 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1629 + ARRAY_SIZE(mux_audio_sync_clk), 1630 + CLK_SET_RATE_NO_REPARENT, 1635 1631 clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, 1636 1632 NULL); 1637 1633 clks[spdif_mux] = clk; ··· 1727 1721 1728 1722 /* clk_out_1 */ 1729 1723 clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, 1730 - ARRAY_SIZE(clk_out1_parents), 0, 1724 + ARRAY_SIZE(clk_out1_parents), 1725 + CLK_SET_RATE_NO_REPARENT, 1731 1726 pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, 1732 1727 &clk_out_lock); 1733 1728 clks[clk_out_1_mux] = clk; ··· 1740 1733 1741 1734 /* clk_out_2 */ 1742 1735 clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, 1743 - ARRAY_SIZE(clk_out2_parents), 0, 1736 + ARRAY_SIZE(clk_out2_parents), 1737 + CLK_SET_RATE_NO_REPARENT, 1744 1738 pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, 1745 1739 &clk_out_lock); 1746 1740 clks[clk_out_2_mux] = clk; ··· 1753 1745 1754 1746 /* clk_out_3 */ 1755 1747 clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, 1756 - ARRAY_SIZE(clk_out3_parents), 0, 1748 + ARRAY_SIZE(clk_out3_parents), 1749 + CLK_SET_RATE_NO_REPARENT, 1757 1750 pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, 1758 1751 &clk_out_lock); 1759 1752 clks[clk_out_3_mux] = clk; ··· 2072 2063 2073 2064 /* dsia */ 2074 2065 clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, 2075 - ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, 2066 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 2067 + CLK_SET_RATE_NO_REPARENT, 2076 2068 clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); 2077 2069 clks[dsia_mux] = clk; 2078 2070 clk = tegra_clk_register_periph_gate("dsia", "dsia_mux", 0, clk_base, ··· 2083 2073 2084 2074 /* dsib */ 2085 2075 clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, 2086 - ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, 2076 + ARRAY_SIZE(mux_plld_out0_plld2_out0), 2077 + CLK_SET_RATE_NO_REPARENT, 2087 2078 clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); 2088 2079 clks[dsib_mux] = clk; 2089 2080 clk = tegra_clk_register_periph_gate("dsib", "dsib_mux", 0, clk_base, ··· 2121 2110 2122 2111 /* emc */ 2123 2112 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 2124 - ARRAY_SIZE(mux_pllmcp_clkm), 0, 2113 + ARRAY_SIZE(mux_pllmcp_clkm), 2114 + CLK_SET_RATE_NO_REPARENT, 2125 2115 clk_base + CLK_SOURCE_EMC, 2126 2116 29, 3, 0, NULL); 2127 2117 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, ··· 2206 2194 * dfll_soc/dfll_ref apparently must be kept enabled, otherwise I2C5 2207 2195 * breaks 2208 2196 */ 2209 - static __initdata struct tegra_clk_init_table init_table[] = { 2197 + static struct tegra_clk_init_table init_table[] __initdata = { 2210 2198 {uarta, pll_p, 408000000, 0}, 2211 2199 {uartb, pll_p, 408000000, 0}, 2212 2200 {uartc, pll_p, 408000000, 0},
+5 -3
drivers/clk/tegra/clk-tegra20.c
··· 778 778 779 779 /* audio */ 780 780 clk = clk_register_mux(NULL, "audio_mux", audio_parents, 781 - ARRAY_SIZE(audio_parents), 0, 781 + ARRAY_SIZE(audio_parents), 782 + CLK_SET_RATE_NO_REPARENT, 782 783 clk_base + AUDIO_SYNC_CLK, 0, 3, 0, NULL); 783 784 clk = clk_register_gate(NULL, "audio", "audio_mux", 0, 784 785 clk_base + AUDIO_SYNC_CLK, 4, ··· 942 941 943 942 /* emc */ 944 943 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 945 - ARRAY_SIZE(mux_pllmcp_clkm), 0, 944 + ARRAY_SIZE(mux_pllmcp_clkm), 945 + CLK_SET_RATE_NO_REPARENT, 946 946 clk_base + CLK_SOURCE_EMC, 947 947 30, 2, 0, NULL); 948 948 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, ··· 1225 1223 #endif 1226 1224 }; 1227 1225 1228 - static __initdata struct tegra_clk_init_table init_table[] = { 1226 + static struct tegra_clk_init_table init_table[] __initdata = { 1229 1227 {pll_p, clk_max, 216000000, 1}, 1230 1228 {pll_p_out1, clk_max, 28800000, 1}, 1231 1229 {pll_p_out2, clk_max, 48000000, 1},
+24 -13
drivers/clk/tegra/clk-tegra30.c
··· 971 971 /* PLLU */ 972 972 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, 973 973 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | 974 - TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK, 974 + TEGRA_PLL_SET_LFCON, 975 975 pll_u_freq_table, 976 976 NULL); 977 977 clk_register_clkdev(clk, "pll_u", NULL); ··· 1026 1026 1027 1027 /* PLLE */ 1028 1028 clk = clk_register_mux(NULL, "pll_e_mux", pll_e_parents, 1029 - ARRAY_SIZE(pll_e_parents), 0, 1029 + ARRAY_SIZE(pll_e_parents), 1030 + CLK_SET_RATE_NO_REPARENT, 1030 1031 clk_base + PLLE_AUX, 2, 1, 0, NULL); 1031 1032 clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, 1032 1033 CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params, ··· 1087 1086 1088 1087 /* audio0 */ 1089 1088 clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, 1090 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1089 + ARRAY_SIZE(mux_audio_sync_clk), 1090 + CLK_SET_RATE_NO_REPARENT, 1091 1091 clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, NULL); 1092 1092 clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, 1093 1093 clk_base + AUDIO_SYNC_CLK_I2S0, 4, ··· 1098 1096 1099 1097 /* audio1 */ 1100 1098 clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, 1101 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1099 + ARRAY_SIZE(mux_audio_sync_clk), 1100 + CLK_SET_RATE_NO_REPARENT, 1102 1101 clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, NULL); 1103 1102 clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, 1104 1103 clk_base + AUDIO_SYNC_CLK_I2S1, 4, ··· 1109 1106 1110 1107 /* audio2 */ 1111 1108 clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, 1112 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1109 + ARRAY_SIZE(mux_audio_sync_clk), 1110 + CLK_SET_RATE_NO_REPARENT, 1113 1111 clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, NULL); 1114 1112 clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, 1115 1113 clk_base + AUDIO_SYNC_CLK_I2S2, 4, ··· 1120 1116 1121 1117 /* audio3 */ 1122 1118 clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, 1123 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1119 + ARRAY_SIZE(mux_audio_sync_clk), 1120 + CLK_SET_RATE_NO_REPARENT, 1124 1121 clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, NULL); 1125 1122 clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, 1126 1123 clk_base + AUDIO_SYNC_CLK_I2S3, 4, ··· 1131 1126 1132 1127 /* audio4 */ 1133 1128 clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, 1134 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1129 + ARRAY_SIZE(mux_audio_sync_clk), 1130 + CLK_SET_RATE_NO_REPARENT, 1135 1131 clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, NULL); 1136 1132 clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, 1137 1133 clk_base + AUDIO_SYNC_CLK_I2S4, 4, ··· 1142 1136 1143 1137 /* spdif */ 1144 1138 clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, 1145 - ARRAY_SIZE(mux_audio_sync_clk), 0, 1139 + ARRAY_SIZE(mux_audio_sync_clk), 1140 + CLK_SET_RATE_NO_REPARENT, 1146 1141 clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, NULL); 1147 1142 clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, 1148 1143 clk_base + AUDIO_SYNC_CLK_SPDIF, 4, ··· 1236 1229 1237 1230 /* clk_out_1 */ 1238 1231 clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, 1239 - ARRAY_SIZE(clk_out1_parents), 0, 1232 + ARRAY_SIZE(clk_out1_parents), 1233 + CLK_SET_RATE_NO_REPARENT, 1240 1234 pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, 1241 1235 &clk_out_lock); 1242 1236 clks[clk_out_1_mux] = clk; ··· 1249 1241 1250 1242 /* clk_out_2 */ 1251 1243 clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, 1252 - ARRAY_SIZE(clk_out2_parents), 0, 1244 + ARRAY_SIZE(clk_out2_parents), 1245 + CLK_SET_RATE_NO_REPARENT, 1253 1246 pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, 1254 1247 &clk_out_lock); 1255 1248 clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0, ··· 1261 1252 1262 1253 /* clk_out_3 */ 1263 1254 clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, 1264 - ARRAY_SIZE(clk_out3_parents), 0, 1255 + ARRAY_SIZE(clk_out3_parents), 1256 + CLK_SET_RATE_NO_REPARENT, 1265 1257 pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, 1266 1258 &clk_out_lock); 1267 1259 clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0, ··· 1689 1679 1690 1680 /* emc */ 1691 1681 clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, 1692 - ARRAY_SIZE(mux_pllmcp_clkm), 0, 1682 + ARRAY_SIZE(mux_pllmcp_clkm), 1683 + CLK_SET_RATE_NO_REPARENT, 1693 1684 clk_base + CLK_SOURCE_EMC, 1694 1685 30, 2, 0, NULL); 1695 1686 clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, ··· 1912 1901 #endif 1913 1902 }; 1914 1903 1915 - static __initdata struct tegra_clk_init_table init_table[] = { 1904 + static struct tegra_clk_init_table init_table[] __initdata = { 1916 1905 {uarta, pll_p, 408000000, 0}, 1917 1906 {uartb, pll_p, 408000000, 0}, 1918 1907 {uartc, pll_p, 408000000, 0},
+2 -2
drivers/clk/versatile/clk-vexpress.c
··· 37 37 snprintf(name, ARRAY_SIZE(name), "timerclken%d", i); 38 38 39 39 vexpress_sp810_timerclken[i] = clk_register_mux(NULL, name, 40 - parents, 2, 0, base + SCCTRL, 41 - SCCTRL_TIMERENnSEL_SHIFT(i), 1, 40 + parents, 2, CLK_SET_RATE_NO_REPARENT, 41 + base + SCCTRL, SCCTRL_TIMERENnSEL_SHIFT(i), 1, 42 42 0, &vexpress_sp810_lock); 43 43 44 44 if (WARN_ON(IS_ERR(vexpress_sp810_timerclken[i])))
+48 -34
drivers/clk/zynq/clkc.c
··· 125 125 div0_name = kasprintf(GFP_KERNEL, "%s_div0", clk_name); 126 126 div1_name = kasprintf(GFP_KERNEL, "%s_div1", clk_name); 127 127 128 - clk = clk_register_mux(NULL, mux_name, parents, 4, 0, 129 - fclk_ctrl_reg, 4, 2, 0, fclk_lock); 128 + clk = clk_register_mux(NULL, mux_name, parents, 4, 129 + CLK_SET_RATE_NO_REPARENT, fclk_ctrl_reg, 4, 2, 0, 130 + fclk_lock); 130 131 131 132 clk = clk_register_divider(NULL, div0_name, mux_name, 132 133 0, fclk_ctrl_reg, 8, 6, CLK_DIVIDER_ONE_BASED | ··· 169 168 mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name0); 170 169 div_name = kasprintf(GFP_KERNEL, "%s_div", clk_name0); 171 170 172 - clk = clk_register_mux(NULL, mux_name, parents, 4, 0, 173 - clk_ctrl, 4, 2, 0, lock); 171 + clk = clk_register_mux(NULL, mux_name, parents, 4, 172 + CLK_SET_RATE_NO_REPARENT, clk_ctrl, 4, 2, 0, lock); 174 173 175 174 clk = clk_register_divider(NULL, div_name, mux_name, 0, clk_ctrl, 8, 6, 176 175 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, lock); ··· 237 236 clk = clk_register_zynq_pll("armpll_int", "ps_clk", SLCR_ARMPLL_CTRL, 238 237 SLCR_PLL_STATUS, 0, &armpll_lock); 239 238 clks[armpll] = clk_register_mux(NULL, clk_output_name[armpll], 240 - armpll_parents, 2, 0, SLCR_ARMPLL_CTRL, 4, 1, 0, 241 - &armpll_lock); 239 + armpll_parents, 2, CLK_SET_RATE_NO_REPARENT, 240 + SLCR_ARMPLL_CTRL, 4, 1, 0, &armpll_lock); 242 241 243 242 clk = clk_register_zynq_pll("ddrpll_int", "ps_clk", SLCR_DDRPLL_CTRL, 244 243 SLCR_PLL_STATUS, 1, &ddrpll_lock); 245 244 clks[ddrpll] = clk_register_mux(NULL, clk_output_name[ddrpll], 246 - ddrpll_parents, 2, 0, SLCR_DDRPLL_CTRL, 4, 1, 0, 247 - &ddrpll_lock); 245 + ddrpll_parents, 2, CLK_SET_RATE_NO_REPARENT, 246 + SLCR_DDRPLL_CTRL, 4, 1, 0, &ddrpll_lock); 248 247 249 248 clk = clk_register_zynq_pll("iopll_int", "ps_clk", SLCR_IOPLL_CTRL, 250 249 SLCR_PLL_STATUS, 2, &iopll_lock); 251 250 clks[iopll] = clk_register_mux(NULL, clk_output_name[iopll], 252 - iopll_parents, 2, 0, SLCR_IOPLL_CTRL, 4, 1, 0, 253 - &iopll_lock); 251 + iopll_parents, 2, CLK_SET_RATE_NO_REPARENT, 252 + SLCR_IOPLL_CTRL, 4, 1, 0, &iopll_lock); 254 253 255 254 /* CPU clocks */ 256 255 tmp = readl(SLCR_621_TRUE) & 1; 257 - clk = clk_register_mux(NULL, "cpu_mux", cpu_parents, 4, 0, 258 - SLCR_ARM_CLK_CTRL, 4, 2, 0, &armclk_lock); 256 + clk = clk_register_mux(NULL, "cpu_mux", cpu_parents, 4, 257 + CLK_SET_RATE_NO_REPARENT, SLCR_ARM_CLK_CTRL, 4, 2, 0, 258 + &armclk_lock); 259 259 clk = clk_register_divider(NULL, "cpu_div", "cpu_mux", 0, 260 260 SLCR_ARM_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | 261 261 CLK_DIVIDER_ALLOW_ZERO, &armclk_lock); ··· 295 293 swdt_ext_clk_mux_parents[i + 1] = dummy_nm; 296 294 } 297 295 clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt], 298 - swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT, 299 - SLCR_SWDT_CLK_SEL, 0, 1, 0, &swdtclk_lock); 296 + swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT | 297 + CLK_SET_RATE_NO_REPARENT, SLCR_SWDT_CLK_SEL, 0, 1, 0, 298 + &swdtclk_lock); 300 299 301 300 /* DDR clocks */ 302 301 clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0, ··· 359 356 gem0_mux_parents[i + 1] = of_clk_get_parent_name(np, 360 357 idx); 361 358 } 362 - clk = clk_register_mux(NULL, "gem0_mux", periph_parents, 4, 0, 363 - SLCR_GEM0_CLK_CTRL, 4, 2, 0, &gem0clk_lock); 359 + clk = clk_register_mux(NULL, "gem0_mux", periph_parents, 4, 360 + CLK_SET_RATE_NO_REPARENT, SLCR_GEM0_CLK_CTRL, 4, 2, 0, 361 + &gem0clk_lock); 364 362 clk = clk_register_divider(NULL, "gem0_div0", "gem0_mux", 0, 365 363 SLCR_GEM0_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | 366 364 CLK_DIVIDER_ALLOW_ZERO, &gem0clk_lock); ··· 370 366 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 371 367 &gem0clk_lock); 372 368 clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2, 373 - CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 6, 1, 0, 369 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 370 + SLCR_GEM0_CLK_CTRL, 6, 1, 0, 374 371 &gem0clk_lock); 375 372 clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0], 376 373 "gem0_emio_mux", CLK_SET_RATE_PARENT, ··· 384 379 gem1_mux_parents[i + 1] = of_clk_get_parent_name(np, 385 380 idx); 386 381 } 387 - clk = clk_register_mux(NULL, "gem1_mux", periph_parents, 4, 0, 388 - SLCR_GEM1_CLK_CTRL, 4, 2, 0, &gem1clk_lock); 382 + clk = clk_register_mux(NULL, "gem1_mux", periph_parents, 4, 383 + CLK_SET_RATE_NO_REPARENT, SLCR_GEM1_CLK_CTRL, 4, 2, 0, 384 + &gem1clk_lock); 389 385 clk = clk_register_divider(NULL, "gem1_div0", "gem1_mux", 0, 390 386 SLCR_GEM1_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | 391 387 CLK_DIVIDER_ALLOW_ZERO, &gem1clk_lock); ··· 395 389 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 396 390 &gem1clk_lock); 397 391 clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2, 398 - CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 6, 1, 0, 392 + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 393 + SLCR_GEM1_CLK_CTRL, 6, 1, 0, 399 394 &gem1clk_lock); 400 395 clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1], 401 396 "gem1_emio_mux", CLK_SET_RATE_PARENT, ··· 416 409 can_mio_mux_parents[i] = dummy_nm; 417 410 } 418 411 kfree(clk_name); 419 - clk = clk_register_mux(NULL, "can_mux", periph_parents, 4, 0, 420 - SLCR_CAN_CLK_CTRL, 4, 2, 0, &canclk_lock); 412 + clk = clk_register_mux(NULL, "can_mux", periph_parents, 4, 413 + CLK_SET_RATE_NO_REPARENT, SLCR_CAN_CLK_CTRL, 4, 2, 0, 414 + &canclk_lock); 421 415 clk = clk_register_divider(NULL, "can_div0", "can_mux", 0, 422 416 SLCR_CAN_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | 423 417 CLK_DIVIDER_ALLOW_ZERO, &canclk_lock); ··· 433 425 CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 1, 0, 434 426 &canclk_lock); 435 427 clk = clk_register_mux(NULL, "can0_mio_mux", 436 - can_mio_mux_parents, 54, CLK_SET_RATE_PARENT, 437 - SLCR_CAN_MIOCLK_CTRL, 0, 6, 0, &canmioclk_lock); 428 + can_mio_mux_parents, 54, CLK_SET_RATE_PARENT | 429 + CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 0, 6, 0, 430 + &canmioclk_lock); 438 431 clk = clk_register_mux(NULL, "can1_mio_mux", 439 - can_mio_mux_parents, 54, CLK_SET_RATE_PARENT, 440 - SLCR_CAN_MIOCLK_CTRL, 16, 6, 0, &canmioclk_lock); 432 + can_mio_mux_parents, 54, CLK_SET_RATE_PARENT | 433 + CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 16, 6, 434 + 0, &canmioclk_lock); 441 435 clks[can0] = clk_register_mux(NULL, clk_output_name[can0], 442 - can0_mio_mux2_parents, 2, CLK_SET_RATE_PARENT, 443 - SLCR_CAN_MIOCLK_CTRL, 6, 1, 0, &canmioclk_lock); 436 + can0_mio_mux2_parents, 2, CLK_SET_RATE_PARENT | 437 + CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 6, 1, 0, 438 + &canmioclk_lock); 444 439 clks[can1] = clk_register_mux(NULL, clk_output_name[can1], 445 - can1_mio_mux2_parents, 2, CLK_SET_RATE_PARENT, 446 - SLCR_CAN_MIOCLK_CTRL, 22, 1, 0, &canmioclk_lock); 440 + can1_mio_mux2_parents, 2, CLK_SET_RATE_PARENT | 441 + CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 22, 1, 442 + 0, &canmioclk_lock); 447 443 448 444 for (i = 0; i < ARRAY_SIZE(dbgtrc_emio_input_names); i++) { 449 445 int idx = of_property_match_string(np, "clock-names", ··· 456 444 dbg_emio_mux_parents[i + 1] = of_clk_get_parent_name(np, 457 445 idx); 458 446 } 459 - clk = clk_register_mux(NULL, "dbg_mux", periph_parents, 4, 0, 460 - SLCR_DBG_CLK_CTRL, 4, 2, 0, &dbgclk_lock); 447 + clk = clk_register_mux(NULL, "dbg_mux", periph_parents, 4, 448 + CLK_SET_RATE_NO_REPARENT, SLCR_DBG_CLK_CTRL, 4, 2, 0, 449 + &dbgclk_lock); 461 450 clk = clk_register_divider(NULL, "dbg_div", "dbg_mux", 0, 462 451 SLCR_DBG_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | 463 452 CLK_DIVIDER_ALLOW_ZERO, &dbgclk_lock); 464 - clk = clk_register_mux(NULL, "dbg_emio_mux", dbg_emio_mux_parents, 2, 0, 465 - SLCR_DBG_CLK_CTRL, 6, 1, 0, &dbgclk_lock); 453 + clk = clk_register_mux(NULL, "dbg_emio_mux", dbg_emio_mux_parents, 2, 454 + CLK_SET_RATE_NO_REPARENT, SLCR_DBG_CLK_CTRL, 6, 1, 0, 455 + &dbgclk_lock); 466 456 clks[dbg_trc] = clk_register_gate(NULL, clk_output_name[dbg_trc], 467 457 "dbg_emio_mux", CLK_SET_RATE_PARENT, SLCR_DBG_CLK_CTRL, 468 458 0, 0, &dbgclk_lock);
+14 -5
drivers/clk/zynq/pll.c
··· 50 50 #define PLLCTRL_RESET_MASK 1 51 51 #define PLLCTRL_RESET_SHIFT 0 52 52 53 + #define PLL_FBDIV_MIN 13 54 + #define PLL_FBDIV_MAX 66 55 + 53 56 /** 54 57 * zynq_pll_round_rate() - Round a clock frequency 55 58 * @hw: Handle between common and hardware-specific interfaces ··· 66 63 u32 fbdiv; 67 64 68 65 fbdiv = DIV_ROUND_CLOSEST(rate, *prate); 69 - if (fbdiv < 13) 70 - fbdiv = 13; 71 - else if (fbdiv > 66) 72 - fbdiv = 66; 66 + if (fbdiv < PLL_FBDIV_MIN) 67 + fbdiv = PLL_FBDIV_MIN; 68 + else if (fbdiv > PLL_FBDIV_MAX) 69 + fbdiv = PLL_FBDIV_MAX; 73 70 74 71 return *prate * fbdiv; 75 72 } ··· 185 182 186 183 /** 187 184 * clk_register_zynq_pll() - Register PLL with the clock framework 188 - * @np Pointer to the DT device node 185 + * @name PLL name 186 + * @parent Parent clock name 187 + * @pll_ctrl Pointer to PLL control register 188 + * @pll_status Pointer to PLL status register 189 + * @lock_index Bit index to this PLL's lock status bit in @pll_status 190 + * @lock Register lock 191 + * Returns handle to the registered clock. 189 192 */ 190 193 struct clk *clk_register_zynq_pll(const char *name, const char *parent, 191 194 void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index,
+8 -4
drivers/clocksource/samsung_pwm_timer.c
··· 368 368 369 369 static void __init samsung_timer_resources(void) 370 370 { 371 - pwm.timerclk = clk_get(NULL, "timers"); 372 - if (IS_ERR(pwm.timerclk)) 373 - panic("failed to get timers clock for timer"); 374 - 375 371 clk_prepare_enable(pwm.timerclk); 376 372 377 373 pwm.tcnt_max = (1UL << pwm.variant.bits) - 1; ··· 412 416 memcpy(&pwm.variant, variant, sizeof(pwm.variant)); 413 417 memcpy(pwm.irq, irqs, SAMSUNG_PWM_NUM * sizeof(*irqs)); 414 418 419 + pwm.timerclk = clk_get(NULL, "timers"); 420 + if (IS_ERR(pwm.timerclk)) 421 + panic("failed to get timers clock for timer"); 422 + 415 423 _samsung_pwm_clocksource_init(); 416 424 } 417 425 ··· 446 446 pr_err("%s: failed to map PWM registers\n", __func__); 447 447 return; 448 448 } 449 + 450 + pwm.timerclk = of_clk_get_by_name(np, "timers"); 451 + if (IS_ERR(pwm.timerclk)) 452 + panic("failed to get timers clock for timer"); 449 453 450 454 _samsung_pwm_clocksource_init(); 451 455 }
+178
include/dt-bindings/clock/samsung,s3c64xx-clock.h
··· 1 + /* 2 + * Copyright (c) 2013 Tomasz Figa <tomasz.figa at gmail.com> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * Device Tree binding constants for Samsung S3C64xx clock controller. 9 + */ 10 + 11 + #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H 12 + #define _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H 13 + 14 + /* 15 + * Let each exported clock get a unique index, which is used on DT-enabled 16 + * platforms to lookup the clock from a clock specifier. These indices are 17 + * therefore considered an ABI and so must not be changed. This implies 18 + * that new clocks should be added either in free spaces between clock groups 19 + * or at the end. 20 + */ 21 + 22 + /* Core clocks. */ 23 + #define CLK27M 1 24 + #define CLK48M 2 25 + #define FOUT_APLL 3 26 + #define FOUT_MPLL 4 27 + #define FOUT_EPLL 5 28 + #define ARMCLK 6 29 + #define HCLKX2 7 30 + #define HCLK 8 31 + #define PCLK 9 32 + 33 + /* HCLK bus clocks. */ 34 + #define HCLK_3DSE 16 35 + #define HCLK_UHOST 17 36 + #define HCLK_SECUR 18 37 + #define HCLK_SDMA1 19 38 + #define HCLK_SDMA0 20 39 + #define HCLK_IROM 21 40 + #define HCLK_DDR1 22 41 + #define HCLK_MEM1 23 42 + #define HCLK_MEM0 24 43 + #define HCLK_USB 25 44 + #define HCLK_HSMMC2 26 45 + #define HCLK_HSMMC1 27 46 + #define HCLK_HSMMC0 28 47 + #define HCLK_MDP 29 48 + #define HCLK_DHOST 30 49 + #define HCLK_IHOST 31 50 + #define HCLK_DMA1 32 51 + #define HCLK_DMA0 33 52 + #define HCLK_JPEG 34 53 + #define HCLK_CAMIF 35 54 + #define HCLK_SCALER 36 55 + #define HCLK_2D 37 56 + #define HCLK_TV 38 57 + #define HCLK_POST0 39 58 + #define HCLK_ROT 40 59 + #define HCLK_LCD 41 60 + #define HCLK_TZIC 42 61 + #define HCLK_INTC 43 62 + #define HCLK_MFC 44 63 + #define HCLK_DDR0 45 64 + 65 + /* PCLK bus clocks. */ 66 + #define PCLK_IIC1 48 67 + #define PCLK_IIS2 49 68 + #define PCLK_SKEY 50 69 + #define PCLK_CHIPID 51 70 + #define PCLK_SPI1 52 71 + #define PCLK_SPI0 53 72 + #define PCLK_HSIRX 54 73 + #define PCLK_HSITX 55 74 + #define PCLK_GPIO 56 75 + #define PCLK_IIC0 57 76 + #define PCLK_IIS1 58 77 + #define PCLK_IIS0 59 78 + #define PCLK_AC97 60 79 + #define PCLK_TZPC 61 80 + #define PCLK_TSADC 62 81 + #define PCLK_KEYPAD 63 82 + #define PCLK_IRDA 64 83 + #define PCLK_PCM1 65 84 + #define PCLK_PCM0 66 85 + #define PCLK_PWM 67 86 + #define PCLK_RTC 68 87 + #define PCLK_WDT 69 88 + #define PCLK_UART3 70 89 + #define PCLK_UART2 71 90 + #define PCLK_UART1 72 91 + #define PCLK_UART0 73 92 + #define PCLK_MFC 74 93 + 94 + /* Special clocks. */ 95 + #define SCLK_UHOST 80 96 + #define SCLK_MMC2_48 81 97 + #define SCLK_MMC1_48 82 98 + #define SCLK_MMC0_48 83 99 + #define SCLK_MMC2 84 100 + #define SCLK_MMC1 85 101 + #define SCLK_MMC0 86 102 + #define SCLK_SPI1_48 87 103 + #define SCLK_SPI0_48 88 104 + #define SCLK_SPI1 89 105 + #define SCLK_SPI0 90 106 + #define SCLK_DAC27 91 107 + #define SCLK_TV27 92 108 + #define SCLK_SCALER27 93 109 + #define SCLK_SCALER 94 110 + #define SCLK_LCD27 95 111 + #define SCLK_LCD 96 112 + #define SCLK_FIMC 97 113 + #define SCLK_POST0_27 98 114 + #define SCLK_AUDIO2 99 115 + #define SCLK_POST0 100 116 + #define SCLK_AUDIO1 101 117 + #define SCLK_AUDIO0 102 118 + #define SCLK_SECUR 103 119 + #define SCLK_IRDA 104 120 + #define SCLK_UART 105 121 + #define SCLK_MFC 106 122 + #define SCLK_CAM 107 123 + #define SCLK_JPEG 108 124 + #define SCLK_ONENAND 109 125 + 126 + /* MEM0 bus clocks - S3C6410-specific. */ 127 + #define MEM0_CFCON 112 128 + #define MEM0_ONENAND1 113 129 + #define MEM0_ONENAND0 114 130 + #define MEM0_NFCON 115 131 + #define MEM0_SROM 116 132 + 133 + /* Muxes. */ 134 + #define MOUT_APLL 128 135 + #define MOUT_MPLL 129 136 + #define MOUT_EPLL 130 137 + #define MOUT_MFC 131 138 + #define MOUT_AUDIO0 132 139 + #define MOUT_AUDIO1 133 140 + #define MOUT_UART 134 141 + #define MOUT_SPI0 135 142 + #define MOUT_SPI1 136 143 + #define MOUT_MMC0 137 144 + #define MOUT_MMC1 138 145 + #define MOUT_MMC2 139 146 + #define MOUT_UHOST 140 147 + #define MOUT_IRDA 141 148 + #define MOUT_LCD 142 149 + #define MOUT_SCALER 143 150 + #define MOUT_DAC27 144 151 + #define MOUT_TV27 145 152 + #define MOUT_AUDIO2 146 153 + 154 + /* Dividers. */ 155 + #define DOUT_MPLL 160 156 + #define DOUT_SECUR 161 157 + #define DOUT_CAM 162 158 + #define DOUT_JPEG 163 159 + #define DOUT_MFC 164 160 + #define DOUT_MMC0 165 161 + #define DOUT_MMC1 166 162 + #define DOUT_MMC2 167 163 + #define DOUT_LCD 168 164 + #define DOUT_SCALER 169 165 + #define DOUT_UHOST 170 166 + #define DOUT_SPI0 171 167 + #define DOUT_SPI1 172 168 + #define DOUT_AUDIO0 173 169 + #define DOUT_AUDIO1 174 170 + #define DOUT_UART 175 171 + #define DOUT_IRDA 176 172 + #define DOUT_FIMC 177 173 + #define DOUT_AUDIO2 178 174 + 175 + /* Total number of clocks. */ 176 + #define NR_CLKS (DOUT_AUDIO2 + 1) 177 + 178 + #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_S3C64XX_CLOCK_H */
+3
include/linux/clk-private.h
··· 33 33 const char **parent_names; 34 34 struct clk **parents; 35 35 u8 num_parents; 36 + u8 new_parent_index; 36 37 unsigned long rate; 37 38 unsigned long new_rate; 39 + struct clk *new_parent; 40 + struct clk *new_child; 38 41 unsigned long flags; 39 42 unsigned int enable_count; 40 43 unsigned int prepare_count;
+31
include/linux/clk-provider.h
··· 12 12 #define __LINUX_CLK_PROVIDER_H 13 13 14 14 #include <linux/clk.h> 15 + #include <linux/io.h> 15 16 16 17 #ifdef CONFIG_COMMON_CLK 17 18 ··· 28 27 #define CLK_IS_ROOT BIT(4) /* root clk, has no parent */ 29 28 #define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */ 30 29 #define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */ 30 + #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ 31 31 32 32 struct clk_hw; 33 33 ··· 81 79 * @round_rate: Given a target rate as input, returns the closest rate actually 82 80 * supported by the clock. 83 81 * 82 + * @determine_rate: Given a target rate as input, returns the closest rate 83 + * actually supported by the clock, and optionally the parent clock 84 + * that should be used to provide the clock rate. 85 + * 84 86 * @get_parent: Queries the hardware to determine the parent of a clock. The 85 87 * return value is a u8 which specifies the index corresponding to 86 88 * the parent clock. This index can be applied to either the ··· 132 126 unsigned long parent_rate); 133 127 long (*round_rate)(struct clk_hw *hw, unsigned long, 134 128 unsigned long *); 129 + long (*determine_rate)(struct clk_hw *hw, unsigned long rate, 130 + unsigned long *best_parent_rate, 131 + struct clk **best_parent_clk); 135 132 int (*set_parent)(struct clk_hw *hw, u8 index); 136 133 u8 (*get_parent)(struct clk_hw *hw); 137 134 int (*set_rate)(struct clk_hw *hw, unsigned long, ··· 336 327 #define CLK_MUX_INDEX_ONE BIT(0) 337 328 #define CLK_MUX_INDEX_BIT BIT(1) 338 329 #define CLK_MUX_HIWORD_MASK BIT(2) 330 + #define CLK_MUX_READ_ONLY BIT(3) /* mux setting cannot be changed */ 339 331 340 332 extern const struct clk_ops clk_mux_ops; 333 + extern const struct clk_ops clk_mux_ro_ops; 341 334 342 335 struct clk *clk_register_mux(struct device *dev, const char *name, 343 336 const char **parent_names, u8 num_parents, unsigned long flags, ··· 429 418 struct clk_hw *__clk_get_hw(struct clk *clk); 430 419 u8 __clk_get_num_parents(struct clk *clk); 431 420 struct clk *__clk_get_parent(struct clk *clk); 421 + struct clk *clk_get_parent_by_index(struct clk *clk, u8 index); 432 422 unsigned int __clk_get_enable_count(struct clk *clk); 433 423 unsigned int __clk_get_prepare_count(struct clk *clk); 434 424 unsigned long __clk_get_rate(struct clk *clk); ··· 437 425 bool __clk_is_prepared(struct clk *clk); 438 426 bool __clk_is_enabled(struct clk *clk); 439 427 struct clk *__clk_lookup(const char *name); 428 + long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, 429 + unsigned long *best_parent_rate, 430 + struct clk **best_parent_p); 440 431 441 432 /* 442 433 * FIXME clock api without lock protection ··· 505 490 #define of_clk_init(matches) \ 506 491 { while (0); } 507 492 #endif /* CONFIG_OF */ 493 + 494 + /* 495 + * wrap access to peripherals in accessor routines 496 + * for improved portability across platforms 497 + */ 498 + 499 + static inline u32 clk_readl(u32 __iomem *reg) 500 + { 501 + return readl(reg); 502 + } 503 + 504 + static inline void clk_writel(u32 val, u32 __iomem *reg) 505 + { 506 + writel(val, reg); 507 + } 508 + 508 509 #endif /* CONFIG_COMMON_CLK */ 509 510 #endif /* CLK_PROVIDER_H */