diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-09 18:49:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-09 18:49:04 -0400 |
commit | bef4a0ab984662d4ccd68d431a7c4ef3daebcb43 (patch) | |
tree | 3f1a2797dbf2fde9235c47e023be929e32fa9265 | |
parent | 7eb69529cbaf4229baf5559a400a7a46352c6e52 (diff) | |
parent | 12d298865ec5d0f14dd570c3506c270880769ed7 (diff) |
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
...
64 files changed, 3592 insertions, 1098 deletions
diff --git a/Documentation/clk.txt b/Documentation/clk.txt index 6f68ba0d1e01..3aeb5c440442 100644 --- a/Documentation/clk.txt +++ b/Documentation/clk.txt | |||
@@ -70,6 +70,10 @@ the operations defined in clk.h: | |||
70 | unsigned long parent_rate); | 70 | unsigned long parent_rate); |
71 | long (*round_rate)(struct clk_hw *hw, unsigned long, | 71 | long (*round_rate)(struct clk_hw *hw, unsigned long, |
72 | unsigned long *); | 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 | int (*set_parent)(struct clk_hw *hw, u8 index); | 77 | int (*set_parent)(struct clk_hw *hw, u8 index); |
74 | u8 (*get_parent)(struct clk_hw *hw); | 78 | u8 (*get_parent)(struct clk_hw *hw); |
75 | int (*set_rate)(struct clk_hw *hw, unsigned long); | 79 | int (*set_rate)(struct clk_hw *hw, unsigned long); |
@@ -179,26 +183,28 @@ mandatory, a cell marked as "n" implies that either including that | |||
179 | callback is invalid or otherwise unnecessary. Empty cells are either | 183 | callback is invalid or otherwise unnecessary. Empty cells are either |
180 | optional or must be evaluated on a case-by-case basis. | 184 | optional or must be evaluated on a case-by-case basis. |
181 | 185 | ||
182 | clock hardware characteristics | 186 | clock hardware characteristics |
183 | ----------------------------------------------------------- | 187 | ----------------------------------------------------------- |
184 | | gate | change rate | single parent | multiplexer | root | | 188 | | gate | change rate | single parent | multiplexer | root | |
185 | |------|-------------|---------------|-------------|------| | 189 | |------|-------------|---------------|-------------|------| |
186 | .prepare | | | | | | | 190 | .prepare | | | | | | |
187 | .unprepare | | | | | | | 191 | .unprepare | | | | | | |
188 | | | | | | | | 192 | | | | | | | |
189 | .enable | y | | | | | | 193 | .enable | y | | | | | |
190 | .disable | y | | | | | | 194 | .disable | y | | | | | |
191 | .is_enabled | y | | | | | | 195 | .is_enabled | y | | | | | |
192 | | | | | | | | 196 | | | | | | | |
193 | .recalc_rate | | y | | | | | 197 | .recalc_rate | | y | | | | |
194 | .round_rate | | y | | | | | 198 | .round_rate | | y [1] | | | | |
195 | .set_rate | | y | | | | | 199 | .determine_rate | | y [1] | | | | |
196 | | | | | | | | 200 | .set_rate | | y | | | | |
197 | .set_parent | | | n | y | n | | 201 | | | | | | | |
198 | .get_parent | | | n | y | n | | 202 | .set_parent | | | n | y | n | |
199 | | | | | | | | 203 | .get_parent | | | n | y | n | |
200 | .init | | | | | | | 204 | | | | | | | |
201 | ----------------------------------------------------------- | 205 | .init | | | | | | |
206 | ----------------------------------------------------------- | ||
207 | [1] either one of round_rate or determine_rate is required. | ||
202 | 208 | ||
203 | Finally, register your clock at run-time with a hardware-specific | 209 | Finally, register your clock at run-time with a hardware-specific |
204 | registration function. This function simply populates struct clk_foo's | 210 | registration function. This function simply populates struct clk_foo's |
diff --git a/Documentation/devicetree/bindings/clock/exynos4-clock.txt b/Documentation/devicetree/bindings/clock/exynos4-clock.txt index 14d5c2af26f4..c6bf8a6c8f52 100644 --- a/Documentation/devicetree/bindings/clock/exynos4-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos4-clock.txt | |||
@@ -236,6 +236,7 @@ Exynos4 SoC and this is specified where applicable. | |||
236 | spi0_isp_sclk 380 Exynos4x12 | 236 | spi0_isp_sclk 380 Exynos4x12 |
237 | spi1_isp_sclk 381 Exynos4x12 | 237 | spi1_isp_sclk 381 Exynos4x12 |
238 | uart_isp_sclk 382 Exynos4x12 | 238 | uart_isp_sclk 382 Exynos4x12 |
239 | tmu_apbif 383 | ||
239 | 240 | ||
240 | [Mux Clocks] | 241 | [Mux Clocks] |
241 | 242 | ||
diff --git a/Documentation/devicetree/bindings/clock/exynos5250-clock.txt b/Documentation/devicetree/bindings/clock/exynos5250-clock.txt index 781a6276adf7..24765c146e31 100644 --- a/Documentation/devicetree/bindings/clock/exynos5250-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos5250-clock.txt | |||
@@ -59,6 +59,9 @@ clock which they consume. | |||
59 | sclk_spi0 154 | 59 | sclk_spi0 154 |
60 | sclk_spi1 155 | 60 | sclk_spi1 155 |
61 | sclk_spi2 156 | 61 | sclk_spi2 156 |
62 | div_i2s1 157 | ||
63 | div_i2s2 158 | ||
64 | sclk_hdmiphy 159 | ||
62 | 65 | ||
63 | 66 | ||
64 | [Peripheral Clock Gates] | 67 | [Peripheral Clock Gates] |
@@ -154,7 +157,16 @@ clock which they consume. | |||
154 | dsim0 341 | 157 | dsim0 341 |
155 | dp 342 | 158 | dp 342 |
156 | mixer 343 | 159 | mixer 343 |
157 | hdmi 345 | 160 | hdmi 344 |
161 | g2d 345 | ||
162 | |||
163 | |||
164 | [Clock Muxes] | ||
165 | |||
166 | Clock ID | ||
167 | ---------------------------- | ||
168 | mout_hdmi 1024 | ||
169 | |||
158 | 170 | ||
159 | Example 1: An example of a clock controller node is listed below. | 171 | Example 1: An example of a clock controller node is listed below. |
160 | 172 | ||
diff --git a/Documentation/devicetree/bindings/clock/exynos5420-clock.txt b/Documentation/devicetree/bindings/clock/exynos5420-clock.txt index 9bcc4b1bff51..32aa34ecad36 100644 --- a/Documentation/devicetree/bindings/clock/exynos5420-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos5420-clock.txt | |||
@@ -59,6 +59,7 @@ clock which they consume. | |||
59 | sclk_pwm 155 | 59 | sclk_pwm 155 |
60 | sclk_gscl_wa 156 | 60 | sclk_gscl_wa 156 |
61 | sclk_gscl_wb 157 | 61 | sclk_gscl_wb 157 |
62 | sclk_hdmiphy 158 | ||
62 | 63 | ||
63 | [Peripheral Clock Gates] | 64 | [Peripheral Clock Gates] |
64 | 65 | ||
@@ -179,6 +180,17 @@ clock which they consume. | |||
179 | fimc_lite3 495 | 180 | fimc_lite3 495 |
180 | aclk_g3d 500 | 181 | aclk_g3d 500 |
181 | g3d 501 | 182 | g3d 501 |
183 | smmu_mixer 502 | ||
184 | |||
185 | Mux ID | ||
186 | ---------------------------- | ||
187 | |||
188 | mout_hdmi 640 | ||
189 | |||
190 | Divider ID | ||
191 | ---------------------------- | ||
192 | |||
193 | dout_pixel 768 | ||
182 | 194 | ||
183 | Example 1: An example of a clock controller node is listed below. | 195 | Example 1: An example of a clock controller node is listed below. |
184 | 196 | ||
diff --git a/Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt b/Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt new file mode 100644 index 000000000000..fa171dc4bd3c --- /dev/null +++ b/Documentation/devicetree/bindings/clock/samsung,s3c64xx-clock.txt | |||
@@ -0,0 +1,77 @@ | |||
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 | }; | ||
diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt index d495521a79d2..00a5c26454eb 100644 --- a/Documentation/devicetree/bindings/clock/sunxi.txt +++ b/Documentation/devicetree/bindings/clock/sunxi.txt | |||
@@ -8,19 +8,31 @@ Required properties: | |||
8 | - compatible : shall be one of the following: | 8 | - compatible : shall be one of the following: |
9 | "allwinner,sun4i-osc-clk" - for a gatable oscillator | 9 | "allwinner,sun4i-osc-clk" - for a gatable oscillator |
10 | "allwinner,sun4i-pll1-clk" - for the main PLL clock | 10 | "allwinner,sun4i-pll1-clk" - for the main PLL clock |
11 | "allwinner,sun6i-a31-pll1-clk" - for the main PLL clock on A31 | ||
11 | "allwinner,sun4i-cpu-clk" - for the CPU multiplexer clock | 12 | "allwinner,sun4i-cpu-clk" - for the CPU multiplexer clock |
12 | "allwinner,sun4i-axi-clk" - for the AXI clock | 13 | "allwinner,sun4i-axi-clk" - for the AXI clock |
13 | "allwinner,sun4i-axi-gates-clk" - for the AXI gates | 14 | "allwinner,sun4i-axi-gates-clk" - for the AXI gates |
14 | "allwinner,sun4i-ahb-clk" - for the AHB clock | 15 | "allwinner,sun4i-ahb-clk" - for the AHB clock |
15 | "allwinner,sun4i-ahb-gates-clk" - for the AHB gates on A10 | 16 | "allwinner,sun4i-ahb-gates-clk" - for the AHB gates on A10 |
16 | "allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13 | 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 | "allwinner,sun4i-apb0-clk" - for the APB0 clock | 22 | "allwinner,sun4i-apb0-clk" - for the APB0 clock |
18 | "allwinner,sun4i-apb0-gates-clk" - for the APB0 gates on A10 | 23 | "allwinner,sun4i-apb0-gates-clk" - for the APB0 gates on A10 |
19 | "allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13 | 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 | "allwinner,sun4i-apb1-clk" - for the APB1 clock | 27 | "allwinner,sun4i-apb1-clk" - for the APB1 clock |
21 | "allwinner,sun4i-apb1-mux-clk" - for the APB1 clock muxing | 28 | "allwinner,sun4i-apb1-mux-clk" - for the APB1 clock muxing |
22 | "allwinner,sun4i-apb1-gates-clk" - for the APB1 gates on A10 | 29 | "allwinner,sun4i-apb1-gates-clk" - for the APB1 gates on A10 |
23 | "allwinner,sun5i-a13-apb1-gates-clk" - for the APB1 gates on A13 | 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 | Required properties for all clocks: | 37 | Required properties for all clocks: |
26 | - reg : shall be the control register address for the clock. | 38 | - reg : shall be the control register address for the clock. |
diff --git a/Documentation/devicetree/bindings/clock/sunxi/sun5i-a10s-gates.txt b/Documentation/devicetree/bindings/clock/sunxi/sun5i-a10s-gates.txt new file mode 100644 index 000000000000..d24279fe1429 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/sunxi/sun5i-a10s-gates.txt | |||
@@ -0,0 +1,75 @@ | |||
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 | ||
diff --git a/Documentation/devicetree/bindings/clock/sunxi/sun6i-a31-gates.txt b/Documentation/devicetree/bindings/clock/sunxi/sun6i-a31-gates.txt new file mode 100644 index 000000000000..fe44932b5c6b --- /dev/null +++ b/Documentation/devicetree/bindings/clock/sunxi/sun6i-a31-gates.txt | |||
@@ -0,0 +1,83 @@ | |||
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 | ||
diff --git a/Documentation/devicetree/bindings/clock/sunxi/sun7i-a20-gates.txt b/Documentation/devicetree/bindings/clock/sunxi/sun7i-a20-gates.txt new file mode 100644 index 000000000000..357f4fdc02ef --- /dev/null +++ b/Documentation/devicetree/bindings/clock/sunxi/sun7i-a20-gates.txt | |||
@@ -0,0 +1,98 @@ | |||
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 | ||
diff --git a/Documentation/devicetree/bindings/gpu/samsung-g2d.txt b/Documentation/devicetree/bindings/gpu/samsung-g2d.txt index 3f454ffc654a..c4f358dafdaa 100644 --- a/Documentation/devicetree/bindings/gpu/samsung-g2d.txt +++ b/Documentation/devicetree/bindings/gpu/samsung-g2d.txt | |||
@@ -11,8 +11,11 @@ Required properties: | |||
11 | 11 | ||
12 | - interrupts : G2D interrupt number to the CPU. | 12 | - interrupts : G2D interrupt number to the CPU. |
13 | - clocks : from common clock binding: handle to G2D clocks. | 13 | - clocks : from common clock binding: handle to G2D clocks. |
14 | - clock-names : from common clock binding: must contain "sclk_fimg2d" and | 14 | - clock-names : names of clocks listed in clocks property, in the same |
15 | "fimg2d", corresponding to entries in the clocks property. | 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 | Example: | 20 | Example: |
18 | g2d@12800000 { | 21 | g2d@12800000 { |
diff --git a/Documentation/devicetree/bindings/pwm/pwm-samsung.txt b/Documentation/devicetree/bindings/pwm/pwm-samsung.txt index 4caa1a78863e..d61fccd40bad 100644 --- a/Documentation/devicetree/bindings/pwm/pwm-samsung.txt +++ b/Documentation/devicetree/bindings/pwm/pwm-samsung.txt | |||
@@ -19,6 +19,16 @@ Required properties: | |||
19 | - reg: base address and size of register area | 19 | - reg: base address and size of register area |
20 | - interrupts: list of timer interrupts (one interrupt per timer, starting at | 20 | - interrupts: list of timer interrupts (one interrupt per timer, starting at |
21 | timer 0) | 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 | - #pwm-cells: should be 3. See pwm.txt in this directory for a description of | 32 | - #pwm-cells: should be 3. See pwm.txt in this directory for a description of |
23 | the cells format. The only third cell flag supported by this binding is | 33 | the cells format. The only third cell flag supported by this binding is |
24 | PWM_POLARITY_INVERTED. | 34 | PWM_POLARITY_INVERTED. |
@@ -34,6 +44,8 @@ Example: | |||
34 | reg = <0x7f006000 0x1000>; | 44 | reg = <0x7f006000 0x1000>; |
35 | interrupt-parent = <&vic0>; | 45 | interrupt-parent = <&vic0>; |
36 | interrupts = <23>, <24>, <25>, <27>, <28>; | 46 | interrupts = <23>, <24>, <25>, <27>, <28>; |
47 | clocks = <&clock 67>; | ||
48 | clock-names = "timers"; | ||
37 | samsung,pwm-outputs = <0>, <1>; | 49 | samsung,pwm-outputs = <0>, <1>; |
38 | #pwm-cells = <3>; | 50 | #pwm-cells = <3>; |
39 | } | 51 | } |
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index 93c250139159..caadc0257342 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi | |||
@@ -448,6 +448,8 @@ | |||
448 | compatible = "samsung,exynos4210-pwm"; | 448 | compatible = "samsung,exynos4210-pwm"; |
449 | reg = <0x139D0000 0x1000>; | 449 | reg = <0x139D0000 0x1000>; |
450 | interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>; | 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 | #pwm-cells = <2>; | 453 | #pwm-cells = <2>; |
452 | status = "disabled"; | 454 | status = "disabled"; |
453 | }; | 455 | }; |
diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h index 3451f1f8ba1f..048c5ad8a80b 100644 --- a/arch/arm/mach-imx/clk.h +++ b/arch/arm/mach-imx/clk.h | |||
@@ -89,7 +89,8 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent, | |||
89 | static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg, | 89 | static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg, |
90 | u8 shift, u8 width, const char **parents, int num_parents) | 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 | width, 0, &imx_ccm_lock); | 94 | width, 0, &imx_ccm_lock); |
94 | } | 95 | } |
95 | 96 | ||
@@ -98,7 +99,7 @@ static inline struct clk *imx_clk_mux_flags(const char *name, | |||
98 | int num_parents, unsigned long flags) | 99 | int num_parents, unsigned long flags) |
99 | { | 100 | { |
100 | return clk_register_mux(NULL, name, parents, num_parents, | 101 | return clk_register_mux(NULL, name, parents, num_parents, |
101 | flags, reg, shift, width, 0, | 102 | flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0, |
102 | &imx_ccm_lock); | 103 | &imx_ccm_lock); |
103 | } | 104 | } |
104 | 105 | ||
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 51380d655d1a..279407a36391 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig | |||
@@ -27,7 +27,7 @@ config COMMON_CLK_DEBUG | |||
27 | bool "DebugFS representation of clock tree" | 27 | bool "DebugFS representation of clock tree" |
28 | select DEBUG_FS | 28 | select DEBUG_FS |
29 | ---help--- | 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 | tree structure. Each directory contains read-only members | 31 | tree structure. Each directory contains read-only members |
32 | that export information specific to that clk node: clk_rate, | 32 | that export information specific to that clk node: clk_rate, |
33 | clk_flags, clk_prepare_count, clk_enable_count & | 33 | clk_flags, clk_prepare_count, clk_enable_count & |
@@ -64,6 +64,12 @@ config COMMON_CLK_SI5351 | |||
64 | This driver supports Silicon Labs 5351A/B/C programmable clock | 64 | This driver supports Silicon Labs 5351A/B/C programmable clock |
65 | generators. | 65 | generators. |
66 | 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. | ||
72 | |||
67 | config CLK_TWL6040 | 73 | config CLK_TWL6040 |
68 | tristate "External McPDM functional clock from twl6040" | 74 | tristate "External McPDM functional clock from twl6040" |
69 | depends on TWL6040_CORE | 75 | depends on TWL6040_CORE |
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 4038c2bdf334..7b111062ccba 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile | |||
@@ -40,5 +40,6 @@ obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o | |||
40 | obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o | 40 | obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o |
41 | obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o | 41 | obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o |
42 | obj-$(CONFIG_COMMON_CLK_SI5351) += clk-si5351.o | 42 | obj-$(CONFIG_COMMON_CLK_SI5351) += clk-si5351.o |
43 | obj-$(CONFIG_COMMON_CLK_S2MPS11) += clk-s2mps11.o | ||
43 | obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o | 44 | obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o |
44 | obj-$(CONFIG_CLK_PPC_CORENET) += clk-ppc-corenet.o | 45 | obj-$(CONFIG_CLK_PPC_CORENET) += clk-ppc-corenet.o |
diff --git a/drivers/clk/clk-bcm2835.c b/drivers/clk/clk-bcm2835.c index 792bc57a9db7..5fb4ff53d088 100644 --- a/drivers/clk/clk-bcm2835.c +++ b/drivers/clk/clk-bcm2835.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/clk-provider.h> | 23 | #include <linux/clk-provider.h> |
24 | #include <linux/of.h> | 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 | { .compatible = "fixed-clock", .data = of_fixed_clk_setup, }, | 27 | { .compatible = "fixed-clock", .data = of_fixed_clk_setup, }, |
28 | { } | 28 | { } |
29 | }; | 29 | }; |
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 6d55eb2cb959..8d3009e44fba 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c | |||
@@ -104,7 +104,7 @@ static unsigned long clk_divider_recalc_rate(struct clk_hw *hw, | |||
104 | struct clk_divider *divider = to_clk_divider(hw); | 104 | struct clk_divider *divider = to_clk_divider(hw); |
105 | unsigned int div, val; | 105 | unsigned int div, val; |
106 | 106 | ||
107 | val = readl(divider->reg) >> divider->shift; | 107 | val = clk_readl(divider->reg) >> divider->shift; |
108 | val &= div_mask(divider); | 108 | val &= div_mask(divider); |
109 | 109 | ||
110 | div = _get_div(divider, val); | 110 | div = _get_div(divider, val); |
@@ -230,11 +230,11 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate, | |||
230 | if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { | 230 | if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { |
231 | val = div_mask(divider) << (divider->shift + 16); | 231 | val = div_mask(divider) << (divider->shift + 16); |
232 | } else { | 232 | } else { |
233 | val = readl(divider->reg); | 233 | val = clk_readl(divider->reg); |
234 | val &= ~(div_mask(divider) << divider->shift); | 234 | val &= ~(div_mask(divider) << divider->shift); |
235 | } | 235 | } |
236 | val |= value << divider->shift; | 236 | val |= value << divider->shift; |
237 | writel(val, divider->reg); | 237 | clk_writel(val, divider->reg); |
238 | 238 | ||
239 | if (divider->lock) | 239 | if (divider->lock) |
240 | spin_unlock_irqrestore(divider->lock, flags); | 240 | spin_unlock_irqrestore(divider->lock, flags); |
@@ -317,6 +317,7 @@ struct clk *clk_register_divider(struct device *dev, const char *name, | |||
317 | return _register_divider(dev, name, parent_name, flags, reg, shift, | 317 | return _register_divider(dev, name, parent_name, flags, reg, shift, |
318 | width, clk_divider_flags, NULL, lock); | 318 | width, clk_divider_flags, NULL, lock); |
319 | } | 319 | } |
320 | EXPORT_SYMBOL_GPL(clk_register_divider); | ||
320 | 321 | ||
321 | /** | 322 | /** |
322 | * clk_register_divider_table - register a table based divider clock with | 323 | * clk_register_divider_table - register a table based divider clock with |
@@ -341,3 +342,4 @@ struct clk *clk_register_divider_table(struct device *dev, const char *name, | |||
341 | return _register_divider(dev, name, parent_name, flags, reg, shift, | 342 | return _register_divider(dev, name, parent_name, flags, reg, shift, |
342 | width, clk_divider_flags, table, lock); | 343 | width, clk_divider_flags, table, lock); |
343 | } | 344 | } |
345 | EXPORT_SYMBOL_GPL(clk_register_divider_table); | ||
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c index 9ff7d510faa3..0e1d89b4321b 100644 --- a/drivers/clk/clk-fixed-factor.c +++ b/drivers/clk/clk-fixed-factor.c | |||
@@ -97,6 +97,8 @@ struct clk *clk_register_fixed_factor(struct device *dev, const char *name, | |||
97 | 97 | ||
98 | return clk; | 98 | return clk; |
99 | } | 99 | } |
100 | EXPORT_SYMBOL_GPL(clk_register_fixed_factor); | ||
101 | |||
100 | #ifdef CONFIG_OF | 102 | #ifdef CONFIG_OF |
101 | /** | 103 | /** |
102 | * of_fixed_factor_clk_setup() - Setup function for simple fixed factor clock | 104 | * of_fixed_factor_clk_setup() - Setup function for simple fixed factor clock |
diff --git a/drivers/clk/clk-fixed-rate.c b/drivers/clk/clk-fixed-rate.c index dc58fbd8516f..1ed591ab8b1d 100644 --- a/drivers/clk/clk-fixed-rate.c +++ b/drivers/clk/clk-fixed-rate.c | |||
@@ -80,6 +80,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name, | |||
80 | 80 | ||
81 | return clk; | 81 | return clk; |
82 | } | 82 | } |
83 | EXPORT_SYMBOL_GPL(clk_register_fixed_rate); | ||
83 | 84 | ||
84 | #ifdef CONFIG_OF | 85 | #ifdef CONFIG_OF |
85 | /** | 86 | /** |
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c index 790306e921c8..4a58c55255bd 100644 --- a/drivers/clk/clk-gate.c +++ b/drivers/clk/clk-gate.c | |||
@@ -58,7 +58,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable) | |||
58 | if (set) | 58 | if (set) |
59 | reg |= BIT(gate->bit_idx); | 59 | reg |= BIT(gate->bit_idx); |
60 | } else { | 60 | } else { |
61 | reg = readl(gate->reg); | 61 | reg = clk_readl(gate->reg); |
62 | 62 | ||
63 | if (set) | 63 | if (set) |
64 | reg |= BIT(gate->bit_idx); | 64 | reg |= BIT(gate->bit_idx); |
@@ -66,7 +66,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable) | |||
66 | reg &= ~BIT(gate->bit_idx); | 66 | reg &= ~BIT(gate->bit_idx); |
67 | } | 67 | } |
68 | 68 | ||
69 | writel(reg, gate->reg); | 69 | clk_writel(reg, gate->reg); |
70 | 70 | ||
71 | if (gate->lock) | 71 | if (gate->lock) |
72 | spin_unlock_irqrestore(gate->lock, flags); | 72 | spin_unlock_irqrestore(gate->lock, flags); |
@@ -89,7 +89,7 @@ static int clk_gate_is_enabled(struct clk_hw *hw) | |||
89 | u32 reg; | 89 | u32 reg; |
90 | struct clk_gate *gate = to_clk_gate(hw); | 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 | /* if a set bit disables this clk, flip it before masking */ | 94 | /* if a set bit disables this clk, flip it before masking */ |
95 | if (gate->flags & CLK_GATE_SET_TO_DISABLE) | 95 | if (gate->flags & CLK_GATE_SET_TO_DISABLE) |
@@ -161,3 +161,4 @@ struct clk *clk_register_gate(struct device *dev, const char *name, | |||
161 | 161 | ||
162 | return clk; | 162 | return clk; |
163 | } | 163 | } |
164 | EXPORT_SYMBOL_GPL(clk_register_gate); | ||
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 614444ca40cd..4f96ff3ba728 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c | |||
@@ -42,7 +42,7 @@ static u8 clk_mux_get_parent(struct clk_hw *hw) | |||
42 | * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so | 42 | * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so |
43 | * val = 0x4 really means "bit 2, index starts at bit 0" | 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 | val &= mux->mask; | 46 | val &= mux->mask; |
47 | 47 | ||
48 | if (mux->table) { | 48 | if (mux->table) { |
@@ -89,11 +89,11 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index) | |||
89 | if (mux->flags & CLK_MUX_HIWORD_MASK) { | 89 | if (mux->flags & CLK_MUX_HIWORD_MASK) { |
90 | val = mux->mask << (mux->shift + 16); | 90 | val = mux->mask << (mux->shift + 16); |
91 | } else { | 91 | } else { |
92 | val = readl(mux->reg); | 92 | val = clk_readl(mux->reg); |
93 | val &= ~(mux->mask << mux->shift); | 93 | val &= ~(mux->mask << mux->shift); |
94 | } | 94 | } |
95 | val |= index << mux->shift; | 95 | val |= index << mux->shift; |
96 | writel(val, mux->reg); | 96 | clk_writel(val, mux->reg); |
97 | 97 | ||
98 | if (mux->lock) | 98 | if (mux->lock) |
99 | spin_unlock_irqrestore(mux->lock, flags); | 99 | spin_unlock_irqrestore(mux->lock, flags); |
@@ -104,9 +104,15 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index) | |||
104 | const struct clk_ops clk_mux_ops = { | 104 | const struct clk_ops clk_mux_ops = { |
105 | .get_parent = clk_mux_get_parent, | 105 | .get_parent = clk_mux_get_parent, |
106 | .set_parent = clk_mux_set_parent, | 106 | .set_parent = clk_mux_set_parent, |
107 | .determine_rate = __clk_mux_determine_rate, | ||
107 | }; | 108 | }; |
108 | EXPORT_SYMBOL_GPL(clk_mux_ops); | 109 | EXPORT_SYMBOL_GPL(clk_mux_ops); |
109 | 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); | ||
115 | |||
110 | struct clk *clk_register_mux_table(struct device *dev, const char *name, | 116 | struct clk *clk_register_mux_table(struct device *dev, const char *name, |
111 | const char **parent_names, u8 num_parents, unsigned long flags, | 117 | const char **parent_names, u8 num_parents, unsigned long flags, |
112 | void __iomem *reg, u8 shift, u32 mask, | 118 | void __iomem *reg, u8 shift, u32 mask, |
@@ -133,7 +139,10 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, | |||
133 | } | 139 | } |
134 | 140 | ||
135 | init.name = name; | 141 | init.name = name; |
136 | init.ops = &clk_mux_ops; | 142 | if (clk_mux_flags & CLK_MUX_READ_ONLY) |
143 | init.ops = &clk_mux_ro_ops; | ||
144 | else | ||
145 | init.ops = &clk_mux_ops; | ||
137 | init.flags = flags | CLK_IS_BASIC; | 146 | init.flags = flags | CLK_IS_BASIC; |
138 | init.parent_names = parent_names; | 147 | init.parent_names = parent_names; |
139 | init.num_parents = num_parents; | 148 | init.num_parents = num_parents; |
@@ -154,6 +163,7 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, | |||
154 | 163 | ||
155 | return clk; | 164 | return clk; |
156 | } | 165 | } |
166 | EXPORT_SYMBOL_GPL(clk_register_mux_table); | ||
157 | 167 | ||
158 | struct clk *clk_register_mux(struct device *dev, const char *name, | 168 | struct clk *clk_register_mux(struct device *dev, const char *name, |
159 | const char **parent_names, u8 num_parents, unsigned long flags, | 169 | const char **parent_names, u8 num_parents, unsigned long flags, |
@@ -166,3 +176,4 @@ struct clk *clk_register_mux(struct device *dev, const char *name, | |||
166 | flags, reg, shift, mask, clk_mux_flags, | 176 | flags, reg, shift, mask, clk_mux_flags, |
167 | NULL, lock); | 177 | NULL, lock); |
168 | } | 178 | } |
179 | EXPORT_SYMBOL_GPL(clk_register_mux); | ||
diff --git a/drivers/clk/clk-nomadik.c b/drivers/clk/clk-nomadik.c index 6d819a37f647..51410c2ac2cb 100644 --- a/drivers/clk/clk-nomadik.c +++ b/drivers/clk/clk-nomadik.c | |||
@@ -479,12 +479,12 @@ static void __init of_nomadik_src_clk_setup(struct device_node *np) | |||
479 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | 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 | { .compatible = "stericsson,nomadik-src" }, | 483 | { .compatible = "stericsson,nomadik-src" }, |
484 | { /* sentinel */ } | 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 | .compatible = "fixed-clock", | 489 | .compatible = "fixed-clock", |
490 | .data = of_fixed_clk_setup, | 490 | .data = of_fixed_clk_setup, |
diff --git a/drivers/clk/clk-prima2.c b/drivers/clk/clk-prima2.c index 643ca653fef0..5ab95f1ad579 100644 --- a/drivers/clk/clk-prima2.c +++ b/drivers/clk/clk-prima2.c | |||
@@ -1034,7 +1034,7 @@ enum prima2_clk_index { | |||
1034 | usb0, usb1, maxclk, | 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 | NULL, /* dummy */ | 1038 | NULL, /* dummy */ |
1039 | NULL, | 1039 | NULL, |
1040 | &clk_pll1.hw, | 1040 | &clk_pll1.hw, |
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c new file mode 100644 index 000000000000..7be41e676a64 --- /dev/null +++ b/drivers/clk/clk-s2mps11.c | |||
@@ -0,0 +1,273 @@ | |||
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"); | ||
diff --git a/drivers/clk/clk-u300.c b/drivers/clk/clk-u300.c index 8774e058cb6c..3efbdd078d14 100644 --- a/drivers/clk/clk-u300.c +++ b/drivers/clk/clk-u300.c | |||
@@ -746,7 +746,7 @@ struct u300_clock { | |||
746 | u16 clk_val; | 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 | .type = U300_CLK_TYPE_REST, | 751 | .type = U300_CLK_TYPE_REST, |
752 | .id = 3, | 752 | .id = 3, |
@@ -1151,7 +1151,7 @@ static void __init of_u300_syscon_mclk_init(struct device_node *np) | |||
1151 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | 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 | .compatible = "fixed-clock", | 1156 | .compatible = "fixed-clock", |
1157 | .data = of_fixed_clk_setup, | 1157 | .data = of_fixed_clk_setup, |
diff --git a/drivers/clk/clk-wm831x.c b/drivers/clk/clk-wm831x.c index 1b3f8c9b98cc..805b4c344006 100644 --- a/drivers/clk/clk-wm831x.c +++ b/drivers/clk/clk-wm831x.c | |||
@@ -31,7 +31,7 @@ struct wm831x_clk { | |||
31 | bool xtal_ena; | 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 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, | 36 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, |
37 | xtal_hw); | 37 | xtal_hw); |
@@ -52,7 +52,7 @@ static unsigned long wm831x_xtal_recalc_rate(struct clk_hw *hw, | |||
52 | } | 52 | } |
53 | 53 | ||
54 | static const struct clk_ops wm831x_xtal_ops = { | 54 | static const struct clk_ops wm831x_xtal_ops = { |
55 | .is_enabled = wm831x_xtal_is_enabled, | 55 | .is_prepared = wm831x_xtal_is_prepared, |
56 | .recalc_rate = wm831x_xtal_recalc_rate, | 56 | .recalc_rate = wm831x_xtal_recalc_rate, |
57 | }; | 57 | }; |
58 | 58 | ||
@@ -73,7 +73,7 @@ static const unsigned long wm831x_fll_auto_rates[] = { | |||
73 | 24576000, | 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 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, | 78 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, |
79 | fll_hw); | 79 | fll_hw); |
@@ -170,7 +170,7 @@ static int wm831x_fll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
170 | if (i == ARRAY_SIZE(wm831x_fll_auto_rates)) | 170 | if (i == ARRAY_SIZE(wm831x_fll_auto_rates)) |
171 | return -EINVAL; | 171 | return -EINVAL; |
172 | 172 | ||
173 | if (wm831x_fll_is_enabled(hw)) | 173 | if (wm831x_fll_is_prepared(hw)) |
174 | return -EPERM; | 174 | return -EPERM; |
175 | 175 | ||
176 | return wm831x_set_bits(wm831x, WM831X_CLOCK_CONTROL_2, | 176 | return wm831x_set_bits(wm831x, WM831X_CLOCK_CONTROL_2, |
@@ -220,7 +220,7 @@ static u8 wm831x_fll_get_parent(struct clk_hw *hw) | |||
220 | } | 220 | } |
221 | 221 | ||
222 | static const struct clk_ops wm831x_fll_ops = { | 222 | static const struct clk_ops wm831x_fll_ops = { |
223 | .is_enabled = wm831x_fll_is_enabled, | 223 | .is_prepared = wm831x_fll_is_prepared, |
224 | .prepare = wm831x_fll_prepare, | 224 | .prepare = wm831x_fll_prepare, |
225 | .unprepare = wm831x_fll_unprepare, | 225 | .unprepare = wm831x_fll_unprepare, |
226 | .round_rate = wm831x_fll_round_rate, | 226 | .round_rate = wm831x_fll_round_rate, |
@@ -237,7 +237,7 @@ static struct clk_init_data wm831x_fll_init = { | |||
237 | .flags = CLK_SET_RATE_GATE, | 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 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, | 242 | struct wm831x_clk *clkdata = container_of(hw, struct wm831x_clk, |
243 | clkout_hw); | 243 | clkout_hw); |
@@ -335,7 +335,7 @@ static int wm831x_clkout_set_parent(struct clk_hw *hw, u8 parent) | |||
335 | } | 335 | } |
336 | 336 | ||
337 | static const struct clk_ops wm831x_clkout_ops = { | 337 | static const struct clk_ops wm831x_clkout_ops = { |
338 | .is_enabled = wm831x_clkout_is_enabled, | 338 | .is_prepared = wm831x_clkout_is_prepared, |
339 | .prepare = wm831x_clkout_prepare, | 339 | .prepare = wm831x_clkout_prepare, |
340 | .unprepare = wm831x_clkout_unprepare, | 340 | .unprepare = wm831x_clkout_unprepare, |
341 | .get_parent = wm831x_clkout_get_parent, | 341 | .get_parent = wm831x_clkout_get_parent, |
@@ -360,6 +360,8 @@ static int wm831x_clk_probe(struct platform_device *pdev) | |||
360 | if (!clkdata) | 360 | if (!clkdata) |
361 | return -ENOMEM; | 361 | return -ENOMEM; |
362 | 362 | ||
363 | clkdata->wm831x = wm831x; | ||
364 | |||
363 | /* XTAL_ENA can only be set via OTP/InstantConfig so just read once */ | 365 | /* XTAL_ENA can only be set via OTP/InstantConfig so just read once */ |
364 | ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2); | 366 | ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2); |
365 | if (ret < 0) { | 367 | if (ret < 0) { |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 54a191c5bbf0..a004769528e6 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
@@ -458,7 +458,6 @@ static void clk_unprepare_unused_subtree(struct clk *clk) | |||
458 | clk->ops->unprepare(clk->hw); | 458 | clk->ops->unprepare(clk->hw); |
459 | } | 459 | } |
460 | } | 460 | } |
461 | EXPORT_SYMBOL_GPL(__clk_get_flags); | ||
462 | 461 | ||
463 | /* caller must hold prepare_lock */ | 462 | /* caller must hold prepare_lock */ |
464 | static void clk_disable_unused_subtree(struct clk *clk) | 463 | static void clk_disable_unused_subtree(struct clk *clk) |
@@ -559,6 +558,19 @@ struct clk *__clk_get_parent(struct clk *clk) | |||
559 | return !clk ? NULL : clk->parent; | 558 | return !clk ? NULL : clk->parent; |
560 | } | 559 | } |
561 | 560 | ||
561 | struct clk *clk_get_parent_by_index(struct clk *clk, u8 index) | ||
562 | { | ||
563 | if (!clk || index >= clk->num_parents) | ||
564 | return NULL; | ||
565 | else if (!clk->parents) | ||
566 | return __clk_lookup(clk->parent_names[index]); | ||
567 | else if (!clk->parents[index]) | ||
568 | return clk->parents[index] = | ||
569 | __clk_lookup(clk->parent_names[index]); | ||
570 | else | ||
571 | return clk->parents[index]; | ||
572 | } | ||
573 | |||
562 | unsigned int __clk_get_enable_count(struct clk *clk) | 574 | unsigned int __clk_get_enable_count(struct clk *clk) |
563 | { | 575 | { |
564 | return !clk ? 0 : clk->enable_count; | 576 | return !clk ? 0 : clk->enable_count; |
@@ -594,6 +606,7 @@ unsigned long __clk_get_flags(struct clk *clk) | |||
594 | { | 606 | { |
595 | return !clk ? 0 : clk->flags; | 607 | return !clk ? 0 : clk->flags; |
596 | } | 608 | } |
609 | EXPORT_SYMBOL_GPL(__clk_get_flags); | ||
597 | 610 | ||
598 | bool __clk_is_prepared(struct clk *clk) | 611 | bool __clk_is_prepared(struct clk *clk) |
599 | { | 612 | { |
@@ -679,6 +692,55 @@ struct clk *__clk_lookup(const char *name) | |||
679 | return NULL; | 692 | return NULL; |
680 | } | 693 | } |
681 | 694 | ||
695 | /* | ||
696 | * Helper for finding best parent to provide a given frequency. This can be used | ||
697 | * directly as a determine_rate callback (e.g. for a mux), or from a more | ||
698 | * complex clock that may combine a mux with other operations. | ||
699 | */ | ||
700 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, | ||
701 | unsigned long *best_parent_rate, | ||
702 | struct clk **best_parent_p) | ||
703 | { | ||
704 | struct clk *clk = hw->clk, *parent, *best_parent = NULL; | ||
705 | int i, num_parents; | ||
706 | unsigned long parent_rate, best = 0; | ||
707 | |||
708 | /* if NO_REPARENT flag set, pass through to current parent */ | ||
709 | if (clk->flags & CLK_SET_RATE_NO_REPARENT) { | ||
710 | parent = clk->parent; | ||
711 | if (clk->flags & CLK_SET_RATE_PARENT) | ||
712 | best = __clk_round_rate(parent, rate); | ||
713 | else if (parent) | ||
714 | best = __clk_get_rate(parent); | ||
715 | else | ||
716 | best = __clk_get_rate(clk); | ||
717 | goto out; | ||
718 | } | ||
719 | |||
720 | /* find the parent that can provide the fastest rate <= rate */ | ||
721 | num_parents = clk->num_parents; | ||
722 | for (i = 0; i < num_parents; i++) { | ||
723 | parent = clk_get_parent_by_index(clk, i); | ||
724 | if (!parent) | ||
725 | continue; | ||
726 | if (clk->flags & CLK_SET_RATE_PARENT) | ||
727 | parent_rate = __clk_round_rate(parent, rate); | ||
728 | else | ||
729 | parent_rate = __clk_get_rate(parent); | ||
730 | if (parent_rate <= rate && parent_rate > best) { | ||
731 | best_parent = parent; | ||
732 | best = parent_rate; | ||
733 | } | ||
734 | } | ||
735 | |||
736 | out: | ||
737 | if (best_parent) | ||
738 | *best_parent_p = best_parent; | ||
739 | *best_parent_rate = best; | ||
740 | |||
741 | return best; | ||
742 | } | ||
743 | |||
682 | /*** clk api ***/ | 744 | /*** clk api ***/ |
683 | 745 | ||
684 | void __clk_unprepare(struct clk *clk) | 746 | void __clk_unprepare(struct clk *clk) |
@@ -702,7 +764,7 @@ void __clk_unprepare(struct clk *clk) | |||
702 | 764 | ||
703 | /** | 765 | /** |
704 | * clk_unprepare - undo preparation of a clock source | 766 | * clk_unprepare - undo preparation of a clock source |
705 | * @clk: the clk being unprepare | 767 | * @clk: the clk being unprepared |
706 | * | 768 | * |
707 | * clk_unprepare may sleep, which differentiates it from clk_disable. In a | 769 | * clk_unprepare may sleep, which differentiates it from clk_disable. In a |
708 | * simple case, clk_unprepare can be used instead of clk_disable to gate a clk | 770 | * simple case, clk_unprepare can be used instead of clk_disable to gate a clk |
@@ -869,27 +931,31 @@ EXPORT_SYMBOL_GPL(clk_enable); | |||
869 | /** | 931 | /** |
870 | * __clk_round_rate - round the given rate for a clk | 932 | * __clk_round_rate - round the given rate for a clk |
871 | * @clk: round the rate of this clock | 933 | * @clk: round the rate of this clock |
934 | * @rate: the rate which is to be rounded | ||
872 | * | 935 | * |
873 | * Caller must hold prepare_lock. Useful for clk_ops such as .set_rate | 936 | * Caller must hold prepare_lock. Useful for clk_ops such as .set_rate |
874 | */ | 937 | */ |
875 | unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) | 938 | unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) |
876 | { | 939 | { |
877 | unsigned long parent_rate = 0; | 940 | unsigned long parent_rate = 0; |
941 | struct clk *parent; | ||
878 | 942 | ||
879 | if (!clk) | 943 | if (!clk) |
880 | return 0; | 944 | return 0; |
881 | 945 | ||
882 | if (!clk->ops->round_rate) { | 946 | parent = clk->parent; |
883 | if (clk->flags & CLK_SET_RATE_PARENT) | 947 | if (parent) |
884 | return __clk_round_rate(clk->parent, rate); | 948 | parent_rate = parent->rate; |
885 | else | 949 | |
886 | return clk->rate; | 950 | if (clk->ops->determine_rate) |
887 | } | 951 | return clk->ops->determine_rate(clk->hw, rate, &parent_rate, |
888 | 952 | &parent); | |
889 | if (clk->parent) | 953 | else if (clk->ops->round_rate) |
890 | parent_rate = clk->parent->rate; | 954 | return clk->ops->round_rate(clk->hw, rate, &parent_rate); |
891 | 955 | else if (clk->flags & CLK_SET_RATE_PARENT) | |
892 | return clk->ops->round_rate(clk->hw, rate, &parent_rate); | 956 | return __clk_round_rate(clk->parent, rate); |
957 | else | ||
958 | return clk->rate; | ||
893 | } | 959 | } |
894 | 960 | ||
895 | /** | 961 | /** |
@@ -956,7 +1022,7 @@ static int __clk_notify(struct clk *clk, unsigned long msg, | |||
956 | * | 1022 | * |
957 | * Walks the subtree of clks starting with clk and recalculates rates as it | 1023 | * Walks the subtree of clks starting with clk and recalculates rates as it |
958 | * goes. Note that if a clk does not implement the .recalc_rate callback then | 1024 | * goes. Note that if a clk does not implement the .recalc_rate callback then |
959 | * it is assumed that the clock will take on the rate of it's parent. | 1025 | * it is assumed that the clock will take on the rate of its parent. |
960 | * | 1026 | * |
961 | * clk_recalc_rates also propagates the POST_RATE_CHANGE notification, | 1027 | * clk_recalc_rates also propagates the POST_RATE_CHANGE notification, |
962 | * if necessary. | 1028 | * if necessary. |
@@ -1014,6 +1080,115 @@ unsigned long clk_get_rate(struct clk *clk) | |||
1014 | } | 1080 | } |
1015 | EXPORT_SYMBOL_GPL(clk_get_rate); | 1081 | EXPORT_SYMBOL_GPL(clk_get_rate); |
1016 | 1082 | ||
1083 | static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent) | ||
1084 | { | ||
1085 | u8 i; | ||
1086 | |||
1087 | if (!clk->parents) | ||
1088 | clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), | ||
1089 | GFP_KERNEL); | ||
1090 | |||
1091 | /* | ||
1092 | * find index of new parent clock using cached parent ptrs, | ||
1093 | * or if not yet cached, use string name comparison and cache | ||
1094 | * them now to avoid future calls to __clk_lookup. | ||
1095 | */ | ||
1096 | for (i = 0; i < clk->num_parents; i++) { | ||
1097 | if (clk->parents && clk->parents[i] == parent) | ||
1098 | break; | ||
1099 | else if (!strcmp(clk->parent_names[i], parent->name)) { | ||
1100 | if (clk->parents) | ||
1101 | clk->parents[i] = __clk_lookup(parent->name); | ||
1102 | break; | ||
1103 | } | ||
1104 | } | ||
1105 | |||
1106 | return i; | ||
1107 | } | ||
1108 | |||
1109 | static void clk_reparent(struct clk *clk, struct clk *new_parent) | ||
1110 | { | ||
1111 | hlist_del(&clk->child_node); | ||
1112 | |||
1113 | if (new_parent) { | ||
1114 | /* avoid duplicate POST_RATE_CHANGE notifications */ | ||
1115 | if (new_parent->new_child == clk) | ||
1116 | new_parent->new_child = NULL; | ||
1117 | |||
1118 | hlist_add_head(&clk->child_node, &new_parent->children); | ||
1119 | } else { | ||
1120 | hlist_add_head(&clk->child_node, &clk_orphan_list); | ||
1121 | } | ||
1122 | |||
1123 | clk->parent = new_parent; | ||
1124 | } | ||
1125 | |||
1126 | static int __clk_set_parent(struct clk *clk, struct clk *parent, u8 p_index) | ||
1127 | { | ||
1128 | unsigned long flags; | ||
1129 | int ret = 0; | ||
1130 | struct clk *old_parent = clk->parent; | ||
1131 | |||
1132 | /* | ||
1133 | * Migrate prepare state between parents and prevent race with | ||
1134 | * clk_enable(). | ||
1135 | * | ||
1136 | * If the clock is not prepared, then a race with | ||
1137 | * clk_enable/disable() is impossible since we already have the | ||
1138 | * prepare lock (future calls to clk_enable() need to be preceded by | ||
1139 | * a clk_prepare()). | ||
1140 | * | ||
1141 | * If the clock is prepared, migrate the prepared state to the new | ||
1142 | * parent and also protect against a race with clk_enable() by | ||
1143 | * forcing the clock and the new parent on. This ensures that all | ||
1144 | * future calls to clk_enable() are practically NOPs with respect to | ||
1145 | * hardware and software states. | ||
1146 | * | ||
1147 | * See also: Comment for clk_set_parent() below. | ||
1148 | */ | ||
1149 | if (clk->prepare_count) { | ||
1150 | __clk_prepare(parent); | ||
1151 | clk_enable(parent); | ||
1152 | clk_enable(clk); | ||
1153 | } | ||
1154 | |||
1155 | /* update the clk tree topology */ | ||
1156 | flags = clk_enable_lock(); | ||
1157 | clk_reparent(clk, parent); | ||
1158 | clk_enable_unlock(flags); | ||
1159 | |||
1160 | /* change clock input source */ | ||
1161 | if (parent && clk->ops->set_parent) | ||
1162 | ret = clk->ops->set_parent(clk->hw, p_index); | ||
1163 | |||
1164 | if (ret) { | ||
1165 | flags = clk_enable_lock(); | ||
1166 | clk_reparent(clk, old_parent); | ||
1167 | clk_enable_unlock(flags); | ||
1168 | |||
1169 | if (clk->prepare_count) { | ||
1170 | clk_disable(clk); | ||
1171 | clk_disable(parent); | ||
1172 | __clk_unprepare(parent); | ||
1173 | } | ||
1174 | return ret; | ||
1175 | } | ||
1176 | |||
1177 | /* | ||
1178 | * Finish the migration of prepare state and undo the changes done | ||
1179 | * for preventing a race with clk_enable(). | ||
1180 | */ | ||
1181 | if (clk->prepare_count) { | ||
1182 | clk_disable(clk); | ||
1183 | clk_disable(old_parent); | ||
1184 | __clk_unprepare(old_parent); | ||
1185 | } | ||
1186 | |||
1187 | /* update debugfs with new clk tree topology */ | ||
1188 | clk_debug_reparent(clk, parent); | ||
1189 | return 0; | ||
1190 | } | ||
1191 | |||
1017 | /** | 1192 | /** |
1018 | * __clk_speculate_rates | 1193 | * __clk_speculate_rates |
1019 | * @clk: first clk in the subtree | 1194 | * @clk: first clk in the subtree |
@@ -1026,7 +1201,7 @@ EXPORT_SYMBOL_GPL(clk_get_rate); | |||
1026 | * pre-rate change notifications and returns early if no clks in the | 1201 | * pre-rate change notifications and returns early if no clks in the |
1027 | * subtree have subscribed to the notifications. Note that if a clk does not | 1202 | * subtree have subscribed to the notifications. Note that if a clk does not |
1028 | * implement the .recalc_rate callback then it is assumed that the clock will | 1203 | * implement the .recalc_rate callback then it is assumed that the clock will |
1029 | * take on the rate of it's parent. | 1204 | * take on the rate of its parent. |
1030 | * | 1205 | * |
1031 | * Caller must hold prepare_lock. | 1206 | * Caller must hold prepare_lock. |
1032 | */ | 1207 | */ |
@@ -1058,18 +1233,25 @@ out: | |||
1058 | return ret; | 1233 | return ret; |
1059 | } | 1234 | } |
1060 | 1235 | ||
1061 | static void clk_calc_subtree(struct clk *clk, unsigned long new_rate) | 1236 | static void clk_calc_subtree(struct clk *clk, unsigned long new_rate, |
1237 | struct clk *new_parent, u8 p_index) | ||
1062 | { | 1238 | { |
1063 | struct clk *child; | 1239 | struct clk *child; |
1064 | 1240 | ||
1065 | clk->new_rate = new_rate; | 1241 | clk->new_rate = new_rate; |
1242 | clk->new_parent = new_parent; | ||
1243 | clk->new_parent_index = p_index; | ||
1244 | /* include clk in new parent's PRE_RATE_CHANGE notifications */ | ||
1245 | clk->new_child = NULL; | ||
1246 | if (new_parent && new_parent != clk->parent) | ||
1247 | new_parent->new_child = clk; | ||
1066 | 1248 | ||
1067 | hlist_for_each_entry(child, &clk->children, child_node) { | 1249 | hlist_for_each_entry(child, &clk->children, child_node) { |
1068 | if (child->ops->recalc_rate) | 1250 | if (child->ops->recalc_rate) |
1069 | child->new_rate = child->ops->recalc_rate(child->hw, new_rate); | 1251 | child->new_rate = child->ops->recalc_rate(child->hw, new_rate); |
1070 | else | 1252 | else |
1071 | child->new_rate = new_rate; | 1253 | child->new_rate = new_rate; |
1072 | clk_calc_subtree(child, child->new_rate); | 1254 | clk_calc_subtree(child, child->new_rate, NULL, 0); |
1073 | } | 1255 | } |
1074 | } | 1256 | } |
1075 | 1257 | ||
@@ -1080,50 +1262,63 @@ static void clk_calc_subtree(struct clk *clk, unsigned long new_rate) | |||
1080 | static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) | 1262 | static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) |
1081 | { | 1263 | { |
1082 | struct clk *top = clk; | 1264 | struct clk *top = clk; |
1265 | struct clk *old_parent, *parent; | ||
1083 | unsigned long best_parent_rate = 0; | 1266 | unsigned long best_parent_rate = 0; |
1084 | unsigned long new_rate; | 1267 | unsigned long new_rate; |
1268 | u8 p_index = 0; | ||
1085 | 1269 | ||
1086 | /* sanity */ | 1270 | /* sanity */ |
1087 | if (IS_ERR_OR_NULL(clk)) | 1271 | if (IS_ERR_OR_NULL(clk)) |
1088 | return NULL; | 1272 | return NULL; |
1089 | 1273 | ||
1090 | /* save parent rate, if it exists */ | 1274 | /* save parent rate, if it exists */ |
1091 | if (clk->parent) | 1275 | parent = old_parent = clk->parent; |
1092 | best_parent_rate = clk->parent->rate; | 1276 | if (parent) |
1093 | 1277 | best_parent_rate = parent->rate; | |
1094 | /* never propagate up to the parent */ | 1278 | |
1095 | if (!(clk->flags & CLK_SET_RATE_PARENT)) { | 1279 | /* find the closest rate and parent clk/rate */ |
1096 | if (!clk->ops->round_rate) { | 1280 | if (clk->ops->determine_rate) { |
1097 | clk->new_rate = clk->rate; | 1281 | new_rate = clk->ops->determine_rate(clk->hw, rate, |
1098 | return NULL; | 1282 | &best_parent_rate, |
1099 | } | 1283 | &parent); |
1100 | new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); | 1284 | } else if (clk->ops->round_rate) { |
1285 | new_rate = clk->ops->round_rate(clk->hw, rate, | ||
1286 | &best_parent_rate); | ||
1287 | } else if (!parent || !(clk->flags & CLK_SET_RATE_PARENT)) { | ||
1288 | /* pass-through clock without adjustable parent */ | ||
1289 | clk->new_rate = clk->rate; | ||
1290 | return NULL; | ||
1291 | } else { | ||
1292 | /* pass-through clock with adjustable parent */ | ||
1293 | top = clk_calc_new_rates(parent, rate); | ||
1294 | new_rate = parent->new_rate; | ||
1101 | goto out; | 1295 | goto out; |
1102 | } | 1296 | } |
1103 | 1297 | ||
1104 | /* need clk->parent from here on out */ | 1298 | /* some clocks must be gated to change parent */ |
1105 | if (!clk->parent) { | 1299 | if (parent != old_parent && |
1106 | pr_debug("%s: %s has NULL parent\n", __func__, clk->name); | 1300 | (clk->flags & CLK_SET_PARENT_GATE) && clk->prepare_count) { |
1301 | pr_debug("%s: %s not gated but wants to reparent\n", | ||
1302 | __func__, clk->name); | ||
1107 | return NULL; | 1303 | return NULL; |
1108 | } | 1304 | } |
1109 | 1305 | ||
1110 | if (!clk->ops->round_rate) { | 1306 | /* try finding the new parent index */ |
1111 | top = clk_calc_new_rates(clk->parent, rate); | 1307 | if (parent) { |
1112 | new_rate = clk->parent->new_rate; | 1308 | p_index = clk_fetch_parent_index(clk, parent); |
1113 | 1309 | if (p_index == clk->num_parents) { | |
1114 | goto out; | 1310 | pr_debug("%s: clk %s can not be parent of clk %s\n", |
1311 | __func__, parent->name, clk->name); | ||
1312 | return NULL; | ||
1313 | } | ||
1115 | } | 1314 | } |
1116 | 1315 | ||
1117 | new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); | 1316 | if ((clk->flags & CLK_SET_RATE_PARENT) && parent && |
1118 | 1317 | best_parent_rate != parent->rate) | |
1119 | if (best_parent_rate != clk->parent->rate) { | 1318 | top = clk_calc_new_rates(parent, best_parent_rate); |
1120 | top = clk_calc_new_rates(clk->parent, best_parent_rate); | ||
1121 | |||
1122 | goto out; | ||
1123 | } | ||
1124 | 1319 | ||
1125 | out: | 1320 | out: |
1126 | clk_calc_subtree(clk, new_rate); | 1321 | clk_calc_subtree(clk, new_rate, parent, p_index); |
1127 | 1322 | ||
1128 | return top; | 1323 | return top; |
1129 | } | 1324 | } |
@@ -1135,7 +1330,7 @@ out: | |||
1135 | */ | 1330 | */ |
1136 | static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long event) | 1331 | static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long event) |
1137 | { | 1332 | { |
1138 | struct clk *child, *fail_clk = NULL; | 1333 | struct clk *child, *tmp_clk, *fail_clk = NULL; |
1139 | int ret = NOTIFY_DONE; | 1334 | int ret = NOTIFY_DONE; |
1140 | 1335 | ||
1141 | if (clk->rate == clk->new_rate) | 1336 | if (clk->rate == clk->new_rate) |
@@ -1148,9 +1343,19 @@ static struct clk *clk_propagate_rate_change(struct clk *clk, unsigned long even | |||
1148 | } | 1343 | } |
1149 | 1344 | ||
1150 | hlist_for_each_entry(child, &clk->children, child_node) { | 1345 | hlist_for_each_entry(child, &clk->children, child_node) { |
1151 | clk = clk_propagate_rate_change(child, event); | 1346 | /* Skip children who will be reparented to another clock */ |
1152 | if (clk) | 1347 | if (child->new_parent && child->new_parent != clk) |
1153 | fail_clk = clk; | 1348 | continue; |
1349 | tmp_clk = clk_propagate_rate_change(child, event); | ||
1350 | if (tmp_clk) | ||
1351 | fail_clk = tmp_clk; | ||
1352 | } | ||
1353 | |||
1354 | /* handle the new child who might not be in clk->children yet */ | ||
1355 | if (clk->new_child) { | ||
1356 | tmp_clk = clk_propagate_rate_change(clk->new_child, event); | ||
1357 | if (tmp_clk) | ||
1358 | fail_clk = tmp_clk; | ||
1154 | } | 1359 | } |
1155 | 1360 | ||
1156 | return fail_clk; | 1361 | return fail_clk; |
@@ -1168,6 +1373,10 @@ static void clk_change_rate(struct clk *clk) | |||
1168 | 1373 | ||
1169 | old_rate = clk->rate; | 1374 | old_rate = clk->rate; |
1170 | 1375 | ||
1376 | /* set parent */ | ||
1377 | if (clk->new_parent && clk->new_parent != clk->parent) | ||
1378 | __clk_set_parent(clk, clk->new_parent, clk->new_parent_index); | ||
1379 | |||
1171 | if (clk->parent) | 1380 | if (clk->parent) |
1172 | best_parent_rate = clk->parent->rate; | 1381 | best_parent_rate = clk->parent->rate; |
1173 | 1382 | ||
@@ -1182,8 +1391,16 @@ static void clk_change_rate(struct clk *clk) | |||
1182 | if (clk->notifier_count && old_rate != clk->rate) | 1391 | if (clk->notifier_count && old_rate != clk->rate) |
1183 | __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); | 1392 | __clk_notify(clk, POST_RATE_CHANGE, old_rate, clk->rate); |
1184 | 1393 | ||
1185 | hlist_for_each_entry(child, &clk->children, child_node) | 1394 | hlist_for_each_entry(child, &clk->children, child_node) { |
1395 | /* Skip children who will be reparented to another clock */ | ||
1396 | if (child->new_parent && child->new_parent != clk) | ||
1397 | continue; | ||
1186 | clk_change_rate(child); | 1398 | clk_change_rate(child); |
1399 | } | ||
1400 | |||
1401 | /* handle the new child who might not be in clk->children yet */ | ||
1402 | if (clk->new_child) | ||
1403 | clk_change_rate(clk->new_child); | ||
1187 | } | 1404 | } |
1188 | 1405 | ||
1189 | /** | 1406 | /** |
@@ -1198,7 +1415,7 @@ static void clk_change_rate(struct clk *clk) | |||
1198 | * outcome of clk's .round_rate implementation. If *parent_rate is unchanged | 1415 | * outcome of clk's .round_rate implementation. If *parent_rate is unchanged |
1199 | * after calling .round_rate then upstream parent propagation is ignored. If | 1416 | * after calling .round_rate then upstream parent propagation is ignored. If |
1200 | * *parent_rate comes back with a new rate for clk's parent then we propagate | 1417 | * *parent_rate comes back with a new rate for clk's parent then we propagate |
1201 | * up to clk's parent and set it's rate. Upward propagation will continue | 1418 | * up to clk's parent and set its rate. Upward propagation will continue |
1202 | * until either a clk does not support the CLK_SET_RATE_PARENT flag or | 1419 | * until either a clk does not support the CLK_SET_RATE_PARENT flag or |
1203 | * .round_rate stops requesting changes to clk's parent_rate. | 1420 | * .round_rate stops requesting changes to clk's parent_rate. |
1204 | * | 1421 | * |
@@ -1212,6 +1429,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
1212 | struct clk *top, *fail_clk; | 1429 | struct clk *top, *fail_clk; |
1213 | int ret = 0; | 1430 | int ret = 0; |
1214 | 1431 | ||
1432 | if (!clk) | ||
1433 | return 0; | ||
1434 | |||
1215 | /* prevent racing with updates to the clock topology */ | 1435 | /* prevent racing with updates to the clock topology */ |
1216 | clk_prepare_lock(); | 1436 | clk_prepare_lock(); |
1217 | 1437 | ||
@@ -1315,30 +1535,12 @@ static struct clk *__clk_init_parent(struct clk *clk) | |||
1315 | kzalloc((sizeof(struct clk*) * clk->num_parents), | 1535 | kzalloc((sizeof(struct clk*) * clk->num_parents), |
1316 | GFP_KERNEL); | 1536 | GFP_KERNEL); |
1317 | 1537 | ||
1318 | if (!clk->parents) | 1538 | ret = clk_get_parent_by_index(clk, index); |
1319 | ret = __clk_lookup(clk->parent_names[index]); | ||
1320 | else if (!clk->parents[index]) | ||
1321 | ret = clk->parents[index] = | ||
1322 | __clk_lookup(clk->parent_names[index]); | ||
1323 | else | ||
1324 | ret = clk->parents[index]; | ||
1325 | 1539 | ||
1326 | out: | 1540 | out: |
1327 | return ret; | 1541 | return ret; |
1328 | } | 1542 | } |
1329 | 1543 | ||
1330 | static void clk_reparent(struct clk *clk, struct clk *new_parent) | ||
1331 | { | ||
1332 | hlist_del(&clk->child_node); | ||
1333 | |||
1334 | if (new_parent) | ||
1335 | hlist_add_head(&clk->child_node, &new_parent->children); | ||
1336 | else | ||
1337 | hlist_add_head(&clk->child_node, &clk_orphan_list); | ||
1338 | |||
1339 | clk->parent = new_parent; | ||
1340 | } | ||
1341 | |||
1342 | void __clk_reparent(struct clk *clk, struct clk *new_parent) | 1544 | void __clk_reparent(struct clk *clk, struct clk *new_parent) |
1343 | { | 1545 | { |
1344 | clk_reparent(clk, new_parent); | 1546 | clk_reparent(clk, new_parent); |
@@ -1346,98 +1548,6 @@ void __clk_reparent(struct clk *clk, struct clk *new_parent) | |||
1346 | __clk_recalc_rates(clk, POST_RATE_CHANGE); | 1548 | __clk_recalc_rates(clk, POST_RATE_CHANGE); |
1347 | } | 1549 | } |
1348 | 1550 | ||
1349 | static u8 clk_fetch_parent_index(struct clk *clk, struct clk *parent) | ||
1350 | { | ||
1351 | u8 i; | ||
1352 | |||
1353 | if (!clk->parents) | ||
1354 | clk->parents = kzalloc((sizeof(struct clk*) * clk->num_parents), | ||
1355 | GFP_KERNEL); | ||
1356 | |||
1357 | /* | ||
1358 | * find index of new parent clock using cached parent ptrs, | ||
1359 | * or if not yet cached, use string name comparison and cache | ||
1360 | * them now to avoid future calls to __clk_lookup. | ||
1361 | */ | ||
1362 | for (i = 0; i < clk->num_parents; i++) { | ||
1363 | if (clk->parents && clk->parents[i] == parent) | ||
1364 | break; | ||
1365 | else if (!strcmp(clk->parent_names[i], parent->name)) { | ||
1366 | if (clk->parents) | ||
1367 | clk->parents[i] = __clk_lookup(parent->name); | ||
1368 | break; | ||
1369 | } | ||
1370 | } | ||
1371 | |||
1372 | return i; | ||
1373 | } | ||
1374 | |||
1375 | static int __clk_set_parent(struct clk *clk, struct clk *parent, u8 p_index) | ||
1376 | { | ||
1377 | unsigned long flags; | ||
1378 | int ret = 0; | ||
1379 | struct clk *old_parent = clk->parent; | ||
1380 | |||
1381 | /* | ||
1382 | * Migrate prepare state between parents and prevent race with | ||
1383 | * clk_enable(). | ||
1384 | * | ||
1385 | * If the clock is not prepared, then a race with | ||
1386 | * clk_enable/disable() is impossible since we already have the | ||
1387 | * prepare lock (future calls to clk_enable() need to be preceded by | ||
1388 | * a clk_prepare()). | ||
1389 | * | ||
1390 | * If the clock is prepared, migrate the prepared state to the new | ||
1391 | * parent and also protect against a race with clk_enable() by | ||
1392 | * forcing the clock and the new parent on. This ensures that all | ||
1393 | * future calls to clk_enable() are practically NOPs with respect to | ||
1394 | * hardware and software states. | ||
1395 | * | ||
1396 | * See also: Comment for clk_set_parent() below. | ||
1397 | */ | ||
1398 | if (clk->prepare_count) { | ||
1399 | __clk_prepare(parent); | ||
1400 | clk_enable(parent); | ||
1401 | clk_enable(clk); | ||
1402 | } | ||
1403 | |||
1404 | /* update the clk tree topology */ | ||
1405 | flags = clk_enable_lock(); | ||
1406 | clk_reparent(clk, parent); | ||
1407 | clk_enable_unlock(flags); | ||
1408 | |||
1409 | /* change clock input source */ | ||
1410 | if (parent && clk->ops->set_parent) | ||
1411 | ret = clk->ops->set_parent(clk->hw, p_index); | ||
1412 | |||
1413 | if (ret) { | ||
1414 | flags = clk_enable_lock(); | ||
1415 | clk_reparent(clk, old_parent); | ||
1416 | clk_enable_unlock(flags); | ||
1417 | |||
1418 | if (clk->prepare_count) { | ||
1419 | clk_disable(clk); | ||
1420 | clk_disable(parent); | ||
1421 | __clk_unprepare(parent); | ||
1422 | } | ||
1423 | return ret; | ||
1424 | } | ||
1425 | |||
1426 | /* | ||
1427 | * Finish the migration of prepare state and undo the changes done | ||
1428 | * for preventing a race with clk_enable(). | ||
1429 | */ | ||
1430 | if (clk->prepare_count) { | ||
1431 | clk_disable(clk); | ||
1432 | clk_disable(old_parent); | ||
1433 | __clk_unprepare(old_parent); | ||
1434 | } | ||
1435 | |||
1436 | /* update debugfs with new clk tree topology */ | ||
1437 | clk_debug_reparent(clk, parent); | ||
1438 | return 0; | ||
1439 | } | ||
1440 | |||
1441 | /** | 1551 | /** |
1442 | * clk_set_parent - switch the parent of a mux clk | 1552 | * clk_set_parent - switch the parent of a mux clk |
1443 | * @clk: the mux clk whose input we are switching | 1553 | * @clk: the mux clk whose input we are switching |
@@ -1461,7 +1571,10 @@ int clk_set_parent(struct clk *clk, struct clk *parent) | |||
1461 | u8 p_index = 0; | 1571 | u8 p_index = 0; |
1462 | unsigned long p_rate = 0; | 1572 | unsigned long p_rate = 0; |
1463 | 1573 | ||
1464 | if (!clk || !clk->ops) | 1574 | if (!clk) |
1575 | return 0; | ||
1576 | |||
1577 | if (!clk->ops) | ||
1465 | return -EINVAL; | 1578 | return -EINVAL; |
1466 | 1579 | ||
1467 | /* verify ops for for multi-parent clks */ | 1580 | /* verify ops for for multi-parent clks */ |
@@ -1544,8 +1657,9 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1544 | 1657 | ||
1545 | /* check that clk_ops are sane. See Documentation/clk.txt */ | 1658 | /* check that clk_ops are sane. See Documentation/clk.txt */ |
1546 | if (clk->ops->set_rate && | 1659 | if (clk->ops->set_rate && |
1547 | !(clk->ops->round_rate && clk->ops->recalc_rate)) { | 1660 | !((clk->ops->round_rate || clk->ops->determine_rate) && |
1548 | pr_warning("%s: %s must implement .round_rate & .recalc_rate\n", | 1661 | clk->ops->recalc_rate)) { |
1662 | pr_warning("%s: %s must implement .round_rate or .determine_rate in addition to .recalc_rate\n", | ||
1549 | __func__, clk->name); | 1663 | __func__, clk->name); |
1550 | ret = -EINVAL; | 1664 | ret = -EINVAL; |
1551 | goto out; | 1665 | goto out; |
@@ -1628,7 +1742,7 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1628 | * this clock | 1742 | * this clock |
1629 | */ | 1743 | */ |
1630 | hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { | 1744 | hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { |
1631 | if (orphan->ops->get_parent) { | 1745 | if (orphan->num_parents && orphan->ops->get_parent) { |
1632 | i = orphan->ops->get_parent(orphan->hw); | 1746 | i = orphan->ops->get_parent(orphan->hw); |
1633 | if (!strcmp(clk->name, orphan->parent_names[i])) | 1747 | if (!strcmp(clk->name, orphan->parent_names[i])) |
1634 | __clk_reparent(orphan, clk); | 1748 | __clk_reparent(orphan, clk); |
@@ -1648,7 +1762,7 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1648 | * The .init callback is not used by any of the basic clock types, but | 1762 | * The .init callback is not used by any of the basic clock types, but |
1649 | * exists for weird hardware that must perform initialization magic. | 1763 | * exists for weird hardware that must perform initialization magic. |
1650 | * Please consider other ways of solving initialization problems before | 1764 | * Please consider other ways of solving initialization problems before |
1651 | * using this callback, as it's use is discouraged. | 1765 | * using this callback, as its use is discouraged. |
1652 | */ | 1766 | */ |
1653 | if (clk->ops->init) | 1767 | if (clk->ops->init) |
1654 | clk->ops->init(clk->hw); | 1768 | clk->ops->init(clk->hw); |
@@ -1675,7 +1789,7 @@ out: | |||
1675 | * very large numbers of clocks that need to be statically initialized. It is | 1789 | * very large numbers of clocks that need to be statically initialized. It is |
1676 | * a layering violation to include clk-private.h from any code which implements | 1790 | * a layering violation to include clk-private.h from any code which implements |
1677 | * a clock's .ops; as such any statically initialized clock data MUST be in a | 1791 | * a clock's .ops; as such any statically initialized clock data MUST be in a |
1678 | * separate C file from the logic that implements it's operations. Returns 0 | 1792 | * separate C file from the logic that implements its operations. Returns 0 |
1679 | * on success, otherwise an error code. | 1793 | * on success, otherwise an error code. |
1680 | */ | 1794 | */ |
1681 | struct clk *__clk_register(struct device *dev, struct clk_hw *hw) | 1795 | struct clk *__clk_register(struct device *dev, struct clk_hw *hw) |
@@ -2115,13 +2229,13 @@ EXPORT_SYMBOL_GPL(of_clk_get_parent_name); | |||
2115 | */ | 2229 | */ |
2116 | void __init of_clk_init(const struct of_device_id *matches) | 2230 | void __init of_clk_init(const struct of_device_id *matches) |
2117 | { | 2231 | { |
2232 | const struct of_device_id *match; | ||
2118 | struct device_node *np; | 2233 | struct device_node *np; |
2119 | 2234 | ||
2120 | if (!matches) | 2235 | if (!matches) |
2121 | matches = __clk_of_table; | 2236 | matches = __clk_of_table; |
2122 | 2237 | ||
2123 | for_each_matching_node(np, matches) { | 2238 | for_each_matching_node_and_match(np, matches, &match) { |
2124 | const struct of_device_id *match = of_match_node(matches, np); | ||
2125 | of_clk_init_cb_t clk_init_cb = match->data; | 2239 | of_clk_init_cb_t clk_init_cb = match->data; |
2126 | clk_init_cb(np); | 2240 | clk_init_cb(np); |
2127 | } | 2241 | } |
diff --git a/drivers/clk/mmp/clk-mmp2.c b/drivers/clk/mmp/clk-mmp2.c index d1f1a19d4351..b2721cae257a 100644 --- a/drivers/clk/mmp/clk-mmp2.c +++ b/drivers/clk/mmp/clk-mmp2.c | |||
@@ -248,7 +248,8 @@ void __init mmp2_clk_init(void) | |||
248 | clk_register_clkdev(clk, NULL, "mmp2-pwm.3"); | 248 | clk_register_clkdev(clk, NULL, "mmp2-pwm.3"); |
249 | 249 | ||
250 | clk = clk_register_mux(NULL, "uart0_mux", uart_parent, | 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 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); | 253 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); |
253 | clk_set_parent(clk, vctcxo); | 254 | clk_set_parent(clk, vctcxo); |
254 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 255 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
@@ -258,7 +259,8 @@ void __init mmp2_clk_init(void) | |||
258 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); | 259 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); |
259 | 260 | ||
260 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, | 261 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, |
261 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 262 | ARRAY_SIZE(uart_parent), |
263 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
262 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); | 264 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); |
263 | clk_set_parent(clk, vctcxo); | 265 | clk_set_parent(clk, vctcxo); |
264 | clk_register_clkdev(clk, "uart_mux.1", NULL); | 266 | clk_register_clkdev(clk, "uart_mux.1", NULL); |
@@ -268,7 +270,8 @@ void __init mmp2_clk_init(void) | |||
268 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); | 270 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); |
269 | 271 | ||
270 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, | 272 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, |
271 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 273 | ARRAY_SIZE(uart_parent), |
274 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
272 | apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); | 275 | apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); |
273 | clk_set_parent(clk, vctcxo); | 276 | clk_set_parent(clk, vctcxo); |
274 | clk_register_clkdev(clk, "uart_mux.2", NULL); | 277 | clk_register_clkdev(clk, "uart_mux.2", NULL); |
@@ -278,7 +281,8 @@ void __init mmp2_clk_init(void) | |||
278 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); | 281 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); |
279 | 282 | ||
280 | clk = clk_register_mux(NULL, "uart3_mux", uart_parent, | 283 | clk = clk_register_mux(NULL, "uart3_mux", uart_parent, |
281 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 284 | ARRAY_SIZE(uart_parent), |
285 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
282 | apbc_base + APBC_UART3, 4, 3, 0, &clk_lock); | 286 | apbc_base + APBC_UART3, 4, 3, 0, &clk_lock); |
283 | clk_set_parent(clk, vctcxo); | 287 | clk_set_parent(clk, vctcxo); |
284 | clk_register_clkdev(clk, "uart_mux.3", NULL); | 288 | clk_register_clkdev(clk, "uart_mux.3", NULL); |
@@ -288,7 +292,8 @@ void __init mmp2_clk_init(void) | |||
288 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.3"); | 292 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.3"); |
289 | 293 | ||
290 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, | 294 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, |
291 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 295 | ARRAY_SIZE(ssp_parent), |
296 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
292 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); | 297 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); |
293 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 298 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
294 | 299 | ||
@@ -297,7 +302,8 @@ void __init mmp2_clk_init(void) | |||
297 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); | 302 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); |
298 | 303 | ||
299 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, | 304 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, |
300 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 305 | ARRAY_SIZE(ssp_parent), |
306 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
301 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); | 307 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); |
302 | clk_register_clkdev(clk, "ssp_mux.1", NULL); | 308 | clk_register_clkdev(clk, "ssp_mux.1", NULL); |
303 | 309 | ||
@@ -306,7 +312,8 @@ void __init mmp2_clk_init(void) | |||
306 | clk_register_clkdev(clk, NULL, "mmp-ssp.1"); | 312 | clk_register_clkdev(clk, NULL, "mmp-ssp.1"); |
307 | 313 | ||
308 | clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, | 314 | clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, |
309 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 315 | ARRAY_SIZE(ssp_parent), |
316 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
310 | apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); | 317 | apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); |
311 | clk_register_clkdev(clk, "ssp_mux.2", NULL); | 318 | clk_register_clkdev(clk, "ssp_mux.2", NULL); |
312 | 319 | ||
@@ -315,7 +322,8 @@ void __init mmp2_clk_init(void) | |||
315 | clk_register_clkdev(clk, NULL, "mmp-ssp.2"); | 322 | clk_register_clkdev(clk, NULL, "mmp-ssp.2"); |
316 | 323 | ||
317 | clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, | 324 | clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, |
318 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 325 | ARRAY_SIZE(ssp_parent), |
326 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
319 | apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); | 327 | apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); |
320 | clk_register_clkdev(clk, "ssp_mux.3", NULL); | 328 | clk_register_clkdev(clk, "ssp_mux.3", NULL); |
321 | 329 | ||
@@ -324,7 +332,8 @@ void __init mmp2_clk_init(void) | |||
324 | clk_register_clkdev(clk, NULL, "mmp-ssp.3"); | 332 | clk_register_clkdev(clk, NULL, "mmp-ssp.3"); |
325 | 333 | ||
326 | clk = clk_register_mux(NULL, "sdh_mux", sdh_parent, | 334 | clk = clk_register_mux(NULL, "sdh_mux", sdh_parent, |
327 | ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, | 335 | ARRAY_SIZE(sdh_parent), |
336 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
328 | apmu_base + APMU_SDH0, 8, 2, 0, &clk_lock); | 337 | apmu_base + APMU_SDH0, 8, 2, 0, &clk_lock); |
329 | clk_register_clkdev(clk, "sdh_mux", NULL); | 338 | clk_register_clkdev(clk, "sdh_mux", NULL); |
330 | 339 | ||
@@ -354,7 +363,8 @@ void __init mmp2_clk_init(void) | |||
354 | clk_register_clkdev(clk, "usb_clk", NULL); | 363 | clk_register_clkdev(clk, "usb_clk", NULL); |
355 | 364 | ||
356 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, | 365 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, |
357 | ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, | 366 | ARRAY_SIZE(disp_parent), |
367 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
358 | apmu_base + APMU_DISP0, 6, 2, 0, &clk_lock); | 368 | apmu_base + APMU_DISP0, 6, 2, 0, &clk_lock); |
359 | clk_register_clkdev(clk, "disp_mux.0", NULL); | 369 | clk_register_clkdev(clk, "disp_mux.0", NULL); |
360 | 370 | ||
@@ -376,7 +386,8 @@ void __init mmp2_clk_init(void) | |||
376 | clk_register_clkdev(clk, "disp_sphy.0", NULL); | 386 | clk_register_clkdev(clk, "disp_sphy.0", NULL); |
377 | 387 | ||
378 | clk = clk_register_mux(NULL, "disp1_mux", disp_parent, | 388 | clk = clk_register_mux(NULL, "disp1_mux", disp_parent, |
379 | ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, | 389 | ARRAY_SIZE(disp_parent), |
390 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
380 | apmu_base + APMU_DISP1, 6, 2, 0, &clk_lock); | 391 | apmu_base + APMU_DISP1, 6, 2, 0, &clk_lock); |
381 | clk_register_clkdev(clk, "disp_mux.1", NULL); | 392 | clk_register_clkdev(clk, "disp_mux.1", NULL); |
382 | 393 | ||
@@ -394,7 +405,8 @@ void __init mmp2_clk_init(void) | |||
394 | clk_register_clkdev(clk, "ccic_arbiter", NULL); | 405 | clk_register_clkdev(clk, "ccic_arbiter", NULL); |
395 | 406 | ||
396 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, | 407 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, |
397 | ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, | 408 | ARRAY_SIZE(ccic_parent), |
409 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
398 | apmu_base + APMU_CCIC0, 6, 2, 0, &clk_lock); | 410 | apmu_base + APMU_CCIC0, 6, 2, 0, &clk_lock); |
399 | clk_register_clkdev(clk, "ccic_mux.0", NULL); | 411 | clk_register_clkdev(clk, "ccic_mux.0", NULL); |
400 | 412 | ||
@@ -421,7 +433,8 @@ void __init mmp2_clk_init(void) | |||
421 | clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0"); | 433 | clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0"); |
422 | 434 | ||
423 | clk = clk_register_mux(NULL, "ccic1_mux", ccic_parent, | 435 | clk = clk_register_mux(NULL, "ccic1_mux", ccic_parent, |
424 | ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, | 436 | ARRAY_SIZE(ccic_parent), |
437 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
425 | apmu_base + APMU_CCIC1, 6, 2, 0, &clk_lock); | 438 | apmu_base + APMU_CCIC1, 6, 2, 0, &clk_lock); |
426 | clk_register_clkdev(clk, "ccic_mux.1", NULL); | 439 | clk_register_clkdev(clk, "ccic_mux.1", NULL); |
427 | 440 | ||
diff --git a/drivers/clk/mmp/clk-pxa168.c b/drivers/clk/mmp/clk-pxa168.c index 28b3b51c794b..014396b028a2 100644 --- a/drivers/clk/mmp/clk-pxa168.c +++ b/drivers/clk/mmp/clk-pxa168.c | |||
@@ -199,7 +199,8 @@ void __init pxa168_clk_init(void) | |||
199 | clk_register_clkdev(clk, NULL, "pxa168-pwm.3"); | 199 | clk_register_clkdev(clk, NULL, "pxa168-pwm.3"); |
200 | 200 | ||
201 | clk = clk_register_mux(NULL, "uart0_mux", uart_parent, | 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 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); | 204 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); |
204 | clk_set_parent(clk, uart_pll); | 205 | clk_set_parent(clk, uart_pll); |
205 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 206 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
@@ -209,7 +210,8 @@ void __init pxa168_clk_init(void) | |||
209 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); | 210 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); |
210 | 211 | ||
211 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, | 212 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, |
212 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 213 | ARRAY_SIZE(uart_parent), |
214 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
213 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); | 215 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); |
214 | clk_set_parent(clk, uart_pll); | 216 | clk_set_parent(clk, uart_pll); |
215 | clk_register_clkdev(clk, "uart_mux.1", NULL); | 217 | clk_register_clkdev(clk, "uart_mux.1", NULL); |
@@ -219,7 +221,8 @@ void __init pxa168_clk_init(void) | |||
219 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); | 221 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); |
220 | 222 | ||
221 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, | 223 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, |
222 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 224 | ARRAY_SIZE(uart_parent), |
225 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
223 | apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); | 226 | apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); |
224 | clk_set_parent(clk, uart_pll); | 227 | clk_set_parent(clk, uart_pll); |
225 | clk_register_clkdev(clk, "uart_mux.2", NULL); | 228 | clk_register_clkdev(clk, "uart_mux.2", NULL); |
@@ -229,7 +232,8 @@ void __init pxa168_clk_init(void) | |||
229 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); | 232 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); |
230 | 233 | ||
231 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, | 234 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, |
232 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 235 | ARRAY_SIZE(ssp_parent), |
236 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
233 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); | 237 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); |
234 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 238 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
235 | 239 | ||
@@ -238,7 +242,8 @@ void __init pxa168_clk_init(void) | |||
238 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); | 242 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); |
239 | 243 | ||
240 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, | 244 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, |
241 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 245 | ARRAY_SIZE(ssp_parent), |
246 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
242 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); | 247 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); |
243 | clk_register_clkdev(clk, "ssp_mux.1", NULL); | 248 | clk_register_clkdev(clk, "ssp_mux.1", NULL); |
244 | 249 | ||
@@ -247,7 +252,8 @@ void __init pxa168_clk_init(void) | |||
247 | clk_register_clkdev(clk, NULL, "mmp-ssp.1"); | 252 | clk_register_clkdev(clk, NULL, "mmp-ssp.1"); |
248 | 253 | ||
249 | clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, | 254 | clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, |
250 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 255 | ARRAY_SIZE(ssp_parent), |
256 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
251 | apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); | 257 | apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); |
252 | clk_register_clkdev(clk, "ssp_mux.2", NULL); | 258 | clk_register_clkdev(clk, "ssp_mux.2", NULL); |
253 | 259 | ||
@@ -256,7 +262,8 @@ void __init pxa168_clk_init(void) | |||
256 | clk_register_clkdev(clk, NULL, "mmp-ssp.2"); | 262 | clk_register_clkdev(clk, NULL, "mmp-ssp.2"); |
257 | 263 | ||
258 | clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, | 264 | clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, |
259 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 265 | ARRAY_SIZE(ssp_parent), |
266 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
260 | apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); | 267 | apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); |
261 | clk_register_clkdev(clk, "ssp_mux.3", NULL); | 268 | clk_register_clkdev(clk, "ssp_mux.3", NULL); |
262 | 269 | ||
@@ -265,7 +272,8 @@ void __init pxa168_clk_init(void) | |||
265 | clk_register_clkdev(clk, NULL, "mmp-ssp.3"); | 272 | clk_register_clkdev(clk, NULL, "mmp-ssp.3"); |
266 | 273 | ||
267 | clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent, | 274 | clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent, |
268 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 275 | ARRAY_SIZE(ssp_parent), |
276 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
269 | apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock); | 277 | apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock); |
270 | clk_register_clkdev(clk, "ssp_mux.4", NULL); | 278 | clk_register_clkdev(clk, "ssp_mux.4", NULL); |
271 | 279 | ||
@@ -278,7 +286,8 @@ void __init pxa168_clk_init(void) | |||
278 | clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); | 286 | clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); |
279 | 287 | ||
280 | clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, | 288 | clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, |
281 | ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, | 289 | ARRAY_SIZE(sdh_parent), |
290 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
282 | apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); | 291 | apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); |
283 | clk_register_clkdev(clk, "sdh0_mux", NULL); | 292 | clk_register_clkdev(clk, "sdh0_mux", NULL); |
284 | 293 | ||
@@ -287,7 +296,8 @@ void __init pxa168_clk_init(void) | |||
287 | clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); | 296 | clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); |
288 | 297 | ||
289 | clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, | 298 | clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, |
290 | ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, | 299 | ARRAY_SIZE(sdh_parent), |
300 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
291 | apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); | 301 | apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); |
292 | clk_register_clkdev(clk, "sdh1_mux", NULL); | 302 | clk_register_clkdev(clk, "sdh1_mux", NULL); |
293 | 303 | ||
@@ -304,7 +314,8 @@ void __init pxa168_clk_init(void) | |||
304 | clk_register_clkdev(clk, "sph_clk", NULL); | 314 | clk_register_clkdev(clk, "sph_clk", NULL); |
305 | 315 | ||
306 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, | 316 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, |
307 | ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, | 317 | ARRAY_SIZE(disp_parent), |
318 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
308 | apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); | 319 | apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); |
309 | clk_register_clkdev(clk, "disp_mux.0", NULL); | 320 | clk_register_clkdev(clk, "disp_mux.0", NULL); |
310 | 321 | ||
@@ -317,7 +328,8 @@ void __init pxa168_clk_init(void) | |||
317 | clk_register_clkdev(clk, "hclk", "mmp-disp.0"); | 328 | clk_register_clkdev(clk, "hclk", "mmp-disp.0"); |
318 | 329 | ||
319 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, | 330 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, |
320 | ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, | 331 | ARRAY_SIZE(ccic_parent), |
332 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
321 | apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); | 333 | apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); |
322 | clk_register_clkdev(clk, "ccic_mux.0", NULL); | 334 | clk_register_clkdev(clk, "ccic_mux.0", NULL); |
323 | 335 | ||
@@ -327,8 +339,8 @@ void __init pxa168_clk_init(void) | |||
327 | 339 | ||
328 | clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, | 340 | clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, |
329 | ARRAY_SIZE(ccic_phy_parent), | 341 | ARRAY_SIZE(ccic_phy_parent), |
330 | CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, | 342 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, |
331 | 7, 1, 0, &clk_lock); | 343 | apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock); |
332 | clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); | 344 | clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); |
333 | 345 | ||
334 | clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux", | 346 | clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux", |
diff --git a/drivers/clk/mmp/clk-pxa910.c b/drivers/clk/mmp/clk-pxa910.c index 6ec05698ed38..9efc6a47535d 100644 --- a/drivers/clk/mmp/clk-pxa910.c +++ b/drivers/clk/mmp/clk-pxa910.c | |||
@@ -204,7 +204,8 @@ void __init pxa910_clk_init(void) | |||
204 | clk_register_clkdev(clk, NULL, "pxa910-pwm.3"); | 204 | clk_register_clkdev(clk, NULL, "pxa910-pwm.3"); |
205 | 205 | ||
206 | clk = clk_register_mux(NULL, "uart0_mux", uart_parent, | 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 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); | 209 | apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); |
209 | clk_set_parent(clk, uart_pll); | 210 | clk_set_parent(clk, uart_pll); |
210 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 211 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
@@ -214,7 +215,8 @@ void __init pxa910_clk_init(void) | |||
214 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); | 215 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); |
215 | 216 | ||
216 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, | 217 | clk = clk_register_mux(NULL, "uart1_mux", uart_parent, |
217 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 218 | ARRAY_SIZE(uart_parent), |
219 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
218 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); | 220 | apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); |
219 | clk_set_parent(clk, uart_pll); | 221 | clk_set_parent(clk, uart_pll); |
220 | clk_register_clkdev(clk, "uart_mux.1", NULL); | 222 | clk_register_clkdev(clk, "uart_mux.1", NULL); |
@@ -224,7 +226,8 @@ void __init pxa910_clk_init(void) | |||
224 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); | 226 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); |
225 | 227 | ||
226 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, | 228 | clk = clk_register_mux(NULL, "uart2_mux", uart_parent, |
227 | ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT, | 229 | ARRAY_SIZE(uart_parent), |
230 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
228 | apbcp_base + APBCP_UART2, 4, 3, 0, &clk_lock); | 231 | apbcp_base + APBCP_UART2, 4, 3, 0, &clk_lock); |
229 | clk_set_parent(clk, uart_pll); | 232 | clk_set_parent(clk, uart_pll); |
230 | clk_register_clkdev(clk, "uart_mux.2", NULL); | 233 | clk_register_clkdev(clk, "uart_mux.2", NULL); |
@@ -234,7 +237,8 @@ void __init pxa910_clk_init(void) | |||
234 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); | 237 | clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); |
235 | 238 | ||
236 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, | 239 | clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, |
237 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 240 | ARRAY_SIZE(ssp_parent), |
241 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
238 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); | 242 | apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); |
239 | clk_register_clkdev(clk, "uart_mux.0", NULL); | 243 | clk_register_clkdev(clk, "uart_mux.0", NULL); |
240 | 244 | ||
@@ -243,7 +247,8 @@ void __init pxa910_clk_init(void) | |||
243 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); | 247 | clk_register_clkdev(clk, NULL, "mmp-ssp.0"); |
244 | 248 | ||
245 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, | 249 | clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, |
246 | ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT, | 250 | ARRAY_SIZE(ssp_parent), |
251 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
247 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); | 252 | apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); |
248 | clk_register_clkdev(clk, "ssp_mux.1", NULL); | 253 | clk_register_clkdev(clk, "ssp_mux.1", NULL); |
249 | 254 | ||
@@ -256,7 +261,8 @@ void __init pxa910_clk_init(void) | |||
256 | clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); | 261 | clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); |
257 | 262 | ||
258 | clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, | 263 | clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, |
259 | ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, | 264 | ARRAY_SIZE(sdh_parent), |
265 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
260 | apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); | 266 | apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); |
261 | clk_register_clkdev(clk, "sdh0_mux", NULL); | 267 | clk_register_clkdev(clk, "sdh0_mux", NULL); |
262 | 268 | ||
@@ -265,7 +271,8 @@ void __init pxa910_clk_init(void) | |||
265 | clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); | 271 | clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); |
266 | 272 | ||
267 | clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, | 273 | clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, |
268 | ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT, | 274 | ARRAY_SIZE(sdh_parent), |
275 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
269 | apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); | 276 | apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); |
270 | clk_register_clkdev(clk, "sdh1_mux", NULL); | 277 | clk_register_clkdev(clk, "sdh1_mux", NULL); |
271 | 278 | ||
@@ -282,7 +289,8 @@ void __init pxa910_clk_init(void) | |||
282 | clk_register_clkdev(clk, "sph_clk", NULL); | 289 | clk_register_clkdev(clk, "sph_clk", NULL); |
283 | 290 | ||
284 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, | 291 | clk = clk_register_mux(NULL, "disp0_mux", disp_parent, |
285 | ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT, | 292 | ARRAY_SIZE(disp_parent), |
293 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
286 | apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); | 294 | apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); |
287 | clk_register_clkdev(clk, "disp_mux.0", NULL); | 295 | clk_register_clkdev(clk, "disp_mux.0", NULL); |
288 | 296 | ||
@@ -291,7 +299,8 @@ void __init pxa910_clk_init(void) | |||
291 | clk_register_clkdev(clk, NULL, "mmp-disp.0"); | 299 | clk_register_clkdev(clk, NULL, "mmp-disp.0"); |
292 | 300 | ||
293 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, | 301 | clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, |
294 | ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT, | 302 | ARRAY_SIZE(ccic_parent), |
303 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
295 | apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); | 304 | apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); |
296 | clk_register_clkdev(clk, "ccic_mux.0", NULL); | 305 | clk_register_clkdev(clk, "ccic_mux.0", NULL); |
297 | 306 | ||
@@ -301,8 +310,8 @@ void __init pxa910_clk_init(void) | |||
301 | 310 | ||
302 | clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, | 311 | clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, |
303 | ARRAY_SIZE(ccic_phy_parent), | 312 | ARRAY_SIZE(ccic_phy_parent), |
304 | CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, | 313 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, |
305 | 7, 1, 0, &clk_lock); | 314 | apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock); |
306 | clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); | 315 | clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); |
307 | 316 | ||
308 | clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux", | 317 | clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux", |
diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c index 079960e7c304..fc777bdc1886 100644 --- a/drivers/clk/mvebu/armada-370.c +++ b/drivers/clk/mvebu/armada-370.c | |||
@@ -32,13 +32,13 @@ | |||
32 | 32 | ||
33 | enum { A370_CPU_TO_NBCLK, A370_CPU_TO_HCLK, A370_CPU_TO_DRAMCLK }; | 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 | { .id = A370_CPU_TO_NBCLK, .name = "nbclk" }, | 36 | { .id = A370_CPU_TO_NBCLK, .name = "nbclk" }, |
37 | { .id = A370_CPU_TO_HCLK, .name = "hclk" }, | 37 | { .id = A370_CPU_TO_HCLK, .name = "hclk" }, |
38 | { .id = A370_CPU_TO_DRAMCLK, .name = "dramclk" }, | 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 | 16600000, | 42 | 16600000, |
43 | 20000000, | 43 | 20000000, |
44 | }; | 44 | }; |
@@ -52,7 +52,7 @@ static u32 __init a370_get_tclk_freq(void __iomem *sar) | |||
52 | return a370_tclk_freqs[tclk_freq_select]; | 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 | 400000000, | 56 | 400000000, |
57 | 533000000, | 57 | 533000000, |
58 | 667000000, | 58 | 667000000, |
@@ -78,7 +78,7 @@ static u32 __init a370_get_cpu_freq(void __iomem *sar) | |||
78 | return cpu_freq; | 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 | {0, 1}, {1, 2}, {2, 2}, {2, 2}, | 82 | {0, 1}, {1, 2}, {2, 2}, {2, 2}, |
83 | {1, 2}, {1, 2}, {1, 1}, {2, 3}, | 83 | {1, 2}, {1, 2}, {1, 1}, {2, 3}, |
84 | {0, 1}, {1, 2}, {2, 4}, {0, 1}, | 84 | {0, 1}, {1, 2}, {2, 4}, {0, 1}, |
@@ -89,7 +89,7 @@ static const int __initconst a370_nbclk_ratios[32][2] = { | |||
89 | {0, 1}, {0, 1}, {0, 1}, {0, 1}, | 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 | {0, 1}, {1, 2}, {2, 6}, {2, 3}, | 93 | {0, 1}, {1, 2}, {2, 6}, {2, 3}, |
94 | {1, 3}, {1, 4}, {1, 2}, {2, 6}, | 94 | {1, 3}, {1, 4}, {1, 2}, {2, 6}, |
95 | {0, 1}, {1, 6}, {2, 10}, {0, 1}, | 95 | {0, 1}, {1, 6}, {2, 10}, {0, 1}, |
@@ -100,7 +100,7 @@ static const int __initconst a370_hclk_ratios[32][2] = { | |||
100 | {0, 1}, {0, 1}, {0, 1}, {0, 1}, | 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 | {0, 1}, {1, 2}, {2, 3}, {2, 3}, | 104 | {0, 1}, {1, 2}, {2, 3}, {2, 3}, |
105 | {1, 3}, {1, 2}, {1, 2}, {2, 6}, | 105 | {1, 3}, {1, 2}, {1, 2}, {2, 6}, |
106 | {0, 1}, {1, 3}, {2, 5}, {0, 1}, | 106 | {0, 1}, {1, 3}, {2, 5}, {0, 1}, |
@@ -152,7 +152,7 @@ CLK_OF_DECLARE(a370_core_clk, "marvell,armada-370-core-clock", | |||
152 | * Clock Gating Control | 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 | { "audio", NULL, 0, 0 }, | 156 | { "audio", NULL, 0, 0 }, |
157 | { "pex0_en", NULL, 1, 0 }, | 157 | { "pex0_en", NULL, 1, 0 }, |
158 | { "pex1_en", NULL, 2, 0 }, | 158 | { "pex1_en", NULL, 2, 0 }, |
diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c index 13b62ceb3407..9922c4475aa8 100644 --- a/drivers/clk/mvebu/armada-xp.c +++ b/drivers/clk/mvebu/armada-xp.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | enum { AXP_CPU_TO_NBCLK, AXP_CPU_TO_HCLK, AXP_CPU_TO_DRAMCLK }; | 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 | { .id = AXP_CPU_TO_NBCLK, .name = "nbclk" }, | 44 | { .id = AXP_CPU_TO_NBCLK, .name = "nbclk" }, |
45 | { .id = AXP_CPU_TO_HCLK, .name = "hclk" }, | 45 | { .id = AXP_CPU_TO_HCLK, .name = "hclk" }, |
46 | { .id = AXP_CPU_TO_DRAMCLK, .name = "dramclk" }, | 46 | { .id = AXP_CPU_TO_DRAMCLK, .name = "dramclk" }, |
@@ -52,7 +52,7 @@ static u32 __init axp_get_tclk_freq(void __iomem *sar) | |||
52 | return 250000000; | 52 | return 250000000; |
53 | } | 53 | } |
54 | 54 | ||
55 | static const u32 __initconst axp_cpu_freqs[] = { | 55 | static const u32 axp_cpu_freqs[] __initconst = { |
56 | 1000000000, | 56 | 1000000000, |
57 | 1066000000, | 57 | 1066000000, |
58 | 1200000000, | 58 | 1200000000, |
@@ -89,7 +89,7 @@ static u32 __init axp_get_cpu_freq(void __iomem *sar) | |||
89 | return cpu_freq; | 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 | {0, 1}, {1, 2}, {2, 2}, {2, 2}, | 93 | {0, 1}, {1, 2}, {2, 2}, {2, 2}, |
94 | {1, 2}, {1, 2}, {1, 1}, {2, 3}, | 94 | {1, 2}, {1, 2}, {1, 1}, {2, 3}, |
95 | {0, 1}, {1, 2}, {2, 4}, {0, 1}, | 95 | {0, 1}, {1, 2}, {2, 4}, {0, 1}, |
@@ -100,7 +100,7 @@ static const int __initconst axp_nbclk_ratios[32][2] = { | |||
100 | {0, 1}, {0, 1}, {0, 1}, {0, 1}, | 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 | {0, 1}, {1, 2}, {2, 6}, {2, 3}, | 104 | {0, 1}, {1, 2}, {2, 6}, {2, 3}, |
105 | {1, 3}, {1, 4}, {1, 2}, {2, 6}, | 105 | {1, 3}, {1, 4}, {1, 2}, {2, 6}, |
106 | {0, 1}, {1, 6}, {2, 10}, {0, 1}, | 106 | {0, 1}, {1, 6}, {2, 10}, {0, 1}, |
@@ -111,7 +111,7 @@ static const int __initconst axp_hclk_ratios[32][2] = { | |||
111 | {0, 1}, {0, 1}, {0, 1}, {0, 1}, | 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 | {0, 1}, {1, 2}, {2, 3}, {2, 3}, | 115 | {0, 1}, {1, 2}, {2, 3}, {2, 3}, |
116 | {1, 3}, {1, 2}, {1, 2}, {2, 6}, | 116 | {1, 3}, {1, 2}, {1, 2}, {2, 6}, |
117 | {0, 1}, {1, 3}, {2, 5}, {0, 1}, | 117 | {0, 1}, {1, 3}, {2, 5}, {0, 1}, |
@@ -169,7 +169,7 @@ CLK_OF_DECLARE(axp_core_clk, "marvell,armada-xp-core-clock", | |||
169 | * Clock Gating Control | 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 | { "audio", NULL, 0, 0 }, | 173 | { "audio", NULL, 0, 0 }, |
174 | { "ge3", NULL, 1, 0 }, | 174 | { "ge3", NULL, 1, 0 }, |
175 | { "ge2", NULL, 2, 0 }, | 175 | { "ge2", NULL, 2, 0 }, |
diff --git a/drivers/clk/mvebu/clk-cpu.c b/drivers/clk/mvebu/clk-cpu.c index b0fbc0715491..1466865b0743 100644 --- a/drivers/clk/mvebu/clk-cpu.c +++ b/drivers/clk/mvebu/clk-cpu.c | |||
@@ -119,7 +119,7 @@ void __init of_cpu_clk_setup(struct device_node *node) | |||
119 | 119 | ||
120 | cpuclk = kzalloc(ncpus * sizeof(*cpuclk), GFP_KERNEL); | 120 | cpuclk = kzalloc(ncpus * sizeof(*cpuclk), GFP_KERNEL); |
121 | if (WARN_ON(!cpuclk)) | 121 | if (WARN_ON(!cpuclk)) |
122 | return; | 122 | goto cpuclk_out; |
123 | 123 | ||
124 | clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL); | 124 | clks = kzalloc(ncpus * sizeof(*clks), GFP_KERNEL); |
125 | if (WARN_ON(!clks)) | 125 | if (WARN_ON(!clks)) |
@@ -170,6 +170,8 @@ bail_out: | |||
170 | kfree(cpuclk[ncpus].clk_name); | 170 | kfree(cpuclk[ncpus].clk_name); |
171 | clks_out: | 171 | clks_out: |
172 | kfree(cpuclk); | 172 | kfree(cpuclk); |
173 | cpuclk_out: | ||
174 | iounmap(clock_complex_base); | ||
173 | } | 175 | } |
174 | 176 | ||
175 | CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock", | 177 | CLK_OF_DECLARE(armada_xp_cpu_clock, "marvell,armada-xp-cpu-clock", |
diff --git a/drivers/clk/mvebu/common.c b/drivers/clk/mvebu/common.c index adaa4a1821b8..25ceccf939ad 100644 --- a/drivers/clk/mvebu/common.c +++ b/drivers/clk/mvebu/common.c | |||
@@ -45,8 +45,10 @@ void __init mvebu_coreclk_setup(struct device_node *np, | |||
45 | clk_data.clk_num = 2 + desc->num_ratios; | 45 | clk_data.clk_num = 2 + desc->num_ratios; |
46 | clk_data.clks = kzalloc(clk_data.clk_num * sizeof(struct clk *), | 46 | clk_data.clks = kzalloc(clk_data.clk_num * sizeof(struct clk *), |
47 | GFP_KERNEL); | 47 | GFP_KERNEL); |
48 | if (WARN_ON(!clk_data.clks)) | 48 | if (WARN_ON(!clk_data.clks)) { |
49 | iounmap(base); | ||
49 | return; | 50 | return; |
51 | } | ||
50 | 52 | ||
51 | /* Register TCLK */ | 53 | /* Register TCLK */ |
52 | of_property_read_string_index(np, "clock-output-names", 0, | 54 | of_property_read_string_index(np, "clock-output-names", 0, |
@@ -134,7 +136,7 @@ void __init mvebu_clk_gating_setup(struct device_node *np, | |||
134 | 136 | ||
135 | ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); | 137 | ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); |
136 | if (WARN_ON(!ctrl)) | 138 | if (WARN_ON(!ctrl)) |
137 | return; | 139 | goto ctrl_out; |
138 | 140 | ||
139 | spin_lock_init(&ctrl->lock); | 141 | spin_lock_init(&ctrl->lock); |
140 | 142 | ||
@@ -145,10 +147,8 @@ void __init mvebu_clk_gating_setup(struct device_node *np, | |||
145 | ctrl->num_gates = n; | 147 | ctrl->num_gates = n; |
146 | ctrl->gates = kzalloc(ctrl->num_gates * sizeof(struct clk *), | 148 | ctrl->gates = kzalloc(ctrl->num_gates * sizeof(struct clk *), |
147 | GFP_KERNEL); | 149 | GFP_KERNEL); |
148 | if (WARN_ON(!ctrl->gates)) { | 150 | if (WARN_ON(!ctrl->gates)) |
149 | kfree(ctrl); | 151 | goto gates_out; |
150 | return; | ||
151 | } | ||
152 | 152 | ||
153 | for (n = 0; n < ctrl->num_gates; n++) { | 153 | for (n = 0; n < ctrl->num_gates; n++) { |
154 | const char *parent = | 154 | const char *parent = |
@@ -160,4 +160,10 @@ void __init mvebu_clk_gating_setup(struct device_node *np, | |||
160 | } | 160 | } |
161 | 161 | ||
162 | of_clk_add_provider(np, clk_gating_get_src, ctrl); | 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 | } |
diff --git a/drivers/clk/mvebu/dove.c b/drivers/clk/mvebu/dove.c index 79d7aedf03fb..38aee1e3f242 100644 --- a/drivers/clk/mvebu/dove.c +++ b/drivers/clk/mvebu/dove.c | |||
@@ -74,12 +74,12 @@ | |||
74 | 74 | ||
75 | enum { DOVE_CPU_TO_L2, DOVE_CPU_TO_DDR }; | 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 | { .id = DOVE_CPU_TO_L2, .name = "l2clk", }, | 78 | { .id = DOVE_CPU_TO_L2, .name = "l2clk", }, |
79 | { .id = DOVE_CPU_TO_DDR, .name = "ddrclk", } | 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 | 166666667, | 83 | 166666667, |
84 | 125000000, | 84 | 125000000, |
85 | 0, 0 | 85 | 0, 0 |
@@ -92,7 +92,7 @@ static u32 __init dove_get_tclk_freq(void __iomem *sar) | |||
92 | return dove_tclk_freqs[opt]; | 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 | 0, 0, 0, 0, 0, | 96 | 0, 0, 0, 0, 0, |
97 | 1000000000, | 97 | 1000000000, |
98 | 933333333, 933333333, | 98 | 933333333, 933333333, |
@@ -111,12 +111,12 @@ static u32 __init dove_get_cpu_freq(void __iomem *sar) | |||
111 | return dove_cpu_freqs[opt]; | 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 | { 1, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, | 115 | { 1, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, |
116 | { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 } | 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 | { 1, 1 }, { 0, 1 }, { 1, 2 }, { 2, 5 }, | 120 | { 1, 1 }, { 0, 1 }, { 1, 2 }, { 2, 5 }, |
121 | { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 }, | 121 | { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 }, |
122 | { 1, 5 }, { 0, 1 }, { 1, 6 }, { 0, 1 }, | 122 | { 1, 5 }, { 0, 1 }, { 1, 6 }, { 0, 1 }, |
@@ -164,7 +164,7 @@ CLK_OF_DECLARE(dove_core_clk, "marvell,dove-core-clock", dove_coreclk_init); | |||
164 | * Clock Gating Control | 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 | { "usb0", NULL, 0, 0 }, | 168 | { "usb0", NULL, 0, 0 }, |
169 | { "usb1", NULL, 1, 0 }, | 169 | { "usb1", NULL, 1, 0 }, |
170 | { "ge", "gephy", 2, 0 }, | 170 | { "ge", "gephy", 2, 0 }, |
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c index 71d24619ccdb..2636a55f29f9 100644 --- a/drivers/clk/mvebu/kirkwood.c +++ b/drivers/clk/mvebu/kirkwood.c | |||
@@ -78,7 +78,7 @@ | |||
78 | 78 | ||
79 | enum { KIRKWOOD_CPU_TO_L2, KIRKWOOD_CPU_TO_DDR }; | 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 | { .id = KIRKWOOD_CPU_TO_L2, .name = "l2clk", }, | 82 | { .id = KIRKWOOD_CPU_TO_L2, .name = "l2clk", }, |
83 | { .id = KIRKWOOD_CPU_TO_DDR, .name = "ddrclk", } | 83 | { .id = KIRKWOOD_CPU_TO_DDR, .name = "ddrclk", } |
84 | }; | 84 | }; |
@@ -90,7 +90,7 @@ static u32 __init kirkwood_get_tclk_freq(void __iomem *sar) | |||
90 | return (opt) ? 166666667 : 200000000; | 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 | 0, 0, 0, 0, | 94 | 0, 0, 0, 0, |
95 | 600000000, | 95 | 600000000, |
96 | 0, | 96 | 0, |
@@ -111,12 +111,12 @@ static u32 __init kirkwood_get_cpu_freq(void __iomem *sar) | |||
111 | return kirkwood_cpu_freqs[opt]; | 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 | { 0, 1 }, { 1, 2 }, { 0, 1 }, { 1, 3 }, | 115 | { 0, 1 }, { 1, 2 }, { 0, 1 }, { 1, 3 }, |
116 | { 0, 1 }, { 1, 4 }, { 0, 1 }, { 0, 1 } | 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 | { 0, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, | 120 | { 0, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 }, |
121 | { 1, 3 }, { 0, 1 }, { 1, 4 }, { 2, 9 }, | 121 | { 1, 3 }, { 0, 1 }, { 1, 4 }, { 2, 9 }, |
122 | { 1, 5 }, { 1, 6 }, { 0, 1 }, { 0, 1 }, | 122 | { 1, 5 }, { 1, 6 }, { 0, 1 }, { 0, 1 }, |
@@ -145,7 +145,7 @@ static void __init kirkwood_get_clk_ratio( | |||
145 | } | 145 | } |
146 | } | 146 | } |
147 | 147 | ||
148 | static const u32 __initconst mv88f6180_cpu_freqs[] = { | 148 | static const u32 mv88f6180_cpu_freqs[] __initconst = { |
149 | 0, 0, 0, 0, 0, | 149 | 0, 0, 0, 0, 0, |
150 | 600000000, | 150 | 600000000, |
151 | 800000000, | 151 | 800000000, |
@@ -158,7 +158,7 @@ static u32 __init mv88f6180_get_cpu_freq(void __iomem *sar) | |||
158 | return mv88f6180_cpu_freqs[opt]; | 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 | { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 }, | 162 | { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 }, |
163 | { 0, 1 }, { 1, 3 }, { 1, 4 }, { 1, 5 } | 163 | { 0, 1 }, { 1, 3 }, { 1, 4 }, { 1, 5 } |
164 | }; | 164 | }; |
@@ -219,7 +219,7 @@ CLK_OF_DECLARE(mv88f6180_core_clk, "marvell,mv88f6180-core-clock", | |||
219 | * Clock Gating Control | 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 | { "ge0", NULL, 0, 0 }, | 223 | { "ge0", NULL, 0, 0 }, |
224 | { "pex0", NULL, 2, 0 }, | 224 | { "pex0", NULL, 2, 0 }, |
225 | { "usb0", NULL, 3, 0 }, | 225 | { "usb0", NULL, 3, 0 }, |
diff --git a/drivers/clk/mxs/clk-imx23.c b/drivers/clk/mxs/clk-imx23.c index f6a74872f14e..c396fe361589 100644 --- a/drivers/clk/mxs/clk-imx23.c +++ b/drivers/clk/mxs/clk-imx23.c | |||
@@ -10,6 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/clk.h> | 12 | #include <linux/clk.h> |
13 | #include <linux/clk/mxs.h> | ||
13 | #include <linux/clkdev.h> | 14 | #include <linux/clkdev.h> |
14 | #include <linux/err.h> | 15 | #include <linux/err.h> |
15 | #include <linux/init.h> | 16 | #include <linux/init.h> |
diff --git a/drivers/clk/mxs/clk.h b/drivers/clk/mxs/clk.h index 81421e28e69c..ef10ad9b5daa 100644 --- a/drivers/clk/mxs/clk.h +++ b/drivers/clk/mxs/clk.h | |||
@@ -52,8 +52,8 @@ static inline struct clk *mxs_clk_mux(const char *name, void __iomem *reg, | |||
52 | u8 shift, u8 width, const char **parent_names, int num_parents) | 52 | u8 shift, u8 width, const char **parent_names, int num_parents) |
53 | { | 53 | { |
54 | return clk_register_mux(NULL, name, parent_names, num_parents, | 54 | return clk_register_mux(NULL, name, parent_names, num_parents, |
55 | CLK_SET_RATE_PARENT, reg, shift, width, | 55 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, |
56 | 0, &mxs_lock); | 56 | reg, shift, width, 0, &mxs_lock); |
57 | } | 57 | } |
58 | 58 | ||
59 | static inline struct clk *mxs_clk_fixed_factor(const char *name, | 59 | static inline struct clk *mxs_clk_fixed_factor(const char *name, |
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile index 5d4d432cc4ac..3413380086d5 100644 --- a/drivers/clk/samsung/Makefile +++ b/drivers/clk/samsung/Makefile | |||
@@ -8,3 +8,6 @@ obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o | |||
8 | obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o | 8 | obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o |
9 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o | 9 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o |
10 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o | 10 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o |
11 | ifdef CONFIG_COMMON_CLK | ||
12 | obj-$(CONFIG_ARCH_S3C64XX) += clk-s3c64xx.o | ||
13 | endif | ||
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c index 9b1bbd52fd1f..39b40aaede2b 100644 --- a/drivers/clk/samsung/clk-exynos-audss.c +++ b/drivers/clk/samsung/clk-exynos-audss.c | |||
@@ -62,7 +62,7 @@ static struct syscore_ops exynos_audss_clk_syscore_ops = { | |||
62 | #endif /* CONFIG_PM_SLEEP */ | 62 | #endif /* CONFIG_PM_SLEEP */ |
63 | 63 | ||
64 | /* register exynos_audss clocks */ | 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 | reg_base = of_iomap(np, 0); | 67 | reg_base = of_iomap(np, 0); |
68 | if (!reg_base) { | 68 | if (!reg_base) { |
@@ -82,11 +82,13 @@ void __init exynos_audss_clk_init(struct device_node *np) | |||
82 | of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); | 82 | of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); |
83 | 83 | ||
84 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", | 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 | reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); | 87 | reg_base + ASS_CLK_SRC, 0, 1, 0, &lock); |
87 | 88 | ||
88 | clk_table[EXYNOS_MOUT_I2S] = clk_register_mux(NULL, "mout_i2s", | 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 | reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); | 92 | reg_base + ASS_CLK_SRC, 2, 2, 0, &lock); |
91 | 93 | ||
92 | clk_table[EXYNOS_DOUT_SRP] = clk_register_divider(NULL, "dout_srp", | 94 | clk_table[EXYNOS_DOUT_SRP] = clk_register_divider(NULL, "dout_srp", |
diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c index 4e5739773c33..ad5ff50c5f28 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include "clk.h" | 19 | #include "clk.h" |
20 | #include "clk-pll.h" | ||
21 | 20 | ||
22 | /* Exynos4 clock controller register offsets */ | 21 | /* Exynos4 clock controller register offsets */ |
23 | #define SRC_LEFTBUS 0x4200 | 22 | #define SRC_LEFTBUS 0x4200 |
@@ -97,12 +96,15 @@ | |||
97 | #define GATE_IP_PERIL 0xc950 | 96 | #define GATE_IP_PERIL 0xc950 |
98 | #define E4210_GATE_IP_PERIR 0xc960 | 97 | #define E4210_GATE_IP_PERIR 0xc960 |
99 | #define GATE_BLOCK 0xc970 | 98 | #define GATE_BLOCK 0xc970 |
99 | #define E4X12_MPLL_LOCK 0x10008 | ||
100 | #define E4X12_MPLL_CON0 0x10108 | 100 | #define E4X12_MPLL_CON0 0x10108 |
101 | #define SRC_DMC 0x10200 | 101 | #define SRC_DMC 0x10200 |
102 | #define SRC_MASK_DMC 0x10300 | 102 | #define SRC_MASK_DMC 0x10300 |
103 | #define DIV_DMC0 0x10500 | 103 | #define DIV_DMC0 0x10500 |
104 | #define DIV_DMC1 0x10504 | 104 | #define DIV_DMC1 0x10504 |
105 | #define GATE_IP_DMC 0x10900 | 105 | #define GATE_IP_DMC 0x10900 |
106 | #define APLL_LOCK 0x14000 | ||
107 | #define E4210_MPLL_LOCK 0x14008 | ||
106 | #define APLL_CON0 0x14100 | 108 | #define APLL_CON0 0x14100 |
107 | #define E4210_MPLL_CON0 0x14108 | 109 | #define E4210_MPLL_CON0 0x14108 |
108 | #define SRC_CPU 0x14200 | 110 | #define SRC_CPU 0x14200 |
@@ -121,6 +123,12 @@ enum exynos4_soc { | |||
121 | EXYNOS4X12, | 123 | EXYNOS4X12, |
122 | }; | 124 | }; |
123 | 125 | ||
126 | /* list of PLLs to be registered */ | ||
127 | enum exynos4_plls { | ||
128 | apll, mpll, epll, vpll, | ||
129 | nr_plls /* number of PLLs */ | ||
130 | }; | ||
131 | |||
124 | /* | 132 | /* |
125 | * Let each supported clock get a unique id. This id is used to lookup the clock | 133 | * Let each supported clock get a unique id. This id is used to lookup the clock |
126 | * for device tree based platforms. The clocks are categorized into three | 134 | * for device tree based platforms. The clocks are categorized into three |
@@ -169,7 +177,7 @@ enum exynos4_clks { | |||
169 | gicisp, smmu_isp, smmu_drc, smmu_fd, smmu_lite0, smmu_lite1, mcuctl_isp, | 177 | gicisp, smmu_isp, smmu_drc, smmu_fd, smmu_lite0, smmu_lite1, mcuctl_isp, |
170 | mpwm_isp, i2c0_isp, i2c1_isp, mtcadc_isp, pwm_isp, wdt_isp, uart_isp, | 178 | mpwm_isp, i2c0_isp, i2c1_isp, mtcadc_isp, pwm_isp, wdt_isp, uart_isp, |
171 | asyncaxim, smmu_ispcx, spi0_isp, spi1_isp, pwm_isp_sclk, spi0_isp_sclk, | 179 | asyncaxim, smmu_ispcx, spi0_isp, spi1_isp, pwm_isp_sclk, spi0_isp_sclk, |
172 | spi1_isp_sclk, uart_isp_sclk, | 180 | spi1_isp_sclk, uart_isp_sclk, tmu_apbif, |
173 | 181 | ||
174 | /* mux clocks */ | 182 | /* mux clocks */ |
175 | mout_fimc0 = 384, mout_fimc1, mout_fimc2, mout_fimc3, mout_cam0, | 183 | mout_fimc0 = 384, mout_fimc1, mout_fimc2, mout_fimc3, mout_cam0, |
@@ -187,7 +195,7 @@ enum exynos4_clks { | |||
187 | * list of controller registers to be saved and restored during a | 195 | * list of controller registers to be saved and restored during a |
188 | * suspend/resume cycle. | 196 | * suspend/resume cycle. |
189 | */ | 197 | */ |
190 | static __initdata unsigned long exynos4210_clk_save[] = { | 198 | static unsigned long exynos4210_clk_save[] __initdata = { |
191 | E4210_SRC_IMAGE, | 199 | E4210_SRC_IMAGE, |
192 | E4210_SRC_LCD1, | 200 | E4210_SRC_LCD1, |
193 | E4210_SRC_MASK_LCD1, | 201 | E4210_SRC_MASK_LCD1, |
@@ -198,7 +206,7 @@ static __initdata unsigned long exynos4210_clk_save[] = { | |||
198 | E4210_MPLL_CON0, | 206 | E4210_MPLL_CON0, |
199 | }; | 207 | }; |
200 | 208 | ||
201 | static __initdata unsigned long exynos4x12_clk_save[] = { | 209 | static unsigned long exynos4x12_clk_save[] __initdata = { |
202 | E4X12_GATE_IP_IMAGE, | 210 | E4X12_GATE_IP_IMAGE, |
203 | E4X12_GATE_IP_PERIR, | 211 | E4X12_GATE_IP_PERIR, |
204 | E4X12_SRC_CAM1, | 212 | E4X12_SRC_CAM1, |
@@ -207,7 +215,7 @@ static __initdata unsigned long exynos4x12_clk_save[] = { | |||
207 | E4X12_MPLL_CON0, | 215 | E4X12_MPLL_CON0, |
208 | }; | 216 | }; |
209 | 217 | ||
210 | static __initdata unsigned long exynos4_clk_regs[] = { | 218 | static unsigned long exynos4_clk_regs[] __initdata = { |
211 | SRC_LEFTBUS, | 219 | SRC_LEFTBUS, |
212 | DIV_LEFTBUS, | 220 | DIV_LEFTBUS, |
213 | GATE_IP_LEFTBUS, | 221 | GATE_IP_LEFTBUS, |
@@ -338,24 +346,24 @@ PNAME(mout_user_aclk200_p4x12) = {"fin_pll", "div_aclk200", }; | |||
338 | PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; | 346 | PNAME(mout_user_aclk266_gps_p4x12) = {"fin_pll", "div_aclk266_gps", }; |
339 | 347 | ||
340 | /* fixed rate clocks generated outside the soc */ | 348 | /* fixed rate clocks generated outside the soc */ |
341 | struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { | 349 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata = { |
342 | FRATE(xxti, "xxti", NULL, CLK_IS_ROOT, 0), | 350 | FRATE(xxti, "xxti", NULL, CLK_IS_ROOT, 0), |
343 | FRATE(xusbxti, "xusbxti", NULL, CLK_IS_ROOT, 0), | 351 | FRATE(xusbxti, "xusbxti", NULL, CLK_IS_ROOT, 0), |
344 | }; | 352 | }; |
345 | 353 | ||
346 | /* fixed rate clocks generated inside the soc */ | 354 | /* fixed rate clocks generated inside the soc */ |
347 | struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { | 355 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { |
348 | FRATE(none, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), | 356 | FRATE(none, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), |
349 | FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), | 357 | FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), |
350 | FRATE(none, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), | 358 | FRATE(none, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), |
351 | }; | 359 | }; |
352 | 360 | ||
353 | struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = { | 361 | static struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = { |
354 | FRATE(none, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000), | 362 | FRATE(none, "sclk_usbphy1", NULL, CLK_IS_ROOT, 48000000), |
355 | }; | 363 | }; |
356 | 364 | ||
357 | /* list of mux clocks supported in all exynos4 soc's */ | 365 | /* list of mux clocks supported in all exynos4 soc's */ |
358 | struct samsung_mux_clock exynos4_mux_clks[] __initdata = { | 366 | static struct samsung_mux_clock exynos4_mux_clks[] __initdata = { |
359 | MUX_FA(mout_apll, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, | 367 | MUX_FA(mout_apll, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, |
360 | CLK_SET_RATE_PARENT, 0, "mout_apll"), | 368 | CLK_SET_RATE_PARENT, 0, "mout_apll"), |
361 | MUX(none, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), | 369 | MUX(none, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), |
@@ -367,17 +375,20 @@ struct samsung_mux_clock exynos4_mux_clks[] __initdata = { | |||
367 | CLK_SET_RATE_PARENT, 0), | 375 | CLK_SET_RATE_PARENT, 0), |
368 | MUX(none, "mout_spdif", mout_spdif_p, SRC_PERIL1, 8, 2), | 376 | MUX(none, "mout_spdif", mout_spdif_p, SRC_PERIL1, 8, 2), |
369 | MUX(none, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), | 377 | MUX(none, "mout_onenand1", mout_onenand1_p, SRC_TOP0, 0, 1), |
370 | MUX_A(sclk_epll, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1, "sclk_epll"), | 378 | MUX(sclk_epll, "sclk_epll", mout_epll_p, SRC_TOP0, 4, 1), |
371 | MUX(none, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), | 379 | MUX(none, "mout_onenand", mout_onenand_p, SRC_TOP0, 28, 1), |
372 | }; | 380 | }; |
373 | 381 | ||
374 | /* list of mux clocks supported in exynos4210 soc */ | 382 | /* list of mux clocks supported in exynos4210 soc */ |
375 | struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | 383 | static struct samsung_mux_clock exynos4210_mux_early[] __initdata = { |
384 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), | ||
385 | }; | ||
386 | |||
387 | static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | ||
376 | MUX(none, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), | 388 | MUX(none, "mout_aclk200", sclk_ampll_p4210, SRC_TOP0, 12, 1), |
377 | MUX(none, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), | 389 | MUX(none, "mout_aclk100", sclk_ampll_p4210, SRC_TOP0, 16, 1), |
378 | MUX(none, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), | 390 | MUX(none, "mout_aclk160", sclk_ampll_p4210, SRC_TOP0, 20, 1), |
379 | MUX(none, "mout_aclk133", sclk_ampll_p4210, SRC_TOP0, 24, 1), | 391 | MUX(none, "mout_aclk133", sclk_ampll_p4210, SRC_TOP0, 24, 1), |
380 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1), | ||
381 | MUX(none, "mout_mixer", mout_mixer_p4210, SRC_TV, 4, 1), | 392 | MUX(none, "mout_mixer", mout_mixer_p4210, SRC_TV, 4, 1), |
382 | MUX(none, "mout_dac", mout_dac_p4210, SRC_TV, 8, 1), | 393 | MUX(none, "mout_dac", mout_dac_p4210, SRC_TV, 8, 1), |
383 | MUX(none, "mout_g2d0", sclk_ampll_p4210, E4210_SRC_IMAGE, 0, 1), | 394 | MUX(none, "mout_g2d0", sclk_ampll_p4210, E4210_SRC_IMAGE, 0, 1), |
@@ -385,11 +396,9 @@ struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | |||
385 | MUX(none, "mout_g2d", mout_g2d_p, E4210_SRC_IMAGE, 8, 1), | 396 | MUX(none, "mout_g2d", mout_g2d_p, E4210_SRC_IMAGE, 8, 1), |
386 | MUX(none, "mout_fimd1", group1_p4210, E4210_SRC_LCD1, 0, 4), | 397 | MUX(none, "mout_fimd1", group1_p4210, E4210_SRC_LCD1, 0, 4), |
387 | MUX(none, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), | 398 | MUX(none, "mout_mipi1", group1_p4210, E4210_SRC_LCD1, 12, 4), |
388 | MUX_A(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1, "mout_mpll"), | 399 | MUX(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_CPU, 8, 1), |
389 | MUX_A(mout_core, "mout_core", mout_core_p4210, | 400 | MUX(mout_core, "mout_core", mout_core_p4210, SRC_CPU, 16, 1), |
390 | SRC_CPU, 16, 1, "moutcore"), | 401 | MUX(sclk_vpll, "sclk_vpll", sclk_vpll_p4210, SRC_TOP0, 8, 1), |
391 | MUX_A(sclk_vpll, "sclk_vpll", sclk_vpll_p4210, | ||
392 | SRC_TOP0, 8, 1, "sclk_vpll"), | ||
393 | MUX(mout_fimc0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), | 402 | MUX(mout_fimc0, "mout_fimc0", group1_p4210, SRC_CAM, 0, 4), |
394 | MUX(mout_fimc1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), | 403 | MUX(mout_fimc1, "mout_fimc1", group1_p4210, SRC_CAM, 4, 4), |
395 | MUX(mout_fimc2, "mout_fimc2", group1_p4210, SRC_CAM, 8, 4), | 404 | MUX(mout_fimc2, "mout_fimc2", group1_p4210, SRC_CAM, 8, 4), |
@@ -423,9 +432,9 @@ struct samsung_mux_clock exynos4210_mux_clks[] __initdata = { | |||
423 | }; | 432 | }; |
424 | 433 | ||
425 | /* list of mux clocks supported in exynos4x12 soc */ | 434 | /* list of mux clocks supported in exynos4x12 soc */ |
426 | struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | 435 | static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { |
427 | MUX_A(mout_mpll_user_c, "mout_mpll_user_c", mout_mpll_user_p4x12, | 436 | MUX(mout_mpll_user_c, "mout_mpll_user_c", mout_mpll_user_p4x12, |
428 | SRC_CPU, 24, 1, "mout_mpll"), | 437 | SRC_CPU, 24, 1), |
429 | MUX(none, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), | 438 | MUX(none, "mout_aclk266_gps", aclk_p4412, SRC_TOP1, 4, 1), |
430 | MUX(none, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), | 439 | MUX(none, "mout_aclk400_mcuisp", aclk_p4412, SRC_TOP1, 8, 1), |
431 | MUX(mout_mpll_user_t, "mout_mpll_user_t", mout_mpll_user_p4x12, | 440 | MUX(mout_mpll_user_t, "mout_mpll_user_t", mout_mpll_user_p4x12, |
@@ -445,12 +454,9 @@ struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | |||
445 | MUX(none, "mout_jpeg0", sclk_ampll_p4x12, E4X12_SRC_CAM1, 0, 1), | 454 | MUX(none, "mout_jpeg0", sclk_ampll_p4x12, E4X12_SRC_CAM1, 0, 1), |
446 | MUX(none, "mout_jpeg1", sclk_evpll_p, E4X12_SRC_CAM1, 4, 1), | 455 | MUX(none, "mout_jpeg1", sclk_evpll_p, E4X12_SRC_CAM1, 4, 1), |
447 | MUX(none, "mout_jpeg", mout_jpeg_p, E4X12_SRC_CAM1, 8, 1), | 456 | MUX(none, "mout_jpeg", mout_jpeg_p, E4X12_SRC_CAM1, 8, 1), |
448 | MUX_A(sclk_mpll, "sclk_mpll", mout_mpll_p, | 457 | MUX(sclk_mpll, "sclk_mpll", mout_mpll_p, SRC_DMC, 12, 1), |
449 | SRC_DMC, 12, 1, "sclk_mpll"), | 458 | MUX(sclk_vpll, "sclk_vpll", mout_vpll_p, SRC_TOP0, 8, 1), |
450 | MUX_A(sclk_vpll, "sclk_vpll", mout_vpll_p, | 459 | MUX(mout_core, "mout_core", mout_core_p4x12, SRC_CPU, 16, 1), |
451 | SRC_TOP0, 8, 1, "sclk_vpll"), | ||
452 | MUX_A(mout_core, "mout_core", mout_core_p4x12, | ||
453 | SRC_CPU, 16, 1, "moutcore"), | ||
454 | MUX(mout_fimc0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), | 460 | MUX(mout_fimc0, "mout_fimc0", group1_p4x12, SRC_CAM, 0, 4), |
455 | MUX(mout_fimc1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), | 461 | MUX(mout_fimc1, "mout_fimc1", group1_p4x12, SRC_CAM, 4, 4), |
456 | MUX(mout_fimc2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), | 462 | MUX(mout_fimc2, "mout_fimc2", group1_p4x12, SRC_CAM, 8, 4), |
@@ -491,7 +497,7 @@ struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = { | |||
491 | }; | 497 | }; |
492 | 498 | ||
493 | /* list of divider clocks supported in all exynos4 soc's */ | 499 | /* list of divider clocks supported in all exynos4 soc's */ |
494 | struct samsung_div_clock exynos4_div_clks[] __initdata = { | 500 | static struct samsung_div_clock exynos4_div_clks[] __initdata = { |
495 | DIV(none, "div_core", "mout_core", DIV_CPU0, 0, 3), | 501 | DIV(none, "div_core", "mout_core", DIV_CPU0, 0, 3), |
496 | DIV(none, "div_core2", "div_core", DIV_CPU0, 28, 3), | 502 | DIV(none, "div_core2", "div_core", DIV_CPU0, 28, 3), |
497 | DIV(none, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), | 503 | DIV(none, "div_fimc0", "mout_fimc0", DIV_CAM, 0, 4), |
@@ -538,9 +544,8 @@ struct samsung_div_clock exynos4_div_clks[] __initdata = { | |||
538 | DIV(none, "div_spi_pre2", "div_spi2", DIV_PERIL2, 8, 8), | 544 | DIV(none, "div_spi_pre2", "div_spi2", DIV_PERIL2, 8, 8), |
539 | DIV(none, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), | 545 | DIV(none, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), |
540 | DIV(none, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), | 546 | DIV(none, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), |
541 | DIV_A(arm_clk, "arm_clk", "div_core2", DIV_CPU0, 28, 3, "armclk"), | 547 | DIV(arm_clk, "arm_clk", "div_core2", DIV_CPU0, 28, 3), |
542 | DIV_A(sclk_apll, "sclk_apll", "mout_apll", | 548 | DIV(sclk_apll, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), |
543 | DIV_CPU0, 24, 3, "sclk_apll"), | ||
544 | DIV_F(none, "div_mipi_pre0", "div_mipi0", DIV_LCD0, 20, 4, | 549 | DIV_F(none, "div_mipi_pre0", "div_mipi0", DIV_LCD0, 20, 4, |
545 | CLK_SET_RATE_PARENT, 0), | 550 | CLK_SET_RATE_PARENT, 0), |
546 | DIV_F(none, "div_mmc_pre0", "div_mmc0", DIV_FSYS1, 8, 8, | 551 | DIV_F(none, "div_mmc_pre0", "div_mmc0", DIV_FSYS1, 8, 8, |
@@ -554,7 +559,7 @@ struct samsung_div_clock exynos4_div_clks[] __initdata = { | |||
554 | }; | 559 | }; |
555 | 560 | ||
556 | /* list of divider clocks supported in exynos4210 soc */ | 561 | /* list of divider clocks supported in exynos4210 soc */ |
557 | struct samsung_div_clock exynos4210_div_clks[] __initdata = { | 562 | static struct samsung_div_clock exynos4210_div_clks[] __initdata = { |
558 | DIV(aclk200, "aclk200", "mout_aclk200", DIV_TOP, 0, 3), | 563 | DIV(aclk200, "aclk200", "mout_aclk200", DIV_TOP, 0, 3), |
559 | DIV(sclk_fimg2d, "sclk_fimg2d", "mout_g2d", DIV_IMAGE, 0, 4), | 564 | DIV(sclk_fimg2d, "sclk_fimg2d", "mout_g2d", DIV_IMAGE, 0, 4), |
560 | DIV(none, "div_fimd1", "mout_fimd1", E4210_DIV_LCD1, 0, 4), | 565 | DIV(none, "div_fimd1", "mout_fimd1", E4210_DIV_LCD1, 0, 4), |
@@ -565,7 +570,7 @@ struct samsung_div_clock exynos4210_div_clks[] __initdata = { | |||
565 | }; | 570 | }; |
566 | 571 | ||
567 | /* list of divider clocks supported in exynos4x12 soc */ | 572 | /* list of divider clocks supported in exynos4x12 soc */ |
568 | struct samsung_div_clock exynos4x12_div_clks[] __initdata = { | 573 | static struct samsung_div_clock exynos4x12_div_clks[] __initdata = { |
569 | DIV(none, "div_mdnie0", "mout_mdnie0", DIV_LCD0, 4, 4), | 574 | DIV(none, "div_mdnie0", "mout_mdnie0", DIV_LCD0, 4, 4), |
570 | DIV(none, "div_mdnie_pwm0", "mout_mdnie_pwm0", DIV_LCD0, 8, 4), | 575 | DIV(none, "div_mdnie_pwm0", "mout_mdnie_pwm0", DIV_LCD0, 8, 4), |
571 | DIV(none, "div_mdnie_pwm_pre0", "div_mdnie_pwm0", DIV_LCD0, 12, 4), | 576 | DIV(none, "div_mdnie_pwm_pre0", "div_mdnie_pwm0", DIV_LCD0, 12, 4), |
@@ -594,7 +599,7 @@ struct samsung_div_clock exynos4x12_div_clks[] __initdata = { | |||
594 | }; | 599 | }; |
595 | 600 | ||
596 | /* list of gate clocks supported in all exynos4 soc's */ | 601 | /* list of gate clocks supported in all exynos4 soc's */ |
597 | struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | 602 | static struct samsung_gate_clock exynos4_gate_clks[] __initdata = { |
598 | /* | 603 | /* |
599 | * After all Exynos4 based platforms are migrated to use device tree, | 604 | * After all Exynos4 based platforms are migrated to use device tree, |
600 | * the device name and clock alias names specified below for some | 605 | * the device name and clock alias names specified below for some |
@@ -629,164 +634,151 @@ struct samsung_gate_clock exynos4_gate_clks[] __initdata = { | |||
629 | CLK_SET_RATE_PARENT, 0), | 634 | CLK_SET_RATE_PARENT, 0), |
630 | GATE(sclk_audio1, "sclk_audio1", "div_audio1", SRC_MASK_PERIL1, 0, | 635 | GATE(sclk_audio1, "sclk_audio1", "div_audio1", SRC_MASK_PERIL1, 0, |
631 | CLK_SET_RATE_PARENT, 0), | 636 | CLK_SET_RATE_PARENT, 0), |
632 | GATE_D(vp, "s5p-mixer", "vp", "aclk160", GATE_IP_TV, 0, 0, 0), | 637 | GATE(vp, "vp", "aclk160", GATE_IP_TV, 0, 0, 0), |
633 | GATE_D(mixer, "s5p-mixer", "mixer", "aclk160", GATE_IP_TV, 1, 0, 0), | 638 | GATE(mixer, "mixer", "aclk160", GATE_IP_TV, 1, 0, 0), |
634 | GATE_D(hdmi, "exynos4-hdmi", "hdmi", "aclk160", GATE_IP_TV, 3, 0, 0), | 639 | GATE(hdmi, "hdmi", "aclk160", GATE_IP_TV, 3, 0, 0), |
635 | GATE_A(pwm, "pwm", "aclk100", GATE_IP_PERIL, 24, 0, 0, "timers"), | 640 | GATE(pwm, "pwm", "aclk100", GATE_IP_PERIL, 24, 0, 0), |
636 | GATE_A(sdmmc4, "sdmmc4", "aclk133", GATE_IP_FSYS, 9, 0, 0, "biu"), | 641 | GATE(sdmmc4, "sdmmc4", "aclk133", GATE_IP_FSYS, 9, 0, 0), |
637 | GATE_A(usb_host, "usb_host", "aclk133", | 642 | GATE(usb_host, "usb_host", "aclk133", GATE_IP_FSYS, 12, 0, 0), |
638 | GATE_IP_FSYS, 12, 0, 0, "usbhost"), | 643 | GATE(sclk_fimc0, "sclk_fimc0", "div_fimc0", SRC_MASK_CAM, 0, |
639 | GATE_DA(sclk_fimc0, "exynos4-fimc.0", "sclk_fimc0", "div_fimc0", | 644 | CLK_SET_RATE_PARENT, 0), |
640 | SRC_MASK_CAM, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), | 645 | GATE(sclk_fimc1, "sclk_fimc1", "div_fimc1", SRC_MASK_CAM, 4, |
641 | GATE_DA(sclk_fimc1, "exynos4-fimc.1", "sclk_fimc1", "div_fimc1", | 646 | CLK_SET_RATE_PARENT, 0), |
642 | SRC_MASK_CAM, 4, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), | 647 | GATE(sclk_fimc2, "sclk_fimc2", "div_fimc2", SRC_MASK_CAM, 8, |
643 | GATE_DA(sclk_fimc2, "exynos4-fimc.2", "sclk_fimc2", "div_fimc2", | 648 | CLK_SET_RATE_PARENT, 0), |
644 | SRC_MASK_CAM, 8, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), | 649 | GATE(sclk_fimc3, "sclk_fimc3", "div_fimc3", SRC_MASK_CAM, 12, |
645 | GATE_DA(sclk_fimc3, "exynos4-fimc.3", "sclk_fimc3", "div_fimc3", | 650 | CLK_SET_RATE_PARENT, 0), |
646 | SRC_MASK_CAM, 12, CLK_SET_RATE_PARENT, 0, "sclk_fimc"), | 651 | GATE(sclk_csis0, "sclk_csis0", "div_csis0", SRC_MASK_CAM, 24, |
647 | GATE_DA(sclk_csis0, "s5p-mipi-csis.0", "sclk_csis0", "div_csis0", | 652 | CLK_SET_RATE_PARENT, 0), |
648 | SRC_MASK_CAM, 24, CLK_SET_RATE_PARENT, 0, "sclk_csis"), | 653 | GATE(sclk_csis1, "sclk_csis1", "div_csis1", SRC_MASK_CAM, 28, |
649 | GATE_DA(sclk_csis1, "s5p-mipi-csis.1", "sclk_csis1", "div_csis1", | 654 | CLK_SET_RATE_PARENT, 0), |
650 | SRC_MASK_CAM, 28, CLK_SET_RATE_PARENT, 0, "sclk_csis"), | 655 | GATE(sclk_fimd0, "sclk_fimd0", "div_fimd0", SRC_MASK_LCD0, 0, |
651 | GATE_DA(sclk_fimd0, "exynos4-fb.0", "sclk_fimd0", "div_fimd0", | 656 | CLK_SET_RATE_PARENT, 0), |
652 | SRC_MASK_LCD0, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimd"), | 657 | GATE(sclk_mmc0, "sclk_mmc0", "div_mmc_pre0", SRC_MASK_FSYS, 0, |
653 | GATE_DA(sclk_mmc0, "exynos4-sdhci.0", "sclk_mmc0", "div_mmc_pre0", | 658 | CLK_SET_RATE_PARENT, 0), |
654 | SRC_MASK_FSYS, 0, CLK_SET_RATE_PARENT, 0, | 659 | GATE(sclk_mmc1, "sclk_mmc1", "div_mmc_pre1", SRC_MASK_FSYS, 4, |
655 | "mmc_busclk.2"), | 660 | CLK_SET_RATE_PARENT, 0), |
656 | GATE_DA(sclk_mmc1, "exynos4-sdhci.1", "sclk_mmc1", "div_mmc_pre1", | 661 | GATE(sclk_mmc2, "sclk_mmc2", "div_mmc_pre2", SRC_MASK_FSYS, 8, |
657 | SRC_MASK_FSYS, 4, CLK_SET_RATE_PARENT, 0, | 662 | CLK_SET_RATE_PARENT, 0), |
658 | "mmc_busclk.2"), | 663 | GATE(sclk_mmc3, "sclk_mmc3", "div_mmc_pre3", SRC_MASK_FSYS, 12, |
659 | GATE_DA(sclk_mmc2, "exynos4-sdhci.2", "sclk_mmc2", "div_mmc_pre2", | 664 | CLK_SET_RATE_PARENT, 0), |
660 | SRC_MASK_FSYS, 8, CLK_SET_RATE_PARENT, 0, | 665 | GATE(sclk_mmc4, "sclk_mmc4", "div_mmc_pre4", SRC_MASK_FSYS, 16, |
661 | "mmc_busclk.2"), | 666 | CLK_SET_RATE_PARENT, 0), |
662 | GATE_DA(sclk_mmc3, "exynos4-sdhci.3", "sclk_mmc3", "div_mmc_pre3", | 667 | GATE(sclk_uart0, "uclk0", "div_uart0", SRC_MASK_PERIL0, 0, |
663 | SRC_MASK_FSYS, 12, CLK_SET_RATE_PARENT, 0, | 668 | CLK_SET_RATE_PARENT, 0), |
664 | "mmc_busclk.2"), | 669 | GATE(sclk_uart1, "uclk1", "div_uart1", SRC_MASK_PERIL0, 4, |
665 | GATE_DA(sclk_mmc4, NULL, "sclk_mmc4", "div_mmc_pre4", | 670 | CLK_SET_RATE_PARENT, 0), |
666 | SRC_MASK_FSYS, 16, CLK_SET_RATE_PARENT, 0, "ciu"), | 671 | GATE(sclk_uart2, "uclk2", "div_uart2", SRC_MASK_PERIL0, 8, |
667 | GATE_DA(sclk_uart0, "exynos4210-uart.0", "uclk0", "div_uart0", | 672 | CLK_SET_RATE_PARENT, 0), |
668 | SRC_MASK_PERIL0, 0, CLK_SET_RATE_PARENT, | 673 | GATE(sclk_uart3, "uclk3", "div_uart3", SRC_MASK_PERIL0, 12, |
669 | 0, "clk_uart_baud0"), | 674 | CLK_SET_RATE_PARENT, 0), |
670 | GATE_DA(sclk_uart1, "exynos4210-uart.1", "uclk1", "div_uart1", | 675 | GATE(sclk_uart4, "uclk4", "div_uart4", SRC_MASK_PERIL0, 16, |
671 | SRC_MASK_PERIL0, 4, CLK_SET_RATE_PARENT, | 676 | CLK_SET_RATE_PARENT, 0), |
672 | 0, "clk_uart_baud0"), | ||
673 | GATE_DA(sclk_uart2, "exynos4210-uart.2", "uclk2", "div_uart2", | ||
674 | SRC_MASK_PERIL0, 8, CLK_SET_RATE_PARENT, | ||
675 | 0, "clk_uart_baud0"), | ||
676 | GATE_DA(sclk_uart3, "exynos4210-uart.3", "uclk3", "div_uart3", | ||
677 | SRC_MASK_PERIL0, 12, CLK_SET_RATE_PARENT, | ||
678 | 0, "clk_uart_baud0"), | ||
679 | GATE_DA(sclk_uart4, "exynos4210-uart.4", "uclk4", "div_uart4", | ||
680 | SRC_MASK_PERIL0, 16, CLK_SET_RATE_PARENT, | ||
681 | 0, "clk_uart_baud0"), | ||
682 | GATE(sclk_audio2, "sclk_audio2", "div_audio2", SRC_MASK_PERIL1, 4, | 677 | GATE(sclk_audio2, "sclk_audio2", "div_audio2", SRC_MASK_PERIL1, 4, |
683 | CLK_SET_RATE_PARENT, 0), | 678 | CLK_SET_RATE_PARENT, 0), |
684 | GATE_DA(sclk_spi0, "exynos4210-spi.0", "sclk_spi0", "div_spi_pre0", | 679 | GATE(sclk_spi0, "sclk_spi0", "div_spi_pre0", SRC_MASK_PERIL1, 16, |
685 | SRC_MASK_PERIL1, 16, CLK_SET_RATE_PARENT, | 680 | CLK_SET_RATE_PARENT, 0), |
686 | 0, "spi_busclk0"), | 681 | GATE(sclk_spi1, "sclk_spi1", "div_spi_pre1", SRC_MASK_PERIL1, 20, |
687 | GATE_DA(sclk_spi1, "exynos4210-spi.1", "sclk_spi1", "div_spi_pre1", | 682 | CLK_SET_RATE_PARENT, 0), |
688 | SRC_MASK_PERIL1, 20, CLK_SET_RATE_PARENT, | 683 | GATE(sclk_spi2, "sclk_spi2", "div_spi_pre2", SRC_MASK_PERIL1, 24, |
689 | 0, "spi_busclk0"), | 684 | CLK_SET_RATE_PARENT, 0), |
690 | GATE_DA(sclk_spi2, "exynos4210-spi.2", "sclk_spi2", "div_spi_pre2", | 685 | GATE(fimc0, "fimc0", "aclk160", GATE_IP_CAM, 0, |
691 | SRC_MASK_PERIL1, 24, CLK_SET_RATE_PARENT, | 686 | 0, 0), |
692 | 0, "spi_busclk0"), | 687 | GATE(fimc1, "fimc1", "aclk160", GATE_IP_CAM, 1, |
693 | GATE_DA(fimc0, "exynos4-fimc.0", "fimc0", "aclk160", | 688 | 0, 0), |
694 | GATE_IP_CAM, 0, 0, 0, "fimc"), | 689 | GATE(fimc2, "fimc2", "aclk160", GATE_IP_CAM, 2, |
695 | GATE_DA(fimc1, "exynos4-fimc.1", "fimc1", "aclk160", | 690 | 0, 0), |
696 | GATE_IP_CAM, 1, 0, 0, "fimc"), | 691 | GATE(fimc3, "fimc3", "aclk160", GATE_IP_CAM, 3, |
697 | GATE_DA(fimc2, "exynos4-fimc.2", "fimc2", "aclk160", | 692 | 0, 0), |
698 | GATE_IP_CAM, 2, 0, 0, "fimc"), | 693 | GATE(csis0, "csis0", "aclk160", GATE_IP_CAM, 4, |
699 | GATE_DA(fimc3, "exynos4-fimc.3", "fimc3", "aclk160", | 694 | 0, 0), |
700 | GATE_IP_CAM, 3, 0, 0, "fimc"), | 695 | GATE(csis1, "csis1", "aclk160", GATE_IP_CAM, 5, |
701 | GATE_DA(csis0, "s5p-mipi-csis.0", "csis0", "aclk160", | 696 | 0, 0), |
702 | GATE_IP_CAM, 4, 0, 0, "fimc"), | 697 | GATE(smmu_fimc0, "smmu_fimc0", "aclk160", GATE_IP_CAM, 7, |
703 | GATE_DA(csis1, "s5p-mipi-csis.1", "csis1", "aclk160", | 698 | 0, 0), |
704 | GATE_IP_CAM, 5, 0, 0, "fimc"), | 699 | GATE(smmu_fimc1, "smmu_fimc1", "aclk160", GATE_IP_CAM, 8, |
705 | GATE_DA(smmu_fimc0, "exynos-sysmmu.5", "smmu_fimc0", "aclk160", | 700 | 0, 0), |
706 | GATE_IP_CAM, 7, 0, 0, "sysmmu"), | 701 | GATE(smmu_fimc2, "smmu_fimc2", "aclk160", GATE_IP_CAM, 9, |
707 | GATE_DA(smmu_fimc1, "exynos-sysmmu.6", "smmu_fimc1", "aclk160", | 702 | 0, 0), |
708 | GATE_IP_CAM, 8, 0, 0, "sysmmu"), | 703 | GATE(smmu_fimc3, "smmu_fimc3", "aclk160", GATE_IP_CAM, 10, |
709 | GATE_DA(smmu_fimc2, "exynos-sysmmu.7", "smmu_fimc2", "aclk160", | 704 | 0, 0), |
710 | GATE_IP_CAM, 9, 0, 0, "sysmmu"), | 705 | GATE(smmu_jpeg, "smmu_jpeg", "aclk160", GATE_IP_CAM, 11, |
711 | GATE_DA(smmu_fimc3, "exynos-sysmmu.8", "smmu_fimc3", "aclk160", | 706 | 0, 0), |
712 | GATE_IP_CAM, 10, 0, 0, "sysmmu"), | ||
713 | GATE_DA(smmu_jpeg, "exynos-sysmmu.3", "smmu_jpeg", "aclk160", | ||
714 | GATE_IP_CAM, 11, 0, 0, "sysmmu"), | ||
715 | GATE(pixelasyncm0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), | 707 | GATE(pixelasyncm0, "pxl_async0", "aclk160", GATE_IP_CAM, 17, 0, 0), |
716 | GATE(pixelasyncm1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), | 708 | GATE(pixelasyncm1, "pxl_async1", "aclk160", GATE_IP_CAM, 18, 0, 0), |
717 | GATE_DA(smmu_tv, "exynos-sysmmu.2", "smmu_tv", "aclk160", | 709 | GATE(smmu_tv, "smmu_tv", "aclk160", GATE_IP_TV, 4, |
718 | GATE_IP_TV, 4, 0, 0, "sysmmu"), | 710 | 0, 0), |
719 | GATE_DA(mfc, "s5p-mfc", "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0, "mfc"), | 711 | GATE(mfc, "mfc", "aclk100", GATE_IP_MFC, 0, 0, 0), |
720 | GATE_DA(smmu_mfcl, "exynos-sysmmu.0", "smmu_mfcl", "aclk100", | 712 | GATE(smmu_mfcl, "smmu_mfcl", "aclk100", GATE_IP_MFC, 1, |
721 | GATE_IP_MFC, 1, 0, 0, "sysmmu"), | 713 | 0, 0), |
722 | GATE_DA(smmu_mfcr, "exynos-sysmmu.1", "smmu_mfcr", "aclk100", | 714 | GATE(smmu_mfcr, "smmu_mfcr", "aclk100", GATE_IP_MFC, 2, |
723 | GATE_IP_MFC, 2, 0, 0, "sysmmu"), | 715 | 0, 0), |
724 | GATE_DA(fimd0, "exynos4-fb.0", "fimd0", "aclk160", | 716 | GATE(fimd0, "fimd0", "aclk160", GATE_IP_LCD0, 0, |
725 | GATE_IP_LCD0, 0, 0, 0, "fimd"), | 717 | 0, 0), |
726 | GATE_DA(smmu_fimd0, "exynos-sysmmu.10", "smmu_fimd0", "aclk160", | 718 | GATE(smmu_fimd0, "smmu_fimd0", "aclk160", GATE_IP_LCD0, 4, |
727 | GATE_IP_LCD0, 4, 0, 0, "sysmmu"), | 719 | 0, 0), |
728 | GATE_DA(pdma0, "dma-pl330.0", "pdma0", "aclk133", | 720 | GATE(pdma0, "pdma0", "aclk133", GATE_IP_FSYS, 0, |
729 | GATE_IP_FSYS, 0, 0, 0, "dma"), | 721 | 0, 0), |
730 | GATE_DA(pdma1, "dma-pl330.1", "pdma1", "aclk133", | 722 | GATE(pdma1, "pdma1", "aclk133", GATE_IP_FSYS, 1, |
731 | GATE_IP_FSYS, 1, 0, 0, "dma"), | 723 | 0, 0), |
732 | GATE_DA(sdmmc0, "exynos4-sdhci.0", "sdmmc0", "aclk133", | 724 | GATE(sdmmc0, "sdmmc0", "aclk133", GATE_IP_FSYS, 5, |
733 | GATE_IP_FSYS, 5, 0, 0, "hsmmc"), | 725 | 0, 0), |
734 | GATE_DA(sdmmc1, "exynos4-sdhci.1", "sdmmc1", "aclk133", | 726 | GATE(sdmmc1, "sdmmc1", "aclk133", GATE_IP_FSYS, 6, |
735 | GATE_IP_FSYS, 6, 0, 0, "hsmmc"), | 727 | 0, 0), |
736 | GATE_DA(sdmmc2, "exynos4-sdhci.2", "sdmmc2", "aclk133", | 728 | GATE(sdmmc2, "sdmmc2", "aclk133", GATE_IP_FSYS, 7, |
737 | GATE_IP_FSYS, 7, 0, 0, "hsmmc"), | 729 | 0, 0), |
738 | GATE_DA(sdmmc3, "exynos4-sdhci.3", "sdmmc3", "aclk133", | 730 | GATE(sdmmc3, "sdmmc3", "aclk133", GATE_IP_FSYS, 8, |
739 | GATE_IP_FSYS, 8, 0, 0, "hsmmc"), | 731 | 0, 0), |
740 | GATE_DA(uart0, "exynos4210-uart.0", "uart0", "aclk100", | 732 | GATE(uart0, "uart0", "aclk100", GATE_IP_PERIL, 0, |
741 | GATE_IP_PERIL, 0, 0, 0, "uart"), | 733 | 0, 0), |
742 | GATE_DA(uart1, "exynos4210-uart.1", "uart1", "aclk100", | 734 | GATE(uart1, "uart1", "aclk100", GATE_IP_PERIL, 1, |
743 | GATE_IP_PERIL, 1, 0, 0, "uart"), | 735 | 0, 0), |
744 | GATE_DA(uart2, "exynos4210-uart.2", "uart2", "aclk100", | 736 | GATE(uart2, "uart2", "aclk100", GATE_IP_PERIL, 2, |
745 | GATE_IP_PERIL, 2, 0, 0, "uart"), | 737 | 0, 0), |
746 | GATE_DA(uart3, "exynos4210-uart.3", "uart3", "aclk100", | 738 | GATE(uart3, "uart3", "aclk100", GATE_IP_PERIL, 3, |
747 | GATE_IP_PERIL, 3, 0, 0, "uart"), | 739 | 0, 0), |
748 | GATE_DA(uart4, "exynos4210-uart.4", "uart4", "aclk100", | 740 | GATE(uart4, "uart4", "aclk100", GATE_IP_PERIL, 4, |
749 | GATE_IP_PERIL, 4, 0, 0, "uart"), | 741 | 0, 0), |
750 | GATE_DA(i2c0, "s3c2440-i2c.0", "i2c0", "aclk100", | 742 | GATE(i2c0, "i2c0", "aclk100", GATE_IP_PERIL, 6, |
751 | GATE_IP_PERIL, 6, 0, 0, "i2c"), | 743 | 0, 0), |
752 | GATE_DA(i2c1, "s3c2440-i2c.1", "i2c1", "aclk100", | 744 | GATE(i2c1, "i2c1", "aclk100", GATE_IP_PERIL, 7, |
753 | GATE_IP_PERIL, 7, 0, 0, "i2c"), | 745 | 0, 0), |
754 | GATE_DA(i2c2, "s3c2440-i2c.2", "i2c2", "aclk100", | 746 | GATE(i2c2, "i2c2", "aclk100", GATE_IP_PERIL, 8, |
755 | GATE_IP_PERIL, 8, 0, 0, "i2c"), | 747 | 0, 0), |
756 | GATE_DA(i2c3, "s3c2440-i2c.3", "i2c3", "aclk100", | 748 | GATE(i2c3, "i2c3", "aclk100", GATE_IP_PERIL, 9, |
757 | GATE_IP_PERIL, 9, 0, 0, "i2c"), | 749 | 0, 0), |
758 | GATE_DA(i2c4, "s3c2440-i2c.4", "i2c4", "aclk100", | 750 | GATE(i2c4, "i2c4", "aclk100", GATE_IP_PERIL, 10, |
759 | GATE_IP_PERIL, 10, 0, 0, "i2c"), | 751 | 0, 0), |
760 | GATE_DA(i2c5, "s3c2440-i2c.5", "i2c5", "aclk100", | 752 | GATE(i2c5, "i2c5", "aclk100", GATE_IP_PERIL, 11, |
761 | GATE_IP_PERIL, 11, 0, 0, "i2c"), | 753 | 0, 0), |
762 | GATE_DA(i2c6, "s3c2440-i2c.6", "i2c6", "aclk100", | 754 | GATE(i2c6, "i2c6", "aclk100", GATE_IP_PERIL, 12, |
763 | GATE_IP_PERIL, 12, 0, 0, "i2c"), | 755 | 0, 0), |
764 | GATE_DA(i2c7, "s3c2440-i2c.7", "i2c7", "aclk100", | 756 | GATE(i2c7, "i2c7", "aclk100", GATE_IP_PERIL, 13, |
765 | GATE_IP_PERIL, 13, 0, 0, "i2c"), | 757 | 0, 0), |
766 | GATE_DA(i2c_hdmi, "s3c2440-hdmiphy-i2c", "i2c-hdmi", "aclk100", | 758 | GATE(i2c_hdmi, "i2c-hdmi", "aclk100", GATE_IP_PERIL, 14, |
767 | GATE_IP_PERIL, 14, 0, 0, "i2c"), | 759 | 0, 0), |
768 | GATE_DA(spi0, "exynos4210-spi.0", "spi0", "aclk100", | 760 | GATE(spi0, "spi0", "aclk100", GATE_IP_PERIL, 16, |
769 | GATE_IP_PERIL, 16, 0, 0, "spi"), | 761 | 0, 0), |
770 | GATE_DA(spi1, "exynos4210-spi.1", "spi1", "aclk100", | 762 | GATE(spi1, "spi1", "aclk100", GATE_IP_PERIL, 17, |
771 | GATE_IP_PERIL, 17, 0, 0, "spi"), | 763 | 0, 0), |
772 | GATE_DA(spi2, "exynos4210-spi.2", "spi2", "aclk100", | 764 | GATE(spi2, "spi2", "aclk100", GATE_IP_PERIL, 18, |
773 | GATE_IP_PERIL, 18, 0, 0, "spi"), | 765 | 0, 0), |
774 | GATE_DA(i2s1, "samsung-i2s.1", "i2s1", "aclk100", | 766 | GATE(i2s1, "i2s1", "aclk100", GATE_IP_PERIL, 20, |
775 | GATE_IP_PERIL, 20, 0, 0, "iis"), | 767 | 0, 0), |
776 | GATE_DA(i2s2, "samsung-i2s.2", "i2s2", "aclk100", | 768 | GATE(i2s2, "i2s2", "aclk100", GATE_IP_PERIL, 21, |
777 | GATE_IP_PERIL, 21, 0, 0, "iis"), | 769 | 0, 0), |
778 | GATE_DA(pcm1, "samsung-pcm.1", "pcm1", "aclk100", | 770 | GATE(pcm1, "pcm1", "aclk100", GATE_IP_PERIL, 22, |
779 | GATE_IP_PERIL, 22, 0, 0, "pcm"), | 771 | 0, 0), |
780 | GATE_DA(pcm2, "samsung-pcm.2", "pcm2", "aclk100", | 772 | GATE(pcm2, "pcm2", "aclk100", GATE_IP_PERIL, 23, |
781 | GATE_IP_PERIL, 23, 0, 0, "pcm"), | 773 | 0, 0), |
782 | GATE_DA(spdif, "samsung-spdif", "spdif", "aclk100", | 774 | GATE(spdif, "spdif", "aclk100", GATE_IP_PERIL, 26, |
783 | GATE_IP_PERIL, 26, 0, 0, "spdif"), | 775 | 0, 0), |
784 | GATE_DA(ac97, "samsung-ac97", "ac97", "aclk100", | 776 | GATE(ac97, "ac97", "aclk100", GATE_IP_PERIL, 27, |
785 | GATE_IP_PERIL, 27, 0, 0, "ac97"), | 777 | 0, 0), |
786 | }; | 778 | }; |
787 | 779 | ||
788 | /* list of gate clocks supported in exynos4210 soc */ | 780 | /* list of gate clocks supported in exynos4210 soc */ |
789 | struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { | 781 | static struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { |
790 | GATE(tvenc, "tvenc", "aclk160", GATE_IP_TV, 2, 0, 0), | 782 | GATE(tvenc, "tvenc", "aclk160", GATE_IP_TV, 2, 0, 0), |
791 | GATE(g2d, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0), | 783 | GATE(g2d, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0), |
792 | GATE(rotator, "rotator", "aclk200", E4210_GATE_IP_IMAGE, 1, 0, 0), | 784 | GATE(rotator, "rotator", "aclk200", E4210_GATE_IP_IMAGE, 1, 0, 0), |
@@ -811,17 +803,23 @@ struct samsung_gate_clock exynos4210_gate_clks[] __initdata = { | |||
811 | SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), | 803 | SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), |
812 | GATE(sclk_mixer, "sclk_mixer", "mout_mixer", SRC_MASK_TV, 4, 0, 0), | 804 | GATE(sclk_mixer, "sclk_mixer", "mout_mixer", SRC_MASK_TV, 4, 0, 0), |
813 | GATE(sclk_dac, "sclk_dac", "mout_dac", SRC_MASK_TV, 8, 0, 0), | 805 | GATE(sclk_dac, "sclk_dac", "mout_dac", SRC_MASK_TV, 8, 0, 0), |
814 | GATE_A(tsadc, "tsadc", "aclk100", GATE_IP_PERIL, 15, 0, 0, "adc"), | 806 | GATE(tsadc, "tsadc", "aclk100", GATE_IP_PERIL, 15, |
815 | GATE_A(mct, "mct", "aclk100", E4210_GATE_IP_PERIR, 13, 0, 0, "mct"), | 807 | 0, 0), |
816 | GATE_A(wdt, "watchdog", "aclk100", E4210_GATE_IP_PERIR, 14, 0, 0, "watchdog"), | 808 | GATE(mct, "mct", "aclk100", E4210_GATE_IP_PERIR, 13, |
817 | GATE_A(rtc, "rtc", "aclk100", E4210_GATE_IP_PERIR, 15, 0, 0, "rtc"), | 809 | 0, 0), |
818 | GATE_A(keyif, "keyif", "aclk100", E4210_GATE_IP_PERIR, 16, 0, 0, "keypad"), | 810 | GATE(wdt, "watchdog", "aclk100", E4210_GATE_IP_PERIR, 14, |
819 | GATE_DA(sclk_fimd1, "exynos4-fb.1", "sclk_fimd1", "div_fimd1", | 811 | 0, 0), |
820 | E4210_SRC_MASK_LCD1, 0, CLK_SET_RATE_PARENT, 0, "sclk_fimd"), | 812 | GATE(rtc, "rtc", "aclk100", E4210_GATE_IP_PERIR, 15, |
813 | 0, 0), | ||
814 | GATE(keyif, "keyif", "aclk100", E4210_GATE_IP_PERIR, 16, | ||
815 | 0, 0), | ||
816 | GATE(sclk_fimd1, "sclk_fimd1", "div_fimd1", E4210_SRC_MASK_LCD1, 0, | ||
817 | CLK_SET_RATE_PARENT, 0), | ||
818 | GATE(tmu_apbif, "tmu_apbif", "aclk100", E4210_GATE_IP_PERIR, 17, 0, 0), | ||
821 | }; | 819 | }; |
822 | 820 | ||
823 | /* list of gate clocks supported in exynos4x12 soc */ | 821 | /* list of gate clocks supported in exynos4x12 soc */ |
824 | struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | 822 | static struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { |
825 | GATE(audss, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), | 823 | GATE(audss, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0), |
826 | GATE(mdnie0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), | 824 | GATE(mdnie0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0), |
827 | GATE(rotator, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), | 825 | GATE(rotator, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0), |
@@ -840,10 +838,11 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | |||
840 | SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), | 838 | SRC_MASK_FSYS, 24, CLK_SET_RATE_PARENT, 0), |
841 | GATE(smmu_rotator, "smmu_rotator", "aclk200", | 839 | GATE(smmu_rotator, "smmu_rotator", "aclk200", |
842 | E4X12_GATE_IP_IMAGE, 4, 0, 0), | 840 | E4X12_GATE_IP_IMAGE, 4, 0, 0), |
843 | GATE_A(mct, "mct", "aclk100", E4X12_GATE_IP_PERIR, 13, 0, 0, "mct"), | 841 | GATE(mct, "mct", "aclk100", E4X12_GATE_IP_PERIR, 13, |
844 | GATE_A(rtc, "rtc", "aclk100", E4X12_GATE_IP_PERIR, 15, 0, 0, "rtc"), | 842 | 0, 0), |
845 | GATE_A(keyif, "keyif", "aclk100", | 843 | GATE(rtc, "rtc", "aclk100", E4X12_GATE_IP_PERIR, 15, |
846 | E4X12_GATE_IP_PERIR, 16, 0, 0, "keypad"), | 844 | 0, 0), |
845 | GATE(keyif, "keyif", "aclk100", E4X12_GATE_IP_PERIR, 16, 0, 0), | ||
847 | GATE(sclk_pwm_isp, "sclk_pwm_isp", "div_pwm_isp", | 846 | GATE(sclk_pwm_isp, "sclk_pwm_isp", "div_pwm_isp", |
848 | E4X12_SRC_MASK_ISP, 0, CLK_SET_RATE_PARENT, 0), | 847 | E4X12_SRC_MASK_ISP, 0, CLK_SET_RATE_PARENT, 0), |
849 | GATE(sclk_spi0_isp, "sclk_spi0_isp", "div_spi0_isp_pre", | 848 | GATE(sclk_spi0_isp, "sclk_spi0_isp", "div_spi0_isp_pre", |
@@ -860,12 +859,11 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | |||
860 | E4X12_GATE_IP_ISP, 2, 0, 0), | 859 | E4X12_GATE_IP_ISP, 2, 0, 0), |
861 | GATE(uart_isp_sclk, "uart_isp_sclk", "sclk_uart_isp", | 860 | GATE(uart_isp_sclk, "uart_isp_sclk", "sclk_uart_isp", |
862 | E4X12_GATE_IP_ISP, 3, 0, 0), | 861 | E4X12_GATE_IP_ISP, 3, 0, 0), |
863 | GATE_A(wdt, "watchdog", "aclk100", | 862 | GATE(wdt, "watchdog", "aclk100", E4X12_GATE_IP_PERIR, 14, 0, 0), |
864 | E4X12_GATE_IP_PERIR, 14, 0, 0, "watchdog"), | 863 | GATE(pcm0, "pcm0", "aclk100", E4X12_GATE_IP_MAUDIO, 2, |
865 | GATE_DA(pcm0, "samsung-pcm.0", "pcm0", "aclk100", | 864 | 0, 0), |
866 | E4X12_GATE_IP_MAUDIO, 2, 0, 0, "pcm"), | 865 | GATE(i2s0, "i2s0", "aclk100", E4X12_GATE_IP_MAUDIO, 3, |
867 | GATE_DA(i2s0, "samsung-i2s.0", "i2s0", "aclk100", | 866 | 0, 0), |
868 | E4X12_GATE_IP_MAUDIO, 3, 0, 0, "iis"), | ||
869 | GATE(fimc_isp, "isp", "aclk200", E4X12_GATE_ISP0, 0, | 867 | GATE(fimc_isp, "isp", "aclk200", E4X12_GATE_ISP0, 0, |
870 | CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), | 868 | CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
871 | GATE(fimc_drc, "drc", "aclk200", E4X12_GATE_ISP0, 1, | 869 | GATE(fimc_drc, "drc", "aclk200", E4X12_GATE_ISP0, 1, |
@@ -919,6 +917,21 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = { | |||
919 | GATE(spi1_isp, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, | 917 | GATE(spi1_isp, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, |
920 | CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), | 918 | CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0), |
921 | GATE(g2d, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0), | 919 | GATE(g2d, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0), |
920 | GATE(tmu_apbif, "tmu_apbif", "aclk100", E4X12_GATE_IP_PERIR, 17, 0, 0), | ||
921 | }; | ||
922 | |||
923 | static struct samsung_clock_alias exynos4_aliases[] __initdata = { | ||
924 | ALIAS(mout_core, NULL, "moutcore"), | ||
925 | ALIAS(arm_clk, NULL, "armclk"), | ||
926 | ALIAS(sclk_apll, NULL, "mout_apll"), | ||
927 | }; | ||
928 | |||
929 | static struct samsung_clock_alias exynos4210_aliases[] __initdata = { | ||
930 | ALIAS(sclk_mpll, NULL, "mout_mpll"), | ||
931 | }; | ||
932 | |||
933 | static struct samsung_clock_alias exynos4x12_aliases[] __initdata = { | ||
934 | ALIAS(mout_mpll_user_c, NULL, "mout_mpll"), | ||
922 | }; | 935 | }; |
923 | 936 | ||
924 | /* | 937 | /* |
@@ -973,36 +986,116 @@ static void __init exynos4_clk_register_finpll(unsigned long xom) | |||
973 | 986 | ||
974 | } | 987 | } |
975 | 988 | ||
976 | /* | 989 | static struct of_device_id ext_clk_match[] __initdata = { |
977 | * This function allows non-dt platforms to specify the clock speed of the | ||
978 | * xxti and xusbxti clocks. These clocks are then registered with the specified | ||
979 | * clock speed. | ||
980 | */ | ||
981 | void __init exynos4_clk_register_fixed_ext(unsigned long xxti_f, | ||
982 | unsigned long xusbxti_f) | ||
983 | { | ||
984 | exynos4_fixed_rate_ext_clks[0].fixed_rate = xxti_f; | ||
985 | exynos4_fixed_rate_ext_clks[1].fixed_rate = xusbxti_f; | ||
986 | samsung_clk_register_fixed_rate(exynos4_fixed_rate_ext_clks, | ||
987 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks)); | ||
988 | } | ||
989 | |||
990 | static __initdata struct of_device_id ext_clk_match[] = { | ||
991 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, | 990 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, |
992 | { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, | 991 | { .compatible = "samsung,clock-xusbxti", .data = (void *)1, }, |
993 | {}, | 992 | {}, |
994 | }; | 993 | }; |
995 | 994 | ||
995 | /* PLLs PMS values */ | ||
996 | static struct samsung_pll_rate_table exynos4210_apll_rates[] __initdata = { | ||
997 | PLL_45XX_RATE(1200000000, 150, 3, 1, 28), | ||
998 | PLL_45XX_RATE(1000000000, 250, 6, 1, 28), | ||
999 | PLL_45XX_RATE( 800000000, 200, 6, 1, 28), | ||
1000 | PLL_45XX_RATE( 666857142, 389, 14, 1, 13), | ||
1001 | PLL_45XX_RATE( 600000000, 100, 4, 1, 13), | ||
1002 | PLL_45XX_RATE( 533000000, 533, 24, 1, 5), | ||
1003 | PLL_45XX_RATE( 500000000, 250, 6, 2, 28), | ||
1004 | PLL_45XX_RATE( 400000000, 200, 6, 2, 28), | ||
1005 | PLL_45XX_RATE( 200000000, 200, 6, 3, 28), | ||
1006 | { /* sentinel */ } | ||
1007 | }; | ||
1008 | |||
1009 | static struct samsung_pll_rate_table exynos4210_epll_rates[] __initdata = { | ||
1010 | PLL_4600_RATE(192000000, 48, 3, 1, 0, 0), | ||
1011 | PLL_4600_RATE(180633605, 45, 3, 1, 10381, 0), | ||
1012 | PLL_4600_RATE(180000000, 45, 3, 1, 0, 0), | ||
1013 | PLL_4600_RATE( 73727996, 73, 3, 3, 47710, 1), | ||
1014 | PLL_4600_RATE( 67737602, 90, 4, 3, 20762, 1), | ||
1015 | PLL_4600_RATE( 49151992, 49, 3, 3, 9961, 0), | ||
1016 | PLL_4600_RATE( 45158401, 45, 3, 3, 10381, 0), | ||
1017 | { /* sentinel */ } | ||
1018 | }; | ||
1019 | |||
1020 | static struct samsung_pll_rate_table exynos4210_vpll_rates[] __initdata = { | ||
1021 | PLL_4650_RATE(360000000, 44, 3, 0, 1024, 0, 14, 0), | ||
1022 | PLL_4650_RATE(324000000, 53, 2, 1, 1024, 1, 1, 1), | ||
1023 | PLL_4650_RATE(259617187, 63, 3, 1, 1950, 0, 20, 1), | ||
1024 | PLL_4650_RATE(110000000, 53, 3, 2, 2048, 0, 17, 0), | ||
1025 | PLL_4650_RATE( 55360351, 53, 3, 3, 2417, 0, 17, 0), | ||
1026 | { /* sentinel */ } | ||
1027 | }; | ||
1028 | |||
1029 | static struct samsung_pll_rate_table exynos4x12_apll_rates[] __initdata = { | ||
1030 | PLL_35XX_RATE(1500000000, 250, 4, 0), | ||
1031 | PLL_35XX_RATE(1400000000, 175, 3, 0), | ||
1032 | PLL_35XX_RATE(1300000000, 325, 6, 0), | ||
1033 | PLL_35XX_RATE(1200000000, 200, 4, 0), | ||
1034 | PLL_35XX_RATE(1100000000, 275, 6, 0), | ||
1035 | PLL_35XX_RATE(1000000000, 125, 3, 0), | ||
1036 | PLL_35XX_RATE( 900000000, 150, 4, 0), | ||
1037 | PLL_35XX_RATE( 800000000, 100, 3, 0), | ||
1038 | PLL_35XX_RATE( 700000000, 175, 3, 1), | ||
1039 | PLL_35XX_RATE( 600000000, 200, 4, 1), | ||
1040 | PLL_35XX_RATE( 500000000, 125, 3, 1), | ||
1041 | PLL_35XX_RATE( 400000000, 100, 3, 1), | ||
1042 | PLL_35XX_RATE( 300000000, 200, 4, 2), | ||
1043 | PLL_35XX_RATE( 200000000, 100, 3, 2), | ||
1044 | { /* sentinel */ } | ||
1045 | }; | ||
1046 | |||
1047 | static struct samsung_pll_rate_table exynos4x12_epll_rates[] __initdata = { | ||
1048 | PLL_36XX_RATE(192000000, 48, 3, 1, 0), | ||
1049 | PLL_36XX_RATE(180633605, 45, 3, 1, 10381), | ||
1050 | PLL_36XX_RATE(180000000, 45, 3, 1, 0), | ||
1051 | PLL_36XX_RATE( 73727996, 73, 3, 3, 47710), | ||
1052 | PLL_36XX_RATE( 67737602, 90, 4, 3, 20762), | ||
1053 | PLL_36XX_RATE( 49151992, 49, 3, 3, 9961), | ||
1054 | PLL_36XX_RATE( 45158401, 45, 3, 3, 10381), | ||
1055 | { /* sentinel */ } | ||
1056 | }; | ||
1057 | |||
1058 | static struct samsung_pll_rate_table exynos4x12_vpll_rates[] __initdata = { | ||
1059 | PLL_36XX_RATE(533000000, 133, 3, 1, 16384), | ||
1060 | PLL_36XX_RATE(440000000, 110, 3, 1, 0), | ||
1061 | PLL_36XX_RATE(350000000, 175, 3, 2, 0), | ||
1062 | PLL_36XX_RATE(266000000, 133, 3, 2, 0), | ||
1063 | PLL_36XX_RATE(160000000, 160, 3, 3, 0), | ||
1064 | PLL_36XX_RATE(106031250, 53, 3, 2, 1024), | ||
1065 | PLL_36XX_RATE( 53015625, 53, 3, 3, 1024), | ||
1066 | { /* sentinel */ } | ||
1067 | }; | ||
1068 | |||
1069 | static struct samsung_pll_clock exynos4210_plls[nr_plls] __initdata = { | ||
1070 | [apll] = PLL_A(pll_4508, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, | ||
1071 | APLL_CON0, "fout_apll", NULL), | ||
1072 | [mpll] = PLL_A(pll_4508, fout_mpll, "fout_mpll", "fin_pll", | ||
1073 | E4210_MPLL_LOCK, E4210_MPLL_CON0, "fout_mpll", NULL), | ||
1074 | [epll] = PLL_A(pll_4600, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, | ||
1075 | EPLL_CON0, "fout_epll", NULL), | ||
1076 | [vpll] = PLL_A(pll_4650c, fout_vpll, "fout_vpll", "mout_vpllsrc", | ||
1077 | VPLL_LOCK, VPLL_CON0, "fout_vpll", NULL), | ||
1078 | }; | ||
1079 | |||
1080 | static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = { | ||
1081 | [apll] = PLL(pll_35xx, fout_apll, "fout_apll", "fin_pll", | ||
1082 | APLL_LOCK, APLL_CON0, NULL), | ||
1083 | [mpll] = PLL(pll_35xx, fout_mpll, "fout_mpll", "fin_pll", | ||
1084 | E4X12_MPLL_LOCK, E4X12_MPLL_CON0, NULL), | ||
1085 | [epll] = PLL(pll_36xx, fout_epll, "fout_epll", "fin_pll", | ||
1086 | EPLL_LOCK, EPLL_CON0, NULL), | ||
1087 | [vpll] = PLL(pll_36xx, fout_vpll, "fout_vpll", "fin_pll", | ||
1088 | VPLL_LOCK, VPLL_CON0, NULL), | ||
1089 | }; | ||
1090 | |||
996 | /* register exynos4 clocks */ | 1091 | /* register exynos4 clocks */ |
997 | void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_soc, void __iomem *reg_base, unsigned long xom) | 1092 | static void __init exynos4_clk_init(struct device_node *np, |
1093 | enum exynos4_soc exynos4_soc, | ||
1094 | void __iomem *reg_base, unsigned long xom) | ||
998 | { | 1095 | { |
999 | struct clk *apll, *mpll, *epll, *vpll; | 1096 | reg_base = of_iomap(np, 0); |
1000 | 1097 | if (!reg_base) | |
1001 | if (np) { | 1098 | panic("%s: failed to map registers\n", __func__); |
1002 | reg_base = of_iomap(np, 0); | ||
1003 | if (!reg_base) | ||
1004 | panic("%s: failed to map registers\n", __func__); | ||
1005 | } | ||
1006 | 1099 | ||
1007 | if (exynos4_soc == EXYNOS4210) | 1100 | if (exynos4_soc == EXYNOS4210) |
1008 | samsung_clk_init(np, reg_base, nr_clks, | 1101 | samsung_clk_init(np, reg_base, nr_clks, |
@@ -1013,37 +1106,42 @@ void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_so | |||
1013 | exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs), | 1106 | exynos4_clk_regs, ARRAY_SIZE(exynos4_clk_regs), |
1014 | exynos4x12_clk_save, ARRAY_SIZE(exynos4x12_clk_save)); | 1107 | exynos4x12_clk_save, ARRAY_SIZE(exynos4x12_clk_save)); |
1015 | 1108 | ||
1016 | if (np) | 1109 | samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks, |
1017 | samsung_clk_of_register_fixed_ext(exynos4_fixed_rate_ext_clks, | ||
1018 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks), | 1110 | ARRAY_SIZE(exynos4_fixed_rate_ext_clks), |
1019 | ext_clk_match); | 1111 | ext_clk_match); |
1020 | 1112 | ||
1021 | exynos4_clk_register_finpll(xom); | 1113 | exynos4_clk_register_finpll(xom); |
1022 | 1114 | ||
1023 | if (exynos4_soc == EXYNOS4210) { | 1115 | if (exynos4_soc == EXYNOS4210) { |
1024 | apll = samsung_clk_register_pll45xx("fout_apll", "fin_pll", | 1116 | samsung_clk_register_mux(exynos4210_mux_early, |
1025 | reg_base + APLL_CON0, pll_4508); | 1117 | ARRAY_SIZE(exynos4210_mux_early)); |
1026 | mpll = samsung_clk_register_pll45xx("fout_mpll", "fin_pll", | 1118 | |
1027 | reg_base + E4210_MPLL_CON0, pll_4508); | 1119 | if (_get_rate("fin_pll") == 24000000) { |
1028 | epll = samsung_clk_register_pll46xx("fout_epll", "fin_pll", | 1120 | exynos4210_plls[apll].rate_table = |
1029 | reg_base + EPLL_CON0, pll_4600); | 1121 | exynos4210_apll_rates; |
1030 | vpll = samsung_clk_register_pll46xx("fout_vpll", "mout_vpllsrc", | 1122 | exynos4210_plls[epll].rate_table = |
1031 | reg_base + VPLL_CON0, pll_4650c); | 1123 | exynos4210_epll_rates; |
1124 | } | ||
1125 | |||
1126 | if (_get_rate("mout_vpllsrc") == 24000000) | ||
1127 | exynos4210_plls[vpll].rate_table = | ||
1128 | exynos4210_vpll_rates; | ||
1129 | |||
1130 | samsung_clk_register_pll(exynos4210_plls, | ||
1131 | ARRAY_SIZE(exynos4210_plls), reg_base); | ||
1032 | } else { | 1132 | } else { |
1033 | apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", | 1133 | if (_get_rate("fin_pll") == 24000000) { |
1034 | reg_base + APLL_CON0); | 1134 | exynos4x12_plls[apll].rate_table = |
1035 | mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", | 1135 | exynos4x12_apll_rates; |
1036 | reg_base + E4X12_MPLL_CON0); | 1136 | exynos4x12_plls[epll].rate_table = |
1037 | epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", | 1137 | exynos4x12_epll_rates; |
1038 | reg_base + EPLL_CON0); | 1138 | exynos4x12_plls[vpll].rate_table = |
1039 | vpll = samsung_clk_register_pll36xx("fout_vpll", "fin_pll", | 1139 | exynos4x12_vpll_rates; |
1040 | reg_base + VPLL_CON0); | 1140 | } |
1041 | } | ||
1042 | 1141 | ||
1043 | samsung_clk_add_lookup(apll, fout_apll); | 1142 | samsung_clk_register_pll(exynos4x12_plls, |
1044 | samsung_clk_add_lookup(mpll, fout_mpll); | 1143 | ARRAY_SIZE(exynos4x12_plls), reg_base); |
1045 | samsung_clk_add_lookup(epll, fout_epll); | 1144 | } |
1046 | samsung_clk_add_lookup(vpll, fout_vpll); | ||
1047 | 1145 | ||
1048 | samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks, | 1146 | samsung_clk_register_fixed_rate(exynos4_fixed_rate_clks, |
1049 | ARRAY_SIZE(exynos4_fixed_rate_clks)); | 1147 | ARRAY_SIZE(exynos4_fixed_rate_clks)); |
@@ -1063,6 +1161,8 @@ void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_so | |||
1063 | ARRAY_SIZE(exynos4210_div_clks)); | 1161 | ARRAY_SIZE(exynos4210_div_clks)); |
1064 | samsung_clk_register_gate(exynos4210_gate_clks, | 1162 | samsung_clk_register_gate(exynos4210_gate_clks, |
1065 | ARRAY_SIZE(exynos4210_gate_clks)); | 1163 | ARRAY_SIZE(exynos4210_gate_clks)); |
1164 | samsung_clk_register_alias(exynos4210_aliases, | ||
1165 | ARRAY_SIZE(exynos4210_aliases)); | ||
1066 | } else { | 1166 | } else { |
1067 | samsung_clk_register_mux(exynos4x12_mux_clks, | 1167 | samsung_clk_register_mux(exynos4x12_mux_clks, |
1068 | ARRAY_SIZE(exynos4x12_mux_clks)); | 1168 | ARRAY_SIZE(exynos4x12_mux_clks)); |
@@ -1070,14 +1170,19 @@ void __init exynos4_clk_init(struct device_node *np, enum exynos4_soc exynos4_so | |||
1070 | ARRAY_SIZE(exynos4x12_div_clks)); | 1170 | ARRAY_SIZE(exynos4x12_div_clks)); |
1071 | samsung_clk_register_gate(exynos4x12_gate_clks, | 1171 | samsung_clk_register_gate(exynos4x12_gate_clks, |
1072 | ARRAY_SIZE(exynos4x12_gate_clks)); | 1172 | ARRAY_SIZE(exynos4x12_gate_clks)); |
1173 | samsung_clk_register_alias(exynos4x12_aliases, | ||
1174 | ARRAY_SIZE(exynos4x12_aliases)); | ||
1073 | } | 1175 | } |
1074 | 1176 | ||
1177 | samsung_clk_register_alias(exynos4_aliases, | ||
1178 | ARRAY_SIZE(exynos4_aliases)); | ||
1179 | |||
1075 | pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" | 1180 | pr_info("%s clocks: sclk_apll = %ld, sclk_mpll = %ld\n" |
1076 | "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", | 1181 | "\tsclk_epll = %ld, sclk_vpll = %ld, arm_clk = %ld\n", |
1077 | exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", | 1182 | exynos4_soc == EXYNOS4210 ? "Exynos4210" : "Exynos4x12", |
1078 | _get_rate("sclk_apll"), _get_rate("mout_mpll"), | 1183 | _get_rate("sclk_apll"), _get_rate("sclk_mpll"), |
1079 | _get_rate("sclk_epll"), _get_rate("sclk_vpll"), | 1184 | _get_rate("sclk_epll"), _get_rate("sclk_vpll"), |
1080 | _get_rate("armclk")); | 1185 | _get_rate("arm_clk")); |
1081 | } | 1186 | } |
1082 | 1187 | ||
1083 | 1188 | ||
diff --git a/drivers/clk/samsung/clk-exynos5250.c b/drivers/clk/samsung/clk-exynos5250.c index 6f767c515ec7..adf32343c9f9 100644 --- a/drivers/clk/samsung/clk-exynos5250.c +++ b/drivers/clk/samsung/clk-exynos5250.c | |||
@@ -17,11 +17,22 @@ | |||
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include "clk.h" | 19 | #include "clk.h" |
20 | #include "clk-pll.h" | ||
21 | 20 | ||
21 | #define APLL_LOCK 0x0 | ||
22 | #define APLL_CON0 0x100 | ||
22 | #define SRC_CPU 0x200 | 23 | #define SRC_CPU 0x200 |
23 | #define DIV_CPU0 0x500 | 24 | #define DIV_CPU0 0x500 |
25 | #define MPLL_LOCK 0x4000 | ||
26 | #define MPLL_CON0 0x4100 | ||
24 | #define SRC_CORE1 0x4204 | 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 | #define SRC_TOP0 0x10210 | 36 | #define SRC_TOP0 0x10210 |
26 | #define SRC_TOP2 0x10218 | 37 | #define SRC_TOP2 0x10218 |
27 | #define SRC_GSCL 0x10220 | 38 | #define SRC_GSCL 0x10220 |
@@ -59,9 +70,18 @@ | |||
59 | #define GATE_IP_FSYS 0x10944 | 70 | #define GATE_IP_FSYS 0x10944 |
60 | #define GATE_IP_PERIC 0x10950 | 71 | #define GATE_IP_PERIC 0x10950 |
61 | #define GATE_IP_PERIS 0x10960 | 72 | #define GATE_IP_PERIS 0x10960 |
73 | #define BPLL_LOCK 0x20010 | ||
74 | #define BPLL_CON0 0x20110 | ||
62 | #define SRC_CDREX 0x20200 | 75 | #define SRC_CDREX 0x20200 |
63 | #define PLL_DIV2_SEL 0x20a24 | 76 | #define PLL_DIV2_SEL 0x20a24 |
64 | #define GATE_IP_DISP1 0x10928 | 77 | #define GATE_IP_DISP1 0x10928 |
78 | #define GATE_IP_ACP 0x10000 | ||
79 | |||
80 | /* list of PLLs to be registered */ | ||
81 | enum exynos5250_plls { | ||
82 | apll, mpll, cpll, epll, vpll, gpll, bpll, | ||
83 | nr_plls /* number of PLLs */ | ||
84 | }; | ||
65 | 85 | ||
66 | /* | 86 | /* |
67 | * Let each supported clock get a unique id. This id is used to lookup the clock | 87 | * Let each supported clock get a unique id. This id is used to lookup the clock |
@@ -79,7 +99,8 @@ enum exynos5250_clks { | |||
79 | none, | 99 | none, |
80 | 100 | ||
81 | /* core clocks */ | 101 | /* core clocks */ |
82 | fin_pll, | 102 | fin_pll, fout_apll, fout_mpll, fout_bpll, fout_gpll, fout_cpll, |
103 | fout_epll, fout_vpll, | ||
83 | 104 | ||
84 | /* gate for special clocks (sclk) */ | 105 | /* gate for special clocks (sclk) */ |
85 | sclk_cam_bayer = 128, sclk_cam0, sclk_cam1, sclk_gscl_wa, sclk_gscl_wb, | 106 | sclk_cam_bayer = 128, sclk_cam0, sclk_cam1, sclk_gscl_wa, sclk_gscl_wb, |
@@ -87,7 +108,7 @@ enum exynos5250_clks { | |||
87 | sclk_mmc0, sclk_mmc1, sclk_mmc2, sclk_mmc3, sclk_sata, sclk_usb3, | 108 | sclk_mmc0, sclk_mmc1, sclk_mmc2, sclk_mmc3, sclk_sata, sclk_usb3, |
88 | sclk_jpeg, sclk_uart0, sclk_uart1, sclk_uart2, sclk_uart3, sclk_pwm, | 109 | sclk_jpeg, sclk_uart0, sclk_uart1, sclk_uart2, sclk_uart3, sclk_pwm, |
89 | sclk_audio1, sclk_audio2, sclk_spdif, sclk_spi0, sclk_spi1, sclk_spi2, | 110 | sclk_audio1, sclk_audio2, sclk_spdif, sclk_spi0, sclk_spi1, sclk_spi2, |
90 | div_i2s1, div_i2s2, | 111 | div_i2s1, div_i2s2, sclk_hdmiphy, |
91 | 112 | ||
92 | /* gate clocks */ | 113 | /* gate clocks */ |
93 | gscl0 = 256, gscl1, gscl2, gscl3, gscl_wa, gscl_wb, smmu_gscl0, | 114 | gscl0 = 256, gscl1, gscl2, gscl3, gscl_wa, gscl_wb, smmu_gscl0, |
@@ -99,7 +120,10 @@ enum exynos5250_clks { | |||
99 | spi2, i2s1, i2s2, pcm1, pcm2, pwm, spdif, ac97, hsi2c0, hsi2c1, hsi2c2, | 120 | spi2, i2s1, i2s2, pcm1, pcm2, pwm, spdif, ac97, hsi2c0, hsi2c1, hsi2c2, |
100 | hsi2c3, chipid, sysreg, pmu, cmu_top, cmu_core, cmu_mem, tzpc0, tzpc1, | 121 | hsi2c3, chipid, sysreg, pmu, cmu_top, cmu_core, cmu_mem, tzpc0, tzpc1, |
101 | tzpc2, tzpc3, tzpc4, tzpc5, tzpc6, tzpc7, tzpc8, tzpc9, hdmi_cec, mct, | 122 | tzpc2, tzpc3, tzpc4, tzpc5, tzpc6, tzpc7, tzpc8, tzpc9, hdmi_cec, mct, |
102 | wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, | 123 | wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, g2d, |
124 | |||
125 | /* mux clocks */ | ||
126 | mout_hdmi = 1024, | ||
103 | 127 | ||
104 | nr_clks, | 128 | nr_clks, |
105 | }; | 129 | }; |
@@ -108,7 +132,7 @@ enum exynos5250_clks { | |||
108 | * list of controller registers to be saved and restored during a | 132 | * list of controller registers to be saved and restored during a |
109 | * suspend/resume cycle. | 133 | * suspend/resume cycle. |
110 | */ | 134 | */ |
111 | static __initdata unsigned long exynos5250_clk_regs[] = { | 135 | static unsigned long exynos5250_clk_regs[] __initdata = { |
112 | SRC_CPU, | 136 | SRC_CPU, |
113 | DIV_CPU0, | 137 | DIV_CPU0, |
114 | SRC_CORE1, | 138 | SRC_CORE1, |
@@ -152,6 +176,7 @@ static __initdata unsigned long exynos5250_clk_regs[] = { | |||
152 | SRC_CDREX, | 176 | SRC_CDREX, |
153 | PLL_DIV2_SEL, | 177 | PLL_DIV2_SEL, |
154 | GATE_IP_DISP1, | 178 | GATE_IP_DISP1, |
179 | GATE_IP_ACP, | ||
155 | }; | 180 | }; |
156 | 181 | ||
157 | /* list of all parent clock list */ | 182 | /* list of all parent clock list */ |
@@ -191,31 +216,34 @@ PNAME(mout_spdif_p) = { "sclk_audio0", "sclk_audio1", "sclk_audio2", | |||
191 | "spdif_extclk" }; | 216 | "spdif_extclk" }; |
192 | 217 | ||
193 | /* fixed rate clocks generated outside the soc */ | 218 | /* fixed rate clocks generated outside the soc */ |
194 | struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initdata = { | 219 | static struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initdata = { |
195 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), | 220 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), |
196 | }; | 221 | }; |
197 | 222 | ||
198 | /* fixed rate clocks generated inside the soc */ | 223 | /* fixed rate clocks generated inside the soc */ |
199 | struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initdata = { | 224 | static struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initdata = { |
200 | FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), | 225 | FRATE(sclk_hdmiphy, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), |
201 | FRATE(none, "sclk_hdmi27m", NULL, CLK_IS_ROOT, 27000000), | 226 | FRATE(none, "sclk_hdmi27m", NULL, CLK_IS_ROOT, 27000000), |
202 | FRATE(none, "sclk_dptxphy", NULL, CLK_IS_ROOT, 24000000), | 227 | FRATE(none, "sclk_dptxphy", NULL, CLK_IS_ROOT, 24000000), |
203 | FRATE(none, "sclk_uhostphy", NULL, CLK_IS_ROOT, 48000000), | 228 | FRATE(none, "sclk_uhostphy", NULL, CLK_IS_ROOT, 48000000), |
204 | }; | 229 | }; |
205 | 230 | ||
206 | struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { | 231 | static struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = { |
207 | FFACTOR(none, "fout_mplldiv2", "fout_mpll", 1, 2, 0), | 232 | FFACTOR(none, "fout_mplldiv2", "fout_mpll", 1, 2, 0), |
208 | FFACTOR(none, "fout_bplldiv2", "fout_bpll", 1, 2, 0), | 233 | FFACTOR(none, "fout_bplldiv2", "fout_bpll", 1, 2, 0), |
209 | }; | 234 | }; |
210 | 235 | ||
211 | struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | 236 | static struct samsung_mux_clock exynos5250_pll_pmux_clks[] __initdata = { |
237 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), | ||
238 | }; | ||
239 | |||
240 | static struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | ||
212 | MUX_A(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, "mout_apll"), | 241 | MUX_A(none, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, "mout_apll"), |
213 | MUX_A(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), | 242 | MUX_A(none, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1, "mout_cpu"), |
214 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), | 243 | MUX(none, "mout_mpll_fout", mout_mpll_fout_p, PLL_DIV2_SEL, 4, 1), |
215 | MUX_A(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), | 244 | MUX_A(none, "sclk_mpll", mout_mpll_p, SRC_CORE1, 8, 1, "mout_mpll"), |
216 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), | 245 | MUX(none, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1), |
217 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), | 246 | MUX(none, "sclk_bpll", mout_bpll_p, SRC_CDREX, 0, 1), |
218 | MUX(none, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1), | ||
219 | MUX(none, "sclk_vpll", mout_vpll_p, SRC_TOP2, 16, 1), | 247 | MUX(none, "sclk_vpll", mout_vpll_p, SRC_TOP2, 16, 1), |
220 | MUX(none, "sclk_epll", mout_epll_p, SRC_TOP2, 12, 1), | 248 | MUX(none, "sclk_epll", mout_epll_p, SRC_TOP2, 12, 1), |
221 | MUX(none, "sclk_cpll", mout_cpll_p, SRC_TOP2, 8, 1), | 249 | MUX(none, "sclk_cpll", mout_cpll_p, SRC_TOP2, 8, 1), |
@@ -232,7 +260,7 @@ struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | |||
232 | MUX(none, "mout_fimd1", mout_group1_p, SRC_DISP1_0, 0, 4), | 260 | MUX(none, "mout_fimd1", mout_group1_p, SRC_DISP1_0, 0, 4), |
233 | MUX(none, "mout_mipi1", mout_group1_p, SRC_DISP1_0, 12, 4), | 261 | MUX(none, "mout_mipi1", mout_group1_p, SRC_DISP1_0, 12, 4), |
234 | MUX(none, "mout_dp", mout_group1_p, SRC_DISP1_0, 16, 4), | 262 | MUX(none, "mout_dp", mout_group1_p, SRC_DISP1_0, 16, 4), |
235 | MUX(none, "mout_hdmi", mout_hdmi_p, SRC_DISP1_0, 20, 1), | 263 | MUX(mout_hdmi, "mout_hdmi", mout_hdmi_p, SRC_DISP1_0, 20, 1), |
236 | MUX(none, "mout_audio0", mout_audio0_p, SRC_MAU, 0, 4), | 264 | MUX(none, "mout_audio0", mout_audio0_p, SRC_MAU, 0, 4), |
237 | MUX(none, "mout_mmc0", mout_group1_p, SRC_FSYS, 0, 4), | 265 | MUX(none, "mout_mmc0", mout_group1_p, SRC_FSYS, 0, 4), |
238 | MUX(none, "mout_mmc1", mout_group1_p, SRC_FSYS, 4, 4), | 266 | MUX(none, "mout_mmc1", mout_group1_p, SRC_FSYS, 4, 4), |
@@ -254,7 +282,7 @@ struct samsung_mux_clock exynos5250_mux_clks[] __initdata = { | |||
254 | MUX(none, "mout_spi2", mout_group1_p, SRC_PERIC1, 24, 4), | 282 | MUX(none, "mout_spi2", mout_group1_p, SRC_PERIC1, 24, 4), |
255 | }; | 283 | }; |
256 | 284 | ||
257 | struct samsung_div_clock exynos5250_div_clks[] __initdata = { | 285 | static struct samsung_div_clock exynos5250_div_clks[] __initdata = { |
258 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), | 286 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), |
259 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), | 287 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), |
260 | DIV(none, "aclk66_pre", "sclk_mpll_user", DIV_TOP1, 24, 3), | 288 | DIV(none, "aclk66_pre", "sclk_mpll_user", DIV_TOP1, 24, 3), |
@@ -314,7 +342,7 @@ struct samsung_div_clock exynos5250_div_clks[] __initdata = { | |||
314 | DIV_PERIC2, 8, 8, CLK_SET_RATE_PARENT, 0), | 342 | DIV_PERIC2, 8, 8, CLK_SET_RATE_PARENT, 0), |
315 | }; | 343 | }; |
316 | 344 | ||
317 | struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { | 345 | static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { |
318 | GATE(gscl0, "gscl0", "none", GATE_IP_GSCL, 0, 0, 0), | 346 | GATE(gscl0, "gscl0", "none", GATE_IP_GSCL, 0, 0, 0), |
319 | GATE(gscl1, "gscl1", "none", GATE_IP_GSCL, 1, 0, 0), | 347 | GATE(gscl1, "gscl1", "none", GATE_IP_GSCL, 1, 0, 0), |
320 | GATE(gscl2, "gscl2", "aclk266", GATE_IP_GSCL, 2, 0, 0), | 348 | GATE(gscl2, "gscl2", "aclk266", GATE_IP_GSCL, 2, 0, 0), |
@@ -461,20 +489,60 @@ struct samsung_gate_clock exynos5250_gate_clks[] __initdata = { | |||
461 | GATE(mie1, "mie1", "aclk200", GATE_IP_DISP1, 1, 0, 0), | 489 | GATE(mie1, "mie1", "aclk200", GATE_IP_DISP1, 1, 0, 0), |
462 | GATE(dsim0, "dsim0", "aclk200", GATE_IP_DISP1, 3, 0, 0), | 490 | GATE(dsim0, "dsim0", "aclk200", GATE_IP_DISP1, 3, 0, 0), |
463 | GATE(dp, "dp", "aclk200", GATE_IP_DISP1, 4, 0, 0), | 491 | GATE(dp, "dp", "aclk200", GATE_IP_DISP1, 4, 0, 0), |
464 | GATE(mixer, "mixer", "aclk200", GATE_IP_DISP1, 5, 0, 0), | 492 | GATE(mixer, "mixer", "mout_aclk200_disp1", GATE_IP_DISP1, 5, 0, 0), |
465 | GATE(hdmi, "hdmi", "aclk200", GATE_IP_DISP1, 6, 0, 0), | 493 | GATE(hdmi, "hdmi", "mout_aclk200_disp1", GATE_IP_DISP1, 6, 0, 0), |
494 | GATE(g2d, "g2d", "aclk200", GATE_IP_ACP, 3, 0, 0), | ||
495 | }; | ||
496 | |||
497 | static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = { | ||
498 | /* sorted in descending order */ | ||
499 | /* PLL_36XX_RATE(rate, m, p, s, k) */ | ||
500 | PLL_36XX_RATE(266000000, 266, 3, 3, 0), | ||
501 | /* Not in UM, but need for eDP on snow */ | ||
502 | PLL_36XX_RATE(70500000, 94, 2, 4, 0), | ||
503 | { }, | ||
504 | }; | ||
505 | |||
506 | static struct samsung_pll_rate_table epll_24mhz_tbl[] __initdata = { | ||
507 | /* sorted in descending order */ | ||
508 | /* PLL_36XX_RATE(rate, m, p, s, k) */ | ||
509 | PLL_36XX_RATE(192000000, 64, 2, 2, 0), | ||
510 | PLL_36XX_RATE(180633600, 90, 3, 2, 20762), | ||
511 | PLL_36XX_RATE(180000000, 90, 3, 2, 0), | ||
512 | PLL_36XX_RATE(73728000, 98, 2, 4, 19923), | ||
513 | PLL_36XX_RATE(67737600, 90, 2, 4, 20762), | ||
514 | PLL_36XX_RATE(49152000, 98, 3, 4, 19923), | ||
515 | PLL_36XX_RATE(45158400, 90, 3, 4, 20762), | ||
516 | PLL_36XX_RATE(32768000, 131, 3, 5, 4719), | ||
517 | { }, | ||
518 | }; | ||
519 | |||
520 | static struct samsung_pll_clock exynos5250_plls[nr_plls] __initdata = { | ||
521 | [apll] = PLL_A(pll_35xx, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, | ||
522 | APLL_CON0, "fout_apll", NULL), | ||
523 | [mpll] = PLL_A(pll_35xx, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, | ||
524 | MPLL_CON0, "fout_mpll", NULL), | ||
525 | [bpll] = PLL(pll_35xx, fout_bpll, "fout_bpll", "fin_pll", BPLL_LOCK, | ||
526 | BPLL_CON0, NULL), | ||
527 | [gpll] = PLL(pll_35xx, fout_gpll, "fout_gpll", "fin_pll", GPLL_LOCK, | ||
528 | GPLL_CON0, NULL), | ||
529 | [cpll] = PLL(pll_35xx, fout_cpll, "fout_cpll", "fin_pll", CPLL_LOCK, | ||
530 | CPLL_CON0, NULL), | ||
531 | [epll] = PLL(pll_36xx, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, | ||
532 | EPLL_CON0, NULL), | ||
533 | [vpll] = PLL(pll_36xx, fout_vpll, "fout_vpll", "mout_vpllsrc", | ||
534 | VPLL_LOCK, VPLL_CON0, NULL), | ||
466 | }; | 535 | }; |
467 | 536 | ||
468 | static __initdata struct of_device_id ext_clk_match[] = { | 537 | static struct of_device_id ext_clk_match[] __initdata = { |
469 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, | 538 | { .compatible = "samsung,clock-xxti", .data = (void *)0, }, |
470 | { }, | 539 | { }, |
471 | }; | 540 | }; |
472 | 541 | ||
473 | /* register exynox5250 clocks */ | 542 | /* register exynox5250 clocks */ |
474 | void __init exynos5250_clk_init(struct device_node *np) | 543 | static void __init exynos5250_clk_init(struct device_node *np) |
475 | { | 544 | { |
476 | void __iomem *reg_base; | 545 | void __iomem *reg_base; |
477 | struct clk *apll, *mpll, *epll, *vpll, *bpll, *gpll, *cpll; | ||
478 | 546 | ||
479 | if (np) { | 547 | if (np) { |
480 | reg_base = of_iomap(np, 0); | 548 | reg_base = of_iomap(np, 0); |
@@ -490,22 +558,17 @@ void __init exynos5250_clk_init(struct device_node *np) | |||
490 | samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks, | 558 | samsung_clk_of_register_fixed_ext(exynos5250_fixed_rate_ext_clks, |
491 | ARRAY_SIZE(exynos5250_fixed_rate_ext_clks), | 559 | ARRAY_SIZE(exynos5250_fixed_rate_ext_clks), |
492 | ext_clk_match); | 560 | ext_clk_match); |
561 | samsung_clk_register_mux(exynos5250_pll_pmux_clks, | ||
562 | ARRAY_SIZE(exynos5250_pll_pmux_clks)); | ||
563 | |||
564 | if (_get_rate("fin_pll") == 24 * MHZ) | ||
565 | exynos5250_plls[epll].rate_table = epll_24mhz_tbl; | ||
493 | 566 | ||
494 | apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", | 567 | if (_get_rate("mout_vpllsrc") == 24 * MHZ) |
495 | reg_base + 0x100); | 568 | exynos5250_plls[vpll].rate_table = vpll_24mhz_tbl; |
496 | mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", | ||
497 | reg_base + 0x4100); | ||
498 | bpll = samsung_clk_register_pll35xx("fout_bpll", "fin_pll", | ||
499 | reg_base + 0x20110); | ||
500 | gpll = samsung_clk_register_pll35xx("fout_gpll", "fin_pll", | ||
501 | reg_base + 0x10150); | ||
502 | cpll = samsung_clk_register_pll35xx("fout_cpll", "fin_pll", | ||
503 | reg_base + 0x10120); | ||
504 | epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", | ||
505 | reg_base + 0x10130); | ||
506 | vpll = samsung_clk_register_pll36xx("fout_vpll", "mout_vpllsrc", | ||
507 | reg_base + 0x10140); | ||
508 | 569 | ||
570 | samsung_clk_register_pll(exynos5250_plls, ARRAY_SIZE(exynos5250_plls), | ||
571 | reg_base); | ||
509 | samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks, | 572 | samsung_clk_register_fixed_rate(exynos5250_fixed_rate_clks, |
510 | ARRAY_SIZE(exynos5250_fixed_rate_clks)); | 573 | ARRAY_SIZE(exynos5250_fixed_rate_clks)); |
511 | samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks, | 574 | samsung_clk_register_fixed_factor(exynos5250_fixed_factor_clks, |
diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c index 68a96cbd4936..48c4a9350b91 100644 --- a/drivers/clk/samsung/clk-exynos5420.c +++ b/drivers/clk/samsung/clk-exynos5420.c | |||
@@ -17,13 +17,30 @@ | |||
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include "clk.h" | 19 | #include "clk.h" |
20 | #include "clk-pll.h" | ||
21 | 20 | ||
21 | #define APLL_LOCK 0x0 | ||
22 | #define APLL_CON0 0x100 | ||
22 | #define SRC_CPU 0x200 | 23 | #define SRC_CPU 0x200 |
23 | #define DIV_CPU0 0x500 | 24 | #define DIV_CPU0 0x500 |
24 | #define DIV_CPU1 0x504 | 25 | #define DIV_CPU1 0x504 |
25 | #define GATE_BUS_CPU 0x700 | 26 | #define GATE_BUS_CPU 0x700 |
26 | #define GATE_SCLK_CPU 0x800 | 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 | #define SRC_TOP0 0x10200 | 44 | #define SRC_TOP0 0x10200 |
28 | #define SRC_TOP1 0x10204 | 45 | #define SRC_TOP1 0x10204 |
29 | #define SRC_TOP2 0x10208 | 46 | #define SRC_TOP2 0x10208 |
@@ -75,15 +92,27 @@ | |||
75 | #define GATE_TOP_SCLK_MAU 0x1083c | 92 | #define GATE_TOP_SCLK_MAU 0x1083c |
76 | #define GATE_TOP_SCLK_FSYS 0x10840 | 93 | #define GATE_TOP_SCLK_FSYS 0x10840 |
77 | #define GATE_TOP_SCLK_PERIC 0x10850 | 94 | #define GATE_TOP_SCLK_PERIC 0x10850 |
95 | #define BPLL_LOCK 0x20010 | ||
96 | #define BPLL_CON0 0x20110 | ||
78 | #define SRC_CDREX 0x20200 | 97 | #define SRC_CDREX 0x20200 |
98 | #define KPLL_LOCK 0x28000 | ||
99 | #define KPLL_CON0 0x28100 | ||
79 | #define SRC_KFC 0x28200 | 100 | #define SRC_KFC 0x28200 |
80 | #define DIV_KFC0 0x28500 | 101 | #define DIV_KFC0 0x28500 |
81 | 102 | ||
103 | /* list of PLLs */ | ||
104 | enum exynos5420_plls { | ||
105 | apll, cpll, dpll, epll, rpll, ipll, spll, vpll, mpll, | ||
106 | bpll, kpll, | ||
107 | nr_plls /* number of PLLs */ | ||
108 | }; | ||
109 | |||
82 | enum exynos5420_clks { | 110 | enum exynos5420_clks { |
83 | none, | 111 | none, |
84 | 112 | ||
85 | /* core clocks */ | 113 | /* core clocks */ |
86 | fin_pll, | 114 | fin_pll, fout_apll, fout_cpll, fout_dpll, fout_epll, fout_rpll, |
115 | fout_ipll, fout_spll, fout_vpll, fout_mpll, fout_bpll, fout_kpll, | ||
87 | 116 | ||
88 | /* gate for special clocks (sclk) */ | 117 | /* gate for special clocks (sclk) */ |
89 | sclk_uart0 = 128, sclk_uart1, sclk_uart2, sclk_uart3, sclk_mmc0, | 118 | sclk_uart0 = 128, sclk_uart1, sclk_uart2, sclk_uart3, sclk_mmc0, |
@@ -91,7 +120,7 @@ enum exynos5420_clks { | |||
91 | sclk_i2s2, sclk_pcm1, sclk_pcm2, sclk_spdif, sclk_hdmi, sclk_pixel, | 120 | sclk_i2s2, sclk_pcm1, sclk_pcm2, sclk_spdif, sclk_hdmi, sclk_pixel, |
92 | sclk_dp1, sclk_mipi1, sclk_fimd1, sclk_maudio0, sclk_maupcm0, | 121 | sclk_dp1, sclk_mipi1, sclk_fimd1, sclk_maudio0, sclk_maupcm0, |
93 | sclk_usbd300, sclk_usbd301, sclk_usbphy300, sclk_usbphy301, sclk_unipro, | 122 | sclk_usbd300, sclk_usbd301, sclk_usbphy300, sclk_usbphy301, sclk_unipro, |
94 | sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, | 123 | sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, sclk_hdmiphy, |
95 | 124 | ||
96 | /* gate clocks */ | 125 | /* gate clocks */ |
97 | aclk66_peric = 256, uart0, uart1, uart2, uart3, i2c0, i2c1, i2c2, i2c3, | 126 | aclk66_peric = 256, uart0, uart1, uart2, uart3, i2c0, i2c1, i2c2, i2c3, |
@@ -109,7 +138,13 @@ enum exynos5420_clks { | |||
109 | aclk300_gscl = 460, smmu_gscl0, smmu_gscl1, gscl_wa, gscl_wb, gscl0, | 138 | aclk300_gscl = 460, smmu_gscl0, smmu_gscl1, gscl_wa, gscl_wb, gscl0, |
110 | gscl1, clk_3aa, aclk266_g2d = 470, sss, slim_sss, mdma0, | 139 | gscl1, clk_3aa, aclk266_g2d = 470, sss, slim_sss, mdma0, |
111 | aclk333_g2d = 480, g2d, aclk333_432_gscl = 490, smmu_3aa, smmu_fimcl0, | 140 | aclk333_g2d = 480, g2d, aclk333_432_gscl = 490, smmu_3aa, smmu_fimcl0, |
112 | smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, | 141 | smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, smmu_mixer, |
142 | |||
143 | /* mux clocks */ | ||
144 | mout_hdmi = 640, | ||
145 | |||
146 | /* divider clocks */ | ||
147 | dout_pixel = 768, | ||
113 | 148 | ||
114 | nr_clks, | 149 | nr_clks, |
115 | }; | 150 | }; |
@@ -118,7 +153,7 @@ enum exynos5420_clks { | |||
118 | * list of controller registers to be saved and restored during a | 153 | * list of controller registers to be saved and restored during a |
119 | * suspend/resume cycle. | 154 | * suspend/resume cycle. |
120 | */ | 155 | */ |
121 | static __initdata unsigned long exynos5420_clk_regs[] = { | 156 | static unsigned long exynos5420_clk_regs[] __initdata = { |
122 | SRC_CPU, | 157 | SRC_CPU, |
123 | DIV_CPU0, | 158 | DIV_CPU0, |
124 | DIV_CPU1, | 159 | DIV_CPU1, |
@@ -257,29 +292,29 @@ PNAME(audio2_p) = { "fin_pll", "cdclk2", "sclk_dpll", "sclk_mpll", | |||
257 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 292 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
258 | PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", | 293 | PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", |
259 | "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 294 | "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
260 | PNAME(hdmi_p) = { "sclk_hdmiphy", "dout_hdmi_pixel" }; | 295 | PNAME(hdmi_p) = { "dout_hdmi_pixel", "sclk_hdmiphy" }; |
261 | PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", | 296 | PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", |
262 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 297 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
263 | 298 | ||
264 | /* fixed rate clocks generated outside the soc */ | 299 | /* fixed rate clocks generated outside the soc */ |
265 | struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { | 300 | static struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { |
266 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), | 301 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), |
267 | }; | 302 | }; |
268 | 303 | ||
269 | /* fixed rate clocks generated inside the soc */ | 304 | /* fixed rate clocks generated inside the soc */ |
270 | struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { | 305 | static struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { |
271 | FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), | 306 | FRATE(sclk_hdmiphy, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), |
272 | FRATE(none, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), | 307 | FRATE(none, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), |
273 | FRATE(none, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), | 308 | FRATE(none, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), |
274 | FRATE(none, "mphy_refclk_ixtal24", NULL, CLK_IS_ROOT, 48000000), | 309 | FRATE(none, "mphy_refclk_ixtal24", NULL, CLK_IS_ROOT, 48000000), |
275 | FRATE(none, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), | 310 | FRATE(none, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), |
276 | }; | 311 | }; |
277 | 312 | ||
278 | struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { | 313 | static struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { |
279 | FFACTOR(none, "sclk_hsic_12m", "fin_pll", 1, 2, 0), | 314 | FFACTOR(none, "sclk_hsic_12m", "fin_pll", 1, 2, 0), |
280 | }; | 315 | }; |
281 | 316 | ||
282 | struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | 317 | static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { |
283 | MUX(none, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), | 318 | MUX(none, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), |
284 | MUX(none, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), | 319 | MUX(none, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), |
285 | MUX(none, "mout_apll", apll_p, SRC_CPU, 0, 1), | 320 | MUX(none, "mout_apll", apll_p, SRC_CPU, 0, 1), |
@@ -371,7 +406,7 @@ struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | |||
371 | MUX(none, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), | 406 | MUX(none, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), |
372 | MUX(none, "mout_dp1", group2_p, SRC_DISP10, 20, 3), | 407 | MUX(none, "mout_dp1", group2_p, SRC_DISP10, 20, 3), |
373 | MUX(none, "mout_pixel", group2_p, SRC_DISP10, 24, 3), | 408 | MUX(none, "mout_pixel", group2_p, SRC_DISP10, 24, 3), |
374 | MUX(none, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), | 409 | MUX(mout_hdmi, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), |
375 | 410 | ||
376 | /* MAU Block */ | 411 | /* MAU Block */ |
377 | MUX(none, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), | 412 | MUX(none, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), |
@@ -399,7 +434,7 @@ struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | |||
399 | MUX(none, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), | 434 | MUX(none, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), |
400 | }; | 435 | }; |
401 | 436 | ||
402 | struct samsung_div_clock exynos5420_div_clks[] __initdata = { | 437 | static struct samsung_div_clock exynos5420_div_clks[] __initdata = { |
403 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), | 438 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), |
404 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), | 439 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), |
405 | DIV(none, "armclk2", "div_arm", DIV_CPU0, 28, 3), | 440 | DIV(none, "armclk2", "div_arm", DIV_CPU0, 28, 3), |
@@ -431,7 +466,7 @@ struct samsung_div_clock exynos5420_div_clks[] __initdata = { | |||
431 | DIV(none, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), | 466 | DIV(none, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), |
432 | DIV(none, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), | 467 | DIV(none, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), |
433 | DIV(none, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), | 468 | DIV(none, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), |
434 | DIV(none, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), | 469 | DIV(dout_pixel, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), |
435 | 470 | ||
436 | /* Audio Block */ | 471 | /* Audio Block */ |
437 | DIV(none, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), | 472 | DIV(none, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), |
@@ -479,7 +514,7 @@ struct samsung_div_clock exynos5420_div_clks[] __initdata = { | |||
479 | DIV(none, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), | 514 | DIV(none, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), |
480 | }; | 515 | }; |
481 | 516 | ||
482 | struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { | 517 | static struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { |
483 | /* TODO: Re-verify the CG bits for all the gate clocks */ | 518 | /* TODO: Re-verify the CG bits for all the gate clocks */ |
484 | GATE_A(mct, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, "mct"), | 519 | GATE_A(mct, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, "mct"), |
485 | 520 | ||
@@ -696,19 +731,43 @@ struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { | |||
696 | GATE(smmu_mscl0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 0), | 731 | GATE(smmu_mscl0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 0), |
697 | GATE(smmu_mscl1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 0), | 732 | GATE(smmu_mscl1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 0), |
698 | GATE(smmu_mscl2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 0), | 733 | GATE(smmu_mscl2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 0), |
734 | GATE(smmu_mixer, "smmu_mixer", "aclk200_disp1", GATE_IP_DISP1, 9, 0, 0), | ||
699 | }; | 735 | }; |
700 | 736 | ||
701 | static __initdata struct of_device_id ext_clk_match[] = { | 737 | static struct samsung_pll_clock exynos5420_plls[nr_plls] __initdata = { |
738 | [apll] = PLL(pll_2550, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, | ||
739 | APLL_CON0, NULL), | ||
740 | [cpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, | ||
741 | MPLL_CON0, NULL), | ||
742 | [dpll] = PLL(pll_2550, fout_dpll, "fout_dpll", "fin_pll", DPLL_LOCK, | ||
743 | DPLL_CON0, NULL), | ||
744 | [epll] = PLL(pll_2650, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, | ||
745 | EPLL_CON0, NULL), | ||
746 | [rpll] = PLL(pll_2650, fout_rpll, "fout_rpll", "fin_pll", RPLL_LOCK, | ||
747 | RPLL_CON0, NULL), | ||
748 | [ipll] = PLL(pll_2550, fout_ipll, "fout_ipll", "fin_pll", IPLL_LOCK, | ||
749 | IPLL_CON0, NULL), | ||
750 | [spll] = PLL(pll_2550, fout_spll, "fout_spll", "fin_pll", SPLL_LOCK, | ||
751 | SPLL_CON0, NULL), | ||
752 | [vpll] = PLL(pll_2550, fout_vpll, "fout_vpll", "fin_pll", VPLL_LOCK, | ||
753 | VPLL_CON0, NULL), | ||
754 | [mpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, | ||
755 | MPLL_CON0, NULL), | ||
756 | [bpll] = PLL(pll_2550, fout_bpll, "fout_bpll", "fin_pll", BPLL_LOCK, | ||
757 | BPLL_CON0, NULL), | ||
758 | [kpll] = PLL(pll_2550, fout_kpll, "fout_kpll", "fin_pll", KPLL_LOCK, | ||
759 | KPLL_CON0, NULL), | ||
760 | }; | ||
761 | |||
762 | static struct of_device_id ext_clk_match[] __initdata = { | ||
702 | { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, | 763 | { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, |
703 | { }, | 764 | { }, |
704 | }; | 765 | }; |
705 | 766 | ||
706 | /* register exynos5420 clocks */ | 767 | /* register exynos5420 clocks */ |
707 | void __init exynos5420_clk_init(struct device_node *np) | 768 | static void __init exynos5420_clk_init(struct device_node *np) |
708 | { | 769 | { |
709 | void __iomem *reg_base; | 770 | void __iomem *reg_base; |
710 | struct clk *apll, *bpll, *cpll, *dpll, *epll, *ipll, *kpll, *mpll; | ||
711 | struct clk *rpll, *spll, *vpll; | ||
712 | 771 | ||
713 | if (np) { | 772 | if (np) { |
714 | reg_base = of_iomap(np, 0); | 773 | reg_base = of_iomap(np, 0); |
@@ -724,30 +783,8 @@ void __init exynos5420_clk_init(struct device_node *np) | |||
724 | samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, | 783 | samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, |
725 | ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), | 784 | ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), |
726 | ext_clk_match); | 785 | ext_clk_match); |
727 | 786 | samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls), | |
728 | apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", | 787 | reg_base); |
729 | reg_base + 0x100); | ||
730 | bpll = samsung_clk_register_pll35xx("fout_bpll", "fin_pll", | ||
731 | reg_base + 0x20110); | ||
732 | cpll = samsung_clk_register_pll35xx("fout_cpll", "fin_pll", | ||
733 | reg_base + 0x10120); | ||
734 | dpll = samsung_clk_register_pll35xx("fout_dpll", "fin_pll", | ||
735 | reg_base + 0x10128); | ||
736 | epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", | ||
737 | reg_base + 0x10130); | ||
738 | ipll = samsung_clk_register_pll35xx("fout_ipll", "fin_pll", | ||
739 | reg_base + 0x10150); | ||
740 | kpll = samsung_clk_register_pll35xx("fout_kpll", "fin_pll", | ||
741 | reg_base + 0x28100); | ||
742 | mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", | ||
743 | reg_base + 0x10180); | ||
744 | rpll = samsung_clk_register_pll36xx("fout_rpll", "fin_pll", | ||
745 | reg_base + 0x10140); | ||
746 | spll = samsung_clk_register_pll35xx("fout_spll", "fin_pll", | ||
747 | reg_base + 0x10160); | ||
748 | vpll = samsung_clk_register_pll35xx("fout_vpll", "fin_pll", | ||
749 | reg_base + 0x10170); | ||
750 | |||
751 | samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, | 788 | samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, |
752 | ARRAY_SIZE(exynos5420_fixed_rate_clks)); | 789 | ARRAY_SIZE(exynos5420_fixed_rate_clks)); |
753 | samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks, | 790 | samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks, |
diff --git a/drivers/clk/samsung/clk-exynos5440.c b/drivers/clk/samsung/clk-exynos5440.c index 7d5434167a96..f8658945bfd2 100644 --- a/drivers/clk/samsung/clk-exynos5440.c +++ b/drivers/clk/samsung/clk-exynos5440.c | |||
@@ -41,12 +41,12 @@ PNAME(mout_armclk_p) = { "cplla", "cpllb" }; | |||
41 | PNAME(mout_spi_p) = { "div125", "div200" }; | 41 | PNAME(mout_spi_p) = { "div125", "div200" }; |
42 | 42 | ||
43 | /* fixed rate clocks generated outside the soc */ | 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 | FRATE(none, "xtal", NULL, CLK_IS_ROOT, 0), | 45 | FRATE(none, "xtal", NULL, CLK_IS_ROOT, 0), |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* fixed rate clocks */ | 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 | FRATE(none, "ppll", NULL, CLK_IS_ROOT, 1000000000), | 50 | FRATE(none, "ppll", NULL, CLK_IS_ROOT, 1000000000), |
51 | FRATE(none, "usb_phy0", NULL, CLK_IS_ROOT, 60000000), | 51 | FRATE(none, "usb_phy0", NULL, CLK_IS_ROOT, 60000000), |
52 | FRATE(none, "usb_phy1", NULL, CLK_IS_ROOT, 60000000), | 52 | FRATE(none, "usb_phy1", NULL, CLK_IS_ROOT, 60000000), |
@@ -55,26 +55,26 @@ struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initdata = { | |||
55 | }; | 55 | }; |
56 | 56 | ||
57 | /* fixed factor clocks */ | 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 | FFACTOR(none, "div250", "ppll", 1, 4, 0), | 59 | FFACTOR(none, "div250", "ppll", 1, 4, 0), |
60 | FFACTOR(none, "div200", "ppll", 1, 5, 0), | 60 | FFACTOR(none, "div200", "ppll", 1, 5, 0), |
61 | FFACTOR(none, "div125", "div250", 1, 2, 0), | 61 | FFACTOR(none, "div125", "div250", 1, 2, 0), |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* mux clocks */ | 64 | /* mux clocks */ |
65 | struct samsung_mux_clock exynos5440_mux_clks[] __initdata = { | 65 | static struct samsung_mux_clock exynos5440_mux_clks[] __initdata = { |
66 | MUX(none, "mout_spi", mout_spi_p, MISC_DOUT1, 5, 1), | 66 | MUX(none, "mout_spi", mout_spi_p, MISC_DOUT1, 5, 1), |
67 | MUX_A(arm_clk, "arm_clk", mout_armclk_p, | 67 | MUX_A(arm_clk, "arm_clk", mout_armclk_p, |
68 | CPU_CLK_STATUS, 0, 1, "armclk"), | 68 | CPU_CLK_STATUS, 0, 1, "armclk"), |
69 | }; | 69 | }; |
70 | 70 | ||
71 | /* divider clocks */ | 71 | /* divider clocks */ |
72 | struct samsung_div_clock exynos5440_div_clks[] __initdata = { | 72 | static struct samsung_div_clock exynos5440_div_clks[] __initdata = { |
73 | DIV(spi_baud, "div_spi", "mout_spi", MISC_DOUT1, 3, 2), | 73 | DIV(spi_baud, "div_spi", "mout_spi", MISC_DOUT1, 3, 2), |
74 | }; | 74 | }; |
75 | 75 | ||
76 | /* gate clocks */ | 76 | /* gate clocks */ |
77 | struct samsung_gate_clock exynos5440_gate_clks[] __initdata = { | 77 | static struct samsung_gate_clock exynos5440_gate_clks[] __initdata = { |
78 | GATE(pb0_250, "pb0_250", "div250", CLKEN_OV_VAL, 3, 0, 0), | 78 | GATE(pb0_250, "pb0_250", "div250", CLKEN_OV_VAL, 3, 0, 0), |
79 | GATE(pr0_250, "pr0_250", "div250", CLKEN_OV_VAL, 4, 0, 0), | 79 | GATE(pr0_250, "pr0_250", "div250", CLKEN_OV_VAL, 4, 0, 0), |
80 | GATE(pr1_250, "pr1_250", "div250", CLKEN_OV_VAL, 5, 0, 0), | 80 | GATE(pr1_250, "pr1_250", "div250", CLKEN_OV_VAL, 5, 0, 0), |
@@ -97,13 +97,13 @@ struct samsung_gate_clock exynos5440_gate_clks[] __initdata = { | |||
97 | GATE(cs250_o, "cs250_o", "cs250", CLKEN_OV_VAL, 19, 0, 0), | 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 | { .compatible = "samsung,clock-xtal", .data = (void *)0, }, | 101 | { .compatible = "samsung,clock-xtal", .data = (void *)0, }, |
102 | {}, | 102 | {}, |
103 | }; | 103 | }; |
104 | 104 | ||
105 | /* register exynos5440 clocks */ | 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 | void __iomem *reg_base; | 108 | void __iomem *reg_base; |
109 | 109 | ||
@@ -132,7 +132,7 @@ void __init exynos5440_clk_init(struct device_node *np) | |||
132 | samsung_clk_register_gate(exynos5440_gate_clks, | 132 | samsung_clk_register_gate(exynos5440_gate_clks, |
133 | ARRAY_SIZE(exynos5440_gate_clks)); | 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 | pr_info("exynos5440 clock initialization complete\n"); | 136 | pr_info("exynos5440 clock initialization complete\n"); |
137 | } | 137 | } |
138 | CLK_OF_DECLARE(exynos5440_clk, "samsung,exynos5440-clock", exynos5440_clk_init); | 138 | CLK_OF_DECLARE(exynos5440_clk, "samsung,exynos5440-clock", exynos5440_clk_init); |
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c index 362f12dcd944..529e11dc2c6b 100644 --- a/drivers/clk/samsung/clk-pll.c +++ b/drivers/clk/samsung/clk-pll.c | |||
@@ -10,31 +10,73 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/hrtimer.h> | ||
13 | #include "clk.h" | 14 | #include "clk.h" |
14 | #include "clk-pll.h" | 15 | #include "clk-pll.h" |
15 | 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 | } | ||
60 | |||
16 | /* | 61 | /* |
17 | * PLL35xx Clock Type | 62 | * PLL35xx Clock Type |
18 | */ | 63 | */ |
64 | /* Maximum lock time can be 270 * PDIV cycles */ | ||
65 | #define PLL35XX_LOCK_FACTOR (270) | ||
19 | 66 | ||
20 | #define PLL35XX_MDIV_MASK (0x3FF) | 67 | #define PLL35XX_MDIV_MASK (0x3FF) |
21 | #define PLL35XX_PDIV_MASK (0x3F) | 68 | #define PLL35XX_PDIV_MASK (0x3F) |
22 | #define PLL35XX_SDIV_MASK (0x7) | 69 | #define PLL35XX_SDIV_MASK (0x7) |
70 | #define PLL35XX_LOCK_STAT_MASK (0x1) | ||
23 | #define PLL35XX_MDIV_SHIFT (16) | 71 | #define PLL35XX_MDIV_SHIFT (16) |
24 | #define PLL35XX_PDIV_SHIFT (8) | 72 | #define PLL35XX_PDIV_SHIFT (8) |
25 | #define PLL35XX_SDIV_SHIFT (0) | 73 | #define PLL35XX_SDIV_SHIFT (0) |
26 | 74 | #define PLL35XX_LOCK_STAT_SHIFT (29) | |
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) | ||
33 | 75 | ||
34 | static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw, | 76 | static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw, |
35 | unsigned long parent_rate) | 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 | u32 mdiv, pdiv, sdiv, pll_con; | 80 | u32 mdiv, pdiv, sdiv, pll_con; |
39 | u64 fvco = parent_rate; | 81 | u64 fvco = parent_rate; |
40 | 82 | ||
@@ -49,48 +91,80 @@ static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw, | |||
49 | return (unsigned long)fvco; | 91 | return (unsigned long)fvco; |
50 | } | 92 | } |
51 | 93 | ||
52 | static const struct clk_ops samsung_pll35xx_clk_ops = { | 94 | static inline bool samsung_pll35xx_mp_change( |
53 | .recalc_rate = samsung_pll35xx_recalc_rate, | 95 | const struct samsung_pll_rate_table *rate, u32 pll_con) |
54 | }; | ||
55 | |||
56 | struct clk * __init samsung_clk_register_pll35xx(const char *name, | ||
57 | const char *pname, const void __iomem *con_reg) | ||
58 | { | 96 | { |
59 | struct samsung_clk_pll35xx *pll; | 97 | u32 old_mdiv, old_pdiv; |
60 | struct clk *clk; | ||
61 | struct clk_init_data init; | ||
62 | 98 | ||
63 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | 99 | old_mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK; |
64 | if (!pll) { | 100 | old_pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK; |
65 | pr_err("%s: could not allocate pll clk %s\n", __func__, name); | 101 | |
66 | return NULL; | 102 | return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv); |
103 | } | ||
104 | |||
105 | static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate, | ||
106 | unsigned long prate) | ||
107 | { | ||
108 | struct samsung_clk_pll *pll = to_clk_pll(hw); | ||
109 | const struct samsung_pll_rate_table *rate; | ||
110 | u32 tmp; | ||
111 | |||
112 | /* Get required rate settings from table */ | ||
113 | rate = samsung_get_pll_settings(pll, drate); | ||
114 | if (!rate) { | ||
115 | pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, | ||
116 | drate, __clk_get_name(hw->clk)); | ||
117 | return -EINVAL; | ||
67 | } | 118 | } |
68 | 119 | ||
69 | init.name = name; | 120 | tmp = __raw_readl(pll->con_reg); |
70 | init.ops = &samsung_pll35xx_clk_ops; | ||
71 | init.flags = CLK_GET_RATE_NOCACHE; | ||
72 | init.parent_names = &pname; | ||
73 | init.num_parents = 1; | ||
74 | 121 | ||
75 | pll->hw.init = &init; | 122 | if (!(samsung_pll35xx_mp_change(rate, tmp))) { |
76 | pll->con_reg = con_reg; | 123 | /* If only s change, change just s value only*/ |
124 | tmp &= ~(PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT); | ||
125 | tmp |= rate->sdiv << PLL35XX_SDIV_SHIFT; | ||
126 | __raw_writel(tmp, pll->con_reg); | ||
77 | 127 | ||
78 | clk = clk_register(NULL, &pll->hw); | 128 | return 0; |
79 | if (IS_ERR(clk)) { | ||
80 | pr_err("%s: failed to register pll clock %s\n", __func__, | ||
81 | name); | ||
82 | kfree(pll); | ||
83 | } | 129 | } |
84 | 130 | ||
85 | if (clk_register_clkdev(clk, name, NULL)) | 131 | /* Set PLL lock time. */ |
86 | pr_err("%s: failed to register lookup for %s", __func__, name); | 132 | __raw_writel(rate->pdiv * PLL35XX_LOCK_FACTOR, |
87 | 133 | pll->lock_reg); | |
88 | return clk; | 134 | |
135 | /* Change PLL PMS values */ | ||
136 | tmp &= ~((PLL35XX_MDIV_MASK << PLL35XX_MDIV_SHIFT) | | ||
137 | (PLL35XX_PDIV_MASK << PLL35XX_PDIV_SHIFT) | | ||
138 | (PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT)); | ||
139 | tmp |= (rate->mdiv << PLL35XX_MDIV_SHIFT) | | ||
140 | (rate->pdiv << PLL35XX_PDIV_SHIFT) | | ||
141 | (rate->sdiv << PLL35XX_SDIV_SHIFT); | ||
142 | __raw_writel(tmp, pll->con_reg); | ||
143 | |||
144 | /* wait_lock_time */ | ||
145 | do { | ||
146 | cpu_relax(); | ||
147 | tmp = __raw_readl(pll->con_reg); | ||
148 | } while (!(tmp & (PLL35XX_LOCK_STAT_MASK | ||
149 | << PLL35XX_LOCK_STAT_SHIFT))); | ||
150 | return 0; | ||
89 | } | 151 | } |
90 | 152 | ||
153 | static const struct clk_ops samsung_pll35xx_clk_ops = { | ||
154 | .recalc_rate = samsung_pll35xx_recalc_rate, | ||
155 | .round_rate = samsung_pll_round_rate, | ||
156 | .set_rate = samsung_pll35xx_set_rate, | ||
157 | }; | ||
158 | |||
159 | static const struct clk_ops samsung_pll35xx_clk_min_ops = { | ||
160 | .recalc_rate = samsung_pll35xx_recalc_rate, | ||
161 | }; | ||
162 | |||
91 | /* | 163 | /* |
92 | * PLL36xx Clock Type | 164 | * PLL36xx Clock Type |
93 | */ | 165 | */ |
166 | /* Maximum lock time can be 3000 * PDIV cycles */ | ||
167 | #define PLL36XX_LOCK_FACTOR (3000) | ||
94 | 168 | ||
95 | #define PLL36XX_KDIV_MASK (0xFFFF) | 169 | #define PLL36XX_KDIV_MASK (0xFFFF) |
96 | #define PLL36XX_MDIV_MASK (0x1FF) | 170 | #define PLL36XX_MDIV_MASK (0x1FF) |
@@ -99,18 +173,13 @@ struct clk * __init samsung_clk_register_pll35xx(const char *name, | |||
99 | #define PLL36XX_MDIV_SHIFT (16) | 173 | #define PLL36XX_MDIV_SHIFT (16) |
100 | #define PLL36XX_PDIV_SHIFT (8) | 174 | #define PLL36XX_PDIV_SHIFT (8) |
101 | #define PLL36XX_SDIV_SHIFT (0) | 175 | #define PLL36XX_SDIV_SHIFT (0) |
102 | 176 | #define PLL36XX_KDIV_SHIFT (0) | |
103 | struct samsung_clk_pll36xx { | 177 | #define PLL36XX_LOCK_STAT_SHIFT (29) |
104 | struct clk_hw hw; | ||
105 | const void __iomem *con_reg; | ||
106 | }; | ||
107 | |||
108 | #define to_clk_pll36xx(_hw) container_of(_hw, struct samsung_clk_pll36xx, hw) | ||
109 | 178 | ||
110 | static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | 179 | static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, |
111 | unsigned long parent_rate) | 180 | unsigned long parent_rate) |
112 | { | 181 | { |
113 | struct samsung_clk_pll36xx *pll = to_clk_pll36xx(hw); | 182 | struct samsung_clk_pll *pll = to_clk_pll(hw); |
114 | u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; | 183 | u32 mdiv, pdiv, sdiv, pll_con0, pll_con1; |
115 | s16 kdiv; | 184 | s16 kdiv; |
116 | u64 fvco = parent_rate; | 185 | u64 fvco = parent_rate; |
@@ -129,68 +198,102 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw, | |||
129 | return (unsigned long)fvco; | 198 | return (unsigned long)fvco; |
130 | } | 199 | } |
131 | 200 | ||
132 | static const struct clk_ops samsung_pll36xx_clk_ops = { | 201 | static inline bool samsung_pll36xx_mpk_change( |
133 | .recalc_rate = samsung_pll36xx_recalc_rate, | 202 | const struct samsung_pll_rate_table *rate, u32 pll_con0, u32 pll_con1) |
134 | }; | ||
135 | |||
136 | struct clk * __init samsung_clk_register_pll36xx(const char *name, | ||
137 | const char *pname, const void __iomem *con_reg) | ||
138 | { | 203 | { |
139 | struct samsung_clk_pll36xx *pll; | 204 | u32 old_mdiv, old_pdiv, old_kdiv; |
140 | struct clk *clk; | ||
141 | struct clk_init_data init; | ||
142 | 205 | ||
143 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | 206 | old_mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK; |
144 | if (!pll) { | 207 | old_pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK; |
145 | pr_err("%s: could not allocate pll clk %s\n", __func__, name); | 208 | old_kdiv = (pll_con1 >> PLL36XX_KDIV_SHIFT) & PLL36XX_KDIV_MASK; |
146 | return NULL; | 209 | |
210 | return (rate->mdiv != old_mdiv || rate->pdiv != old_pdiv || | ||
211 | rate->kdiv != old_kdiv); | ||
212 | } | ||
213 | |||
214 | static int samsung_pll36xx_set_rate(struct clk_hw *hw, unsigned long drate, | ||
215 | unsigned long parent_rate) | ||
216 | { | ||
217 | struct samsung_clk_pll *pll = to_clk_pll(hw); | ||
218 | u32 tmp, pll_con0, pll_con1; | ||
219 | const struct samsung_pll_rate_table *rate; | ||
220 | |||
221 | rate = samsung_get_pll_settings(pll, drate); | ||
222 | if (!rate) { | ||
223 | pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, | ||
224 | drate, __clk_get_name(hw->clk)); | ||
225 | return -EINVAL; | ||
147 | } | 226 | } |
148 | 227 | ||
149 | init.name = name; | 228 | pll_con0 = __raw_readl(pll->con_reg); |
150 | init.ops = &samsung_pll36xx_clk_ops; | 229 | pll_con1 = __raw_readl(pll->con_reg + 4); |
151 | init.flags = CLK_GET_RATE_NOCACHE; | ||
152 | init.parent_names = &pname; | ||
153 | init.num_parents = 1; | ||
154 | 230 | ||
155 | pll->hw.init = &init; | 231 | if (!(samsung_pll36xx_mpk_change(rate, pll_con0, pll_con1))) { |
156 | pll->con_reg = con_reg; | 232 | /* If only s change, change just s value only*/ |
233 | pll_con0 &= ~(PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT); | ||
234 | pll_con0 |= (rate->sdiv << PLL36XX_SDIV_SHIFT); | ||
235 | __raw_writel(pll_con0, pll->con_reg); | ||
157 | 236 | ||
158 | clk = clk_register(NULL, &pll->hw); | 237 | return 0; |
159 | if (IS_ERR(clk)) { | ||
160 | pr_err("%s: failed to register pll clock %s\n", __func__, | ||
161 | name); | ||
162 | kfree(pll); | ||
163 | } | 238 | } |
164 | 239 | ||
165 | if (clk_register_clkdev(clk, name, NULL)) | 240 | /* Set PLL lock time. */ |
166 | pr_err("%s: failed to register lookup for %s", __func__, name); | 241 | __raw_writel(rate->pdiv * PLL36XX_LOCK_FACTOR, pll->lock_reg); |
167 | 242 | ||
168 | return clk; | 243 | /* Change PLL PMS values */ |
244 | pll_con0 &= ~((PLL36XX_MDIV_MASK << PLL36XX_MDIV_SHIFT) | | ||
245 | (PLL36XX_PDIV_MASK << PLL36XX_PDIV_SHIFT) | | ||
246 | (PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT)); | ||
247 | pll_con0 |= (rate->mdiv << PLL36XX_MDIV_SHIFT) | | ||
248 | (rate->pdiv << PLL36XX_PDIV_SHIFT) | | ||
249 | (rate->sdiv << PLL36XX_SDIV_SHIFT); | ||
250 | __raw_writel(pll_con0, pll->con_reg); | ||
251 | |||
252 | pll_con1 &= ~(PLL36XX_KDIV_MASK << PLL36XX_KDIV_SHIFT); | ||
253 | pll_con1 |= rate->kdiv << PLL36XX_KDIV_SHIFT; | ||
254 | __raw_writel(pll_con1, pll->con_reg + 4); | ||
255 | |||
256 | /* wait_lock_time */ | ||
257 | do { | ||
258 | cpu_relax(); | ||
259 | tmp = __raw_readl(pll->con_reg); | ||
260 | } while (!(tmp & (1 << PLL36XX_LOCK_STAT_SHIFT))); | ||
261 | |||
262 | return 0; | ||
169 | } | 263 | } |
170 | 264 | ||
265 | static const struct clk_ops samsung_pll36xx_clk_ops = { | ||
266 | .recalc_rate = samsung_pll36xx_recalc_rate, | ||
267 | .set_rate = samsung_pll36xx_set_rate, | ||
268 | .round_rate = samsung_pll_round_rate, | ||
269 | }; | ||
270 | |||
271 | static const struct clk_ops samsung_pll36xx_clk_min_ops = { | ||
272 | .recalc_rate = samsung_pll36xx_recalc_rate, | ||
273 | }; | ||
274 | |||
171 | /* | 275 | /* |
172 | * PLL45xx Clock Type | 276 | * PLL45xx Clock Type |
173 | */ | 277 | */ |
278 | #define PLL4502_LOCK_FACTOR 400 | ||
279 | #define PLL4508_LOCK_FACTOR 240 | ||
174 | 280 | ||
175 | #define PLL45XX_MDIV_MASK (0x3FF) | 281 | #define PLL45XX_MDIV_MASK (0x3FF) |
176 | #define PLL45XX_PDIV_MASK (0x3F) | 282 | #define PLL45XX_PDIV_MASK (0x3F) |
177 | #define PLL45XX_SDIV_MASK (0x7) | 283 | #define PLL45XX_SDIV_MASK (0x7) |
284 | #define PLL45XX_AFC_MASK (0x1F) | ||
178 | #define PLL45XX_MDIV_SHIFT (16) | 285 | #define PLL45XX_MDIV_SHIFT (16) |
179 | #define PLL45XX_PDIV_SHIFT (8) | 286 | #define PLL45XX_PDIV_SHIFT (8) |
180 | #define PLL45XX_SDIV_SHIFT (0) | 287 | #define PLL45XX_SDIV_SHIFT (0) |
288 | #define PLL45XX_AFC_SHIFT (0) | ||
181 | 289 | ||
182 | struct samsung_clk_pll45xx { | 290 | #define PLL45XX_ENABLE BIT(31) |
183 | struct clk_hw hw; | 291 | #define PLL45XX_LOCKED BIT(29) |
184 | enum pll45xx_type type; | ||
185 | const void __iomem *con_reg; | ||
186 | }; | ||
187 | |||
188 | #define to_clk_pll45xx(_hw) container_of(_hw, struct samsung_clk_pll45xx, hw) | ||
189 | 292 | ||
190 | static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw, | 293 | static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw, |
191 | unsigned long parent_rate) | 294 | unsigned long parent_rate) |
192 | { | 295 | { |
193 | struct samsung_clk_pll45xx *pll = to_clk_pll45xx(hw); | 296 | struct samsung_clk_pll *pll = to_clk_pll(hw); |
194 | u32 mdiv, pdiv, sdiv, pll_con; | 297 | u32 mdiv, pdiv, sdiv, pll_con; |
195 | u64 fvco = parent_rate; | 298 | u64 fvco = parent_rate; |
196 | 299 | ||
@@ -208,54 +311,113 @@ static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw, | |||
208 | return (unsigned long)fvco; | 311 | return (unsigned long)fvco; |
209 | } | 312 | } |
210 | 313 | ||
211 | static const struct clk_ops samsung_pll45xx_clk_ops = { | 314 | static bool samsung_pll45xx_mp_change(u32 pll_con0, u32 pll_con1, |
212 | .recalc_rate = samsung_pll45xx_recalc_rate, | 315 | const struct samsung_pll_rate_table *rate) |
213 | }; | ||
214 | |||
215 | struct clk * __init samsung_clk_register_pll45xx(const char *name, | ||
216 | const char *pname, const void __iomem *con_reg, | ||
217 | enum pll45xx_type type) | ||
218 | { | 316 | { |
219 | struct samsung_clk_pll45xx *pll; | 317 | u32 old_mdiv, old_pdiv, old_afc; |
220 | struct clk *clk; | ||
221 | struct clk_init_data init; | ||
222 | 318 | ||
223 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | 319 | old_mdiv = (pll_con0 >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK; |
224 | if (!pll) { | 320 | old_pdiv = (pll_con0 >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK; |
225 | pr_err("%s: could not allocate pll clk %s\n", __func__, name); | 321 | old_afc = (pll_con1 >> PLL45XX_AFC_SHIFT) & PLL45XX_AFC_MASK; |
226 | return NULL; | 322 | |
323 | return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv | ||
324 | || old_afc != rate->afc); | ||
325 | } | ||
326 | |||
327 | static int samsung_pll45xx_set_rate(struct clk_hw *hw, unsigned long drate, | ||
328 | unsigned long prate) | ||
329 | { | ||
330 | struct samsung_clk_pll *pll = to_clk_pll(hw); | ||
331 | const struct samsung_pll_rate_table *rate; | ||
332 | u32 con0, con1; | ||
333 | ktime_t start; | ||
334 | |||
335 | /* Get required rate settings from table */ | ||
336 | rate = samsung_get_pll_settings(pll, drate); | ||
337 | if (!rate) { | ||
338 | pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, | ||
339 | drate, __clk_get_name(hw->clk)); | ||
340 | return -EINVAL; | ||
227 | } | 341 | } |
228 | 342 | ||
229 | init.name = name; | 343 | con0 = __raw_readl(pll->con_reg); |
230 | init.ops = &samsung_pll45xx_clk_ops; | 344 | con1 = __raw_readl(pll->con_reg + 0x4); |
231 | init.flags = CLK_GET_RATE_NOCACHE; | ||
232 | init.parent_names = &pname; | ||
233 | init.num_parents = 1; | ||
234 | 345 | ||
235 | pll->hw.init = &init; | 346 | if (!(samsung_pll45xx_mp_change(con0, con1, rate))) { |
236 | pll->con_reg = con_reg; | 347 | /* If only s change, change just s value only*/ |
237 | pll->type = type; | 348 | con0 &= ~(PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT); |
349 | con0 |= rate->sdiv << PLL45XX_SDIV_SHIFT; | ||
350 | __raw_writel(con0, pll->con_reg); | ||
238 | 351 | ||
239 | clk = clk_register(NULL, &pll->hw); | 352 | return 0; |
240 | if (IS_ERR(clk)) { | ||
241 | pr_err("%s: failed to register pll clock %s\n", __func__, | ||
242 | name); | ||
243 | kfree(pll); | ||
244 | } | 353 | } |
245 | 354 | ||
246 | if (clk_register_clkdev(clk, name, NULL)) | 355 | /* Set PLL PMS values. */ |
247 | pr_err("%s: failed to register lookup for %s", __func__, name); | 356 | con0 &= ~((PLL45XX_MDIV_MASK << PLL45XX_MDIV_SHIFT) | |
357 | (PLL45XX_PDIV_MASK << PLL45XX_PDIV_SHIFT) | | ||
358 | (PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT)); | ||
359 | con0 |= (rate->mdiv << PLL45XX_MDIV_SHIFT) | | ||
360 | (rate->pdiv << PLL45XX_PDIV_SHIFT) | | ||
361 | (rate->sdiv << PLL45XX_SDIV_SHIFT); | ||
362 | |||
363 | /* Set PLL AFC value. */ | ||
364 | con1 = __raw_readl(pll->con_reg + 0x4); | ||
365 | con1 &= ~(PLL45XX_AFC_MASK << PLL45XX_AFC_SHIFT); | ||
366 | con1 |= (rate->afc << PLL45XX_AFC_SHIFT); | ||
367 | |||
368 | /* Set PLL lock time. */ | ||
369 | switch (pll->type) { | ||
370 | case pll_4502: | ||
371 | __raw_writel(rate->pdiv * PLL4502_LOCK_FACTOR, pll->lock_reg); | ||
372 | break; | ||
373 | case pll_4508: | ||
374 | __raw_writel(rate->pdiv * PLL4508_LOCK_FACTOR, pll->lock_reg); | ||
375 | break; | ||
376 | default: | ||
377 | break; | ||
378 | }; | ||
379 | |||
380 | /* Set new configuration. */ | ||
381 | __raw_writel(con1, pll->con_reg + 0x4); | ||
382 | __raw_writel(con0, pll->con_reg); | ||
383 | |||
384 | /* Wait for locking. */ | ||
385 | start = ktime_get(); | ||
386 | while (!(__raw_readl(pll->con_reg) & PLL45XX_LOCKED)) { | ||
387 | ktime_t delta = ktime_sub(ktime_get(), start); | ||
388 | |||
389 | if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { | ||
390 | pr_err("%s: could not lock PLL %s\n", | ||
391 | __func__, __clk_get_name(hw->clk)); | ||
392 | return -EFAULT; | ||
393 | } | ||
394 | |||
395 | cpu_relax(); | ||
396 | } | ||
248 | 397 | ||
249 | return clk; | 398 | return 0; |
250 | } | 399 | } |
251 | 400 | ||
401 | static const struct clk_ops samsung_pll45xx_clk_ops = { | ||
402 | .recalc_rate = samsung_pll45xx_recalc_rate, | ||
403 | .round_rate = samsung_pll_round_rate, | ||
404 | .set_rate = samsung_pll45xx_set_rate, | ||
405 | }; | ||
406 | |||
407 | static const struct clk_ops samsung_pll45xx_clk_min_ops = { | ||
408 | .recalc_rate = samsung_pll45xx_recalc_rate, | ||
409 | }; | ||
410 | |||
252 | /* | 411 | /* |
253 | * PLL46xx Clock Type | 412 | * PLL46xx Clock Type |
254 | */ | 413 | */ |
414 | #define PLL46XX_LOCK_FACTOR 3000 | ||
255 | 415 | ||
416 | #define PLL46XX_VSEL_MASK (1) | ||
256 | #define PLL46XX_MDIV_MASK (0x1FF) | 417 | #define PLL46XX_MDIV_MASK (0x1FF) |
257 | #define PLL46XX_PDIV_MASK (0x3F) | 418 | #define PLL46XX_PDIV_MASK (0x3F) |
258 | #define PLL46XX_SDIV_MASK (0x7) | 419 | #define PLL46XX_SDIV_MASK (0x7) |
420 | #define PLL46XX_VSEL_SHIFT (27) | ||
259 | #define PLL46XX_MDIV_SHIFT (16) | 421 | #define PLL46XX_MDIV_SHIFT (16) |
260 | #define PLL46XX_PDIV_SHIFT (8) | 422 | #define PLL46XX_PDIV_SHIFT (8) |
261 | #define PLL46XX_SDIV_SHIFT (0) | 423 | #define PLL46XX_SDIV_SHIFT (0) |
@@ -263,19 +425,20 @@ struct clk * __init samsung_clk_register_pll45xx(const char *name, | |||
263 | #define PLL46XX_KDIV_MASK (0xFFFF) | 425 | #define PLL46XX_KDIV_MASK (0xFFFF) |
264 | #define PLL4650C_KDIV_MASK (0xFFF) | 426 | #define PLL4650C_KDIV_MASK (0xFFF) |
265 | #define PLL46XX_KDIV_SHIFT (0) | 427 | #define PLL46XX_KDIV_SHIFT (0) |
428 | #define PLL46XX_MFR_MASK (0x3F) | ||
429 | #define PLL46XX_MRR_MASK (0x1F) | ||
430 | #define PLL46XX_KDIV_SHIFT (0) | ||
431 | #define PLL46XX_MFR_SHIFT (16) | ||
432 | #define PLL46XX_MRR_SHIFT (24) | ||
266 | 433 | ||
267 | struct samsung_clk_pll46xx { | 434 | #define PLL46XX_ENABLE BIT(31) |
268 | struct clk_hw hw; | 435 | #define PLL46XX_LOCKED BIT(29) |
269 | enum pll46xx_type type; | 436 | #define PLL46XX_VSEL BIT(27) |
270 | const void __iomem *con_reg; | ||
271 | }; | ||
272 | |||
273 | #define to_clk_pll46xx(_hw) container_of(_hw, struct samsung_clk_pll46xx, hw) | ||
274 | 437 | ||
275 | static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, | 438 | static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, |
276 | unsigned long parent_rate) | 439 | unsigned long parent_rate) |
277 | { | 440 | { |
278 | struct samsung_clk_pll46xx *pll = to_clk_pll46xx(hw); | 441 | struct samsung_clk_pll *pll = to_clk_pll(hw); |
279 | u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1, shift; | 442 | u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1, shift; |
280 | u64 fvco = parent_rate; | 443 | u64 fvco = parent_rate; |
281 | 444 | ||
@@ -295,47 +458,175 @@ static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, | |||
295 | return (unsigned long)fvco; | 458 | return (unsigned long)fvco; |
296 | } | 459 | } |
297 | 460 | ||
461 | static bool samsung_pll46xx_mpk_change(u32 pll_con0, u32 pll_con1, | ||
462 | const struct samsung_pll_rate_table *rate) | ||
463 | { | ||
464 | u32 old_mdiv, old_pdiv, old_kdiv; | ||
465 | |||
466 | old_mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK; | ||
467 | old_pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; | ||
468 | old_kdiv = (pll_con1 >> PLL46XX_KDIV_SHIFT) & PLL46XX_KDIV_MASK; | ||
469 | |||
470 | return (old_mdiv != rate->mdiv || old_pdiv != rate->pdiv | ||
471 | || old_kdiv != rate->kdiv); | ||
472 | } | ||
473 | |||
474 | static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate, | ||
475 | unsigned long prate) | ||
476 | { | ||
477 | struct samsung_clk_pll *pll = to_clk_pll(hw); | ||
478 | const struct samsung_pll_rate_table *rate; | ||
479 | u32 con0, con1, lock; | ||
480 | ktime_t start; | ||
481 | |||
482 | /* Get required rate settings from table */ | ||
483 | rate = samsung_get_pll_settings(pll, drate); | ||
484 | if (!rate) { | ||
485 | pr_err("%s: Invalid rate : %lu for pll clk %s\n", __func__, | ||
486 | drate, __clk_get_name(hw->clk)); | ||
487 | return -EINVAL; | ||
488 | } | ||
489 | |||
490 | con0 = __raw_readl(pll->con_reg); | ||
491 | con1 = __raw_readl(pll->con_reg + 0x4); | ||
492 | |||
493 | if (!(samsung_pll46xx_mpk_change(con0, con1, rate))) { | ||
494 | /* If only s change, change just s value only*/ | ||
495 | con0 &= ~(PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT); | ||
496 | con0 |= rate->sdiv << PLL46XX_SDIV_SHIFT; | ||
497 | __raw_writel(con0, pll->con_reg); | ||
498 | |||
499 | return 0; | ||
500 | } | ||
501 | |||
502 | /* Set PLL lock time. */ | ||
503 | lock = rate->pdiv * PLL46XX_LOCK_FACTOR; | ||
504 | if (lock > 0xffff) | ||
505 | /* Maximum lock time bitfield is 16-bit. */ | ||
506 | lock = 0xffff; | ||
507 | |||
508 | /* Set PLL PMS and VSEL values. */ | ||
509 | con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | ||
510 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | | ||
511 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | | ||
512 | (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); | ||
513 | con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | | ||
514 | (rate->pdiv << PLL46XX_PDIV_SHIFT) | | ||
515 | (rate->sdiv << PLL46XX_SDIV_SHIFT) | | ||
516 | (rate->vsel << PLL46XX_VSEL_SHIFT); | ||
517 | |||
518 | /* Set PLL K, MFR and MRR values. */ | ||
519 | con1 = __raw_readl(pll->con_reg + 0x4); | ||
520 | con1 &= ~((PLL46XX_KDIV_MASK << PLL46XX_KDIV_SHIFT) | | ||
521 | (PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT) | | ||
522 | (PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT)); | ||
523 | con1 |= (rate->kdiv << PLL46XX_KDIV_SHIFT) | | ||
524 | (rate->mfr << PLL46XX_MFR_SHIFT) | | ||
525 | (rate->mrr << PLL46XX_MRR_SHIFT); | ||
526 | |||
527 | /* Write configuration to PLL */ | ||
528 | __raw_writel(lock, pll->lock_reg); | ||
529 | __raw_writel(con0, pll->con_reg); | ||
530 | __raw_writel(con1, pll->con_reg + 0x4); | ||
531 | |||
532 | /* Wait for locking. */ | ||
533 | start = ktime_get(); | ||
534 | while (!(__raw_readl(pll->con_reg) & PLL46XX_LOCKED)) { | ||
535 | ktime_t delta = ktime_sub(ktime_get(), start); | ||
536 | |||
537 | if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) { | ||
538 | pr_err("%s: could not lock PLL %s\n", | ||
539 | __func__, __clk_get_name(hw->clk)); | ||
540 | return -EFAULT; | ||
541 | } | ||
542 | |||
543 | cpu_relax(); | ||
544 | } | ||
545 | |||
546 | return 0; | ||
547 | } | ||
548 | |||
298 | static const struct clk_ops samsung_pll46xx_clk_ops = { | 549 | static const struct clk_ops samsung_pll46xx_clk_ops = { |
299 | .recalc_rate = samsung_pll46xx_recalc_rate, | 550 | .recalc_rate = samsung_pll46xx_recalc_rate, |
551 | .round_rate = samsung_pll_round_rate, | ||
552 | .set_rate = samsung_pll46xx_set_rate, | ||
553 | }; | ||
554 | |||
555 | static const struct clk_ops samsung_pll46xx_clk_min_ops = { | ||
556 | .recalc_rate = samsung_pll46xx_recalc_rate, | ||
300 | }; | 557 | }; |
301 | 558 | ||
302 | struct clk * __init samsung_clk_register_pll46xx(const char *name, | 559 | /* |
303 | const char *pname, const void __iomem *con_reg, | 560 | * PLL6552 Clock Type |
304 | enum pll46xx_type type) | 561 | */ |
562 | |||
563 | #define PLL6552_MDIV_MASK 0x3ff | ||
564 | #define PLL6552_PDIV_MASK 0x3f | ||
565 | #define PLL6552_SDIV_MASK 0x7 | ||
566 | #define PLL6552_MDIV_SHIFT 16 | ||
567 | #define PLL6552_PDIV_SHIFT 8 | ||
568 | #define PLL6552_SDIV_SHIFT 0 | ||
569 | |||
570 | static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw, | ||
571 | unsigned long parent_rate) | ||
305 | { | 572 | { |
306 | struct samsung_clk_pll46xx *pll; | 573 | struct samsung_clk_pll *pll = to_clk_pll(hw); |
307 | struct clk *clk; | 574 | u32 mdiv, pdiv, sdiv, pll_con; |
308 | struct clk_init_data init; | 575 | u64 fvco = parent_rate; |
309 | 576 | ||
310 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | 577 | pll_con = __raw_readl(pll->con_reg); |
311 | if (!pll) { | 578 | mdiv = (pll_con >> PLL6552_MDIV_SHIFT) & PLL6552_MDIV_MASK; |
312 | pr_err("%s: could not allocate pll clk %s\n", __func__, name); | 579 | pdiv = (pll_con >> PLL6552_PDIV_SHIFT) & PLL6552_PDIV_MASK; |
313 | return NULL; | 580 | sdiv = (pll_con >> PLL6552_SDIV_SHIFT) & PLL6552_SDIV_MASK; |
314 | } | ||
315 | 581 | ||
316 | init.name = name; | 582 | fvco *= mdiv; |
317 | init.ops = &samsung_pll46xx_clk_ops; | 583 | do_div(fvco, (pdiv << sdiv)); |
318 | init.flags = CLK_GET_RATE_NOCACHE; | ||
319 | init.parent_names = &pname; | ||
320 | init.num_parents = 1; | ||
321 | 584 | ||
322 | pll->hw.init = &init; | 585 | return (unsigned long)fvco; |
323 | pll->con_reg = con_reg; | 586 | } |
324 | pll->type = type; | ||
325 | 587 | ||
326 | clk = clk_register(NULL, &pll->hw); | 588 | static const struct clk_ops samsung_pll6552_clk_ops = { |
327 | if (IS_ERR(clk)) { | 589 | .recalc_rate = samsung_pll6552_recalc_rate, |
328 | pr_err("%s: failed to register pll clock %s\n", __func__, | 590 | }; |
329 | name); | ||
330 | kfree(pll); | ||
331 | } | ||
332 | 591 | ||
333 | if (clk_register_clkdev(clk, name, NULL)) | 592 | /* |
334 | pr_err("%s: failed to register lookup for %s", __func__, name); | 593 | * PLL6553 Clock Type |
594 | */ | ||
335 | 595 | ||
336 | return clk; | 596 | #define PLL6553_MDIV_MASK 0xff |
597 | #define PLL6553_PDIV_MASK 0x3f | ||
598 | #define PLL6553_SDIV_MASK 0x7 | ||
599 | #define PLL6553_KDIV_MASK 0xffff | ||
600 | #define PLL6553_MDIV_SHIFT 16 | ||
601 | #define PLL6553_PDIV_SHIFT 8 | ||
602 | #define PLL6553_SDIV_SHIFT 0 | ||
603 | #define PLL6553_KDIV_SHIFT 0 | ||
604 | |||
605 | static unsigned long samsung_pll6553_recalc_rate(struct clk_hw *hw, | ||
606 | unsigned long parent_rate) | ||
607 | { | ||
608 | struct samsung_clk_pll *pll = to_clk_pll(hw); | ||
609 | u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1; | ||
610 | u64 fvco = parent_rate; | ||
611 | |||
612 | pll_con0 = __raw_readl(pll->con_reg); | ||
613 | pll_con1 = __raw_readl(pll->con_reg + 0x4); | ||
614 | mdiv = (pll_con0 >> PLL6553_MDIV_SHIFT) & PLL6553_MDIV_MASK; | ||
615 | pdiv = (pll_con0 >> PLL6553_PDIV_SHIFT) & PLL6553_PDIV_MASK; | ||
616 | sdiv = (pll_con0 >> PLL6553_SDIV_SHIFT) & PLL6553_SDIV_MASK; | ||
617 | kdiv = (pll_con1 >> PLL6553_KDIV_SHIFT) & PLL6553_KDIV_MASK; | ||
618 | |||
619 | fvco *= (mdiv << 16) + kdiv; | ||
620 | do_div(fvco, (pdiv << sdiv)); | ||
621 | fvco >>= 16; | ||
622 | |||
623 | return (unsigned long)fvco; | ||
337 | } | 624 | } |
338 | 625 | ||
626 | static const struct clk_ops samsung_pll6553_clk_ops = { | ||
627 | .recalc_rate = samsung_pll6553_recalc_rate, | ||
628 | }; | ||
629 | |||
339 | /* | 630 | /* |
340 | * PLL2550x Clock Type | 631 | * PLL2550x Clock Type |
341 | */ | 632 | */ |
@@ -418,3 +709,117 @@ struct clk * __init samsung_clk_register_pll2550x(const char *name, | |||
418 | 709 | ||
419 | return clk; | 710 | return clk; |
420 | } | 711 | } |
712 | |||
713 | static void __init _samsung_clk_register_pll(struct samsung_pll_clock *pll_clk, | ||
714 | void __iomem *base) | ||
715 | { | ||
716 | struct samsung_clk_pll *pll; | ||
717 | struct clk *clk; | ||
718 | struct clk_init_data init; | ||
719 | int ret, len; | ||
720 | |||
721 | pll = kzalloc(sizeof(*pll), GFP_KERNEL); | ||
722 | if (!pll) { | ||
723 | pr_err("%s: could not allocate pll clk %s\n", | ||
724 | __func__, pll_clk->name); | ||
725 | return; | ||
726 | } | ||
727 | |||
728 | init.name = pll_clk->name; | ||
729 | init.flags = pll_clk->flags; | ||
730 | init.parent_names = &pll_clk->parent_name; | ||
731 | init.num_parents = 1; | ||
732 | |||
733 | if (pll_clk->rate_table) { | ||
734 | /* find count of rates in rate_table */ | ||
735 | for (len = 0; pll_clk->rate_table[len].rate != 0; ) | ||
736 | len++; | ||
737 | |||
738 | pll->rate_count = len; | ||
739 | pll->rate_table = kmemdup(pll_clk->rate_table, | ||
740 | pll->rate_count * | ||
741 | sizeof(struct samsung_pll_rate_table), | ||
742 | GFP_KERNEL); | ||
743 | WARN(!pll->rate_table, | ||
744 | "%s: could not allocate rate table for %s\n", | ||
745 | __func__, pll_clk->name); | ||
746 | } | ||
747 | |||
748 | switch (pll_clk->type) { | ||
749 | /* clk_ops for 35xx and 2550 are similar */ | ||
750 | case pll_35xx: | ||
751 | case pll_2550: | ||
752 | if (!pll->rate_table) | ||
753 | init.ops = &samsung_pll35xx_clk_min_ops; | ||
754 | else | ||
755 | init.ops = &samsung_pll35xx_clk_ops; | ||
756 | break; | ||
757 | case pll_4500: | ||
758 | init.ops = &samsung_pll45xx_clk_min_ops; | ||
759 | break; | ||
760 | case pll_4502: | ||
761 | case pll_4508: | ||
762 | if (!pll->rate_table) | ||
763 | init.ops = &samsung_pll45xx_clk_min_ops; | ||
764 | else | ||
765 | init.ops = &samsung_pll45xx_clk_ops; | ||
766 | break; | ||
767 | /* clk_ops for 36xx and 2650 are similar */ | ||
768 | case pll_36xx: | ||
769 | case pll_2650: | ||
770 | if (!pll->rate_table) | ||
771 | init.ops = &samsung_pll36xx_clk_min_ops; | ||
772 | else | ||
773 | init.ops = &samsung_pll36xx_clk_ops; | ||
774 | break; | ||
775 | case pll_6552: | ||
776 | init.ops = &samsung_pll6552_clk_ops; | ||
777 | break; | ||
778 | case pll_6553: | ||
779 | init.ops = &samsung_pll6553_clk_ops; | ||
780 | break; | ||
781 | case pll_4600: | ||
782 | case pll_4650: | ||
783 | case pll_4650c: | ||
784 | if (!pll->rate_table) | ||
785 | init.ops = &samsung_pll46xx_clk_min_ops; | ||
786 | else | ||
787 | init.ops = &samsung_pll46xx_clk_ops; | ||
788 | break; | ||
789 | default: | ||
790 | pr_warn("%s: Unknown pll type for pll clk %s\n", | ||
791 | __func__, pll_clk->name); | ||
792 | } | ||
793 | |||
794 | pll->hw.init = &init; | ||
795 | pll->type = pll_clk->type; | ||
796 | pll->lock_reg = base + pll_clk->lock_offset; | ||
797 | pll->con_reg = base + pll_clk->con_offset; | ||
798 | |||
799 | clk = clk_register(NULL, &pll->hw); | ||
800 | if (IS_ERR(clk)) { | ||
801 | pr_err("%s: failed to register pll clock %s : %ld\n", | ||
802 | __func__, pll_clk->name, PTR_ERR(clk)); | ||
803 | kfree(pll); | ||
804 | return; | ||
805 | } | ||
806 | |||
807 | samsung_clk_add_lookup(clk, pll_clk->id); | ||
808 | |||
809 | if (!pll_clk->alias) | ||
810 | return; | ||
811 | |||
812 | ret = clk_register_clkdev(clk, pll_clk->alias, pll_clk->dev_name); | ||
813 | if (ret) | ||
814 | pr_err("%s: failed to register lookup for %s : %d", | ||
815 | __func__, pll_clk->name, ret); | ||
816 | } | ||
817 | |||
818 | void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, | ||
819 | unsigned int nr_pll, void __iomem *base) | ||
820 | { | ||
821 | int cnt; | ||
822 | |||
823 | for (cnt = 0; cnt < nr_pll; cnt++) | ||
824 | _samsung_clk_register_pll(&pll_list[cnt], base); | ||
825 | } | ||
diff --git a/drivers/clk/samsung/clk-pll.h b/drivers/clk/samsung/clk-pll.h index f33786e9a78b..6c39030080fb 100644 --- a/drivers/clk/samsung/clk-pll.h +++ b/drivers/clk/samsung/clk-pll.h | |||
@@ -12,28 +12,83 @@ | |||
12 | #ifndef __SAMSUNG_CLK_PLL_H | 12 | #ifndef __SAMSUNG_CLK_PLL_H |
13 | #define __SAMSUNG_CLK_PLL_H | 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 | pll_4500, | 20 | pll_4500, |
17 | pll_4502, | 21 | pll_4502, |
18 | pll_4508 | 22 | pll_4508, |
19 | }; | ||
20 | |||
21 | enum pll46xx_type { | ||
22 | pll_4600, | 23 | pll_4600, |
23 | pll_4650, | 24 | pll_4650, |
24 | pll_4650c, | 25 | pll_4650c, |
26 | pll_6552, | ||
27 | pll_6553, | ||
28 | }; | ||
29 | |||
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; | ||
25 | }; | 90 | }; |
26 | 91 | ||
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); | ||
37 | extern struct clk * __init samsung_clk_register_pll2550x(const char *name, | 92 | extern struct clk * __init samsung_clk_register_pll2550x(const char *name, |
38 | const char *pname, const void __iomem *reg_base, | 93 | const char *pname, const void __iomem *reg_base, |
39 | const unsigned long offset); | 94 | const unsigned long offset); |
diff --git a/drivers/clk/samsung/clk-s3c64xx.c b/drivers/clk/samsung/clk-s3c64xx.c new file mode 100644 index 000000000000..7d2c84265947 --- /dev/null +++ b/drivers/clk/samsung/clk-s3c64xx.c | |||
@@ -0,0 +1,473 @@ | |||
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); | ||
diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c index cd3c40ab50f3..f503f32e2f80 100644 --- a/drivers/clk/samsung/clk.c +++ b/drivers/clk/samsung/clk.c | |||
@@ -307,14 +307,12 @@ void __init samsung_clk_of_register_fixed_ext( | |||
307 | unsigned long _get_rate(const char *clk_name) | 307 | unsigned long _get_rate(const char *clk_name) |
308 | { | 308 | { |
309 | struct clk *clk; | 309 | struct clk *clk; |
310 | unsigned long rate; | ||
311 | 310 | ||
312 | clk = clk_get(NULL, clk_name); | 311 | clk = __clk_lookup(clk_name); |
313 | if (IS_ERR(clk)) { | 312 | if (!clk) { |
314 | pr_err("%s: could not find clock %s\n", __func__, clk_name); | 313 | pr_err("%s: could not find clock %s\n", __func__, clk_name); |
315 | return 0; | 314 | return 0; |
316 | } | 315 | } |
317 | rate = clk_get_rate(clk); | 316 | |
318 | clk_put(clk); | 317 | return clk_get_rate(clk); |
319 | return rate; | ||
320 | } | 318 | } |
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index 2f7dba20ced8..31b4174e7a5b 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/clk-provider.h> | 19 | #include <linux/clk-provider.h> |
20 | #include <linux/of.h> | 20 | #include <linux/of.h> |
21 | #include <linux/of_address.h> | 21 | #include <linux/of_address.h> |
22 | #include "clk-pll.h" | ||
22 | 23 | ||
23 | /** | 24 | /** |
24 | * struct samsung_clock_alias: information about mux clock | 25 | * struct samsung_clock_alias: information about mux clock |
@@ -39,6 +40,8 @@ struct samsung_clock_alias { | |||
39 | .alias = a, \ | 40 | .alias = a, \ |
40 | } | 41 | } |
41 | 42 | ||
43 | #define MHZ (1000 * 1000) | ||
44 | |||
42 | /** | 45 | /** |
43 | * struct samsung_fixed_rate_clock: information about fixed-rate clock | 46 | * struct samsung_fixed_rate_clock: information about fixed-rate clock |
44 | * @id: platform specific id of the clock. | 47 | * @id: platform specific id of the clock. |
@@ -127,7 +130,7 @@ struct samsung_mux_clock { | |||
127 | .name = cname, \ | 130 | .name = cname, \ |
128 | .parent_names = pnames, \ | 131 | .parent_names = pnames, \ |
129 | .num_parents = ARRAY_SIZE(pnames), \ | 132 | .num_parents = ARRAY_SIZE(pnames), \ |
130 | .flags = f, \ | 133 | .flags = (f) | CLK_SET_RATE_NO_REPARENT, \ |
131 | .offset = o, \ | 134 | .offset = o, \ |
132 | .shift = s, \ | 135 | .shift = s, \ |
133 | .width = w, \ | 136 | .width = w, \ |
@@ -261,6 +264,54 @@ struct samsung_clk_reg_dump { | |||
261 | u32 value; | 264 | u32 value; |
262 | }; | 265 | }; |
263 | 266 | ||
267 | /** | ||
268 | * struct samsung_pll_clock: information about pll clock | ||
269 | * @id: platform specific id of the clock. | ||
270 | * @dev_name: name of the device to which this clock belongs. | ||
271 | * @name: name of this pll clock. | ||
272 | * @parent_name: name of the parent clock. | ||
273 | * @flags: optional flags for basic clock. | ||
274 | * @con_offset: offset of the register for configuring the PLL. | ||
275 | * @lock_offset: offset of the register for locking the PLL. | ||
276 | * @type: Type of PLL to be registered. | ||
277 | * @alias: optional clock alias name to be assigned to this clock. | ||
278 | */ | ||
279 | struct samsung_pll_clock { | ||
280 | unsigned int id; | ||
281 | const char *dev_name; | ||
282 | const char *name; | ||
283 | const char *parent_name; | ||
284 | unsigned long flags; | ||
285 | int con_offset; | ||
286 | int lock_offset; | ||
287 | enum samsung_pll_type type; | ||
288 | const struct samsung_pll_rate_table *rate_table; | ||
289 | const char *alias; | ||
290 | }; | ||
291 | |||
292 | #define __PLL(_typ, _id, _dname, _name, _pname, _flags, _lock, _con, \ | ||
293 | _rtable, _alias) \ | ||
294 | { \ | ||
295 | .id = _id, \ | ||
296 | .type = _typ, \ | ||
297 | .dev_name = _dname, \ | ||
298 | .name = _name, \ | ||
299 | .parent_name = _pname, \ | ||
300 | .flags = CLK_GET_RATE_NOCACHE, \ | ||
301 | .con_offset = _con, \ | ||
302 | .lock_offset = _lock, \ | ||
303 | .rate_table = _rtable, \ | ||
304 | .alias = _alias, \ | ||
305 | } | ||
306 | |||
307 | #define PLL(_typ, _id, _name, _pname, _lock, _con, _rtable) \ | ||
308 | __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ | ||
309 | _lock, _con, _rtable, _name) | ||
310 | |||
311 | #define PLL_A(_typ, _id, _name, _pname, _lock, _con, _alias, _rtable) \ | ||
312 | __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ | ||
313 | _lock, _con, _rtable, _alias) | ||
314 | |||
264 | extern void __init samsung_clk_init(struct device_node *np, void __iomem *base, | 315 | extern void __init samsung_clk_init(struct device_node *np, void __iomem *base, |
265 | unsigned long nr_clks, unsigned long *rdump, | 316 | unsigned long nr_clks, unsigned long *rdump, |
266 | unsigned long nr_rdump, unsigned long *soc_rdump, | 317 | unsigned long nr_rdump, unsigned long *soc_rdump, |
@@ -284,6 +335,8 @@ extern void __init samsung_clk_register_div(struct samsung_div_clock *clk_list, | |||
284 | unsigned int nr_clk); | 335 | unsigned int nr_clk); |
285 | extern void __init samsung_clk_register_gate( | 336 | extern void __init samsung_clk_register_gate( |
286 | struct samsung_gate_clock *clk_list, unsigned int nr_clk); | 337 | struct samsung_gate_clock *clk_list, unsigned int nr_clk); |
338 | extern void __init samsung_clk_register_pll(struct samsung_pll_clock *pll_list, | ||
339 | unsigned int nr_clk, void __iomem *base); | ||
287 | 340 | ||
288 | extern unsigned long _get_rate(const char *clk_name); | 341 | extern unsigned long _get_rate(const char *clk_name); |
289 | 342 | ||
diff --git a/drivers/clk/spear/spear1310_clock.c b/drivers/clk/spear/spear1310_clock.c index aedbbe12f321..65894f7687ed 100644 --- a/drivers/clk/spear/spear1310_clock.c +++ b/drivers/clk/spear/spear1310_clock.c | |||
@@ -416,9 +416,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
416 | /* clock derived from 24 or 25 MHz osc clk */ | 416 | /* clock derived from 24 or 25 MHz osc clk */ |
417 | /* vco-pll */ | 417 | /* vco-pll */ |
418 | clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, | 418 | clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, |
419 | ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, | 419 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
420 | SPEAR1310_PLL1_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, | 420 | SPEAR1310_PLL_CFG, SPEAR1310_PLL1_CLK_SHIFT, |
421 | &_lock); | 421 | SPEAR1310_PLL_CLK_MASK, 0, &_lock); |
422 | clk_register_clkdev(clk, "vco1_mclk", NULL); | 422 | clk_register_clkdev(clk, "vco1_mclk", NULL); |
423 | clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", | 423 | clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", |
424 | 0, SPEAR1310_PLL1_CTR, SPEAR1310_PLL1_FRQ, pll_rtbl, | 424 | 0, SPEAR1310_PLL1_CTR, SPEAR1310_PLL1_FRQ, pll_rtbl, |
@@ -427,9 +427,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
427 | clk_register_clkdev(clk1, "pll1_clk", NULL); | 427 | clk_register_clkdev(clk1, "pll1_clk", NULL); |
428 | 428 | ||
429 | clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, | 429 | clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, |
430 | ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, | 430 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
431 | SPEAR1310_PLL2_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, | 431 | SPEAR1310_PLL_CFG, SPEAR1310_PLL2_CLK_SHIFT, |
432 | &_lock); | 432 | SPEAR1310_PLL_CLK_MASK, 0, &_lock); |
433 | clk_register_clkdev(clk, "vco2_mclk", NULL); | 433 | clk_register_clkdev(clk, "vco2_mclk", NULL); |
434 | clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", | 434 | clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", |
435 | 0, SPEAR1310_PLL2_CTR, SPEAR1310_PLL2_FRQ, pll_rtbl, | 435 | 0, SPEAR1310_PLL2_CTR, SPEAR1310_PLL2_FRQ, pll_rtbl, |
@@ -438,9 +438,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
438 | clk_register_clkdev(clk1, "pll2_clk", NULL); | 438 | clk_register_clkdev(clk1, "pll2_clk", NULL); |
439 | 439 | ||
440 | clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, | 440 | clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, |
441 | ARRAY_SIZE(vco_parents), 0, SPEAR1310_PLL_CFG, | 441 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
442 | SPEAR1310_PLL3_CLK_SHIFT, SPEAR1310_PLL_CLK_MASK, 0, | 442 | SPEAR1310_PLL_CFG, SPEAR1310_PLL3_CLK_SHIFT, |
443 | &_lock); | 443 | SPEAR1310_PLL_CLK_MASK, 0, &_lock); |
444 | clk_register_clkdev(clk, "vco3_mclk", NULL); | 444 | clk_register_clkdev(clk, "vco3_mclk", NULL); |
445 | clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", | 445 | clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", |
446 | 0, SPEAR1310_PLL3_CTR, SPEAR1310_PLL3_FRQ, pll_rtbl, | 446 | 0, SPEAR1310_PLL3_CTR, SPEAR1310_PLL3_FRQ, pll_rtbl, |
@@ -515,9 +515,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
515 | 515 | ||
516 | /* gpt clocks */ | 516 | /* gpt clocks */ |
517 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, | 517 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, |
518 | ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, | 518 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
519 | SPEAR1310_GPT0_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, | 519 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT0_CLK_SHIFT, |
520 | &_lock); | 520 | SPEAR1310_GPT_CLK_MASK, 0, &_lock); |
521 | clk_register_clkdev(clk, "gpt0_mclk", NULL); | 521 | clk_register_clkdev(clk, "gpt0_mclk", NULL); |
522 | clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, | 522 | clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, |
523 | SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT0_CLK_ENB, 0, | 523 | SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT0_CLK_ENB, 0, |
@@ -525,9 +525,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
525 | clk_register_clkdev(clk, NULL, "gpt0"); | 525 | clk_register_clkdev(clk, NULL, "gpt0"); |
526 | 526 | ||
527 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, | 527 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, |
528 | ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, | 528 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
529 | SPEAR1310_GPT1_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, | 529 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT1_CLK_SHIFT, |
530 | &_lock); | 530 | SPEAR1310_GPT_CLK_MASK, 0, &_lock); |
531 | clk_register_clkdev(clk, "gpt1_mclk", NULL); | 531 | clk_register_clkdev(clk, "gpt1_mclk", NULL); |
532 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, | 532 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, |
533 | SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT1_CLK_ENB, 0, | 533 | SPEAR1310_PERIP1_CLK_ENB, SPEAR1310_GPT1_CLK_ENB, 0, |
@@ -535,9 +535,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
535 | clk_register_clkdev(clk, NULL, "gpt1"); | 535 | clk_register_clkdev(clk, NULL, "gpt1"); |
536 | 536 | ||
537 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, | 537 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, |
538 | ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, | 538 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
539 | SPEAR1310_GPT2_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, | 539 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT2_CLK_SHIFT, |
540 | &_lock); | 540 | SPEAR1310_GPT_CLK_MASK, 0, &_lock); |
541 | clk_register_clkdev(clk, "gpt2_mclk", NULL); | 541 | clk_register_clkdev(clk, "gpt2_mclk", NULL); |
542 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, | 542 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, |
543 | SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT2_CLK_ENB, 0, | 543 | SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT2_CLK_ENB, 0, |
@@ -545,9 +545,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
545 | clk_register_clkdev(clk, NULL, "gpt2"); | 545 | clk_register_clkdev(clk, NULL, "gpt2"); |
546 | 546 | ||
547 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, | 547 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, |
548 | ARRAY_SIZE(gpt_parents), 0, SPEAR1310_PERIP_CLK_CFG, | 548 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
549 | SPEAR1310_GPT3_CLK_SHIFT, SPEAR1310_GPT_CLK_MASK, 0, | 549 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GPT3_CLK_SHIFT, |
550 | &_lock); | 550 | SPEAR1310_GPT_CLK_MASK, 0, &_lock); |
551 | clk_register_clkdev(clk, "gpt3_mclk", NULL); | 551 | clk_register_clkdev(clk, "gpt3_mclk", NULL); |
552 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, | 552 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, |
553 | SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT3_CLK_ENB, 0, | 553 | SPEAR1310_PERIP2_CLK_ENB, SPEAR1310_GPT3_CLK_ENB, 0, |
@@ -562,7 +562,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
562 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); | 562 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); |
563 | 563 | ||
564 | clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, | 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 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_UART_CLK_SHIFT, | 567 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_UART_CLK_SHIFT, |
567 | SPEAR1310_UART_CLK_MASK, 0, &_lock); | 568 | SPEAR1310_UART_CLK_MASK, 0, &_lock); |
568 | clk_register_clkdev(clk, "uart0_mclk", NULL); | 569 | clk_register_clkdev(clk, "uart0_mclk", NULL); |
@@ -602,7 +603,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
602 | clk_register_clkdev(clk1, "c3_syn_gclk", NULL); | 603 | clk_register_clkdev(clk1, "c3_syn_gclk", NULL); |
603 | 604 | ||
604 | clk = clk_register_mux(NULL, "c3_mclk", c3_parents, | 605 | clk = clk_register_mux(NULL, "c3_mclk", c3_parents, |
605 | ARRAY_SIZE(c3_parents), CLK_SET_RATE_PARENT, | 606 | ARRAY_SIZE(c3_parents), |
607 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
606 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_C3_CLK_SHIFT, | 608 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_C3_CLK_SHIFT, |
607 | SPEAR1310_C3_CLK_MASK, 0, &_lock); | 609 | SPEAR1310_C3_CLK_MASK, 0, &_lock); |
608 | clk_register_clkdev(clk, "c3_mclk", NULL); | 610 | clk_register_clkdev(clk, "c3_mclk", NULL); |
@@ -614,8 +616,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
614 | 616 | ||
615 | /* gmac */ | 617 | /* gmac */ |
616 | clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, | 618 | clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, |
617 | ARRAY_SIZE(gmac_phy_input_parents), 0, | 619 | ARRAY_SIZE(gmac_phy_input_parents), |
618 | SPEAR1310_GMAC_CLK_CFG, | 620 | CLK_SET_RATE_NO_REPARENT, SPEAR1310_GMAC_CLK_CFG, |
619 | SPEAR1310_GMAC_PHY_INPUT_CLK_SHIFT, | 621 | SPEAR1310_GMAC_PHY_INPUT_CLK_SHIFT, |
620 | SPEAR1310_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); | 622 | SPEAR1310_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); |
621 | clk_register_clkdev(clk, "phy_input_mclk", NULL); | 623 | clk_register_clkdev(clk, "phy_input_mclk", NULL); |
@@ -627,15 +629,16 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
627 | clk_register_clkdev(clk1, "phy_syn_gclk", NULL); | 629 | clk_register_clkdev(clk1, "phy_syn_gclk", NULL); |
628 | 630 | ||
629 | clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, | 631 | clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, |
630 | ARRAY_SIZE(gmac_phy_parents), 0, | 632 | ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT, |
631 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GMAC_PHY_CLK_SHIFT, | 633 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_GMAC_PHY_CLK_SHIFT, |
632 | SPEAR1310_GMAC_PHY_CLK_MASK, 0, &_lock); | 634 | SPEAR1310_GMAC_PHY_CLK_MASK, 0, &_lock); |
633 | clk_register_clkdev(clk, "stmmacphy.0", NULL); | 635 | clk_register_clkdev(clk, "stmmacphy.0", NULL); |
634 | 636 | ||
635 | /* clcd */ | 637 | /* clcd */ |
636 | clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, | 638 | clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, |
637 | ARRAY_SIZE(clcd_synth_parents), 0, | 639 | ARRAY_SIZE(clcd_synth_parents), |
638 | SPEAR1310_CLCD_CLK_SYNT, SPEAR1310_CLCD_SYNT_CLK_SHIFT, | 640 | CLK_SET_RATE_NO_REPARENT, SPEAR1310_CLCD_CLK_SYNT, |
641 | SPEAR1310_CLCD_SYNT_CLK_SHIFT, | ||
639 | SPEAR1310_CLCD_SYNT_CLK_MASK, 0, &_lock); | 642 | SPEAR1310_CLCD_SYNT_CLK_MASK, 0, &_lock); |
640 | clk_register_clkdev(clk, "clcd_syn_mclk", NULL); | 643 | clk_register_clkdev(clk, "clcd_syn_mclk", NULL); |
641 | 644 | ||
@@ -645,7 +648,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
645 | clk_register_clkdev(clk, "clcd_syn_clk", NULL); | 648 | clk_register_clkdev(clk, "clcd_syn_clk", NULL); |
646 | 649 | ||
647 | clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, | 650 | clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, |
648 | ARRAY_SIZE(clcd_pixel_parents), CLK_SET_RATE_PARENT, | 651 | ARRAY_SIZE(clcd_pixel_parents), |
652 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
649 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_CLCD_CLK_SHIFT, | 653 | SPEAR1310_PERIP_CLK_CFG, SPEAR1310_CLCD_CLK_SHIFT, |
650 | SPEAR1310_CLCD_CLK_MASK, 0, &_lock); | 654 | SPEAR1310_CLCD_CLK_MASK, 0, &_lock); |
651 | clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); | 655 | clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); |
@@ -657,9 +661,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
657 | 661 | ||
658 | /* i2s */ | 662 | /* i2s */ |
659 | clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, | 663 | clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, |
660 | ARRAY_SIZE(i2s_src_parents), 0, SPEAR1310_I2S_CLK_CFG, | 664 | ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT, |
661 | SPEAR1310_I2S_SRC_CLK_SHIFT, SPEAR1310_I2S_SRC_CLK_MASK, | 665 | SPEAR1310_I2S_CLK_CFG, SPEAR1310_I2S_SRC_CLK_SHIFT, |
662 | 0, &_lock); | 666 | SPEAR1310_I2S_SRC_CLK_MASK, 0, &_lock); |
663 | clk_register_clkdev(clk, "i2s_src_mclk", NULL); | 667 | clk_register_clkdev(clk, "i2s_src_mclk", NULL); |
664 | 668 | ||
665 | clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", 0, | 669 | clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", 0, |
@@ -668,7 +672,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
668 | clk_register_clkdev(clk, "i2s_prs1_clk", NULL); | 672 | clk_register_clkdev(clk, "i2s_prs1_clk", NULL); |
669 | 673 | ||
670 | clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, | 674 | clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, |
671 | ARRAY_SIZE(i2s_ref_parents), CLK_SET_RATE_PARENT, | 675 | ARRAY_SIZE(i2s_ref_parents), |
676 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
672 | SPEAR1310_I2S_CLK_CFG, SPEAR1310_I2S_REF_SHIFT, | 677 | SPEAR1310_I2S_CLK_CFG, SPEAR1310_I2S_REF_SHIFT, |
673 | SPEAR1310_I2S_REF_SEL_MASK, 0, &_lock); | 678 | SPEAR1310_I2S_REF_SEL_MASK, 0, &_lock); |
674 | clk_register_clkdev(clk, "i2s_ref_mclk", NULL); | 679 | clk_register_clkdev(clk, "i2s_ref_mclk", NULL); |
@@ -806,13 +811,15 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
806 | 811 | ||
807 | /* RAS clks */ | 812 | /* RAS clks */ |
808 | clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, | 813 | clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, |
809 | ARRAY_SIZE(gen_synth0_1_parents), 0, SPEAR1310_PLL_CFG, | 814 | ARRAY_SIZE(gen_synth0_1_parents), |
815 | CLK_SET_RATE_NO_REPARENT, SPEAR1310_PLL_CFG, | ||
810 | SPEAR1310_RAS_SYNT0_1_CLK_SHIFT, | 816 | SPEAR1310_RAS_SYNT0_1_CLK_SHIFT, |
811 | SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); | 817 | SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); |
812 | clk_register_clkdev(clk, "gen_syn0_1_clk", NULL); | 818 | clk_register_clkdev(clk, "gen_syn0_1_clk", NULL); |
813 | 819 | ||
814 | clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, | 820 | clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, |
815 | ARRAY_SIZE(gen_synth2_3_parents), 0, SPEAR1310_PLL_CFG, | 821 | ARRAY_SIZE(gen_synth2_3_parents), |
822 | CLK_SET_RATE_NO_REPARENT, SPEAR1310_PLL_CFG, | ||
816 | SPEAR1310_RAS_SYNT2_3_CLK_SHIFT, | 823 | SPEAR1310_RAS_SYNT2_3_CLK_SHIFT, |
817 | SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); | 824 | SPEAR1310_RAS_SYNT_CLK_MASK, 0, &_lock); |
818 | clk_register_clkdev(clk, "gen_syn2_3_clk", NULL); | 825 | clk_register_clkdev(clk, "gen_syn2_3_clk", NULL); |
@@ -929,8 +936,8 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
929 | 936 | ||
930 | clk = clk_register_mux(NULL, "smii_rgmii_phy_mclk", | 937 | clk = clk_register_mux(NULL, "smii_rgmii_phy_mclk", |
931 | smii_rgmii_phy_parents, | 938 | smii_rgmii_phy_parents, |
932 | ARRAY_SIZE(smii_rgmii_phy_parents), 0, | 939 | ARRAY_SIZE(smii_rgmii_phy_parents), |
933 | SPEAR1310_RAS_CTRL_REG1, | 940 | CLK_SET_RATE_NO_REPARENT, SPEAR1310_RAS_CTRL_REG1, |
934 | SPEAR1310_SMII_RGMII_PHY_CLK_SHIFT, | 941 | SPEAR1310_SMII_RGMII_PHY_CLK_SHIFT, |
935 | SPEAR1310_PHY_CLK_MASK, 0, &_lock); | 942 | SPEAR1310_PHY_CLK_MASK, 0, &_lock); |
936 | clk_register_clkdev(clk, "stmmacphy.1", NULL); | 943 | clk_register_clkdev(clk, "stmmacphy.1", NULL); |
@@ -938,15 +945,15 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
938 | clk_register_clkdev(clk, "stmmacphy.4", NULL); | 945 | clk_register_clkdev(clk, "stmmacphy.4", NULL); |
939 | 946 | ||
940 | clk = clk_register_mux(NULL, "rmii_phy_mclk", rmii_phy_parents, | 947 | clk = clk_register_mux(NULL, "rmii_phy_mclk", rmii_phy_parents, |
941 | ARRAY_SIZE(rmii_phy_parents), 0, | 948 | ARRAY_SIZE(rmii_phy_parents), CLK_SET_RATE_NO_REPARENT, |
942 | SPEAR1310_RAS_CTRL_REG1, SPEAR1310_RMII_PHY_CLK_SHIFT, | 949 | SPEAR1310_RAS_CTRL_REG1, SPEAR1310_RMII_PHY_CLK_SHIFT, |
943 | SPEAR1310_PHY_CLK_MASK, 0, &_lock); | 950 | SPEAR1310_PHY_CLK_MASK, 0, &_lock); |
944 | clk_register_clkdev(clk, "stmmacphy.3", NULL); | 951 | clk_register_clkdev(clk, "stmmacphy.3", NULL); |
945 | 952 | ||
946 | clk = clk_register_mux(NULL, "uart1_mclk", uart_parents, | 953 | clk = clk_register_mux(NULL, "uart1_mclk", uart_parents, |
947 | ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 954 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
948 | SPEAR1310_UART1_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, | 955 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART1_CLK_SHIFT, |
949 | 0, &_lock); | 956 | SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); |
950 | clk_register_clkdev(clk, "uart1_mclk", NULL); | 957 | clk_register_clkdev(clk, "uart1_mclk", NULL); |
951 | 958 | ||
952 | clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, | 959 | clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, |
@@ -955,9 +962,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
955 | clk_register_clkdev(clk, NULL, "5c800000.serial"); | 962 | clk_register_clkdev(clk, NULL, "5c800000.serial"); |
956 | 963 | ||
957 | clk = clk_register_mux(NULL, "uart2_mclk", uart_parents, | 964 | clk = clk_register_mux(NULL, "uart2_mclk", uart_parents, |
958 | ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 965 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
959 | SPEAR1310_UART2_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, | 966 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART2_CLK_SHIFT, |
960 | 0, &_lock); | 967 | SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); |
961 | clk_register_clkdev(clk, "uart2_mclk", NULL); | 968 | clk_register_clkdev(clk, "uart2_mclk", NULL); |
962 | 969 | ||
963 | clk = clk_register_gate(NULL, "uart2_clk", "uart2_mclk", 0, | 970 | clk = clk_register_gate(NULL, "uart2_clk", "uart2_mclk", 0, |
@@ -966,9 +973,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
966 | clk_register_clkdev(clk, NULL, "5c900000.serial"); | 973 | clk_register_clkdev(clk, NULL, "5c900000.serial"); |
967 | 974 | ||
968 | clk = clk_register_mux(NULL, "uart3_mclk", uart_parents, | 975 | clk = clk_register_mux(NULL, "uart3_mclk", uart_parents, |
969 | ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 976 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
970 | SPEAR1310_UART3_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, | 977 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART3_CLK_SHIFT, |
971 | 0, &_lock); | 978 | SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); |
972 | clk_register_clkdev(clk, "uart3_mclk", NULL); | 979 | clk_register_clkdev(clk, "uart3_mclk", NULL); |
973 | 980 | ||
974 | clk = clk_register_gate(NULL, "uart3_clk", "uart3_mclk", 0, | 981 | clk = clk_register_gate(NULL, "uart3_clk", "uart3_mclk", 0, |
@@ -977,9 +984,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
977 | clk_register_clkdev(clk, NULL, "5ca00000.serial"); | 984 | clk_register_clkdev(clk, NULL, "5ca00000.serial"); |
978 | 985 | ||
979 | clk = clk_register_mux(NULL, "uart4_mclk", uart_parents, | 986 | clk = clk_register_mux(NULL, "uart4_mclk", uart_parents, |
980 | ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 987 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
981 | SPEAR1310_UART4_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, | 988 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART4_CLK_SHIFT, |
982 | 0, &_lock); | 989 | SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); |
983 | clk_register_clkdev(clk, "uart4_mclk", NULL); | 990 | clk_register_clkdev(clk, "uart4_mclk", NULL); |
984 | 991 | ||
985 | clk = clk_register_gate(NULL, "uart4_clk", "uart4_mclk", 0, | 992 | clk = clk_register_gate(NULL, "uart4_clk", "uart4_mclk", 0, |
@@ -988,9 +995,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
988 | clk_register_clkdev(clk, NULL, "5cb00000.serial"); | 995 | clk_register_clkdev(clk, NULL, "5cb00000.serial"); |
989 | 996 | ||
990 | clk = clk_register_mux(NULL, "uart5_mclk", uart_parents, | 997 | clk = clk_register_mux(NULL, "uart5_mclk", uart_parents, |
991 | ARRAY_SIZE(uart_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 998 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
992 | SPEAR1310_UART5_CLK_SHIFT, SPEAR1310_RAS_UART_CLK_MASK, | 999 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_UART5_CLK_SHIFT, |
993 | 0, &_lock); | 1000 | SPEAR1310_RAS_UART_CLK_MASK, 0, &_lock); |
994 | clk_register_clkdev(clk, "uart5_mclk", NULL); | 1001 | clk_register_clkdev(clk, "uart5_mclk", NULL); |
995 | 1002 | ||
996 | clk = clk_register_gate(NULL, "uart5_clk", "uart5_mclk", 0, | 1003 | clk = clk_register_gate(NULL, "uart5_clk", "uart5_mclk", 0, |
@@ -999,9 +1006,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
999 | clk_register_clkdev(clk, NULL, "5cc00000.serial"); | 1006 | clk_register_clkdev(clk, NULL, "5cc00000.serial"); |
1000 | 1007 | ||
1001 | clk = clk_register_mux(NULL, "i2c1_mclk", i2c_parents, | 1008 | clk = clk_register_mux(NULL, "i2c1_mclk", i2c_parents, |
1002 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1009 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1003 | SPEAR1310_I2C1_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1010 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C1_CLK_SHIFT, |
1004 | &_lock); | 1011 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1005 | clk_register_clkdev(clk, "i2c1_mclk", NULL); | 1012 | clk_register_clkdev(clk, "i2c1_mclk", NULL); |
1006 | 1013 | ||
1007 | clk = clk_register_gate(NULL, "i2c1_clk", "i2c1_mclk", 0, | 1014 | clk = clk_register_gate(NULL, "i2c1_clk", "i2c1_mclk", 0, |
@@ -1010,9 +1017,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1010 | clk_register_clkdev(clk, NULL, "5cd00000.i2c"); | 1017 | clk_register_clkdev(clk, NULL, "5cd00000.i2c"); |
1011 | 1018 | ||
1012 | clk = clk_register_mux(NULL, "i2c2_mclk", i2c_parents, | 1019 | clk = clk_register_mux(NULL, "i2c2_mclk", i2c_parents, |
1013 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1020 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1014 | SPEAR1310_I2C2_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1021 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C2_CLK_SHIFT, |
1015 | &_lock); | 1022 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1016 | clk_register_clkdev(clk, "i2c2_mclk", NULL); | 1023 | clk_register_clkdev(clk, "i2c2_mclk", NULL); |
1017 | 1024 | ||
1018 | clk = clk_register_gate(NULL, "i2c2_clk", "i2c2_mclk", 0, | 1025 | clk = clk_register_gate(NULL, "i2c2_clk", "i2c2_mclk", 0, |
@@ -1021,9 +1028,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1021 | clk_register_clkdev(clk, NULL, "5ce00000.i2c"); | 1028 | clk_register_clkdev(clk, NULL, "5ce00000.i2c"); |
1022 | 1029 | ||
1023 | clk = clk_register_mux(NULL, "i2c3_mclk", i2c_parents, | 1030 | clk = clk_register_mux(NULL, "i2c3_mclk", i2c_parents, |
1024 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1031 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1025 | SPEAR1310_I2C3_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1032 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C3_CLK_SHIFT, |
1026 | &_lock); | 1033 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1027 | clk_register_clkdev(clk, "i2c3_mclk", NULL); | 1034 | clk_register_clkdev(clk, "i2c3_mclk", NULL); |
1028 | 1035 | ||
1029 | clk = clk_register_gate(NULL, "i2c3_clk", "i2c3_mclk", 0, | 1036 | clk = clk_register_gate(NULL, "i2c3_clk", "i2c3_mclk", 0, |
@@ -1032,9 +1039,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1032 | clk_register_clkdev(clk, NULL, "5cf00000.i2c"); | 1039 | clk_register_clkdev(clk, NULL, "5cf00000.i2c"); |
1033 | 1040 | ||
1034 | clk = clk_register_mux(NULL, "i2c4_mclk", i2c_parents, | 1041 | clk = clk_register_mux(NULL, "i2c4_mclk", i2c_parents, |
1035 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1042 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1036 | SPEAR1310_I2C4_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1043 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C4_CLK_SHIFT, |
1037 | &_lock); | 1044 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1038 | clk_register_clkdev(clk, "i2c4_mclk", NULL); | 1045 | clk_register_clkdev(clk, "i2c4_mclk", NULL); |
1039 | 1046 | ||
1040 | clk = clk_register_gate(NULL, "i2c4_clk", "i2c4_mclk", 0, | 1047 | clk = clk_register_gate(NULL, "i2c4_clk", "i2c4_mclk", 0, |
@@ -1043,9 +1050,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1043 | clk_register_clkdev(clk, NULL, "5d000000.i2c"); | 1050 | clk_register_clkdev(clk, NULL, "5d000000.i2c"); |
1044 | 1051 | ||
1045 | clk = clk_register_mux(NULL, "i2c5_mclk", i2c_parents, | 1052 | clk = clk_register_mux(NULL, "i2c5_mclk", i2c_parents, |
1046 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1053 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1047 | SPEAR1310_I2C5_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1054 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C5_CLK_SHIFT, |
1048 | &_lock); | 1055 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1049 | clk_register_clkdev(clk, "i2c5_mclk", NULL); | 1056 | clk_register_clkdev(clk, "i2c5_mclk", NULL); |
1050 | 1057 | ||
1051 | clk = clk_register_gate(NULL, "i2c5_clk", "i2c5_mclk", 0, | 1058 | clk = clk_register_gate(NULL, "i2c5_clk", "i2c5_mclk", 0, |
@@ -1054,9 +1061,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1054 | clk_register_clkdev(clk, NULL, "5d100000.i2c"); | 1061 | clk_register_clkdev(clk, NULL, "5d100000.i2c"); |
1055 | 1062 | ||
1056 | clk = clk_register_mux(NULL, "i2c6_mclk", i2c_parents, | 1063 | clk = clk_register_mux(NULL, "i2c6_mclk", i2c_parents, |
1057 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1064 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1058 | SPEAR1310_I2C6_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1065 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C6_CLK_SHIFT, |
1059 | &_lock); | 1066 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1060 | clk_register_clkdev(clk, "i2c6_mclk", NULL); | 1067 | clk_register_clkdev(clk, "i2c6_mclk", NULL); |
1061 | 1068 | ||
1062 | clk = clk_register_gate(NULL, "i2c6_clk", "i2c6_mclk", 0, | 1069 | clk = clk_register_gate(NULL, "i2c6_clk", "i2c6_mclk", 0, |
@@ -1065,9 +1072,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1065 | clk_register_clkdev(clk, NULL, "5d200000.i2c"); | 1072 | clk_register_clkdev(clk, NULL, "5d200000.i2c"); |
1066 | 1073 | ||
1067 | clk = clk_register_mux(NULL, "i2c7_mclk", i2c_parents, | 1074 | clk = clk_register_mux(NULL, "i2c7_mclk", i2c_parents, |
1068 | ARRAY_SIZE(i2c_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1075 | ARRAY_SIZE(i2c_parents), CLK_SET_RATE_NO_REPARENT, |
1069 | SPEAR1310_I2C7_CLK_SHIFT, SPEAR1310_I2C_CLK_MASK, 0, | 1076 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_I2C7_CLK_SHIFT, |
1070 | &_lock); | 1077 | SPEAR1310_I2C_CLK_MASK, 0, &_lock); |
1071 | clk_register_clkdev(clk, "i2c7_mclk", NULL); | 1078 | clk_register_clkdev(clk, "i2c7_mclk", NULL); |
1072 | 1079 | ||
1073 | clk = clk_register_gate(NULL, "i2c7_clk", "i2c7_mclk", 0, | 1080 | clk = clk_register_gate(NULL, "i2c7_clk", "i2c7_mclk", 0, |
@@ -1076,9 +1083,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1076 | clk_register_clkdev(clk, NULL, "5d300000.i2c"); | 1083 | clk_register_clkdev(clk, NULL, "5d300000.i2c"); |
1077 | 1084 | ||
1078 | clk = clk_register_mux(NULL, "ssp1_mclk", ssp1_parents, | 1085 | clk = clk_register_mux(NULL, "ssp1_mclk", ssp1_parents, |
1079 | ARRAY_SIZE(ssp1_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1086 | ARRAY_SIZE(ssp1_parents), CLK_SET_RATE_NO_REPARENT, |
1080 | SPEAR1310_SSP1_CLK_SHIFT, SPEAR1310_SSP1_CLK_MASK, 0, | 1087 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_SSP1_CLK_SHIFT, |
1081 | &_lock); | 1088 | SPEAR1310_SSP1_CLK_MASK, 0, &_lock); |
1082 | clk_register_clkdev(clk, "ssp1_mclk", NULL); | 1089 | clk_register_clkdev(clk, "ssp1_mclk", NULL); |
1083 | 1090 | ||
1084 | clk = clk_register_gate(NULL, "ssp1_clk", "ssp1_mclk", 0, | 1091 | clk = clk_register_gate(NULL, "ssp1_clk", "ssp1_mclk", 0, |
@@ -1087,9 +1094,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1087 | clk_register_clkdev(clk, NULL, "5d400000.spi"); | 1094 | clk_register_clkdev(clk, NULL, "5d400000.spi"); |
1088 | 1095 | ||
1089 | clk = clk_register_mux(NULL, "pci_mclk", pci_parents, | 1096 | clk = clk_register_mux(NULL, "pci_mclk", pci_parents, |
1090 | ARRAY_SIZE(pci_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1097 | ARRAY_SIZE(pci_parents), CLK_SET_RATE_NO_REPARENT, |
1091 | SPEAR1310_PCI_CLK_SHIFT, SPEAR1310_PCI_CLK_MASK, 0, | 1098 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_PCI_CLK_SHIFT, |
1092 | &_lock); | 1099 | SPEAR1310_PCI_CLK_MASK, 0, &_lock); |
1093 | clk_register_clkdev(clk, "pci_mclk", NULL); | 1100 | clk_register_clkdev(clk, "pci_mclk", NULL); |
1094 | 1101 | ||
1095 | clk = clk_register_gate(NULL, "pci_clk", "pci_mclk", 0, | 1102 | clk = clk_register_gate(NULL, "pci_clk", "pci_mclk", 0, |
@@ -1098,9 +1105,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1098 | clk_register_clkdev(clk, NULL, "pci"); | 1105 | clk_register_clkdev(clk, NULL, "pci"); |
1099 | 1106 | ||
1100 | clk = clk_register_mux(NULL, "tdm1_mclk", tdm_parents, | 1107 | clk = clk_register_mux(NULL, "tdm1_mclk", tdm_parents, |
1101 | ARRAY_SIZE(tdm_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1108 | ARRAY_SIZE(tdm_parents), CLK_SET_RATE_NO_REPARENT, |
1102 | SPEAR1310_TDM1_CLK_SHIFT, SPEAR1310_TDM_CLK_MASK, 0, | 1109 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_TDM1_CLK_SHIFT, |
1103 | &_lock); | 1110 | SPEAR1310_TDM_CLK_MASK, 0, &_lock); |
1104 | clk_register_clkdev(clk, "tdm1_mclk", NULL); | 1111 | clk_register_clkdev(clk, "tdm1_mclk", NULL); |
1105 | 1112 | ||
1106 | clk = clk_register_gate(NULL, "tdm1_clk", "tdm1_mclk", 0, | 1113 | clk = clk_register_gate(NULL, "tdm1_clk", "tdm1_mclk", 0, |
@@ -1109,9 +1116,9 @@ void __init spear1310_clk_init(void __iomem *misc_base, void __iomem *ras_base) | |||
1109 | clk_register_clkdev(clk, NULL, "tdm_hdlc.0"); | 1116 | clk_register_clkdev(clk, NULL, "tdm_hdlc.0"); |
1110 | 1117 | ||
1111 | clk = clk_register_mux(NULL, "tdm2_mclk", tdm_parents, | 1118 | clk = clk_register_mux(NULL, "tdm2_mclk", tdm_parents, |
1112 | ARRAY_SIZE(tdm_parents), 0, SPEAR1310_RAS_CTRL_REG0, | 1119 | ARRAY_SIZE(tdm_parents), CLK_SET_RATE_NO_REPARENT, |
1113 | SPEAR1310_TDM2_CLK_SHIFT, SPEAR1310_TDM_CLK_MASK, 0, | 1120 | SPEAR1310_RAS_CTRL_REG0, SPEAR1310_TDM2_CLK_SHIFT, |
1114 | &_lock); | 1121 | SPEAR1310_TDM_CLK_MASK, 0, &_lock); |
1115 | clk_register_clkdev(clk, "tdm2_mclk", NULL); | 1122 | clk_register_clkdev(clk, "tdm2_mclk", NULL); |
1116 | 1123 | ||
1117 | clk = clk_register_gate(NULL, "tdm2_clk", "tdm2_mclk", 0, | 1124 | clk = clk_register_gate(NULL, "tdm2_clk", "tdm2_mclk", 0, |
diff --git a/drivers/clk/spear/spear1340_clock.c b/drivers/clk/spear/spear1340_clock.c index 9d0b3949db30..fe835c1845fe 100644 --- a/drivers/clk/spear/spear1340_clock.c +++ b/drivers/clk/spear/spear1340_clock.c | |||
@@ -473,9 +473,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
473 | /* clock derived from 24 or 25 MHz osc clk */ | 473 | /* clock derived from 24 or 25 MHz osc clk */ |
474 | /* vco-pll */ | 474 | /* vco-pll */ |
475 | clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, | 475 | clk = clk_register_mux(NULL, "vco1_mclk", vco_parents, |
476 | ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, | 476 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
477 | SPEAR1340_PLL1_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, | 477 | SPEAR1340_PLL_CFG, SPEAR1340_PLL1_CLK_SHIFT, |
478 | &_lock); | 478 | SPEAR1340_PLL_CLK_MASK, 0, &_lock); |
479 | clk_register_clkdev(clk, "vco1_mclk", NULL); | 479 | clk_register_clkdev(clk, "vco1_mclk", NULL); |
480 | clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 0, | 480 | clk = clk_register_vco_pll("vco1_clk", "pll1_clk", NULL, "vco1_mclk", 0, |
481 | SPEAR1340_PLL1_CTR, SPEAR1340_PLL1_FRQ, pll_rtbl, | 481 | SPEAR1340_PLL1_CTR, SPEAR1340_PLL1_FRQ, pll_rtbl, |
@@ -484,9 +484,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
484 | clk_register_clkdev(clk1, "pll1_clk", NULL); | 484 | clk_register_clkdev(clk1, "pll1_clk", NULL); |
485 | 485 | ||
486 | clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, | 486 | clk = clk_register_mux(NULL, "vco2_mclk", vco_parents, |
487 | ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, | 487 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
488 | SPEAR1340_PLL2_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, | 488 | SPEAR1340_PLL_CFG, SPEAR1340_PLL2_CLK_SHIFT, |
489 | &_lock); | 489 | SPEAR1340_PLL_CLK_MASK, 0, &_lock); |
490 | clk_register_clkdev(clk, "vco2_mclk", NULL); | 490 | clk_register_clkdev(clk, "vco2_mclk", NULL); |
491 | clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 0, | 491 | clk = clk_register_vco_pll("vco2_clk", "pll2_clk", NULL, "vco2_mclk", 0, |
492 | SPEAR1340_PLL2_CTR, SPEAR1340_PLL2_FRQ, pll_rtbl, | 492 | SPEAR1340_PLL2_CTR, SPEAR1340_PLL2_FRQ, pll_rtbl, |
@@ -495,9 +495,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
495 | clk_register_clkdev(clk1, "pll2_clk", NULL); | 495 | clk_register_clkdev(clk1, "pll2_clk", NULL); |
496 | 496 | ||
497 | clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, | 497 | clk = clk_register_mux(NULL, "vco3_mclk", vco_parents, |
498 | ARRAY_SIZE(vco_parents), 0, SPEAR1340_PLL_CFG, | 498 | ARRAY_SIZE(vco_parents), CLK_SET_RATE_NO_REPARENT, |
499 | SPEAR1340_PLL3_CLK_SHIFT, SPEAR1340_PLL_CLK_MASK, 0, | 499 | SPEAR1340_PLL_CFG, SPEAR1340_PLL3_CLK_SHIFT, |
500 | &_lock); | 500 | SPEAR1340_PLL_CLK_MASK, 0, &_lock); |
501 | clk_register_clkdev(clk, "vco3_mclk", NULL); | 501 | clk_register_clkdev(clk, "vco3_mclk", NULL); |
502 | clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 0, | 502 | clk = clk_register_vco_pll("vco3_clk", "pll3_clk", NULL, "vco3_mclk", 0, |
503 | SPEAR1340_PLL3_CTR, SPEAR1340_PLL3_FRQ, pll_rtbl, | 503 | SPEAR1340_PLL3_CTR, SPEAR1340_PLL3_FRQ, pll_rtbl, |
@@ -561,8 +561,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
561 | clk_register_clkdev(clk, "amba_syn_clk", NULL); | 561 | clk_register_clkdev(clk, "amba_syn_clk", NULL); |
562 | 562 | ||
563 | clk = clk_register_mux(NULL, "sys_mclk", sys_parents, | 563 | clk = clk_register_mux(NULL, "sys_mclk", sys_parents, |
564 | ARRAY_SIZE(sys_parents), 0, SPEAR1340_SYS_CLK_CTRL, | 564 | ARRAY_SIZE(sys_parents), CLK_SET_RATE_NO_REPARENT, |
565 | SPEAR1340_SCLK_SRC_SEL_SHIFT, | 565 | SPEAR1340_SYS_CLK_CTRL, SPEAR1340_SCLK_SRC_SEL_SHIFT, |
566 | SPEAR1340_SCLK_SRC_SEL_MASK, 0, &_lock); | 566 | SPEAR1340_SCLK_SRC_SEL_MASK, 0, &_lock); |
567 | clk_register_clkdev(clk, "sys_mclk", NULL); | 567 | clk_register_clkdev(clk, "sys_mclk", NULL); |
568 | 568 | ||
@@ -583,8 +583,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
583 | clk_register_clkdev(clk, NULL, "smp_twd"); | 583 | clk_register_clkdev(clk, NULL, "smp_twd"); |
584 | 584 | ||
585 | clk = clk_register_mux(NULL, "ahb_clk", ahb_parents, | 585 | clk = clk_register_mux(NULL, "ahb_clk", ahb_parents, |
586 | ARRAY_SIZE(ahb_parents), 0, SPEAR1340_SYS_CLK_CTRL, | 586 | ARRAY_SIZE(ahb_parents), CLK_SET_RATE_NO_REPARENT, |
587 | SPEAR1340_HCLK_SRC_SEL_SHIFT, | 587 | SPEAR1340_SYS_CLK_CTRL, SPEAR1340_HCLK_SRC_SEL_SHIFT, |
588 | SPEAR1340_HCLK_SRC_SEL_MASK, 0, &_lock); | 588 | SPEAR1340_HCLK_SRC_SEL_MASK, 0, &_lock); |
589 | clk_register_clkdev(clk, "ahb_clk", NULL); | 589 | clk_register_clkdev(clk, "ahb_clk", NULL); |
590 | 590 | ||
@@ -594,9 +594,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
594 | 594 | ||
595 | /* gpt clocks */ | 595 | /* gpt clocks */ |
596 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, | 596 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt_parents, |
597 | ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, | 597 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
598 | SPEAR1340_GPT0_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, | 598 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT0_CLK_SHIFT, |
599 | &_lock); | 599 | SPEAR1340_GPT_CLK_MASK, 0, &_lock); |
600 | clk_register_clkdev(clk, "gpt0_mclk", NULL); | 600 | clk_register_clkdev(clk, "gpt0_mclk", NULL); |
601 | clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, | 601 | clk = clk_register_gate(NULL, "gpt0_clk", "gpt0_mclk", 0, |
602 | SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT0_CLK_ENB, 0, | 602 | SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT0_CLK_ENB, 0, |
@@ -604,9 +604,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
604 | clk_register_clkdev(clk, NULL, "gpt0"); | 604 | clk_register_clkdev(clk, NULL, "gpt0"); |
605 | 605 | ||
606 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, | 606 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt_parents, |
607 | ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, | 607 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
608 | SPEAR1340_GPT1_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, | 608 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT1_CLK_SHIFT, |
609 | &_lock); | 609 | SPEAR1340_GPT_CLK_MASK, 0, &_lock); |
610 | clk_register_clkdev(clk, "gpt1_mclk", NULL); | 610 | clk_register_clkdev(clk, "gpt1_mclk", NULL); |
611 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, | 611 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, |
612 | SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT1_CLK_ENB, 0, | 612 | SPEAR1340_PERIP1_CLK_ENB, SPEAR1340_GPT1_CLK_ENB, 0, |
@@ -614,9 +614,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
614 | clk_register_clkdev(clk, NULL, "gpt1"); | 614 | clk_register_clkdev(clk, NULL, "gpt1"); |
615 | 615 | ||
616 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, | 616 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt_parents, |
617 | ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, | 617 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
618 | SPEAR1340_GPT2_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, | 618 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT2_CLK_SHIFT, |
619 | &_lock); | 619 | SPEAR1340_GPT_CLK_MASK, 0, &_lock); |
620 | clk_register_clkdev(clk, "gpt2_mclk", NULL); | 620 | clk_register_clkdev(clk, "gpt2_mclk", NULL); |
621 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, | 621 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, |
622 | SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT2_CLK_ENB, 0, | 622 | SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT2_CLK_ENB, 0, |
@@ -624,9 +624,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
624 | clk_register_clkdev(clk, NULL, "gpt2"); | 624 | clk_register_clkdev(clk, NULL, "gpt2"); |
625 | 625 | ||
626 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, | 626 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt_parents, |
627 | ARRAY_SIZE(gpt_parents), 0, SPEAR1340_PERIP_CLK_CFG, | 627 | ARRAY_SIZE(gpt_parents), CLK_SET_RATE_NO_REPARENT, |
628 | SPEAR1340_GPT3_CLK_SHIFT, SPEAR1340_GPT_CLK_MASK, 0, | 628 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GPT3_CLK_SHIFT, |
629 | &_lock); | 629 | SPEAR1340_GPT_CLK_MASK, 0, &_lock); |
630 | clk_register_clkdev(clk, "gpt3_mclk", NULL); | 630 | clk_register_clkdev(clk, "gpt3_mclk", NULL); |
631 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, | 631 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, |
632 | SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT3_CLK_ENB, 0, | 632 | SPEAR1340_PERIP2_CLK_ENB, SPEAR1340_GPT3_CLK_ENB, 0, |
@@ -641,7 +641,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
641 | clk_register_clkdev(clk1, "uart0_syn_gclk", NULL); | 641 | clk_register_clkdev(clk1, "uart0_syn_gclk", NULL); |
642 | 642 | ||
643 | clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, | 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 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART0_CLK_SHIFT, | 646 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART0_CLK_SHIFT, |
646 | SPEAR1340_UART_CLK_MASK, 0, &_lock); | 647 | SPEAR1340_UART_CLK_MASK, 0, &_lock); |
647 | clk_register_clkdev(clk, "uart0_mclk", NULL); | 648 | clk_register_clkdev(clk, "uart0_mclk", NULL); |
@@ -658,9 +659,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
658 | clk_register_clkdev(clk1, "uart1_syn_gclk", NULL); | 659 | clk_register_clkdev(clk1, "uart1_syn_gclk", NULL); |
659 | 660 | ||
660 | clk = clk_register_mux(NULL, "uart1_mclk", uart1_parents, | 661 | clk = clk_register_mux(NULL, "uart1_mclk", uart1_parents, |
661 | ARRAY_SIZE(uart1_parents), 0, SPEAR1340_PERIP_CLK_CFG, | 662 | ARRAY_SIZE(uart1_parents), CLK_SET_RATE_NO_REPARENT, |
662 | SPEAR1340_UART1_CLK_SHIFT, SPEAR1340_UART_CLK_MASK, 0, | 663 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_UART1_CLK_SHIFT, |
663 | &_lock); | 664 | SPEAR1340_UART_CLK_MASK, 0, &_lock); |
664 | clk_register_clkdev(clk, "uart1_mclk", NULL); | 665 | clk_register_clkdev(clk, "uart1_mclk", NULL); |
665 | 666 | ||
666 | clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, | 667 | clk = clk_register_gate(NULL, "uart1_clk", "uart1_mclk", 0, |
@@ -698,7 +699,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
698 | clk_register_clkdev(clk1, "c3_syn_gclk", NULL); | 699 | clk_register_clkdev(clk1, "c3_syn_gclk", NULL); |
699 | 700 | ||
700 | clk = clk_register_mux(NULL, "c3_mclk", c3_parents, | 701 | clk = clk_register_mux(NULL, "c3_mclk", c3_parents, |
701 | ARRAY_SIZE(c3_parents), CLK_SET_RATE_PARENT, | 702 | ARRAY_SIZE(c3_parents), |
703 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
702 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_C3_CLK_SHIFT, | 704 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_C3_CLK_SHIFT, |
703 | SPEAR1340_C3_CLK_MASK, 0, &_lock); | 705 | SPEAR1340_C3_CLK_MASK, 0, &_lock); |
704 | clk_register_clkdev(clk, "c3_mclk", NULL); | 706 | clk_register_clkdev(clk, "c3_mclk", NULL); |
@@ -710,8 +712,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
710 | 712 | ||
711 | /* gmac */ | 713 | /* gmac */ |
712 | clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, | 714 | clk = clk_register_mux(NULL, "phy_input_mclk", gmac_phy_input_parents, |
713 | ARRAY_SIZE(gmac_phy_input_parents), 0, | 715 | ARRAY_SIZE(gmac_phy_input_parents), |
714 | SPEAR1340_GMAC_CLK_CFG, | 716 | CLK_SET_RATE_NO_REPARENT, SPEAR1340_GMAC_CLK_CFG, |
715 | SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT, | 717 | SPEAR1340_GMAC_PHY_INPUT_CLK_SHIFT, |
716 | SPEAR1340_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); | 718 | SPEAR1340_GMAC_PHY_INPUT_CLK_MASK, 0, &_lock); |
717 | clk_register_clkdev(clk, "phy_input_mclk", NULL); | 719 | clk_register_clkdev(clk, "phy_input_mclk", NULL); |
@@ -723,15 +725,16 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
723 | clk_register_clkdev(clk1, "phy_syn_gclk", NULL); | 725 | clk_register_clkdev(clk1, "phy_syn_gclk", NULL); |
724 | 726 | ||
725 | clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, | 727 | clk = clk_register_mux(NULL, "phy_mclk", gmac_phy_parents, |
726 | ARRAY_SIZE(gmac_phy_parents), 0, | 728 | ARRAY_SIZE(gmac_phy_parents), CLK_SET_RATE_NO_REPARENT, |
727 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GMAC_PHY_CLK_SHIFT, | 729 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_GMAC_PHY_CLK_SHIFT, |
728 | SPEAR1340_GMAC_PHY_CLK_MASK, 0, &_lock); | 730 | SPEAR1340_GMAC_PHY_CLK_MASK, 0, &_lock); |
729 | clk_register_clkdev(clk, "stmmacphy.0", NULL); | 731 | clk_register_clkdev(clk, "stmmacphy.0", NULL); |
730 | 732 | ||
731 | /* clcd */ | 733 | /* clcd */ |
732 | clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, | 734 | clk = clk_register_mux(NULL, "clcd_syn_mclk", clcd_synth_parents, |
733 | ARRAY_SIZE(clcd_synth_parents), 0, | 735 | ARRAY_SIZE(clcd_synth_parents), |
734 | SPEAR1340_CLCD_CLK_SYNT, SPEAR1340_CLCD_SYNT_CLK_SHIFT, | 736 | CLK_SET_RATE_NO_REPARENT, SPEAR1340_CLCD_CLK_SYNT, |
737 | SPEAR1340_CLCD_SYNT_CLK_SHIFT, | ||
735 | SPEAR1340_CLCD_SYNT_CLK_MASK, 0, &_lock); | 738 | SPEAR1340_CLCD_SYNT_CLK_MASK, 0, &_lock); |
736 | clk_register_clkdev(clk, "clcd_syn_mclk", NULL); | 739 | clk_register_clkdev(clk, "clcd_syn_mclk", NULL); |
737 | 740 | ||
@@ -741,7 +744,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
741 | clk_register_clkdev(clk, "clcd_syn_clk", NULL); | 744 | clk_register_clkdev(clk, "clcd_syn_clk", NULL); |
742 | 745 | ||
743 | clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, | 746 | clk = clk_register_mux(NULL, "clcd_pixel_mclk", clcd_pixel_parents, |
744 | ARRAY_SIZE(clcd_pixel_parents), CLK_SET_RATE_PARENT, | 747 | ARRAY_SIZE(clcd_pixel_parents), |
748 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
745 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_CLCD_CLK_SHIFT, | 749 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_CLCD_CLK_SHIFT, |
746 | SPEAR1340_CLCD_CLK_MASK, 0, &_lock); | 750 | SPEAR1340_CLCD_CLK_MASK, 0, &_lock); |
747 | clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); | 751 | clk_register_clkdev(clk, "clcd_pixel_mclk", NULL); |
@@ -753,9 +757,9 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
753 | 757 | ||
754 | /* i2s */ | 758 | /* i2s */ |
755 | clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, | 759 | clk = clk_register_mux(NULL, "i2s_src_mclk", i2s_src_parents, |
756 | ARRAY_SIZE(i2s_src_parents), 0, SPEAR1340_I2S_CLK_CFG, | 760 | ARRAY_SIZE(i2s_src_parents), CLK_SET_RATE_NO_REPARENT, |
757 | SPEAR1340_I2S_SRC_CLK_SHIFT, SPEAR1340_I2S_SRC_CLK_MASK, | 761 | SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_SRC_CLK_SHIFT, |
758 | 0, &_lock); | 762 | SPEAR1340_I2S_SRC_CLK_MASK, 0, &_lock); |
759 | clk_register_clkdev(clk, "i2s_src_mclk", NULL); | 763 | clk_register_clkdev(clk, "i2s_src_mclk", NULL); |
760 | 764 | ||
761 | clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", | 765 | clk = clk_register_aux("i2s_prs1_clk", NULL, "i2s_src_mclk", |
@@ -765,7 +769,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
765 | clk_register_clkdev(clk, "i2s_prs1_clk", NULL); | 769 | clk_register_clkdev(clk, "i2s_prs1_clk", NULL); |
766 | 770 | ||
767 | clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, | 771 | clk = clk_register_mux(NULL, "i2s_ref_mclk", i2s_ref_parents, |
768 | ARRAY_SIZE(i2s_ref_parents), CLK_SET_RATE_PARENT, | 772 | ARRAY_SIZE(i2s_ref_parents), |
773 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
769 | SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_REF_SHIFT, | 774 | SPEAR1340_I2S_CLK_CFG, SPEAR1340_I2S_REF_SHIFT, |
770 | SPEAR1340_I2S_REF_SEL_MASK, 0, &_lock); | 775 | SPEAR1340_I2S_REF_SEL_MASK, 0, &_lock); |
771 | clk_register_clkdev(clk, "i2s_ref_mclk", NULL); | 776 | clk_register_clkdev(clk, "i2s_ref_mclk", NULL); |
@@ -891,13 +896,15 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
891 | 896 | ||
892 | /* RAS clks */ | 897 | /* RAS clks */ |
893 | clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, | 898 | clk = clk_register_mux(NULL, "gen_syn0_1_mclk", gen_synth0_1_parents, |
894 | ARRAY_SIZE(gen_synth0_1_parents), 0, SPEAR1340_PLL_CFG, | 899 | ARRAY_SIZE(gen_synth0_1_parents), |
900 | CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG, | ||
895 | SPEAR1340_GEN_SYNT0_1_CLK_SHIFT, | 901 | SPEAR1340_GEN_SYNT0_1_CLK_SHIFT, |
896 | SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); | 902 | SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); |
897 | clk_register_clkdev(clk, "gen_syn0_1_mclk", NULL); | 903 | clk_register_clkdev(clk, "gen_syn0_1_mclk", NULL); |
898 | 904 | ||
899 | clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, | 905 | clk = clk_register_mux(NULL, "gen_syn2_3_mclk", gen_synth2_3_parents, |
900 | ARRAY_SIZE(gen_synth2_3_parents), 0, SPEAR1340_PLL_CFG, | 906 | ARRAY_SIZE(gen_synth2_3_parents), |
907 | CLK_SET_RATE_NO_REPARENT, SPEAR1340_PLL_CFG, | ||
901 | SPEAR1340_GEN_SYNT2_3_CLK_SHIFT, | 908 | SPEAR1340_GEN_SYNT2_3_CLK_SHIFT, |
902 | SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); | 909 | SPEAR1340_GEN_SYNT_CLK_MASK, 0, &_lock); |
903 | clk_register_clkdev(clk, "gen_syn2_3_mclk", NULL); | 910 | clk_register_clkdev(clk, "gen_syn2_3_mclk", NULL); |
@@ -938,7 +945,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
938 | clk_register_clkdev(clk, NULL, "spear_cec.1"); | 945 | clk_register_clkdev(clk, NULL, "spear_cec.1"); |
939 | 946 | ||
940 | clk = clk_register_mux(NULL, "spdif_out_mclk", spdif_out_parents, | 947 | clk = clk_register_mux(NULL, "spdif_out_mclk", spdif_out_parents, |
941 | ARRAY_SIZE(spdif_out_parents), CLK_SET_RATE_PARENT, | 948 | ARRAY_SIZE(spdif_out_parents), |
949 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
942 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_OUT_CLK_SHIFT, | 950 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_OUT_CLK_SHIFT, |
943 | SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); | 951 | SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); |
944 | clk_register_clkdev(clk, "spdif_out_mclk", NULL); | 952 | clk_register_clkdev(clk, "spdif_out_mclk", NULL); |
@@ -949,7 +957,8 @@ void __init spear1340_clk_init(void __iomem *misc_base) | |||
949 | clk_register_clkdev(clk, NULL, "d0000000.spdif-out"); | 957 | clk_register_clkdev(clk, NULL, "d0000000.spdif-out"); |
950 | 958 | ||
951 | clk = clk_register_mux(NULL, "spdif_in_mclk", spdif_in_parents, | 959 | clk = clk_register_mux(NULL, "spdif_in_mclk", spdif_in_parents, |
952 | ARRAY_SIZE(spdif_in_parents), CLK_SET_RATE_PARENT, | 960 | ARRAY_SIZE(spdif_in_parents), |
961 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
953 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_IN_CLK_SHIFT, | 962 | SPEAR1340_PERIP_CLK_CFG, SPEAR1340_SPDIF_IN_CLK_SHIFT, |
954 | SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); | 963 | SPEAR1340_SPDIF_CLK_MASK, 0, &_lock); |
955 | clk_register_clkdev(clk, "spdif_in_mclk", NULL); | 964 | clk_register_clkdev(clk, "spdif_in_mclk", NULL); |
diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index 080c3c5e33f6..c2d204315546 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c | |||
@@ -294,7 +294,8 @@ static void __init spear320_clk_init(void __iomem *soc_config_base) | |||
294 | clk_register_clkdev(clk, NULL, "a9400000.i2s"); | 294 | clk_register_clkdev(clk, NULL, "a9400000.i2s"); |
295 | 295 | ||
296 | clk = clk_register_mux(NULL, "i2s_ref_clk", i2s_ref_parents, | 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 | SPEAR320_CONTROL_REG, I2S_REF_PCLK_SHIFT, | 299 | SPEAR320_CONTROL_REG, I2S_REF_PCLK_SHIFT, |
299 | I2S_REF_PCLK_MASK, 0, &_lock); | 300 | I2S_REF_PCLK_MASK, 0, &_lock); |
300 | clk_register_clkdev(clk, "i2s_ref_clk", NULL); | 301 | clk_register_clkdev(clk, "i2s_ref_clk", NULL); |
@@ -313,57 +314,66 @@ static void __init spear320_clk_init(void __iomem *soc_config_base) | |||
313 | clk_register_clkdev(clk, "hclk", "ab000000.eth"); | 314 | clk_register_clkdev(clk, "hclk", "ab000000.eth"); |
314 | 315 | ||
315 | clk = clk_register_mux(NULL, "rs485_clk", uartx_parents, | 316 | clk = clk_register_mux(NULL, "rs485_clk", uartx_parents, |
316 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 317 | ARRAY_SIZE(uartx_parents), |
318 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
317 | SPEAR320_EXT_CTRL_REG, SPEAR320_RS485_PCLK_SHIFT, | 319 | SPEAR320_EXT_CTRL_REG, SPEAR320_RS485_PCLK_SHIFT, |
318 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 320 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
319 | clk_register_clkdev(clk, NULL, "a9300000.serial"); | 321 | clk_register_clkdev(clk, NULL, "a9300000.serial"); |
320 | 322 | ||
321 | clk = clk_register_mux(NULL, "sdhci_clk", sdhci_parents, | 323 | clk = clk_register_mux(NULL, "sdhci_clk", sdhci_parents, |
322 | ARRAY_SIZE(sdhci_parents), CLK_SET_RATE_PARENT, | 324 | ARRAY_SIZE(sdhci_parents), |
325 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
323 | SPEAR320_CONTROL_REG, SDHCI_PCLK_SHIFT, SDHCI_PCLK_MASK, | 326 | SPEAR320_CONTROL_REG, SDHCI_PCLK_SHIFT, SDHCI_PCLK_MASK, |
324 | 0, &_lock); | 327 | 0, &_lock); |
325 | clk_register_clkdev(clk, NULL, "70000000.sdhci"); | 328 | clk_register_clkdev(clk, NULL, "70000000.sdhci"); |
326 | 329 | ||
327 | clk = clk_register_mux(NULL, "smii_pclk", smii0_parents, | 330 | clk = clk_register_mux(NULL, "smii_pclk", smii0_parents, |
328 | ARRAY_SIZE(smii0_parents), 0, SPEAR320_CONTROL_REG, | 331 | ARRAY_SIZE(smii0_parents), CLK_SET_RATE_NO_REPARENT, |
329 | SMII_PCLK_SHIFT, SMII_PCLK_MASK, 0, &_lock); | 332 | SPEAR320_CONTROL_REG, SMII_PCLK_SHIFT, SMII_PCLK_MASK, |
333 | 0, &_lock); | ||
330 | clk_register_clkdev(clk, NULL, "smii_pclk"); | 334 | clk_register_clkdev(clk, NULL, "smii_pclk"); |
331 | 335 | ||
332 | clk = clk_register_fixed_factor(NULL, "smii_clk", "smii_pclk", 0, 1, 1); | 336 | clk = clk_register_fixed_factor(NULL, "smii_clk", "smii_pclk", 0, 1, 1); |
333 | clk_register_clkdev(clk, NULL, "smii"); | 337 | clk_register_clkdev(clk, NULL, "smii"); |
334 | 338 | ||
335 | clk = clk_register_mux(NULL, "uart1_clk", uartx_parents, | 339 | clk = clk_register_mux(NULL, "uart1_clk", uartx_parents, |
336 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 340 | ARRAY_SIZE(uartx_parents), |
341 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
337 | SPEAR320_CONTROL_REG, UART1_PCLK_SHIFT, UART1_PCLK_MASK, | 342 | SPEAR320_CONTROL_REG, UART1_PCLK_SHIFT, UART1_PCLK_MASK, |
338 | 0, &_lock); | 343 | 0, &_lock); |
339 | clk_register_clkdev(clk, NULL, "a3000000.serial"); | 344 | clk_register_clkdev(clk, NULL, "a3000000.serial"); |
340 | 345 | ||
341 | clk = clk_register_mux(NULL, "uart2_clk", uartx_parents, | 346 | clk = clk_register_mux(NULL, "uart2_clk", uartx_parents, |
342 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 347 | ARRAY_SIZE(uartx_parents), |
348 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
343 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART2_PCLK_SHIFT, | 349 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART2_PCLK_SHIFT, |
344 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 350 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
345 | clk_register_clkdev(clk, NULL, "a4000000.serial"); | 351 | clk_register_clkdev(clk, NULL, "a4000000.serial"); |
346 | 352 | ||
347 | clk = clk_register_mux(NULL, "uart3_clk", uartx_parents, | 353 | clk = clk_register_mux(NULL, "uart3_clk", uartx_parents, |
348 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 354 | ARRAY_SIZE(uartx_parents), |
355 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
349 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART3_PCLK_SHIFT, | 356 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART3_PCLK_SHIFT, |
350 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 357 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
351 | clk_register_clkdev(clk, NULL, "a9100000.serial"); | 358 | clk_register_clkdev(clk, NULL, "a9100000.serial"); |
352 | 359 | ||
353 | clk = clk_register_mux(NULL, "uart4_clk", uartx_parents, | 360 | clk = clk_register_mux(NULL, "uart4_clk", uartx_parents, |
354 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 361 | ARRAY_SIZE(uartx_parents), |
362 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
355 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART4_PCLK_SHIFT, | 363 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART4_PCLK_SHIFT, |
356 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 364 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
357 | clk_register_clkdev(clk, NULL, "a9200000.serial"); | 365 | clk_register_clkdev(clk, NULL, "a9200000.serial"); |
358 | 366 | ||
359 | clk = clk_register_mux(NULL, "uart5_clk", uartx_parents, | 367 | clk = clk_register_mux(NULL, "uart5_clk", uartx_parents, |
360 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 368 | ARRAY_SIZE(uartx_parents), |
369 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
361 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART5_PCLK_SHIFT, | 370 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART5_PCLK_SHIFT, |
362 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 371 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
363 | clk_register_clkdev(clk, NULL, "60000000.serial"); | 372 | clk_register_clkdev(clk, NULL, "60000000.serial"); |
364 | 373 | ||
365 | clk = clk_register_mux(NULL, "uart6_clk", uartx_parents, | 374 | clk = clk_register_mux(NULL, "uart6_clk", uartx_parents, |
366 | ARRAY_SIZE(uartx_parents), CLK_SET_RATE_PARENT, | 375 | ARRAY_SIZE(uartx_parents), |
376 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
367 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART6_PCLK_SHIFT, | 377 | SPEAR320_EXT_CTRL_REG, SPEAR320_UART6_PCLK_SHIFT, |
368 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); | 378 | SPEAR320_UARTX_PCLK_MASK, 0, &_lock); |
369 | clk_register_clkdev(clk, NULL, "60100000.serial"); | 379 | clk_register_clkdev(clk, NULL, "60100000.serial"); |
@@ -427,7 +437,8 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
427 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); | 437 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); |
428 | 438 | ||
429 | clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, | 439 | clk = clk_register_mux(NULL, "uart0_mclk", uart0_parents, |
430 | ARRAY_SIZE(uart0_parents), CLK_SET_RATE_PARENT, | 440 | ARRAY_SIZE(uart0_parents), |
441 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
431 | PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0, | 442 | PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0, |
432 | &_lock); | 443 | &_lock); |
433 | clk_register_clkdev(clk, "uart0_mclk", NULL); | 444 | clk_register_clkdev(clk, "uart0_mclk", NULL); |
@@ -444,7 +455,8 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
444 | clk_register_clkdev(clk1, "firda_syn_gclk", NULL); | 455 | clk_register_clkdev(clk1, "firda_syn_gclk", NULL); |
445 | 456 | ||
446 | clk = clk_register_mux(NULL, "firda_mclk", firda_parents, | 457 | clk = clk_register_mux(NULL, "firda_mclk", firda_parents, |
447 | ARRAY_SIZE(firda_parents), CLK_SET_RATE_PARENT, | 458 | ARRAY_SIZE(firda_parents), |
459 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
448 | PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, | 460 | PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, |
449 | &_lock); | 461 | &_lock); |
450 | clk_register_clkdev(clk, "firda_mclk", NULL); | 462 | clk_register_clkdev(clk, "firda_mclk", NULL); |
@@ -458,14 +470,16 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
458 | clk_register_gpt("gpt0_syn_clk", "pll1_clk", 0, PRSC0_CLK_CFG, gpt_rtbl, | 470 | clk_register_gpt("gpt0_syn_clk", "pll1_clk", 0, PRSC0_CLK_CFG, gpt_rtbl, |
459 | ARRAY_SIZE(gpt_rtbl), &_lock); | 471 | ARRAY_SIZE(gpt_rtbl), &_lock); |
460 | clk = clk_register_mux(NULL, "gpt0_clk", gpt0_parents, | 472 | clk = clk_register_mux(NULL, "gpt0_clk", gpt0_parents, |
461 | ARRAY_SIZE(gpt0_parents), CLK_SET_RATE_PARENT, | 473 | ARRAY_SIZE(gpt0_parents), |
474 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
462 | PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 475 | PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
463 | clk_register_clkdev(clk, NULL, "gpt0"); | 476 | clk_register_clkdev(clk, NULL, "gpt0"); |
464 | 477 | ||
465 | clk_register_gpt("gpt1_syn_clk", "pll1_clk", 0, PRSC1_CLK_CFG, gpt_rtbl, | 478 | clk_register_gpt("gpt1_syn_clk", "pll1_clk", 0, PRSC1_CLK_CFG, gpt_rtbl, |
466 | ARRAY_SIZE(gpt_rtbl), &_lock); | 479 | ARRAY_SIZE(gpt_rtbl), &_lock); |
467 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt1_parents, | 480 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt1_parents, |
468 | ARRAY_SIZE(gpt1_parents), CLK_SET_RATE_PARENT, | 481 | ARRAY_SIZE(gpt1_parents), |
482 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
469 | PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 483 | PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
470 | clk_register_clkdev(clk, "gpt1_mclk", NULL); | 484 | clk_register_clkdev(clk, "gpt1_mclk", NULL); |
471 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", | 485 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", |
@@ -476,7 +490,8 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
476 | clk_register_gpt("gpt2_syn_clk", "pll1_clk", 0, PRSC2_CLK_CFG, gpt_rtbl, | 490 | clk_register_gpt("gpt2_syn_clk", "pll1_clk", 0, PRSC2_CLK_CFG, gpt_rtbl, |
477 | ARRAY_SIZE(gpt_rtbl), &_lock); | 491 | ARRAY_SIZE(gpt_rtbl), &_lock); |
478 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, | 492 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, |
479 | ARRAY_SIZE(gpt2_parents), CLK_SET_RATE_PARENT, | 493 | ARRAY_SIZE(gpt2_parents), |
494 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, | ||
480 | PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 495 | PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
481 | clk_register_clkdev(clk, "gpt2_mclk", NULL); | 496 | clk_register_clkdev(clk, "gpt2_mclk", NULL); |
482 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", | 497 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", |
@@ -498,9 +513,9 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
498 | clk_register_clkdev(clk1, "gen1_syn_gclk", NULL); | 513 | clk_register_clkdev(clk1, "gen1_syn_gclk", NULL); |
499 | 514 | ||
500 | clk = clk_register_mux(NULL, "gen2_3_par_clk", gen2_3_parents, | 515 | clk = clk_register_mux(NULL, "gen2_3_par_clk", gen2_3_parents, |
501 | ARRAY_SIZE(gen2_3_parents), 0, CORE_CLK_CFG, | 516 | ARRAY_SIZE(gen2_3_parents), CLK_SET_RATE_NO_REPARENT, |
502 | GEN_SYNTH2_3_CLK_SHIFT, GEN_SYNTH2_3_CLK_MASK, 0, | 517 | CORE_CLK_CFG, GEN_SYNTH2_3_CLK_SHIFT, |
503 | &_lock); | 518 | GEN_SYNTH2_3_CLK_MASK, 0, &_lock); |
504 | clk_register_clkdev(clk, "gen2_3_par_clk", NULL); | 519 | clk_register_clkdev(clk, "gen2_3_par_clk", NULL); |
505 | 520 | ||
506 | clk = clk_register_aux("gen2_syn_clk", "gen2_syn_gclk", | 521 | clk = clk_register_aux("gen2_syn_clk", "gen2_syn_gclk", |
@@ -540,8 +555,8 @@ void __init spear3xx_clk_init(void __iomem *misc_base, void __iomem *soc_config_ | |||
540 | clk_register_clkdev(clk, "ahbmult2_clk", NULL); | 555 | clk_register_clkdev(clk, "ahbmult2_clk", NULL); |
541 | 556 | ||
542 | clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, | 557 | clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, |
543 | ARRAY_SIZE(ddr_parents), 0, PLL_CLK_CFG, MCTR_CLK_SHIFT, | 558 | ARRAY_SIZE(ddr_parents), CLK_SET_RATE_NO_REPARENT, |
544 | MCTR_CLK_MASK, 0, &_lock); | 559 | PLL_CLK_CFG, MCTR_CLK_SHIFT, MCTR_CLK_MASK, 0, &_lock); |
545 | clk_register_clkdev(clk, "ddr_clk", NULL); | 560 | clk_register_clkdev(clk, "ddr_clk", NULL); |
546 | 561 | ||
547 | clk = clk_register_divider(NULL, "apb_clk", "ahb_clk", | 562 | clk = clk_register_divider(NULL, "apb_clk", "ahb_clk", |
diff --git a/drivers/clk/spear/spear6xx_clock.c b/drivers/clk/spear/spear6xx_clock.c index 9406f2426d64..4f649c9cb094 100644 --- a/drivers/clk/spear/spear6xx_clock.c +++ b/drivers/clk/spear/spear6xx_clock.c | |||
@@ -169,8 +169,9 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
169 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); | 169 | clk_register_clkdev(clk1, "uart_syn_gclk", NULL); |
170 | 170 | ||
171 | clk = clk_register_mux(NULL, "uart_mclk", uart_parents, | 171 | clk = clk_register_mux(NULL, "uart_mclk", uart_parents, |
172 | ARRAY_SIZE(uart_parents), 0, PERIP_CLK_CFG, | 172 | ARRAY_SIZE(uart_parents), CLK_SET_RATE_NO_REPARENT, |
173 | UART_CLK_SHIFT, UART_CLK_MASK, 0, &_lock); | 173 | PERIP_CLK_CFG, UART_CLK_SHIFT, UART_CLK_MASK, 0, |
174 | &_lock); | ||
174 | clk_register_clkdev(clk, "uart_mclk", NULL); | 175 | clk_register_clkdev(clk, "uart_mclk", NULL); |
175 | 176 | ||
176 | clk = clk_register_gate(NULL, "uart0", "uart_mclk", 0, PERIP1_CLK_ENB, | 177 | clk = clk_register_gate(NULL, "uart0", "uart_mclk", 0, PERIP1_CLK_ENB, |
@@ -188,8 +189,9 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
188 | clk_register_clkdev(clk1, "firda_syn_gclk", NULL); | 189 | clk_register_clkdev(clk1, "firda_syn_gclk", NULL); |
189 | 190 | ||
190 | clk = clk_register_mux(NULL, "firda_mclk", firda_parents, | 191 | clk = clk_register_mux(NULL, "firda_mclk", firda_parents, |
191 | ARRAY_SIZE(firda_parents), 0, PERIP_CLK_CFG, | 192 | ARRAY_SIZE(firda_parents), CLK_SET_RATE_NO_REPARENT, |
192 | FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, &_lock); | 193 | PERIP_CLK_CFG, FIRDA_CLK_SHIFT, FIRDA_CLK_MASK, 0, |
194 | &_lock); | ||
193 | clk_register_clkdev(clk, "firda_mclk", NULL); | 195 | clk_register_clkdev(clk, "firda_mclk", NULL); |
194 | 196 | ||
195 | clk = clk_register_gate(NULL, "firda_clk", "firda_mclk", 0, | 197 | clk = clk_register_gate(NULL, "firda_clk", "firda_mclk", 0, |
@@ -203,8 +205,9 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
203 | clk_register_clkdev(clk1, "clcd_syn_gclk", NULL); | 205 | clk_register_clkdev(clk1, "clcd_syn_gclk", NULL); |
204 | 206 | ||
205 | clk = clk_register_mux(NULL, "clcd_mclk", clcd_parents, | 207 | clk = clk_register_mux(NULL, "clcd_mclk", clcd_parents, |
206 | ARRAY_SIZE(clcd_parents), 0, PERIP_CLK_CFG, | 208 | ARRAY_SIZE(clcd_parents), CLK_SET_RATE_NO_REPARENT, |
207 | CLCD_CLK_SHIFT, CLCD_CLK_MASK, 0, &_lock); | 209 | PERIP_CLK_CFG, CLCD_CLK_SHIFT, CLCD_CLK_MASK, 0, |
210 | &_lock); | ||
208 | clk_register_clkdev(clk, "clcd_mclk", NULL); | 211 | clk_register_clkdev(clk, "clcd_mclk", NULL); |
209 | 212 | ||
210 | clk = clk_register_gate(NULL, "clcd_clk", "clcd_mclk", 0, | 213 | clk = clk_register_gate(NULL, "clcd_clk", "clcd_mclk", 0, |
@@ -217,13 +220,13 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
217 | clk_register_clkdev(clk, "gpt0_1_syn_clk", NULL); | 220 | clk_register_clkdev(clk, "gpt0_1_syn_clk", NULL); |
218 | 221 | ||
219 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt0_1_parents, | 222 | clk = clk_register_mux(NULL, "gpt0_mclk", gpt0_1_parents, |
220 | ARRAY_SIZE(gpt0_1_parents), 0, PERIP_CLK_CFG, | 223 | ARRAY_SIZE(gpt0_1_parents), CLK_SET_RATE_NO_REPARENT, |
221 | GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 224 | PERIP_CLK_CFG, GPT0_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
222 | clk_register_clkdev(clk, NULL, "gpt0"); | 225 | clk_register_clkdev(clk, NULL, "gpt0"); |
223 | 226 | ||
224 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt0_1_parents, | 227 | clk = clk_register_mux(NULL, "gpt1_mclk", gpt0_1_parents, |
225 | ARRAY_SIZE(gpt0_1_parents), 0, PERIP_CLK_CFG, | 228 | ARRAY_SIZE(gpt0_1_parents), CLK_SET_RATE_NO_REPARENT, |
226 | GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 229 | PERIP_CLK_CFG, GPT1_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
227 | clk_register_clkdev(clk, "gpt1_mclk", NULL); | 230 | clk_register_clkdev(clk, "gpt1_mclk", NULL); |
228 | 231 | ||
229 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, | 232 | clk = clk_register_gate(NULL, "gpt1_clk", "gpt1_mclk", 0, |
@@ -235,8 +238,8 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
235 | clk_register_clkdev(clk, "gpt2_syn_clk", NULL); | 238 | clk_register_clkdev(clk, "gpt2_syn_clk", NULL); |
236 | 239 | ||
237 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, | 240 | clk = clk_register_mux(NULL, "gpt2_mclk", gpt2_parents, |
238 | ARRAY_SIZE(gpt2_parents), 0, PERIP_CLK_CFG, | 241 | ARRAY_SIZE(gpt2_parents), CLK_SET_RATE_NO_REPARENT, |
239 | GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 242 | PERIP_CLK_CFG, GPT2_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
240 | clk_register_clkdev(clk, "gpt2_mclk", NULL); | 243 | clk_register_clkdev(clk, "gpt2_mclk", NULL); |
241 | 244 | ||
242 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, | 245 | clk = clk_register_gate(NULL, "gpt2_clk", "gpt2_mclk", 0, |
@@ -248,8 +251,8 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
248 | clk_register_clkdev(clk, "gpt3_syn_clk", NULL); | 251 | clk_register_clkdev(clk, "gpt3_syn_clk", NULL); |
249 | 252 | ||
250 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt3_parents, | 253 | clk = clk_register_mux(NULL, "gpt3_mclk", gpt3_parents, |
251 | ARRAY_SIZE(gpt3_parents), 0, PERIP_CLK_CFG, | 254 | ARRAY_SIZE(gpt3_parents), CLK_SET_RATE_NO_REPARENT, |
252 | GPT3_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); | 255 | PERIP_CLK_CFG, GPT3_CLK_SHIFT, GPT_CLK_MASK, 0, &_lock); |
253 | clk_register_clkdev(clk, "gpt3_mclk", NULL); | 256 | clk_register_clkdev(clk, "gpt3_mclk", NULL); |
254 | 257 | ||
255 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, | 258 | clk = clk_register_gate(NULL, "gpt3_clk", "gpt3_mclk", 0, |
@@ -277,8 +280,8 @@ void __init spear6xx_clk_init(void __iomem *misc_base) | |||
277 | clk_register_clkdev(clk, "ahbmult2_clk", NULL); | 280 | clk_register_clkdev(clk, "ahbmult2_clk", NULL); |
278 | 281 | ||
279 | clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, | 282 | clk = clk_register_mux(NULL, "ddr_clk", ddr_parents, |
280 | ARRAY_SIZE(ddr_parents), 0, PLL_CLK_CFG, MCTR_CLK_SHIFT, | 283 | ARRAY_SIZE(ddr_parents), CLK_SET_RATE_NO_REPARENT, |
281 | MCTR_CLK_MASK, 0, &_lock); | 284 | PLL_CLK_CFG, MCTR_CLK_SHIFT, MCTR_CLK_MASK, 0, &_lock); |
282 | clk_register_clkdev(clk, "ddr_clk", NULL); | 285 | clk_register_clkdev(clk, "ddr_clk", NULL); |
283 | 286 | ||
284 | clk = clk_register_divider(NULL, "apb_clk", "ahb_clk", | 287 | clk = clk_register_divider(NULL, "apb_clk", "ahb_clk", |
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c index 412912bbba53..34ee69f4d50c 100644 --- a/drivers/clk/sunxi/clk-sunxi.c +++ b/drivers/clk/sunxi/clk-sunxi.c | |||
@@ -25,12 +25,12 @@ | |||
25 | static DEFINE_SPINLOCK(clk_lock); | 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 | #define SUNXI_OSC24M_GATE 0 | 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 | struct clk *clk; | 35 | struct clk *clk; |
36 | struct clk_fixed_rate *fixed; | 36 | struct clk_fixed_rate *fixed; |
@@ -64,22 +64,23 @@ static void __init sunxi_osc_clk_setup(struct device_node *node) | |||
64 | &gate->hw, &clk_gate_ops, | 64 | &gate->hw, &clk_gate_ops, |
65 | CLK_IS_ROOT); | 65 | CLK_IS_ROOT); |
66 | 66 | ||
67 | if (clk) { | 67 | if (!IS_ERR(clk)) { |
68 | of_clk_add_provider(node, of_clk_src_simple_get, clk); | 68 | of_clk_add_provider(node, of_clk_src_simple_get, clk); |
69 | clk_register_clkdev(clk, clk_name, NULL); | 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 | * PLL1 rate is calculated as follows | 78 | * PLL1 rate is calculated as follows |
78 | * rate = (parent_rate * n * (k + 1) >> p) / (m + 1); | 79 | * rate = (parent_rate * n * (k + 1) >> p) / (m + 1); |
79 | * parent_rate is always 24Mhz | 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 | u8 *n, u8 *k, u8 *m, u8 *p) | 84 | u8 *n, u8 *k, u8 *m, u8 *p) |
84 | { | 85 | { |
85 | u8 div; | 86 | u8 div; |
@@ -124,15 +125,97 @@ static void sunxi_get_pll1_factors(u32 *freq, u32 parent_rate, | |||
124 | *n = div / 4; | 125 | *n = div / 4; |
125 | } | 126 | } |
126 | 127 | ||
128 | /** | ||
129 | * sun6i_a31_get_pll1_factors() - calculates n, k and m factors for PLL1 | ||
130 | * PLL1 rate is calculated as follows | ||
131 | * rate = parent_rate * (n + 1) * (k + 1) / (m + 1); | ||
132 | * parent_rate should always be 24MHz | ||
133 | */ | ||
134 | static void sun6i_a31_get_pll1_factors(u32 *freq, u32 parent_rate, | ||
135 | u8 *n, u8 *k, u8 *m, u8 *p) | ||
136 | { | ||
137 | /* | ||
138 | * We can operate only on MHz, this will make our life easier | ||
139 | * later. | ||
140 | */ | ||
141 | u32 freq_mhz = *freq / 1000000; | ||
142 | u32 parent_freq_mhz = parent_rate / 1000000; | ||
143 | |||
144 | /* | ||
145 | * Round down the frequency to the closest multiple of either | ||
146 | * 6 or 16 | ||
147 | */ | ||
148 | u32 round_freq_6 = round_down(freq_mhz, 6); | ||
149 | u32 round_freq_16 = round_down(freq_mhz, 16); | ||
150 | |||
151 | if (round_freq_6 > round_freq_16) | ||
152 | freq_mhz = round_freq_6; | ||
153 | else | ||
154 | freq_mhz = round_freq_16; | ||
155 | |||
156 | *freq = freq_mhz * 1000000; | ||
127 | 157 | ||
158 | /* | ||
159 | * If the factors pointer are null, we were just called to | ||
160 | * round down the frequency. | ||
161 | * Exit. | ||
162 | */ | ||
163 | if (n == NULL) | ||
164 | return; | ||
165 | |||
166 | /* If the frequency is a multiple of 32 MHz, k is always 3 */ | ||
167 | if (!(freq_mhz % 32)) | ||
168 | *k = 3; | ||
169 | /* If the frequency is a multiple of 9 MHz, k is always 2 */ | ||
170 | else if (!(freq_mhz % 9)) | ||
171 | *k = 2; | ||
172 | /* If the frequency is a multiple of 8 MHz, k is always 1 */ | ||
173 | else if (!(freq_mhz % 8)) | ||
174 | *k = 1; | ||
175 | /* Otherwise, we don't use the k factor */ | ||
176 | else | ||
177 | *k = 0; | ||
178 | |||
179 | /* | ||
180 | * If the frequency is a multiple of 2 but not a multiple of | ||
181 | * 3, m is 3. This is the first time we use 6 here, yet we | ||
182 | * will use it on several other places. | ||
183 | * We use this number because it's the lowest frequency we can | ||
184 | * generate (with n = 0, k = 0, m = 3), so every other frequency | ||
185 | * somehow relates to this frequency. | ||
186 | */ | ||
187 | if ((freq_mhz % 6) == 2 || (freq_mhz % 6) == 4) | ||
188 | *m = 2; | ||
189 | /* | ||
190 | * If the frequency is a multiple of 6MHz, but the factor is | ||
191 | * odd, m will be 3 | ||
192 | */ | ||
193 | else if ((freq_mhz / 6) & 1) | ||
194 | *m = 3; | ||
195 | /* Otherwise, we end up with m = 1 */ | ||
196 | else | ||
197 | *m = 1; | ||
198 | |||
199 | /* Calculate n thanks to the above factors we already got */ | ||
200 | *n = freq_mhz * (*m + 1) / ((*k + 1) * parent_freq_mhz) - 1; | ||
201 | |||
202 | /* | ||
203 | * If n end up being outbound, and that we can still decrease | ||
204 | * m, do it. | ||
205 | */ | ||
206 | if ((*n + 1) > 31 && (*m + 1) > 1) { | ||
207 | *n = (*n + 1) / 2 - 1; | ||
208 | *m = (*m + 1) / 2 - 1; | ||
209 | } | ||
210 | } | ||
128 | 211 | ||
129 | /** | 212 | /** |
130 | * sunxi_get_apb1_factors() - calculates m, p factors for APB1 | 213 | * sun4i_get_apb1_factors() - calculates m, p factors for APB1 |
131 | * APB1 rate is calculated as follows | 214 | * APB1 rate is calculated as follows |
132 | * rate = (parent_rate >> p) / (m + 1); | 215 | * rate = (parent_rate >> p) / (m + 1); |
133 | */ | 216 | */ |
134 | 217 | ||
135 | static void sunxi_get_apb1_factors(u32 *freq, u32 parent_rate, | 218 | static void sun4i_get_apb1_factors(u32 *freq, u32 parent_rate, |
136 | u8 *n, u8 *k, u8 *m, u8 *p) | 219 | u8 *n, u8 *k, u8 *m, u8 *p) |
137 | { | 220 | { |
138 | u8 calcm, calcp; | 221 | u8 calcm, calcp; |
@@ -178,7 +261,7 @@ struct factors_data { | |||
178 | void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p); | 261 | void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p); |
179 | }; | 262 | }; |
180 | 263 | ||
181 | static struct clk_factors_config pll1_config = { | 264 | static struct clk_factors_config sun4i_pll1_config = { |
182 | .nshift = 8, | 265 | .nshift = 8, |
183 | .nwidth = 5, | 266 | .nwidth = 5, |
184 | .kshift = 4, | 267 | .kshift = 4, |
@@ -189,21 +272,35 @@ static struct clk_factors_config pll1_config = { | |||
189 | .pwidth = 2, | 272 | .pwidth = 2, |
190 | }; | 273 | }; |
191 | 274 | ||
192 | static struct clk_factors_config apb1_config = { | 275 | static struct clk_factors_config sun6i_a31_pll1_config = { |
276 | .nshift = 8, | ||
277 | .nwidth = 5, | ||
278 | .kshift = 4, | ||
279 | .kwidth = 2, | ||
280 | .mshift = 0, | ||
281 | .mwidth = 2, | ||
282 | }; | ||
283 | |||
284 | static struct clk_factors_config sun4i_apb1_config = { | ||
193 | .mshift = 0, | 285 | .mshift = 0, |
194 | .mwidth = 5, | 286 | .mwidth = 5, |
195 | .pshift = 16, | 287 | .pshift = 16, |
196 | .pwidth = 2, | 288 | .pwidth = 2, |
197 | }; | 289 | }; |
198 | 290 | ||
199 | static const __initconst struct factors_data pll1_data = { | 291 | static const struct factors_data sun4i_pll1_data __initconst = { |
200 | .table = &pll1_config, | 292 | .table = &sun4i_pll1_config, |
201 | .getter = sunxi_get_pll1_factors, | 293 | .getter = sun4i_get_pll1_factors, |
202 | }; | 294 | }; |
203 | 295 | ||
204 | static const __initconst struct factors_data apb1_data = { | 296 | static const struct factors_data sun6i_a31_pll1_data __initconst = { |
205 | .table = &apb1_config, | 297 | .table = &sun6i_a31_pll1_config, |
206 | .getter = sunxi_get_apb1_factors, | 298 | .getter = sun6i_a31_get_pll1_factors, |
299 | }; | ||
300 | |||
301 | static const struct factors_data sun4i_apb1_data __initconst = { | ||
302 | .table = &sun4i_apb1_config, | ||
303 | .getter = sun4i_get_apb1_factors, | ||
207 | }; | 304 | }; |
208 | 305 | ||
209 | static void __init sunxi_factors_clk_setup(struct device_node *node, | 306 | static void __init sunxi_factors_clk_setup(struct device_node *node, |
@@ -221,7 +318,7 @@ static void __init sunxi_factors_clk_setup(struct device_node *node, | |||
221 | clk = clk_register_factors(NULL, clk_name, parent, 0, reg, | 318 | clk = clk_register_factors(NULL, clk_name, parent, 0, reg, |
222 | data->table, data->getter, &clk_lock); | 319 | data->table, data->getter, &clk_lock); |
223 | 320 | ||
224 | if (clk) { | 321 | if (!IS_ERR(clk)) { |
225 | of_clk_add_provider(node, of_clk_src_simple_get, clk); | 322 | of_clk_add_provider(node, of_clk_src_simple_get, clk); |
226 | clk_register_clkdev(clk, clk_name, NULL); | 323 | clk_register_clkdev(clk, clk_name, NULL); |
227 | } | 324 | } |
@@ -239,11 +336,15 @@ struct mux_data { | |||
239 | u8 shift; | 336 | u8 shift; |
240 | }; | 337 | }; |
241 | 338 | ||
242 | static const __initconst struct mux_data cpu_mux_data = { | 339 | static const struct mux_data sun4i_cpu_mux_data __initconst = { |
243 | .shift = 16, | 340 | .shift = 16, |
244 | }; | 341 | }; |
245 | 342 | ||
246 | static const __initconst struct mux_data apb1_mux_data = { | 343 | static const struct mux_data sun6i_a31_ahb1_mux_data __initconst = { |
344 | .shift = 12, | ||
345 | }; | ||
346 | |||
347 | static const struct mux_data sun4i_apb1_mux_data __initconst = { | ||
247 | .shift = 24, | 348 | .shift = 24, |
248 | }; | 349 | }; |
249 | 350 | ||
@@ -261,7 +362,8 @@ static void __init sunxi_mux_clk_setup(struct device_node *node, | |||
261 | while (i < 5 && (parents[i] = of_clk_get_parent_name(node, i)) != NULL) | 362 | while (i < 5 && (parents[i] = of_clk_get_parent_name(node, i)) != NULL) |
262 | i++; | 363 | i++; |
263 | 364 | ||
264 | clk = clk_register_mux(NULL, clk_name, parents, i, 0, reg, | 365 | clk = clk_register_mux(NULL, clk_name, parents, i, |
366 | CLK_SET_RATE_NO_REPARENT, reg, | ||
265 | data->shift, SUNXI_MUX_GATE_WIDTH, | 367 | data->shift, SUNXI_MUX_GATE_WIDTH, |
266 | 0, &clk_lock); | 368 | 0, &clk_lock); |
267 | 369 | ||
@@ -277,26 +379,34 @@ static void __init sunxi_mux_clk_setup(struct device_node *node, | |||
277 | * sunxi_divider_clk_setup() - Setup function for simple divider clocks | 379 | * sunxi_divider_clk_setup() - Setup function for simple divider clocks |
278 | */ | 380 | */ |
279 | 381 | ||
280 | #define SUNXI_DIVISOR_WIDTH 2 | ||
281 | |||
282 | struct div_data { | 382 | struct div_data { |
283 | u8 shift; | 383 | u8 shift; |
284 | u8 pow; | 384 | u8 pow; |
385 | u8 width; | ||
285 | }; | 386 | }; |
286 | 387 | ||
287 | static const __initconst struct div_data axi_data = { | 388 | static const struct div_data sun4i_axi_data __initconst = { |
288 | .shift = 0, | 389 | .shift = 0, |
289 | .pow = 0, | 390 | .pow = 0, |
391 | .width = 2, | ||
290 | }; | 392 | }; |
291 | 393 | ||
292 | static const __initconst struct div_data ahb_data = { | 394 | static const struct div_data sun4i_ahb_data __initconst = { |
293 | .shift = 4, | 395 | .shift = 4, |
294 | .pow = 1, | 396 | .pow = 1, |
397 | .width = 2, | ||
295 | }; | 398 | }; |
296 | 399 | ||
297 | static const __initconst struct div_data apb0_data = { | 400 | static const struct div_data sun4i_apb0_data __initconst = { |
298 | .shift = 8, | 401 | .shift = 8, |
299 | .pow = 1, | 402 | .pow = 1, |
403 | .width = 2, | ||
404 | }; | ||
405 | |||
406 | static const struct div_data sun6i_a31_apb2_div_data __initconst = { | ||
407 | .shift = 0, | ||
408 | .pow = 0, | ||
409 | .width = 4, | ||
300 | }; | 410 | }; |
301 | 411 | ||
302 | static void __init sunxi_divider_clk_setup(struct device_node *node, | 412 | static void __init sunxi_divider_clk_setup(struct device_node *node, |
@@ -312,7 +422,7 @@ static void __init sunxi_divider_clk_setup(struct device_node *node, | |||
312 | clk_parent = of_clk_get_parent_name(node, 0); | 422 | clk_parent = of_clk_get_parent_name(node, 0); |
313 | 423 | ||
314 | clk = clk_register_divider(NULL, clk_name, clk_parent, 0, | 424 | clk = clk_register_divider(NULL, clk_name, clk_parent, 0, |
315 | reg, data->shift, SUNXI_DIVISOR_WIDTH, | 425 | reg, data->shift, data->width, |
316 | data->pow ? CLK_DIVIDER_POWER_OF_TWO : 0, | 426 | data->pow ? CLK_DIVIDER_POWER_OF_TWO : 0, |
317 | &clk_lock); | 427 | &clk_lock); |
318 | if (clk) { | 428 | if (clk) { |
@@ -333,34 +443,70 @@ struct gates_data { | |||
333 | DECLARE_BITMAP(mask, SUNXI_GATES_MAX_SIZE); | 443 | DECLARE_BITMAP(mask, SUNXI_GATES_MAX_SIZE); |
334 | }; | 444 | }; |
335 | 445 | ||
336 | static const __initconst struct gates_data sun4i_axi_gates_data = { | 446 | static const struct gates_data sun4i_axi_gates_data __initconst = { |
337 | .mask = {1}, | 447 | .mask = {1}, |
338 | }; | 448 | }; |
339 | 449 | ||
340 | static const __initconst struct gates_data sun4i_ahb_gates_data = { | 450 | static const struct gates_data sun4i_ahb_gates_data __initconst = { |
341 | .mask = {0x7F77FFF, 0x14FB3F}, | 451 | .mask = {0x7F77FFF, 0x14FB3F}, |
342 | }; | 452 | }; |
343 | 453 | ||
344 | static const __initconst struct gates_data sun5i_a13_ahb_gates_data = { | 454 | static const struct gates_data sun5i_a10s_ahb_gates_data __initconst = { |
455 | .mask = {0x147667e7, 0x185915}, | ||
456 | }; | ||
457 | |||
458 | static const struct gates_data sun5i_a13_ahb_gates_data __initconst = { | ||
345 | .mask = {0x107067e7, 0x185111}, | 459 | .mask = {0x107067e7, 0x185111}, |
346 | }; | 460 | }; |
347 | 461 | ||
348 | static const __initconst struct gates_data sun4i_apb0_gates_data = { | 462 | static const struct gates_data sun6i_a31_ahb1_gates_data __initconst = { |
463 | .mask = {0xEDFE7F62, 0x794F931}, | ||
464 | }; | ||
465 | |||
466 | static const struct gates_data sun7i_a20_ahb_gates_data __initconst = { | ||
467 | .mask = { 0x12f77fff, 0x16ff3f }, | ||
468 | }; | ||
469 | |||
470 | static const struct gates_data sun4i_apb0_gates_data __initconst = { | ||
349 | .mask = {0x4EF}, | 471 | .mask = {0x4EF}, |
350 | }; | 472 | }; |
351 | 473 | ||
352 | static const __initconst struct gates_data sun5i_a13_apb0_gates_data = { | 474 | static const struct gates_data sun5i_a10s_apb0_gates_data __initconst = { |
475 | .mask = {0x469}, | ||
476 | }; | ||
477 | |||
478 | static const struct gates_data sun5i_a13_apb0_gates_data __initconst = { | ||
353 | .mask = {0x61}, | 479 | .mask = {0x61}, |
354 | }; | 480 | }; |
355 | 481 | ||
356 | static const __initconst struct gates_data sun4i_apb1_gates_data = { | 482 | static const struct gates_data sun7i_a20_apb0_gates_data __initconst = { |
483 | .mask = { 0x4ff }, | ||
484 | }; | ||
485 | |||
486 | static const struct gates_data sun4i_apb1_gates_data __initconst = { | ||
357 | .mask = {0xFF00F7}, | 487 | .mask = {0xFF00F7}, |
358 | }; | 488 | }; |
359 | 489 | ||
360 | static const __initconst struct gates_data sun5i_a13_apb1_gates_data = { | 490 | static const struct gates_data sun5i_a10s_apb1_gates_data __initconst = { |
491 | .mask = {0xf0007}, | ||
492 | }; | ||
493 | |||
494 | static const struct gates_data sun5i_a13_apb1_gates_data __initconst = { | ||
361 | .mask = {0xa0007}, | 495 | .mask = {0xa0007}, |
362 | }; | 496 | }; |
363 | 497 | ||
498 | static const struct gates_data sun6i_a31_apb1_gates_data __initconst = { | ||
499 | .mask = {0x3031}, | ||
500 | }; | ||
501 | |||
502 | static const struct gates_data sun6i_a31_apb2_gates_data __initconst = { | ||
503 | .mask = {0x3F000F}, | ||
504 | }; | ||
505 | |||
506 | static const struct gates_data sun7i_a20_apb1_gates_data __initconst = { | ||
507 | .mask = { 0xff80ff }, | ||
508 | }; | ||
509 | |||
364 | static void __init sunxi_gates_clk_setup(struct device_node *node, | 510 | static void __init sunxi_gates_clk_setup(struct device_node *node, |
365 | struct gates_data *data) | 511 | struct gates_data *data) |
366 | { | 512 | { |
@@ -410,43 +556,49 @@ static void __init sunxi_gates_clk_setup(struct device_node *node, | |||
410 | of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | 556 | of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); |
411 | } | 557 | } |
412 | 558 | ||
413 | /* Matches for of_clk_init */ | ||
414 | static const __initconst struct of_device_id clk_match[] = { | ||
415 | {.compatible = "allwinner,sun4i-osc-clk", .data = sunxi_osc_clk_setup,}, | ||
416 | {} | ||
417 | }; | ||
418 | |||
419 | /* Matches for factors clocks */ | 559 | /* Matches for factors clocks */ |
420 | static const __initconst struct of_device_id clk_factors_match[] = { | 560 | static const struct of_device_id clk_factors_match[] __initconst = { |
421 | {.compatible = "allwinner,sun4i-pll1-clk", .data = &pll1_data,}, | 561 | {.compatible = "allwinner,sun4i-pll1-clk", .data = &sun4i_pll1_data,}, |
422 | {.compatible = "allwinner,sun4i-apb1-clk", .data = &apb1_data,}, | 562 | {.compatible = "allwinner,sun6i-a31-pll1-clk", .data = &sun6i_a31_pll1_data,}, |
563 | {.compatible = "allwinner,sun4i-apb1-clk", .data = &sun4i_apb1_data,}, | ||
423 | {} | 564 | {} |
424 | }; | 565 | }; |
425 | 566 | ||
426 | /* Matches for divider clocks */ | 567 | /* Matches for divider clocks */ |
427 | static const __initconst struct of_device_id clk_div_match[] = { | 568 | static const struct of_device_id clk_div_match[] __initconst = { |
428 | {.compatible = "allwinner,sun4i-axi-clk", .data = &axi_data,}, | 569 | {.compatible = "allwinner,sun4i-axi-clk", .data = &sun4i_axi_data,}, |
429 | {.compatible = "allwinner,sun4i-ahb-clk", .data = &ahb_data,}, | 570 | {.compatible = "allwinner,sun4i-ahb-clk", .data = &sun4i_ahb_data,}, |
430 | {.compatible = "allwinner,sun4i-apb0-clk", .data = &apb0_data,}, | 571 | {.compatible = "allwinner,sun4i-apb0-clk", .data = &sun4i_apb0_data,}, |
572 | {.compatible = "allwinner,sun6i-a31-apb2-div-clk", .data = &sun6i_a31_apb2_div_data,}, | ||
431 | {} | 573 | {} |
432 | }; | 574 | }; |
433 | 575 | ||
434 | /* Matches for mux clocks */ | 576 | /* Matches for mux clocks */ |
435 | static const __initconst struct of_device_id clk_mux_match[] = { | 577 | static const struct of_device_id clk_mux_match[] __initconst = { |
436 | {.compatible = "allwinner,sun4i-cpu-clk", .data = &cpu_mux_data,}, | 578 | {.compatible = "allwinner,sun4i-cpu-clk", .data = &sun4i_cpu_mux_data,}, |
437 | {.compatible = "allwinner,sun4i-apb1-mux-clk", .data = &apb1_mux_data,}, | 579 | {.compatible = "allwinner,sun4i-apb1-mux-clk", .data = &sun4i_apb1_mux_data,}, |
580 | {.compatible = "allwinner,sun6i-a31-ahb1-mux-clk", .data = &sun6i_a31_ahb1_mux_data,}, | ||
438 | {} | 581 | {} |
439 | }; | 582 | }; |
440 | 583 | ||
441 | /* Matches for gate clocks */ | 584 | /* Matches for gate clocks */ |
442 | static const __initconst struct of_device_id clk_gates_match[] = { | 585 | static const struct of_device_id clk_gates_match[] __initconst = { |
443 | {.compatible = "allwinner,sun4i-axi-gates-clk", .data = &sun4i_axi_gates_data,}, | 586 | {.compatible = "allwinner,sun4i-axi-gates-clk", .data = &sun4i_axi_gates_data,}, |
444 | {.compatible = "allwinner,sun4i-ahb-gates-clk", .data = &sun4i_ahb_gates_data,}, | 587 | {.compatible = "allwinner,sun4i-ahb-gates-clk", .data = &sun4i_ahb_gates_data,}, |
588 | {.compatible = "allwinner,sun5i-a10s-ahb-gates-clk", .data = &sun5i_a10s_ahb_gates_data,}, | ||
445 | {.compatible = "allwinner,sun5i-a13-ahb-gates-clk", .data = &sun5i_a13_ahb_gates_data,}, | 589 | {.compatible = "allwinner,sun5i-a13-ahb-gates-clk", .data = &sun5i_a13_ahb_gates_data,}, |
590 | {.compatible = "allwinner,sun6i-a31-ahb1-gates-clk", .data = &sun6i_a31_ahb1_gates_data,}, | ||
591 | {.compatible = "allwinner,sun7i-a20-ahb-gates-clk", .data = &sun7i_a20_ahb_gates_data,}, | ||
446 | {.compatible = "allwinner,sun4i-apb0-gates-clk", .data = &sun4i_apb0_gates_data,}, | 592 | {.compatible = "allwinner,sun4i-apb0-gates-clk", .data = &sun4i_apb0_gates_data,}, |
593 | {.compatible = "allwinner,sun5i-a10s-apb0-gates-clk", .data = &sun5i_a10s_apb0_gates_data,}, | ||
447 | {.compatible = "allwinner,sun5i-a13-apb0-gates-clk", .data = &sun5i_a13_apb0_gates_data,}, | 594 | {.compatible = "allwinner,sun5i-a13-apb0-gates-clk", .data = &sun5i_a13_apb0_gates_data,}, |
595 | {.compatible = "allwinner,sun7i-a20-apb0-gates-clk", .data = &sun7i_a20_apb0_gates_data,}, | ||
448 | {.compatible = "allwinner,sun4i-apb1-gates-clk", .data = &sun4i_apb1_gates_data,}, | 596 | {.compatible = "allwinner,sun4i-apb1-gates-clk", .data = &sun4i_apb1_gates_data,}, |
597 | {.compatible = "allwinner,sun5i-a10s-apb1-gates-clk", .data = &sun5i_a10s_apb1_gates_data,}, | ||
449 | {.compatible = "allwinner,sun5i-a13-apb1-gates-clk", .data = &sun5i_a13_apb1_gates_data,}, | 598 | {.compatible = "allwinner,sun5i-a13-apb1-gates-clk", .data = &sun5i_a13_apb1_gates_data,}, |
599 | {.compatible = "allwinner,sun6i-a31-apb1-gates-clk", .data = &sun6i_a31_apb1_gates_data,}, | ||
600 | {.compatible = "allwinner,sun7i-a20-apb1-gates-clk", .data = &sun7i_a20_apb1_gates_data,}, | ||
601 | {.compatible = "allwinner,sun6i-a31-apb2-gates-clk", .data = &sun6i_a31_apb2_gates_data,}, | ||
450 | {} | 602 | {} |
451 | }; | 603 | }; |
452 | 604 | ||
@@ -467,8 +619,8 @@ static void __init of_sunxi_table_clock_setup(const struct of_device_id *clk_mat | |||
467 | 619 | ||
468 | void __init sunxi_init_clocks(void) | 620 | void __init sunxi_init_clocks(void) |
469 | { | 621 | { |
470 | /* Register all the simple sunxi clocks on DT */ | 622 | /* Register all the simple and basic clocks on DT */ |
471 | of_clk_init(clk_match); | 623 | of_clk_init(NULL); |
472 | 624 | ||
473 | /* Register factor clocks */ | 625 | /* Register factor clocks */ |
474 | of_sunxi_table_clock_setup(clk_factors_match, sunxi_factors_clk_setup); | 626 | of_sunxi_table_clock_setup(clk_factors_match, sunxi_factors_clk_setup); |
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index 806d80366c54..9467da7dee49 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
@@ -1566,7 +1566,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1566 | 1566 | ||
1567 | /* audio0 */ | 1567 | /* audio0 */ |
1568 | clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, | 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 | clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, | 1571 | clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, |
1571 | NULL); | 1572 | NULL); |
1572 | clks[audio0_mux] = clk; | 1573 | clks[audio0_mux] = clk; |
@@ -1578,7 +1579,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1578 | 1579 | ||
1579 | /* audio1 */ | 1580 | /* audio1 */ |
1580 | clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, | 1581 | clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, |
1581 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1582 | ARRAY_SIZE(mux_audio_sync_clk), |
1583 | CLK_SET_RATE_NO_REPARENT, | ||
1582 | clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, | 1584 | clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, |
1583 | NULL); | 1585 | NULL); |
1584 | clks[audio1_mux] = clk; | 1586 | clks[audio1_mux] = clk; |
@@ -1590,7 +1592,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1590 | 1592 | ||
1591 | /* audio2 */ | 1593 | /* audio2 */ |
1592 | clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, | 1594 | clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, |
1593 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1595 | ARRAY_SIZE(mux_audio_sync_clk), |
1596 | CLK_SET_RATE_NO_REPARENT, | ||
1594 | clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, | 1597 | clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, |
1595 | NULL); | 1598 | NULL); |
1596 | clks[audio2_mux] = clk; | 1599 | clks[audio2_mux] = clk; |
@@ -1602,7 +1605,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1602 | 1605 | ||
1603 | /* audio3 */ | 1606 | /* audio3 */ |
1604 | clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, | 1607 | clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, |
1605 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1608 | ARRAY_SIZE(mux_audio_sync_clk), |
1609 | CLK_SET_RATE_NO_REPARENT, | ||
1606 | clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, | 1610 | clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, |
1607 | NULL); | 1611 | NULL); |
1608 | clks[audio3_mux] = clk; | 1612 | clks[audio3_mux] = clk; |
@@ -1614,7 +1618,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1614 | 1618 | ||
1615 | /* audio4 */ | 1619 | /* audio4 */ |
1616 | clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, | 1620 | clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, |
1617 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1621 | ARRAY_SIZE(mux_audio_sync_clk), |
1622 | CLK_SET_RATE_NO_REPARENT, | ||
1618 | clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, | 1623 | clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, |
1619 | NULL); | 1624 | NULL); |
1620 | clks[audio4_mux] = clk; | 1625 | clks[audio4_mux] = clk; |
@@ -1626,7 +1631,8 @@ static void __init tegra114_audio_clk_init(void __iomem *clk_base) | |||
1626 | 1631 | ||
1627 | /* spdif */ | 1632 | /* spdif */ |
1628 | clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, | 1633 | clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, |
1629 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1634 | ARRAY_SIZE(mux_audio_sync_clk), |
1635 | CLK_SET_RATE_NO_REPARENT, | ||
1630 | clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, | 1636 | clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, |
1631 | NULL); | 1637 | NULL); |
1632 | clks[spdif_mux] = clk; | 1638 | clks[spdif_mux] = clk; |
@@ -1721,7 +1727,8 @@ static void __init tegra114_pmc_clk_init(void __iomem *pmc_base) | |||
1721 | 1727 | ||
1722 | /* clk_out_1 */ | 1728 | /* clk_out_1 */ |
1723 | clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, | 1729 | clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, |
1724 | ARRAY_SIZE(clk_out1_parents), 0, | 1730 | ARRAY_SIZE(clk_out1_parents), |
1731 | CLK_SET_RATE_NO_REPARENT, | ||
1725 | pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, | 1732 | pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, |
1726 | &clk_out_lock); | 1733 | &clk_out_lock); |
1727 | clks[clk_out_1_mux] = clk; | 1734 | clks[clk_out_1_mux] = clk; |
@@ -1733,7 +1740,8 @@ static void __init tegra114_pmc_clk_init(void __iomem *pmc_base) | |||
1733 | 1740 | ||
1734 | /* clk_out_2 */ | 1741 | /* clk_out_2 */ |
1735 | clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, | 1742 | clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, |
1736 | ARRAY_SIZE(clk_out2_parents), 0, | 1743 | ARRAY_SIZE(clk_out2_parents), |
1744 | CLK_SET_RATE_NO_REPARENT, | ||
1737 | pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, | 1745 | pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, |
1738 | &clk_out_lock); | 1746 | &clk_out_lock); |
1739 | clks[clk_out_2_mux] = clk; | 1747 | clks[clk_out_2_mux] = clk; |
@@ -1745,7 +1753,8 @@ static void __init tegra114_pmc_clk_init(void __iomem *pmc_base) | |||
1745 | 1753 | ||
1746 | /* clk_out_3 */ | 1754 | /* clk_out_3 */ |
1747 | clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, | 1755 | clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, |
1748 | ARRAY_SIZE(clk_out3_parents), 0, | 1756 | ARRAY_SIZE(clk_out3_parents), |
1757 | CLK_SET_RATE_NO_REPARENT, | ||
1749 | pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, | 1758 | pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, |
1750 | &clk_out_lock); | 1759 | &clk_out_lock); |
1751 | clks[clk_out_3_mux] = clk; | 1760 | clks[clk_out_3_mux] = clk; |
@@ -2063,7 +2072,8 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base) | |||
2063 | 2072 | ||
2064 | /* dsia */ | 2073 | /* dsia */ |
2065 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, | 2074 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, |
2066 | ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, | 2075 | ARRAY_SIZE(mux_plld_out0_plld2_out0), |
2076 | CLK_SET_RATE_NO_REPARENT, | ||
2067 | clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); | 2077 | clk_base + PLLD_BASE, 25, 1, 0, &pll_d_lock); |
2068 | clks[dsia_mux] = clk; | 2078 | clks[dsia_mux] = clk; |
2069 | clk = tegra_clk_register_periph_gate("dsia", "dsia_mux", 0, clk_base, | 2079 | clk = tegra_clk_register_periph_gate("dsia", "dsia_mux", 0, clk_base, |
@@ -2073,7 +2083,8 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base) | |||
2073 | 2083 | ||
2074 | /* dsib */ | 2084 | /* dsib */ |
2075 | clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, | 2085 | clk = clk_register_mux(NULL, "dsib_mux", mux_plld_out0_plld2_out0, |
2076 | ARRAY_SIZE(mux_plld_out0_plld2_out0), 0, | 2086 | ARRAY_SIZE(mux_plld_out0_plld2_out0), |
2087 | CLK_SET_RATE_NO_REPARENT, | ||
2077 | clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); | 2088 | clk_base + PLLD2_BASE, 25, 1, 0, &pll_d2_lock); |
2078 | clks[dsib_mux] = clk; | 2089 | clks[dsib_mux] = clk; |
2079 | clk = tegra_clk_register_periph_gate("dsib", "dsib_mux", 0, clk_base, | 2090 | clk = tegra_clk_register_periph_gate("dsib", "dsib_mux", 0, clk_base, |
@@ -2110,7 +2121,8 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base) | |||
2110 | 2121 | ||
2111 | /* emc */ | 2122 | /* emc */ |
2112 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, | 2123 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, |
2113 | ARRAY_SIZE(mux_pllmcp_clkm), 0, | 2124 | ARRAY_SIZE(mux_pllmcp_clkm), |
2125 | CLK_SET_RATE_NO_REPARENT, | ||
2114 | clk_base + CLK_SOURCE_EMC, | 2126 | clk_base + CLK_SOURCE_EMC, |
2115 | 29, 3, 0, NULL); | 2127 | 29, 3, 0, NULL); |
2116 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, | 2128 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, |
@@ -2194,7 +2206,7 @@ static const struct of_device_id pmc_match[] __initconst = { | |||
2194 | * dfll_soc/dfll_ref apparently must be kept enabled, otherwise I2C5 | 2206 | * dfll_soc/dfll_ref apparently must be kept enabled, otherwise I2C5 |
2195 | * breaks | 2207 | * breaks |
2196 | */ | 2208 | */ |
2197 | static __initdata struct tegra_clk_init_table init_table[] = { | 2209 | static struct tegra_clk_init_table init_table[] __initdata = { |
2198 | {uarta, pll_p, 408000000, 0}, | 2210 | {uarta, pll_p, 408000000, 0}, |
2199 | {uartb, pll_p, 408000000, 0}, | 2211 | {uartb, pll_p, 408000000, 0}, |
2200 | {uartc, pll_p, 408000000, 0}, | 2212 | {uartc, pll_p, 408000000, 0}, |
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index 759ca47be753..056f649d0d89 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c | |||
@@ -778,7 +778,8 @@ static void __init tegra20_audio_clk_init(void) | |||
778 | 778 | ||
779 | /* audio */ | 779 | /* audio */ |
780 | clk = clk_register_mux(NULL, "audio_mux", audio_parents, | 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 | clk_base + AUDIO_SYNC_CLK, 0, 3, 0, NULL); | 783 | clk_base + AUDIO_SYNC_CLK, 0, 3, 0, NULL); |
783 | clk = clk_register_gate(NULL, "audio", "audio_mux", 0, | 784 | clk = clk_register_gate(NULL, "audio", "audio_mux", 0, |
784 | clk_base + AUDIO_SYNC_CLK, 4, | 785 | clk_base + AUDIO_SYNC_CLK, 4, |
@@ -941,7 +942,8 @@ static void __init tegra20_periph_clk_init(void) | |||
941 | 942 | ||
942 | /* emc */ | 943 | /* emc */ |
943 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, | 944 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, |
944 | ARRAY_SIZE(mux_pllmcp_clkm), 0, | 945 | ARRAY_SIZE(mux_pllmcp_clkm), |
946 | CLK_SET_RATE_NO_REPARENT, | ||
945 | clk_base + CLK_SOURCE_EMC, | 947 | clk_base + CLK_SOURCE_EMC, |
946 | 30, 2, 0, NULL); | 948 | 30, 2, 0, NULL); |
947 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, | 949 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, |
@@ -1223,7 +1225,7 @@ static struct tegra_cpu_car_ops tegra20_cpu_car_ops = { | |||
1223 | #endif | 1225 | #endif |
1224 | }; | 1226 | }; |
1225 | 1227 | ||
1226 | static __initdata struct tegra_clk_init_table init_table[] = { | 1228 | static struct tegra_clk_init_table init_table[] __initdata = { |
1227 | {pll_p, clk_max, 216000000, 1}, | 1229 | {pll_p, clk_max, 216000000, 1}, |
1228 | {pll_p_out1, clk_max, 28800000, 1}, | 1230 | {pll_p_out1, clk_max, 28800000, 1}, |
1229 | {pll_p_out2, clk_max, 48000000, 1}, | 1231 | {pll_p_out2, clk_max, 48000000, 1}, |
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index e2c6ca0431d6..dbe7c8003c5c 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c | |||
@@ -971,7 +971,7 @@ static void __init tegra30_pll_init(void) | |||
971 | /* PLLU */ | 971 | /* PLLU */ |
972 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, | 972 | clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0, |
973 | 0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | | 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 | pll_u_freq_table, | 975 | pll_u_freq_table, |
976 | NULL); | 976 | NULL); |
977 | clk_register_clkdev(clk, "pll_u", NULL); | 977 | clk_register_clkdev(clk, "pll_u", NULL); |
@@ -1026,7 +1026,8 @@ static void __init tegra30_pll_init(void) | |||
1026 | 1026 | ||
1027 | /* PLLE */ | 1027 | /* PLLE */ |
1028 | clk = clk_register_mux(NULL, "pll_e_mux", pll_e_parents, | 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 | clk_base + PLLE_AUX, 2, 1, 0, NULL); | 1031 | clk_base + PLLE_AUX, 2, 1, 0, NULL); |
1031 | clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, | 1032 | clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base, |
1032 | CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params, | 1033 | CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params, |
@@ -1086,7 +1087,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1086 | 1087 | ||
1087 | /* audio0 */ | 1088 | /* audio0 */ |
1088 | clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, | 1089 | clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk, |
1089 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1090 | ARRAY_SIZE(mux_audio_sync_clk), |
1091 | CLK_SET_RATE_NO_REPARENT, | ||
1090 | clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, NULL); | 1092 | clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, NULL); |
1091 | clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, | 1093 | clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0, |
1092 | clk_base + AUDIO_SYNC_CLK_I2S0, 4, | 1094 | clk_base + AUDIO_SYNC_CLK_I2S0, 4, |
@@ -1096,7 +1098,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1096 | 1098 | ||
1097 | /* audio1 */ | 1099 | /* audio1 */ |
1098 | clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, | 1100 | clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk, |
1099 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1101 | ARRAY_SIZE(mux_audio_sync_clk), |
1102 | CLK_SET_RATE_NO_REPARENT, | ||
1100 | clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, NULL); | 1103 | clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, NULL); |
1101 | clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, | 1104 | clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0, |
1102 | clk_base + AUDIO_SYNC_CLK_I2S1, 4, | 1105 | clk_base + AUDIO_SYNC_CLK_I2S1, 4, |
@@ -1106,7 +1109,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1106 | 1109 | ||
1107 | /* audio2 */ | 1110 | /* audio2 */ |
1108 | clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, | 1111 | clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk, |
1109 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1112 | ARRAY_SIZE(mux_audio_sync_clk), |
1113 | CLK_SET_RATE_NO_REPARENT, | ||
1110 | clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, NULL); | 1114 | clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, NULL); |
1111 | clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, | 1115 | clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0, |
1112 | clk_base + AUDIO_SYNC_CLK_I2S2, 4, | 1116 | clk_base + AUDIO_SYNC_CLK_I2S2, 4, |
@@ -1116,7 +1120,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1116 | 1120 | ||
1117 | /* audio3 */ | 1121 | /* audio3 */ |
1118 | clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, | 1122 | clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk, |
1119 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1123 | ARRAY_SIZE(mux_audio_sync_clk), |
1124 | CLK_SET_RATE_NO_REPARENT, | ||
1120 | clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, NULL); | 1125 | clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, NULL); |
1121 | clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, | 1126 | clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0, |
1122 | clk_base + AUDIO_SYNC_CLK_I2S3, 4, | 1127 | clk_base + AUDIO_SYNC_CLK_I2S3, 4, |
@@ -1126,7 +1131,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1126 | 1131 | ||
1127 | /* audio4 */ | 1132 | /* audio4 */ |
1128 | clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, | 1133 | clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk, |
1129 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1134 | ARRAY_SIZE(mux_audio_sync_clk), |
1135 | CLK_SET_RATE_NO_REPARENT, | ||
1130 | clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, NULL); | 1136 | clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, NULL); |
1131 | clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, | 1137 | clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0, |
1132 | clk_base + AUDIO_SYNC_CLK_I2S4, 4, | 1138 | clk_base + AUDIO_SYNC_CLK_I2S4, 4, |
@@ -1136,7 +1142,8 @@ static void __init tegra30_audio_clk_init(void) | |||
1136 | 1142 | ||
1137 | /* spdif */ | 1143 | /* spdif */ |
1138 | clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, | 1144 | clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk, |
1139 | ARRAY_SIZE(mux_audio_sync_clk), 0, | 1145 | ARRAY_SIZE(mux_audio_sync_clk), |
1146 | CLK_SET_RATE_NO_REPARENT, | ||
1140 | clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, NULL); | 1147 | clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, NULL); |
1141 | clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, | 1148 | clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0, |
1142 | clk_base + AUDIO_SYNC_CLK_SPDIF, 4, | 1149 | clk_base + AUDIO_SYNC_CLK_SPDIF, 4, |
@@ -1229,7 +1236,8 @@ static void __init tegra30_pmc_clk_init(void) | |||
1229 | 1236 | ||
1230 | /* clk_out_1 */ | 1237 | /* clk_out_1 */ |
1231 | clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, | 1238 | clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents, |
1232 | ARRAY_SIZE(clk_out1_parents), 0, | 1239 | ARRAY_SIZE(clk_out1_parents), |
1240 | CLK_SET_RATE_NO_REPARENT, | ||
1233 | pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, | 1241 | pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0, |
1234 | &clk_out_lock); | 1242 | &clk_out_lock); |
1235 | clks[clk_out_1_mux] = clk; | 1243 | clks[clk_out_1_mux] = clk; |
@@ -1241,7 +1249,8 @@ static void __init tegra30_pmc_clk_init(void) | |||
1241 | 1249 | ||
1242 | /* clk_out_2 */ | 1250 | /* clk_out_2 */ |
1243 | clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, | 1251 | clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents, |
1244 | ARRAY_SIZE(clk_out2_parents), 0, | 1252 | ARRAY_SIZE(clk_out2_parents), |
1253 | CLK_SET_RATE_NO_REPARENT, | ||
1245 | pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, | 1254 | pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0, |
1246 | &clk_out_lock); | 1255 | &clk_out_lock); |
1247 | clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0, | 1256 | clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0, |
@@ -1252,7 +1261,8 @@ static void __init tegra30_pmc_clk_init(void) | |||
1252 | 1261 | ||
1253 | /* clk_out_3 */ | 1262 | /* clk_out_3 */ |
1254 | clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, | 1263 | clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents, |
1255 | ARRAY_SIZE(clk_out3_parents), 0, | 1264 | ARRAY_SIZE(clk_out3_parents), |
1265 | CLK_SET_RATE_NO_REPARENT, | ||
1256 | pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, | 1266 | pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0, |
1257 | &clk_out_lock); | 1267 | &clk_out_lock); |
1258 | clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0, | 1268 | clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0, |
@@ -1679,7 +1689,8 @@ static void __init tegra30_periph_clk_init(void) | |||
1679 | 1689 | ||
1680 | /* emc */ | 1690 | /* emc */ |
1681 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, | 1691 | clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, |
1682 | ARRAY_SIZE(mux_pllmcp_clkm), 0, | 1692 | ARRAY_SIZE(mux_pllmcp_clkm), |
1693 | CLK_SET_RATE_NO_REPARENT, | ||
1683 | clk_base + CLK_SOURCE_EMC, | 1694 | clk_base + CLK_SOURCE_EMC, |
1684 | 30, 2, 0, NULL); | 1695 | 30, 2, 0, NULL); |
1685 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, | 1696 | clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0, |
@@ -1901,7 +1912,7 @@ static struct tegra_cpu_car_ops tegra30_cpu_car_ops = { | |||
1901 | #endif | 1912 | #endif |
1902 | }; | 1913 | }; |
1903 | 1914 | ||
1904 | static __initdata struct tegra_clk_init_table init_table[] = { | 1915 | static struct tegra_clk_init_table init_table[] __initdata = { |
1905 | {uarta, pll_p, 408000000, 0}, | 1916 | {uarta, pll_p, 408000000, 0}, |
1906 | {uartb, pll_p, 408000000, 0}, | 1917 | {uartb, pll_p, 408000000, 0}, |
1907 | {uartc, pll_p, 408000000, 0}, | 1918 | {uartc, pll_p, 408000000, 0}, |
diff --git a/drivers/clk/versatile/clk-vexpress.c b/drivers/clk/versatile/clk-vexpress.c index a4a728d05092..2d5e1b4820e0 100644 --- a/drivers/clk/versatile/clk-vexpress.c +++ b/drivers/clk/versatile/clk-vexpress.c | |||
@@ -37,8 +37,8 @@ static void __init vexpress_sp810_init(void __iomem *base) | |||
37 | snprintf(name, ARRAY_SIZE(name), "timerclken%d", i); | 37 | snprintf(name, ARRAY_SIZE(name), "timerclken%d", i); |
38 | 38 | ||
39 | vexpress_sp810_timerclken[i] = clk_register_mux(NULL, name, | 39 | vexpress_sp810_timerclken[i] = clk_register_mux(NULL, name, |
40 | parents, 2, 0, base + SCCTRL, | 40 | parents, 2, CLK_SET_RATE_NO_REPARENT, |
41 | SCCTRL_TIMERENnSEL_SHIFT(i), 1, | 41 | base + SCCTRL, SCCTRL_TIMERENnSEL_SHIFT(i), 1, |
42 | 0, &vexpress_sp810_lock); | 42 | 0, &vexpress_sp810_lock); |
43 | 43 | ||
44 | if (WARN_ON(IS_ERR(vexpress_sp810_timerclken[i]))) | 44 | if (WARN_ON(IS_ERR(vexpress_sp810_timerclken[i]))) |
diff --git a/drivers/clk/zynq/clkc.c b/drivers/clk/zynq/clkc.c index 089d3e30e221..cc40fe64f2dc 100644 --- a/drivers/clk/zynq/clkc.c +++ b/drivers/clk/zynq/clkc.c | |||
@@ -125,8 +125,9 @@ static void __init zynq_clk_register_fclk(enum zynq_clk fclk, | |||
125 | div0_name = kasprintf(GFP_KERNEL, "%s_div0", clk_name); | 125 | div0_name = kasprintf(GFP_KERNEL, "%s_div0", clk_name); |
126 | div1_name = kasprintf(GFP_KERNEL, "%s_div1", clk_name); | 126 | div1_name = kasprintf(GFP_KERNEL, "%s_div1", clk_name); |
127 | 127 | ||
128 | clk = clk_register_mux(NULL, mux_name, parents, 4, 0, | 128 | clk = clk_register_mux(NULL, mux_name, parents, 4, |
129 | fclk_ctrl_reg, 4, 2, 0, fclk_lock); | 129 | CLK_SET_RATE_NO_REPARENT, fclk_ctrl_reg, 4, 2, 0, |
130 | fclk_lock); | ||
130 | 131 | ||
131 | clk = clk_register_divider(NULL, div0_name, mux_name, | 132 | clk = clk_register_divider(NULL, div0_name, mux_name, |
132 | 0, fclk_ctrl_reg, 8, 6, CLK_DIVIDER_ONE_BASED | | 133 | 0, fclk_ctrl_reg, 8, 6, CLK_DIVIDER_ONE_BASED | |
@@ -168,8 +169,8 @@ static void __init zynq_clk_register_periph_clk(enum zynq_clk clk0, | |||
168 | mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name0); | 169 | mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name0); |
169 | div_name = kasprintf(GFP_KERNEL, "%s_div", clk_name0); | 170 | div_name = kasprintf(GFP_KERNEL, "%s_div", clk_name0); |
170 | 171 | ||
171 | clk = clk_register_mux(NULL, mux_name, parents, 4, 0, | 172 | clk = clk_register_mux(NULL, mux_name, parents, 4, |
172 | clk_ctrl, 4, 2, 0, lock); | 173 | CLK_SET_RATE_NO_REPARENT, clk_ctrl, 4, 2, 0, lock); |
173 | 174 | ||
174 | clk = clk_register_divider(NULL, div_name, mux_name, 0, clk_ctrl, 8, 6, | 175 | clk = clk_register_divider(NULL, div_name, mux_name, 0, clk_ctrl, 8, 6, |
175 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, lock); | 176 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, lock); |
@@ -236,25 +237,26 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
236 | clk = clk_register_zynq_pll("armpll_int", "ps_clk", SLCR_ARMPLL_CTRL, | 237 | clk = clk_register_zynq_pll("armpll_int", "ps_clk", SLCR_ARMPLL_CTRL, |
237 | SLCR_PLL_STATUS, 0, &armpll_lock); | 238 | SLCR_PLL_STATUS, 0, &armpll_lock); |
238 | clks[armpll] = clk_register_mux(NULL, clk_output_name[armpll], | 239 | clks[armpll] = clk_register_mux(NULL, clk_output_name[armpll], |
239 | armpll_parents, 2, 0, SLCR_ARMPLL_CTRL, 4, 1, 0, | 240 | armpll_parents, 2, CLK_SET_RATE_NO_REPARENT, |
240 | &armpll_lock); | 241 | SLCR_ARMPLL_CTRL, 4, 1, 0, &armpll_lock); |
241 | 242 | ||
242 | clk = clk_register_zynq_pll("ddrpll_int", "ps_clk", SLCR_DDRPLL_CTRL, | 243 | clk = clk_register_zynq_pll("ddrpll_int", "ps_clk", SLCR_DDRPLL_CTRL, |
243 | SLCR_PLL_STATUS, 1, &ddrpll_lock); | 244 | SLCR_PLL_STATUS, 1, &ddrpll_lock); |
244 | clks[ddrpll] = clk_register_mux(NULL, clk_output_name[ddrpll], | 245 | clks[ddrpll] = clk_register_mux(NULL, clk_output_name[ddrpll], |
245 | ddrpll_parents, 2, 0, SLCR_DDRPLL_CTRL, 4, 1, 0, | 246 | ddrpll_parents, 2, CLK_SET_RATE_NO_REPARENT, |
246 | &ddrpll_lock); | 247 | SLCR_DDRPLL_CTRL, 4, 1, 0, &ddrpll_lock); |
247 | 248 | ||
248 | clk = clk_register_zynq_pll("iopll_int", "ps_clk", SLCR_IOPLL_CTRL, | 249 | clk = clk_register_zynq_pll("iopll_int", "ps_clk", SLCR_IOPLL_CTRL, |
249 | SLCR_PLL_STATUS, 2, &iopll_lock); | 250 | SLCR_PLL_STATUS, 2, &iopll_lock); |
250 | clks[iopll] = clk_register_mux(NULL, clk_output_name[iopll], | 251 | clks[iopll] = clk_register_mux(NULL, clk_output_name[iopll], |
251 | iopll_parents, 2, 0, SLCR_IOPLL_CTRL, 4, 1, 0, | 252 | iopll_parents, 2, CLK_SET_RATE_NO_REPARENT, |
252 | &iopll_lock); | 253 | SLCR_IOPLL_CTRL, 4, 1, 0, &iopll_lock); |
253 | 254 | ||
254 | /* CPU clocks */ | 255 | /* CPU clocks */ |
255 | tmp = readl(SLCR_621_TRUE) & 1; | 256 | tmp = readl(SLCR_621_TRUE) & 1; |
256 | clk = clk_register_mux(NULL, "cpu_mux", cpu_parents, 4, 0, | 257 | clk = clk_register_mux(NULL, "cpu_mux", cpu_parents, 4, |
257 | SLCR_ARM_CLK_CTRL, 4, 2, 0, &armclk_lock); | 258 | CLK_SET_RATE_NO_REPARENT, SLCR_ARM_CLK_CTRL, 4, 2, 0, |
259 | &armclk_lock); | ||
258 | clk = clk_register_divider(NULL, "cpu_div", "cpu_mux", 0, | 260 | clk = clk_register_divider(NULL, "cpu_div", "cpu_mux", 0, |
259 | SLCR_ARM_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | | 261 | SLCR_ARM_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | |
260 | CLK_DIVIDER_ALLOW_ZERO, &armclk_lock); | 262 | CLK_DIVIDER_ALLOW_ZERO, &armclk_lock); |
@@ -293,8 +295,9 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
293 | swdt_ext_clk_mux_parents[i + 1] = dummy_nm; | 295 | swdt_ext_clk_mux_parents[i + 1] = dummy_nm; |
294 | } | 296 | } |
295 | clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt], | 297 | clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt], |
296 | swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT, | 298 | swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT | |
297 | SLCR_SWDT_CLK_SEL, 0, 1, 0, &swdtclk_lock); | 299 | CLK_SET_RATE_NO_REPARENT, SLCR_SWDT_CLK_SEL, 0, 1, 0, |
300 | &swdtclk_lock); | ||
298 | 301 | ||
299 | /* DDR clocks */ | 302 | /* DDR clocks */ |
300 | clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0, | 303 | clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0, |
@@ -356,8 +359,9 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
356 | gem0_mux_parents[i + 1] = of_clk_get_parent_name(np, | 359 | gem0_mux_parents[i + 1] = of_clk_get_parent_name(np, |
357 | idx); | 360 | idx); |
358 | } | 361 | } |
359 | clk = clk_register_mux(NULL, "gem0_mux", periph_parents, 4, 0, | 362 | clk = clk_register_mux(NULL, "gem0_mux", periph_parents, 4, |
360 | SLCR_GEM0_CLK_CTRL, 4, 2, 0, &gem0clk_lock); | 363 | CLK_SET_RATE_NO_REPARENT, SLCR_GEM0_CLK_CTRL, 4, 2, 0, |
364 | &gem0clk_lock); | ||
361 | clk = clk_register_divider(NULL, "gem0_div0", "gem0_mux", 0, | 365 | clk = clk_register_divider(NULL, "gem0_div0", "gem0_mux", 0, |
362 | SLCR_GEM0_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | | 366 | SLCR_GEM0_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | |
363 | CLK_DIVIDER_ALLOW_ZERO, &gem0clk_lock); | 367 | CLK_DIVIDER_ALLOW_ZERO, &gem0clk_lock); |
@@ -366,7 +370,8 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
366 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, | 370 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, |
367 | &gem0clk_lock); | 371 | &gem0clk_lock); |
368 | clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2, | 372 | clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2, |
369 | CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 6, 1, 0, | 373 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, |
374 | SLCR_GEM0_CLK_CTRL, 6, 1, 0, | ||
370 | &gem0clk_lock); | 375 | &gem0clk_lock); |
371 | clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0], | 376 | clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0], |
372 | "gem0_emio_mux", CLK_SET_RATE_PARENT, | 377 | "gem0_emio_mux", CLK_SET_RATE_PARENT, |
@@ -379,8 +384,9 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
379 | gem1_mux_parents[i + 1] = of_clk_get_parent_name(np, | 384 | gem1_mux_parents[i + 1] = of_clk_get_parent_name(np, |
380 | idx); | 385 | idx); |
381 | } | 386 | } |
382 | clk = clk_register_mux(NULL, "gem1_mux", periph_parents, 4, 0, | 387 | clk = clk_register_mux(NULL, "gem1_mux", periph_parents, 4, |
383 | SLCR_GEM1_CLK_CTRL, 4, 2, 0, &gem1clk_lock); | 388 | CLK_SET_RATE_NO_REPARENT, SLCR_GEM1_CLK_CTRL, 4, 2, 0, |
389 | &gem1clk_lock); | ||
384 | clk = clk_register_divider(NULL, "gem1_div0", "gem1_mux", 0, | 390 | clk = clk_register_divider(NULL, "gem1_div0", "gem1_mux", 0, |
385 | SLCR_GEM1_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | | 391 | SLCR_GEM1_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | |
386 | CLK_DIVIDER_ALLOW_ZERO, &gem1clk_lock); | 392 | CLK_DIVIDER_ALLOW_ZERO, &gem1clk_lock); |
@@ -389,7 +395,8 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
389 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, | 395 | CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, |
390 | &gem1clk_lock); | 396 | &gem1clk_lock); |
391 | clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2, | 397 | clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2, |
392 | CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 6, 1, 0, | 398 | CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, |
399 | SLCR_GEM1_CLK_CTRL, 6, 1, 0, | ||
393 | &gem1clk_lock); | 400 | &gem1clk_lock); |
394 | clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1], | 401 | clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1], |
395 | "gem1_emio_mux", CLK_SET_RATE_PARENT, | 402 | "gem1_emio_mux", CLK_SET_RATE_PARENT, |
@@ -409,8 +416,9 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
409 | can_mio_mux_parents[i] = dummy_nm; | 416 | can_mio_mux_parents[i] = dummy_nm; |
410 | } | 417 | } |
411 | kfree(clk_name); | 418 | kfree(clk_name); |
412 | clk = clk_register_mux(NULL, "can_mux", periph_parents, 4, 0, | 419 | clk = clk_register_mux(NULL, "can_mux", periph_parents, 4, |
413 | SLCR_CAN_CLK_CTRL, 4, 2, 0, &canclk_lock); | 420 | CLK_SET_RATE_NO_REPARENT, SLCR_CAN_CLK_CTRL, 4, 2, 0, |
421 | &canclk_lock); | ||
414 | clk = clk_register_divider(NULL, "can_div0", "can_mux", 0, | 422 | clk = clk_register_divider(NULL, "can_div0", "can_mux", 0, |
415 | SLCR_CAN_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | | 423 | SLCR_CAN_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | |
416 | CLK_DIVIDER_ALLOW_ZERO, &canclk_lock); | 424 | CLK_DIVIDER_ALLOW_ZERO, &canclk_lock); |
@@ -425,17 +433,21 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
425 | CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 1, 0, | 433 | CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 1, 0, |
426 | &canclk_lock); | 434 | &canclk_lock); |
427 | clk = clk_register_mux(NULL, "can0_mio_mux", | 435 | clk = clk_register_mux(NULL, "can0_mio_mux", |
428 | can_mio_mux_parents, 54, CLK_SET_RATE_PARENT, | 436 | can_mio_mux_parents, 54, CLK_SET_RATE_PARENT | |
429 | SLCR_CAN_MIOCLK_CTRL, 0, 6, 0, &canmioclk_lock); | 437 | CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 0, 6, 0, |
438 | &canmioclk_lock); | ||
430 | clk = clk_register_mux(NULL, "can1_mio_mux", | 439 | clk = clk_register_mux(NULL, "can1_mio_mux", |
431 | can_mio_mux_parents, 54, CLK_SET_RATE_PARENT, | 440 | can_mio_mux_parents, 54, CLK_SET_RATE_PARENT | |
432 | SLCR_CAN_MIOCLK_CTRL, 16, 6, 0, &canmioclk_lock); | 441 | CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 16, 6, |
442 | 0, &canmioclk_lock); | ||
433 | clks[can0] = clk_register_mux(NULL, clk_output_name[can0], | 443 | clks[can0] = clk_register_mux(NULL, clk_output_name[can0], |
434 | can0_mio_mux2_parents, 2, CLK_SET_RATE_PARENT, | 444 | can0_mio_mux2_parents, 2, CLK_SET_RATE_PARENT | |
435 | SLCR_CAN_MIOCLK_CTRL, 6, 1, 0, &canmioclk_lock); | 445 | CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 6, 1, 0, |
446 | &canmioclk_lock); | ||
436 | clks[can1] = clk_register_mux(NULL, clk_output_name[can1], | 447 | clks[can1] = clk_register_mux(NULL, clk_output_name[can1], |
437 | can1_mio_mux2_parents, 2, CLK_SET_RATE_PARENT, | 448 | can1_mio_mux2_parents, 2, CLK_SET_RATE_PARENT | |
438 | SLCR_CAN_MIOCLK_CTRL, 22, 1, 0, &canmioclk_lock); | 449 | CLK_SET_RATE_NO_REPARENT, SLCR_CAN_MIOCLK_CTRL, 22, 1, |
450 | 0, &canmioclk_lock); | ||
439 | 451 | ||
440 | for (i = 0; i < ARRAY_SIZE(dbgtrc_emio_input_names); i++) { | 452 | for (i = 0; i < ARRAY_SIZE(dbgtrc_emio_input_names); i++) { |
441 | int idx = of_property_match_string(np, "clock-names", | 453 | int idx = of_property_match_string(np, "clock-names", |
@@ -444,13 +456,15 @@ static void __init zynq_clk_setup(struct device_node *np) | |||
444 | dbg_emio_mux_parents[i + 1] = of_clk_get_parent_name(np, | 456 | dbg_emio_mux_parents[i + 1] = of_clk_get_parent_name(np, |
445 | idx); | 457 | idx); |
446 | } | 458 | } |
447 | clk = clk_register_mux(NULL, "dbg_mux", periph_parents, 4, 0, | 459 | clk = clk_register_mux(NULL, "dbg_mux", periph_parents, 4, |
448 | SLCR_DBG_CLK_CTRL, 4, 2, 0, &dbgclk_lock); | 460 | CLK_SET_RATE_NO_REPARENT, SLCR_DBG_CLK_CTRL, 4, 2, 0, |
461 | &dbgclk_lock); | ||
449 | clk = clk_register_divider(NULL, "dbg_div", "dbg_mux", 0, | 462 | clk = clk_register_divider(NULL, "dbg_div", "dbg_mux", 0, |
450 | SLCR_DBG_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | | 463 | SLCR_DBG_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED | |
451 | CLK_DIVIDER_ALLOW_ZERO, &dbgclk_lock); | 464 | CLK_DIVIDER_ALLOW_ZERO, &dbgclk_lock); |
452 | clk = clk_register_mux(NULL, "dbg_emio_mux", dbg_emio_mux_parents, 2, 0, | 465 | clk = clk_register_mux(NULL, "dbg_emio_mux", dbg_emio_mux_parents, 2, |
453 | SLCR_DBG_CLK_CTRL, 6, 1, 0, &dbgclk_lock); | 466 | CLK_SET_RATE_NO_REPARENT, SLCR_DBG_CLK_CTRL, 6, 1, 0, |
467 | &dbgclk_lock); | ||
454 | clks[dbg_trc] = clk_register_gate(NULL, clk_output_name[dbg_trc], | 468 | clks[dbg_trc] = clk_register_gate(NULL, clk_output_name[dbg_trc], |
455 | "dbg_emio_mux", CLK_SET_RATE_PARENT, SLCR_DBG_CLK_CTRL, | 469 | "dbg_emio_mux", CLK_SET_RATE_PARENT, SLCR_DBG_CLK_CTRL, |
456 | 0, 0, &dbgclk_lock); | 470 | 0, 0, &dbgclk_lock); |
diff --git a/drivers/clk/zynq/pll.c b/drivers/clk/zynq/pll.c index 47e307c25a7b..3226f54fa595 100644 --- a/drivers/clk/zynq/pll.c +++ b/drivers/clk/zynq/pll.c | |||
@@ -50,6 +50,9 @@ struct zynq_pll { | |||
50 | #define PLLCTRL_RESET_MASK 1 | 50 | #define PLLCTRL_RESET_MASK 1 |
51 | #define PLLCTRL_RESET_SHIFT 0 | 51 | #define PLLCTRL_RESET_SHIFT 0 |
52 | 52 | ||
53 | #define PLL_FBDIV_MIN 13 | ||
54 | #define PLL_FBDIV_MAX 66 | ||
55 | |||
53 | /** | 56 | /** |
54 | * zynq_pll_round_rate() - Round a clock frequency | 57 | * zynq_pll_round_rate() - Round a clock frequency |
55 | * @hw: Handle between common and hardware-specific interfaces | 58 | * @hw: Handle between common and hardware-specific interfaces |
@@ -63,10 +66,10 @@ static long zynq_pll_round_rate(struct clk_hw *hw, unsigned long rate, | |||
63 | u32 fbdiv; | 66 | u32 fbdiv; |
64 | 67 | ||
65 | fbdiv = DIV_ROUND_CLOSEST(rate, *prate); | 68 | fbdiv = DIV_ROUND_CLOSEST(rate, *prate); |
66 | if (fbdiv < 13) | 69 | if (fbdiv < PLL_FBDIV_MIN) |
67 | fbdiv = 13; | 70 | fbdiv = PLL_FBDIV_MIN; |
68 | else if (fbdiv > 66) | 71 | else if (fbdiv > PLL_FBDIV_MAX) |
69 | fbdiv = 66; | 72 | fbdiv = PLL_FBDIV_MAX; |
70 | 73 | ||
71 | return *prate * fbdiv; | 74 | return *prate * fbdiv; |
72 | } | 75 | } |
@@ -182,7 +185,13 @@ static const struct clk_ops zynq_pll_ops = { | |||
182 | 185 | ||
183 | /** | 186 | /** |
184 | * clk_register_zynq_pll() - Register PLL with the clock framework | 187 | * clk_register_zynq_pll() - Register PLL with the clock framework |
185 | * @np Pointer to the DT device node | 188 | * @name PLL name |
189 | * @parent Parent clock name | ||
190 | * @pll_ctrl Pointer to PLL control register | ||
191 | * @pll_status Pointer to PLL status register | ||
192 | * @lock_index Bit index to this PLL's lock status bit in @pll_status | ||
193 | * @lock Register lock | ||
194 | * Returns handle to the registered clock. | ||
186 | */ | 195 | */ |
187 | struct clk *clk_register_zynq_pll(const char *name, const char *parent, | 196 | struct clk *clk_register_zynq_pll(const char *name, const char *parent, |
188 | void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index, | 197 | void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index, |
diff --git a/drivers/clocksource/samsung_pwm_timer.c b/drivers/clocksource/samsung_pwm_timer.c index ac60f8b8a5f7..ab29476ee5f9 100644 --- a/drivers/clocksource/samsung_pwm_timer.c +++ b/drivers/clocksource/samsung_pwm_timer.c | |||
@@ -368,10 +368,6 @@ static void __init samsung_clocksource_init(void) | |||
368 | 368 | ||
369 | static void __init samsung_timer_resources(void) | 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 | clk_prepare_enable(pwm.timerclk); | 371 | clk_prepare_enable(pwm.timerclk); |
376 | 372 | ||
377 | pwm.tcnt_max = (1UL << pwm.variant.bits) - 1; | 373 | pwm.tcnt_max = (1UL << pwm.variant.bits) - 1; |
@@ -416,6 +412,10 @@ void __init samsung_pwm_clocksource_init(void __iomem *base, | |||
416 | memcpy(&pwm.variant, variant, sizeof(pwm.variant)); | 412 | memcpy(&pwm.variant, variant, sizeof(pwm.variant)); |
417 | memcpy(pwm.irq, irqs, SAMSUNG_PWM_NUM * sizeof(*irqs)); | 413 | memcpy(pwm.irq, irqs, SAMSUNG_PWM_NUM * sizeof(*irqs)); |
418 | 414 | ||
415 | pwm.timerclk = clk_get(NULL, "timers"); | ||
416 | if (IS_ERR(pwm.timerclk)) | ||
417 | panic("failed to get timers clock for timer"); | ||
418 | |||
419 | _samsung_pwm_clocksource_init(); | 419 | _samsung_pwm_clocksource_init(); |
420 | } | 420 | } |
421 | 421 | ||
@@ -447,6 +447,10 @@ static void __init samsung_pwm_alloc(struct device_node *np, | |||
447 | return; | 447 | return; |
448 | } | 448 | } |
449 | 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"); | ||
453 | |||
450 | _samsung_pwm_clocksource_init(); | 454 | _samsung_pwm_clocksource_init(); |
451 | } | 455 | } |
452 | 456 | ||
diff --git a/include/dt-bindings/clock/samsung,s3c64xx-clock.h b/include/dt-bindings/clock/samsung,s3c64xx-clock.h new file mode 100644 index 000000000000..ad95c7f50090 --- /dev/null +++ b/include/dt-bindings/clock/samsung,s3c64xx-clock.h | |||
@@ -0,0 +1,178 @@ | |||
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 */ | ||
diff --git a/include/linux/clk-private.h b/include/linux/clk-private.h index dd7adff76e81..8138c94409f3 100644 --- a/include/linux/clk-private.h +++ b/include/linux/clk-private.h | |||
@@ -33,8 +33,11 @@ struct clk { | |||
33 | const char **parent_names; | 33 | const char **parent_names; |
34 | struct clk **parents; | 34 | struct clk **parents; |
35 | u8 num_parents; | 35 | u8 num_parents; |
36 | u8 new_parent_index; | ||
36 | unsigned long rate; | 37 | unsigned long rate; |
37 | unsigned long new_rate; | 38 | unsigned long new_rate; |
39 | struct clk *new_parent; | ||
40 | struct clk *new_child; | ||
38 | unsigned long flags; | 41 | unsigned long flags; |
39 | unsigned int enable_count; | 42 | unsigned int enable_count; |
40 | unsigned int prepare_count; | 43 | unsigned int prepare_count; |
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 1ec14a732176..73bdb69f0c08 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define __LINUX_CLK_PROVIDER_H | 12 | #define __LINUX_CLK_PROVIDER_H |
13 | 13 | ||
14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/io.h> | ||
15 | 16 | ||
16 | #ifdef CONFIG_COMMON_CLK | 17 | #ifdef CONFIG_COMMON_CLK |
17 | 18 | ||
@@ -27,6 +28,7 @@ | |||
27 | #define CLK_IS_ROOT BIT(4) /* root clk, has no parent */ | 28 | #define CLK_IS_ROOT BIT(4) /* root clk, has no parent */ |
28 | #define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */ | 29 | #define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */ |
29 | #define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */ | 30 | #define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */ |
31 | #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ | ||
30 | 32 | ||
31 | struct clk_hw; | 33 | struct clk_hw; |
32 | 34 | ||
@@ -79,6 +81,10 @@ struct clk_hw; | |||
79 | * @round_rate: Given a target rate as input, returns the closest rate actually | 81 | * @round_rate: Given a target rate as input, returns the closest rate actually |
80 | * supported by the clock. | 82 | * supported by the clock. |
81 | * | 83 | * |
84 | * @determine_rate: Given a target rate as input, returns the closest rate | ||
85 | * actually supported by the clock, and optionally the parent clock | ||
86 | * that should be used to provide the clock rate. | ||
87 | * | ||
82 | * @get_parent: Queries the hardware to determine the parent of a clock. The | 88 | * @get_parent: Queries the hardware to determine the parent of a clock. The |
83 | * return value is a u8 which specifies the index corresponding to | 89 | * return value is a u8 which specifies the index corresponding to |
84 | * the parent clock. This index can be applied to either the | 90 | * the parent clock. This index can be applied to either the |
@@ -126,6 +132,9 @@ struct clk_ops { | |||
126 | unsigned long parent_rate); | 132 | unsigned long parent_rate); |
127 | long (*round_rate)(struct clk_hw *hw, unsigned long, | 133 | long (*round_rate)(struct clk_hw *hw, unsigned long, |
128 | unsigned long *); | 134 | unsigned long *); |
135 | long (*determine_rate)(struct clk_hw *hw, unsigned long rate, | ||
136 | unsigned long *best_parent_rate, | ||
137 | struct clk **best_parent_clk); | ||
129 | int (*set_parent)(struct clk_hw *hw, u8 index); | 138 | int (*set_parent)(struct clk_hw *hw, u8 index); |
130 | u8 (*get_parent)(struct clk_hw *hw); | 139 | u8 (*get_parent)(struct clk_hw *hw); |
131 | int (*set_rate)(struct clk_hw *hw, unsigned long, | 140 | int (*set_rate)(struct clk_hw *hw, unsigned long, |
@@ -327,8 +336,10 @@ struct clk_mux { | |||
327 | #define CLK_MUX_INDEX_ONE BIT(0) | 336 | #define CLK_MUX_INDEX_ONE BIT(0) |
328 | #define CLK_MUX_INDEX_BIT BIT(1) | 337 | #define CLK_MUX_INDEX_BIT BIT(1) |
329 | #define CLK_MUX_HIWORD_MASK BIT(2) | 338 | #define CLK_MUX_HIWORD_MASK BIT(2) |
339 | #define CLK_MUX_READ_ONLY BIT(3) /* mux setting cannot be changed */ | ||
330 | 340 | ||
331 | extern const struct clk_ops clk_mux_ops; | 341 | extern const struct clk_ops clk_mux_ops; |
342 | extern const struct clk_ops clk_mux_ro_ops; | ||
332 | 343 | ||
333 | struct clk *clk_register_mux(struct device *dev, const char *name, | 344 | struct clk *clk_register_mux(struct device *dev, const char *name, |
334 | const char **parent_names, u8 num_parents, unsigned long flags, | 345 | const char **parent_names, u8 num_parents, unsigned long flags, |
@@ -418,6 +429,7 @@ const char *__clk_get_name(struct clk *clk); | |||
418 | struct clk_hw *__clk_get_hw(struct clk *clk); | 429 | struct clk_hw *__clk_get_hw(struct clk *clk); |
419 | u8 __clk_get_num_parents(struct clk *clk); | 430 | u8 __clk_get_num_parents(struct clk *clk); |
420 | struct clk *__clk_get_parent(struct clk *clk); | 431 | struct clk *__clk_get_parent(struct clk *clk); |
432 | struct clk *clk_get_parent_by_index(struct clk *clk, u8 index); | ||
421 | unsigned int __clk_get_enable_count(struct clk *clk); | 433 | unsigned int __clk_get_enable_count(struct clk *clk); |
422 | unsigned int __clk_get_prepare_count(struct clk *clk); | 434 | unsigned int __clk_get_prepare_count(struct clk *clk); |
423 | unsigned long __clk_get_rate(struct clk *clk); | 435 | unsigned long __clk_get_rate(struct clk *clk); |
@@ -425,6 +437,9 @@ unsigned long __clk_get_flags(struct clk *clk); | |||
425 | bool __clk_is_prepared(struct clk *clk); | 437 | bool __clk_is_prepared(struct clk *clk); |
426 | bool __clk_is_enabled(struct clk *clk); | 438 | bool __clk_is_enabled(struct clk *clk); |
427 | struct clk *__clk_lookup(const char *name); | 439 | struct clk *__clk_lookup(const char *name); |
440 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, | ||
441 | unsigned long *best_parent_rate, | ||
442 | struct clk **best_parent_p); | ||
428 | 443 | ||
429 | /* | 444 | /* |
430 | * FIXME clock api without lock protection | 445 | * FIXME clock api without lock protection |
@@ -490,5 +505,21 @@ static inline const char *of_clk_get_parent_name(struct device_node *np, | |||
490 | #define of_clk_init(matches) \ | 505 | #define of_clk_init(matches) \ |
491 | { while (0); } | 506 | { while (0); } |
492 | #endif /* CONFIG_OF */ | 507 | #endif /* CONFIG_OF */ |
508 | |||
509 | /* | ||
510 | * wrap access to peripherals in accessor routines | ||
511 | * for improved portability across platforms | ||
512 | */ | ||
513 | |||
514 | static inline u32 clk_readl(u32 __iomem *reg) | ||
515 | { | ||
516 | return readl(reg); | ||
517 | } | ||
518 | |||
519 | static inline void clk_writel(u32 val, u32 __iomem *reg) | ||
520 | { | ||
521 | writel(val, reg); | ||
522 | } | ||
523 | |||
493 | #endif /* CONFIG_COMMON_CLK */ | 524 | #endif /* CONFIG_COMMON_CLK */ |
494 | #endif /* CLK_PROVIDER_H */ | 525 | #endif /* CLK_PROVIDER_H */ |