diff options
author | Jens Axboe <axboe@fb.com> | 2015-01-02 17:03:42 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-01-02 17:03:42 -0500 |
commit | 5d7bf4d8f664468223846abcfc683f4694014074 (patch) | |
tree | 942496e8b6b6753502bcdbc513f0547c80af3d30 | |
parent | 35b489d32fcc37e8735f41aa794b24cf9d1e74f5 (diff) | |
parent | b7392d2247cfe6771f95d256374f1a8e6a6f48d6 (diff) |
Merge tag 'v3.19-rc2' into for-3.20/core
Linux 3.19-rc2
278 files changed, 7904 insertions, 4322 deletions
diff --git a/.gitignore b/.gitignore index e213b27f3921..ce57b79670a5 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -96,3 +96,6 @@ x509.genkey | |||
96 | 96 | ||
97 | # Kconfig presets | 97 | # Kconfig presets |
98 | all.config | 98 | all.config |
99 | |||
100 | # Kdevelop4 | ||
101 | *.kdev4 | ||
diff --git a/Documentation/clk.txt b/Documentation/clk.txt index 1fee72f4d331..4ff84623d5e1 100644 --- a/Documentation/clk.txt +++ b/Documentation/clk.txt | |||
@@ -74,7 +74,7 @@ the operations defined in clk.h: | |||
74 | long (*determine_rate)(struct clk_hw *hw, | 74 | long (*determine_rate)(struct clk_hw *hw, |
75 | unsigned long rate, | 75 | unsigned long rate, |
76 | unsigned long *best_parent_rate, | 76 | unsigned long *best_parent_rate, |
77 | struct clk **best_parent_clk); | 77 | struct clk_hw **best_parent_clk); |
78 | int (*set_parent)(struct clk_hw *hw, u8 index); | 78 | int (*set_parent)(struct clk_hw *hw, u8 index); |
79 | u8 (*get_parent)(struct clk_hw *hw); | 79 | u8 (*get_parent)(struct clk_hw *hw); |
80 | int (*set_rate)(struct clk_hw *hw, | 80 | int (*set_rate)(struct clk_hw *hw, |
diff --git a/Documentation/devicetree/bindings/clock/exynos4415-clock.txt b/Documentation/devicetree/bindings/clock/exynos4415-clock.txt new file mode 100644 index 000000000000..847d98bae8cf --- /dev/null +++ b/Documentation/devicetree/bindings/clock/exynos4415-clock.txt | |||
@@ -0,0 +1,38 @@ | |||
1 | * Samsung Exynos4415 Clock Controller | ||
2 | |||
3 | The Exynos4415 clock controller generates and supplies clock to various | ||
4 | consumer devices within the Exynos4415 SoC. | ||
5 | |||
6 | Required properties: | ||
7 | |||
8 | - compatible: should be one of the following: | ||
9 | - "samsung,exynos4415-cmu" - for the main system clocks controller | ||
10 | (CMU_LEFTBUS, CMU_RIGHTBUS, CMU_TOP, CMU_CPU clock domains). | ||
11 | - "samsung,exynos4415-cmu-dmc" - for the Exynos4415 SoC DRAM Memory | ||
12 | Controller (DMC) domain clock controller. | ||
13 | |||
14 | - reg: physical base address of the controller and length of memory mapped | ||
15 | region. | ||
16 | |||
17 | - #clock-cells: should be 1. | ||
18 | |||
19 | Each clock is assigned an identifier and client nodes can use this identifier | ||
20 | to specify the clock which they consume. | ||
21 | |||
22 | All available clocks are defined as preprocessor macros in | ||
23 | dt-bindings/clock/exynos4415.h header and can be used in device | ||
24 | tree sources. | ||
25 | |||
26 | Example 1: An example of a clock controller node is listed below. | ||
27 | |||
28 | cmu: clock-controller@10030000 { | ||
29 | compatible = "samsung,exynos4415-cmu"; | ||
30 | reg = <0x10030000 0x18000>; | ||
31 | #clock-cells = <1>; | ||
32 | }; | ||
33 | |||
34 | cmu-dmc: clock-controller@105C0000 { | ||
35 | compatible = "samsung,exynos4415-cmu-dmc"; | ||
36 | reg = <0x105C0000 0x3000>; | ||
37 | #clock-cells = <1>; | ||
38 | }; | ||
diff --git a/Documentation/devicetree/bindings/clock/exynos7-clock.txt b/Documentation/devicetree/bindings/clock/exynos7-clock.txt new file mode 100644 index 000000000000..6d3d5f80c1c3 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/exynos7-clock.txt | |||
@@ -0,0 +1,93 @@ | |||
1 | * Samsung Exynos7 Clock Controller | ||
2 | |||
3 | Exynos7 clock controller has various blocks which are instantiated | ||
4 | independently from the device-tree. These clock controllers | ||
5 | generate and supply clocks to various hardware blocks within | ||
6 | the SoC. | ||
7 | |||
8 | Each clock is assigned an identifier and client nodes can use | ||
9 | this identifier to specify the clock which they consume. All | ||
10 | available clocks are defined as preprocessor macros in | ||
11 | dt-bindings/clock/exynos7-clk.h header and can be used in | ||
12 | device tree sources. | ||
13 | |||
14 | External clocks: | ||
15 | |||
16 | There are several clocks that are generated outside the SoC. It | ||
17 | is expected that they are defined using standard clock bindings | ||
18 | with following clock-output-names: | ||
19 | |||
20 | - "fin_pll" - PLL input clock from XXTI | ||
21 | |||
22 | Required Properties for Clock Controller: | ||
23 | |||
24 | - compatible: clock controllers will use one of the following | ||
25 | compatible strings to indicate the clock controller | ||
26 | functionality. | ||
27 | |||
28 | - "samsung,exynos7-clock-topc" | ||
29 | - "samsung,exynos7-clock-top0" | ||
30 | - "samsung,exynos7-clock-top1" | ||
31 | - "samsung,exynos7-clock-ccore" | ||
32 | - "samsung,exynos7-clock-peric0" | ||
33 | - "samsung,exynos7-clock-peric1" | ||
34 | - "samsung,exynos7-clock-peris" | ||
35 | - "samsung,exynos7-clock-fsys0" | ||
36 | - "samsung,exynos7-clock-fsys1" | ||
37 | |||
38 | - reg: physical base address of the controller and the length of | ||
39 | memory mapped region. | ||
40 | |||
41 | - #clock-cells: should be 1. | ||
42 | |||
43 | - clocks: list of clock identifiers which are fed as the input to | ||
44 | the given clock controller. Please refer the next section to | ||
45 | find the input clocks for a given controller. | ||
46 | |||
47 | - clock-names: list of names of clocks which are fed as the input | ||
48 | to the given clock controller. | ||
49 | |||
50 | Input clocks for top0 clock controller: | ||
51 | - fin_pll | ||
52 | - dout_sclk_bus0_pll | ||
53 | - dout_sclk_bus1_pll | ||
54 | - dout_sclk_cc_pll | ||
55 | - dout_sclk_mfc_pll | ||
56 | |||
57 | Input clocks for top1 clock controller: | ||
58 | - fin_pll | ||
59 | - dout_sclk_bus0_pll | ||
60 | - dout_sclk_bus1_pll | ||
61 | - dout_sclk_cc_pll | ||
62 | - dout_sclk_mfc_pll | ||
63 | |||
64 | Input clocks for ccore clock controller: | ||
65 | - fin_pll | ||
66 | - dout_aclk_ccore_133 | ||
67 | |||
68 | Input clocks for peric0 clock controller: | ||
69 | - fin_pll | ||
70 | - dout_aclk_peric0_66 | ||
71 | - sclk_uart0 | ||
72 | |||
73 | Input clocks for peric1 clock controller: | ||
74 | - fin_pll | ||
75 | - dout_aclk_peric1_66 | ||
76 | - sclk_uart1 | ||
77 | - sclk_uart2 | ||
78 | - sclk_uart3 | ||
79 | |||
80 | Input clocks for peris clock controller: | ||
81 | - fin_pll | ||
82 | - dout_aclk_peris_66 | ||
83 | |||
84 | Input clocks for fsys0 clock controller: | ||
85 | - fin_pll | ||
86 | - dout_aclk_fsys0_200 | ||
87 | - dout_sclk_mmc2 | ||
88 | |||
89 | Input clocks for fsys1 clock controller: | ||
90 | - fin_pll | ||
91 | - dout_aclk_fsys1_200 | ||
92 | - dout_sclk_mmc0 | ||
93 | - dout_sclk_mmc1 | ||
diff --git a/Documentation/devicetree/bindings/clock/marvell,mmp2.txt b/Documentation/devicetree/bindings/clock/marvell,mmp2.txt new file mode 100644 index 000000000000..af376a01f2b7 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/marvell,mmp2.txt | |||
@@ -0,0 +1,21 @@ | |||
1 | * Marvell MMP2 Clock Controller | ||
2 | |||
3 | The MMP2 clock subsystem generates and supplies clock to various | ||
4 | controllers within the MMP2 SoC. | ||
5 | |||
6 | Required Properties: | ||
7 | |||
8 | - compatible: should be one of the following. | ||
9 | - "marvell,mmp2-clock" - controller compatible with MMP2 SoC. | ||
10 | |||
11 | - reg: physical base address of the clock subsystem and length of memory mapped | ||
12 | region. There are 3 places in SOC has clock control logic: | ||
13 | "mpmu", "apmu", "apbc". So three reg spaces need to be defined. | ||
14 | |||
15 | - #clock-cells: should be 1. | ||
16 | - #reset-cells: should be 1. | ||
17 | |||
18 | Each clock is assigned an identifier and client nodes use this identifier | ||
19 | to specify the clock which they consume. | ||
20 | |||
21 | All these identifier could be found in <dt-bindings/clock/marvell-mmp2.h>. | ||
diff --git a/Documentation/devicetree/bindings/clock/marvell,pxa168.txt b/Documentation/devicetree/bindings/clock/marvell,pxa168.txt new file mode 100644 index 000000000000..c62eb1d173a6 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/marvell,pxa168.txt | |||
@@ -0,0 +1,21 @@ | |||
1 | * Marvell PXA168 Clock Controller | ||
2 | |||
3 | The PXA168 clock subsystem generates and supplies clock to various | ||
4 | controllers within the PXA168 SoC. | ||
5 | |||
6 | Required Properties: | ||
7 | |||
8 | - compatible: should be one of the following. | ||
9 | - "marvell,pxa168-clock" - controller compatible with PXA168 SoC. | ||
10 | |||
11 | - reg: physical base address of the clock subsystem and length of memory mapped | ||
12 | region. There are 3 places in SOC has clock control logic: | ||
13 | "mpmu", "apmu", "apbc". So three reg spaces need to be defined. | ||
14 | |||
15 | - #clock-cells: should be 1. | ||
16 | - #reset-cells: should be 1. | ||
17 | |||
18 | Each clock is assigned an identifier and client nodes use this identifier | ||
19 | to specify the clock which they consume. | ||
20 | |||
21 | All these identifier could be found in <dt-bindings/clock/marvell,pxa168.h>. | ||
diff --git a/Documentation/devicetree/bindings/clock/marvell,pxa910.txt b/Documentation/devicetree/bindings/clock/marvell,pxa910.txt new file mode 100644 index 000000000000..d9f41f3c03a0 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/marvell,pxa910.txt | |||
@@ -0,0 +1,21 @@ | |||
1 | * Marvell PXA910 Clock Controller | ||
2 | |||
3 | The PXA910 clock subsystem generates and supplies clock to various | ||
4 | controllers within the PXA910 SoC. | ||
5 | |||
6 | Required Properties: | ||
7 | |||
8 | - compatible: should be one of the following. | ||
9 | - "marvell,pxa910-clock" - controller compatible with PXA910 SoC. | ||
10 | |||
11 | - reg: physical base address of the clock subsystem and length of memory mapped | ||
12 | region. There are 4 places in SOC has clock control logic: | ||
13 | "mpmu", "apmu", "apbc", "apbcp". So four reg spaces need to be defined. | ||
14 | |||
15 | - #clock-cells: should be 1. | ||
16 | - #reset-cells: should be 1. | ||
17 | |||
18 | Each clock is assigned an identifier and client nodes use this identifier | ||
19 | to specify the clock which they consume. | ||
20 | |||
21 | All these identifier could be found in <dt-bindings/clock/marvell-pxa910.h>. | ||
diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-div6-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-div6-clocks.txt index 952e373178d2..054f65f9319c 100644 --- a/Documentation/devicetree/bindings/clock/renesas,cpg-div6-clocks.txt +++ b/Documentation/devicetree/bindings/clock/renesas,cpg-div6-clocks.txt | |||
@@ -7,11 +7,16 @@ to 64. | |||
7 | Required Properties: | 7 | Required Properties: |
8 | 8 | ||
9 | - compatible: Must be one of the following | 9 | - compatible: Must be one of the following |
10 | - "renesas,r8a73a4-div6-clock" for R8A73A4 (R-Mobile APE6) DIV6 clocks | ||
11 | - "renesas,r8a7740-div6-clock" for R8A7740 (R-Mobile A1) DIV6 clocks | ||
10 | - "renesas,r8a7790-div6-clock" for R8A7790 (R-Car H2) DIV6 clocks | 12 | - "renesas,r8a7790-div6-clock" for R8A7790 (R-Car H2) DIV6 clocks |
11 | - "renesas,r8a7791-div6-clock" for R8A7791 (R-Car M2) DIV6 clocks | 13 | - "renesas,r8a7791-div6-clock" for R8A7791 (R-Car M2) DIV6 clocks |
14 | - "renesas,sh73a0-div6-clock" for SH73A0 (SH-Mobile AG5) DIV6 clocks | ||
12 | - "renesas,cpg-div6-clock" for generic DIV6 clocks | 15 | - "renesas,cpg-div6-clock" for generic DIV6 clocks |
13 | - reg: Base address and length of the memory resource used by the DIV6 clock | 16 | - reg: Base address and length of the memory resource used by the DIV6 clock |
14 | - clocks: Reference to the parent clock | 17 | - clocks: Reference to the parent clock(s); either one, four, or eight |
18 | clocks must be specified. For clocks with multiple parents, invalid | ||
19 | settings must be specified as "<0>". | ||
15 | - #clock-cells: Must be 0 | 20 | - #clock-cells: Must be 0 |
16 | - clock-output-names: The name of the clock as a free-form string | 21 | - clock-output-names: The name of the clock as a free-form string |
17 | 22 | ||
@@ -19,10 +24,11 @@ Required Properties: | |||
19 | Example | 24 | Example |
20 | ------- | 25 | ------- |
21 | 26 | ||
22 | sd2_clk: sd2_clk@e6150078 { | 27 | sdhi2_clk: sdhi2_clk@e615007c { |
23 | compatible = "renesas,r8a7790-div6-clock", "renesas,cpg-div6-clock"; | 28 | compatible = "renesas,r8a73a4-div6-clock", "renesas,cpg-div6-clock"; |
24 | reg = <0 0xe6150078 0 4>; | 29 | reg = <0 0xe615007c 0 4>; |
25 | clocks = <&pll1_div2_clk>; | 30 | clocks = <&pll1_div2_clk>, <&cpg_clocks R8A73A4_CLK_PLL2S>, |
31 | <0>, <&extal2_clk>; | ||
26 | #clock-cells = <0>; | 32 | #clock-cells = <0>; |
27 | clock-output-names = "sd2"; | 33 | clock-output-names = "sdhi2ck"; |
28 | }; | 34 | }; |
diff --git a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt index a5f52238c80d..2e18676bd4b5 100644 --- a/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt +++ b/Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt | |||
@@ -26,11 +26,11 @@ Required Properties: | |||
26 | must appear in the same order as the output clocks. | 26 | must appear in the same order as the output clocks. |
27 | - #clock-cells: Must be 1 | 27 | - #clock-cells: Must be 1 |
28 | - clock-output-names: The name of the clocks as free-form strings | 28 | - clock-output-names: The name of the clocks as free-form strings |
29 | - renesas,clock-indices: Indices of the gate clocks into the group (0 to 31) | 29 | - clock-indices: Indices of the gate clocks into the group (0 to 31) |
30 | 30 | ||
31 | The clocks, clock-output-names and renesas,clock-indices properties contain one | 31 | The clocks, clock-output-names and clock-indices properties contain one entry |
32 | entry per gate clock. The MSTP groups are sparsely populated. Unimplemented | 32 | per gate clock. The MSTP groups are sparsely populated. Unimplemented gate |
33 | gate clocks must not be declared. | 33 | clocks must not be declared. |
34 | 34 | ||
35 | 35 | ||
36 | Example | 36 | Example |
diff --git a/Documentation/devicetree/bindings/clock/sunxi.txt b/Documentation/devicetree/bindings/clock/sunxi.txt index ed116df9c3e7..67b2b99f2b33 100644 --- a/Documentation/devicetree/bindings/clock/sunxi.txt +++ b/Documentation/devicetree/bindings/clock/sunxi.txt | |||
@@ -10,14 +10,17 @@ Required properties: | |||
10 | "allwinner,sun4i-a10-pll1-clk" - for the main PLL clock and PLL4 | 10 | "allwinner,sun4i-a10-pll1-clk" - for the main PLL clock and PLL4 |
11 | "allwinner,sun6i-a31-pll1-clk" - for the main PLL clock on A31 | 11 | "allwinner,sun6i-a31-pll1-clk" - for the main PLL clock on A31 |
12 | "allwinner,sun8i-a23-pll1-clk" - for the main PLL clock on A23 | 12 | "allwinner,sun8i-a23-pll1-clk" - for the main PLL clock on A23 |
13 | "allwinner,sun9i-a80-pll4-clk" - for the peripheral PLLs on A80 | ||
13 | "allwinner,sun4i-a10-pll5-clk" - for the PLL5 clock | 14 | "allwinner,sun4i-a10-pll5-clk" - for the PLL5 clock |
14 | "allwinner,sun4i-a10-pll6-clk" - for the PLL6 clock | 15 | "allwinner,sun4i-a10-pll6-clk" - for the PLL6 clock |
15 | "allwinner,sun6i-a31-pll6-clk" - for the PLL6 clock on A31 | 16 | "allwinner,sun6i-a31-pll6-clk" - for the PLL6 clock on A31 |
17 | "allwinner,sun9i-a80-gt-clk" - for the GT bus clock on A80 | ||
16 | "allwinner,sun4i-a10-cpu-clk" - for the CPU multiplexer clock | 18 | "allwinner,sun4i-a10-cpu-clk" - for the CPU multiplexer clock |
17 | "allwinner,sun4i-a10-axi-clk" - for the AXI clock | 19 | "allwinner,sun4i-a10-axi-clk" - for the AXI clock |
18 | "allwinner,sun8i-a23-axi-clk" - for the AXI clock on A23 | 20 | "allwinner,sun8i-a23-axi-clk" - for the AXI clock on A23 |
19 | "allwinner,sun4i-a10-axi-gates-clk" - for the AXI gates | 21 | "allwinner,sun4i-a10-axi-gates-clk" - for the AXI gates |
20 | "allwinner,sun4i-a10-ahb-clk" - for the AHB clock | 22 | "allwinner,sun4i-a10-ahb-clk" - for the AHB clock |
23 | "allwinner,sun9i-a80-ahb-clk" - for the AHB bus clocks on A80 | ||
21 | "allwinner,sun4i-a10-ahb-gates-clk" - for the AHB gates on A10 | 24 | "allwinner,sun4i-a10-ahb-gates-clk" - for the AHB gates on A10 |
22 | "allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13 | 25 | "allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13 |
23 | "allwinner,sun5i-a10s-ahb-gates-clk" - for the AHB gates on A10s | 26 | "allwinner,sun5i-a10s-ahb-gates-clk" - for the AHB gates on A10s |
@@ -26,24 +29,29 @@ Required properties: | |||
26 | "allwinner,sun6i-a31-ahb1-mux-clk" - for the AHB1 multiplexer on A31 | 29 | "allwinner,sun6i-a31-ahb1-mux-clk" - for the AHB1 multiplexer on A31 |
27 | "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31 | 30 | "allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31 |
28 | "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23 | 31 | "allwinner,sun8i-a23-ahb1-gates-clk" - for the AHB1 gates on A23 |
32 | "allwinner,sun9i-a80-ahb0-gates-clk" - for the AHB0 gates on A80 | ||
33 | "allwinner,sun9i-a80-ahb1-gates-clk" - for the AHB1 gates on A80 | ||
34 | "allwinner,sun9i-a80-ahb2-gates-clk" - for the AHB2 gates on A80 | ||
29 | "allwinner,sun4i-a10-apb0-clk" - for the APB0 clock | 35 | "allwinner,sun4i-a10-apb0-clk" - for the APB0 clock |
30 | "allwinner,sun6i-a31-apb0-clk" - for the APB0 clock on A31 | 36 | "allwinner,sun6i-a31-apb0-clk" - for the APB0 clock on A31 |
31 | "allwinner,sun8i-a23-apb0-clk" - for the APB0 clock on A23 | 37 | "allwinner,sun8i-a23-apb0-clk" - for the APB0 clock on A23 |
38 | "allwinner,sun9i-a80-apb0-clk" - for the APB0 bus clock on A80 | ||
32 | "allwinner,sun4i-a10-apb0-gates-clk" - for the APB0 gates on A10 | 39 | "allwinner,sun4i-a10-apb0-gates-clk" - for the APB0 gates on A10 |
33 | "allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13 | 40 | "allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13 |
34 | "allwinner,sun5i-a10s-apb0-gates-clk" - for the APB0 gates on A10s | 41 | "allwinner,sun5i-a10s-apb0-gates-clk" - for the APB0 gates on A10s |
35 | "allwinner,sun6i-a31-apb0-gates-clk" - for the APB0 gates on A31 | 42 | "allwinner,sun6i-a31-apb0-gates-clk" - for the APB0 gates on A31 |
36 | "allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20 | 43 | "allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20 |
37 | "allwinner,sun8i-a23-apb0-gates-clk" - for the APB0 gates on A23 | 44 | "allwinner,sun8i-a23-apb0-gates-clk" - for the APB0 gates on A23 |
45 | "allwinner,sun9i-a80-apb0-gates-clk" - for the APB0 gates on A80 | ||
38 | "allwinner,sun4i-a10-apb1-clk" - for the APB1 clock | 46 | "allwinner,sun4i-a10-apb1-clk" - for the APB1 clock |
39 | "allwinner,sun4i-a10-apb1-mux-clk" - for the APB1 clock muxing | 47 | "allwinner,sun9i-a80-apb1-clk" - for the APB1 bus clock on A80 |
40 | "allwinner,sun4i-a10-apb1-gates-clk" - for the APB1 gates on A10 | 48 | "allwinner,sun4i-a10-apb1-gates-clk" - for the APB1 gates on A10 |
41 | "allwinner,sun5i-a13-apb1-gates-clk" - for the APB1 gates on A13 | 49 | "allwinner,sun5i-a13-apb1-gates-clk" - for the APB1 gates on A13 |
42 | "allwinner,sun5i-a10s-apb1-gates-clk" - for the APB1 gates on A10s | 50 | "allwinner,sun5i-a10s-apb1-gates-clk" - for the APB1 gates on A10s |
43 | "allwinner,sun6i-a31-apb1-gates-clk" - for the APB1 gates on A31 | 51 | "allwinner,sun6i-a31-apb1-gates-clk" - for the APB1 gates on A31 |
44 | "allwinner,sun7i-a20-apb1-gates-clk" - for the APB1 gates on A20 | 52 | "allwinner,sun7i-a20-apb1-gates-clk" - for the APB1 gates on A20 |
45 | "allwinner,sun8i-a23-apb1-gates-clk" - for the APB1 gates on A23 | 53 | "allwinner,sun8i-a23-apb1-gates-clk" - for the APB1 gates on A23 |
46 | "allwinner,sun6i-a31-apb2-div-clk" - for the APB2 gates on A31 | 54 | "allwinner,sun9i-a80-apb1-gates-clk" - for the APB1 gates on A80 |
47 | "allwinner,sun6i-a31-apb2-gates-clk" - for the APB2 gates on A31 | 55 | "allwinner,sun6i-a31-apb2-gates-clk" - for the APB2 gates on A31 |
48 | "allwinner,sun8i-a23-apb2-gates-clk" - for the APB2 gates on A23 | 56 | "allwinner,sun8i-a23-apb2-gates-clk" - for the APB2 gates on A23 |
49 | "allwinner,sun5i-a13-mbus-clk" - for the MBUS clock on A13 | 57 | "allwinner,sun5i-a13-mbus-clk" - for the MBUS clock on A13 |
@@ -63,8 +71,9 @@ Required properties for all clocks: | |||
63 | multiplexed clocks, the list order must match the hardware | 71 | multiplexed clocks, the list order must match the hardware |
64 | programming order. | 72 | programming order. |
65 | - #clock-cells : from common clock binding; shall be set to 0 except for | 73 | - #clock-cells : from common clock binding; shall be set to 0 except for |
66 | "allwinner,*-gates-clk", "allwinner,sun4i-pll5-clk" and | 74 | the following compatibles where it shall be set to 1: |
67 | "allwinner,sun4i-pll6-clk" where it shall be set to 1 | 75 | "allwinner,*-gates-clk", "allwinner,sun4i-pll5-clk", |
76 | "allwinner,sun4i-pll6-clk", "allwinner,sun6i-a31-pll6-clk" | ||
68 | - clock-output-names : shall be the corresponding names of the outputs. | 77 | - clock-output-names : shall be the corresponding names of the outputs. |
69 | If the clock module only has one output, the name shall be the | 78 | If the clock module only has one output, the name shall be the |
70 | module name. | 79 | module name. |
@@ -79,6 +88,12 @@ Clock consumers should specify the desired clocks they use with a | |||
79 | "clocks" phandle cell. Consumers that are using a gated clock should | 88 | "clocks" phandle cell. Consumers that are using a gated clock should |
80 | provide an additional ID in their clock property. This ID is the | 89 | provide an additional ID in their clock property. This ID is the |
81 | offset of the bit controlling this particular gate in the register. | 90 | offset of the bit controlling this particular gate in the register. |
91 | For the other clocks with "#clock-cells" = 1, the additional ID shall | ||
92 | refer to the index of the output. | ||
93 | |||
94 | For "allwinner,sun6i-a31-pll6-clk", there are 2 outputs. The first output | ||
95 | is the normal PLL6 output, or "pll6". The second output is rate doubled | ||
96 | PLL6, or "pll6x2". | ||
82 | 97 | ||
83 | For example: | 98 | For example: |
84 | 99 | ||
@@ -106,6 +121,14 @@ pll5: clk@01c20020 { | |||
106 | clock-output-names = "pll5_ddr", "pll5_other"; | 121 | clock-output-names = "pll5_ddr", "pll5_other"; |
107 | }; | 122 | }; |
108 | 123 | ||
124 | pll6: clk@01c20028 { | ||
125 | #clock-cells = <1>; | ||
126 | compatible = "allwinner,sun6i-a31-pll6-clk"; | ||
127 | reg = <0x01c20028 0x4>; | ||
128 | clocks = <&osc24M>; | ||
129 | clock-output-names = "pll6", "pll6x2"; | ||
130 | }; | ||
131 | |||
109 | cpu: cpu@01c20054 { | 132 | cpu: cpu@01c20054 { |
110 | #clock-cells = <0>; | 133 | #clock-cells = <0>; |
111 | compatible = "allwinner,sun4i-a10-cpu-clk"; | 134 | compatible = "allwinner,sun4i-a10-cpu-clk"; |
diff --git a/MAINTAINERS b/MAINTAINERS index 08f671dad3e9..ddb9ac8d32b3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2576,8 +2576,9 @@ F: drivers/media/platform/coda/ | |||
2576 | 2576 | ||
2577 | COMMON CLK FRAMEWORK | 2577 | COMMON CLK FRAMEWORK |
2578 | M: Mike Turquette <mturquette@linaro.org> | 2578 | M: Mike Turquette <mturquette@linaro.org> |
2579 | M: Stephen Boyd <sboyd@codeaurora.org> | ||
2579 | L: linux-kernel@vger.kernel.org | 2580 | L: linux-kernel@vger.kernel.org |
2580 | T: git git://git.linaro.org/people/mturquette/linux.git | 2581 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git |
2581 | S: Maintained | 2582 | S: Maintained |
2582 | F: drivers/clk/ | 2583 | F: drivers/clk/ |
2583 | X: drivers/clk/clkdev.c | 2584 | X: drivers/clk/clkdev.c |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 18 | 2 | PATCHLEVEL = 19 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = -rc2 |
5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
@@ -481,9 +481,10 @@ asm-generic: | |||
481 | # of make so .config is not included in this case either (for *config). | 481 | # of make so .config is not included in this case either (for *config). |
482 | 482 | ||
483 | version_h := include/generated/uapi/linux/version.h | 483 | version_h := include/generated/uapi/linux/version.h |
484 | old_version_h := include/linux/version.h | ||
484 | 485 | ||
485 | no-dot-config-targets := clean mrproper distclean \ | 486 | no-dot-config-targets := clean mrproper distclean \ |
486 | cscope gtags TAGS tags help %docs check% coccicheck \ | 487 | cscope gtags TAGS tags help% %docs check% coccicheck \ |
487 | $(version_h) headers_% archheaders archscripts \ | 488 | $(version_h) headers_% archheaders archscripts \ |
488 | kernelversion %src-pkg | 489 | kernelversion %src-pkg |
489 | 490 | ||
@@ -1005,6 +1006,7 @@ endef | |||
1005 | 1006 | ||
1006 | $(version_h): $(srctree)/Makefile FORCE | 1007 | $(version_h): $(srctree)/Makefile FORCE |
1007 | $(call filechk,version.h) | 1008 | $(call filechk,version.h) |
1009 | $(Q)rm -f $(old_version_h) | ||
1008 | 1010 | ||
1009 | include/generated/utsrelease.h: include/config/kernel.release FORCE | 1011 | include/generated/utsrelease.h: include/config/kernel.release FORCE |
1010 | $(call filechk,utsrelease.h) | 1012 | $(call filechk,utsrelease.h) |
@@ -1036,8 +1038,6 @@ firmware_install: FORCE | |||
1036 | #Default location for installed headers | 1038 | #Default location for installed headers |
1037 | export INSTALL_HDR_PATH = $(objtree)/usr | 1039 | export INSTALL_HDR_PATH = $(objtree)/usr |
1038 | 1040 | ||
1039 | hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj | ||
1040 | |||
1041 | # If we do an all arch process set dst to asm-$(hdr-arch) | 1041 | # If we do an all arch process set dst to asm-$(hdr-arch) |
1042 | hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm) | 1042 | hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm) |
1043 | 1043 | ||
@@ -1175,7 +1175,7 @@ MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \ | |||
1175 | Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \ | 1175 | Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \ |
1176 | signing_key.priv signing_key.x509 x509.genkey \ | 1176 | signing_key.priv signing_key.x509 x509.genkey \ |
1177 | extra_certificates signing_key.x509.keyid \ | 1177 | extra_certificates signing_key.x509.keyid \ |
1178 | signing_key.x509.signer include/linux/version.h | 1178 | signing_key.x509.signer |
1179 | 1179 | ||
1180 | # clean - Delete most, but leave enough to build external modules | 1180 | # clean - Delete most, but leave enough to build external modules |
1181 | # | 1181 | # |
@@ -1235,7 +1235,7 @@ rpm: include/config/kernel.release FORCE | |||
1235 | # --------------------------------------------------------------------------- | 1235 | # --------------------------------------------------------------------------- |
1236 | 1236 | ||
1237 | boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig) | 1237 | boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig) |
1238 | boards := $(notdir $(boards)) | 1238 | boards := $(sort $(notdir $(boards))) |
1239 | board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig)) | 1239 | board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig)) |
1240 | board-dirs := $(sort $(notdir $(board-dirs:/=))) | 1240 | board-dirs := $(sort $(notdir $(board-dirs:/=))) |
1241 | 1241 | ||
@@ -1326,7 +1326,7 @@ help-board-dirs := $(addprefix help-,$(board-dirs)) | |||
1326 | 1326 | ||
1327 | help-boards: $(help-board-dirs) | 1327 | help-boards: $(help-board-dirs) |
1328 | 1328 | ||
1329 | boards-per-dir = $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig)) | 1329 | boards-per-dir = $(sort $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig))) |
1330 | 1330 | ||
1331 | $(help-board-dirs): help-%: | 1331 | $(help-board-dirs): help-%: |
1332 | @echo 'Architecture specific targets ($(SRCARCH) $*):' | 1332 | @echo 'Architecture specific targets ($(SRCARCH) $*):' |
@@ -1581,11 +1581,6 @@ ifneq ($(cmd_files),) | |||
1581 | include $(cmd_files) | 1581 | include $(cmd_files) |
1582 | endif | 1582 | endif |
1583 | 1583 | ||
1584 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir | ||
1585 | # Usage: | ||
1586 | # $(Q)$(MAKE) $(clean)=dir | ||
1587 | clean := -f $(srctree)/scripts/Makefile.clean obj | ||
1588 | |||
1589 | endif # skip-makefile | 1584 | endif # skip-makefile |
1590 | 1585 | ||
1591 | PHONY += FORCE | 1586 | PHONY += FORCE |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 6a3d9a6c4497..91bd5bd62857 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
@@ -177,6 +177,9 @@ dtb-$(CONFIG_MACH_KIRKWOOD) += kirkwood-b3.dtb \ | |||
177 | dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb | 177 | dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb |
178 | dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb | 178 | dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb |
179 | dtb-$(CONFIG_MACH_MESON6) += meson6-atv1200.dtb | 179 | dtb-$(CONFIG_MACH_MESON6) += meson6-atv1200.dtb |
180 | dtb-$(CONFIG_ARCH_MMP) += pxa168-aspenite.dtb \ | ||
181 | pxa910-dkb.dtb \ | ||
182 | mmp2-brownstone.dtb | ||
180 | dtb-$(CONFIG_ARCH_MOXART) += moxart-uc7112lx.dtb | 183 | dtb-$(CONFIG_ARCH_MOXART) += moxart-uc7112lx.dtb |
181 | dtb-$(CONFIG_ARCH_MXC) += \ | 184 | dtb-$(CONFIG_ARCH_MXC) += \ |
182 | imx1-ads.dtb \ | 185 | imx1-ads.dtb \ |
diff --git a/arch/arm/boot/dts/mmp2-brownstone.dts b/arch/arm/boot/dts/mmp2-brownstone.dts index 7f70a39459f6..350208c5e1ed 100644 --- a/arch/arm/boot/dts/mmp2-brownstone.dts +++ b/arch/arm/boot/dts/mmp2-brownstone.dts | |||
@@ -8,7 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | /dts-v1/; | 10 | /dts-v1/; |
11 | /include/ "mmp2.dtsi" | 11 | #include "mmp2.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | model = "Marvell MMP2 Brownstone Development Board"; | 14 | model = "Marvell MMP2 Brownstone Development Board"; |
diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi index 4e8b08c628c7..766bbb8495b6 100644 --- a/arch/arm/boot/dts/mmp2.dtsi +++ b/arch/arm/boot/dts/mmp2.dtsi | |||
@@ -7,7 +7,8 @@ | |||
7 | * publishhed by the Free Software Foundation. | 7 | * publishhed by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | /include/ "skeleton.dtsi" | 10 | #include "skeleton.dtsi" |
11 | #include <dt-bindings/clock/marvell,mmp2.h> | ||
11 | 12 | ||
12 | / { | 13 | / { |
13 | aliases { | 14 | aliases { |
@@ -135,6 +136,8 @@ | |||
135 | compatible = "mrvl,mmp-uart"; | 136 | compatible = "mrvl,mmp-uart"; |
136 | reg = <0xd4030000 0x1000>; | 137 | reg = <0xd4030000 0x1000>; |
137 | interrupts = <27>; | 138 | interrupts = <27>; |
139 | clocks = <&soc_clocks MMP2_CLK_UART0>; | ||
140 | resets = <&soc_clocks MMP2_CLK_UART0>; | ||
138 | status = "disabled"; | 141 | status = "disabled"; |
139 | }; | 142 | }; |
140 | 143 | ||
@@ -142,6 +145,8 @@ | |||
142 | compatible = "mrvl,mmp-uart"; | 145 | compatible = "mrvl,mmp-uart"; |
143 | reg = <0xd4017000 0x1000>; | 146 | reg = <0xd4017000 0x1000>; |
144 | interrupts = <28>; | 147 | interrupts = <28>; |
148 | clocks = <&soc_clocks MMP2_CLK_UART1>; | ||
149 | resets = <&soc_clocks MMP2_CLK_UART1>; | ||
145 | status = "disabled"; | 150 | status = "disabled"; |
146 | }; | 151 | }; |
147 | 152 | ||
@@ -149,6 +154,8 @@ | |||
149 | compatible = "mrvl,mmp-uart"; | 154 | compatible = "mrvl,mmp-uart"; |
150 | reg = <0xd4018000 0x1000>; | 155 | reg = <0xd4018000 0x1000>; |
151 | interrupts = <24>; | 156 | interrupts = <24>; |
157 | clocks = <&soc_clocks MMP2_CLK_UART2>; | ||
158 | resets = <&soc_clocks MMP2_CLK_UART2>; | ||
152 | status = "disabled"; | 159 | status = "disabled"; |
153 | }; | 160 | }; |
154 | 161 | ||
@@ -156,6 +163,8 @@ | |||
156 | compatible = "mrvl,mmp-uart"; | 163 | compatible = "mrvl,mmp-uart"; |
157 | reg = <0xd4016000 0x1000>; | 164 | reg = <0xd4016000 0x1000>; |
158 | interrupts = <46>; | 165 | interrupts = <46>; |
166 | clocks = <&soc_clocks MMP2_CLK_UART3>; | ||
167 | resets = <&soc_clocks MMP2_CLK_UART3>; | ||
159 | status = "disabled"; | 168 | status = "disabled"; |
160 | }; | 169 | }; |
161 | 170 | ||
@@ -168,6 +177,8 @@ | |||
168 | #gpio-cells = <2>; | 177 | #gpio-cells = <2>; |
169 | interrupts = <49>; | 178 | interrupts = <49>; |
170 | interrupt-names = "gpio_mux"; | 179 | interrupt-names = "gpio_mux"; |
180 | clocks = <&soc_clocks MMP2_CLK_GPIO>; | ||
181 | resets = <&soc_clocks MMP2_CLK_GPIO>; | ||
171 | interrupt-controller; | 182 | interrupt-controller; |
172 | #interrupt-cells = <1>; | 183 | #interrupt-cells = <1>; |
173 | ranges; | 184 | ranges; |
@@ -201,6 +212,8 @@ | |||
201 | compatible = "mrvl,mmp-twsi"; | 212 | compatible = "mrvl,mmp-twsi"; |
202 | reg = <0xd4011000 0x1000>; | 213 | reg = <0xd4011000 0x1000>; |
203 | interrupts = <7>; | 214 | interrupts = <7>; |
215 | clocks = <&soc_clocks MMP2_CLK_TWSI0>; | ||
216 | resets = <&soc_clocks MMP2_CLK_TWSI0>; | ||
204 | #address-cells = <1>; | 217 | #address-cells = <1>; |
205 | #size-cells = <0>; | 218 | #size-cells = <0>; |
206 | mrvl,i2c-fast-mode; | 219 | mrvl,i2c-fast-mode; |
@@ -211,6 +224,8 @@ | |||
211 | compatible = "mrvl,mmp-twsi"; | 224 | compatible = "mrvl,mmp-twsi"; |
212 | reg = <0xd4025000 0x1000>; | 225 | reg = <0xd4025000 0x1000>; |
213 | interrupts = <58>; | 226 | interrupts = <58>; |
227 | clocks = <&soc_clocks MMP2_CLK_TWSI1>; | ||
228 | resets = <&soc_clocks MMP2_CLK_TWSI1>; | ||
214 | status = "disabled"; | 229 | status = "disabled"; |
215 | }; | 230 | }; |
216 | 231 | ||
@@ -220,8 +235,20 @@ | |||
220 | interrupts = <1 0>; | 235 | interrupts = <1 0>; |
221 | interrupt-names = "rtc 1Hz", "rtc alarm"; | 236 | interrupt-names = "rtc 1Hz", "rtc alarm"; |
222 | interrupt-parent = <&intcmux5>; | 237 | interrupt-parent = <&intcmux5>; |
238 | clocks = <&soc_clocks MMP2_CLK_RTC>; | ||
239 | resets = <&soc_clocks MMP2_CLK_RTC>; | ||
223 | status = "disabled"; | 240 | status = "disabled"; |
224 | }; | 241 | }; |
225 | }; | 242 | }; |
243 | |||
244 | soc_clocks: clocks{ | ||
245 | compatible = "marvell,mmp2-clock"; | ||
246 | reg = <0xd4050000 0x1000>, | ||
247 | <0xd4282800 0x400>, | ||
248 | <0xd4015000 0x1000>; | ||
249 | reg-names = "mpmu", "apmu", "apbc"; | ||
250 | #clock-cells = <1>; | ||
251 | #reset-cells = <1>; | ||
252 | }; | ||
226 | }; | 253 | }; |
227 | }; | 254 | }; |
diff --git a/arch/arm/boot/dts/pxa168-aspenite.dts b/arch/arm/boot/dts/pxa168-aspenite.dts index e762facb3fa4..0a988b3fb248 100644 --- a/arch/arm/boot/dts/pxa168-aspenite.dts +++ b/arch/arm/boot/dts/pxa168-aspenite.dts | |||
@@ -8,7 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | /dts-v1/; | 10 | /dts-v1/; |
11 | /include/ "pxa168.dtsi" | 11 | #include "pxa168.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | model = "Marvell PXA168 Aspenite Development Board"; | 14 | model = "Marvell PXA168 Aspenite Development Board"; |
diff --git a/arch/arm/boot/dts/pxa168.dtsi b/arch/arm/boot/dts/pxa168.dtsi index 975dad21ac38..b899e25cbb1b 100644 --- a/arch/arm/boot/dts/pxa168.dtsi +++ b/arch/arm/boot/dts/pxa168.dtsi | |||
@@ -7,7 +7,8 @@ | |||
7 | * publishhed by the Free Software Foundation. | 7 | * publishhed by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | /include/ "skeleton.dtsi" | 10 | #include "skeleton.dtsi" |
11 | #include <dt-bindings/clock/marvell,pxa168.h> | ||
11 | 12 | ||
12 | / { | 13 | / { |
13 | aliases { | 14 | aliases { |
@@ -59,6 +60,8 @@ | |||
59 | compatible = "mrvl,mmp-uart"; | 60 | compatible = "mrvl,mmp-uart"; |
60 | reg = <0xd4017000 0x1000>; | 61 | reg = <0xd4017000 0x1000>; |
61 | interrupts = <27>; | 62 | interrupts = <27>; |
63 | clocks = <&soc_clocks PXA168_CLK_UART0>; | ||
64 | resets = <&soc_clocks PXA168_CLK_UART0>; | ||
62 | status = "disabled"; | 65 | status = "disabled"; |
63 | }; | 66 | }; |
64 | 67 | ||
@@ -66,6 +69,8 @@ | |||
66 | compatible = "mrvl,mmp-uart"; | 69 | compatible = "mrvl,mmp-uart"; |
67 | reg = <0xd4018000 0x1000>; | 70 | reg = <0xd4018000 0x1000>; |
68 | interrupts = <28>; | 71 | interrupts = <28>; |
72 | clocks = <&soc_clocks PXA168_CLK_UART1>; | ||
73 | resets = <&soc_clocks PXA168_CLK_UART1>; | ||
69 | status = "disabled"; | 74 | status = "disabled"; |
70 | }; | 75 | }; |
71 | 76 | ||
@@ -73,6 +78,8 @@ | |||
73 | compatible = "mrvl,mmp-uart"; | 78 | compatible = "mrvl,mmp-uart"; |
74 | reg = <0xd4026000 0x1000>; | 79 | reg = <0xd4026000 0x1000>; |
75 | interrupts = <29>; | 80 | interrupts = <29>; |
81 | clocks = <&soc_clocks PXA168_CLK_UART2>; | ||
82 | resets = <&soc_clocks PXA168_CLK_UART2>; | ||
76 | status = "disabled"; | 83 | status = "disabled"; |
77 | }; | 84 | }; |
78 | 85 | ||
@@ -84,6 +91,8 @@ | |||
84 | gpio-controller; | 91 | gpio-controller; |
85 | #gpio-cells = <2>; | 92 | #gpio-cells = <2>; |
86 | interrupts = <49>; | 93 | interrupts = <49>; |
94 | clocks = <&soc_clocks PXA168_CLK_GPIO>; | ||
95 | resets = <&soc_clocks PXA168_CLK_GPIO>; | ||
87 | interrupt-names = "gpio_mux"; | 96 | interrupt-names = "gpio_mux"; |
88 | interrupt-controller; | 97 | interrupt-controller; |
89 | #interrupt-cells = <1>; | 98 | #interrupt-cells = <1>; |
@@ -110,6 +119,8 @@ | |||
110 | compatible = "mrvl,mmp-twsi"; | 119 | compatible = "mrvl,mmp-twsi"; |
111 | reg = <0xd4011000 0x1000>; | 120 | reg = <0xd4011000 0x1000>; |
112 | interrupts = <7>; | 121 | interrupts = <7>; |
122 | clocks = <&soc_clocks PXA168_CLK_TWSI0>; | ||
123 | resets = <&soc_clocks PXA168_CLK_TWSI0>; | ||
113 | mrvl,i2c-fast-mode; | 124 | mrvl,i2c-fast-mode; |
114 | status = "disabled"; | 125 | status = "disabled"; |
115 | }; | 126 | }; |
@@ -118,6 +129,8 @@ | |||
118 | compatible = "mrvl,mmp-twsi"; | 129 | compatible = "mrvl,mmp-twsi"; |
119 | reg = <0xd4025000 0x1000>; | 130 | reg = <0xd4025000 0x1000>; |
120 | interrupts = <58>; | 131 | interrupts = <58>; |
132 | clocks = <&soc_clocks PXA168_CLK_TWSI1>; | ||
133 | resets = <&soc_clocks PXA168_CLK_TWSI1>; | ||
121 | status = "disabled"; | 134 | status = "disabled"; |
122 | }; | 135 | }; |
123 | 136 | ||
@@ -126,8 +139,20 @@ | |||
126 | reg = <0xd4010000 0x1000>; | 139 | reg = <0xd4010000 0x1000>; |
127 | interrupts = <5 6>; | 140 | interrupts = <5 6>; |
128 | interrupt-names = "rtc 1Hz", "rtc alarm"; | 141 | interrupt-names = "rtc 1Hz", "rtc alarm"; |
142 | clocks = <&soc_clocks PXA168_CLK_RTC>; | ||
143 | resets = <&soc_clocks PXA168_CLK_RTC>; | ||
129 | status = "disabled"; | 144 | status = "disabled"; |
130 | }; | 145 | }; |
131 | }; | 146 | }; |
147 | |||
148 | soc_clocks: clocks{ | ||
149 | compatible = "marvell,pxa168-clock"; | ||
150 | reg = <0xd4050000 0x1000>, | ||
151 | <0xd4282800 0x400>, | ||
152 | <0xd4015000 0x1000>; | ||
153 | reg-names = "mpmu", "apmu", "apbc"; | ||
154 | #clock-cells = <1>; | ||
155 | #reset-cells = <1>; | ||
156 | }; | ||
132 | }; | 157 | }; |
133 | }; | 158 | }; |
diff --git a/arch/arm/boot/dts/pxa910-dkb.dts b/arch/arm/boot/dts/pxa910-dkb.dts index 595492aa5053..c82f2810ec73 100644 --- a/arch/arm/boot/dts/pxa910-dkb.dts +++ b/arch/arm/boot/dts/pxa910-dkb.dts | |||
@@ -8,7 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | /dts-v1/; | 10 | /dts-v1/; |
11 | /include/ "pxa910.dtsi" | 11 | #include "pxa910.dtsi" |
12 | 12 | ||
13 | / { | 13 | / { |
14 | model = "Marvell PXA910 DKB Development Board"; | 14 | model = "Marvell PXA910 DKB Development Board"; |
diff --git a/arch/arm/boot/dts/pxa910.dtsi b/arch/arm/boot/dts/pxa910.dtsi index 0247c622f580..0868f6729be1 100644 --- a/arch/arm/boot/dts/pxa910.dtsi +++ b/arch/arm/boot/dts/pxa910.dtsi | |||
@@ -7,7 +7,8 @@ | |||
7 | * publishhed by the Free Software Foundation. | 7 | * publishhed by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | /include/ "skeleton.dtsi" | 10 | #include "skeleton.dtsi" |
11 | #include <dt-bindings/clock/marvell,pxa910.h> | ||
11 | 12 | ||
12 | / { | 13 | / { |
13 | aliases { | 14 | aliases { |
@@ -71,6 +72,8 @@ | |||
71 | compatible = "mrvl,mmp-uart"; | 72 | compatible = "mrvl,mmp-uart"; |
72 | reg = <0xd4017000 0x1000>; | 73 | reg = <0xd4017000 0x1000>; |
73 | interrupts = <27>; | 74 | interrupts = <27>; |
75 | clocks = <&soc_clocks PXA910_CLK_UART0>; | ||
76 | resets = <&soc_clocks PXA910_CLK_UART0>; | ||
74 | status = "disabled"; | 77 | status = "disabled"; |
75 | }; | 78 | }; |
76 | 79 | ||
@@ -78,6 +81,8 @@ | |||
78 | compatible = "mrvl,mmp-uart"; | 81 | compatible = "mrvl,mmp-uart"; |
79 | reg = <0xd4018000 0x1000>; | 82 | reg = <0xd4018000 0x1000>; |
80 | interrupts = <28>; | 83 | interrupts = <28>; |
84 | clocks = <&soc_clocks PXA910_CLK_UART1>; | ||
85 | resets = <&soc_clocks PXA910_CLK_UART1>; | ||
81 | status = "disabled"; | 86 | status = "disabled"; |
82 | }; | 87 | }; |
83 | 88 | ||
@@ -85,6 +90,8 @@ | |||
85 | compatible = "mrvl,mmp-uart"; | 90 | compatible = "mrvl,mmp-uart"; |
86 | reg = <0xd4036000 0x1000>; | 91 | reg = <0xd4036000 0x1000>; |
87 | interrupts = <59>; | 92 | interrupts = <59>; |
93 | clocks = <&soc_clocks PXA910_CLK_UART2>; | ||
94 | resets = <&soc_clocks PXA910_CLK_UART2>; | ||
88 | status = "disabled"; | 95 | status = "disabled"; |
89 | }; | 96 | }; |
90 | 97 | ||
@@ -97,6 +104,8 @@ | |||
97 | #gpio-cells = <2>; | 104 | #gpio-cells = <2>; |
98 | interrupts = <49>; | 105 | interrupts = <49>; |
99 | interrupt-names = "gpio_mux"; | 106 | interrupt-names = "gpio_mux"; |
107 | clocks = <&soc_clocks PXA910_CLK_GPIO>; | ||
108 | resets = <&soc_clocks PXA910_CLK_GPIO>; | ||
100 | interrupt-controller; | 109 | interrupt-controller; |
101 | #interrupt-cells = <1>; | 110 | #interrupt-cells = <1>; |
102 | ranges; | 111 | ranges; |
@@ -124,6 +133,8 @@ | |||
124 | #size-cells = <0>; | 133 | #size-cells = <0>; |
125 | reg = <0xd4011000 0x1000>; | 134 | reg = <0xd4011000 0x1000>; |
126 | interrupts = <7>; | 135 | interrupts = <7>; |
136 | clocks = <&soc_clocks PXA910_CLK_TWSI0>; | ||
137 | resets = <&soc_clocks PXA910_CLK_TWSI0>; | ||
127 | mrvl,i2c-fast-mode; | 138 | mrvl,i2c-fast-mode; |
128 | status = "disabled"; | 139 | status = "disabled"; |
129 | }; | 140 | }; |
@@ -134,6 +145,8 @@ | |||
134 | #size-cells = <0>; | 145 | #size-cells = <0>; |
135 | reg = <0xd4037000 0x1000>; | 146 | reg = <0xd4037000 0x1000>; |
136 | interrupts = <54>; | 147 | interrupts = <54>; |
148 | clocks = <&soc_clocks PXA910_CLK_TWSI1>; | ||
149 | resets = <&soc_clocks PXA910_CLK_TWSI1>; | ||
137 | status = "disabled"; | 150 | status = "disabled"; |
138 | }; | 151 | }; |
139 | 152 | ||
@@ -142,8 +155,21 @@ | |||
142 | reg = <0xd4010000 0x1000>; | 155 | reg = <0xd4010000 0x1000>; |
143 | interrupts = <5 6>; | 156 | interrupts = <5 6>; |
144 | interrupt-names = "rtc 1Hz", "rtc alarm"; | 157 | interrupt-names = "rtc 1Hz", "rtc alarm"; |
158 | clocks = <&soc_clocks PXA910_CLK_RTC>; | ||
159 | resets = <&soc_clocks PXA910_CLK_RTC>; | ||
145 | status = "disabled"; | 160 | status = "disabled"; |
146 | }; | 161 | }; |
147 | }; | 162 | }; |
163 | |||
164 | soc_clocks: clocks{ | ||
165 | compatible = "marvell,pxa910-clock"; | ||
166 | reg = <0xd4050000 0x1000>, | ||
167 | <0xd4282800 0x400>, | ||
168 | <0xd4015000 0x1000>, | ||
169 | <0xd403b000 0x1000>; | ||
170 | reg-names = "mpmu", "apmu", "apbc", "apbcp"; | ||
171 | #clock-cells = <1>; | ||
172 | #reset-cells = <1>; | ||
173 | }; | ||
148 | }; | 174 | }; |
149 | }; | 175 | }; |
diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi index e3ab942fd148..7b4099fcf817 100644 --- a/arch/arm/boot/dts/sun4i-a10.dtsi +++ b/arch/arm/boot/dts/sun4i-a10.dtsi | |||
@@ -188,19 +188,11 @@ | |||
188 | "apb0_ir1", "apb0_keypad"; | 188 | "apb0_ir1", "apb0_keypad"; |
189 | }; | 189 | }; |
190 | 190 | ||
191 | apb1_mux: apb1_mux@01c20058 { | 191 | apb1: clk@01c20058 { |
192 | #clock-cells = <0>; | ||
193 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | ||
194 | reg = <0x01c20058 0x4>; | ||
195 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; | ||
196 | clock-output-names = "apb1_mux"; | ||
197 | }; | ||
198 | |||
199 | apb1: apb1@01c20058 { | ||
200 | #clock-cells = <0>; | 192 | #clock-cells = <0>; |
201 | compatible = "allwinner,sun4i-a10-apb1-clk"; | 193 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
202 | reg = <0x01c20058 0x4>; | 194 | reg = <0x01c20058 0x4>; |
203 | clocks = <&apb1_mux>; | 195 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; |
204 | clock-output-names = "apb1"; | 196 | clock-output-names = "apb1"; |
205 | }; | 197 | }; |
206 | 198 | ||
diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi index 81ad4b94e812..1b76667f3182 100644 --- a/arch/arm/boot/dts/sun5i-a10s.dtsi +++ b/arch/arm/boot/dts/sun5i-a10s.dtsi | |||
@@ -176,19 +176,11 @@ | |||
176 | "apb0_ir", "apb0_keypad"; | 176 | "apb0_ir", "apb0_keypad"; |
177 | }; | 177 | }; |
178 | 178 | ||
179 | apb1_mux: apb1_mux@01c20058 { | 179 | apb1: clk@01c20058 { |
180 | #clock-cells = <0>; | ||
181 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | ||
182 | reg = <0x01c20058 0x4>; | ||
183 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; | ||
184 | clock-output-names = "apb1_mux"; | ||
185 | }; | ||
186 | |||
187 | apb1: apb1@01c20058 { | ||
188 | #clock-cells = <0>; | 180 | #clock-cells = <0>; |
189 | compatible = "allwinner,sun4i-a10-apb1-clk"; | 181 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
190 | reg = <0x01c20058 0x4>; | 182 | reg = <0x01c20058 0x4>; |
191 | clocks = <&apb1_mux>; | 183 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; |
192 | clock-output-names = "apb1"; | 184 | clock-output-names = "apb1"; |
193 | }; | 185 | }; |
194 | 186 | ||
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi index b131068f4f35..c35217ea1f64 100644 --- a/arch/arm/boot/dts/sun5i-a13.dtsi +++ b/arch/arm/boot/dts/sun5i-a13.dtsi | |||
@@ -161,19 +161,11 @@ | |||
161 | clock-output-names = "apb0_codec", "apb0_pio", "apb0_ir"; | 161 | clock-output-names = "apb0_codec", "apb0_pio", "apb0_ir"; |
162 | }; | 162 | }; |
163 | 163 | ||
164 | apb1_mux: apb1_mux@01c20058 { | 164 | apb1: clk@01c20058 { |
165 | #clock-cells = <0>; | ||
166 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | ||
167 | reg = <0x01c20058 0x4>; | ||
168 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; | ||
169 | clock-output-names = "apb1_mux"; | ||
170 | }; | ||
171 | |||
172 | apb1: apb1@01c20058 { | ||
173 | #clock-cells = <0>; | 165 | #clock-cells = <0>; |
174 | compatible = "allwinner,sun4i-a10-apb1-clk"; | 166 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
175 | reg = <0x01c20058 0x4>; | 167 | reg = <0x01c20058 0x4>; |
176 | clocks = <&apb1_mux>; | 168 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; |
177 | clock-output-names = "apb1"; | 169 | clock-output-names = "apb1"; |
178 | }; | 170 | }; |
179 | 171 | ||
diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi index a400172a8a52..f47156b6572b 100644 --- a/arch/arm/boot/dts/sun6i-a31.dtsi +++ b/arch/arm/boot/dts/sun6i-a31.dtsi | |||
@@ -229,19 +229,11 @@ | |||
229 | "apb1_daudio1"; | 229 | "apb1_daudio1"; |
230 | }; | 230 | }; |
231 | 231 | ||
232 | apb2_mux: apb2_mux@01c20058 { | 232 | apb2: clk@01c20058 { |
233 | #clock-cells = <0>; | 233 | #clock-cells = <0>; |
234 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | 234 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
235 | reg = <0x01c20058 0x4>; | 235 | reg = <0x01c20058 0x4>; |
236 | clocks = <&osc32k>, <&osc24M>, <&pll6 0>, <&pll6 0>; | 236 | clocks = <&osc32k>, <&osc24M>, <&pll6 0>, <&pll6 0>; |
237 | clock-output-names = "apb2_mux"; | ||
238 | }; | ||
239 | |||
240 | apb2: apb2@01c20058 { | ||
241 | #clock-cells = <0>; | ||
242 | compatible = "allwinner,sun6i-a31-apb2-div-clk"; | ||
243 | reg = <0x01c20058 0x4>; | ||
244 | clocks = <&apb2_mux>; | ||
245 | clock-output-names = "apb2"; | 237 | clock-output-names = "apb2"; |
246 | }; | 238 | }; |
247 | 239 | ||
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index 82a524ce28ad..e21ce5992d56 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | |||
@@ -236,19 +236,11 @@ | |||
236 | "apb0_iis2", "apb0_keypad"; | 236 | "apb0_iis2", "apb0_keypad"; |
237 | }; | 237 | }; |
238 | 238 | ||
239 | apb1_mux: apb1_mux@01c20058 { | 239 | apb1: clk@01c20058 { |
240 | #clock-cells = <0>; | ||
241 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | ||
242 | reg = <0x01c20058 0x4>; | ||
243 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; | ||
244 | clock-output-names = "apb1_mux"; | ||
245 | }; | ||
246 | |||
247 | apb1: apb1@01c20058 { | ||
248 | #clock-cells = <0>; | 240 | #clock-cells = <0>; |
249 | compatible = "allwinner,sun4i-a10-apb1-clk"; | 241 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
250 | reg = <0x01c20058 0x4>; | 242 | reg = <0x01c20058 0x4>; |
251 | clocks = <&apb1_mux>; | 243 | clocks = <&osc24M>, <&pll6 1>, <&osc32k>; |
252 | clock-output-names = "apb1"; | 244 | clock-output-names = "apb1"; |
253 | }; | 245 | }; |
254 | 246 | ||
diff --git a/arch/arm/boot/dts/sun8i-a23.dtsi b/arch/arm/boot/dts/sun8i-a23.dtsi index 6086adbf9d74..0746cd1024d7 100644 --- a/arch/arm/boot/dts/sun8i-a23.dtsi +++ b/arch/arm/boot/dts/sun8i-a23.dtsi | |||
@@ -189,19 +189,11 @@ | |||
189 | "apb1_daudio0", "apb1_daudio1"; | 189 | "apb1_daudio0", "apb1_daudio1"; |
190 | }; | 190 | }; |
191 | 191 | ||
192 | apb2_mux: apb2_mux_clk@01c20058 { | 192 | apb2: clk@01c20058 { |
193 | #clock-cells = <0>; | 193 | #clock-cells = <0>; |
194 | compatible = "allwinner,sun4i-a10-apb1-mux-clk"; | 194 | compatible = "allwinner,sun4i-a10-apb1-clk"; |
195 | reg = <0x01c20058 0x4>; | 195 | reg = <0x01c20058 0x4>; |
196 | clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>; | 196 | clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>; |
197 | clock-output-names = "apb2_mux"; | ||
198 | }; | ||
199 | |||
200 | apb2: apb2_clk@01c20058 { | ||
201 | #clock-cells = <0>; | ||
202 | compatible = "allwinner,sun6i-a31-apb2-div-clk"; | ||
203 | reg = <0x01c20058 0x4>; | ||
204 | clocks = <&apb2_mux>; | ||
205 | clock-output-names = "apb2"; | 197 | clock-output-names = "apb2"; |
206 | }; | 198 | }; |
207 | 199 | ||
diff --git a/arch/arm/configs/ape6evm_defconfig b/arch/arm/configs/ape6evm_defconfig index db81d8ce4c03..9e9a72e3d30f 100644 --- a/arch/arm/configs/ape6evm_defconfig +++ b/arch/arm/configs/ape6evm_defconfig | |||
@@ -33,7 +33,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
33 | CONFIG_VFP=y | 33 | CONFIG_VFP=y |
34 | CONFIG_NEON=y | 34 | CONFIG_NEON=y |
35 | CONFIG_BINFMT_MISC=y | 35 | CONFIG_BINFMT_MISC=y |
36 | CONFIG_PM_RUNTIME=y | 36 | CONFIG_PM=y |
37 | CONFIG_NET=y | 37 | CONFIG_NET=y |
38 | CONFIG_PACKET=y | 38 | CONFIG_PACKET=y |
39 | CONFIG_UNIX=y | 39 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/armadillo800eva_defconfig b/arch/arm/configs/armadillo800eva_defconfig index d9675c68a399..5666e3700a82 100644 --- a/arch/arm/configs/armadillo800eva_defconfig +++ b/arch/arm/configs/armadillo800eva_defconfig | |||
@@ -43,7 +43,7 @@ CONFIG_KEXEC=y | |||
43 | CONFIG_VFP=y | 43 | CONFIG_VFP=y |
44 | CONFIG_NEON=y | 44 | CONFIG_NEON=y |
45 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 45 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
46 | CONFIG_PM_RUNTIME=y | 46 | CONFIG_PM=y |
47 | CONFIG_NET=y | 47 | CONFIG_NET=y |
48 | CONFIG_PACKET=y | 48 | CONFIG_PACKET=y |
49 | CONFIG_UNIX=y | 49 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/bcm_defconfig b/arch/arm/configs/bcm_defconfig index 83a87e48901c..7117662bab2e 100644 --- a/arch/arm/configs/bcm_defconfig +++ b/arch/arm/configs/bcm_defconfig | |||
@@ -39,7 +39,7 @@ CONFIG_CPU_IDLE=y | |||
39 | CONFIG_VFP=y | 39 | CONFIG_VFP=y |
40 | CONFIG_NEON=y | 40 | CONFIG_NEON=y |
41 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 41 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
42 | CONFIG_PM_RUNTIME=y | 42 | CONFIG_PM=y |
43 | CONFIG_NET=y | 43 | CONFIG_NET=y |
44 | CONFIG_PACKET=y | 44 | CONFIG_PACKET=y |
45 | CONFIG_PACKET_DIAG=y | 45 | CONFIG_PACKET_DIAG=y |
diff --git a/arch/arm/configs/bockw_defconfig b/arch/arm/configs/bockw_defconfig index 1dde5daa84f9..3125e00f05ab 100644 --- a/arch/arm/configs/bockw_defconfig +++ b/arch/arm/configs/bockw_defconfig | |||
@@ -29,7 +29,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
29 | CONFIG_ARM_APPENDED_DTB=y | 29 | CONFIG_ARM_APPENDED_DTB=y |
30 | CONFIG_VFP=y | 30 | CONFIG_VFP=y |
31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
32 | CONFIG_PM_RUNTIME=y | 32 | CONFIG_PM=y |
33 | CONFIG_NET=y | 33 | CONFIG_NET=y |
34 | CONFIG_PACKET=y | 34 | CONFIG_PACKET=y |
35 | CONFIG_UNIX=y | 35 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/davinci_all_defconfig b/arch/arm/configs/davinci_all_defconfig index 759f9b0053e2..235842c9ba96 100644 --- a/arch/arm/configs/davinci_all_defconfig +++ b/arch/arm/configs/davinci_all_defconfig | |||
@@ -49,7 +49,7 @@ CONFIG_CPU_FREQ_GOV_PERFORMANCE=m | |||
49 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | 49 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m |
50 | CONFIG_CPU_FREQ_GOV_ONDEMAND=m | 50 | CONFIG_CPU_FREQ_GOV_ONDEMAND=m |
51 | CONFIG_CPU_IDLE=y | 51 | CONFIG_CPU_IDLE=y |
52 | CONFIG_PM_RUNTIME=y | 52 | CONFIG_PM=y |
53 | CONFIG_NET=y | 53 | CONFIG_NET=y |
54 | CONFIG_PACKET=y | 54 | CONFIG_PACKET=y |
55 | CONFIG_UNIX=y | 55 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig index c41990729024..5ef14de00a29 100644 --- a/arch/arm/configs/exynos_defconfig +++ b/arch/arm/configs/exynos_defconfig | |||
@@ -27,7 +27,7 @@ CONFIG_ARM_ATAG_DTB_COMPAT=y | |||
27 | CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M" | 27 | CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M" |
28 | CONFIG_VFP=y | 28 | CONFIG_VFP=y |
29 | CONFIG_NEON=y | 29 | CONFIG_NEON=y |
30 | CONFIG_PM_RUNTIME=y | 30 | CONFIG_PM=y |
31 | CONFIG_NET=y | 31 | CONFIG_NET=y |
32 | CONFIG_PACKET=y | 32 | CONFIG_PACKET=y |
33 | CONFIG_UNIX=y | 33 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/ezx_defconfig b/arch/arm/configs/ezx_defconfig index eb440aae4283..ea316c4b890e 100644 --- a/arch/arm/configs/ezx_defconfig +++ b/arch/arm/configs/ezx_defconfig | |||
@@ -39,7 +39,6 @@ CONFIG_BINFMT_AOUT=m | |||
39 | CONFIG_BINFMT_MISC=m | 39 | CONFIG_BINFMT_MISC=m |
40 | CONFIG_PM=y | 40 | CONFIG_PM=y |
41 | CONFIG_APM_EMULATION=y | 41 | CONFIG_APM_EMULATION=y |
42 | CONFIG_PM_RUNTIME=y | ||
43 | CONFIG_NET=y | 42 | CONFIG_NET=y |
44 | CONFIG_PACKET=y | 43 | CONFIG_PACKET=y |
45 | CONFIG_UNIX=y | 44 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/hisi_defconfig b/arch/arm/configs/hisi_defconfig index 1fe3621faf65..112543665dd7 100644 --- a/arch/arm/configs/hisi_defconfig +++ b/arch/arm/configs/hisi_defconfig | |||
@@ -18,7 +18,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
18 | CONFIG_ARM_ATAG_DTB_COMPAT=y | 18 | CONFIG_ARM_ATAG_DTB_COMPAT=y |
19 | CONFIG_NEON=y | 19 | CONFIG_NEON=y |
20 | CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y | 20 | CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y |
21 | CONFIG_PM_RUNTIME=y | 21 | CONFIG_PM=y |
22 | CONFIG_NET=y | 22 | CONFIG_NET=y |
23 | CONFIG_PACKET=y | 23 | CONFIG_PACKET=y |
24 | CONFIG_UNIX=y | 24 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/imote2_defconfig b/arch/arm/configs/imote2_defconfig index 182e54692664..18e59feaa307 100644 --- a/arch/arm/configs/imote2_defconfig +++ b/arch/arm/configs/imote2_defconfig | |||
@@ -31,7 +31,6 @@ CONFIG_BINFMT_AOUT=m | |||
31 | CONFIG_BINFMT_MISC=m | 31 | CONFIG_BINFMT_MISC=m |
32 | CONFIG_PM=y | 32 | CONFIG_PM=y |
33 | CONFIG_APM_EMULATION=y | 33 | CONFIG_APM_EMULATION=y |
34 | CONFIG_PM_RUNTIME=y | ||
35 | CONFIG_NET=y | 34 | CONFIG_NET=y |
36 | CONFIG_PACKET=y | 35 | CONFIG_PACKET=y |
37 | CONFIG_UNIX=y | 36 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index f707cd2691cf..7c2075a07eba 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig | |||
@@ -54,7 +54,7 @@ CONFIG_ARM_IMX6Q_CPUFREQ=y | |||
54 | CONFIG_VFP=y | 54 | CONFIG_VFP=y |
55 | CONFIG_NEON=y | 55 | CONFIG_NEON=y |
56 | CONFIG_BINFMT_MISC=m | 56 | CONFIG_BINFMT_MISC=m |
57 | CONFIG_PM_RUNTIME=y | 57 | CONFIG_PM=y |
58 | CONFIG_PM_DEBUG=y | 58 | CONFIG_PM_DEBUG=y |
59 | CONFIG_PM_TEST_SUSPEND=y | 59 | CONFIG_PM_TEST_SUSPEND=y |
60 | CONFIG_NET=y | 60 | CONFIG_NET=y |
diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig index 20a3ff99fae2..a2067cbfe173 100644 --- a/arch/arm/configs/keystone_defconfig +++ b/arch/arm/configs/keystone_defconfig | |||
@@ -30,7 +30,7 @@ CONFIG_HIGHMEM=y | |||
30 | CONFIG_VFP=y | 30 | CONFIG_VFP=y |
31 | CONFIG_NEON=y | 31 | CONFIG_NEON=y |
32 | # CONFIG_SUSPEND is not set | 32 | # CONFIG_SUSPEND is not set |
33 | CONFIG_PM_RUNTIME=y | 33 | CONFIG_PM=y |
34 | CONFIG_NET=y | 34 | CONFIG_NET=y |
35 | CONFIG_PACKET=y | 35 | CONFIG_PACKET=y |
36 | CONFIG_UNIX=y | 36 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/kzm9g_defconfig b/arch/arm/configs/kzm9g_defconfig index 8cb115d74fdf..5d63fc5d2d48 100644 --- a/arch/arm/configs/kzm9g_defconfig +++ b/arch/arm/configs/kzm9g_defconfig | |||
@@ -43,7 +43,7 @@ CONFIG_KEXEC=y | |||
43 | CONFIG_VFP=y | 43 | CONFIG_VFP=y |
44 | CONFIG_NEON=y | 44 | CONFIG_NEON=y |
45 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 45 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
46 | CONFIG_PM_RUNTIME=y | 46 | CONFIG_PM=y |
47 | CONFIG_NET=y | 47 | CONFIG_NET=y |
48 | CONFIG_PACKET=y | 48 | CONFIG_PACKET=y |
49 | CONFIG_UNIX=y | 49 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/lager_defconfig b/arch/arm/configs/lager_defconfig index 929c571ea29b..a82afc916a89 100644 --- a/arch/arm/configs/lager_defconfig +++ b/arch/arm/configs/lager_defconfig | |||
@@ -37,7 +37,7 @@ CONFIG_AUTO_ZRELADDR=y | |||
37 | CONFIG_VFP=y | 37 | CONFIG_VFP=y |
38 | CONFIG_NEON=y | 38 | CONFIG_NEON=y |
39 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 39 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
40 | CONFIG_PM_RUNTIME=y | 40 | CONFIG_PM=y |
41 | CONFIG_NET=y | 41 | CONFIG_NET=y |
42 | CONFIG_PACKET=y | 42 | CONFIG_PACKET=y |
43 | CONFIG_UNIX=y | 43 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/mackerel_defconfig b/arch/arm/configs/mackerel_defconfig index 57ececba2ae6..05a529311b4d 100644 --- a/arch/arm/configs/mackerel_defconfig +++ b/arch/arm/configs/mackerel_defconfig | |||
@@ -28,7 +28,6 @@ CONFIG_KEXEC=y | |||
28 | CONFIG_VFP=y | 28 | CONFIG_VFP=y |
29 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 29 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
30 | CONFIG_PM=y | 30 | CONFIG_PM=y |
31 | CONFIG_PM_RUNTIME=y | ||
32 | CONFIG_NET=y | 31 | CONFIG_NET=y |
33 | CONFIG_PACKET=y | 32 | CONFIG_PACKET=y |
34 | CONFIG_UNIX=y | 33 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/marzen_defconfig b/arch/arm/configs/marzen_defconfig index ff91630d34e1..3c8b6d823189 100644 --- a/arch/arm/configs/marzen_defconfig +++ b/arch/arm/configs/marzen_defconfig | |||
@@ -33,7 +33,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
33 | CONFIG_VFP=y | 33 | CONFIG_VFP=y |
34 | CONFIG_KEXEC=y | 34 | CONFIG_KEXEC=y |
35 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 35 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
36 | CONFIG_PM_RUNTIME=y | 36 | CONFIG_PM=y |
37 | CONFIG_NET=y | 37 | CONFIG_NET=y |
38 | CONFIG_PACKET=y | 38 | CONFIG_PACKET=y |
39 | CONFIG_UNIX=y | 39 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/omap1_defconfig b/arch/arm/configs/omap1_defconfig index 115cda9f3260..a7dce674f1be 100644 --- a/arch/arm/configs/omap1_defconfig +++ b/arch/arm/configs/omap1_defconfig | |||
@@ -63,7 +63,6 @@ CONFIG_FPE_NWFPE=y | |||
63 | CONFIG_BINFMT_MISC=y | 63 | CONFIG_BINFMT_MISC=y |
64 | CONFIG_PM=y | 64 | CONFIG_PM=y |
65 | # CONFIG_SUSPEND is not set | 65 | # CONFIG_SUSPEND is not set |
66 | CONFIG_PM_RUNTIME=y | ||
67 | CONFIG_NET=y | 66 | CONFIG_NET=y |
68 | CONFIG_PACKET=y | 67 | CONFIG_PACKET=y |
69 | CONFIG_UNIX=y | 68 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/prima2_defconfig b/arch/arm/configs/prima2_defconfig index 23591dba47a0..f610230b9c1f 100644 --- a/arch/arm/configs/prima2_defconfig +++ b/arch/arm/configs/prima2_defconfig | |||
@@ -18,7 +18,7 @@ CONFIG_PREEMPT=y | |||
18 | CONFIG_AEABI=y | 18 | CONFIG_AEABI=y |
19 | CONFIG_KEXEC=y | 19 | CONFIG_KEXEC=y |
20 | CONFIG_BINFMT_MISC=y | 20 | CONFIG_BINFMT_MISC=y |
21 | CONFIG_PM_RUNTIME=y | 21 | CONFIG_PM=y |
22 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 22 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
23 | CONFIG_BLK_DEV_LOOP=y | 23 | CONFIG_BLK_DEV_LOOP=y |
24 | CONFIG_BLK_DEV_RAM=y | 24 | CONFIG_BLK_DEV_RAM=y |
diff --git a/arch/arm/configs/sama5_defconfig b/arch/arm/configs/sama5_defconfig index b58fb32770a0..afa24799477a 100644 --- a/arch/arm/configs/sama5_defconfig +++ b/arch/arm/configs/sama5_defconfig | |||
@@ -32,7 +32,7 @@ CONFIG_VFP=y | |||
32 | CONFIG_NEON=y | 32 | CONFIG_NEON=y |
33 | CONFIG_KERNEL_MODE_NEON=y | 33 | CONFIG_KERNEL_MODE_NEON=y |
34 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 34 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
35 | CONFIG_PM_RUNTIME=y | 35 | CONFIG_PM=y |
36 | CONFIG_PM_DEBUG=y | 36 | CONFIG_PM_DEBUG=y |
37 | CONFIG_PM_ADVANCED_DEBUG=y | 37 | CONFIG_PM_ADVANCED_DEBUG=y |
38 | CONFIG_NET=y | 38 | CONFIG_NET=y |
diff --git a/arch/arm/configs/shmobile_defconfig b/arch/arm/configs/shmobile_defconfig index df2c0f514b0a..3df6ca0c1d1f 100644 --- a/arch/arm/configs/shmobile_defconfig +++ b/arch/arm/configs/shmobile_defconfig | |||
@@ -39,7 +39,7 @@ CONFIG_KEXEC=y | |||
39 | CONFIG_VFP=y | 39 | CONFIG_VFP=y |
40 | CONFIG_NEON=y | 40 | CONFIG_NEON=y |
41 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 41 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
42 | CONFIG_PM_RUNTIME=y | 42 | CONFIG_PM=y |
43 | CONFIG_NET=y | 43 | CONFIG_NET=y |
44 | CONFIG_PACKET=y | 44 | CONFIG_PACKET=y |
45 | CONFIG_UNIX=y | 45 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/sunxi_defconfig b/arch/arm/configs/sunxi_defconfig index f7ac0379850f..7a342d2780a8 100644 --- a/arch/arm/configs/sunxi_defconfig +++ b/arch/arm/configs/sunxi_defconfig | |||
@@ -11,7 +11,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
11 | CONFIG_ARM_ATAG_DTB_COMPAT=y | 11 | CONFIG_ARM_ATAG_DTB_COMPAT=y |
12 | CONFIG_VFP=y | 12 | CONFIG_VFP=y |
13 | CONFIG_NEON=y | 13 | CONFIG_NEON=y |
14 | CONFIG_PM_RUNTIME=y | 14 | CONFIG_PM=y |
15 | CONFIG_NET=y | 15 | CONFIG_NET=y |
16 | CONFIG_PACKET=y | 16 | CONFIG_PACKET=y |
17 | CONFIG_UNIX=y | 17 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index 40750f93aa83..3ea9c3377ccb 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig | |||
@@ -46,7 +46,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | |||
46 | CONFIG_CPU_IDLE=y | 46 | CONFIG_CPU_IDLE=y |
47 | CONFIG_VFP=y | 47 | CONFIG_VFP=y |
48 | CONFIG_NEON=y | 48 | CONFIG_NEON=y |
49 | CONFIG_PM_RUNTIME=y | 49 | CONFIG_PM=y |
50 | CONFIG_NET=y | 50 | CONFIG_NET=y |
51 | CONFIG_PACKET=y | 51 | CONFIG_PACKET=y |
52 | CONFIG_UNIX=y | 52 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index d219d6a43238..6a1c9898fd03 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig | |||
@@ -25,7 +25,7 @@ CONFIG_CPU_IDLE=y | |||
25 | CONFIG_ARM_U8500_CPUIDLE=y | 25 | CONFIG_ARM_U8500_CPUIDLE=y |
26 | CONFIG_VFP=y | 26 | CONFIG_VFP=y |
27 | CONFIG_NEON=y | 27 | CONFIG_NEON=y |
28 | CONFIG_PM_RUNTIME=y | 28 | CONFIG_PM=y |
29 | CONFIG_NET=y | 29 | CONFIG_NET=y |
30 | CONFIG_PACKET=y | 30 | CONFIG_PACKET=y |
31 | CONFIG_UNIX=y | 31 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/vt8500_v6_v7_defconfig b/arch/arm/configs/vt8500_v6_v7_defconfig index 9e7a25639690..1bfaa7bfc392 100644 --- a/arch/arm/configs/vt8500_v6_v7_defconfig +++ b/arch/arm/configs/vt8500_v6_v7_defconfig | |||
@@ -16,7 +16,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
16 | CONFIG_ARM_ATAG_DTB_COMPAT=y | 16 | CONFIG_ARM_ATAG_DTB_COMPAT=y |
17 | CONFIG_VFP=y | 17 | CONFIG_VFP=y |
18 | CONFIG_NEON=y | 18 | CONFIG_NEON=y |
19 | CONFIG_PM_RUNTIME=y | 19 | CONFIG_PM=y |
20 | CONFIG_NET=y | 20 | CONFIG_NET=y |
21 | CONFIG_UNIX=y | 21 | CONFIG_UNIX=y |
22 | CONFIG_INET=y | 22 | CONFIG_INET=y |
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index ac4bfae26702..0fa418463f49 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
@@ -120,12 +120,12 @@ static inline int arch_spin_value_unlocked(arch_spinlock_t lock) | |||
120 | 120 | ||
121 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) | 121 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) |
122 | { | 122 | { |
123 | return !arch_spin_value_unlocked(ACCESS_ONCE(*lock)); | 123 | return !arch_spin_value_unlocked(READ_ONCE(*lock)); |
124 | } | 124 | } |
125 | 125 | ||
126 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) | 126 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) |
127 | { | 127 | { |
128 | struct __raw_tickets tickets = ACCESS_ONCE(lock->tickets); | 128 | struct __raw_tickets tickets = READ_ONCE(lock->tickets); |
129 | return (tickets.next - tickets.owner) > 1; | 129 | return (tickets.next - tickets.owner) > 1; |
130 | } | 130 | } |
131 | #define arch_spin_is_contended arch_spin_is_contended | 131 | #define arch_spin_is_contended arch_spin_is_contended |
diff --git a/arch/arm/mach-mmp/Kconfig b/arch/arm/mach-mmp/Kconfig index ebdba87b9671..fdbfadf00c84 100644 --- a/arch/arm/mach-mmp/Kconfig +++ b/arch/arm/mach-mmp/Kconfig | |||
@@ -86,11 +86,12 @@ config MACH_GPLUGD | |||
86 | 86 | ||
87 | config MACH_MMP_DT | 87 | config MACH_MMP_DT |
88 | bool "Support MMP (ARMv5) platforms from device tree" | 88 | bool "Support MMP (ARMv5) platforms from device tree" |
89 | select CPU_PXA168 | ||
90 | select CPU_PXA910 | ||
91 | select USE_OF | 89 | select USE_OF |
92 | select PINCTRL | 90 | select PINCTRL |
93 | select PINCTRL_SINGLE | 91 | select PINCTRL_SINGLE |
92 | select COMMON_CLK | ||
93 | select ARCH_HAS_RESET_CONTROLLER | ||
94 | select CPU_MOHAWK | ||
94 | help | 95 | help |
95 | Include support for Marvell MMP2 based platforms using | 96 | Include support for Marvell MMP2 based platforms using |
96 | the device tree. Needn't select any other machine while | 97 | the device tree. Needn't select any other machine while |
@@ -99,10 +100,12 @@ config MACH_MMP_DT | |||
99 | config MACH_MMP2_DT | 100 | config MACH_MMP2_DT |
100 | bool "Support MMP2 (ARMv7) platforms from device tree" | 101 | bool "Support MMP2 (ARMv7) platforms from device tree" |
101 | depends on !CPU_MOHAWK | 102 | depends on !CPU_MOHAWK |
102 | select CPU_MMP2 | ||
103 | select USE_OF | 103 | select USE_OF |
104 | select PINCTRL | 104 | select PINCTRL |
105 | select PINCTRL_SINGLE | 105 | select PINCTRL_SINGLE |
106 | select COMMON_CLK | ||
107 | select ARCH_HAS_RESET_CONTROLLER | ||
108 | select CPU_PJ4 | ||
106 | help | 109 | help |
107 | Include support for Marvell MMP2 based platforms using | 110 | Include support for Marvell MMP2 based platforms using |
108 | the device tree. | 111 | the device tree. |
@@ -111,21 +114,18 @@ endmenu | |||
111 | 114 | ||
112 | config CPU_PXA168 | 115 | config CPU_PXA168 |
113 | bool | 116 | bool |
114 | select COMMON_CLK | ||
115 | select CPU_MOHAWK | 117 | select CPU_MOHAWK |
116 | help | 118 | help |
117 | Select code specific to PXA168 | 119 | Select code specific to PXA168 |
118 | 120 | ||
119 | config CPU_PXA910 | 121 | config CPU_PXA910 |
120 | bool | 122 | bool |
121 | select COMMON_CLK | ||
122 | select CPU_MOHAWK | 123 | select CPU_MOHAWK |
123 | help | 124 | help |
124 | Select code specific to PXA910 | 125 | Select code specific to PXA910 |
125 | 126 | ||
126 | config CPU_MMP2 | 127 | config CPU_MMP2 |
127 | bool | 128 | bool |
128 | select COMMON_CLK | ||
129 | select CPU_PJ4 | 129 | select CPU_PJ4 |
130 | help | 130 | help |
131 | Select code specific to MMP2. MMP2 is ARMv7 compatible. | 131 | Select code specific to MMP2. MMP2 is ARMv7 compatible. |
diff --git a/arch/arm/mach-mmp/mmp-dt.c b/arch/arm/mach-mmp/mmp-dt.c index cca529ceecb7..b2296c9309b8 100644 --- a/arch/arm/mach-mmp/mmp-dt.c +++ b/arch/arm/mach-mmp/mmp-dt.c | |||
@@ -11,63 +11,42 @@ | |||
11 | 11 | ||
12 | #include <linux/irqchip.h> | 12 | #include <linux/irqchip.h> |
13 | #include <linux/of_platform.h> | 13 | #include <linux/of_platform.h> |
14 | #include <linux/clk-provider.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach/time.h> | 16 | #include <asm/mach/time.h> |
17 | #include <asm/hardware/cache-tauros2.h> | ||
16 | 18 | ||
17 | #include "common.h" | 19 | #include "common.h" |
18 | 20 | ||
19 | extern void __init mmp_dt_init_timer(void); | 21 | extern void __init mmp_dt_init_timer(void); |
20 | 22 | ||
21 | static const struct of_dev_auxdata pxa168_auxdata_lookup[] __initconst = { | 23 | static const char *pxa168_dt_board_compat[] __initdata = { |
22 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.0", NULL), | 24 | "mrvl,pxa168-aspenite", |
23 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.1", NULL), | 25 | NULL, |
24 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4026000, "pxa2xx-uart.2", NULL), | ||
25 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), | ||
26 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL), | ||
27 | OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp-gpio", NULL), | ||
28 | OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), | ||
29 | {} | ||
30 | }; | 26 | }; |
31 | 27 | ||
32 | static const struct of_dev_auxdata pxa910_auxdata_lookup[] __initconst = { | 28 | static const char *pxa910_dt_board_compat[] __initdata = { |
33 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.0", NULL), | 29 | "mrvl,pxa910-dkb", |
34 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.1", NULL), | 30 | NULL, |
35 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4036000, "pxa2xx-uart.2", NULL), | ||
36 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), | ||
37 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4037000, "pxa2xx-i2c.1", NULL), | ||
38 | OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp-gpio", NULL), | ||
39 | OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), | ||
40 | {} | ||
41 | }; | 31 | }; |
42 | 32 | ||
43 | static void __init pxa168_dt_init(void) | 33 | static void __init mmp_init_time(void) |
44 | { | ||
45 | of_platform_populate(NULL, of_default_bus_match_table, | ||
46 | pxa168_auxdata_lookup, NULL); | ||
47 | } | ||
48 | |||
49 | static void __init pxa910_dt_init(void) | ||
50 | { | 34 | { |
51 | of_platform_populate(NULL, of_default_bus_match_table, | 35 | #ifdef CONFIG_CACHE_TAUROS2 |
52 | pxa910_auxdata_lookup, NULL); | 36 | tauros2_init(0); |
37 | #endif | ||
38 | mmp_dt_init_timer(); | ||
39 | of_clk_init(NULL); | ||
53 | } | 40 | } |
54 | 41 | ||
55 | static const char *mmp_dt_board_compat[] __initdata = { | ||
56 | "mrvl,pxa168-aspenite", | ||
57 | "mrvl,pxa910-dkb", | ||
58 | NULL, | ||
59 | }; | ||
60 | |||
61 | DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)") | 42 | DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)") |
62 | .map_io = mmp_map_io, | 43 | .map_io = mmp_map_io, |
63 | .init_time = mmp_dt_init_timer, | 44 | .init_time = mmp_init_time, |
64 | .init_machine = pxa168_dt_init, | 45 | .dt_compat = pxa168_dt_board_compat, |
65 | .dt_compat = mmp_dt_board_compat, | ||
66 | MACHINE_END | 46 | MACHINE_END |
67 | 47 | ||
68 | DT_MACHINE_START(PXA910_DT, "Marvell PXA910 (Device Tree Support)") | 48 | DT_MACHINE_START(PXA910_DT, "Marvell PXA910 (Device Tree Support)") |
69 | .map_io = mmp_map_io, | 49 | .map_io = mmp_map_io, |
70 | .init_time = mmp_dt_init_timer, | 50 | .init_time = mmp_init_time, |
71 | .init_machine = pxa910_dt_init, | 51 | .dt_compat = pxa910_dt_board_compat, |
72 | .dt_compat = mmp_dt_board_compat, | ||
73 | MACHINE_END | 52 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/mmp2-dt.c b/arch/arm/mach-mmp/mmp2-dt.c index 023cb453f157..998c0f533abc 100644 --- a/arch/arm/mach-mmp/mmp2-dt.c +++ b/arch/arm/mach-mmp/mmp2-dt.c | |||
@@ -12,29 +12,22 @@ | |||
12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <linux/irqchip.h> | 13 | #include <linux/irqchip.h> |
14 | #include <linux/of_platform.h> | 14 | #include <linux/of_platform.h> |
15 | #include <linux/clk-provider.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | #include <asm/mach/time.h> | 17 | #include <asm/mach/time.h> |
18 | #include <asm/hardware/cache-tauros2.h> | ||
17 | 19 | ||
18 | #include "common.h" | 20 | #include "common.h" |
19 | 21 | ||
20 | extern void __init mmp_dt_init_timer(void); | 22 | extern void __init mmp_dt_init_timer(void); |
21 | 23 | ||
22 | static const struct of_dev_auxdata mmp2_auxdata_lookup[] __initconst = { | 24 | static void __init mmp_init_time(void) |
23 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4030000, "pxa2xx-uart.0", NULL), | ||
24 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4017000, "pxa2xx-uart.1", NULL), | ||
25 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4018000, "pxa2xx-uart.2", NULL), | ||
26 | OF_DEV_AUXDATA("mrvl,mmp-uart", 0xd4016000, "pxa2xx-uart.3", NULL), | ||
27 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4011000, "pxa2xx-i2c.0", NULL), | ||
28 | OF_DEV_AUXDATA("mrvl,mmp-twsi", 0xd4025000, "pxa2xx-i2c.1", NULL), | ||
29 | OF_DEV_AUXDATA("marvell,mmp-gpio", 0xd4019000, "mmp2-gpio", NULL), | ||
30 | OF_DEV_AUXDATA("mrvl,mmp-rtc", 0xd4010000, "sa1100-rtc", NULL), | ||
31 | {} | ||
32 | }; | ||
33 | |||
34 | static void __init mmp2_dt_init(void) | ||
35 | { | 25 | { |
36 | of_platform_populate(NULL, of_default_bus_match_table, | 26 | #ifdef CONFIG_CACHE_TAUROS2 |
37 | mmp2_auxdata_lookup, NULL); | 27 | tauros2_init(0); |
28 | #endif | ||
29 | mmp_dt_init_timer(); | ||
30 | of_clk_init(NULL); | ||
38 | } | 31 | } |
39 | 32 | ||
40 | static const char *mmp2_dt_board_compat[] __initdata = { | 33 | static const char *mmp2_dt_board_compat[] __initdata = { |
@@ -44,7 +37,6 @@ static const char *mmp2_dt_board_compat[] __initdata = { | |||
44 | 37 | ||
45 | DT_MACHINE_START(MMP2_DT, "Marvell MMP2 (Device Tree Support)") | 38 | DT_MACHINE_START(MMP2_DT, "Marvell MMP2 (Device Tree Support)") |
46 | .map_io = mmp_map_io, | 39 | .map_io = mmp_map_io, |
47 | .init_time = mmp_dt_init_timer, | 40 | .init_time = mmp_init_time, |
48 | .init_machine = mmp2_dt_init, | ||
49 | .dt_compat = mmp2_dt_board_compat, | 41 | .dt_compat = mmp2_dt_board_compat, |
50 | MACHINE_END | 42 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index f0edec199cd4..6ab656cc4f16 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -15,7 +15,7 @@ config ARCH_OMAP3 | |||
15 | select ARM_CPU_SUSPEND if PM | 15 | select ARM_CPU_SUSPEND if PM |
16 | select OMAP_INTERCONNECT | 16 | select OMAP_INTERCONNECT |
17 | select PM_OPP if PM | 17 | select PM_OPP if PM |
18 | select PM_RUNTIME if CPU_IDLE | 18 | select PM if CPU_IDLE |
19 | select SOC_HAS_OMAP2_SDRC | 19 | select SOC_HAS_OMAP2_SDRC |
20 | 20 | ||
21 | config ARCH_OMAP4 | 21 | config ARCH_OMAP4 |
@@ -32,7 +32,7 @@ config ARCH_OMAP4 | |||
32 | select PL310_ERRATA_588369 if CACHE_L2X0 | 32 | select PL310_ERRATA_588369 if CACHE_L2X0 |
33 | select PL310_ERRATA_727915 if CACHE_L2X0 | 33 | select PL310_ERRATA_727915 if CACHE_L2X0 |
34 | select PM_OPP if PM | 34 | select PM_OPP if PM |
35 | select PM_RUNTIME if CPU_IDLE | 35 | select PM if CPU_IDLE |
36 | select ARM_ERRATA_754322 | 36 | select ARM_ERRATA_754322 |
37 | select ARM_ERRATA_775420 | 37 | select ARM_ERRATA_775420 |
38 | 38 | ||
@@ -103,7 +103,7 @@ config ARCH_OMAP2PLUS_TYPICAL | |||
103 | select I2C_OMAP | 103 | select I2C_OMAP |
104 | select MENELAUS if ARCH_OMAP2 | 104 | select MENELAUS if ARCH_OMAP2 |
105 | select NEON if CPU_V7 | 105 | select NEON if CPU_V7 |
106 | select PM_RUNTIME | 106 | select PM |
107 | select REGULATOR | 107 | select REGULATOR |
108 | select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4 | 108 | select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4 |
109 | select TWL4030_POWER if ARCH_OMAP3 || ARCH_OMAP4 | 109 | select TWL4030_POWER if ARCH_OMAP3 || ARCH_OMAP4 |
diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c index 5c5ebb4db5f7..644ff3231bb8 100644 --- a/arch/arm/mach-omap2/cclock3xxx_data.c +++ b/arch/arm/mach-omap2/cclock3xxx_data.c | |||
@@ -111,6 +111,7 @@ static struct clk dpll3_ck; | |||
111 | 111 | ||
112 | static const char *dpll3_ck_parent_names[] = { | 112 | static const char *dpll3_ck_parent_names[] = { |
113 | "sys_ck", | 113 | "sys_ck", |
114 | "sys_ck", | ||
114 | }; | 115 | }; |
115 | 116 | ||
116 | static const struct clk_ops dpll3_ck_ops = { | 117 | static const struct clk_ops dpll3_ck_ops = { |
@@ -733,6 +734,10 @@ static const char *corex2_fck_parent_names[] = { | |||
733 | DEFINE_STRUCT_CLK_HW_OMAP(corex2_fck, NULL); | 734 | DEFINE_STRUCT_CLK_HW_OMAP(corex2_fck, NULL); |
734 | DEFINE_STRUCT_CLK(corex2_fck, corex2_fck_parent_names, core_ck_ops); | 735 | DEFINE_STRUCT_CLK(corex2_fck, corex2_fck_parent_names, core_ck_ops); |
735 | 736 | ||
737 | static const char *cpefuse_fck_parent_names[] = { | ||
738 | "sys_ck", | ||
739 | }; | ||
740 | |||
736 | static struct clk cpefuse_fck; | 741 | static struct clk cpefuse_fck; |
737 | 742 | ||
738 | static struct clk_hw_omap cpefuse_fck_hw = { | 743 | static struct clk_hw_omap cpefuse_fck_hw = { |
@@ -744,7 +749,7 @@ static struct clk_hw_omap cpefuse_fck_hw = { | |||
744 | .clkdm_name = "core_l4_clkdm", | 749 | .clkdm_name = "core_l4_clkdm", |
745 | }; | 750 | }; |
746 | 751 | ||
747 | DEFINE_STRUCT_CLK(cpefuse_fck, dpll3_ck_parent_names, aes2_ick_ops); | 752 | DEFINE_STRUCT_CLK(cpefuse_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
748 | 753 | ||
749 | static struct clk csi2_96m_fck; | 754 | static struct clk csi2_96m_fck; |
750 | 755 | ||
@@ -775,7 +780,7 @@ static struct clk_hw_omap d2d_26m_fck_hw = { | |||
775 | .clkdm_name = "d2d_clkdm", | 780 | .clkdm_name = "d2d_clkdm", |
776 | }; | 781 | }; |
777 | 782 | ||
778 | DEFINE_STRUCT_CLK(d2d_26m_fck, dpll3_ck_parent_names, aes2_ick_ops); | 783 | DEFINE_STRUCT_CLK(d2d_26m_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
779 | 784 | ||
780 | static struct clk des1_ick; | 785 | static struct clk des1_ick; |
781 | 786 | ||
@@ -1046,7 +1051,7 @@ static struct clk_hw_omap dss2_alwon_fck_hw = { | |||
1046 | .clkdm_name = "dss_clkdm", | 1051 | .clkdm_name = "dss_clkdm", |
1047 | }; | 1052 | }; |
1048 | 1053 | ||
1049 | DEFINE_STRUCT_CLK(dss2_alwon_fck, dpll3_ck_parent_names, aes2_ick_ops); | 1054 | DEFINE_STRUCT_CLK(dss2_alwon_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
1050 | 1055 | ||
1051 | static struct clk dss_96m_fck; | 1056 | static struct clk dss_96m_fck; |
1052 | 1057 | ||
@@ -1368,7 +1373,7 @@ DEFINE_STRUCT_CLK(gpio1_dbck, gpio1_dbck_parent_names, aes2_ick_ops); | |||
1368 | static struct clk wkup_l4_ick; | 1373 | static struct clk wkup_l4_ick; |
1369 | 1374 | ||
1370 | DEFINE_STRUCT_CLK_HW_OMAP(wkup_l4_ick, "wkup_clkdm"); | 1375 | DEFINE_STRUCT_CLK_HW_OMAP(wkup_l4_ick, "wkup_clkdm"); |
1371 | DEFINE_STRUCT_CLK(wkup_l4_ick, dpll3_ck_parent_names, core_l4_ick_ops); | 1376 | DEFINE_STRUCT_CLK(wkup_l4_ick, cpefuse_fck_parent_names, core_l4_ick_ops); |
1372 | 1377 | ||
1373 | static struct clk gpio1_ick; | 1378 | static struct clk gpio1_ick; |
1374 | 1379 | ||
@@ -1862,7 +1867,7 @@ static struct clk_hw_omap hecc_ck_hw = { | |||
1862 | .clkdm_name = "core_l3_clkdm", | 1867 | .clkdm_name = "core_l3_clkdm", |
1863 | }; | 1868 | }; |
1864 | 1869 | ||
1865 | DEFINE_STRUCT_CLK(hecc_ck, dpll3_ck_parent_names, aes2_ick_ops); | 1870 | DEFINE_STRUCT_CLK(hecc_ck, cpefuse_fck_parent_names, aes2_ick_ops); |
1866 | 1871 | ||
1867 | static struct clk hsotgusb_fck_am35xx; | 1872 | static struct clk hsotgusb_fck_am35xx; |
1868 | 1873 | ||
@@ -1875,7 +1880,7 @@ static struct clk_hw_omap hsotgusb_fck_am35xx_hw = { | |||
1875 | .clkdm_name = "core_l3_clkdm", | 1880 | .clkdm_name = "core_l3_clkdm", |
1876 | }; | 1881 | }; |
1877 | 1882 | ||
1878 | DEFINE_STRUCT_CLK(hsotgusb_fck_am35xx, dpll3_ck_parent_names, aes2_ick_ops); | 1883 | DEFINE_STRUCT_CLK(hsotgusb_fck_am35xx, cpefuse_fck_parent_names, aes2_ick_ops); |
1879 | 1884 | ||
1880 | static struct clk hsotgusb_ick_3430es1; | 1885 | static struct clk hsotgusb_ick_3430es1; |
1881 | 1886 | ||
@@ -2411,7 +2416,7 @@ static struct clk_hw_omap modem_fck_hw = { | |||
2411 | .clkdm_name = "d2d_clkdm", | 2416 | .clkdm_name = "d2d_clkdm", |
2412 | }; | 2417 | }; |
2413 | 2418 | ||
2414 | DEFINE_STRUCT_CLK(modem_fck, dpll3_ck_parent_names, aes2_ick_ops); | 2419 | DEFINE_STRUCT_CLK(modem_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
2415 | 2420 | ||
2416 | static struct clk mspro_fck; | 2421 | static struct clk mspro_fck; |
2417 | 2422 | ||
@@ -2710,7 +2715,7 @@ static struct clk_hw_omap sr1_fck_hw = { | |||
2710 | .clkdm_name = "wkup_clkdm", | 2715 | .clkdm_name = "wkup_clkdm", |
2711 | }; | 2716 | }; |
2712 | 2717 | ||
2713 | DEFINE_STRUCT_CLK(sr1_fck, dpll3_ck_parent_names, aes2_ick_ops); | 2718 | DEFINE_STRUCT_CLK(sr1_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
2714 | 2719 | ||
2715 | static struct clk sr2_fck; | 2720 | static struct clk sr2_fck; |
2716 | 2721 | ||
@@ -2724,7 +2729,7 @@ static struct clk_hw_omap sr2_fck_hw = { | |||
2724 | .clkdm_name = "wkup_clkdm", | 2729 | .clkdm_name = "wkup_clkdm", |
2725 | }; | 2730 | }; |
2726 | 2731 | ||
2727 | DEFINE_STRUCT_CLK(sr2_fck, dpll3_ck_parent_names, aes2_ick_ops); | 2732 | DEFINE_STRUCT_CLK(sr2_fck, cpefuse_fck_parent_names, aes2_ick_ops); |
2728 | 2733 | ||
2729 | static struct clk sr_l4_ick; | 2734 | static struct clk sr_l4_ick; |
2730 | 2735 | ||
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index 20e120d071dd..c2da2a0fe5ad 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
@@ -474,7 +474,7 @@ void omap3_noncore_dpll_disable(struct clk_hw *hw) | |||
474 | */ | 474 | */ |
475 | long omap3_noncore_dpll_determine_rate(struct clk_hw *hw, unsigned long rate, | 475 | long omap3_noncore_dpll_determine_rate(struct clk_hw *hw, unsigned long rate, |
476 | unsigned long *best_parent_rate, | 476 | unsigned long *best_parent_rate, |
477 | struct clk **best_parent_clk) | 477 | struct clk_hw **best_parent_clk) |
478 | { | 478 | { |
479 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); | 479 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); |
480 | struct dpll_data *dd; | 480 | struct dpll_data *dd; |
@@ -488,10 +488,10 @@ long omap3_noncore_dpll_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
488 | 488 | ||
489 | if (__clk_get_rate(dd->clk_bypass) == rate && | 489 | if (__clk_get_rate(dd->clk_bypass) == rate && |
490 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { | 490 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { |
491 | *best_parent_clk = dd->clk_bypass; | 491 | *best_parent_clk = __clk_get_hw(dd->clk_bypass); |
492 | } else { | 492 | } else { |
493 | rate = omap2_dpll_round_rate(hw, rate, best_parent_rate); | 493 | rate = omap2_dpll_round_rate(hw, rate, best_parent_rate); |
494 | *best_parent_clk = dd->clk_ref; | 494 | *best_parent_clk = __clk_get_hw(dd->clk_ref); |
495 | } | 495 | } |
496 | 496 | ||
497 | *best_parent_rate = rate; | 497 | *best_parent_rate = rate; |
diff --git a/arch/arm/mach-omap2/dpll44xx.c b/arch/arm/mach-omap2/dpll44xx.c index 535822fcf4bb..0e58e5a85d53 100644 --- a/arch/arm/mach-omap2/dpll44xx.c +++ b/arch/arm/mach-omap2/dpll44xx.c | |||
@@ -223,7 +223,7 @@ out: | |||
223 | */ | 223 | */ |
224 | long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, unsigned long rate, | 224 | long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, unsigned long rate, |
225 | unsigned long *best_parent_rate, | 225 | unsigned long *best_parent_rate, |
226 | struct clk **best_parent_clk) | 226 | struct clk_hw **best_parent_clk) |
227 | { | 227 | { |
228 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); | 228 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); |
229 | struct dpll_data *dd; | 229 | struct dpll_data *dd; |
@@ -237,11 +237,11 @@ long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
237 | 237 | ||
238 | if (__clk_get_rate(dd->clk_bypass) == rate && | 238 | if (__clk_get_rate(dd->clk_bypass) == rate && |
239 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { | 239 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { |
240 | *best_parent_clk = dd->clk_bypass; | 240 | *best_parent_clk = __clk_get_hw(dd->clk_bypass); |
241 | } else { | 241 | } else { |
242 | rate = omap4_dpll_regm4xen_round_rate(hw, rate, | 242 | rate = omap4_dpll_regm4xen_round_rate(hw, rate, |
243 | best_parent_rate); | 243 | best_parent_rate); |
244 | *best_parent_clk = dd->clk_ref; | 244 | *best_parent_clk = __clk_get_hw(dd->clk_ref); |
245 | } | 245 | } |
246 | 246 | ||
247 | *best_parent_rate = rate; | 247 | *best_parent_rate = rate; |
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index dd301be89ecc..5376d908eabe 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | # CONFIG_LOCALVERSION_AUTO is not set | 1 | # CONFIG_LOCALVERSION_AUTO is not set |
2 | CONFIG_SYSVIPC=y | 2 | CONFIG_SYSVIPC=y |
3 | CONFIG_POSIX_MQUEUE=y | 3 | CONFIG_POSIX_MQUEUE=y |
4 | CONFIG_FHANDLE=y | ||
4 | CONFIG_AUDIT=y | 5 | CONFIG_AUDIT=y |
5 | CONFIG_NO_HZ_IDLE=y | 6 | CONFIG_NO_HZ_IDLE=y |
6 | CONFIG_HIGH_RES_TIMERS=y | 7 | CONFIG_HIGH_RES_TIMERS=y |
@@ -13,14 +14,12 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
13 | CONFIG_IKCONFIG=y | 14 | CONFIG_IKCONFIG=y |
14 | CONFIG_IKCONFIG_PROC=y | 15 | CONFIG_IKCONFIG_PROC=y |
15 | CONFIG_LOG_BUF_SHIFT=14 | 16 | CONFIG_LOG_BUF_SHIFT=14 |
16 | CONFIG_RESOURCE_COUNTERS=y | ||
17 | CONFIG_MEMCG=y | 17 | CONFIG_MEMCG=y |
18 | CONFIG_MEMCG_SWAP=y | 18 | CONFIG_MEMCG_SWAP=y |
19 | CONFIG_MEMCG_KMEM=y | 19 | CONFIG_MEMCG_KMEM=y |
20 | CONFIG_CGROUP_HUGETLB=y | 20 | CONFIG_CGROUP_HUGETLB=y |
21 | # CONFIG_UTS_NS is not set | 21 | # CONFIG_UTS_NS is not set |
22 | # CONFIG_IPC_NS is not set | 22 | # CONFIG_IPC_NS is not set |
23 | # CONFIG_PID_NS is not set | ||
24 | # CONFIG_NET_NS is not set | 23 | # CONFIG_NET_NS is not set |
25 | CONFIG_SCHED_AUTOGROUP=y | 24 | CONFIG_SCHED_AUTOGROUP=y |
26 | CONFIG_BLK_DEV_INITRD=y | 25 | CONFIG_BLK_DEV_INITRD=y |
@@ -92,7 +91,6 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | |||
92 | CONFIG_SERIAL_OF_PLATFORM=y | 91 | CONFIG_SERIAL_OF_PLATFORM=y |
93 | CONFIG_VIRTIO_CONSOLE=y | 92 | CONFIG_VIRTIO_CONSOLE=y |
94 | # CONFIG_HW_RANDOM is not set | 93 | # CONFIG_HW_RANDOM is not set |
95 | # CONFIG_HMC_DRV is not set | ||
96 | CONFIG_SPI=y | 94 | CONFIG_SPI=y |
97 | CONFIG_SPI_PL022=y | 95 | CONFIG_SPI_PL022=y |
98 | CONFIG_GPIO_PL061=y | 96 | CONFIG_GPIO_PL061=y |
@@ -133,6 +131,8 @@ CONFIG_EXT3_FS=y | |||
133 | CONFIG_EXT4_FS=y | 131 | CONFIG_EXT4_FS=y |
134 | CONFIG_FANOTIFY=y | 132 | CONFIG_FANOTIFY=y |
135 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y | 133 | CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y |
134 | CONFIG_QUOTA=y | ||
135 | CONFIG_AUTOFS4_FS=y | ||
136 | CONFIG_FUSE_FS=y | 136 | CONFIG_FUSE_FS=y |
137 | CONFIG_CUSE=y | 137 | CONFIG_CUSE=y |
138 | CONFIG_VFAT_FS=y | 138 | CONFIG_VFAT_FS=y |
@@ -152,14 +152,15 @@ CONFIG_MAGIC_SYSRQ=y | |||
152 | CONFIG_DEBUG_KERNEL=y | 152 | CONFIG_DEBUG_KERNEL=y |
153 | CONFIG_LOCKUP_DETECTOR=y | 153 | CONFIG_LOCKUP_DETECTOR=y |
154 | # CONFIG_SCHED_DEBUG is not set | 154 | # CONFIG_SCHED_DEBUG is not set |
155 | # CONFIG_DEBUG_PREEMPT is not set | ||
155 | # CONFIG_FTRACE is not set | 156 | # CONFIG_FTRACE is not set |
157 | CONFIG_KEYS=y | ||
156 | CONFIG_SECURITY=y | 158 | CONFIG_SECURITY=y |
157 | CONFIG_CRYPTO_ANSI_CPRNG=y | 159 | CONFIG_CRYPTO_ANSI_CPRNG=y |
158 | CONFIG_ARM64_CRYPTO=y | 160 | CONFIG_ARM64_CRYPTO=y |
159 | CONFIG_CRYPTO_SHA1_ARM64_CE=y | 161 | CONFIG_CRYPTO_SHA1_ARM64_CE=y |
160 | CONFIG_CRYPTO_SHA2_ARM64_CE=y | 162 | CONFIG_CRYPTO_SHA2_ARM64_CE=y |
161 | CONFIG_CRYPTO_GHASH_ARM64_CE=y | 163 | CONFIG_CRYPTO_GHASH_ARM64_CE=y |
162 | CONFIG_CRYPTO_AES_ARM64_CE=y | ||
163 | CONFIG_CRYPTO_AES_ARM64_CE_CCM=y | 164 | CONFIG_CRYPTO_AES_ARM64_CE_CCM=y |
164 | CONFIG_CRYPTO_AES_ARM64_CE_BLK=y | 165 | CONFIG_CRYPTO_AES_ARM64_CE_BLK=y |
165 | CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y | 166 | CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y |
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h index d34189bceff7..9ce3e680ae1c 100644 --- a/arch/arm64/include/asm/dma-mapping.h +++ b/arch/arm64/include/asm/dma-mapping.h | |||
@@ -52,13 +52,14 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) | |||
52 | dev->archdata.dma_ops = ops; | 52 | dev->archdata.dma_ops = ops; |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline int set_arch_dma_coherent_ops(struct device *dev) | 55 | static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, |
56 | struct iommu_ops *iommu, bool coherent) | ||
56 | { | 57 | { |
57 | dev->archdata.dma_coherent = true; | 58 | dev->archdata.dma_coherent = coherent; |
58 | set_dma_ops(dev, &coherent_swiotlb_dma_ops); | 59 | if (coherent) |
59 | return 0; | 60 | set_dma_ops(dev, &coherent_swiotlb_dma_ops); |
60 | } | 61 | } |
61 | #define set_arch_dma_coherent_ops set_arch_dma_coherent_ops | 62 | #define arch_setup_dma_ops arch_setup_dma_ops |
62 | 63 | ||
63 | /* do not use this function in a driver */ | 64 | /* do not use this function in a driver */ |
64 | static inline bool is_device_dma_coherent(struct device *dev) | 65 | static inline bool is_device_dma_coherent(struct device *dev) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index df22314f57cf..210d632aa5ad 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
@@ -298,7 +298,6 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, | |||
298 | #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) | 298 | #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))) |
299 | #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) | 299 | #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) |
300 | 300 | ||
301 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) | ||
302 | #define pud_write(pud) pte_write(pud_pte(pud)) | 301 | #define pud_write(pud) pte_write(pud_pte(pud)) |
303 | #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) | 302 | #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) |
304 | 303 | ||
@@ -401,7 +400,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | |||
401 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); | 400 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); |
402 | } | 401 | } |
403 | 402 | ||
404 | #define pud_page(pud) pmd_page(pud_pmd(pud)) | 403 | #define pud_page(pud) pfn_to_page(__phys_to_pfn(pud_val(pud) & PHYS_MASK)) |
405 | 404 | ||
406 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ | 405 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ |
407 | 406 | ||
@@ -437,6 +436,8 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) | |||
437 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); | 436 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(addr); |
438 | } | 437 | } |
439 | 438 | ||
439 | #define pgd_page(pgd) pfn_to_page(__phys_to_pfn(pgd_val(pgd) & PHYS_MASK)) | ||
440 | |||
440 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 3 */ | 441 | #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 3 */ |
441 | 442 | ||
442 | #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) | 443 | #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd)) |
diff --git a/arch/arm64/include/asm/spinlock.h b/arch/arm64/include/asm/spinlock.h index c45b7b1b7197..cee128732435 100644 --- a/arch/arm64/include/asm/spinlock.h +++ b/arch/arm64/include/asm/spinlock.h | |||
@@ -99,12 +99,12 @@ static inline int arch_spin_value_unlocked(arch_spinlock_t lock) | |||
99 | 99 | ||
100 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) | 100 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) |
101 | { | 101 | { |
102 | return !arch_spin_value_unlocked(ACCESS_ONCE(*lock)); | 102 | return !arch_spin_value_unlocked(READ_ONCE(*lock)); |
103 | } | 103 | } |
104 | 104 | ||
105 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) | 105 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) |
106 | { | 106 | { |
107 | arch_spinlock_t lockval = ACCESS_ONCE(*lock); | 107 | arch_spinlock_t lockval = READ_ONCE(*lock); |
108 | return (lockval.next - lockval.owner) > 1; | 108 | return (lockval.next - lockval.owner) > 1; |
109 | } | 109 | } |
110 | #define arch_spin_is_contended arch_spin_is_contended | 110 | #define arch_spin_is_contended arch_spin_is_contended |
diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c index 3771b72b6569..2d6b6065fe7f 100644 --- a/arch/arm64/kernel/suspend.c +++ b/arch/arm64/kernel/suspend.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <asm/debug-monitors.h> | 5 | #include <asm/debug-monitors.h> |
6 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
7 | #include <asm/memory.h> | 7 | #include <asm/memory.h> |
8 | #include <asm/mmu_context.h> | ||
8 | #include <asm/smp_plat.h> | 9 | #include <asm/smp_plat.h> |
9 | #include <asm/suspend.h> | 10 | #include <asm/suspend.h> |
10 | #include <asm/tlbflush.h> | 11 | #include <asm/tlbflush.h> |
@@ -98,7 +99,18 @@ int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
98 | */ | 99 | */ |
99 | ret = __cpu_suspend_enter(arg, fn); | 100 | ret = __cpu_suspend_enter(arg, fn); |
100 | if (ret == 0) { | 101 | if (ret == 0) { |
101 | cpu_switch_mm(mm->pgd, mm); | 102 | /* |
103 | * We are resuming from reset with TTBR0_EL1 set to the | ||
104 | * idmap to enable the MMU; restore the active_mm mappings in | ||
105 | * TTBR0_EL1 unless the active_mm == &init_mm, in which case | ||
106 | * the thread entered __cpu_suspend with TTBR0_EL1 set to | ||
107 | * reserved TTBR0 page tables and should be restored as such. | ||
108 | */ | ||
109 | if (mm == &init_mm) | ||
110 | cpu_set_reserved_ttbr0(); | ||
111 | else | ||
112 | cpu_switch_mm(mm->pgd, mm); | ||
113 | |||
102 | flush_tlb_all(); | 114 | flush_tlb_all(); |
103 | 115 | ||
104 | /* | 116 | /* |
diff --git a/arch/mips/alchemy/common/clock.c b/arch/mips/alchemy/common/clock.c index 203e4403c366..48a9dfc55b51 100644 --- a/arch/mips/alchemy/common/clock.c +++ b/arch/mips/alchemy/common/clock.c | |||
@@ -374,7 +374,7 @@ static long alchemy_calc_div(unsigned long rate, unsigned long prate, | |||
374 | 374 | ||
375 | static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate, | 375 | static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate, |
376 | unsigned long *best_parent_rate, | 376 | unsigned long *best_parent_rate, |
377 | struct clk **best_parent_clk, | 377 | struct clk_hw **best_parent_clk, |
378 | int scale, int maxdiv) | 378 | int scale, int maxdiv) |
379 | { | 379 | { |
380 | struct clk *pc, *bpc, *free; | 380 | struct clk *pc, *bpc, *free; |
@@ -453,7 +453,7 @@ static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate, | |||
453 | } | 453 | } |
454 | 454 | ||
455 | *best_parent_rate = bpr; | 455 | *best_parent_rate = bpr; |
456 | *best_parent_clk = bpc; | 456 | *best_parent_clk = __clk_get_hw(bpc); |
457 | return br; | 457 | return br; |
458 | } | 458 | } |
459 | 459 | ||
@@ -547,7 +547,7 @@ static unsigned long alchemy_clk_fgv1_recalc(struct clk_hw *hw, | |||
547 | 547 | ||
548 | static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate, | 548 | static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate, |
549 | unsigned long *best_parent_rate, | 549 | unsigned long *best_parent_rate, |
550 | struct clk **best_parent_clk) | 550 | struct clk_hw **best_parent_clk) |
551 | { | 551 | { |
552 | return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate, | 552 | return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate, |
553 | best_parent_clk, 2, 512); | 553 | best_parent_clk, 2, 512); |
@@ -679,7 +679,7 @@ static unsigned long alchemy_clk_fgv2_recalc(struct clk_hw *hw, | |||
679 | 679 | ||
680 | static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate, | 680 | static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate, |
681 | unsigned long *best_parent_rate, | 681 | unsigned long *best_parent_rate, |
682 | struct clk **best_parent_clk) | 682 | struct clk_hw **best_parent_clk) |
683 | { | 683 | { |
684 | struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); | 684 | struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); |
685 | int scale, maxdiv; | 685 | int scale, maxdiv; |
@@ -898,7 +898,7 @@ static int alchemy_clk_csrc_setr(struct clk_hw *hw, unsigned long rate, | |||
898 | 898 | ||
899 | static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate, | 899 | static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate, |
900 | unsigned long *best_parent_rate, | 900 | unsigned long *best_parent_rate, |
901 | struct clk **best_parent_clk) | 901 | struct clk_hw **best_parent_clk) |
902 | { | 902 | { |
903 | struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); | 903 | struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); |
904 | int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */ | 904 | int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */ |
diff --git a/arch/mips/configs/db1xxx_defconfig b/arch/mips/configs/db1xxx_defconfig index 46e8f7676a15..3bdb72a70364 100644 --- a/arch/mips/configs/db1xxx_defconfig +++ b/arch/mips/configs/db1xxx_defconfig | |||
@@ -36,7 +36,7 @@ CONFIG_PCI=y | |||
36 | CONFIG_PCI_REALLOC_ENABLE_AUTO=y | 36 | CONFIG_PCI_REALLOC_ENABLE_AUTO=y |
37 | CONFIG_PCCARD=y | 37 | CONFIG_PCCARD=y |
38 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | 38 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y |
39 | CONFIG_PM_RUNTIME=y | 39 | CONFIG_PM=y |
40 | CONFIG_NET=y | 40 | CONFIG_NET=y |
41 | CONFIG_PACKET=y | 41 | CONFIG_PACKET=y |
42 | CONFIG_PACKET_DIAG=y | 42 | CONFIG_PACKET_DIAG=y |
diff --git a/arch/mips/configs/lemote2f_defconfig b/arch/mips/configs/lemote2f_defconfig index 227a9de32246..e51aad9a94b1 100644 --- a/arch/mips/configs/lemote2f_defconfig +++ b/arch/mips/configs/lemote2f_defconfig | |||
@@ -37,7 +37,6 @@ CONFIG_MIPS32_N32=y | |||
37 | CONFIG_PM=y | 37 | CONFIG_PM=y |
38 | CONFIG_HIBERNATION=y | 38 | CONFIG_HIBERNATION=y |
39 | CONFIG_PM_STD_PARTITION="/dev/hda3" | 39 | CONFIG_PM_STD_PARTITION="/dev/hda3" |
40 | CONFIG_PM_RUNTIME=y | ||
41 | CONFIG_CPU_FREQ=y | 40 | CONFIG_CPU_FREQ=y |
42 | CONFIG_CPU_FREQ_DEBUG=y | 41 | CONFIG_CPU_FREQ_DEBUG=y |
43 | CONFIG_CPU_FREQ_STAT=m | 42 | CONFIG_CPU_FREQ_STAT=m |
diff --git a/arch/mips/configs/loongson3_defconfig b/arch/mips/configs/loongson3_defconfig index 1c6191ebd583..7eabcd2031ea 100644 --- a/arch/mips/configs/loongson3_defconfig +++ b/arch/mips/configs/loongson3_defconfig | |||
@@ -58,7 +58,7 @@ CONFIG_BINFMT_MISC=m | |||
58 | CONFIG_MIPS32_COMPAT=y | 58 | CONFIG_MIPS32_COMPAT=y |
59 | CONFIG_MIPS32_O32=y | 59 | CONFIG_MIPS32_O32=y |
60 | CONFIG_MIPS32_N32=y | 60 | CONFIG_MIPS32_N32=y |
61 | CONFIG_PM_RUNTIME=y | 61 | CONFIG_PM=y |
62 | CONFIG_NET=y | 62 | CONFIG_NET=y |
63 | CONFIG_PACKET=y | 63 | CONFIG_PACKET=y |
64 | CONFIG_UNIX=y | 64 | CONFIG_UNIX=y |
diff --git a/arch/mips/configs/nlm_xlp_defconfig b/arch/mips/configs/nlm_xlp_defconfig index 70509a48df82..b3d1d37f85ea 100644 --- a/arch/mips/configs/nlm_xlp_defconfig +++ b/arch/mips/configs/nlm_xlp_defconfig | |||
@@ -61,7 +61,7 @@ CONFIG_BINFMT_MISC=y | |||
61 | CONFIG_MIPS32_COMPAT=y | 61 | CONFIG_MIPS32_COMPAT=y |
62 | CONFIG_MIPS32_O32=y | 62 | CONFIG_MIPS32_O32=y |
63 | CONFIG_MIPS32_N32=y | 63 | CONFIG_MIPS32_N32=y |
64 | CONFIG_PM_RUNTIME=y | 64 | CONFIG_PM=y |
65 | CONFIG_PM_DEBUG=y | 65 | CONFIG_PM_DEBUG=y |
66 | CONFIG_NET=y | 66 | CONFIG_NET=y |
67 | CONFIG_PACKET=y | 67 | CONFIG_PACKET=y |
diff --git a/arch/mips/configs/nlm_xlr_defconfig b/arch/mips/configs/nlm_xlr_defconfig index 82207e8079f3..3d8016d6cf3e 100644 --- a/arch/mips/configs/nlm_xlr_defconfig +++ b/arch/mips/configs/nlm_xlr_defconfig | |||
@@ -41,7 +41,7 @@ CONFIG_PCI=y | |||
41 | CONFIG_PCI_MSI=y | 41 | CONFIG_PCI_MSI=y |
42 | CONFIG_PCI_DEBUG=y | 42 | CONFIG_PCI_DEBUG=y |
43 | CONFIG_BINFMT_MISC=m | 43 | CONFIG_BINFMT_MISC=m |
44 | CONFIG_PM_RUNTIME=y | 44 | CONFIG_PM=y |
45 | CONFIG_PM_DEBUG=y | 45 | CONFIG_PM_DEBUG=y |
46 | CONFIG_NET=y | 46 | CONFIG_NET=y |
47 | CONFIG_PACKET=y | 47 | CONFIG_PACKET=y |
diff --git a/arch/mips/mm/gup.c b/arch/mips/mm/gup.c index 7cba480568c8..70795a67a276 100644 --- a/arch/mips/mm/gup.c +++ b/arch/mips/mm/gup.c | |||
@@ -30,7 +30,7 @@ retry: | |||
30 | 30 | ||
31 | return pte; | 31 | return pte; |
32 | #else | 32 | #else |
33 | return ACCESS_ONCE(*ptep); | 33 | return READ_ONCE(*ptep); |
34 | #endif | 34 | #endif |
35 | } | 35 | } |
36 | 36 | ||
diff --git a/arch/parisc/include/asm/ldcw.h b/arch/parisc/include/asm/ldcw.h index d2d11b7055ba..8121aa6db2ff 100644 --- a/arch/parisc/include/asm/ldcw.h +++ b/arch/parisc/include/asm/ldcw.h | |||
@@ -33,11 +33,18 @@ | |||
33 | 33 | ||
34 | #endif /*!CONFIG_PA20*/ | 34 | #endif /*!CONFIG_PA20*/ |
35 | 35 | ||
36 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ | 36 | /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. |
37 | We don't explicitly expose that "*a" may be written as reload | ||
38 | fails to find a register in class R1_REGS when "a" needs to be | ||
39 | reloaded when generating 64-bit PIC code. Instead, we clobber | ||
40 | memory to indicate to the compiler that the assembly code reads | ||
41 | or writes to items other than those listed in the input and output | ||
42 | operands. This may pessimize the code somewhat but __ldcw is | ||
43 | usually used within code blocks surrounded by memory barriors. */ | ||
37 | #define __ldcw(a) ({ \ | 44 | #define __ldcw(a) ({ \ |
38 | unsigned __ret; \ | 45 | unsigned __ret; \ |
39 | __asm__ __volatile__(__LDCW " 0(%2),%0" \ | 46 | __asm__ __volatile__(__LDCW " 0(%1),%0" \ |
40 | : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ | 47 | : "=r" (__ret) : "r" (a) : "memory"); \ |
41 | __ret; \ | 48 | __ret; \ |
42 | }) | 49 | }) |
43 | 50 | ||
diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig index 2e637c881d2b..879de5efb073 100644 --- a/arch/powerpc/configs/ps3_defconfig +++ b/arch/powerpc/configs/ps3_defconfig | |||
@@ -36,7 +36,7 @@ CONFIG_KEXEC=y | |||
36 | CONFIG_SCHED_SMT=y | 36 | CONFIG_SCHED_SMT=y |
37 | CONFIG_CMDLINE_BOOL=y | 37 | CONFIG_CMDLINE_BOOL=y |
38 | CONFIG_CMDLINE="" | 38 | CONFIG_CMDLINE="" |
39 | CONFIG_PM_RUNTIME=y | 39 | CONFIG_PM=y |
40 | CONFIG_PM_DEBUG=y | 40 | CONFIG_PM_DEBUG=y |
41 | # CONFIG_SECCOMP is not set | 41 | # CONFIG_SECCOMP is not set |
42 | # CONFIG_PCI is not set | 42 | # CONFIG_PCI is not set |
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index 8b9ccf02a2c5..8a1be9017730 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c | |||
@@ -227,12 +227,10 @@ static void ipte_lock_simple(struct kvm_vcpu *vcpu) | |||
227 | goto out; | 227 | goto out; |
228 | ic = &vcpu->kvm->arch.sca->ipte_control; | 228 | ic = &vcpu->kvm->arch.sca->ipte_control; |
229 | do { | 229 | do { |
230 | old = *ic; | 230 | old = READ_ONCE(*ic); |
231 | barrier(); | ||
232 | while (old.k) { | 231 | while (old.k) { |
233 | cond_resched(); | 232 | cond_resched(); |
234 | old = *ic; | 233 | old = READ_ONCE(*ic); |
235 | barrier(); | ||
236 | } | 234 | } |
237 | new = old; | 235 | new = old; |
238 | new.k = 1; | 236 | new.k = 1; |
@@ -251,8 +249,7 @@ static void ipte_unlock_simple(struct kvm_vcpu *vcpu) | |||
251 | goto out; | 249 | goto out; |
252 | ic = &vcpu->kvm->arch.sca->ipte_control; | 250 | ic = &vcpu->kvm->arch.sca->ipte_control; |
253 | do { | 251 | do { |
254 | old = *ic; | 252 | old = READ_ONCE(*ic); |
255 | barrier(); | ||
256 | new = old; | 253 | new = old; |
257 | new.k = 0; | 254 | new.k = 0; |
258 | } while (cmpxchg(&ic->val, old.val, new.val) != old.val); | 255 | } while (cmpxchg(&ic->val, old.val, new.val) != old.val); |
@@ -267,12 +264,10 @@ static void ipte_lock_siif(struct kvm_vcpu *vcpu) | |||
267 | 264 | ||
268 | ic = &vcpu->kvm->arch.sca->ipte_control; | 265 | ic = &vcpu->kvm->arch.sca->ipte_control; |
269 | do { | 266 | do { |
270 | old = *ic; | 267 | old = READ_ONCE(*ic); |
271 | barrier(); | ||
272 | while (old.kg) { | 268 | while (old.kg) { |
273 | cond_resched(); | 269 | cond_resched(); |
274 | old = *ic; | 270 | old = READ_ONCE(*ic); |
275 | barrier(); | ||
276 | } | 271 | } |
277 | new = old; | 272 | new = old; |
278 | new.k = 1; | 273 | new.k = 1; |
@@ -286,8 +281,7 @@ static void ipte_unlock_siif(struct kvm_vcpu *vcpu) | |||
286 | 281 | ||
287 | ic = &vcpu->kvm->arch.sca->ipte_control; | 282 | ic = &vcpu->kvm->arch.sca->ipte_control; |
288 | do { | 283 | do { |
289 | old = *ic; | 284 | old = READ_ONCE(*ic); |
290 | barrier(); | ||
291 | new = old; | 285 | new = old; |
292 | new.kh--; | 286 | new.kh--; |
293 | if (!new.kh) | 287 | if (!new.kh) |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index c6b6ee5f38b2..0f09f5285d5e 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -223,7 +223,7 @@ config CPU_SHX3 | |||
223 | config ARCH_SHMOBILE | 223 | config ARCH_SHMOBILE |
224 | bool | 224 | bool |
225 | select ARCH_SUSPEND_POSSIBLE | 225 | select ARCH_SUSPEND_POSSIBLE |
226 | select PM_RUNTIME | 226 | select PM |
227 | 227 | ||
228 | config CPU_HAS_PMU | 228 | config CPU_HAS_PMU |
229 | depends on CPU_SH4 || CPU_SH4A | 229 | depends on CPU_SH4 || CPU_SH4A |
diff --git a/arch/sh/configs/apsh4ad0a_defconfig b/arch/sh/configs/apsh4ad0a_defconfig index ec70475da890..a8d975793b6d 100644 --- a/arch/sh/configs/apsh4ad0a_defconfig +++ b/arch/sh/configs/apsh4ad0a_defconfig | |||
@@ -47,7 +47,7 @@ CONFIG_PREEMPT=y | |||
47 | CONFIG_BINFMT_MISC=y | 47 | CONFIG_BINFMT_MISC=y |
48 | CONFIG_PM=y | 48 | CONFIG_PM=y |
49 | CONFIG_PM_DEBUG=y | 49 | CONFIG_PM_DEBUG=y |
50 | CONFIG_PM_RUNTIME=y | 50 | CONFIG_PM=y |
51 | CONFIG_CPU_IDLE=y | 51 | CONFIG_CPU_IDLE=y |
52 | CONFIG_NET=y | 52 | CONFIG_NET=y |
53 | CONFIG_PACKET=y | 53 | CONFIG_PACKET=y |
diff --git a/arch/sh/configs/sdk7786_defconfig b/arch/sh/configs/sdk7786_defconfig index 76a76a295d74..e7e56a4131b4 100644 --- a/arch/sh/configs/sdk7786_defconfig +++ b/arch/sh/configs/sdk7786_defconfig | |||
@@ -82,7 +82,7 @@ CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | |||
82 | CONFIG_BINFMT_MISC=y | 82 | CONFIG_BINFMT_MISC=y |
83 | CONFIG_PM=y | 83 | CONFIG_PM=y |
84 | CONFIG_PM_DEBUG=y | 84 | CONFIG_PM_DEBUG=y |
85 | CONFIG_PM_RUNTIME=y | 85 | CONFIG_PM=y |
86 | CONFIG_CPU_IDLE=y | 86 | CONFIG_CPU_IDLE=y |
87 | CONFIG_NET=y | 87 | CONFIG_NET=y |
88 | CONFIG_PACKET=y | 88 | CONFIG_PACKET=y |
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index a4efe477ceab..625660f8a2fc 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h | |||
@@ -92,7 +92,7 @@ static __always_inline void arch_spin_lock(arch_spinlock_t *lock) | |||
92 | unsigned count = SPIN_THRESHOLD; | 92 | unsigned count = SPIN_THRESHOLD; |
93 | 93 | ||
94 | do { | 94 | do { |
95 | if (ACCESS_ONCE(lock->tickets.head) == inc.tail) | 95 | if (READ_ONCE(lock->tickets.head) == inc.tail) |
96 | goto out; | 96 | goto out; |
97 | cpu_relax(); | 97 | cpu_relax(); |
98 | } while (--count); | 98 | } while (--count); |
@@ -105,7 +105,7 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock) | |||
105 | { | 105 | { |
106 | arch_spinlock_t old, new; | 106 | arch_spinlock_t old, new; |
107 | 107 | ||
108 | old.tickets = ACCESS_ONCE(lock->tickets); | 108 | old.tickets = READ_ONCE(lock->tickets); |
109 | if (old.tickets.head != (old.tickets.tail & ~TICKET_SLOWPATH_FLAG)) | 109 | if (old.tickets.head != (old.tickets.tail & ~TICKET_SLOWPATH_FLAG)) |
110 | return 0; | 110 | return 0; |
111 | 111 | ||
@@ -162,14 +162,14 @@ static __always_inline void arch_spin_unlock(arch_spinlock_t *lock) | |||
162 | 162 | ||
163 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) | 163 | static inline int arch_spin_is_locked(arch_spinlock_t *lock) |
164 | { | 164 | { |
165 | struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets); | 165 | struct __raw_tickets tmp = READ_ONCE(lock->tickets); |
166 | 166 | ||
167 | return tmp.tail != tmp.head; | 167 | return tmp.tail != tmp.head; |
168 | } | 168 | } |
169 | 169 | ||
170 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) | 170 | static inline int arch_spin_is_contended(arch_spinlock_t *lock) |
171 | { | 171 | { |
172 | struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets); | 172 | struct __raw_tickets tmp = READ_ONCE(lock->tickets); |
173 | 173 | ||
174 | return (__ticket_t)(tmp.tail - tmp.head) > TICKET_LOCK_INC; | 174 | return (__ticket_t)(tmp.tail - tmp.head) > TICKET_LOCK_INC; |
175 | } | 175 | } |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 10fbed126b11..f83fc6c5e0ba 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -4448,7 +4448,7 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm) | |||
4448 | * zap all shadow pages. | 4448 | * zap all shadow pages. |
4449 | */ | 4449 | */ |
4450 | if (unlikely(kvm_current_mmio_generation(kvm) == 0)) { | 4450 | if (unlikely(kvm_current_mmio_generation(kvm) == 0)) { |
4451 | printk_ratelimited(KERN_INFO "kvm: zapping shadow pages for mmio generation wraparound\n"); | 4451 | printk_ratelimited(KERN_DEBUG "kvm: zapping shadow pages for mmio generation wraparound\n"); |
4452 | kvm_mmu_invalidate_zap_all_pages(kvm); | 4452 | kvm_mmu_invalidate_zap_all_pages(kvm); |
4453 | } | 4453 | } |
4454 | } | 4454 | } |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index feb852b04598..d4c58d884838 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -5840,53 +5840,10 @@ static __init int hardware_setup(void) | |||
5840 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); | 5840 | memset(vmx_msr_bitmap_legacy, 0xff, PAGE_SIZE); |
5841 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); | 5841 | memset(vmx_msr_bitmap_longmode, 0xff, PAGE_SIZE); |
5842 | 5842 | ||
5843 | vmx_disable_intercept_for_msr(MSR_FS_BASE, false); | ||
5844 | vmx_disable_intercept_for_msr(MSR_GS_BASE, false); | ||
5845 | vmx_disable_intercept_for_msr(MSR_KERNEL_GS_BASE, true); | ||
5846 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); | ||
5847 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); | ||
5848 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); | ||
5849 | vmx_disable_intercept_for_msr(MSR_IA32_BNDCFGS, true); | ||
5850 | |||
5851 | memcpy(vmx_msr_bitmap_legacy_x2apic, | ||
5852 | vmx_msr_bitmap_legacy, PAGE_SIZE); | ||
5853 | memcpy(vmx_msr_bitmap_longmode_x2apic, | ||
5854 | vmx_msr_bitmap_longmode, PAGE_SIZE); | ||
5855 | |||
5856 | if (enable_apicv) { | ||
5857 | for (msr = 0x800; msr <= 0x8ff; msr++) | ||
5858 | vmx_disable_intercept_msr_read_x2apic(msr); | ||
5859 | |||
5860 | /* According SDM, in x2apic mode, the whole id reg is used. | ||
5861 | * But in KVM, it only use the highest eight bits. Need to | ||
5862 | * intercept it */ | ||
5863 | vmx_enable_intercept_msr_read_x2apic(0x802); | ||
5864 | /* TMCCT */ | ||
5865 | vmx_enable_intercept_msr_read_x2apic(0x839); | ||
5866 | /* TPR */ | ||
5867 | vmx_disable_intercept_msr_write_x2apic(0x808); | ||
5868 | /* EOI */ | ||
5869 | vmx_disable_intercept_msr_write_x2apic(0x80b); | ||
5870 | /* SELF-IPI */ | ||
5871 | vmx_disable_intercept_msr_write_x2apic(0x83f); | ||
5872 | } | ||
5873 | |||
5874 | if (enable_ept) { | ||
5875 | kvm_mmu_set_mask_ptes(0ull, | ||
5876 | (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull, | ||
5877 | (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull, | ||
5878 | 0ull, VMX_EPT_EXECUTABLE_MASK); | ||
5879 | ept_set_mmio_spte_mask(); | ||
5880 | kvm_enable_tdp(); | ||
5881 | } else | ||
5882 | kvm_disable_tdp(); | ||
5883 | |||
5884 | update_ple_window_actual_max(); | ||
5885 | |||
5886 | if (setup_vmcs_config(&vmcs_config) < 0) { | 5843 | if (setup_vmcs_config(&vmcs_config) < 0) { |
5887 | r = -EIO; | 5844 | r = -EIO; |
5888 | goto out7; | 5845 | goto out7; |
5889 | } | 5846 | } |
5890 | 5847 | ||
5891 | if (boot_cpu_has(X86_FEATURE_NX)) | 5848 | if (boot_cpu_has(X86_FEATURE_NX)) |
5892 | kvm_enable_efer_bits(EFER_NX); | 5849 | kvm_enable_efer_bits(EFER_NX); |
@@ -5945,6 +5902,49 @@ static __init int hardware_setup(void) | |||
5945 | if (nested) | 5902 | if (nested) |
5946 | nested_vmx_setup_ctls_msrs(); | 5903 | nested_vmx_setup_ctls_msrs(); |
5947 | 5904 | ||
5905 | vmx_disable_intercept_for_msr(MSR_FS_BASE, false); | ||
5906 | vmx_disable_intercept_for_msr(MSR_GS_BASE, false); | ||
5907 | vmx_disable_intercept_for_msr(MSR_KERNEL_GS_BASE, true); | ||
5908 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_CS, false); | ||
5909 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_ESP, false); | ||
5910 | vmx_disable_intercept_for_msr(MSR_IA32_SYSENTER_EIP, false); | ||
5911 | vmx_disable_intercept_for_msr(MSR_IA32_BNDCFGS, true); | ||
5912 | |||
5913 | memcpy(vmx_msr_bitmap_legacy_x2apic, | ||
5914 | vmx_msr_bitmap_legacy, PAGE_SIZE); | ||
5915 | memcpy(vmx_msr_bitmap_longmode_x2apic, | ||
5916 | vmx_msr_bitmap_longmode, PAGE_SIZE); | ||
5917 | |||
5918 | if (enable_apicv) { | ||
5919 | for (msr = 0x800; msr <= 0x8ff; msr++) | ||
5920 | vmx_disable_intercept_msr_read_x2apic(msr); | ||
5921 | |||
5922 | /* According SDM, in x2apic mode, the whole id reg is used. | ||
5923 | * But in KVM, it only use the highest eight bits. Need to | ||
5924 | * intercept it */ | ||
5925 | vmx_enable_intercept_msr_read_x2apic(0x802); | ||
5926 | /* TMCCT */ | ||
5927 | vmx_enable_intercept_msr_read_x2apic(0x839); | ||
5928 | /* TPR */ | ||
5929 | vmx_disable_intercept_msr_write_x2apic(0x808); | ||
5930 | /* EOI */ | ||
5931 | vmx_disable_intercept_msr_write_x2apic(0x80b); | ||
5932 | /* SELF-IPI */ | ||
5933 | vmx_disable_intercept_msr_write_x2apic(0x83f); | ||
5934 | } | ||
5935 | |||
5936 | if (enable_ept) { | ||
5937 | kvm_mmu_set_mask_ptes(0ull, | ||
5938 | (enable_ept_ad_bits) ? VMX_EPT_ACCESS_BIT : 0ull, | ||
5939 | (enable_ept_ad_bits) ? VMX_EPT_DIRTY_BIT : 0ull, | ||
5940 | 0ull, VMX_EPT_EXECUTABLE_MASK); | ||
5941 | ept_set_mmio_spte_mask(); | ||
5942 | kvm_enable_tdp(); | ||
5943 | } else | ||
5944 | kvm_disable_tdp(); | ||
5945 | |||
5946 | update_ple_window_actual_max(); | ||
5947 | |||
5948 | return alloc_kvm_area(); | 5948 | return alloc_kvm_area(); |
5949 | 5949 | ||
5950 | out7: | 5950 | out7: |
diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c index 207d9aef662d..d7547824e763 100644 --- a/arch/x86/mm/gup.c +++ b/arch/x86/mm/gup.c | |||
@@ -15,7 +15,7 @@ | |||
15 | static inline pte_t gup_get_pte(pte_t *ptep) | 15 | static inline pte_t gup_get_pte(pte_t *ptep) |
16 | { | 16 | { |
17 | #ifndef CONFIG_X86_PAE | 17 | #ifndef CONFIG_X86_PAE |
18 | return ACCESS_ONCE(*ptep); | 18 | return READ_ONCE(*ptep); |
19 | #else | 19 | #else |
20 | /* | 20 | /* |
21 | * With get_user_pages_fast, we walk down the pagetables without taking | 21 | * With get_user_pages_fast, we walk down the pagetables without taking |
diff --git a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c index 19db03667650..dcbbb4ea3cc1 100644 --- a/drivers/char/agp/ali-agp.c +++ b/drivers/char/agp/ali-agp.c | |||
@@ -417,6 +417,6 @@ static void __exit agp_ali_cleanup(void) | |||
417 | module_init(agp_ali_init); | 417 | module_init(agp_ali_init); |
418 | module_exit(agp_ali_cleanup); | 418 | module_exit(agp_ali_cleanup); |
419 | 419 | ||
420 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 420 | MODULE_AUTHOR("Dave Jones"); |
421 | MODULE_LICENSE("GPL and additional rights"); | 421 | MODULE_LICENSE("GPL and additional rights"); |
422 | 422 | ||
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 3b47ed0310e1..0ef350010766 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
@@ -813,6 +813,6 @@ static void __exit agp_amd64_cleanup(void) | |||
813 | module_init(agp_amd64_mod_init); | 813 | module_init(agp_amd64_mod_init); |
814 | module_exit(agp_amd64_cleanup); | 814 | module_exit(agp_amd64_cleanup); |
815 | 815 | ||
816 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>, Andi Kleen"); | 816 | MODULE_AUTHOR("Dave Jones, Andi Kleen"); |
817 | module_param(agp_try_unsupported, bool, 0); | 817 | module_param(agp_try_unsupported, bool, 0); |
818 | MODULE_LICENSE("GPL"); | 818 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c index 18a7a6baa304..75a9786a77e6 100644 --- a/drivers/char/agp/ati-agp.c +++ b/drivers/char/agp/ati-agp.c | |||
@@ -579,6 +579,6 @@ static void __exit agp_ati_cleanup(void) | |||
579 | module_init(agp_ati_init); | 579 | module_init(agp_ati_init); |
580 | module_exit(agp_ati_cleanup); | 580 | module_exit(agp_ati_cleanup); |
581 | 581 | ||
582 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 582 | MODULE_AUTHOR("Dave Jones"); |
583 | MODULE_LICENSE("GPL and additional rights"); | 583 | MODULE_LICENSE("GPL and additional rights"); |
584 | 584 | ||
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 317c28ce8328..38ffb281df97 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
@@ -356,7 +356,7 @@ static __init int agp_setup(char *s) | |||
356 | __setup("agp=", agp_setup); | 356 | __setup("agp=", agp_setup); |
357 | #endif | 357 | #endif |
358 | 358 | ||
359 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 359 | MODULE_AUTHOR("Dave Jones, Jeff Hartmann"); |
360 | MODULE_DESCRIPTION("AGP GART driver"); | 360 | MODULE_DESCRIPTION("AGP GART driver"); |
361 | MODULE_LICENSE("GPL and additional rights"); | 361 | MODULE_LICENSE("GPL and additional rights"); |
362 | MODULE_ALIAS_MISCDEV(AGPGART_MINOR); | 362 | MODULE_ALIAS_MISCDEV(AGPGART_MINOR); |
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index f9b9ca5d31b7..0a21daed5b62 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -920,5 +920,5 @@ static void __exit agp_intel_cleanup(void) | |||
920 | module_init(agp_intel_init); | 920 | module_init(agp_intel_init); |
921 | module_exit(agp_intel_cleanup); | 921 | module_exit(agp_intel_cleanup); |
922 | 922 | ||
923 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 923 | MODULE_AUTHOR("Dave Jones, Various @Intel"); |
924 | MODULE_LICENSE("GPL and additional rights"); | 924 | MODULE_LICENSE("GPL and additional rights"); |
diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c index f3334829e55a..92aa43fa8d70 100644 --- a/drivers/char/agp/intel-gtt.c +++ b/drivers/char/agp/intel-gtt.c | |||
@@ -1438,5 +1438,5 @@ void intel_gmch_remove(void) | |||
1438 | } | 1438 | } |
1439 | EXPORT_SYMBOL(intel_gmch_remove); | 1439 | EXPORT_SYMBOL(intel_gmch_remove); |
1440 | 1440 | ||
1441 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 1441 | MODULE_AUTHOR("Dave Jones, Various @Intel"); |
1442 | MODULE_LICENSE("GPL and additional rights"); | 1442 | MODULE_LICENSE("GPL and additional rights"); |
diff --git a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c index a1861b75eb31..6c8d39cb566e 100644 --- a/drivers/char/agp/nvidia-agp.c +++ b/drivers/char/agp/nvidia-agp.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Nvidia AGPGART routines. | 2 | * Nvidia AGPGART routines. |
3 | * Based upon a 2.4 agpgart diff by the folks from NVIDIA, and hacked up | 3 | * Based upon a 2.4 agpgart diff by the folks from NVIDIA, and hacked up |
4 | * to work in 2.5 by Dave Jones <davej@redhat.com> | 4 | * to work in 2.5 by Dave Jones. |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c index 228f20cddc05..a4961d35e940 100644 --- a/drivers/char/agp/via-agp.c +++ b/drivers/char/agp/via-agp.c | |||
@@ -595,4 +595,4 @@ module_init(agp_via_init); | |||
595 | module_exit(agp_via_cleanup); | 595 | module_exit(agp_via_cleanup); |
596 | 596 | ||
597 | MODULE_LICENSE("GPL"); | 597 | MODULE_LICENSE("GPL"); |
598 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); | 598 | MODULE_AUTHOR("Dave Jones"); |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 5fa83f751378..6b65fa4e0c55 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -199,18 +199,6 @@ struct bmc_device { | |||
199 | int guid_set; | 199 | int guid_set; |
200 | char name[16]; | 200 | char name[16]; |
201 | struct kref usecount; | 201 | struct kref usecount; |
202 | |||
203 | /* bmc device attributes */ | ||
204 | struct device_attribute device_id_attr; | ||
205 | struct device_attribute provides_dev_sdrs_attr; | ||
206 | struct device_attribute revision_attr; | ||
207 | struct device_attribute firmware_rev_attr; | ||
208 | struct device_attribute version_attr; | ||
209 | struct device_attribute add_dev_support_attr; | ||
210 | struct device_attribute manufacturer_id_attr; | ||
211 | struct device_attribute product_id_attr; | ||
212 | struct device_attribute guid_attr; | ||
213 | struct device_attribute aux_firmware_rev_attr; | ||
214 | }; | 202 | }; |
215 | #define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev) | 203 | #define to_bmc_device(x) container_of((x), struct bmc_device, pdev.dev) |
216 | 204 | ||
@@ -2252,7 +2240,7 @@ static ssize_t device_id_show(struct device *dev, | |||
2252 | 2240 | ||
2253 | return snprintf(buf, 10, "%u\n", bmc->id.device_id); | 2241 | return snprintf(buf, 10, "%u\n", bmc->id.device_id); |
2254 | } | 2242 | } |
2255 | DEVICE_ATTR(device_id, S_IRUGO, device_id_show, NULL); | 2243 | static DEVICE_ATTR(device_id, S_IRUGO, device_id_show, NULL); |
2256 | 2244 | ||
2257 | static ssize_t provides_device_sdrs_show(struct device *dev, | 2245 | static ssize_t provides_device_sdrs_show(struct device *dev, |
2258 | struct device_attribute *attr, | 2246 | struct device_attribute *attr, |
@@ -2263,7 +2251,8 @@ static ssize_t provides_device_sdrs_show(struct device *dev, | |||
2263 | return snprintf(buf, 10, "%u\n", | 2251 | return snprintf(buf, 10, "%u\n", |
2264 | (bmc->id.device_revision & 0x80) >> 7); | 2252 | (bmc->id.device_revision & 0x80) >> 7); |
2265 | } | 2253 | } |
2266 | DEVICE_ATTR(provides_device_sdrs, S_IRUGO, provides_device_sdrs_show, NULL); | 2254 | static DEVICE_ATTR(provides_device_sdrs, S_IRUGO, provides_device_sdrs_show, |
2255 | NULL); | ||
2267 | 2256 | ||
2268 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | 2257 | static ssize_t revision_show(struct device *dev, struct device_attribute *attr, |
2269 | char *buf) | 2258 | char *buf) |
@@ -2273,7 +2262,7 @@ static ssize_t revision_show(struct device *dev, struct device_attribute *attr, | |||
2273 | return snprintf(buf, 20, "%u\n", | 2262 | return snprintf(buf, 20, "%u\n", |
2274 | bmc->id.device_revision & 0x0F); | 2263 | bmc->id.device_revision & 0x0F); |
2275 | } | 2264 | } |
2276 | DEVICE_ATTR(revision, S_IRUGO, revision_show, NULL); | 2265 | static DEVICE_ATTR(revision, S_IRUGO, revision_show, NULL); |
2277 | 2266 | ||
2278 | static ssize_t firmware_revision_show(struct device *dev, | 2267 | static ssize_t firmware_revision_show(struct device *dev, |
2279 | struct device_attribute *attr, | 2268 | struct device_attribute *attr, |
@@ -2284,7 +2273,7 @@ static ssize_t firmware_revision_show(struct device *dev, | |||
2284 | return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1, | 2273 | return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1, |
2285 | bmc->id.firmware_revision_2); | 2274 | bmc->id.firmware_revision_2); |
2286 | } | 2275 | } |
2287 | DEVICE_ATTR(firmware_revision, S_IRUGO, firmware_revision_show, NULL); | 2276 | static DEVICE_ATTR(firmware_revision, S_IRUGO, firmware_revision_show, NULL); |
2288 | 2277 | ||
2289 | static ssize_t ipmi_version_show(struct device *dev, | 2278 | static ssize_t ipmi_version_show(struct device *dev, |
2290 | struct device_attribute *attr, | 2279 | struct device_attribute *attr, |
@@ -2296,7 +2285,7 @@ static ssize_t ipmi_version_show(struct device *dev, | |||
2296 | ipmi_version_major(&bmc->id), | 2285 | ipmi_version_major(&bmc->id), |
2297 | ipmi_version_minor(&bmc->id)); | 2286 | ipmi_version_minor(&bmc->id)); |
2298 | } | 2287 | } |
2299 | DEVICE_ATTR(ipmi_version, S_IRUGO, ipmi_version_show, NULL); | 2288 | static DEVICE_ATTR(ipmi_version, S_IRUGO, ipmi_version_show, NULL); |
2300 | 2289 | ||
2301 | static ssize_t add_dev_support_show(struct device *dev, | 2290 | static ssize_t add_dev_support_show(struct device *dev, |
2302 | struct device_attribute *attr, | 2291 | struct device_attribute *attr, |
@@ -2307,7 +2296,8 @@ static ssize_t add_dev_support_show(struct device *dev, | |||
2307 | return snprintf(buf, 10, "0x%02x\n", | 2296 | return snprintf(buf, 10, "0x%02x\n", |
2308 | bmc->id.additional_device_support); | 2297 | bmc->id.additional_device_support); |
2309 | } | 2298 | } |
2310 | DEVICE_ATTR(additional_device_support, S_IRUGO, add_dev_support_show, NULL); | 2299 | static DEVICE_ATTR(additional_device_support, S_IRUGO, add_dev_support_show, |
2300 | NULL); | ||
2311 | 2301 | ||
2312 | static ssize_t manufacturer_id_show(struct device *dev, | 2302 | static ssize_t manufacturer_id_show(struct device *dev, |
2313 | struct device_attribute *attr, | 2303 | struct device_attribute *attr, |
@@ -2317,7 +2307,7 @@ static ssize_t manufacturer_id_show(struct device *dev, | |||
2317 | 2307 | ||
2318 | return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id); | 2308 | return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id); |
2319 | } | 2309 | } |
2320 | DEVICE_ATTR(manufacturer_id, S_IRUGO, manufacturer_id_show, NULL); | 2310 | static DEVICE_ATTR(manufacturer_id, S_IRUGO, manufacturer_id_show, NULL); |
2321 | 2311 | ||
2322 | static ssize_t product_id_show(struct device *dev, | 2312 | static ssize_t product_id_show(struct device *dev, |
2323 | struct device_attribute *attr, | 2313 | struct device_attribute *attr, |
@@ -2327,7 +2317,7 @@ static ssize_t product_id_show(struct device *dev, | |||
2327 | 2317 | ||
2328 | return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id); | 2318 | return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id); |
2329 | } | 2319 | } |
2330 | DEVICE_ATTR(product_id, S_IRUGO, product_id_show, NULL); | 2320 | static DEVICE_ATTR(product_id, S_IRUGO, product_id_show, NULL); |
2331 | 2321 | ||
2332 | static ssize_t aux_firmware_rev_show(struct device *dev, | 2322 | static ssize_t aux_firmware_rev_show(struct device *dev, |
2333 | struct device_attribute *attr, | 2323 | struct device_attribute *attr, |
@@ -2341,7 +2331,7 @@ static ssize_t aux_firmware_rev_show(struct device *dev, | |||
2341 | bmc->id.aux_firmware_revision[1], | 2331 | bmc->id.aux_firmware_revision[1], |
2342 | bmc->id.aux_firmware_revision[0]); | 2332 | bmc->id.aux_firmware_revision[0]); |
2343 | } | 2333 | } |
2344 | DEVICE_ATTR(aux_firmware_revision, S_IRUGO, aux_firmware_rev_show, NULL); | 2334 | static DEVICE_ATTR(aux_firmware_revision, S_IRUGO, aux_firmware_rev_show, NULL); |
2345 | 2335 | ||
2346 | static ssize_t guid_show(struct device *dev, struct device_attribute *attr, | 2336 | static ssize_t guid_show(struct device *dev, struct device_attribute *attr, |
2347 | char *buf) | 2337 | char *buf) |
@@ -2352,7 +2342,7 @@ static ssize_t guid_show(struct device *dev, struct device_attribute *attr, | |||
2352 | (long long) bmc->guid[0], | 2342 | (long long) bmc->guid[0], |
2353 | (long long) bmc->guid[8]); | 2343 | (long long) bmc->guid[8]); |
2354 | } | 2344 | } |
2355 | DEVICE_ATTR(guid, S_IRUGO, guid_show, NULL); | 2345 | static DEVICE_ATTR(guid, S_IRUGO, guid_show, NULL); |
2356 | 2346 | ||
2357 | static struct attribute *bmc_dev_attrs[] = { | 2347 | static struct attribute *bmc_dev_attrs[] = { |
2358 | &dev_attr_device_id.attr, | 2348 | &dev_attr_device_id.attr, |
@@ -2392,10 +2382,10 @@ cleanup_bmc_device(struct kref *ref) | |||
2392 | 2382 | ||
2393 | if (bmc->id.aux_firmware_revision_set) | 2383 | if (bmc->id.aux_firmware_revision_set) |
2394 | device_remove_file(&bmc->pdev.dev, | 2384 | device_remove_file(&bmc->pdev.dev, |
2395 | &bmc->aux_firmware_rev_attr); | 2385 | &dev_attr_aux_firmware_revision); |
2396 | if (bmc->guid_set) | 2386 | if (bmc->guid_set) |
2397 | device_remove_file(&bmc->pdev.dev, | 2387 | device_remove_file(&bmc->pdev.dev, |
2398 | &bmc->guid_attr); | 2388 | &dev_attr_guid); |
2399 | 2389 | ||
2400 | platform_device_unregister(&bmc->pdev); | 2390 | platform_device_unregister(&bmc->pdev); |
2401 | } | 2391 | } |
@@ -2422,16 +2412,14 @@ static int create_bmc_files(struct bmc_device *bmc) | |||
2422 | int err; | 2412 | int err; |
2423 | 2413 | ||
2424 | if (bmc->id.aux_firmware_revision_set) { | 2414 | if (bmc->id.aux_firmware_revision_set) { |
2425 | bmc->aux_firmware_rev_attr.attr.name = "aux_firmware_revision"; | ||
2426 | err = device_create_file(&bmc->pdev.dev, | 2415 | err = device_create_file(&bmc->pdev.dev, |
2427 | &bmc->aux_firmware_rev_attr); | 2416 | &dev_attr_aux_firmware_revision); |
2428 | if (err) | 2417 | if (err) |
2429 | goto out; | 2418 | goto out; |
2430 | } | 2419 | } |
2431 | if (bmc->guid_set) { | 2420 | if (bmc->guid_set) { |
2432 | bmc->guid_attr.attr.name = "guid"; | ||
2433 | err = device_create_file(&bmc->pdev.dev, | 2421 | err = device_create_file(&bmc->pdev.dev, |
2434 | &bmc->guid_attr); | 2422 | &dev_attr_guid); |
2435 | if (err) | 2423 | if (err) |
2436 | goto out_aux_firm; | 2424 | goto out_aux_firm; |
2437 | } | 2425 | } |
@@ -2441,7 +2429,7 @@ static int create_bmc_files(struct bmc_device *bmc) | |||
2441 | out_aux_firm: | 2429 | out_aux_firm: |
2442 | if (bmc->id.aux_firmware_revision_set) | 2430 | if (bmc->id.aux_firmware_revision_set) |
2443 | device_remove_file(&bmc->pdev.dev, | 2431 | device_remove_file(&bmc->pdev.dev, |
2444 | &bmc->aux_firmware_rev_attr); | 2432 | &dev_attr_aux_firmware_revision); |
2445 | out: | 2433 | out: |
2446 | return err; | 2434 | return err; |
2447 | } | 2435 | } |
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index e178ac27e73c..fd5a5e85d7dc 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/dmi.h> | 52 | #include <linux/dmi.h> |
53 | #include <linux/kthread.h> | 53 | #include <linux/kthread.h> |
54 | #include <linux/acpi.h> | 54 | #include <linux/acpi.h> |
55 | #include <linux/ctype.h> | ||
55 | 56 | ||
56 | #define PFX "ipmi_ssif: " | 57 | #define PFX "ipmi_ssif: " |
57 | #define DEVICE_NAME "ipmi_ssif" | 58 | #define DEVICE_NAME "ipmi_ssif" |
diff --git a/drivers/clk/at91/clk-programmable.c b/drivers/clk/at91/clk-programmable.c index 62e2509f9df1..bbdb1b985c91 100644 --- a/drivers/clk/at91/clk-programmable.c +++ b/drivers/clk/at91/clk-programmable.c | |||
@@ -57,7 +57,7 @@ static unsigned long clk_programmable_recalc_rate(struct clk_hw *hw, | |||
57 | static long clk_programmable_determine_rate(struct clk_hw *hw, | 57 | static long clk_programmable_determine_rate(struct clk_hw *hw, |
58 | unsigned long rate, | 58 | unsigned long rate, |
59 | unsigned long *best_parent_rate, | 59 | unsigned long *best_parent_rate, |
60 | struct clk **best_parent_clk) | 60 | struct clk_hw **best_parent_hw) |
61 | { | 61 | { |
62 | struct clk *parent = NULL; | 62 | struct clk *parent = NULL; |
63 | long best_rate = -EINVAL; | 63 | long best_rate = -EINVAL; |
@@ -84,7 +84,7 @@ static long clk_programmable_determine_rate(struct clk_hw *hw, | |||
84 | if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) { | 84 | if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) { |
85 | best_rate = tmp_rate; | 85 | best_rate = tmp_rate; |
86 | *best_parent_rate = parent_rate; | 86 | *best_parent_rate = parent_rate; |
87 | *best_parent_clk = parent; | 87 | *best_parent_hw = __clk_get_hw(parent); |
88 | } | 88 | } |
89 | 89 | ||
90 | if (!best_rate) | 90 | if (!best_rate) |
diff --git a/drivers/clk/bcm/clk-kona.c b/drivers/clk/bcm/clk-kona.c index 95af2e665dd3..1c06f6f3a8c5 100644 --- a/drivers/clk/bcm/clk-kona.c +++ b/drivers/clk/bcm/clk-kona.c | |||
@@ -1032,7 +1032,7 @@ static long kona_peri_clk_round_rate(struct clk_hw *hw, unsigned long rate, | |||
1032 | } | 1032 | } |
1033 | 1033 | ||
1034 | static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate, | 1034 | static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate, |
1035 | unsigned long *best_parent_rate, struct clk **best_parent) | 1035 | unsigned long *best_parent_rate, struct clk_hw **best_parent) |
1036 | { | 1036 | { |
1037 | struct kona_clk *bcm_clk = to_kona_clk(hw); | 1037 | struct kona_clk *bcm_clk = to_kona_clk(hw); |
1038 | struct clk *clk = hw->clk; | 1038 | struct clk *clk = hw->clk; |
@@ -1075,7 +1075,7 @@ static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
1075 | if (delta < best_delta) { | 1075 | if (delta < best_delta) { |
1076 | best_delta = delta; | 1076 | best_delta = delta; |
1077 | best_rate = other_rate; | 1077 | best_rate = other_rate; |
1078 | *best_parent = parent; | 1078 | *best_parent = __clk_get_hw(parent); |
1079 | *best_parent_rate = parent_rate; | 1079 | *best_parent_rate = parent_rate; |
1080 | } | 1080 | } |
1081 | } | 1081 | } |
diff --git a/drivers/clk/clk-composite.c b/drivers/clk/clk-composite.c index b9355daf8065..4386697236a7 100644 --- a/drivers/clk/clk-composite.c +++ b/drivers/clk/clk-composite.c | |||
@@ -57,7 +57,7 @@ static unsigned long clk_composite_recalc_rate(struct clk_hw *hw, | |||
57 | 57 | ||
58 | static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, | 58 | static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, |
59 | unsigned long *best_parent_rate, | 59 | unsigned long *best_parent_rate, |
60 | struct clk **best_parent_p) | 60 | struct clk_hw **best_parent_p) |
61 | { | 61 | { |
62 | struct clk_composite *composite = to_clk_composite(hw); | 62 | struct clk_composite *composite = to_clk_composite(hw); |
63 | const struct clk_ops *rate_ops = composite->rate_ops; | 63 | const struct clk_ops *rate_ops = composite->rate_ops; |
@@ -80,8 +80,9 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
80 | *best_parent_p = NULL; | 80 | *best_parent_p = NULL; |
81 | 81 | ||
82 | if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) { | 82 | if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) { |
83 | *best_parent_p = clk_get_parent(mux_hw->clk); | 83 | parent = clk_get_parent(mux_hw->clk); |
84 | *best_parent_rate = __clk_get_rate(*best_parent_p); | 84 | *best_parent_p = __clk_get_hw(parent); |
85 | *best_parent_rate = __clk_get_rate(parent); | ||
85 | 86 | ||
86 | return rate_ops->round_rate(rate_hw, rate, | 87 | return rate_ops->round_rate(rate_hw, rate, |
87 | best_parent_rate); | 88 | best_parent_rate); |
@@ -103,7 +104,7 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
103 | 104 | ||
104 | if (!rate_diff || !*best_parent_p | 105 | if (!rate_diff || !*best_parent_p |
105 | || best_rate_diff > rate_diff) { | 106 | || best_rate_diff > rate_diff) { |
106 | *best_parent_p = parent; | 107 | *best_parent_p = __clk_get_hw(parent); |
107 | *best_parent_rate = parent_rate; | 108 | *best_parent_rate = parent_rate; |
108 | best_rate_diff = rate_diff; | 109 | best_rate_diff = rate_diff; |
109 | best_rate = tmp_rate; | 110 | best_rate = tmp_rate; |
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 4f96ff3ba728..6e1ecf94bf58 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c | |||
@@ -77,7 +77,7 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index) | |||
77 | 77 | ||
78 | else { | 78 | else { |
79 | if (mux->flags & CLK_MUX_INDEX_BIT) | 79 | if (mux->flags & CLK_MUX_INDEX_BIT) |
80 | index = (1 << ffs(index)); | 80 | index = 1 << index; |
81 | 81 | ||
82 | if (mux->flags & CLK_MUX_INDEX_ONE) | 82 | if (mux->flags & CLK_MUX_INDEX_ONE) |
83 | index++; | 83 | index++; |
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index 87a41038237d..bfa1e64e267d 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c | |||
@@ -218,7 +218,7 @@ static int s2mps11_clk_probe(struct platform_device *pdev) | |||
218 | default: | 218 | default: |
219 | dev_err(&pdev->dev, "Invalid device type\n"); | 219 | dev_err(&pdev->dev, "Invalid device type\n"); |
220 | return -EINVAL; | 220 | return -EINVAL; |
221 | }; | 221 | } |
222 | 222 | ||
223 | /* Store clocks of_node in first element of s2mps11_clks array */ | 223 | /* Store clocks of_node in first element of s2mps11_clks array */ |
224 | s2mps11_clks->clk_np = s2mps11_clk_parse_dt(pdev, clks_init); | 224 | s2mps11_clks->clk_np = s2mps11_clk_parse_dt(pdev, clks_init); |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 4896ae9e23da..f4963b7d4e17 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
@@ -240,7 +240,6 @@ static const struct file_operations clk_dump_fops = { | |||
240 | .release = single_release, | 240 | .release = single_release, |
241 | }; | 241 | }; |
242 | 242 | ||
243 | /* caller must hold prepare_lock */ | ||
244 | static int clk_debug_create_one(struct clk *clk, struct dentry *pdentry) | 243 | static int clk_debug_create_one(struct clk *clk, struct dentry *pdentry) |
245 | { | 244 | { |
246 | struct dentry *d; | 245 | struct dentry *d; |
@@ -354,13 +353,13 @@ out: | |||
354 | mutex_unlock(&clk_debug_lock); | 353 | mutex_unlock(&clk_debug_lock); |
355 | } | 354 | } |
356 | 355 | ||
357 | struct dentry *clk_debugfs_add_file(struct clk *clk, char *name, umode_t mode, | 356 | struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode, |
358 | void *data, const struct file_operations *fops) | 357 | void *data, const struct file_operations *fops) |
359 | { | 358 | { |
360 | struct dentry *d = NULL; | 359 | struct dentry *d = NULL; |
361 | 360 | ||
362 | if (clk->dentry) | 361 | if (hw->clk->dentry) |
363 | d = debugfs_create_file(name, mode, clk->dentry, data, fops); | 362 | d = debugfs_create_file(name, mode, hw->clk->dentry, data, fops); |
364 | 363 | ||
365 | return d; | 364 | return d; |
366 | } | 365 | } |
@@ -574,11 +573,6 @@ unsigned int __clk_get_enable_count(struct clk *clk) | |||
574 | return !clk ? 0 : clk->enable_count; | 573 | return !clk ? 0 : clk->enable_count; |
575 | } | 574 | } |
576 | 575 | ||
577 | unsigned int __clk_get_prepare_count(struct clk *clk) | ||
578 | { | ||
579 | return !clk ? 0 : clk->prepare_count; | ||
580 | } | ||
581 | |||
582 | unsigned long __clk_get_rate(struct clk *clk) | 576 | unsigned long __clk_get_rate(struct clk *clk) |
583 | { | 577 | { |
584 | unsigned long ret; | 578 | unsigned long ret; |
@@ -601,7 +595,7 @@ out: | |||
601 | } | 595 | } |
602 | EXPORT_SYMBOL_GPL(__clk_get_rate); | 596 | EXPORT_SYMBOL_GPL(__clk_get_rate); |
603 | 597 | ||
604 | unsigned long __clk_get_accuracy(struct clk *clk) | 598 | static unsigned long __clk_get_accuracy(struct clk *clk) |
605 | { | 599 | { |
606 | if (!clk) | 600 | if (!clk) |
607 | return 0; | 601 | return 0; |
@@ -707,7 +701,7 @@ struct clk *__clk_lookup(const char *name) | |||
707 | */ | 701 | */ |
708 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, | 702 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, |
709 | unsigned long *best_parent_rate, | 703 | unsigned long *best_parent_rate, |
710 | struct clk **best_parent_p) | 704 | struct clk_hw **best_parent_p) |
711 | { | 705 | { |
712 | struct clk *clk = hw->clk, *parent, *best_parent = NULL; | 706 | struct clk *clk = hw->clk, *parent, *best_parent = NULL; |
713 | int i, num_parents; | 707 | int i, num_parents; |
@@ -743,7 +737,7 @@ long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
743 | 737 | ||
744 | out: | 738 | out: |
745 | if (best_parent) | 739 | if (best_parent) |
746 | *best_parent_p = best_parent; | 740 | *best_parent_p = best_parent->hw; |
747 | *best_parent_rate = best; | 741 | *best_parent_rate = best; |
748 | 742 | ||
749 | return best; | 743 | return best; |
@@ -951,6 +945,7 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) | |||
951 | { | 945 | { |
952 | unsigned long parent_rate = 0; | 946 | unsigned long parent_rate = 0; |
953 | struct clk *parent; | 947 | struct clk *parent; |
948 | struct clk_hw *parent_hw; | ||
954 | 949 | ||
955 | if (!clk) | 950 | if (!clk) |
956 | return 0; | 951 | return 0; |
@@ -959,10 +954,11 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) | |||
959 | if (parent) | 954 | if (parent) |
960 | parent_rate = parent->rate; | 955 | parent_rate = parent->rate; |
961 | 956 | ||
962 | if (clk->ops->determine_rate) | 957 | if (clk->ops->determine_rate) { |
958 | parent_hw = parent ? parent->hw : NULL; | ||
963 | return clk->ops->determine_rate(clk->hw, rate, &parent_rate, | 959 | return clk->ops->determine_rate(clk->hw, rate, &parent_rate, |
964 | &parent); | 960 | &parent_hw); |
965 | else if (clk->ops->round_rate) | 961 | } else if (clk->ops->round_rate) |
966 | return clk->ops->round_rate(clk->hw, rate, &parent_rate); | 962 | return clk->ops->round_rate(clk->hw, rate, &parent_rate); |
967 | else if (clk->flags & CLK_SET_RATE_PARENT) | 963 | else if (clk->flags & CLK_SET_RATE_PARENT) |
968 | return __clk_round_rate(clk->parent, rate); | 964 | return __clk_round_rate(clk->parent, rate); |
@@ -1350,6 +1346,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) | |||
1350 | { | 1346 | { |
1351 | struct clk *top = clk; | 1347 | struct clk *top = clk; |
1352 | struct clk *old_parent, *parent; | 1348 | struct clk *old_parent, *parent; |
1349 | struct clk_hw *parent_hw; | ||
1353 | unsigned long best_parent_rate = 0; | 1350 | unsigned long best_parent_rate = 0; |
1354 | unsigned long new_rate; | 1351 | unsigned long new_rate; |
1355 | int p_index = 0; | 1352 | int p_index = 0; |
@@ -1365,9 +1362,11 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) | |||
1365 | 1362 | ||
1366 | /* find the closest rate and parent clk/rate */ | 1363 | /* find the closest rate and parent clk/rate */ |
1367 | if (clk->ops->determine_rate) { | 1364 | if (clk->ops->determine_rate) { |
1365 | parent_hw = parent ? parent->hw : NULL; | ||
1368 | new_rate = clk->ops->determine_rate(clk->hw, rate, | 1366 | new_rate = clk->ops->determine_rate(clk->hw, rate, |
1369 | &best_parent_rate, | 1367 | &best_parent_rate, |
1370 | &parent); | 1368 | &parent_hw); |
1369 | parent = parent_hw->clk; | ||
1371 | } else if (clk->ops->round_rate) { | 1370 | } else if (clk->ops->round_rate) { |
1372 | new_rate = clk->ops->round_rate(clk->hw, rate, | 1371 | new_rate = clk->ops->round_rate(clk->hw, rate, |
1373 | &best_parent_rate); | 1372 | &best_parent_rate); |
@@ -1614,7 +1613,7 @@ static struct clk *__clk_init_parent(struct clk *clk) | |||
1614 | 1613 | ||
1615 | if (clk->num_parents == 1) { | 1614 | if (clk->num_parents == 1) { |
1616 | if (IS_ERR_OR_NULL(clk->parent)) | 1615 | if (IS_ERR_OR_NULL(clk->parent)) |
1617 | ret = clk->parent = __clk_lookup(clk->parent_names[0]); | 1616 | clk->parent = __clk_lookup(clk->parent_names[0]); |
1618 | ret = clk->parent; | 1617 | ret = clk->parent; |
1619 | goto out; | 1618 | goto out; |
1620 | } | 1619 | } |
@@ -1944,7 +1943,6 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1944 | else | 1943 | else |
1945 | clk->rate = 0; | 1944 | clk->rate = 0; |
1946 | 1945 | ||
1947 | clk_debug_register(clk); | ||
1948 | /* | 1946 | /* |
1949 | * walk the list of orphan clocks and reparent any that are children of | 1947 | * walk the list of orphan clocks and reparent any that are children of |
1950 | * this clock | 1948 | * this clock |
@@ -1979,6 +1977,9 @@ int __clk_init(struct device *dev, struct clk *clk) | |||
1979 | out: | 1977 | out: |
1980 | clk_prepare_unlock(); | 1978 | clk_prepare_unlock(); |
1981 | 1979 | ||
1980 | if (!ret) | ||
1981 | clk_debug_register(clk); | ||
1982 | |||
1982 | return ret; | 1983 | return ret; |
1983 | } | 1984 | } |
1984 | 1985 | ||
@@ -2273,14 +2274,17 @@ int __clk_get(struct clk *clk) | |||
2273 | 2274 | ||
2274 | void __clk_put(struct clk *clk) | 2275 | void __clk_put(struct clk *clk) |
2275 | { | 2276 | { |
2277 | struct module *owner; | ||
2278 | |||
2276 | if (!clk || WARN_ON_ONCE(IS_ERR(clk))) | 2279 | if (!clk || WARN_ON_ONCE(IS_ERR(clk))) |
2277 | return; | 2280 | return; |
2278 | 2281 | ||
2279 | clk_prepare_lock(); | 2282 | clk_prepare_lock(); |
2283 | owner = clk->owner; | ||
2280 | kref_put(&clk->ref, __clk_release); | 2284 | kref_put(&clk->ref, __clk_release); |
2281 | clk_prepare_unlock(); | 2285 | clk_prepare_unlock(); |
2282 | 2286 | ||
2283 | module_put(clk->owner); | 2287 | module_put(owner); |
2284 | } | 2288 | } |
2285 | 2289 | ||
2286 | /*** clk rate change notifiers ***/ | 2290 | /*** clk rate change notifiers ***/ |
diff --git a/drivers/clk/hisilicon/clk-hi3620.c b/drivers/clk/hisilicon/clk-hi3620.c index 339945d2503b..007144f81f50 100644 --- a/drivers/clk/hisilicon/clk-hi3620.c +++ b/drivers/clk/hisilicon/clk-hi3620.c | |||
@@ -38,44 +38,44 @@ | |||
38 | #include "clk.h" | 38 | #include "clk.h" |
39 | 39 | ||
40 | /* clock parent list */ | 40 | /* clock parent list */ |
41 | static const char *timer0_mux_p[] __initdata = { "osc32k", "timerclk01", }; | 41 | static const char *timer0_mux_p[] __initconst = { "osc32k", "timerclk01", }; |
42 | static const char *timer1_mux_p[] __initdata = { "osc32k", "timerclk01", }; | 42 | static const char *timer1_mux_p[] __initconst = { "osc32k", "timerclk01", }; |
43 | static const char *timer2_mux_p[] __initdata = { "osc32k", "timerclk23", }; | 43 | static const char *timer2_mux_p[] __initconst = { "osc32k", "timerclk23", }; |
44 | static const char *timer3_mux_p[] __initdata = { "osc32k", "timerclk23", }; | 44 | static const char *timer3_mux_p[] __initconst = { "osc32k", "timerclk23", }; |
45 | static const char *timer4_mux_p[] __initdata = { "osc32k", "timerclk45", }; | 45 | static const char *timer4_mux_p[] __initconst = { "osc32k", "timerclk45", }; |
46 | static const char *timer5_mux_p[] __initdata = { "osc32k", "timerclk45", }; | 46 | static const char *timer5_mux_p[] __initconst = { "osc32k", "timerclk45", }; |
47 | static const char *timer6_mux_p[] __initdata = { "osc32k", "timerclk67", }; | 47 | static const char *timer6_mux_p[] __initconst = { "osc32k", "timerclk67", }; |
48 | static const char *timer7_mux_p[] __initdata = { "osc32k", "timerclk67", }; | 48 | static const char *timer7_mux_p[] __initconst = { "osc32k", "timerclk67", }; |
49 | static const char *timer8_mux_p[] __initdata = { "osc32k", "timerclk89", }; | 49 | static const char *timer8_mux_p[] __initconst = { "osc32k", "timerclk89", }; |
50 | static const char *timer9_mux_p[] __initdata = { "osc32k", "timerclk89", }; | 50 | static const char *timer9_mux_p[] __initconst = { "osc32k", "timerclk89", }; |
51 | static const char *uart0_mux_p[] __initdata = { "osc26m", "pclk", }; | 51 | static const char *uart0_mux_p[] __initconst = { "osc26m", "pclk", }; |
52 | static const char *uart1_mux_p[] __initdata = { "osc26m", "pclk", }; | 52 | static const char *uart1_mux_p[] __initconst = { "osc26m", "pclk", }; |
53 | static const char *uart2_mux_p[] __initdata = { "osc26m", "pclk", }; | 53 | static const char *uart2_mux_p[] __initconst = { "osc26m", "pclk", }; |
54 | static const char *uart3_mux_p[] __initdata = { "osc26m", "pclk", }; | 54 | static const char *uart3_mux_p[] __initconst = { "osc26m", "pclk", }; |
55 | static const char *uart4_mux_p[] __initdata = { "osc26m", "pclk", }; | 55 | static const char *uart4_mux_p[] __initconst = { "osc26m", "pclk", }; |
56 | static const char *spi0_mux_p[] __initdata = { "osc26m", "rclk_cfgaxi", }; | 56 | static const char *spi0_mux_p[] __initconst = { "osc26m", "rclk_cfgaxi", }; |
57 | static const char *spi1_mux_p[] __initdata = { "osc26m", "rclk_cfgaxi", }; | 57 | static const char *spi1_mux_p[] __initconst = { "osc26m", "rclk_cfgaxi", }; |
58 | static const char *spi2_mux_p[] __initdata = { "osc26m", "rclk_cfgaxi", }; | 58 | static const char *spi2_mux_p[] __initconst = { "osc26m", "rclk_cfgaxi", }; |
59 | /* share axi parent */ | 59 | /* share axi parent */ |
60 | static const char *saxi_mux_p[] __initdata = { "armpll3", "armpll2", }; | 60 | static const char *saxi_mux_p[] __initconst = { "armpll3", "armpll2", }; |
61 | static const char *pwm0_mux_p[] __initdata = { "osc32k", "osc26m", }; | 61 | static const char *pwm0_mux_p[] __initconst = { "osc32k", "osc26m", }; |
62 | static const char *pwm1_mux_p[] __initdata = { "osc32k", "osc26m", }; | 62 | static const char *pwm1_mux_p[] __initconst = { "osc32k", "osc26m", }; |
63 | static const char *sd_mux_p[] __initdata = { "armpll2", "armpll3", }; | 63 | static const char *sd_mux_p[] __initconst = { "armpll2", "armpll3", }; |
64 | static const char *mmc1_mux_p[] __initdata = { "armpll2", "armpll3", }; | 64 | static const char *mmc1_mux_p[] __initconst = { "armpll2", "armpll3", }; |
65 | static const char *mmc1_mux2_p[] __initdata = { "osc26m", "mmc1_div", }; | 65 | static const char *mmc1_mux2_p[] __initconst = { "osc26m", "mmc1_div", }; |
66 | static const char *g2d_mux_p[] __initdata = { "armpll2", "armpll3", }; | 66 | static const char *g2d_mux_p[] __initconst = { "armpll2", "armpll3", }; |
67 | static const char *venc_mux_p[] __initdata = { "armpll2", "armpll3", }; | 67 | static const char *venc_mux_p[] __initconst = { "armpll2", "armpll3", }; |
68 | static const char *vdec_mux_p[] __initdata = { "armpll2", "armpll3", }; | 68 | static const char *vdec_mux_p[] __initconst = { "armpll2", "armpll3", }; |
69 | static const char *vpp_mux_p[] __initdata = { "armpll2", "armpll3", }; | 69 | static const char *vpp_mux_p[] __initconst = { "armpll2", "armpll3", }; |
70 | static const char *edc0_mux_p[] __initdata = { "armpll2", "armpll3", }; | 70 | static const char *edc0_mux_p[] __initconst = { "armpll2", "armpll3", }; |
71 | static const char *ldi0_mux_p[] __initdata = { "armpll2", "armpll4", | 71 | static const char *ldi0_mux_p[] __initconst = { "armpll2", "armpll4", |
72 | "armpll3", "armpll5", }; | 72 | "armpll3", "armpll5", }; |
73 | static const char *edc1_mux_p[] __initdata = { "armpll2", "armpll3", }; | 73 | static const char *edc1_mux_p[] __initconst = { "armpll2", "armpll3", }; |
74 | static const char *ldi1_mux_p[] __initdata = { "armpll2", "armpll4", | 74 | static const char *ldi1_mux_p[] __initconst = { "armpll2", "armpll4", |
75 | "armpll3", "armpll5", }; | 75 | "armpll3", "armpll5", }; |
76 | static const char *rclk_hsic_p[] __initdata = { "armpll3", "armpll2", }; | 76 | static const char *rclk_hsic_p[] __initconst = { "armpll3", "armpll2", }; |
77 | static const char *mmc2_mux_p[] __initdata = { "armpll2", "armpll3", }; | 77 | static const char *mmc2_mux_p[] __initconst = { "armpll2", "armpll3", }; |
78 | static const char *mmc3_mux_p[] __initdata = { "armpll2", "armpll3", }; | 78 | static const char *mmc3_mux_p[] __initconst = { "armpll2", "armpll3", }; |
79 | 79 | ||
80 | 80 | ||
81 | /* fixed rate clocks */ | 81 | /* fixed rate clocks */ |
@@ -296,7 +296,7 @@ static unsigned long mmc_clk_recalc_rate(struct clk_hw *hw, | |||
296 | 296 | ||
297 | static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate, | 297 | static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate, |
298 | unsigned long *best_parent_rate, | 298 | unsigned long *best_parent_rate, |
299 | struct clk **best_parent_p) | 299 | struct clk_hw **best_parent_p) |
300 | { | 300 | { |
301 | struct clk_mmc *mclk = to_mmc(hw); | 301 | struct clk_mmc *mclk = to_mmc(hw); |
302 | unsigned long best = 0; | 302 | unsigned long best = 0; |
diff --git a/drivers/clk/mmp/Makefile b/drivers/clk/mmp/Makefile index 392d78044ce3..3caaf7cc169c 100644 --- a/drivers/clk/mmp/Makefile +++ b/drivers/clk/mmp/Makefile | |||
@@ -2,7 +2,12 @@ | |||
2 | # Makefile for mmp specific clk | 2 | # Makefile for mmp specific clk |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += clk-apbc.o clk-apmu.o clk-frac.o | 5 | obj-y += clk-apbc.o clk-apmu.o clk-frac.o clk-mix.o clk-gate.o clk.o |
6 | |||
7 | obj-$(CONFIG_RESET_CONTROLLER) += reset.o | ||
8 | |||
9 | obj-$(CONFIG_MACH_MMP_DT) += clk-of-pxa168.o clk-of-pxa910.o | ||
10 | obj-$(CONFIG_MACH_MMP2_DT) += clk-of-mmp2.o | ||
6 | 11 | ||
7 | obj-$(CONFIG_CPU_PXA168) += clk-pxa168.o | 12 | obj-$(CONFIG_CPU_PXA168) += clk-pxa168.o |
8 | obj-$(CONFIG_CPU_PXA910) += clk-pxa910.o | 13 | obj-$(CONFIG_CPU_PXA910) += clk-pxa910.o |
diff --git a/drivers/clk/mmp/clk-frac.c b/drivers/clk/mmp/clk-frac.c index 23a56f561812..584a9927993b 100644 --- a/drivers/clk/mmp/clk-frac.c +++ b/drivers/clk/mmp/clk-frac.c | |||
@@ -22,19 +22,12 @@ | |||
22 | * numerator/denominator = Fin / (Fout * factor) | 22 | * numerator/denominator = Fin / (Fout * factor) |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #define to_clk_factor(hw) container_of(hw, struct clk_factor, hw) | 25 | #define to_clk_factor(hw) container_of(hw, struct mmp_clk_factor, hw) |
26 | struct clk_factor { | ||
27 | struct clk_hw hw; | ||
28 | void __iomem *base; | ||
29 | struct clk_factor_masks *masks; | ||
30 | struct clk_factor_tbl *ftbl; | ||
31 | unsigned int ftbl_cnt; | ||
32 | }; | ||
33 | 26 | ||
34 | static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate, | 27 | static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate, |
35 | unsigned long *prate) | 28 | unsigned long *prate) |
36 | { | 29 | { |
37 | struct clk_factor *factor = to_clk_factor(hw); | 30 | struct mmp_clk_factor *factor = to_clk_factor(hw); |
38 | unsigned long rate = 0, prev_rate; | 31 | unsigned long rate = 0, prev_rate; |
39 | int i; | 32 | int i; |
40 | 33 | ||
@@ -58,8 +51,8 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate, | |||
58 | static unsigned long clk_factor_recalc_rate(struct clk_hw *hw, | 51 | static unsigned long clk_factor_recalc_rate(struct clk_hw *hw, |
59 | unsigned long parent_rate) | 52 | unsigned long parent_rate) |
60 | { | 53 | { |
61 | struct clk_factor *factor = to_clk_factor(hw); | 54 | struct mmp_clk_factor *factor = to_clk_factor(hw); |
62 | struct clk_factor_masks *masks = factor->masks; | 55 | struct mmp_clk_factor_masks *masks = factor->masks; |
63 | unsigned int val, num, den; | 56 | unsigned int val, num, den; |
64 | 57 | ||
65 | val = readl_relaxed(factor->base); | 58 | val = readl_relaxed(factor->base); |
@@ -81,11 +74,12 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw, | |||
81 | static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate, | 74 | static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate, |
82 | unsigned long prate) | 75 | unsigned long prate) |
83 | { | 76 | { |
84 | struct clk_factor *factor = to_clk_factor(hw); | 77 | struct mmp_clk_factor *factor = to_clk_factor(hw); |
85 | struct clk_factor_masks *masks = factor->masks; | 78 | struct mmp_clk_factor_masks *masks = factor->masks; |
86 | int i; | 79 | int i; |
87 | unsigned long val; | 80 | unsigned long val; |
88 | unsigned long prev_rate, rate = 0; | 81 | unsigned long prev_rate, rate = 0; |
82 | unsigned long flags = 0; | ||
89 | 83 | ||
90 | for (i = 0; i < factor->ftbl_cnt; i++) { | 84 | for (i = 0; i < factor->ftbl_cnt; i++) { |
91 | prev_rate = rate; | 85 | prev_rate = rate; |
@@ -97,6 +91,9 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate, | |||
97 | if (i > 0) | 91 | if (i > 0) |
98 | i--; | 92 | i--; |
99 | 93 | ||
94 | if (factor->lock) | ||
95 | spin_lock_irqsave(factor->lock, flags); | ||
96 | |||
100 | val = readl_relaxed(factor->base); | 97 | val = readl_relaxed(factor->base); |
101 | 98 | ||
102 | val &= ~(masks->num_mask << masks->num_shift); | 99 | val &= ~(masks->num_mask << masks->num_shift); |
@@ -107,21 +104,65 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate, | |||
107 | 104 | ||
108 | writel_relaxed(val, factor->base); | 105 | writel_relaxed(val, factor->base); |
109 | 106 | ||
107 | if (factor->lock) | ||
108 | spin_unlock_irqrestore(factor->lock, flags); | ||
109 | |||
110 | return 0; | 110 | return 0; |
111 | } | 111 | } |
112 | 112 | ||
113 | static void clk_factor_init(struct clk_hw *hw) | ||
114 | { | ||
115 | struct mmp_clk_factor *factor = to_clk_factor(hw); | ||
116 | struct mmp_clk_factor_masks *masks = factor->masks; | ||
117 | u32 val, num, den; | ||
118 | int i; | ||
119 | unsigned long flags = 0; | ||
120 | |||
121 | if (factor->lock) | ||
122 | spin_lock_irqsave(factor->lock, flags); | ||
123 | |||
124 | val = readl(factor->base); | ||
125 | |||
126 | /* calculate numerator */ | ||
127 | num = (val >> masks->num_shift) & masks->num_mask; | ||
128 | |||
129 | /* calculate denominator */ | ||
130 | den = (val >> masks->den_shift) & masks->den_mask; | ||
131 | |||
132 | for (i = 0; i < factor->ftbl_cnt; i++) | ||
133 | if (den == factor->ftbl[i].den && num == factor->ftbl[i].num) | ||
134 | break; | ||
135 | |||
136 | if (i >= factor->ftbl_cnt) { | ||
137 | val &= ~(masks->num_mask << masks->num_shift); | ||
138 | val |= (factor->ftbl[0].num & masks->num_mask) << | ||
139 | masks->num_shift; | ||
140 | |||
141 | val &= ~(masks->den_mask << masks->den_shift); | ||
142 | val |= (factor->ftbl[0].den & masks->den_mask) << | ||
143 | masks->den_shift; | ||
144 | |||
145 | writel(val, factor->base); | ||
146 | } | ||
147 | |||
148 | if (factor->lock) | ||
149 | spin_unlock_irqrestore(factor->lock, flags); | ||
150 | } | ||
151 | |||
113 | static struct clk_ops clk_factor_ops = { | 152 | static struct clk_ops clk_factor_ops = { |
114 | .recalc_rate = clk_factor_recalc_rate, | 153 | .recalc_rate = clk_factor_recalc_rate, |
115 | .round_rate = clk_factor_round_rate, | 154 | .round_rate = clk_factor_round_rate, |
116 | .set_rate = clk_factor_set_rate, | 155 | .set_rate = clk_factor_set_rate, |
156 | .init = clk_factor_init, | ||
117 | }; | 157 | }; |
118 | 158 | ||
119 | struct clk *mmp_clk_register_factor(const char *name, const char *parent_name, | 159 | struct clk *mmp_clk_register_factor(const char *name, const char *parent_name, |
120 | unsigned long flags, void __iomem *base, | 160 | unsigned long flags, void __iomem *base, |
121 | struct clk_factor_masks *masks, struct clk_factor_tbl *ftbl, | 161 | struct mmp_clk_factor_masks *masks, |
122 | unsigned int ftbl_cnt) | 162 | struct mmp_clk_factor_tbl *ftbl, |
163 | unsigned int ftbl_cnt, spinlock_t *lock) | ||
123 | { | 164 | { |
124 | struct clk_factor *factor; | 165 | struct mmp_clk_factor *factor; |
125 | struct clk_init_data init; | 166 | struct clk_init_data init; |
126 | struct clk *clk; | 167 | struct clk *clk; |
127 | 168 | ||
@@ -142,6 +183,7 @@ struct clk *mmp_clk_register_factor(const char *name, const char *parent_name, | |||
142 | factor->ftbl = ftbl; | 183 | factor->ftbl = ftbl; |
143 | factor->ftbl_cnt = ftbl_cnt; | 184 | factor->ftbl_cnt = ftbl_cnt; |
144 | factor->hw.init = &init; | 185 | factor->hw.init = &init; |
186 | factor->lock = lock; | ||
145 | 187 | ||
146 | init.name = name; | 188 | init.name = name; |
147 | init.ops = &clk_factor_ops; | 189 | init.ops = &clk_factor_ops; |
diff --git a/drivers/clk/mmp/clk-gate.c b/drivers/clk/mmp/clk-gate.c new file mode 100644 index 000000000000..adbd9d64ded2 --- /dev/null +++ b/drivers/clk/mmp/clk-gate.c | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * mmp gate clock operation source file | ||
3 | * | ||
4 | * Copyright (C) 2014 Marvell | ||
5 | * Chao Xie <chao.xie@marvell.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk-provider.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/delay.h> | ||
17 | |||
18 | #include "clk.h" | ||
19 | |||
20 | /* | ||
21 | * Some clocks will have mutiple bits to enable the clocks, and | ||
22 | * the bits to disable the clock is not same as enabling bits. | ||
23 | */ | ||
24 | |||
25 | #define to_clk_mmp_gate(hw) container_of(hw, struct mmp_clk_gate, hw) | ||
26 | |||
27 | static int mmp_clk_gate_enable(struct clk_hw *hw) | ||
28 | { | ||
29 | struct mmp_clk_gate *gate = to_clk_mmp_gate(hw); | ||
30 | struct clk *clk = hw->clk; | ||
31 | unsigned long flags = 0; | ||
32 | unsigned long rate; | ||
33 | u32 tmp; | ||
34 | |||
35 | if (gate->lock) | ||
36 | spin_lock_irqsave(gate->lock, flags); | ||
37 | |||
38 | tmp = readl(gate->reg); | ||
39 | tmp &= ~gate->mask; | ||
40 | tmp |= gate->val_enable; | ||
41 | writel(tmp, gate->reg); | ||
42 | |||
43 | if (gate->lock) | ||
44 | spin_unlock_irqrestore(gate->lock, flags); | ||
45 | |||
46 | if (gate->flags & MMP_CLK_GATE_NEED_DELAY) { | ||
47 | rate = __clk_get_rate(clk); | ||
48 | /* Need delay 2 cycles. */ | ||
49 | udelay(2000000/rate); | ||
50 | } | ||
51 | |||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | static void mmp_clk_gate_disable(struct clk_hw *hw) | ||
56 | { | ||
57 | struct mmp_clk_gate *gate = to_clk_mmp_gate(hw); | ||
58 | unsigned long flags = 0; | ||
59 | u32 tmp; | ||
60 | |||
61 | if (gate->lock) | ||
62 | spin_lock_irqsave(gate->lock, flags); | ||
63 | |||
64 | tmp = readl(gate->reg); | ||
65 | tmp &= ~gate->mask; | ||
66 | tmp |= gate->val_disable; | ||
67 | writel(tmp, gate->reg); | ||
68 | |||
69 | if (gate->lock) | ||
70 | spin_unlock_irqrestore(gate->lock, flags); | ||
71 | } | ||
72 | |||
73 | static int mmp_clk_gate_is_enabled(struct clk_hw *hw) | ||
74 | { | ||
75 | struct mmp_clk_gate *gate = to_clk_mmp_gate(hw); | ||
76 | unsigned long flags = 0; | ||
77 | u32 tmp; | ||
78 | |||
79 | if (gate->lock) | ||
80 | spin_lock_irqsave(gate->lock, flags); | ||
81 | |||
82 | tmp = readl(gate->reg); | ||
83 | |||
84 | if (gate->lock) | ||
85 | spin_unlock_irqrestore(gate->lock, flags); | ||
86 | |||
87 | return (tmp & gate->mask) == gate->val_enable; | ||
88 | } | ||
89 | |||
90 | const struct clk_ops mmp_clk_gate_ops = { | ||
91 | .enable = mmp_clk_gate_enable, | ||
92 | .disable = mmp_clk_gate_disable, | ||
93 | .is_enabled = mmp_clk_gate_is_enabled, | ||
94 | }; | ||
95 | |||
96 | struct clk *mmp_clk_register_gate(struct device *dev, const char *name, | ||
97 | const char *parent_name, unsigned long flags, | ||
98 | void __iomem *reg, u32 mask, u32 val_enable, u32 val_disable, | ||
99 | unsigned int gate_flags, spinlock_t *lock) | ||
100 | { | ||
101 | struct mmp_clk_gate *gate; | ||
102 | struct clk *clk; | ||
103 | struct clk_init_data init; | ||
104 | |||
105 | /* allocate the gate */ | ||
106 | gate = kzalloc(sizeof(*gate), GFP_KERNEL); | ||
107 | if (!gate) { | ||
108 | pr_err("%s:%s could not allocate gate clk\n", __func__, name); | ||
109 | return ERR_PTR(-ENOMEM); | ||
110 | } | ||
111 | |||
112 | init.name = name; | ||
113 | init.ops = &mmp_clk_gate_ops; | ||
114 | init.flags = flags | CLK_IS_BASIC; | ||
115 | init.parent_names = (parent_name ? &parent_name : NULL); | ||
116 | init.num_parents = (parent_name ? 1 : 0); | ||
117 | |||
118 | /* struct clk_gate assignments */ | ||
119 | gate->reg = reg; | ||
120 | gate->mask = mask; | ||
121 | gate->val_enable = val_enable; | ||
122 | gate->val_disable = val_disable; | ||
123 | gate->flags = gate_flags; | ||
124 | gate->lock = lock; | ||
125 | gate->hw.init = &init; | ||
126 | |||
127 | clk = clk_register(dev, &gate->hw); | ||
128 | |||
129 | if (IS_ERR(clk)) | ||
130 | kfree(gate); | ||
131 | |||
132 | return clk; | ||
133 | } | ||
diff --git a/drivers/clk/mmp/clk-mix.c b/drivers/clk/mmp/clk-mix.c new file mode 100644 index 000000000000..48fa53c7ce5e --- /dev/null +++ b/drivers/clk/mmp/clk-mix.c | |||
@@ -0,0 +1,513 @@ | |||
1 | /* | ||
2 | * mmp mix(div and mux) clock operation source file | ||
3 | * | ||
4 | * Copyright (C) 2014 Marvell | ||
5 | * Chao Xie <chao.xie@marvell.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk-provider.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/err.h> | ||
16 | |||
17 | #include "clk.h" | ||
18 | |||
19 | /* | ||
20 | * The mix clock is a clock combined mux and div type clock. | ||
21 | * Because the div field and mux field need to be set at same | ||
22 | * time, we can not divide it into 2 types of clock | ||
23 | */ | ||
24 | |||
25 | #define to_clk_mix(hw) container_of(hw, struct mmp_clk_mix, hw) | ||
26 | |||
27 | static unsigned int _get_maxdiv(struct mmp_clk_mix *mix) | ||
28 | { | ||
29 | unsigned int div_mask = (1 << mix->reg_info.width_div) - 1; | ||
30 | unsigned int maxdiv = 0; | ||
31 | struct clk_div_table *clkt; | ||
32 | |||
33 | if (mix->div_flags & CLK_DIVIDER_ONE_BASED) | ||
34 | return div_mask; | ||
35 | if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) | ||
36 | return 1 << div_mask; | ||
37 | if (mix->div_table) { | ||
38 | for (clkt = mix->div_table; clkt->div; clkt++) | ||
39 | if (clkt->div > maxdiv) | ||
40 | maxdiv = clkt->div; | ||
41 | return maxdiv; | ||
42 | } | ||
43 | return div_mask + 1; | ||
44 | } | ||
45 | |||
46 | static unsigned int _get_div(struct mmp_clk_mix *mix, unsigned int val) | ||
47 | { | ||
48 | struct clk_div_table *clkt; | ||
49 | |||
50 | if (mix->div_flags & CLK_DIVIDER_ONE_BASED) | ||
51 | return val; | ||
52 | if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) | ||
53 | return 1 << val; | ||
54 | if (mix->div_table) { | ||
55 | for (clkt = mix->div_table; clkt->div; clkt++) | ||
56 | if (clkt->val == val) | ||
57 | return clkt->div; | ||
58 | if (clkt->div == 0) | ||
59 | return 0; | ||
60 | } | ||
61 | return val + 1; | ||
62 | } | ||
63 | |||
64 | static unsigned int _get_mux(struct mmp_clk_mix *mix, unsigned int val) | ||
65 | { | ||
66 | int num_parents = __clk_get_num_parents(mix->hw.clk); | ||
67 | int i; | ||
68 | |||
69 | if (mix->mux_flags & CLK_MUX_INDEX_BIT) | ||
70 | return ffs(val) - 1; | ||
71 | if (mix->mux_flags & CLK_MUX_INDEX_ONE) | ||
72 | return val - 1; | ||
73 | if (mix->mux_table) { | ||
74 | for (i = 0; i < num_parents; i++) | ||
75 | if (mix->mux_table[i] == val) | ||
76 | return i; | ||
77 | if (i == num_parents) | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | return val; | ||
82 | } | ||
83 | static unsigned int _get_div_val(struct mmp_clk_mix *mix, unsigned int div) | ||
84 | { | ||
85 | struct clk_div_table *clkt; | ||
86 | |||
87 | if (mix->div_flags & CLK_DIVIDER_ONE_BASED) | ||
88 | return div; | ||
89 | if (mix->div_flags & CLK_DIVIDER_POWER_OF_TWO) | ||
90 | return __ffs(div); | ||
91 | if (mix->div_table) { | ||
92 | for (clkt = mix->div_table; clkt->div; clkt++) | ||
93 | if (clkt->div == div) | ||
94 | return clkt->val; | ||
95 | if (clkt->div == 0) | ||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | return div - 1; | ||
100 | } | ||
101 | |||
102 | static unsigned int _get_mux_val(struct mmp_clk_mix *mix, unsigned int mux) | ||
103 | { | ||
104 | if (mix->mux_table) | ||
105 | return mix->mux_table[mux]; | ||
106 | |||
107 | return mux; | ||
108 | } | ||
109 | |||
110 | static void _filter_clk_table(struct mmp_clk_mix *mix, | ||
111 | struct mmp_clk_mix_clk_table *table, | ||
112 | unsigned int table_size) | ||
113 | { | ||
114 | int i; | ||
115 | struct mmp_clk_mix_clk_table *item; | ||
116 | struct clk *parent, *clk; | ||
117 | unsigned long parent_rate; | ||
118 | |||
119 | clk = mix->hw.clk; | ||
120 | |||
121 | for (i = 0; i < table_size; i++) { | ||
122 | item = &table[i]; | ||
123 | parent = clk_get_parent_by_index(clk, item->parent_index); | ||
124 | parent_rate = __clk_get_rate(parent); | ||
125 | if (parent_rate % item->rate) { | ||
126 | item->valid = 0; | ||
127 | } else { | ||
128 | item->divisor = parent_rate / item->rate; | ||
129 | item->valid = 1; | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | |||
134 | static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val, | ||
135 | unsigned int change_mux, unsigned int change_div) | ||
136 | { | ||
137 | struct mmp_clk_mix_reg_info *ri = &mix->reg_info; | ||
138 | u8 width, shift; | ||
139 | u32 mux_div, fc_req; | ||
140 | int ret, timeout = 50; | ||
141 | unsigned long flags = 0; | ||
142 | |||
143 | if (!change_mux && !change_div) | ||
144 | return -EINVAL; | ||
145 | |||
146 | if (mix->lock) | ||
147 | spin_lock_irqsave(mix->lock, flags); | ||
148 | |||
149 | if (mix->type == MMP_CLK_MIX_TYPE_V1 | ||
150 | || mix->type == MMP_CLK_MIX_TYPE_V2) | ||
151 | mux_div = readl(ri->reg_clk_ctrl); | ||
152 | else | ||
153 | mux_div = readl(ri->reg_clk_sel); | ||
154 | |||
155 | if (change_div) { | ||
156 | width = ri->width_div; | ||
157 | shift = ri->shift_div; | ||
158 | mux_div &= ~MMP_CLK_BITS_MASK(width, shift); | ||
159 | mux_div |= MMP_CLK_BITS_SET_VAL(div_val, width, shift); | ||
160 | } | ||
161 | |||
162 | if (change_mux) { | ||
163 | width = ri->width_mux; | ||
164 | shift = ri->shift_mux; | ||
165 | mux_div &= ~MMP_CLK_BITS_MASK(width, shift); | ||
166 | mux_div |= MMP_CLK_BITS_SET_VAL(mux_val, width, shift); | ||
167 | } | ||
168 | |||
169 | if (mix->type == MMP_CLK_MIX_TYPE_V1) { | ||
170 | writel(mux_div, ri->reg_clk_ctrl); | ||
171 | } else if (mix->type == MMP_CLK_MIX_TYPE_V2) { | ||
172 | mux_div |= (1 << ri->bit_fc); | ||
173 | writel(mux_div, ri->reg_clk_ctrl); | ||
174 | |||
175 | do { | ||
176 | fc_req = readl(ri->reg_clk_ctrl); | ||
177 | timeout--; | ||
178 | if (!(fc_req & (1 << ri->bit_fc))) | ||
179 | break; | ||
180 | } while (timeout); | ||
181 | |||
182 | if (timeout == 0) { | ||
183 | pr_err("%s:%s cannot do frequency change\n", | ||
184 | __func__, __clk_get_name(mix->hw.clk)); | ||
185 | ret = -EBUSY; | ||
186 | goto error; | ||
187 | } | ||
188 | } else { | ||
189 | fc_req = readl(ri->reg_clk_ctrl); | ||
190 | fc_req |= 1 << ri->bit_fc; | ||
191 | writel(fc_req, ri->reg_clk_ctrl); | ||
192 | writel(mux_div, ri->reg_clk_sel); | ||
193 | fc_req &= ~(1 << ri->bit_fc); | ||
194 | } | ||
195 | |||
196 | ret = 0; | ||
197 | error: | ||
198 | if (mix->lock) | ||
199 | spin_unlock_irqrestore(mix->lock, flags); | ||
200 | |||
201 | return ret; | ||
202 | } | ||
203 | |||
204 | static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate, | ||
205 | unsigned long *best_parent_rate, | ||
206 | struct clk_hw **best_parent_clk) | ||
207 | { | ||
208 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
209 | struct mmp_clk_mix_clk_table *item; | ||
210 | struct clk *parent, *parent_best, *mix_clk; | ||
211 | unsigned long parent_rate, mix_rate, mix_rate_best, parent_rate_best; | ||
212 | unsigned long gap, gap_best; | ||
213 | u32 div_val_max; | ||
214 | unsigned int div; | ||
215 | int i, j; | ||
216 | |||
217 | mix_clk = hw->clk; | ||
218 | |||
219 | parent = NULL; | ||
220 | mix_rate_best = 0; | ||
221 | parent_rate_best = 0; | ||
222 | gap_best = rate; | ||
223 | parent_best = NULL; | ||
224 | |||
225 | if (mix->table) { | ||
226 | for (i = 0; i < mix->table_size; i++) { | ||
227 | item = &mix->table[i]; | ||
228 | if (item->valid == 0) | ||
229 | continue; | ||
230 | parent = clk_get_parent_by_index(mix_clk, | ||
231 | item->parent_index); | ||
232 | parent_rate = __clk_get_rate(parent); | ||
233 | mix_rate = parent_rate / item->divisor; | ||
234 | gap = abs(mix_rate - rate); | ||
235 | if (parent_best == NULL || gap < gap_best) { | ||
236 | parent_best = parent; | ||
237 | parent_rate_best = parent_rate; | ||
238 | mix_rate_best = mix_rate; | ||
239 | gap_best = gap; | ||
240 | if (gap_best == 0) | ||
241 | goto found; | ||
242 | } | ||
243 | } | ||
244 | } else { | ||
245 | for (i = 0; i < __clk_get_num_parents(mix_clk); i++) { | ||
246 | parent = clk_get_parent_by_index(mix_clk, i); | ||
247 | parent_rate = __clk_get_rate(parent); | ||
248 | div_val_max = _get_maxdiv(mix); | ||
249 | for (j = 0; j < div_val_max; j++) { | ||
250 | div = _get_div(mix, j); | ||
251 | mix_rate = parent_rate / div; | ||
252 | gap = abs(mix_rate - rate); | ||
253 | if (parent_best == NULL || gap < gap_best) { | ||
254 | parent_best = parent; | ||
255 | parent_rate_best = parent_rate; | ||
256 | mix_rate_best = mix_rate; | ||
257 | gap_best = gap; | ||
258 | if (gap_best == 0) | ||
259 | goto found; | ||
260 | } | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | |||
265 | found: | ||
266 | *best_parent_rate = parent_rate_best; | ||
267 | *best_parent_clk = __clk_get_hw(parent_best); | ||
268 | |||
269 | return mix_rate_best; | ||
270 | } | ||
271 | |||
272 | static int mmp_clk_mix_set_rate_and_parent(struct clk_hw *hw, | ||
273 | unsigned long rate, | ||
274 | unsigned long parent_rate, | ||
275 | u8 index) | ||
276 | { | ||
277 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
278 | unsigned int div; | ||
279 | u32 div_val, mux_val; | ||
280 | |||
281 | div = parent_rate / rate; | ||
282 | div_val = _get_div_val(mix, div); | ||
283 | mux_val = _get_mux_val(mix, index); | ||
284 | |||
285 | return _set_rate(mix, mux_val, div_val, 1, 1); | ||
286 | } | ||
287 | |||
288 | static u8 mmp_clk_mix_get_parent(struct clk_hw *hw) | ||
289 | { | ||
290 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
291 | struct mmp_clk_mix_reg_info *ri = &mix->reg_info; | ||
292 | unsigned long flags = 0; | ||
293 | u32 mux_div = 0; | ||
294 | u8 width, shift; | ||
295 | u32 mux_val; | ||
296 | |||
297 | if (mix->lock) | ||
298 | spin_lock_irqsave(mix->lock, flags); | ||
299 | |||
300 | if (mix->type == MMP_CLK_MIX_TYPE_V1 | ||
301 | || mix->type == MMP_CLK_MIX_TYPE_V2) | ||
302 | mux_div = readl(ri->reg_clk_ctrl); | ||
303 | else | ||
304 | mux_div = readl(ri->reg_clk_sel); | ||
305 | |||
306 | if (mix->lock) | ||
307 | spin_unlock_irqrestore(mix->lock, flags); | ||
308 | |||
309 | width = mix->reg_info.width_mux; | ||
310 | shift = mix->reg_info.shift_mux; | ||
311 | |||
312 | mux_val = MMP_CLK_BITS_GET_VAL(mux_div, width, shift); | ||
313 | |||
314 | return _get_mux(mix, mux_val); | ||
315 | } | ||
316 | |||
317 | static unsigned long mmp_clk_mix_recalc_rate(struct clk_hw *hw, | ||
318 | unsigned long parent_rate) | ||
319 | { | ||
320 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
321 | struct mmp_clk_mix_reg_info *ri = &mix->reg_info; | ||
322 | unsigned long flags = 0; | ||
323 | u32 mux_div = 0; | ||
324 | u8 width, shift; | ||
325 | unsigned int div; | ||
326 | |||
327 | if (mix->lock) | ||
328 | spin_lock_irqsave(mix->lock, flags); | ||
329 | |||
330 | if (mix->type == MMP_CLK_MIX_TYPE_V1 | ||
331 | || mix->type == MMP_CLK_MIX_TYPE_V2) | ||
332 | mux_div = readl(ri->reg_clk_ctrl); | ||
333 | else | ||
334 | mux_div = readl(ri->reg_clk_sel); | ||
335 | |||
336 | if (mix->lock) | ||
337 | spin_unlock_irqrestore(mix->lock, flags); | ||
338 | |||
339 | width = mix->reg_info.width_div; | ||
340 | shift = mix->reg_info.shift_div; | ||
341 | |||
342 | div = _get_div(mix, MMP_CLK_BITS_GET_VAL(mux_div, width, shift)); | ||
343 | |||
344 | return parent_rate / div; | ||
345 | } | ||
346 | |||
347 | static int mmp_clk_set_parent(struct clk_hw *hw, u8 index) | ||
348 | { | ||
349 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
350 | struct mmp_clk_mix_clk_table *item; | ||
351 | int i; | ||
352 | u32 div_val, mux_val; | ||
353 | |||
354 | if (mix->table) { | ||
355 | for (i = 0; i < mix->table_size; i++) { | ||
356 | item = &mix->table[i]; | ||
357 | if (item->valid == 0) | ||
358 | continue; | ||
359 | if (item->parent_index == index) | ||
360 | break; | ||
361 | } | ||
362 | if (i < mix->table_size) { | ||
363 | div_val = _get_div_val(mix, item->divisor); | ||
364 | mux_val = _get_mux_val(mix, item->parent_index); | ||
365 | } else | ||
366 | return -EINVAL; | ||
367 | } else { | ||
368 | mux_val = _get_mux_val(mix, index); | ||
369 | div_val = 0; | ||
370 | } | ||
371 | |||
372 | return _set_rate(mix, mux_val, div_val, 1, div_val ? 1 : 0); | ||
373 | } | ||
374 | |||
375 | static int mmp_clk_set_rate(struct clk_hw *hw, unsigned long rate, | ||
376 | unsigned long best_parent_rate) | ||
377 | { | ||
378 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
379 | struct mmp_clk_mix_clk_table *item; | ||
380 | unsigned long parent_rate; | ||
381 | unsigned int best_divisor; | ||
382 | struct clk *mix_clk, *parent; | ||
383 | int i; | ||
384 | |||
385 | best_divisor = best_parent_rate / rate; | ||
386 | |||
387 | mix_clk = hw->clk; | ||
388 | if (mix->table) { | ||
389 | for (i = 0; i < mix->table_size; i++) { | ||
390 | item = &mix->table[i]; | ||
391 | if (item->valid == 0) | ||
392 | continue; | ||
393 | parent = clk_get_parent_by_index(mix_clk, | ||
394 | item->parent_index); | ||
395 | parent_rate = __clk_get_rate(parent); | ||
396 | if (parent_rate == best_parent_rate | ||
397 | && item->divisor == best_divisor) | ||
398 | break; | ||
399 | } | ||
400 | if (i < mix->table_size) | ||
401 | return _set_rate(mix, | ||
402 | _get_mux_val(mix, item->parent_index), | ||
403 | _get_div_val(mix, item->divisor), | ||
404 | 1, 1); | ||
405 | else | ||
406 | return -EINVAL; | ||
407 | } else { | ||
408 | for (i = 0; i < __clk_get_num_parents(mix_clk); i++) { | ||
409 | parent = clk_get_parent_by_index(mix_clk, i); | ||
410 | parent_rate = __clk_get_rate(parent); | ||
411 | if (parent_rate == best_parent_rate) | ||
412 | break; | ||
413 | } | ||
414 | if (i < __clk_get_num_parents(mix_clk)) | ||
415 | return _set_rate(mix, _get_mux_val(mix, i), | ||
416 | _get_div_val(mix, best_divisor), 1, 1); | ||
417 | else | ||
418 | return -EINVAL; | ||
419 | } | ||
420 | } | ||
421 | |||
422 | static void mmp_clk_mix_init(struct clk_hw *hw) | ||
423 | { | ||
424 | struct mmp_clk_mix *mix = to_clk_mix(hw); | ||
425 | |||
426 | if (mix->table) | ||
427 | _filter_clk_table(mix, mix->table, mix->table_size); | ||
428 | } | ||
429 | |||
430 | const struct clk_ops mmp_clk_mix_ops = { | ||
431 | .determine_rate = mmp_clk_mix_determine_rate, | ||
432 | .set_rate_and_parent = mmp_clk_mix_set_rate_and_parent, | ||
433 | .set_rate = mmp_clk_set_rate, | ||
434 | .set_parent = mmp_clk_set_parent, | ||
435 | .get_parent = mmp_clk_mix_get_parent, | ||
436 | .recalc_rate = mmp_clk_mix_recalc_rate, | ||
437 | .init = mmp_clk_mix_init, | ||
438 | }; | ||
439 | |||
440 | struct clk *mmp_clk_register_mix(struct device *dev, | ||
441 | const char *name, | ||
442 | const char **parent_names, | ||
443 | u8 num_parents, | ||
444 | unsigned long flags, | ||
445 | struct mmp_clk_mix_config *config, | ||
446 | spinlock_t *lock) | ||
447 | { | ||
448 | struct mmp_clk_mix *mix; | ||
449 | struct clk *clk; | ||
450 | struct clk_init_data init; | ||
451 | size_t table_bytes; | ||
452 | |||
453 | mix = kzalloc(sizeof(*mix), GFP_KERNEL); | ||
454 | if (!mix) { | ||
455 | pr_err("%s:%s: could not allocate mmp mix clk\n", | ||
456 | __func__, name); | ||
457 | return ERR_PTR(-ENOMEM); | ||
458 | } | ||
459 | |||
460 | init.name = name; | ||
461 | init.flags = flags | CLK_GET_RATE_NOCACHE; | ||
462 | init.parent_names = parent_names; | ||
463 | init.num_parents = num_parents; | ||
464 | init.ops = &mmp_clk_mix_ops; | ||
465 | |||
466 | memcpy(&mix->reg_info, &config->reg_info, sizeof(config->reg_info)); | ||
467 | if (config->table) { | ||
468 | table_bytes = sizeof(*config->table) * config->table_size; | ||
469 | mix->table = kzalloc(table_bytes, GFP_KERNEL); | ||
470 | if (!mix->table) { | ||
471 | pr_err("%s:%s: could not allocate mmp mix table\n", | ||
472 | __func__, name); | ||
473 | kfree(mix); | ||
474 | return ERR_PTR(-ENOMEM); | ||
475 | } | ||
476 | memcpy(mix->table, config->table, table_bytes); | ||
477 | mix->table_size = config->table_size; | ||
478 | } | ||
479 | |||
480 | if (config->mux_table) { | ||
481 | table_bytes = sizeof(u32) * num_parents; | ||
482 | mix->mux_table = kzalloc(table_bytes, GFP_KERNEL); | ||
483 | if (!mix->mux_table) { | ||
484 | pr_err("%s:%s: could not allocate mmp mix mux-table\n", | ||
485 | __func__, name); | ||
486 | kfree(mix->table); | ||
487 | kfree(mix); | ||
488 | return ERR_PTR(-ENOMEM); | ||
489 | } | ||
490 | memcpy(mix->mux_table, config->mux_table, table_bytes); | ||
491 | } | ||
492 | |||
493 | mix->div_flags = config->div_flags; | ||
494 | mix->mux_flags = config->mux_flags; | ||
495 | mix->lock = lock; | ||
496 | mix->hw.init = &init; | ||
497 | |||
498 | if (config->reg_info.bit_fc >= 32) | ||
499 | mix->type = MMP_CLK_MIX_TYPE_V1; | ||
500 | else if (config->reg_info.reg_clk_sel) | ||
501 | mix->type = MMP_CLK_MIX_TYPE_V3; | ||
502 | else | ||
503 | mix->type = MMP_CLK_MIX_TYPE_V2; | ||
504 | clk = clk_register(dev, &mix->hw); | ||
505 | |||
506 | if (IS_ERR(clk)) { | ||
507 | kfree(mix->mux_table); | ||
508 | kfree(mix->table); | ||
509 | kfree(mix); | ||
510 | } | ||
511 | |||
512 | return clk; | ||
513 | } | ||
diff --git a/drivers/clk/mmp/clk-mmp2.c b/drivers/clk/mmp/clk-mmp2.c index b2721cae257a..5c90a4230fa3 100644 --- a/drivers/clk/mmp/clk-mmp2.c +++ b/drivers/clk/mmp/clk-mmp2.c | |||
@@ -54,7 +54,7 @@ | |||
54 | 54 | ||
55 | static DEFINE_SPINLOCK(clk_lock); | 55 | static DEFINE_SPINLOCK(clk_lock); |
56 | 56 | ||
57 | static struct clk_factor_masks uart_factor_masks = { | 57 | static struct mmp_clk_factor_masks uart_factor_masks = { |
58 | .factor = 2, | 58 | .factor = 2, |
59 | .num_mask = 0x1fff, | 59 | .num_mask = 0x1fff, |
60 | .den_mask = 0x1fff, | 60 | .den_mask = 0x1fff, |
@@ -62,7 +62,7 @@ static struct clk_factor_masks uart_factor_masks = { | |||
62 | .den_shift = 0, | 62 | .den_shift = 0, |
63 | }; | 63 | }; |
64 | 64 | ||
65 | static struct clk_factor_tbl uart_factor_tbl[] = { | 65 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { |
66 | {.num = 14634, .den = 2165}, /*14.745MHZ */ | 66 | {.num = 14634, .den = 2165}, /*14.745MHZ */ |
67 | {.num = 3521, .den = 689}, /*19.23MHZ */ | 67 | {.num = 3521, .den = 689}, /*19.23MHZ */ |
68 | {.num = 9679, .den = 5728}, /*58.9824MHZ */ | 68 | {.num = 9679, .den = 5728}, /*58.9824MHZ */ |
@@ -191,7 +191,7 @@ void __init mmp2_clk_init(void) | |||
191 | clk = mmp_clk_register_factor("uart_pll", "pll1_4", 0, | 191 | clk = mmp_clk_register_factor("uart_pll", "pll1_4", 0, |
192 | mpmu_base + MPMU_UART_PLL, | 192 | mpmu_base + MPMU_UART_PLL, |
193 | &uart_factor_masks, uart_factor_tbl, | 193 | &uart_factor_masks, uart_factor_tbl, |
194 | ARRAY_SIZE(uart_factor_tbl)); | 194 | ARRAY_SIZE(uart_factor_tbl), &clk_lock); |
195 | clk_set_rate(clk, 14745600); | 195 | clk_set_rate(clk, 14745600); |
196 | clk_register_clkdev(clk, "uart_pll", NULL); | 196 | clk_register_clkdev(clk, "uart_pll", NULL); |
197 | 197 | ||
diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c new file mode 100644 index 000000000000..2cbc2b43ae52 --- /dev/null +++ b/drivers/clk/mmp/clk-of-mmp2.c | |||
@@ -0,0 +1,334 @@ | |||
1 | /* | ||
2 | * mmp2 clock framework source file | ||
3 | * | ||
4 | * Copyright (C) 2012 Marvell | ||
5 | * Chao Xie <xiechao.mail@gmail.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/spinlock.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/of_address.h> | ||
19 | |||
20 | #include <dt-bindings/clock/marvell,mmp2.h> | ||
21 | |||
22 | #include "clk.h" | ||
23 | #include "reset.h" | ||
24 | |||
25 | #define APBC_RTC 0x0 | ||
26 | #define APBC_TWSI0 0x4 | ||
27 | #define APBC_TWSI1 0x8 | ||
28 | #define APBC_TWSI2 0xc | ||
29 | #define APBC_TWSI3 0x10 | ||
30 | #define APBC_TWSI4 0x7c | ||
31 | #define APBC_TWSI5 0x80 | ||
32 | #define APBC_KPC 0x18 | ||
33 | #define APBC_UART0 0x2c | ||
34 | #define APBC_UART1 0x30 | ||
35 | #define APBC_UART2 0x34 | ||
36 | #define APBC_UART3 0x88 | ||
37 | #define APBC_GPIO 0x38 | ||
38 | #define APBC_PWM0 0x3c | ||
39 | #define APBC_PWM1 0x40 | ||
40 | #define APBC_PWM2 0x44 | ||
41 | #define APBC_PWM3 0x48 | ||
42 | #define APBC_SSP0 0x50 | ||
43 | #define APBC_SSP1 0x54 | ||
44 | #define APBC_SSP2 0x58 | ||
45 | #define APBC_SSP3 0x5c | ||
46 | #define APMU_SDH0 0x54 | ||
47 | #define APMU_SDH1 0x58 | ||
48 | #define APMU_SDH2 0xe8 | ||
49 | #define APMU_SDH3 0xec | ||
50 | #define APMU_USB 0x5c | ||
51 | #define APMU_DISP0 0x4c | ||
52 | #define APMU_DISP1 0x110 | ||
53 | #define APMU_CCIC0 0x50 | ||
54 | #define APMU_CCIC1 0xf4 | ||
55 | #define MPMU_UART_PLL 0x14 | ||
56 | |||
57 | struct mmp2_clk_unit { | ||
58 | struct mmp_clk_unit unit; | ||
59 | void __iomem *mpmu_base; | ||
60 | void __iomem *apmu_base; | ||
61 | void __iomem *apbc_base; | ||
62 | }; | ||
63 | |||
64 | static struct mmp_param_fixed_rate_clk fixed_rate_clks[] = { | ||
65 | {MMP2_CLK_CLK32, "clk32", NULL, CLK_IS_ROOT, 32768}, | ||
66 | {MMP2_CLK_VCTCXO, "vctcxo", NULL, CLK_IS_ROOT, 26000000}, | ||
67 | {MMP2_CLK_PLL1, "pll1", NULL, CLK_IS_ROOT, 800000000}, | ||
68 | {MMP2_CLK_PLL2, "pll2", NULL, CLK_IS_ROOT, 960000000}, | ||
69 | {MMP2_CLK_USB_PLL, "usb_pll", NULL, CLK_IS_ROOT, 480000000}, | ||
70 | }; | ||
71 | |||
72 | static struct mmp_param_fixed_factor_clk fixed_factor_clks[] = { | ||
73 | {MMP2_CLK_PLL1_2, "pll1_2", "pll1", 1, 2, 0}, | ||
74 | {MMP2_CLK_PLL1_4, "pll1_4", "pll1_2", 1, 2, 0}, | ||
75 | {MMP2_CLK_PLL1_8, "pll1_8", "pll1_4", 1, 2, 0}, | ||
76 | {MMP2_CLK_PLL1_16, "pll1_16", "pll1_8", 1, 2, 0}, | ||
77 | {MMP2_CLK_PLL1_20, "pll1_20", "pll1_4", 1, 5, 0}, | ||
78 | {MMP2_CLK_PLL1_3, "pll1_3", "pll1", 1, 3, 0}, | ||
79 | {MMP2_CLK_PLL1_6, "pll1_6", "pll1_3", 1, 2, 0}, | ||
80 | {MMP2_CLK_PLL1_12, "pll1_12", "pll1_6", 1, 2, 0}, | ||
81 | {MMP2_CLK_PLL2_2, "pll2_2", "pll2", 1, 2, 0}, | ||
82 | {MMP2_CLK_PLL2_4, "pll2_4", "pll2_2", 1, 2, 0}, | ||
83 | {MMP2_CLK_PLL2_8, "pll2_8", "pll2_4", 1, 2, 0}, | ||
84 | {MMP2_CLK_PLL2_16, "pll2_16", "pll2_8", 1, 2, 0}, | ||
85 | {MMP2_CLK_PLL2_3, "pll2_3", "pll2", 1, 3, 0}, | ||
86 | {MMP2_CLK_PLL2_6, "pll2_6", "pll2_3", 1, 2, 0}, | ||
87 | {MMP2_CLK_PLL2_12, "pll2_12", "pll2_6", 1, 2, 0}, | ||
88 | {MMP2_CLK_VCTCXO_2, "vctcxo_2", "vctcxo", 1, 2, 0}, | ||
89 | {MMP2_CLK_VCTCXO_4, "vctcxo_4", "vctcxo_2", 1, 2, 0}, | ||
90 | }; | ||
91 | |||
92 | static struct mmp_clk_factor_masks uart_factor_masks = { | ||
93 | .factor = 2, | ||
94 | .num_mask = 0x1fff, | ||
95 | .den_mask = 0x1fff, | ||
96 | .num_shift = 16, | ||
97 | .den_shift = 0, | ||
98 | }; | ||
99 | |||
100 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { | ||
101 | {.num = 14634, .den = 2165}, /*14.745MHZ */ | ||
102 | {.num = 3521, .den = 689}, /*19.23MHZ */ | ||
103 | {.num = 9679, .den = 5728}, /*58.9824MHZ */ | ||
104 | {.num = 15850, .den = 9451}, /*59.429MHZ */ | ||
105 | }; | ||
106 | |||
107 | static void mmp2_pll_init(struct mmp2_clk_unit *pxa_unit) | ||
108 | { | ||
109 | struct clk *clk; | ||
110 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
111 | |||
112 | mmp_register_fixed_rate_clks(unit, fixed_rate_clks, | ||
113 | ARRAY_SIZE(fixed_rate_clks)); | ||
114 | |||
115 | mmp_register_fixed_factor_clks(unit, fixed_factor_clks, | ||
116 | ARRAY_SIZE(fixed_factor_clks)); | ||
117 | |||
118 | clk = mmp_clk_register_factor("uart_pll", "pll1_4", | ||
119 | CLK_SET_RATE_PARENT, | ||
120 | pxa_unit->mpmu_base + MPMU_UART_PLL, | ||
121 | &uart_factor_masks, uart_factor_tbl, | ||
122 | ARRAY_SIZE(uart_factor_tbl), NULL); | ||
123 | mmp_clk_add(unit, MMP2_CLK_UART_PLL, clk); | ||
124 | } | ||
125 | |||
126 | static DEFINE_SPINLOCK(uart0_lock); | ||
127 | static DEFINE_SPINLOCK(uart1_lock); | ||
128 | static DEFINE_SPINLOCK(uart2_lock); | ||
129 | static const char *uart_parent_names[] = {"uart_pll", "vctcxo"}; | ||
130 | |||
131 | static DEFINE_SPINLOCK(ssp0_lock); | ||
132 | static DEFINE_SPINLOCK(ssp1_lock); | ||
133 | static DEFINE_SPINLOCK(ssp2_lock); | ||
134 | static DEFINE_SPINLOCK(ssp3_lock); | ||
135 | static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; | ||
136 | |||
137 | static DEFINE_SPINLOCK(reset_lock); | ||
138 | |||
139 | static struct mmp_param_mux_clk apbc_mux_clks[] = { | ||
140 | {0, "uart0_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART0, 4, 3, 0, &uart0_lock}, | ||
141 | {0, "uart1_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART1, 4, 3, 0, &uart1_lock}, | ||
142 | {0, "uart2_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART2, 4, 3, 0, &uart2_lock}, | ||
143 | {0, "uart3_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART3, 4, 3, 0, &uart2_lock}, | ||
144 | {0, "ssp0_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP0, 4, 3, 0, &ssp0_lock}, | ||
145 | {0, "ssp1_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP1, 4, 3, 0, &ssp1_lock}, | ||
146 | {0, "ssp2_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP2, 4, 3, 0, &ssp2_lock}, | ||
147 | {0, "ssp3_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP3, 4, 3, 0, &ssp3_lock}, | ||
148 | }; | ||
149 | |||
150 | static struct mmp_param_gate_clk apbc_gate_clks[] = { | ||
151 | {MMP2_CLK_TWSI0, "twsi0_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI0, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
152 | {MMP2_CLK_TWSI1, "twsi1_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI1, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
153 | {MMP2_CLK_TWSI2, "twsi2_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI2, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
154 | {MMP2_CLK_TWSI3, "twsi3_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI3, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
155 | {MMP2_CLK_TWSI4, "twsi4_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI4, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
156 | {MMP2_CLK_TWSI5, "twsi5_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_TWSI5, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
157 | {MMP2_CLK_GPIO, "gpio_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_GPIO, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
158 | {MMP2_CLK_KPC, "kpc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_KPC, 0x7, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, | ||
159 | {MMP2_CLK_RTC, "rtc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_RTC, 0x87, 0x83, 0x0, MMP_CLK_GATE_NEED_DELAY, &reset_lock}, | ||
160 | {MMP2_CLK_PWM0, "pwm0_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM0, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
161 | {MMP2_CLK_PWM1, "pwm1_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM1, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
162 | {MMP2_CLK_PWM2, "pwm2_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM2, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
163 | {MMP2_CLK_PWM3, "pwm3_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM3, 0x7, 0x3, 0x0, 0, &reset_lock}, | ||
164 | /* The gate clocks has mux parent. */ | ||
165 | {MMP2_CLK_UART0, "uart0_clk", "uart0_mux", CLK_SET_RATE_PARENT, APBC_UART0, 0x7, 0x3, 0x0, 0, &uart0_lock}, | ||
166 | {MMP2_CLK_UART1, "uart1_clk", "uart1_mux", CLK_SET_RATE_PARENT, APBC_UART1, 0x7, 0x3, 0x0, 0, &uart1_lock}, | ||
167 | {MMP2_CLK_UART2, "uart2_clk", "uart2_mux", CLK_SET_RATE_PARENT, APBC_UART2, 0x7, 0x3, 0x0, 0, &uart2_lock}, | ||
168 | {MMP2_CLK_UART3, "uart3_clk", "uart3_mux", CLK_SET_RATE_PARENT, APBC_UART3, 0x7, 0x3, 0x0, 0, &uart2_lock}, | ||
169 | {MMP2_CLK_SSP0, "ssp0_clk", "ssp0_mux", CLK_SET_RATE_PARENT, APBC_SSP0, 0x7, 0x3, 0x0, 0, &ssp0_lock}, | ||
170 | {MMP2_CLK_SSP1, "ssp1_clk", "ssp1_mux", CLK_SET_RATE_PARENT, APBC_SSP1, 0x7, 0x3, 0x0, 0, &ssp1_lock}, | ||
171 | {MMP2_CLK_SSP2, "ssp2_clk", "ssp2_mux", CLK_SET_RATE_PARENT, APBC_SSP2, 0x7, 0x3, 0x0, 0, &ssp2_lock}, | ||
172 | {MMP2_CLK_SSP3, "ssp3_clk", "ssp3_mux", CLK_SET_RATE_PARENT, APBC_SSP3, 0x7, 0x3, 0x0, 0, &ssp3_lock}, | ||
173 | }; | ||
174 | |||
175 | static void mmp2_apb_periph_clk_init(struct mmp2_clk_unit *pxa_unit) | ||
176 | { | ||
177 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
178 | |||
179 | mmp_register_mux_clks(unit, apbc_mux_clks, pxa_unit->apbc_base, | ||
180 | ARRAY_SIZE(apbc_mux_clks)); | ||
181 | |||
182 | mmp_register_gate_clks(unit, apbc_gate_clks, pxa_unit->apbc_base, | ||
183 | ARRAY_SIZE(apbc_gate_clks)); | ||
184 | } | ||
185 | |||
186 | static DEFINE_SPINLOCK(sdh_lock); | ||
187 | static const char *sdh_parent_names[] = {"pll1_4", "pll2", "usb_pll", "pll1"}; | ||
188 | static struct mmp_clk_mix_config sdh_mix_config = { | ||
189 | .reg_info = DEFINE_MIX_REG_INFO(4, 10, 2, 8, 32), | ||
190 | }; | ||
191 | |||
192 | static DEFINE_SPINLOCK(usb_lock); | ||
193 | |||
194 | static DEFINE_SPINLOCK(disp0_lock); | ||
195 | static DEFINE_SPINLOCK(disp1_lock); | ||
196 | static const char *disp_parent_names[] = {"pll1", "pll1_16", "pll2", "vctcxo"}; | ||
197 | |||
198 | static DEFINE_SPINLOCK(ccic0_lock); | ||
199 | static DEFINE_SPINLOCK(ccic1_lock); | ||
200 | static const char *ccic_parent_names[] = {"pll1_2", "pll1_16", "vctcxo"}; | ||
201 | static struct mmp_clk_mix_config ccic0_mix_config = { | ||
202 | .reg_info = DEFINE_MIX_REG_INFO(4, 17, 2, 6, 32), | ||
203 | }; | ||
204 | static struct mmp_clk_mix_config ccic1_mix_config = { | ||
205 | .reg_info = DEFINE_MIX_REG_INFO(4, 16, 2, 6, 32), | ||
206 | }; | ||
207 | |||
208 | static struct mmp_param_mux_clk apmu_mux_clks[] = { | ||
209 | {MMP2_CLK_DISP0_MUX, "disp0_mux", disp_parent_names, ARRAY_SIZE(disp_parent_names), CLK_SET_RATE_PARENT, APMU_DISP0, 6, 2, 0, &disp0_lock}, | ||
210 | {MMP2_CLK_DISP1_MUX, "disp1_mux", disp_parent_names, ARRAY_SIZE(disp_parent_names), CLK_SET_RATE_PARENT, APMU_DISP1, 6, 2, 0, &disp1_lock}, | ||
211 | }; | ||
212 | |||
213 | static struct mmp_param_div_clk apmu_div_clks[] = { | ||
214 | {0, "disp0_div", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 8, 4, 0, &disp0_lock}, | ||
215 | {0, "disp0_sphy_div", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 15, 5, 0, &disp0_lock}, | ||
216 | {0, "disp1_div", "disp1_mux", CLK_SET_RATE_PARENT, APMU_DISP1, 8, 4, 0, &disp1_lock}, | ||
217 | {0, "ccic0_sphy_div", "ccic0_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC0, 10, 5, 0, &ccic0_lock}, | ||
218 | {0, "ccic1_sphy_div", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 10, 5, 0, &ccic1_lock}, | ||
219 | }; | ||
220 | |||
221 | static struct mmp_param_gate_clk apmu_gate_clks[] = { | ||
222 | {MMP2_CLK_USB, "usb_clk", "usb_pll", 0, APMU_USB, 0x9, 0x9, 0x0, 0, &usb_lock}, | ||
223 | /* The gate clocks has mux parent. */ | ||
224 | {MMP2_CLK_SDH0, "sdh0_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, | ||
225 | {MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, | ||
226 | {MMP2_CLK_SDH1, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, | ||
227 | {MMP2_CLK_SDH1, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, | ||
228 | {MMP2_CLK_DISP0, "disp0_clk", "disp0_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1b, 0x1b, 0x0, 0, &disp0_lock}, | ||
229 | {MMP2_CLK_DISP0_SPHY, "disp0_sphy_clk", "disp0_sphy_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1024, 0x1024, 0x0, 0, &disp0_lock}, | ||
230 | {MMP2_CLK_DISP1, "disp1_clk", "disp1_div", CLK_SET_RATE_PARENT, APMU_DISP1, 0x1b, 0x1b, 0x0, 0, &disp1_lock}, | ||
231 | {MMP2_CLK_CCIC_ARBITER, "ccic_arbiter", "vctcxo", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x1800, 0x1800, 0x0, 0, &ccic0_lock}, | ||
232 | {MMP2_CLK_CCIC0, "ccic0_clk", "ccic0_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x1b, 0x1b, 0x0, 0, &ccic0_lock}, | ||
233 | {MMP2_CLK_CCIC0_PHY, "ccic0_phy_clk", "ccic0_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x24, 0x24, 0x0, 0, &ccic0_lock}, | ||
234 | {MMP2_CLK_CCIC0_SPHY, "ccic0_sphy_clk", "ccic0_sphy_div", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x300, 0x300, 0x0, 0, &ccic0_lock}, | ||
235 | {MMP2_CLK_CCIC1, "ccic1_clk", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x1b, 0x1b, 0x0, 0, &ccic1_lock}, | ||
236 | {MMP2_CLK_CCIC1_PHY, "ccic1_phy_clk", "ccic1_mix_clk", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x24, 0x24, 0x0, 0, &ccic1_lock}, | ||
237 | {MMP2_CLK_CCIC1_SPHY, "ccic1_sphy_clk", "ccic1_sphy_div", CLK_SET_RATE_PARENT, APMU_CCIC1, 0x300, 0x300, 0x0, 0, &ccic1_lock}, | ||
238 | }; | ||
239 | |||
240 | static void mmp2_axi_periph_clk_init(struct mmp2_clk_unit *pxa_unit) | ||
241 | { | ||
242 | struct clk *clk; | ||
243 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
244 | |||
245 | sdh_mix_config.reg_info.reg_clk_ctrl = pxa_unit->apmu_base + APMU_SDH0; | ||
246 | clk = mmp_clk_register_mix(NULL, "sdh_mix_clk", sdh_parent_names, | ||
247 | ARRAY_SIZE(sdh_parent_names), | ||
248 | CLK_SET_RATE_PARENT, | ||
249 | &sdh_mix_config, &sdh_lock); | ||
250 | |||
251 | ccic0_mix_config.reg_info.reg_clk_ctrl = pxa_unit->apmu_base + APMU_CCIC0; | ||
252 | clk = mmp_clk_register_mix(NULL, "ccic0_mix_clk", ccic_parent_names, | ||
253 | ARRAY_SIZE(ccic_parent_names), | ||
254 | CLK_SET_RATE_PARENT, | ||
255 | &ccic0_mix_config, &ccic0_lock); | ||
256 | mmp_clk_add(unit, MMP2_CLK_CCIC0_MIX, clk); | ||
257 | |||
258 | ccic1_mix_config.reg_info.reg_clk_ctrl = pxa_unit->apmu_base + APMU_CCIC1; | ||
259 | clk = mmp_clk_register_mix(NULL, "ccic1_mix_clk", ccic_parent_names, | ||
260 | ARRAY_SIZE(ccic_parent_names), | ||
261 | CLK_SET_RATE_PARENT, | ||
262 | &ccic1_mix_config, &ccic1_lock); | ||
263 | mmp_clk_add(unit, MMP2_CLK_CCIC1_MIX, clk); | ||
264 | |||
265 | mmp_register_mux_clks(unit, apmu_mux_clks, pxa_unit->apmu_base, | ||
266 | ARRAY_SIZE(apmu_mux_clks)); | ||
267 | |||
268 | mmp_register_div_clks(unit, apmu_div_clks, pxa_unit->apmu_base, | ||
269 | ARRAY_SIZE(apmu_div_clks)); | ||
270 | |||
271 | mmp_register_gate_clks(unit, apmu_gate_clks, pxa_unit->apmu_base, | ||
272 | ARRAY_SIZE(apmu_gate_clks)); | ||
273 | } | ||
274 | |||
275 | static void mmp2_clk_reset_init(struct device_node *np, | ||
276 | struct mmp2_clk_unit *pxa_unit) | ||
277 | { | ||
278 | struct mmp_clk_reset_cell *cells; | ||
279 | int i, nr_resets; | ||
280 | |||
281 | nr_resets = ARRAY_SIZE(apbc_gate_clks); | ||
282 | cells = kcalloc(nr_resets, sizeof(*cells), GFP_KERNEL); | ||
283 | if (!cells) | ||
284 | return; | ||
285 | |||
286 | for (i = 0; i < nr_resets; i++) { | ||
287 | cells[i].clk_id = apbc_gate_clks[i].id; | ||
288 | cells[i].reg = pxa_unit->apbc_base + apbc_gate_clks[i].offset; | ||
289 | cells[i].flags = 0; | ||
290 | cells[i].lock = apbc_gate_clks[i].lock; | ||
291 | cells[i].bits = 0x4; | ||
292 | } | ||
293 | |||
294 | mmp_clk_reset_register(np, cells, nr_resets); | ||
295 | } | ||
296 | |||
297 | static void __init mmp2_clk_init(struct device_node *np) | ||
298 | { | ||
299 | struct mmp2_clk_unit *pxa_unit; | ||
300 | |||
301 | pxa_unit = kzalloc(sizeof(*pxa_unit), GFP_KERNEL); | ||
302 | if (!pxa_unit) | ||
303 | return; | ||
304 | |||
305 | pxa_unit->mpmu_base = of_iomap(np, 0); | ||
306 | if (!pxa_unit->mpmu_base) { | ||
307 | pr_err("failed to map mpmu registers\n"); | ||
308 | return; | ||
309 | } | ||
310 | |||
311 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
312 | if (!pxa_unit->mpmu_base) { | ||
313 | pr_err("failed to map apmu registers\n"); | ||
314 | return; | ||
315 | } | ||
316 | |||
317 | pxa_unit->apbc_base = of_iomap(np, 2); | ||
318 | if (!pxa_unit->apbc_base) { | ||
319 | pr_err("failed to map apbc registers\n"); | ||
320 | return; | ||
321 | } | ||
322 | |||
323 | mmp_clk_init(np, &pxa_unit->unit, MMP2_NR_CLKS); | ||
324 | |||
325 | mmp2_pll_init(pxa_unit); | ||
326 | |||
327 | mmp2_apb_periph_clk_init(pxa_unit); | ||
328 | |||
329 | mmp2_axi_periph_clk_init(pxa_unit); | ||
330 | |||
331 | mmp2_clk_reset_init(np, pxa_unit); | ||
332 | } | ||
333 | |||
334 | CLK_OF_DECLARE(mmp2_clk, "marvell,mmp2-clock", mmp2_clk_init); | ||
diff --git a/drivers/clk/mmp/clk-of-pxa168.c b/drivers/clk/mmp/clk-of-pxa168.c new file mode 100644 index 000000000000..5b1810dc4bd2 --- /dev/null +++ b/drivers/clk/mmp/clk-of-pxa168.c | |||
@@ -0,0 +1,279 @@ | |||
1 | /* | ||
2 | * pxa168 clock framework source file | ||
3 | * | ||
4 | * Copyright (C) 2012 Marvell | ||
5 | * Chao Xie <xiechao.mail@gmail.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/spinlock.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/of_address.h> | ||
19 | |||
20 | #include <dt-bindings/clock/marvell,pxa168.h> | ||
21 | |||
22 | #include "clk.h" | ||
23 | #include "reset.h" | ||
24 | |||
25 | #define APBC_RTC 0x28 | ||
26 | #define APBC_TWSI0 0x2c | ||
27 | #define APBC_KPC 0x30 | ||
28 | #define APBC_UART0 0x0 | ||
29 | #define APBC_UART1 0x4 | ||
30 | #define APBC_GPIO 0x8 | ||
31 | #define APBC_PWM0 0xc | ||
32 | #define APBC_PWM1 0x10 | ||
33 | #define APBC_PWM2 0x14 | ||
34 | #define APBC_PWM3 0x18 | ||
35 | #define APBC_SSP0 0x81c | ||
36 | #define APBC_SSP1 0x820 | ||
37 | #define APBC_SSP2 0x84c | ||
38 | #define APBC_SSP3 0x858 | ||
39 | #define APBC_SSP4 0x85c | ||
40 | #define APBC_TWSI1 0x6c | ||
41 | #define APBC_UART2 0x70 | ||
42 | #define APMU_SDH0 0x54 | ||
43 | #define APMU_SDH1 0x58 | ||
44 | #define APMU_USB 0x5c | ||
45 | #define APMU_DISP0 0x4c | ||
46 | #define APMU_CCIC0 0x50 | ||
47 | #define APMU_DFC 0x60 | ||
48 | #define MPMU_UART_PLL 0x14 | ||
49 | |||
50 | struct pxa168_clk_unit { | ||
51 | struct mmp_clk_unit unit; | ||
52 | void __iomem *mpmu_base; | ||
53 | void __iomem *apmu_base; | ||
54 | void __iomem *apbc_base; | ||
55 | }; | ||
56 | |||
57 | static struct mmp_param_fixed_rate_clk fixed_rate_clks[] = { | ||
58 | {PXA168_CLK_CLK32, "clk32", NULL, CLK_IS_ROOT, 32768}, | ||
59 | {PXA168_CLK_VCTCXO, "vctcxo", NULL, CLK_IS_ROOT, 26000000}, | ||
60 | {PXA168_CLK_PLL1, "pll1", NULL, CLK_IS_ROOT, 624000000}, | ||
61 | }; | ||
62 | |||
63 | static struct mmp_param_fixed_factor_clk fixed_factor_clks[] = { | ||
64 | {PXA168_CLK_PLL1_2, "pll1_2", "pll1", 1, 2, 0}, | ||
65 | {PXA168_CLK_PLL1_4, "pll1_4", "pll1_2", 1, 2, 0}, | ||
66 | {PXA168_CLK_PLL1_8, "pll1_8", "pll1_4", 1, 2, 0}, | ||
67 | {PXA168_CLK_PLL1_16, "pll1_16", "pll1_8", 1, 2, 0}, | ||
68 | {PXA168_CLK_PLL1_6, "pll1_6", "pll1_2", 1, 3, 0}, | ||
69 | {PXA168_CLK_PLL1_12, "pll1_12", "pll1_6", 1, 2, 0}, | ||
70 | {PXA168_CLK_PLL1_24, "pll1_24", "pll1_12", 1, 2, 0}, | ||
71 | {PXA168_CLK_PLL1_48, "pll1_48", "pll1_24", 1, 2, 0}, | ||
72 | {PXA168_CLK_PLL1_96, "pll1_96", "pll1_48", 1, 2, 0}, | ||
73 | {PXA168_CLK_PLL1_13, "pll1_13", "pll1", 1, 13, 0}, | ||
74 | {PXA168_CLK_PLL1_13_1_5, "pll1_13_1_5", "pll1_13", 2, 3, 0}, | ||
75 | {PXA168_CLK_PLL1_2_1_5, "pll1_2_1_5", "pll1_2", 2, 3, 0}, | ||
76 | {PXA168_CLK_PLL1_3_16, "pll1_3_16", "pll1", 3, 16, 0}, | ||
77 | }; | ||
78 | |||
79 | static struct mmp_clk_factor_masks uart_factor_masks = { | ||
80 | .factor = 2, | ||
81 | .num_mask = 0x1fff, | ||
82 | .den_mask = 0x1fff, | ||
83 | .num_shift = 16, | ||
84 | .den_shift = 0, | ||
85 | }; | ||
86 | |||
87 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { | ||
88 | {.num = 8125, .den = 1536}, /*14.745MHZ */ | ||
89 | }; | ||
90 | |||
91 | static void pxa168_pll_init(struct pxa168_clk_unit *pxa_unit) | ||
92 | { | ||
93 | struct clk *clk; | ||
94 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
95 | |||
96 | mmp_register_fixed_rate_clks(unit, fixed_rate_clks, | ||
97 | ARRAY_SIZE(fixed_rate_clks)); | ||
98 | |||
99 | mmp_register_fixed_factor_clks(unit, fixed_factor_clks, | ||
100 | ARRAY_SIZE(fixed_factor_clks)); | ||
101 | |||
102 | clk = mmp_clk_register_factor("uart_pll", "pll1_4", | ||
103 | CLK_SET_RATE_PARENT, | ||
104 | pxa_unit->mpmu_base + MPMU_UART_PLL, | ||
105 | &uart_factor_masks, uart_factor_tbl, | ||
106 | ARRAY_SIZE(uart_factor_tbl), NULL); | ||
107 | mmp_clk_add(unit, PXA168_CLK_UART_PLL, clk); | ||
108 | } | ||
109 | |||
110 | static DEFINE_SPINLOCK(uart0_lock); | ||
111 | static DEFINE_SPINLOCK(uart1_lock); | ||
112 | static DEFINE_SPINLOCK(uart2_lock); | ||
113 | static const char *uart_parent_names[] = {"pll1_3_16", "uart_pll"}; | ||
114 | |||
115 | static DEFINE_SPINLOCK(ssp0_lock); | ||
116 | static DEFINE_SPINLOCK(ssp1_lock); | ||
117 | static DEFINE_SPINLOCK(ssp2_lock); | ||
118 | static DEFINE_SPINLOCK(ssp3_lock); | ||
119 | static DEFINE_SPINLOCK(ssp4_lock); | ||
120 | static const char *ssp_parent_names[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"}; | ||
121 | |||
122 | static DEFINE_SPINLOCK(reset_lock); | ||
123 | |||
124 | static struct mmp_param_mux_clk apbc_mux_clks[] = { | ||
125 | {0, "uart0_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART0, 4, 3, 0, &uart0_lock}, | ||
126 | {0, "uart1_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART1, 4, 3, 0, &uart1_lock}, | ||
127 | {0, "uart2_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART2, 4, 3, 0, &uart2_lock}, | ||
128 | {0, "ssp0_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP0, 4, 3, 0, &ssp0_lock}, | ||
129 | {0, "ssp1_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP1, 4, 3, 0, &ssp1_lock}, | ||
130 | {0, "ssp2_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP2, 4, 3, 0, &ssp2_lock}, | ||
131 | {0, "ssp3_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP3, 4, 3, 0, &ssp3_lock}, | ||
132 | {0, "ssp4_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP4, 4, 3, 0, &ssp4_lock}, | ||
133 | }; | ||
134 | |||
135 | static struct mmp_param_gate_clk apbc_gate_clks[] = { | ||
136 | {PXA168_CLK_TWSI0, "twsi0_clk", "pll1_13_1_5", CLK_SET_RATE_PARENT, APBC_TWSI0, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
137 | {PXA168_CLK_TWSI1, "twsi1_clk", "pll1_13_1_5", CLK_SET_RATE_PARENT, APBC_TWSI1, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
138 | {PXA168_CLK_GPIO, "gpio_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_GPIO, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
139 | {PXA168_CLK_KPC, "kpc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_KPC, 0x3, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, NULL}, | ||
140 | {PXA168_CLK_RTC, "rtc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_RTC, 0x83, 0x83, 0x0, MMP_CLK_GATE_NEED_DELAY, NULL}, | ||
141 | {PXA168_CLK_PWM0, "pwm0_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM0, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
142 | {PXA168_CLK_PWM1, "pwm1_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM1, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
143 | {PXA168_CLK_PWM2, "pwm2_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM2, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
144 | {PXA168_CLK_PWM3, "pwm3_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM3, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
145 | /* The gate clocks has mux parent. */ | ||
146 | {PXA168_CLK_UART0, "uart0_clk", "uart0_mux", CLK_SET_RATE_PARENT, APBC_UART0, 0x3, 0x3, 0x0, 0, &uart0_lock}, | ||
147 | {PXA168_CLK_UART1, "uart1_clk", "uart1_mux", CLK_SET_RATE_PARENT, APBC_UART1, 0x3, 0x3, 0x0, 0, &uart1_lock}, | ||
148 | {PXA168_CLK_UART2, "uart2_clk", "uart2_mux", CLK_SET_RATE_PARENT, APBC_UART2, 0x3, 0x3, 0x0, 0, &uart2_lock}, | ||
149 | {PXA168_CLK_SSP0, "ssp0_clk", "ssp0_mux", CLK_SET_RATE_PARENT, APBC_SSP0, 0x3, 0x3, 0x0, 0, &ssp0_lock}, | ||
150 | {PXA168_CLK_SSP1, "ssp1_clk", "ssp1_mux", CLK_SET_RATE_PARENT, APBC_SSP1, 0x3, 0x3, 0x0, 0, &ssp1_lock}, | ||
151 | {PXA168_CLK_SSP2, "ssp2_clk", "ssp2_mux", CLK_SET_RATE_PARENT, APBC_SSP2, 0x3, 0x3, 0x0, 0, &ssp2_lock}, | ||
152 | {PXA168_CLK_SSP3, "ssp3_clk", "ssp3_mux", CLK_SET_RATE_PARENT, APBC_SSP3, 0x3, 0x3, 0x0, 0, &ssp3_lock}, | ||
153 | {PXA168_CLK_SSP4, "ssp4_clk", "ssp4_mux", CLK_SET_RATE_PARENT, APBC_SSP4, 0x3, 0x3, 0x0, 0, &ssp4_lock}, | ||
154 | }; | ||
155 | |||
156 | static void pxa168_apb_periph_clk_init(struct pxa168_clk_unit *pxa_unit) | ||
157 | { | ||
158 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
159 | |||
160 | mmp_register_mux_clks(unit, apbc_mux_clks, pxa_unit->apbc_base, | ||
161 | ARRAY_SIZE(apbc_mux_clks)); | ||
162 | |||
163 | mmp_register_gate_clks(unit, apbc_gate_clks, pxa_unit->apbc_base, | ||
164 | ARRAY_SIZE(apbc_gate_clks)); | ||
165 | |||
166 | } | ||
167 | |||
168 | static DEFINE_SPINLOCK(sdh0_lock); | ||
169 | static DEFINE_SPINLOCK(sdh1_lock); | ||
170 | static const char *sdh_parent_names[] = {"pll1_12", "pll1_13"}; | ||
171 | |||
172 | static DEFINE_SPINLOCK(usb_lock); | ||
173 | |||
174 | static DEFINE_SPINLOCK(disp0_lock); | ||
175 | static const char *disp_parent_names[] = {"pll1_2", "pll1_12"}; | ||
176 | |||
177 | static DEFINE_SPINLOCK(ccic0_lock); | ||
178 | static const char *ccic_parent_names[] = {"pll1_2", "pll1_12"}; | ||
179 | static const char *ccic_phy_parent_names[] = {"pll1_6", "pll1_12"}; | ||
180 | |||
181 | static struct mmp_param_mux_clk apmu_mux_clks[] = { | ||
182 | {0, "sdh0_mux", sdh_parent_names, ARRAY_SIZE(sdh_parent_names), CLK_SET_RATE_PARENT, APMU_SDH0, 6, 1, 0, &sdh0_lock}, | ||
183 | {0, "sdh1_mux", sdh_parent_names, ARRAY_SIZE(sdh_parent_names), CLK_SET_RATE_PARENT, APMU_SDH1, 6, 1, 0, &sdh1_lock}, | ||
184 | {0, "disp0_mux", disp_parent_names, ARRAY_SIZE(disp_parent_names), CLK_SET_RATE_PARENT, APMU_DISP0, 6, 1, 0, &disp0_lock}, | ||
185 | {0, "ccic0_mux", ccic_parent_names, ARRAY_SIZE(ccic_parent_names), CLK_SET_RATE_PARENT, APMU_CCIC0, 6, 1, 0, &ccic0_lock}, | ||
186 | {0, "ccic0_phy_mux", ccic_phy_parent_names, ARRAY_SIZE(ccic_phy_parent_names), CLK_SET_RATE_PARENT, APMU_CCIC0, 7, 1, 0, &ccic0_lock}, | ||
187 | }; | ||
188 | |||
189 | static struct mmp_param_div_clk apmu_div_clks[] = { | ||
190 | {0, "ccic0_sphy_div", "ccic0_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 10, 5, 0, &ccic0_lock}, | ||
191 | }; | ||
192 | |||
193 | static struct mmp_param_gate_clk apmu_gate_clks[] = { | ||
194 | {PXA168_CLK_DFC, "dfc_clk", "pll1_4", CLK_SET_RATE_PARENT, APMU_DFC, 0x19b, 0x19b, 0x0, 0, NULL}, | ||
195 | {PXA168_CLK_USB, "usb_clk", "usb_pll", 0, APMU_USB, 0x9, 0x9, 0x0, 0, &usb_lock}, | ||
196 | {PXA168_CLK_SPH, "sph_clk", "usb_pll", 0, APMU_USB, 0x12, 0x12, 0x0, 0, &usb_lock}, | ||
197 | /* The gate clocks has mux parent. */ | ||
198 | {PXA168_CLK_SDH0, "sdh0_clk", "sdh0_mux", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh0_lock}, | ||
199 | {PXA168_CLK_SDH1, "sdh1_clk", "sdh1_mux", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh1_lock}, | ||
200 | {PXA168_CLK_DISP0, "disp0_clk", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1b, 0x1b, 0x0, 0, &disp0_lock}, | ||
201 | {PXA168_CLK_CCIC0, "ccic0_clk", "ccic0_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x1b, 0x1b, 0x0, 0, &ccic0_lock}, | ||
202 | {PXA168_CLK_CCIC0_PHY, "ccic0_phy_clk", "ccic0_phy_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x24, 0x24, 0x0, 0, &ccic0_lock}, | ||
203 | {PXA168_CLK_CCIC0_SPHY, "ccic0_sphy_clk", "ccic0_sphy_div", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x300, 0x300, 0x0, 0, &ccic0_lock}, | ||
204 | }; | ||
205 | |||
206 | static void pxa168_axi_periph_clk_init(struct pxa168_clk_unit *pxa_unit) | ||
207 | { | ||
208 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
209 | |||
210 | mmp_register_mux_clks(unit, apmu_mux_clks, pxa_unit->apmu_base, | ||
211 | ARRAY_SIZE(apmu_mux_clks)); | ||
212 | |||
213 | mmp_register_div_clks(unit, apmu_div_clks, pxa_unit->apmu_base, | ||
214 | ARRAY_SIZE(apmu_div_clks)); | ||
215 | |||
216 | mmp_register_gate_clks(unit, apmu_gate_clks, pxa_unit->apmu_base, | ||
217 | ARRAY_SIZE(apmu_gate_clks)); | ||
218 | } | ||
219 | |||
220 | static void pxa168_clk_reset_init(struct device_node *np, | ||
221 | struct pxa168_clk_unit *pxa_unit) | ||
222 | { | ||
223 | struct mmp_clk_reset_cell *cells; | ||
224 | int i, nr_resets; | ||
225 | |||
226 | nr_resets = ARRAY_SIZE(apbc_gate_clks); | ||
227 | cells = kcalloc(nr_resets, sizeof(*cells), GFP_KERNEL); | ||
228 | if (!cells) | ||
229 | return; | ||
230 | |||
231 | for (i = 0; i < nr_resets; i++) { | ||
232 | cells[i].clk_id = apbc_gate_clks[i].id; | ||
233 | cells[i].reg = pxa_unit->apbc_base + apbc_gate_clks[i].offset; | ||
234 | cells[i].flags = 0; | ||
235 | cells[i].lock = apbc_gate_clks[i].lock; | ||
236 | cells[i].bits = 0x4; | ||
237 | } | ||
238 | |||
239 | mmp_clk_reset_register(np, cells, nr_resets); | ||
240 | } | ||
241 | |||
242 | static void __init pxa168_clk_init(struct device_node *np) | ||
243 | { | ||
244 | struct pxa168_clk_unit *pxa_unit; | ||
245 | |||
246 | pxa_unit = kzalloc(sizeof(*pxa_unit), GFP_KERNEL); | ||
247 | if (!pxa_unit) | ||
248 | return; | ||
249 | |||
250 | pxa_unit->mpmu_base = of_iomap(np, 0); | ||
251 | if (!pxa_unit->mpmu_base) { | ||
252 | pr_err("failed to map mpmu registers\n"); | ||
253 | return; | ||
254 | } | ||
255 | |||
256 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
257 | if (!pxa_unit->mpmu_base) { | ||
258 | pr_err("failed to map apmu registers\n"); | ||
259 | return; | ||
260 | } | ||
261 | |||
262 | pxa_unit->apbc_base = of_iomap(np, 2); | ||
263 | if (!pxa_unit->apbc_base) { | ||
264 | pr_err("failed to map apbc registers\n"); | ||
265 | return; | ||
266 | } | ||
267 | |||
268 | mmp_clk_init(np, &pxa_unit->unit, PXA168_NR_CLKS); | ||
269 | |||
270 | pxa168_pll_init(pxa_unit); | ||
271 | |||
272 | pxa168_apb_periph_clk_init(pxa_unit); | ||
273 | |||
274 | pxa168_axi_periph_clk_init(pxa_unit); | ||
275 | |||
276 | pxa168_clk_reset_init(np, pxa_unit); | ||
277 | } | ||
278 | |||
279 | CLK_OF_DECLARE(pxa168_clk, "marvell,pxa168-clock", pxa168_clk_init); | ||
diff --git a/drivers/clk/mmp/clk-of-pxa910.c b/drivers/clk/mmp/clk-of-pxa910.c new file mode 100644 index 000000000000..5e3c80dad336 --- /dev/null +++ b/drivers/clk/mmp/clk-of-pxa910.c | |||
@@ -0,0 +1,301 @@ | |||
1 | /* | ||
2 | * pxa910 clock framework source file | ||
3 | * | ||
4 | * Copyright (C) 2012 Marvell | ||
5 | * Chao Xie <xiechao.mail@gmail.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/spinlock.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/of_address.h> | ||
19 | |||
20 | #include <dt-bindings/clock/marvell,pxa910.h> | ||
21 | |||
22 | #include "clk.h" | ||
23 | #include "reset.h" | ||
24 | |||
25 | #define APBC_RTC 0x28 | ||
26 | #define APBC_TWSI0 0x2c | ||
27 | #define APBC_KPC 0x18 | ||
28 | #define APBC_UART0 0x0 | ||
29 | #define APBC_UART1 0x4 | ||
30 | #define APBC_GPIO 0x8 | ||
31 | #define APBC_PWM0 0xc | ||
32 | #define APBC_PWM1 0x10 | ||
33 | #define APBC_PWM2 0x14 | ||
34 | #define APBC_PWM3 0x18 | ||
35 | #define APBC_SSP0 0x1c | ||
36 | #define APBC_SSP1 0x20 | ||
37 | #define APBC_SSP2 0x4c | ||
38 | #define APBCP_TWSI1 0x28 | ||
39 | #define APBCP_UART2 0x1c | ||
40 | #define APMU_SDH0 0x54 | ||
41 | #define APMU_SDH1 0x58 | ||
42 | #define APMU_USB 0x5c | ||
43 | #define APMU_DISP0 0x4c | ||
44 | #define APMU_CCIC0 0x50 | ||
45 | #define APMU_DFC 0x60 | ||
46 | #define MPMU_UART_PLL 0x14 | ||
47 | |||
48 | struct pxa910_clk_unit { | ||
49 | struct mmp_clk_unit unit; | ||
50 | void __iomem *mpmu_base; | ||
51 | void __iomem *apmu_base; | ||
52 | void __iomem *apbc_base; | ||
53 | void __iomem *apbcp_base; | ||
54 | }; | ||
55 | |||
56 | static struct mmp_param_fixed_rate_clk fixed_rate_clks[] = { | ||
57 | {PXA910_CLK_CLK32, "clk32", NULL, CLK_IS_ROOT, 32768}, | ||
58 | {PXA910_CLK_VCTCXO, "vctcxo", NULL, CLK_IS_ROOT, 26000000}, | ||
59 | {PXA910_CLK_PLL1, "pll1", NULL, CLK_IS_ROOT, 624000000}, | ||
60 | }; | ||
61 | |||
62 | static struct mmp_param_fixed_factor_clk fixed_factor_clks[] = { | ||
63 | {PXA910_CLK_PLL1_2, "pll1_2", "pll1", 1, 2, 0}, | ||
64 | {PXA910_CLK_PLL1_4, "pll1_4", "pll1_2", 1, 2, 0}, | ||
65 | {PXA910_CLK_PLL1_8, "pll1_8", "pll1_4", 1, 2, 0}, | ||
66 | {PXA910_CLK_PLL1_16, "pll1_16", "pll1_8", 1, 2, 0}, | ||
67 | {PXA910_CLK_PLL1_6, "pll1_6", "pll1_2", 1, 3, 0}, | ||
68 | {PXA910_CLK_PLL1_12, "pll1_12", "pll1_6", 1, 2, 0}, | ||
69 | {PXA910_CLK_PLL1_24, "pll1_24", "pll1_12", 1, 2, 0}, | ||
70 | {PXA910_CLK_PLL1_48, "pll1_48", "pll1_24", 1, 2, 0}, | ||
71 | {PXA910_CLK_PLL1_96, "pll1_96", "pll1_48", 1, 2, 0}, | ||
72 | {PXA910_CLK_PLL1_13, "pll1_13", "pll1", 1, 13, 0}, | ||
73 | {PXA910_CLK_PLL1_13_1_5, "pll1_13_1_5", "pll1_13", 2, 3, 0}, | ||
74 | {PXA910_CLK_PLL1_2_1_5, "pll1_2_1_5", "pll1_2", 2, 3, 0}, | ||
75 | {PXA910_CLK_PLL1_3_16, "pll1_3_16", "pll1", 3, 16, 0}, | ||
76 | }; | ||
77 | |||
78 | static struct mmp_clk_factor_masks uart_factor_masks = { | ||
79 | .factor = 2, | ||
80 | .num_mask = 0x1fff, | ||
81 | .den_mask = 0x1fff, | ||
82 | .num_shift = 16, | ||
83 | .den_shift = 0, | ||
84 | }; | ||
85 | |||
86 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { | ||
87 | {.num = 8125, .den = 1536}, /*14.745MHZ */ | ||
88 | }; | ||
89 | |||
90 | static void pxa910_pll_init(struct pxa910_clk_unit *pxa_unit) | ||
91 | { | ||
92 | struct clk *clk; | ||
93 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
94 | |||
95 | mmp_register_fixed_rate_clks(unit, fixed_rate_clks, | ||
96 | ARRAY_SIZE(fixed_rate_clks)); | ||
97 | |||
98 | mmp_register_fixed_factor_clks(unit, fixed_factor_clks, | ||
99 | ARRAY_SIZE(fixed_factor_clks)); | ||
100 | |||
101 | clk = mmp_clk_register_factor("uart_pll", "pll1_4", | ||
102 | CLK_SET_RATE_PARENT, | ||
103 | pxa_unit->mpmu_base + MPMU_UART_PLL, | ||
104 | &uart_factor_masks, uart_factor_tbl, | ||
105 | ARRAY_SIZE(uart_factor_tbl), NULL); | ||
106 | mmp_clk_add(unit, PXA910_CLK_UART_PLL, clk); | ||
107 | } | ||
108 | |||
109 | static DEFINE_SPINLOCK(uart0_lock); | ||
110 | static DEFINE_SPINLOCK(uart1_lock); | ||
111 | static DEFINE_SPINLOCK(uart2_lock); | ||
112 | static const char *uart_parent_names[] = {"pll1_3_16", "uart_pll"}; | ||
113 | |||
114 | static DEFINE_SPINLOCK(ssp0_lock); | ||
115 | static DEFINE_SPINLOCK(ssp1_lock); | ||
116 | static const char *ssp_parent_names[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"}; | ||
117 | |||
118 | static DEFINE_SPINLOCK(reset_lock); | ||
119 | |||
120 | static struct mmp_param_mux_clk apbc_mux_clks[] = { | ||
121 | {0, "uart0_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART0, 4, 3, 0, &uart0_lock}, | ||
122 | {0, "uart1_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBC_UART1, 4, 3, 0, &uart1_lock}, | ||
123 | {0, "ssp0_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP0, 4, 3, 0, &ssp0_lock}, | ||
124 | {0, "ssp1_mux", ssp_parent_names, ARRAY_SIZE(ssp_parent_names), CLK_SET_RATE_PARENT, APBC_SSP1, 4, 3, 0, &ssp1_lock}, | ||
125 | }; | ||
126 | |||
127 | static struct mmp_param_mux_clk apbcp_mux_clks[] = { | ||
128 | {0, "uart2_mux", uart_parent_names, ARRAY_SIZE(uart_parent_names), CLK_SET_RATE_PARENT, APBCP_UART2, 4, 3, 0, &uart2_lock}, | ||
129 | }; | ||
130 | |||
131 | static struct mmp_param_gate_clk apbc_gate_clks[] = { | ||
132 | {PXA910_CLK_TWSI0, "twsi0_clk", "pll1_13_1_5", CLK_SET_RATE_PARENT, APBC_TWSI0, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
133 | {PXA910_CLK_GPIO, "gpio_clk", "vctcxo", CLK_SET_RATE_PARENT, APBC_GPIO, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
134 | {PXA910_CLK_KPC, "kpc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_KPC, 0x3, 0x3, 0x0, MMP_CLK_GATE_NEED_DELAY, NULL}, | ||
135 | {PXA910_CLK_RTC, "rtc_clk", "clk32", CLK_SET_RATE_PARENT, APBC_RTC, 0x83, 0x83, 0x0, MMP_CLK_GATE_NEED_DELAY, NULL}, | ||
136 | {PXA910_CLK_PWM0, "pwm0_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM0, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
137 | {PXA910_CLK_PWM1, "pwm1_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM1, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
138 | {PXA910_CLK_PWM2, "pwm2_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM2, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
139 | {PXA910_CLK_PWM3, "pwm3_clk", "pll1_48", CLK_SET_RATE_PARENT, APBC_PWM3, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
140 | /* The gate clocks has mux parent. */ | ||
141 | {PXA910_CLK_UART0, "uart0_clk", "uart0_mux", CLK_SET_RATE_PARENT, APBC_UART0, 0x3, 0x3, 0x0, 0, &uart0_lock}, | ||
142 | {PXA910_CLK_UART1, "uart1_clk", "uart1_mux", CLK_SET_RATE_PARENT, APBC_UART1, 0x3, 0x3, 0x0, 0, &uart1_lock}, | ||
143 | {PXA910_CLK_SSP0, "ssp0_clk", "ssp0_mux", CLK_SET_RATE_PARENT, APBC_SSP0, 0x3, 0x3, 0x0, 0, &ssp0_lock}, | ||
144 | {PXA910_CLK_SSP1, "ssp1_clk", "ssp1_mux", CLK_SET_RATE_PARENT, APBC_SSP1, 0x3, 0x3, 0x0, 0, &ssp1_lock}, | ||
145 | }; | ||
146 | |||
147 | static struct mmp_param_gate_clk apbcp_gate_clks[] = { | ||
148 | {PXA910_CLK_TWSI1, "twsi1_clk", "pll1_13_1_5", CLK_SET_RATE_PARENT, APBCP_TWSI1, 0x3, 0x3, 0x0, 0, &reset_lock}, | ||
149 | /* The gate clocks has mux parent. */ | ||
150 | {PXA910_CLK_UART2, "uart2_clk", "uart2_mux", CLK_SET_RATE_PARENT, APBCP_UART2, 0x3, 0x3, 0x0, 0, &uart2_lock}, | ||
151 | }; | ||
152 | |||
153 | static void pxa910_apb_periph_clk_init(struct pxa910_clk_unit *pxa_unit) | ||
154 | { | ||
155 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
156 | |||
157 | mmp_register_mux_clks(unit, apbc_mux_clks, pxa_unit->apbc_base, | ||
158 | ARRAY_SIZE(apbc_mux_clks)); | ||
159 | |||
160 | mmp_register_mux_clks(unit, apbcp_mux_clks, pxa_unit->apbcp_base, | ||
161 | ARRAY_SIZE(apbcp_mux_clks)); | ||
162 | |||
163 | mmp_register_gate_clks(unit, apbc_gate_clks, pxa_unit->apbc_base, | ||
164 | ARRAY_SIZE(apbc_gate_clks)); | ||
165 | |||
166 | mmp_register_gate_clks(unit, apbcp_gate_clks, pxa_unit->apbcp_base, | ||
167 | ARRAY_SIZE(apbcp_gate_clks)); | ||
168 | } | ||
169 | |||
170 | static DEFINE_SPINLOCK(sdh0_lock); | ||
171 | static DEFINE_SPINLOCK(sdh1_lock); | ||
172 | static const char *sdh_parent_names[] = {"pll1_12", "pll1_13"}; | ||
173 | |||
174 | static DEFINE_SPINLOCK(usb_lock); | ||
175 | |||
176 | static DEFINE_SPINLOCK(disp0_lock); | ||
177 | static const char *disp_parent_names[] = {"pll1_2", "pll1_12"}; | ||
178 | |||
179 | static DEFINE_SPINLOCK(ccic0_lock); | ||
180 | static const char *ccic_parent_names[] = {"pll1_2", "pll1_12"}; | ||
181 | static const char *ccic_phy_parent_names[] = {"pll1_6", "pll1_12"}; | ||
182 | |||
183 | static struct mmp_param_mux_clk apmu_mux_clks[] = { | ||
184 | {0, "sdh0_mux", sdh_parent_names, ARRAY_SIZE(sdh_parent_names), CLK_SET_RATE_PARENT, APMU_SDH0, 6, 1, 0, &sdh0_lock}, | ||
185 | {0, "sdh1_mux", sdh_parent_names, ARRAY_SIZE(sdh_parent_names), CLK_SET_RATE_PARENT, APMU_SDH1, 6, 1, 0, &sdh1_lock}, | ||
186 | {0, "disp0_mux", disp_parent_names, ARRAY_SIZE(disp_parent_names), CLK_SET_RATE_PARENT, APMU_DISP0, 6, 1, 0, &disp0_lock}, | ||
187 | {0, "ccic0_mux", ccic_parent_names, ARRAY_SIZE(ccic_parent_names), CLK_SET_RATE_PARENT, APMU_CCIC0, 6, 1, 0, &ccic0_lock}, | ||
188 | {0, "ccic0_phy_mux", ccic_phy_parent_names, ARRAY_SIZE(ccic_phy_parent_names), CLK_SET_RATE_PARENT, APMU_CCIC0, 7, 1, 0, &ccic0_lock}, | ||
189 | }; | ||
190 | |||
191 | static struct mmp_param_div_clk apmu_div_clks[] = { | ||
192 | {0, "ccic0_sphy_div", "ccic0_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 10, 5, 0, &ccic0_lock}, | ||
193 | }; | ||
194 | |||
195 | static struct mmp_param_gate_clk apmu_gate_clks[] = { | ||
196 | {PXA910_CLK_DFC, "dfc_clk", "pll1_4", CLK_SET_RATE_PARENT, APMU_DFC, 0x19b, 0x19b, 0x0, 0, NULL}, | ||
197 | {PXA910_CLK_USB, "usb_clk", "usb_pll", 0, APMU_USB, 0x9, 0x9, 0x0, 0, &usb_lock}, | ||
198 | {PXA910_CLK_SPH, "sph_clk", "usb_pll", 0, APMU_USB, 0x12, 0x12, 0x0, 0, &usb_lock}, | ||
199 | /* The gate clocks has mux parent. */ | ||
200 | {PXA910_CLK_SDH0, "sdh0_clk", "sdh0_mux", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh0_lock}, | ||
201 | {PXA910_CLK_SDH1, "sdh1_clk", "sdh1_mux", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh1_lock}, | ||
202 | {PXA910_CLK_DISP0, "disp0_clk", "disp0_mux", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1b, 0x1b, 0x0, 0, &disp0_lock}, | ||
203 | {PXA910_CLK_CCIC0, "ccic0_clk", "ccic0_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x1b, 0x1b, 0x0, 0, &ccic0_lock}, | ||
204 | {PXA910_CLK_CCIC0_PHY, "ccic0_phy_clk", "ccic0_phy_mux", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x24, 0x24, 0x0, 0, &ccic0_lock}, | ||
205 | {PXA910_CLK_CCIC0_SPHY, "ccic0_sphy_clk", "ccic0_sphy_div", CLK_SET_RATE_PARENT, APMU_CCIC0, 0x300, 0x300, 0x0, 0, &ccic0_lock}, | ||
206 | }; | ||
207 | |||
208 | static void pxa910_axi_periph_clk_init(struct pxa910_clk_unit *pxa_unit) | ||
209 | { | ||
210 | struct mmp_clk_unit *unit = &pxa_unit->unit; | ||
211 | |||
212 | mmp_register_mux_clks(unit, apmu_mux_clks, pxa_unit->apmu_base, | ||
213 | ARRAY_SIZE(apmu_mux_clks)); | ||
214 | |||
215 | mmp_register_div_clks(unit, apmu_div_clks, pxa_unit->apmu_base, | ||
216 | ARRAY_SIZE(apmu_div_clks)); | ||
217 | |||
218 | mmp_register_gate_clks(unit, apmu_gate_clks, pxa_unit->apmu_base, | ||
219 | ARRAY_SIZE(apmu_gate_clks)); | ||
220 | } | ||
221 | |||
222 | static void pxa910_clk_reset_init(struct device_node *np, | ||
223 | struct pxa910_clk_unit *pxa_unit) | ||
224 | { | ||
225 | struct mmp_clk_reset_cell *cells; | ||
226 | int i, base, nr_resets_apbc, nr_resets_apbcp, nr_resets; | ||
227 | |||
228 | nr_resets_apbc = ARRAY_SIZE(apbc_gate_clks); | ||
229 | nr_resets_apbcp = ARRAY_SIZE(apbcp_gate_clks); | ||
230 | nr_resets = nr_resets_apbc + nr_resets_apbcp; | ||
231 | cells = kcalloc(nr_resets, sizeof(*cells), GFP_KERNEL); | ||
232 | if (!cells) | ||
233 | return; | ||
234 | |||
235 | base = 0; | ||
236 | for (i = 0; i < nr_resets_apbc; i++) { | ||
237 | cells[base + i].clk_id = apbc_gate_clks[i].id; | ||
238 | cells[base + i].reg = | ||
239 | pxa_unit->apbc_base + apbc_gate_clks[i].offset; | ||
240 | cells[base + i].flags = 0; | ||
241 | cells[base + i].lock = apbc_gate_clks[i].lock; | ||
242 | cells[base + i].bits = 0x4; | ||
243 | } | ||
244 | |||
245 | base = nr_resets_apbc; | ||
246 | for (i = 0; i < nr_resets_apbcp; i++) { | ||
247 | cells[base + i].clk_id = apbcp_gate_clks[i].id; | ||
248 | cells[base + i].reg = | ||
249 | pxa_unit->apbc_base + apbc_gate_clks[i].offset; | ||
250 | cells[base + i].flags = 0; | ||
251 | cells[base + i].lock = apbc_gate_clks[i].lock; | ||
252 | cells[base + i].bits = 0x4; | ||
253 | } | ||
254 | |||
255 | mmp_clk_reset_register(np, cells, nr_resets); | ||
256 | } | ||
257 | |||
258 | static void __init pxa910_clk_init(struct device_node *np) | ||
259 | { | ||
260 | struct pxa910_clk_unit *pxa_unit; | ||
261 | |||
262 | pxa_unit = kzalloc(sizeof(*pxa_unit), GFP_KERNEL); | ||
263 | if (!pxa_unit) | ||
264 | return; | ||
265 | |||
266 | pxa_unit->mpmu_base = of_iomap(np, 0); | ||
267 | if (!pxa_unit->mpmu_base) { | ||
268 | pr_err("failed to map mpmu registers\n"); | ||
269 | return; | ||
270 | } | ||
271 | |||
272 | pxa_unit->apmu_base = of_iomap(np, 1); | ||
273 | if (!pxa_unit->mpmu_base) { | ||
274 | pr_err("failed to map apmu registers\n"); | ||
275 | return; | ||
276 | } | ||
277 | |||
278 | pxa_unit->apbc_base = of_iomap(np, 2); | ||
279 | if (!pxa_unit->apbc_base) { | ||
280 | pr_err("failed to map apbc registers\n"); | ||
281 | return; | ||
282 | } | ||
283 | |||
284 | pxa_unit->apbcp_base = of_iomap(np, 3); | ||
285 | if (!pxa_unit->mpmu_base) { | ||
286 | pr_err("failed to map apbcp registers\n"); | ||
287 | return; | ||
288 | } | ||
289 | |||
290 | mmp_clk_init(np, &pxa_unit->unit, PXA910_NR_CLKS); | ||
291 | |||
292 | pxa910_pll_init(pxa_unit); | ||
293 | |||
294 | pxa910_apb_periph_clk_init(pxa_unit); | ||
295 | |||
296 | pxa910_axi_periph_clk_init(pxa_unit); | ||
297 | |||
298 | pxa910_clk_reset_init(np, pxa_unit); | ||
299 | } | ||
300 | |||
301 | CLK_OF_DECLARE(pxa910_clk, "marvell,pxa910-clock", pxa910_clk_init); | ||
diff --git a/drivers/clk/mmp/clk-pxa168.c b/drivers/clk/mmp/clk-pxa168.c index 014396b028a2..93e967c0f972 100644 --- a/drivers/clk/mmp/clk-pxa168.c +++ b/drivers/clk/mmp/clk-pxa168.c | |||
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | static DEFINE_SPINLOCK(clk_lock); | 48 | static DEFINE_SPINLOCK(clk_lock); |
49 | 49 | ||
50 | static struct clk_factor_masks uart_factor_masks = { | 50 | static struct mmp_clk_factor_masks uart_factor_masks = { |
51 | .factor = 2, | 51 | .factor = 2, |
52 | .num_mask = 0x1fff, | 52 | .num_mask = 0x1fff, |
53 | .den_mask = 0x1fff, | 53 | .den_mask = 0x1fff, |
@@ -55,7 +55,7 @@ static struct clk_factor_masks uart_factor_masks = { | |||
55 | .den_shift = 0, | 55 | .den_shift = 0, |
56 | }; | 56 | }; |
57 | 57 | ||
58 | static struct clk_factor_tbl uart_factor_tbl[] = { | 58 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { |
59 | {.num = 8125, .den = 1536}, /*14.745MHZ */ | 59 | {.num = 8125, .den = 1536}, /*14.745MHZ */ |
60 | }; | 60 | }; |
61 | 61 | ||
@@ -158,7 +158,7 @@ void __init pxa168_clk_init(void) | |||
158 | uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0, | 158 | uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0, |
159 | mpmu_base + MPMU_UART_PLL, | 159 | mpmu_base + MPMU_UART_PLL, |
160 | &uart_factor_masks, uart_factor_tbl, | 160 | &uart_factor_masks, uart_factor_tbl, |
161 | ARRAY_SIZE(uart_factor_tbl)); | 161 | ARRAY_SIZE(uart_factor_tbl), &clk_lock); |
162 | clk_set_rate(uart_pll, 14745600); | 162 | clk_set_rate(uart_pll, 14745600); |
163 | clk_register_clkdev(uart_pll, "uart_pll", NULL); | 163 | clk_register_clkdev(uart_pll, "uart_pll", NULL); |
164 | 164 | ||
diff --git a/drivers/clk/mmp/clk-pxa910.c b/drivers/clk/mmp/clk-pxa910.c index 9efc6a47535d..993abcdb32cc 100644 --- a/drivers/clk/mmp/clk-pxa910.c +++ b/drivers/clk/mmp/clk-pxa910.c | |||
@@ -45,7 +45,7 @@ | |||
45 | 45 | ||
46 | static DEFINE_SPINLOCK(clk_lock); | 46 | static DEFINE_SPINLOCK(clk_lock); |
47 | 47 | ||
48 | static struct clk_factor_masks uart_factor_masks = { | 48 | static struct mmp_clk_factor_masks uart_factor_masks = { |
49 | .factor = 2, | 49 | .factor = 2, |
50 | .num_mask = 0x1fff, | 50 | .num_mask = 0x1fff, |
51 | .den_mask = 0x1fff, | 51 | .den_mask = 0x1fff, |
@@ -53,7 +53,7 @@ static struct clk_factor_masks uart_factor_masks = { | |||
53 | .den_shift = 0, | 53 | .den_shift = 0, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | static struct clk_factor_tbl uart_factor_tbl[] = { | 56 | static struct mmp_clk_factor_tbl uart_factor_tbl[] = { |
57 | {.num = 8125, .den = 1536}, /*14.745MHZ */ | 57 | {.num = 8125, .den = 1536}, /*14.745MHZ */ |
58 | }; | 58 | }; |
59 | 59 | ||
@@ -163,7 +163,7 @@ void __init pxa910_clk_init(void) | |||
163 | uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0, | 163 | uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0, |
164 | mpmu_base + MPMU_UART_PLL, | 164 | mpmu_base + MPMU_UART_PLL, |
165 | &uart_factor_masks, uart_factor_tbl, | 165 | &uart_factor_masks, uart_factor_tbl, |
166 | ARRAY_SIZE(uart_factor_tbl)); | 166 | ARRAY_SIZE(uart_factor_tbl), &clk_lock); |
167 | clk_set_rate(uart_pll, 14745600); | 167 | clk_set_rate(uart_pll, 14745600); |
168 | clk_register_clkdev(uart_pll, "uart_pll", NULL); | 168 | clk_register_clkdev(uart_pll, "uart_pll", NULL); |
169 | 169 | ||
diff --git a/drivers/clk/mmp/clk.c b/drivers/clk/mmp/clk.c new file mode 100644 index 000000000000..cf038ef54c59 --- /dev/null +++ b/drivers/clk/mmp/clk.c | |||
@@ -0,0 +1,192 @@ | |||
1 | #include <linux/io.h> | ||
2 | #include <linux/clk.h> | ||
3 | #include <linux/clk-provider.h> | ||
4 | #include <linux/clkdev.h> | ||
5 | #include <linux/of.h> | ||
6 | #include <linux/of_address.h> | ||
7 | |||
8 | #include "clk.h" | ||
9 | |||
10 | void mmp_clk_init(struct device_node *np, struct mmp_clk_unit *unit, | ||
11 | int nr_clks) | ||
12 | { | ||
13 | static struct clk **clk_table; | ||
14 | |||
15 | clk_table = kcalloc(nr_clks, sizeof(struct clk *), GFP_KERNEL); | ||
16 | if (!clk_table) | ||
17 | return; | ||
18 | |||
19 | unit->clk_table = clk_table; | ||
20 | unit->nr_clks = nr_clks; | ||
21 | unit->clk_data.clks = clk_table; | ||
22 | unit->clk_data.clk_num = nr_clks; | ||
23 | of_clk_add_provider(np, of_clk_src_onecell_get, &unit->clk_data); | ||
24 | } | ||
25 | |||
26 | void mmp_register_fixed_rate_clks(struct mmp_clk_unit *unit, | ||
27 | struct mmp_param_fixed_rate_clk *clks, | ||
28 | int size) | ||
29 | { | ||
30 | int i; | ||
31 | struct clk *clk; | ||
32 | |||
33 | for (i = 0; i < size; i++) { | ||
34 | clk = clk_register_fixed_rate(NULL, clks[i].name, | ||
35 | clks[i].parent_name, | ||
36 | clks[i].flags, | ||
37 | clks[i].fixed_rate); | ||
38 | if (IS_ERR(clk)) { | ||
39 | pr_err("%s: failed to register clock %s\n", | ||
40 | __func__, clks[i].name); | ||
41 | continue; | ||
42 | } | ||
43 | if (clks[i].id) | ||
44 | unit->clk_table[clks[i].id] = clk; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | void mmp_register_fixed_factor_clks(struct mmp_clk_unit *unit, | ||
49 | struct mmp_param_fixed_factor_clk *clks, | ||
50 | int size) | ||
51 | { | ||
52 | struct clk *clk; | ||
53 | int i; | ||
54 | |||
55 | for (i = 0; i < size; i++) { | ||
56 | clk = clk_register_fixed_factor(NULL, clks[i].name, | ||
57 | clks[i].parent_name, | ||
58 | clks[i].flags, clks[i].mult, | ||
59 | clks[i].div); | ||
60 | if (IS_ERR(clk)) { | ||
61 | pr_err("%s: failed to register clock %s\n", | ||
62 | __func__, clks[i].name); | ||
63 | continue; | ||
64 | } | ||
65 | if (clks[i].id) | ||
66 | unit->clk_table[clks[i].id] = clk; | ||
67 | } | ||
68 | } | ||
69 | |||
70 | void mmp_register_general_gate_clks(struct mmp_clk_unit *unit, | ||
71 | struct mmp_param_general_gate_clk *clks, | ||
72 | void __iomem *base, int size) | ||
73 | { | ||
74 | struct clk *clk; | ||
75 | int i; | ||
76 | |||
77 | for (i = 0; i < size; i++) { | ||
78 | clk = clk_register_gate(NULL, clks[i].name, | ||
79 | clks[i].parent_name, | ||
80 | clks[i].flags, | ||
81 | base + clks[i].offset, | ||
82 | clks[i].bit_idx, | ||
83 | clks[i].gate_flags, | ||
84 | clks[i].lock); | ||
85 | |||
86 | if (IS_ERR(clk)) { | ||
87 | pr_err("%s: failed to register clock %s\n", | ||
88 | __func__, clks[i].name); | ||
89 | continue; | ||
90 | } | ||
91 | if (clks[i].id) | ||
92 | unit->clk_table[clks[i].id] = clk; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | void mmp_register_gate_clks(struct mmp_clk_unit *unit, | ||
97 | struct mmp_param_gate_clk *clks, | ||
98 | void __iomem *base, int size) | ||
99 | { | ||
100 | struct clk *clk; | ||
101 | int i; | ||
102 | |||
103 | for (i = 0; i < size; i++) { | ||
104 | clk = mmp_clk_register_gate(NULL, clks[i].name, | ||
105 | clks[i].parent_name, | ||
106 | clks[i].flags, | ||
107 | base + clks[i].offset, | ||
108 | clks[i].mask, | ||
109 | clks[i].val_enable, | ||
110 | clks[i].val_disable, | ||
111 | clks[i].gate_flags, | ||
112 | clks[i].lock); | ||
113 | |||
114 | if (IS_ERR(clk)) { | ||
115 | pr_err("%s: failed to register clock %s\n", | ||
116 | __func__, clks[i].name); | ||
117 | continue; | ||
118 | } | ||
119 | if (clks[i].id) | ||
120 | unit->clk_table[clks[i].id] = clk; | ||
121 | } | ||
122 | } | ||
123 | |||
124 | void mmp_register_mux_clks(struct mmp_clk_unit *unit, | ||
125 | struct mmp_param_mux_clk *clks, | ||
126 | void __iomem *base, int size) | ||
127 | { | ||
128 | struct clk *clk; | ||
129 | int i; | ||
130 | |||
131 | for (i = 0; i < size; i++) { | ||
132 | clk = clk_register_mux(NULL, clks[i].name, | ||
133 | clks[i].parent_name, | ||
134 | clks[i].num_parents, | ||
135 | clks[i].flags, | ||
136 | base + clks[i].offset, | ||
137 | clks[i].shift, | ||
138 | clks[i].width, | ||
139 | clks[i].mux_flags, | ||
140 | clks[i].lock); | ||
141 | |||
142 | if (IS_ERR(clk)) { | ||
143 | pr_err("%s: failed to register clock %s\n", | ||
144 | __func__, clks[i].name); | ||
145 | continue; | ||
146 | } | ||
147 | if (clks[i].id) | ||
148 | unit->clk_table[clks[i].id] = clk; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | void mmp_register_div_clks(struct mmp_clk_unit *unit, | ||
153 | struct mmp_param_div_clk *clks, | ||
154 | void __iomem *base, int size) | ||
155 | { | ||
156 | struct clk *clk; | ||
157 | int i; | ||
158 | |||
159 | for (i = 0; i < size; i++) { | ||
160 | clk = clk_register_divider(NULL, clks[i].name, | ||
161 | clks[i].parent_name, | ||
162 | clks[i].flags, | ||
163 | base + clks[i].offset, | ||
164 | clks[i].shift, | ||
165 | clks[i].width, | ||
166 | clks[i].div_flags, | ||
167 | clks[i].lock); | ||
168 | |||
169 | if (IS_ERR(clk)) { | ||
170 | pr_err("%s: failed to register clock %s\n", | ||
171 | __func__, clks[i].name); | ||
172 | continue; | ||
173 | } | ||
174 | if (clks[i].id) | ||
175 | unit->clk_table[clks[i].id] = clk; | ||
176 | } | ||
177 | } | ||
178 | |||
179 | void mmp_clk_add(struct mmp_clk_unit *unit, unsigned int id, | ||
180 | struct clk *clk) | ||
181 | { | ||
182 | if (IS_ERR_OR_NULL(clk)) { | ||
183 | pr_err("CLK %d has invalid pointer %p\n", id, clk); | ||
184 | return; | ||
185 | } | ||
186 | if (id > unit->nr_clks) { | ||
187 | pr_err("CLK %d is invalid\n", id); | ||
188 | return; | ||
189 | } | ||
190 | |||
191 | unit->clk_table[id] = clk; | ||
192 | } | ||
diff --git a/drivers/clk/mmp/clk.h b/drivers/clk/mmp/clk.h index ab86dd4a416a..adf9b711b037 100644 --- a/drivers/clk/mmp/clk.h +++ b/drivers/clk/mmp/clk.h | |||
@@ -7,19 +7,123 @@ | |||
7 | #define APBC_NO_BUS_CTRL BIT(0) | 7 | #define APBC_NO_BUS_CTRL BIT(0) |
8 | #define APBC_POWER_CTRL BIT(1) | 8 | #define APBC_POWER_CTRL BIT(1) |
9 | 9 | ||
10 | struct clk_factor_masks { | 10 | |
11 | unsigned int factor; | 11 | /* Clock type "factor" */ |
12 | unsigned int num_mask; | 12 | struct mmp_clk_factor_masks { |
13 | unsigned int den_mask; | 13 | unsigned int factor; |
14 | unsigned int num_shift; | 14 | unsigned int num_mask; |
15 | unsigned int den_shift; | 15 | unsigned int den_mask; |
16 | unsigned int num_shift; | ||
17 | unsigned int den_shift; | ||
16 | }; | 18 | }; |
17 | 19 | ||
18 | struct clk_factor_tbl { | 20 | struct mmp_clk_factor_tbl { |
19 | unsigned int num; | 21 | unsigned int num; |
20 | unsigned int den; | 22 | unsigned int den; |
21 | }; | 23 | }; |
22 | 24 | ||
25 | struct mmp_clk_factor { | ||
26 | struct clk_hw hw; | ||
27 | void __iomem *base; | ||
28 | struct mmp_clk_factor_masks *masks; | ||
29 | struct mmp_clk_factor_tbl *ftbl; | ||
30 | unsigned int ftbl_cnt; | ||
31 | spinlock_t *lock; | ||
32 | }; | ||
33 | |||
34 | extern struct clk *mmp_clk_register_factor(const char *name, | ||
35 | const char *parent_name, unsigned long flags, | ||
36 | void __iomem *base, struct mmp_clk_factor_masks *masks, | ||
37 | struct mmp_clk_factor_tbl *ftbl, unsigned int ftbl_cnt, | ||
38 | spinlock_t *lock); | ||
39 | |||
40 | /* Clock type "mix" */ | ||
41 | #define MMP_CLK_BITS_MASK(width, shift) \ | ||
42 | (((1 << (width)) - 1) << (shift)) | ||
43 | #define MMP_CLK_BITS_GET_VAL(data, width, shift) \ | ||
44 | ((data & MMP_CLK_BITS_MASK(width, shift)) >> (shift)) | ||
45 | #define MMP_CLK_BITS_SET_VAL(val, width, shift) \ | ||
46 | (((val) << (shift)) & MMP_CLK_BITS_MASK(width, shift)) | ||
47 | |||
48 | enum { | ||
49 | MMP_CLK_MIX_TYPE_V1, | ||
50 | MMP_CLK_MIX_TYPE_V2, | ||
51 | MMP_CLK_MIX_TYPE_V3, | ||
52 | }; | ||
53 | |||
54 | /* The register layout */ | ||
55 | struct mmp_clk_mix_reg_info { | ||
56 | void __iomem *reg_clk_ctrl; | ||
57 | void __iomem *reg_clk_sel; | ||
58 | u8 width_div; | ||
59 | u8 shift_div; | ||
60 | u8 width_mux; | ||
61 | u8 shift_mux; | ||
62 | u8 bit_fc; | ||
63 | }; | ||
64 | |||
65 | /* The suggested clock table from user. */ | ||
66 | struct mmp_clk_mix_clk_table { | ||
67 | unsigned long rate; | ||
68 | u8 parent_index; | ||
69 | unsigned int divisor; | ||
70 | unsigned int valid; | ||
71 | }; | ||
72 | |||
73 | struct mmp_clk_mix_config { | ||
74 | struct mmp_clk_mix_reg_info reg_info; | ||
75 | struct mmp_clk_mix_clk_table *table; | ||
76 | unsigned int table_size; | ||
77 | u32 *mux_table; | ||
78 | struct clk_div_table *div_table; | ||
79 | u8 div_flags; | ||
80 | u8 mux_flags; | ||
81 | }; | ||
82 | |||
83 | struct mmp_clk_mix { | ||
84 | struct clk_hw hw; | ||
85 | struct mmp_clk_mix_reg_info reg_info; | ||
86 | struct mmp_clk_mix_clk_table *table; | ||
87 | u32 *mux_table; | ||
88 | struct clk_div_table *div_table; | ||
89 | unsigned int table_size; | ||
90 | u8 div_flags; | ||
91 | u8 mux_flags; | ||
92 | unsigned int type; | ||
93 | spinlock_t *lock; | ||
94 | }; | ||
95 | |||
96 | extern const struct clk_ops mmp_clk_mix_ops; | ||
97 | extern struct clk *mmp_clk_register_mix(struct device *dev, | ||
98 | const char *name, | ||
99 | const char **parent_names, | ||
100 | u8 num_parents, | ||
101 | unsigned long flags, | ||
102 | struct mmp_clk_mix_config *config, | ||
103 | spinlock_t *lock); | ||
104 | |||
105 | |||
106 | /* Clock type "gate". MMP private gate */ | ||
107 | #define MMP_CLK_GATE_NEED_DELAY BIT(0) | ||
108 | |||
109 | struct mmp_clk_gate { | ||
110 | struct clk_hw hw; | ||
111 | void __iomem *reg; | ||
112 | u32 mask; | ||
113 | u32 val_enable; | ||
114 | u32 val_disable; | ||
115 | unsigned int flags; | ||
116 | spinlock_t *lock; | ||
117 | }; | ||
118 | |||
119 | extern const struct clk_ops mmp_clk_gate_ops; | ||
120 | extern struct clk *mmp_clk_register_gate(struct device *dev, const char *name, | ||
121 | const char *parent_name, unsigned long flags, | ||
122 | void __iomem *reg, u32 mask, u32 val_enable, | ||
123 | u32 val_disable, unsigned int gate_flags, | ||
124 | spinlock_t *lock); | ||
125 | |||
126 | |||
23 | extern struct clk *mmp_clk_register_pll2(const char *name, | 127 | extern struct clk *mmp_clk_register_pll2(const char *name, |
24 | const char *parent_name, unsigned long flags); | 128 | const char *parent_name, unsigned long flags); |
25 | extern struct clk *mmp_clk_register_apbc(const char *name, | 129 | extern struct clk *mmp_clk_register_apbc(const char *name, |
@@ -28,8 +132,108 @@ extern struct clk *mmp_clk_register_apbc(const char *name, | |||
28 | extern struct clk *mmp_clk_register_apmu(const char *name, | 132 | extern struct clk *mmp_clk_register_apmu(const char *name, |
29 | const char *parent_name, void __iomem *base, u32 enable_mask, | 133 | const char *parent_name, void __iomem *base, u32 enable_mask, |
30 | spinlock_t *lock); | 134 | spinlock_t *lock); |
31 | extern struct clk *mmp_clk_register_factor(const char *name, | 135 | |
32 | const char *parent_name, unsigned long flags, | 136 | struct mmp_clk_unit { |
33 | void __iomem *base, struct clk_factor_masks *masks, | 137 | unsigned int nr_clks; |
34 | struct clk_factor_tbl *ftbl, unsigned int ftbl_cnt); | 138 | struct clk **clk_table; |
139 | struct clk_onecell_data clk_data; | ||
140 | }; | ||
141 | |||
142 | struct mmp_param_fixed_rate_clk { | ||
143 | unsigned int id; | ||
144 | char *name; | ||
145 | const char *parent_name; | ||
146 | unsigned long flags; | ||
147 | unsigned long fixed_rate; | ||
148 | }; | ||
149 | void mmp_register_fixed_rate_clks(struct mmp_clk_unit *unit, | ||
150 | struct mmp_param_fixed_rate_clk *clks, | ||
151 | int size); | ||
152 | |||
153 | struct mmp_param_fixed_factor_clk { | ||
154 | unsigned int id; | ||
155 | char *name; | ||
156 | const char *parent_name; | ||
157 | unsigned long mult; | ||
158 | unsigned long div; | ||
159 | unsigned long flags; | ||
160 | }; | ||
161 | void mmp_register_fixed_factor_clks(struct mmp_clk_unit *unit, | ||
162 | struct mmp_param_fixed_factor_clk *clks, | ||
163 | int size); | ||
164 | |||
165 | struct mmp_param_general_gate_clk { | ||
166 | unsigned int id; | ||
167 | const char *name; | ||
168 | const char *parent_name; | ||
169 | unsigned long flags; | ||
170 | unsigned long offset; | ||
171 | u8 bit_idx; | ||
172 | u8 gate_flags; | ||
173 | spinlock_t *lock; | ||
174 | }; | ||
175 | void mmp_register_general_gate_clks(struct mmp_clk_unit *unit, | ||
176 | struct mmp_param_general_gate_clk *clks, | ||
177 | void __iomem *base, int size); | ||
178 | |||
179 | struct mmp_param_gate_clk { | ||
180 | unsigned int id; | ||
181 | char *name; | ||
182 | const char *parent_name; | ||
183 | unsigned long flags; | ||
184 | unsigned long offset; | ||
185 | u32 mask; | ||
186 | u32 val_enable; | ||
187 | u32 val_disable; | ||
188 | unsigned int gate_flags; | ||
189 | spinlock_t *lock; | ||
190 | }; | ||
191 | void mmp_register_gate_clks(struct mmp_clk_unit *unit, | ||
192 | struct mmp_param_gate_clk *clks, | ||
193 | void __iomem *base, int size); | ||
194 | |||
195 | struct mmp_param_mux_clk { | ||
196 | unsigned int id; | ||
197 | char *name; | ||
198 | const char **parent_name; | ||
199 | u8 num_parents; | ||
200 | unsigned long flags; | ||
201 | unsigned long offset; | ||
202 | u8 shift; | ||
203 | u8 width; | ||
204 | u8 mux_flags; | ||
205 | spinlock_t *lock; | ||
206 | }; | ||
207 | void mmp_register_mux_clks(struct mmp_clk_unit *unit, | ||
208 | struct mmp_param_mux_clk *clks, | ||
209 | void __iomem *base, int size); | ||
210 | |||
211 | struct mmp_param_div_clk { | ||
212 | unsigned int id; | ||
213 | char *name; | ||
214 | const char *parent_name; | ||
215 | unsigned long flags; | ||
216 | unsigned long offset; | ||
217 | u8 shift; | ||
218 | u8 width; | ||
219 | u8 div_flags; | ||
220 | spinlock_t *lock; | ||
221 | }; | ||
222 | void mmp_register_div_clks(struct mmp_clk_unit *unit, | ||
223 | struct mmp_param_div_clk *clks, | ||
224 | void __iomem *base, int size); | ||
225 | |||
226 | #define DEFINE_MIX_REG_INFO(w_d, s_d, w_m, s_m, fc) \ | ||
227 | { \ | ||
228 | .width_div = (w_d), \ | ||
229 | .shift_div = (s_d), \ | ||
230 | .width_mux = (w_m), \ | ||
231 | .shift_mux = (s_m), \ | ||
232 | .bit_fc = (fc), \ | ||
233 | } | ||
234 | |||
235 | void mmp_clk_init(struct device_node *np, struct mmp_clk_unit *unit, | ||
236 | int nr_clks); | ||
237 | void mmp_clk_add(struct mmp_clk_unit *unit, unsigned int id, | ||
238 | struct clk *clk); | ||
35 | #endif | 239 | #endif |
diff --git a/drivers/clk/mmp/reset.c b/drivers/clk/mmp/reset.c new file mode 100644 index 000000000000..b54da1fe73f0 --- /dev/null +++ b/drivers/clk/mmp/reset.c | |||
@@ -0,0 +1,99 @@ | |||
1 | #include <linux/slab.h> | ||
2 | #include <linux/io.h> | ||
3 | #include <linux/of.h> | ||
4 | #include <linux/of_address.h> | ||
5 | #include <linux/reset-controller.h> | ||
6 | |||
7 | #include "reset.h" | ||
8 | |||
9 | #define rcdev_to_unit(rcdev) container_of(rcdev, struct mmp_clk_reset_unit, rcdev) | ||
10 | |||
11 | static int mmp_of_reset_xlate(struct reset_controller_dev *rcdev, | ||
12 | const struct of_phandle_args *reset_spec) | ||
13 | { | ||
14 | struct mmp_clk_reset_unit *unit = rcdev_to_unit(rcdev); | ||
15 | struct mmp_clk_reset_cell *cell; | ||
16 | int i; | ||
17 | |||
18 | if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells)) | ||
19 | return -EINVAL; | ||
20 | |||
21 | for (i = 0; i < rcdev->nr_resets; i++) { | ||
22 | cell = &unit->cells[i]; | ||
23 | if (cell->clk_id == reset_spec->args[0]) | ||
24 | break; | ||
25 | } | ||
26 | |||
27 | if (i == rcdev->nr_resets) | ||
28 | return -EINVAL; | ||
29 | |||
30 | return i; | ||
31 | } | ||
32 | |||
33 | static int mmp_clk_reset_assert(struct reset_controller_dev *rcdev, | ||
34 | unsigned long id) | ||
35 | { | ||
36 | struct mmp_clk_reset_unit *unit = rcdev_to_unit(rcdev); | ||
37 | struct mmp_clk_reset_cell *cell; | ||
38 | unsigned long flags = 0; | ||
39 | u32 val; | ||
40 | |||
41 | cell = &unit->cells[id]; | ||
42 | if (cell->lock) | ||
43 | spin_lock_irqsave(cell->lock, flags); | ||
44 | |||
45 | val = readl(cell->reg); | ||
46 | val |= cell->bits; | ||
47 | writel(val, cell->reg); | ||
48 | |||
49 | if (cell->lock) | ||
50 | spin_unlock_irqrestore(cell->lock, flags); | ||
51 | |||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | static int mmp_clk_reset_deassert(struct reset_controller_dev *rcdev, | ||
56 | unsigned long id) | ||
57 | { | ||
58 | struct mmp_clk_reset_unit *unit = rcdev_to_unit(rcdev); | ||
59 | struct mmp_clk_reset_cell *cell; | ||
60 | unsigned long flags = 0; | ||
61 | u32 val; | ||
62 | |||
63 | cell = &unit->cells[id]; | ||
64 | if (cell->lock) | ||
65 | spin_lock_irqsave(cell->lock, flags); | ||
66 | |||
67 | val = readl(cell->reg); | ||
68 | val &= ~cell->bits; | ||
69 | writel(val, cell->reg); | ||
70 | |||
71 | if (cell->lock) | ||
72 | spin_unlock_irqrestore(cell->lock, flags); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static struct reset_control_ops mmp_clk_reset_ops = { | ||
78 | .assert = mmp_clk_reset_assert, | ||
79 | .deassert = mmp_clk_reset_deassert, | ||
80 | }; | ||
81 | |||
82 | void mmp_clk_reset_register(struct device_node *np, | ||
83 | struct mmp_clk_reset_cell *cells, int nr_resets) | ||
84 | { | ||
85 | struct mmp_clk_reset_unit *unit; | ||
86 | |||
87 | unit = kzalloc(sizeof(*unit), GFP_KERNEL); | ||
88 | if (!unit) | ||
89 | return; | ||
90 | |||
91 | unit->cells = cells; | ||
92 | unit->rcdev.of_reset_n_cells = 1; | ||
93 | unit->rcdev.nr_resets = nr_resets; | ||
94 | unit->rcdev.ops = &mmp_clk_reset_ops; | ||
95 | unit->rcdev.of_node = np; | ||
96 | unit->rcdev.of_xlate = mmp_of_reset_xlate; | ||
97 | |||
98 | reset_controller_register(&unit->rcdev); | ||
99 | } | ||
diff --git a/drivers/clk/mmp/reset.h b/drivers/clk/mmp/reset.h new file mode 100644 index 000000000000..be8b1a7000f7 --- /dev/null +++ b/drivers/clk/mmp/reset.h | |||
@@ -0,0 +1,31 @@ | |||
1 | #ifndef __MACH_MMP_CLK_RESET_H | ||
2 | #define __MACH_MMP_CLK_RESET_H | ||
3 | |||
4 | #include <linux/reset-controller.h> | ||
5 | |||
6 | #define MMP_RESET_INVERT 1 | ||
7 | |||
8 | struct mmp_clk_reset_cell { | ||
9 | unsigned int clk_id; | ||
10 | void __iomem *reg; | ||
11 | u32 bits; | ||
12 | unsigned int flags; | ||
13 | spinlock_t *lock; | ||
14 | }; | ||
15 | |||
16 | struct mmp_clk_reset_unit { | ||
17 | struct reset_controller_dev rcdev; | ||
18 | struct mmp_clk_reset_cell *cells; | ||
19 | }; | ||
20 | |||
21 | #ifdef CONFIG_RESET_CONTROLLER | ||
22 | void mmp_clk_reset_register(struct device_node *np, | ||
23 | struct mmp_clk_reset_cell *cells, int nr_resets); | ||
24 | #else | ||
25 | static inline void mmp_clk_reset_register(struct device_node *np, | ||
26 | struct mmp_clk_reset_cell *cells, int nr_resets) | ||
27 | { | ||
28 | } | ||
29 | #endif | ||
30 | |||
31 | #endif | ||
diff --git a/drivers/clk/pxa/Makefile b/drivers/clk/pxa/Makefile index 4ff2abcd500b..38e915344605 100644 --- a/drivers/clk/pxa/Makefile +++ b/drivers/clk/pxa/Makefile | |||
@@ -1,2 +1,3 @@ | |||
1 | obj-y += clk-pxa.o | 1 | obj-y += clk-pxa.o |
2 | obj-$(CONFIG_PXA25x) += clk-pxa25x.o | ||
2 | obj-$(CONFIG_PXA27x) += clk-pxa27x.o | 3 | obj-$(CONFIG_PXA27x) += clk-pxa27x.o |
diff --git a/drivers/clk/pxa/clk-pxa.c b/drivers/clk/pxa/clk-pxa.c index ef3c05389c0a..4e834753ab09 100644 --- a/drivers/clk/pxa/clk-pxa.c +++ b/drivers/clk/pxa/clk-pxa.c | |||
@@ -26,12 +26,20 @@ static struct clk_onecell_data onecell_data = { | |||
26 | .clk_num = CLK_MAX, | 26 | .clk_num = CLK_MAX, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | #define to_pxa_clk(_hw) container_of(_hw, struct pxa_clk_cken, hw) | 29 | struct pxa_clk { |
30 | struct clk_hw hw; | ||
31 | struct clk_fixed_factor lp; | ||
32 | struct clk_fixed_factor hp; | ||
33 | struct clk_gate gate; | ||
34 | bool (*is_in_low_power)(void); | ||
35 | }; | ||
36 | |||
37 | #define to_pxa_clk(_hw) container_of(_hw, struct pxa_clk, hw) | ||
30 | 38 | ||
31 | static unsigned long cken_recalc_rate(struct clk_hw *hw, | 39 | static unsigned long cken_recalc_rate(struct clk_hw *hw, |
32 | unsigned long parent_rate) | 40 | unsigned long parent_rate) |
33 | { | 41 | { |
34 | struct pxa_clk_cken *pclk = to_pxa_clk(hw); | 42 | struct pxa_clk *pclk = to_pxa_clk(hw); |
35 | struct clk_fixed_factor *fix; | 43 | struct clk_fixed_factor *fix; |
36 | 44 | ||
37 | if (!pclk->is_in_low_power || pclk->is_in_low_power()) | 45 | if (!pclk->is_in_low_power || pclk->is_in_low_power()) |
@@ -48,7 +56,7 @@ static struct clk_ops cken_rate_ops = { | |||
48 | 56 | ||
49 | static u8 cken_get_parent(struct clk_hw *hw) | 57 | static u8 cken_get_parent(struct clk_hw *hw) |
50 | { | 58 | { |
51 | struct pxa_clk_cken *pclk = to_pxa_clk(hw); | 59 | struct pxa_clk *pclk = to_pxa_clk(hw); |
52 | 60 | ||
53 | if (!pclk->is_in_low_power) | 61 | if (!pclk->is_in_low_power) |
54 | return 0; | 62 | return 0; |
@@ -69,29 +77,32 @@ void __init clkdev_pxa_register(int ckid, const char *con_id, | |||
69 | clk_register_clkdev(clk, con_id, dev_id); | 77 | clk_register_clkdev(clk, con_id, dev_id); |
70 | } | 78 | } |
71 | 79 | ||
72 | int __init clk_pxa_cken_init(struct pxa_clk_cken *clks, int nb_clks) | 80 | int __init clk_pxa_cken_init(const struct desc_clk_cken *clks, int nb_clks) |
73 | { | 81 | { |
74 | int i; | 82 | int i; |
75 | struct pxa_clk_cken *pclk; | 83 | struct pxa_clk *pxa_clk; |
76 | struct clk *clk; | 84 | struct clk *clk; |
77 | 85 | ||
78 | for (i = 0; i < nb_clks; i++) { | 86 | for (i = 0; i < nb_clks; i++) { |
79 | pclk = clks + i; | 87 | pxa_clk = kzalloc(sizeof(*pxa_clk), GFP_KERNEL); |
80 | pclk->gate.lock = &lock; | 88 | pxa_clk->is_in_low_power = clks[i].is_in_low_power; |
81 | clk = clk_register_composite(NULL, pclk->name, | 89 | pxa_clk->lp = clks[i].lp; |
82 | pclk->parent_names, 2, | 90 | pxa_clk->hp = clks[i].hp; |
83 | &pclk->hw, &cken_mux_ops, | 91 | pxa_clk->gate = clks[i].gate; |
84 | &pclk->hw, &cken_rate_ops, | 92 | pxa_clk->gate.lock = &lock; |
85 | &pclk->gate.hw, &clk_gate_ops, | 93 | clk = clk_register_composite(NULL, clks[i].name, |
86 | pclk->flags); | 94 | clks[i].parent_names, 2, |
87 | clkdev_pxa_register(pclk->ckid, pclk->con_id, pclk->dev_id, | 95 | &pxa_clk->hw, &cken_mux_ops, |
88 | clk); | 96 | &pxa_clk->hw, &cken_rate_ops, |
97 | &pxa_clk->gate.hw, &clk_gate_ops, | ||
98 | clks[i].flags); | ||
99 | clkdev_pxa_register(clks[i].ckid, clks[i].con_id, | ||
100 | clks[i].dev_id, clk); | ||
89 | } | 101 | } |
90 | return 0; | 102 | return 0; |
91 | } | 103 | } |
92 | 104 | ||
93 | static void __init pxa_dt_clocks_init(struct device_node *np) | 105 | void __init clk_pxa_dt_common_init(struct device_node *np) |
94 | { | 106 | { |
95 | of_clk_add_provider(np, of_clk_src_onecell_get, &onecell_data); | 107 | of_clk_add_provider(np, of_clk_src_onecell_get, &onecell_data); |
96 | } | 108 | } |
97 | CLK_OF_DECLARE(pxa_clks, "marvell,pxa-clocks", pxa_dt_clocks_init); | ||
diff --git a/drivers/clk/pxa/clk-pxa.h b/drivers/clk/pxa/clk-pxa.h index 5fe219d06b49..323965430111 100644 --- a/drivers/clk/pxa/clk-pxa.h +++ b/drivers/clk/pxa/clk-pxa.h | |||
@@ -25,7 +25,7 @@ | |||
25 | static struct clk_ops name ## _rate_ops = { \ | 25 | static struct clk_ops name ## _rate_ops = { \ |
26 | .recalc_rate = name ## _get_rate, \ | 26 | .recalc_rate = name ## _get_rate, \ |
27 | }; \ | 27 | }; \ |
28 | static struct clk *clk_register_ ## name(void) \ | 28 | static struct clk * __init clk_register_ ## name(void) \ |
29 | { \ | 29 | { \ |
30 | return clk_register_composite(NULL, clk_name, \ | 30 | return clk_register_composite(NULL, clk_name, \ |
31 | name ## _parents, \ | 31 | name ## _parents, \ |
@@ -40,7 +40,7 @@ | |||
40 | static struct clk_ops name ## _rate_ops = { \ | 40 | static struct clk_ops name ## _rate_ops = { \ |
41 | .recalc_rate = name ## _get_rate, \ | 41 | .recalc_rate = name ## _get_rate, \ |
42 | }; \ | 42 | }; \ |
43 | static struct clk *clk_register_ ## name(void) \ | 43 | static struct clk * __init clk_register_ ## name(void) \ |
44 | { \ | 44 | { \ |
45 | return clk_register_composite(NULL, clk_name, \ | 45 | return clk_register_composite(NULL, clk_name, \ |
46 | name ## _parents, \ | 46 | name ## _parents, \ |
@@ -66,7 +66,7 @@ | |||
66 | * | Clock | --- | / div_hp | | 66 | * | Clock | --- | / div_hp | |
67 | * +------------+ +-----------+ | 67 | * +------------+ +-----------+ |
68 | */ | 68 | */ |
69 | struct pxa_clk_cken { | 69 | struct desc_clk_cken { |
70 | struct clk_hw hw; | 70 | struct clk_hw hw; |
71 | int ckid; | 71 | int ckid; |
72 | const char *name; | 72 | const char *name; |
@@ -102,6 +102,7 @@ static int dummy_clk_set_parent(struct clk_hw *hw, u8 index) | |||
102 | 102 | ||
103 | extern void clkdev_pxa_register(int ckid, const char *con_id, | 103 | extern void clkdev_pxa_register(int ckid, const char *con_id, |
104 | const char *dev_id, struct clk *clk); | 104 | const char *dev_id, struct clk *clk); |
105 | extern int clk_pxa_cken_init(struct pxa_clk_cken *clks, int nb_clks); | 105 | extern int clk_pxa_cken_init(const struct desc_clk_cken *clks, int nb_clks); |
106 | void clk_pxa_dt_common_init(struct device_node *np); | ||
106 | 107 | ||
107 | #endif | 108 | #endif |
diff --git a/drivers/clk/pxa/clk-pxa25x.c b/drivers/clk/pxa/clk-pxa25x.c new file mode 100644 index 000000000000..6cd88d963a7f --- /dev/null +++ b/drivers/clk/pxa/clk-pxa25x.c | |||
@@ -0,0 +1,273 @@ | |||
1 | /* | ||
2 | * Marvell PXA25x family clocks | ||
3 | * | ||
4 | * Copyright (C) 2014 Robert Jarzmik | ||
5 | * | ||
6 | * Heavily inspired from former arch/arm/mach-pxa/pxa25x.c. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * For non-devicetree platforms. Once pxa is fully converted to devicetree, this | ||
13 | * should go away. | ||
14 | */ | ||
15 | #include <linux/clk-provider.h> | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/clkdev.h> | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/of.h> | ||
20 | #include <mach/pxa25x.h> | ||
21 | #include <mach/pxa2xx-regs.h> | ||
22 | |||
23 | #include <dt-bindings/clock/pxa-clock.h> | ||
24 | #include "clk-pxa.h" | ||
25 | |||
26 | #define KHz 1000 | ||
27 | #define MHz (1000 * 1000) | ||
28 | |||
29 | enum { | ||
30 | PXA_CORE_RUN = 0, | ||
31 | PXA_CORE_TURBO, | ||
32 | }; | ||
33 | |||
34 | /* | ||
35 | * Various clock factors driven by the CCCR register. | ||
36 | */ | ||
37 | |||
38 | /* Crystal Frequency to Memory Frequency Multiplier (L) */ | ||
39 | static unsigned char L_clk_mult[32] = { 0, 27, 32, 36, 40, 45, 0, }; | ||
40 | |||
41 | /* Memory Frequency to Run Mode Frequency Multiplier (M) */ | ||
42 | static unsigned char M_clk_mult[4] = { 0, 1, 2, 4 }; | ||
43 | |||
44 | /* Run Mode Frequency to Turbo Mode Frequency Multiplier (N) */ | ||
45 | /* Note: we store the value N * 2 here. */ | ||
46 | static unsigned char N2_clk_mult[8] = { 0, 0, 2, 3, 4, 0, 6, 0 }; | ||
47 | |||
48 | static const char * const get_freq_khz[] = { | ||
49 | "core", "run", "cpll", "memory" | ||
50 | }; | ||
51 | |||
52 | /* | ||
53 | * Get the clock frequency as reflected by CCCR and the turbo flag. | ||
54 | * We assume these values have been applied via a fcs. | ||
55 | * If info is not 0 we also display the current settings. | ||
56 | */ | ||
57 | unsigned int pxa25x_get_clk_frequency_khz(int info) | ||
58 | { | ||
59 | struct clk *clk; | ||
60 | unsigned long clks[5]; | ||
61 | int i; | ||
62 | |||
63 | for (i = 0; i < ARRAY_SIZE(get_freq_khz); i++) { | ||
64 | clk = clk_get(NULL, get_freq_khz[i]); | ||
65 | if (IS_ERR(clk)) { | ||
66 | clks[i] = 0; | ||
67 | } else { | ||
68 | clks[i] = clk_get_rate(clk); | ||
69 | clk_put(clk); | ||
70 | } | ||
71 | } | ||
72 | |||
73 | if (info) { | ||
74 | pr_info("Run Mode clock: %ld.%02ldMHz\n", | ||
75 | clks[1] / 1000000, (clks[1] % 1000000) / 10000); | ||
76 | pr_info("Turbo Mode clock: %ld.%02ldMHz\n", | ||
77 | clks[2] / 1000000, (clks[2] % 1000000) / 10000); | ||
78 | pr_info("Memory clock: %ld.%02ldMHz\n", | ||
79 | clks[3] / 1000000, (clks[3] % 1000000) / 10000); | ||
80 | } | ||
81 | |||
82 | return (unsigned int)clks[0]; | ||
83 | } | ||
84 | |||
85 | static unsigned long clk_pxa25x_memory_get_rate(struct clk_hw *hw, | ||
86 | unsigned long parent_rate) | ||
87 | { | ||
88 | unsigned long cccr = CCCR; | ||
89 | unsigned int m = M_clk_mult[(cccr >> 5) & 0x03]; | ||
90 | |||
91 | return parent_rate / m; | ||
92 | } | ||
93 | PARENTS(clk_pxa25x_memory) = { "run" }; | ||
94 | RATE_RO_OPS(clk_pxa25x_memory, "memory"); | ||
95 | |||
96 | PARENTS(pxa25x_pbus95) = { "ppll_95_85mhz", "ppll_95_85mhz" }; | ||
97 | PARENTS(pxa25x_pbus147) = { "ppll_147_46mhz", "ppll_147_46mhz" }; | ||
98 | PARENTS(pxa25x_osc3) = { "osc_3_6864mhz", "osc_3_6864mhz" }; | ||
99 | |||
100 | #define PXA25X_CKEN(dev_id, con_id, parents, mult, div, \ | ||
101 | bit, is_lp, flags) \ | ||
102 | PXA_CKEN(dev_id, con_id, bit, parents, mult, div, mult, div, \ | ||
103 | is_lp, &CKEN, CKEN_ ## bit, flags) | ||
104 | #define PXA25X_PBUS95_CKEN(dev_id, con_id, bit, mult_hp, div_hp, delay) \ | ||
105 | PXA25X_CKEN(dev_id, con_id, pxa25x_pbus95_parents, mult_hp, \ | ||
106 | div_hp, bit, NULL, 0) | ||
107 | #define PXA25X_PBUS147_CKEN(dev_id, con_id, bit, mult_hp, div_hp, delay)\ | ||
108 | PXA25X_CKEN(dev_id, con_id, pxa25x_pbus147_parents, mult_hp, \ | ||
109 | div_hp, bit, NULL, 0) | ||
110 | #define PXA25X_OSC3_CKEN(dev_id, con_id, bit, mult_hp, div_hp, delay) \ | ||
111 | PXA25X_CKEN(dev_id, con_id, pxa25x_osc3_parents, mult_hp, \ | ||
112 | div_hp, bit, NULL, 0) | ||
113 | |||
114 | #define PXA25X_CKEN_1RATE(dev_id, con_id, bit, parents, delay) \ | ||
115 | PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \ | ||
116 | &CKEN, CKEN_ ## bit, 0) | ||
117 | #define PXA25X_CKEN_1RATE_AO(dev_id, con_id, bit, parents, delay) \ | ||
118 | PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \ | ||
119 | &CKEN, CKEN_ ## bit, CLK_IGNORE_UNUSED) | ||
120 | |||
121 | static struct desc_clk_cken pxa25x_clocks[] __initdata = { | ||
122 | PXA25X_PBUS95_CKEN("pxa2xx-mci.0", NULL, MMC, 1, 5, 0), | ||
123 | PXA25X_PBUS95_CKEN("pxa2xx-i2c.0", NULL, I2C, 1, 3, 0), | ||
124 | PXA25X_PBUS95_CKEN("pxa2xx-ir", "FICPCLK", FICP, 1, 2, 0), | ||
125 | PXA25X_PBUS95_CKEN("pxa25x-udc", NULL, USB, 1, 2, 5), | ||
126 | PXA25X_PBUS147_CKEN("pxa2xx-uart.0", NULL, FFUART, 1, 10, 1), | ||
127 | PXA25X_PBUS147_CKEN("pxa2xx-uart.1", NULL, BTUART, 1, 10, 1), | ||
128 | PXA25X_PBUS147_CKEN("pxa2xx-uart.2", NULL, STUART, 1, 10, 1), | ||
129 | PXA25X_PBUS147_CKEN("pxa2xx-uart.3", NULL, HWUART, 1, 10, 1), | ||
130 | PXA25X_PBUS147_CKEN("pxa2xx-i2s", NULL, I2S, 1, 10, 0), | ||
131 | PXA25X_PBUS147_CKEN(NULL, "AC97CLK", AC97, 1, 12, 0), | ||
132 | PXA25X_OSC3_CKEN("pxa25x-ssp.0", NULL, SSP, 1, 1, 0), | ||
133 | PXA25X_OSC3_CKEN("pxa25x-nssp.1", NULL, NSSP, 1, 1, 0), | ||
134 | PXA25X_OSC3_CKEN("pxa25x-nssp.2", NULL, ASSP, 1, 1, 0), | ||
135 | PXA25X_OSC3_CKEN("pxa25x-pwm.0", NULL, PWM0, 1, 1, 0), | ||
136 | PXA25X_OSC3_CKEN("pxa25x-pwm.1", NULL, PWM1, 1, 1, 0), | ||
137 | |||
138 | PXA25X_CKEN_1RATE("pxa2xx-fb", NULL, LCD, clk_pxa25x_memory_parents, 0), | ||
139 | PXA25X_CKEN_1RATE_AO("pxa2xx-pcmcia", NULL, MEMC, | ||
140 | clk_pxa25x_memory_parents, 0), | ||
141 | }; | ||
142 | |||
143 | static u8 clk_pxa25x_core_get_parent(struct clk_hw *hw) | ||
144 | { | ||
145 | unsigned long clkcfg; | ||
146 | unsigned int t; | ||
147 | |||
148 | asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg)); | ||
149 | t = clkcfg & (1 << 0); | ||
150 | if (t) | ||
151 | return PXA_CORE_TURBO; | ||
152 | return PXA_CORE_RUN; | ||
153 | } | ||
154 | |||
155 | static unsigned long clk_pxa25x_core_get_rate(struct clk_hw *hw, | ||
156 | unsigned long parent_rate) | ||
157 | { | ||
158 | return parent_rate; | ||
159 | } | ||
160 | PARENTS(clk_pxa25x_core) = { "run", "cpll" }; | ||
161 | MUX_RO_RATE_RO_OPS(clk_pxa25x_core, "core"); | ||
162 | |||
163 | static unsigned long clk_pxa25x_run_get_rate(struct clk_hw *hw, | ||
164 | unsigned long parent_rate) | ||
165 | { | ||
166 | unsigned long cccr = CCCR; | ||
167 | unsigned int n2 = N2_clk_mult[(cccr >> 7) & 0x07]; | ||
168 | |||
169 | return (parent_rate / n2) * 2; | ||
170 | } | ||
171 | PARENTS(clk_pxa25x_run) = { "cpll" }; | ||
172 | RATE_RO_OPS(clk_pxa25x_run, "run"); | ||
173 | |||
174 | static unsigned long clk_pxa25x_cpll_get_rate(struct clk_hw *hw, | ||
175 | unsigned long parent_rate) | ||
176 | { | ||
177 | unsigned long clkcfg, cccr = CCCR; | ||
178 | unsigned int l, m, n2, t; | ||
179 | |||
180 | asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg)); | ||
181 | t = clkcfg & (1 << 0); | ||
182 | l = L_clk_mult[(cccr >> 0) & 0x1f]; | ||
183 | m = M_clk_mult[(cccr >> 5) & 0x03]; | ||
184 | n2 = N2_clk_mult[(cccr >> 7) & 0x07]; | ||
185 | |||
186 | if (t) | ||
187 | return m * l * n2 * parent_rate / 2; | ||
188 | return m * l * parent_rate; | ||
189 | } | ||
190 | PARENTS(clk_pxa25x_cpll) = { "osc_3_6864mhz" }; | ||
191 | RATE_RO_OPS(clk_pxa25x_cpll, "cpll"); | ||
192 | |||
193 | static void __init pxa25x_register_core(void) | ||
194 | { | ||
195 | clk_register_clk_pxa25x_cpll(); | ||
196 | clk_register_clk_pxa25x_run(); | ||
197 | clkdev_pxa_register(CLK_CORE, "core", NULL, | ||
198 | clk_register_clk_pxa25x_core()); | ||
199 | } | ||
200 | |||
201 | static void __init pxa25x_register_plls(void) | ||
202 | { | ||
203 | clk_register_fixed_rate(NULL, "osc_3_6864mhz", NULL, | ||
204 | CLK_GET_RATE_NOCACHE | CLK_IS_ROOT, | ||
205 | 3686400); | ||
206 | clk_register_fixed_rate(NULL, "osc_32_768khz", NULL, | ||
207 | CLK_GET_RATE_NOCACHE | CLK_IS_ROOT, | ||
208 | 32768); | ||
209 | clk_register_fixed_rate(NULL, "clk_dummy", NULL, CLK_IS_ROOT, 0); | ||
210 | clk_register_fixed_factor(NULL, "ppll_95_85mhz", "osc_3_6864mhz", | ||
211 | 0, 26, 1); | ||
212 | clk_register_fixed_factor(NULL, "ppll_147_46mhz", "osc_3_6864mhz", | ||
213 | 0, 40, 1); | ||
214 | } | ||
215 | |||
216 | static void __init pxa25x_base_clocks_init(void) | ||
217 | { | ||
218 | pxa25x_register_plls(); | ||
219 | pxa25x_register_core(); | ||
220 | clk_register_clk_pxa25x_memory(); | ||
221 | } | ||
222 | |||
223 | #define DUMMY_CLK(_con_id, _dev_id, _parent) \ | ||
224 | { .con_id = _con_id, .dev_id = _dev_id, .parent = _parent } | ||
225 | struct dummy_clk { | ||
226 | const char *con_id; | ||
227 | const char *dev_id; | ||
228 | const char *parent; | ||
229 | }; | ||
230 | static struct dummy_clk dummy_clks[] __initdata = { | ||
231 | DUMMY_CLK(NULL, "pxa25x-gpio", "osc_32_768khz"), | ||
232 | DUMMY_CLK(NULL, "pxa26x-gpio", "osc_32_768khz"), | ||
233 | DUMMY_CLK("GPIO11_CLK", NULL, "osc_3_6864mhz"), | ||
234 | DUMMY_CLK("GPIO12_CLK", NULL, "osc_32_768khz"), | ||
235 | DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"), | ||
236 | DUMMY_CLK("OSTIMER0", NULL, "osc_32_768khz"), | ||
237 | DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"), | ||
238 | }; | ||
239 | |||
240 | static void __init pxa25x_dummy_clocks_init(void) | ||
241 | { | ||
242 | struct clk *clk; | ||
243 | struct dummy_clk *d; | ||
244 | const char *name; | ||
245 | int i; | ||
246 | |||
247 | /* | ||
248 | * All pinctrl logic has been wiped out of the clock driver, especially | ||
249 | * for gpio11 and gpio12 outputs. Machine code should ensure proper pin | ||
250 | * control (ie. pxa2xx_mfp_config() invocation). | ||
251 | */ | ||
252 | for (i = 0; i < ARRAY_SIZE(dummy_clks); i++) { | ||
253 | d = &dummy_clks[i]; | ||
254 | name = d->dev_id ? d->dev_id : d->con_id; | ||
255 | clk = clk_register_fixed_factor(NULL, name, d->parent, 0, 1, 1); | ||
256 | clk_register_clkdev(clk, d->con_id, d->dev_id); | ||
257 | } | ||
258 | } | ||
259 | |||
260 | int __init pxa25x_clocks_init(void) | ||
261 | { | ||
262 | pxa25x_base_clocks_init(); | ||
263 | pxa25x_dummy_clocks_init(); | ||
264 | return clk_pxa_cken_init(pxa25x_clocks, ARRAY_SIZE(pxa25x_clocks)); | ||
265 | } | ||
266 | |||
267 | static void __init pxa25x_dt_clocks_init(struct device_node *np) | ||
268 | { | ||
269 | pxa25x_clocks_init(); | ||
270 | clk_pxa_dt_common_init(np); | ||
271 | } | ||
272 | CLK_OF_DECLARE(pxa25x_clks, "marvell,pxa250-core-clocks", | ||
273 | pxa25x_dt_clocks_init); | ||
diff --git a/drivers/clk/pxa/clk-pxa27x.c b/drivers/clk/pxa/clk-pxa27x.c index 88b9fe13fa44..5f9b54b024b9 100644 --- a/drivers/clk/pxa/clk-pxa27x.c +++ b/drivers/clk/pxa/clk-pxa27x.c | |||
@@ -111,7 +111,7 @@ PARENTS(pxa27x_membus) = { "lcd_base", "lcd_base" }; | |||
111 | PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \ | 111 | PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \ |
112 | &CKEN, CKEN_ ## bit, CLK_IGNORE_UNUSED) | 112 | &CKEN, CKEN_ ## bit, CLK_IGNORE_UNUSED) |
113 | 113 | ||
114 | static struct pxa_clk_cken pxa27x_clocks[] = { | 114 | static struct desc_clk_cken pxa27x_clocks[] __initdata = { |
115 | PXA27X_PBUS_CKEN("pxa2xx-uart.0", NULL, FFUART, 2, 42, 1), | 115 | PXA27X_PBUS_CKEN("pxa2xx-uart.0", NULL, FFUART, 2, 42, 1), |
116 | PXA27X_PBUS_CKEN("pxa2xx-uart.1", NULL, BTUART, 2, 42, 1), | 116 | PXA27X_PBUS_CKEN("pxa2xx-uart.1", NULL, BTUART, 2, 42, 1), |
117 | PXA27X_PBUS_CKEN("pxa2xx-uart.2", NULL, STUART, 2, 42, 1), | 117 | PXA27X_PBUS_CKEN("pxa2xx-uart.2", NULL, STUART, 2, 42, 1), |
@@ -368,3 +368,10 @@ static int __init pxa27x_clocks_init(void) | |||
368 | return clk_pxa_cken_init(pxa27x_clocks, ARRAY_SIZE(pxa27x_clocks)); | 368 | return clk_pxa_cken_init(pxa27x_clocks, ARRAY_SIZE(pxa27x_clocks)); |
369 | } | 369 | } |
370 | postcore_initcall(pxa27x_clocks_init); | 370 | postcore_initcall(pxa27x_clocks_init); |
371 | |||
372 | static void __init pxa27x_dt_clocks_init(struct device_node *np) | ||
373 | { | ||
374 | pxa27x_clocks_init(); | ||
375 | clk_pxa_dt_common_init(np); | ||
376 | } | ||
377 | CLK_OF_DECLARE(pxa_clks, "marvell,pxa270-clocks", pxa27x_dt_clocks_init); | ||
diff --git a/drivers/clk/qcom/clk-pll.c b/drivers/clk/qcom/clk-pll.c index b823bc3b6250..60873a7f45d9 100644 --- a/drivers/clk/qcom/clk-pll.c +++ b/drivers/clk/qcom/clk-pll.c | |||
@@ -141,7 +141,7 @@ struct pll_freq_tbl *find_freq(const struct pll_freq_tbl *f, unsigned long rate) | |||
141 | 141 | ||
142 | static long | 142 | static long |
143 | clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate, | 143 | clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate, |
144 | unsigned long *p_rate, struct clk **p) | 144 | unsigned long *p_rate, struct clk_hw **p) |
145 | { | 145 | { |
146 | struct clk_pll *pll = to_clk_pll(hw); | 146 | struct clk_pll *pll = to_clk_pll(hw); |
147 | const struct pll_freq_tbl *f; | 147 | const struct pll_freq_tbl *f; |
diff --git a/drivers/clk/qcom/clk-rcg.c b/drivers/clk/qcom/clk-rcg.c index b6e6959e89aa..0b93972c8807 100644 --- a/drivers/clk/qcom/clk-rcg.c +++ b/drivers/clk/qcom/clk-rcg.c | |||
@@ -368,16 +368,17 @@ clk_dyn_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) | |||
368 | 368 | ||
369 | static long _freq_tbl_determine_rate(struct clk_hw *hw, | 369 | static long _freq_tbl_determine_rate(struct clk_hw *hw, |
370 | const struct freq_tbl *f, unsigned long rate, | 370 | const struct freq_tbl *f, unsigned long rate, |
371 | unsigned long *p_rate, struct clk **p) | 371 | unsigned long *p_rate, struct clk_hw **p_hw) |
372 | { | 372 | { |
373 | unsigned long clk_flags; | 373 | unsigned long clk_flags; |
374 | struct clk *p; | ||
374 | 375 | ||
375 | f = qcom_find_freq(f, rate); | 376 | f = qcom_find_freq(f, rate); |
376 | if (!f) | 377 | if (!f) |
377 | return -EINVAL; | 378 | return -EINVAL; |
378 | 379 | ||
379 | clk_flags = __clk_get_flags(hw->clk); | 380 | clk_flags = __clk_get_flags(hw->clk); |
380 | *p = clk_get_parent_by_index(hw->clk, f->src); | 381 | p = clk_get_parent_by_index(hw->clk, f->src); |
381 | if (clk_flags & CLK_SET_RATE_PARENT) { | 382 | if (clk_flags & CLK_SET_RATE_PARENT) { |
382 | rate = rate * f->pre_div; | 383 | rate = rate * f->pre_div; |
383 | if (f->n) { | 384 | if (f->n) { |
@@ -387,15 +388,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw, | |||
387 | rate = tmp; | 388 | rate = tmp; |
388 | } | 389 | } |
389 | } else { | 390 | } else { |
390 | rate = __clk_get_rate(*p); | 391 | rate = __clk_get_rate(p); |
391 | } | 392 | } |
393 | *p_hw = __clk_get_hw(p); | ||
392 | *p_rate = rate; | 394 | *p_rate = rate; |
393 | 395 | ||
394 | return f->freq; | 396 | return f->freq; |
395 | } | 397 | } |
396 | 398 | ||
397 | static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, | 399 | static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, |
398 | unsigned long *p_rate, struct clk **p) | 400 | unsigned long *p_rate, struct clk_hw **p) |
399 | { | 401 | { |
400 | struct clk_rcg *rcg = to_clk_rcg(hw); | 402 | struct clk_rcg *rcg = to_clk_rcg(hw); |
401 | 403 | ||
@@ -403,7 +405,7 @@ static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
403 | } | 405 | } |
404 | 406 | ||
405 | static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, | 407 | static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, |
406 | unsigned long *p_rate, struct clk **p) | 408 | unsigned long *p_rate, struct clk_hw **p) |
407 | { | 409 | { |
408 | struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw); | 410 | struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw); |
409 | 411 | ||
@@ -411,13 +413,15 @@ static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
411 | } | 413 | } |
412 | 414 | ||
413 | static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate, | 415 | static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate, |
414 | unsigned long *p_rate, struct clk **p) | 416 | unsigned long *p_rate, struct clk_hw **p_hw) |
415 | { | 417 | { |
416 | struct clk_rcg *rcg = to_clk_rcg(hw); | 418 | struct clk_rcg *rcg = to_clk_rcg(hw); |
417 | const struct freq_tbl *f = rcg->freq_tbl; | 419 | const struct freq_tbl *f = rcg->freq_tbl; |
420 | struct clk *p; | ||
418 | 421 | ||
419 | *p = clk_get_parent_by_index(hw->clk, f->src); | 422 | p = clk_get_parent_by_index(hw->clk, f->src); |
420 | *p_rate = __clk_round_rate(*p, rate); | 423 | *p_hw = __clk_get_hw(p); |
424 | *p_rate = __clk_round_rate(p, rate); | ||
421 | 425 | ||
422 | return *p_rate; | 426 | return *p_rate; |
423 | } | 427 | } |
diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c index cfa9eb4fe9ca..08b8b3729f53 100644 --- a/drivers/clk/qcom/clk-rcg2.c +++ b/drivers/clk/qcom/clk-rcg2.c | |||
@@ -175,16 +175,17 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) | |||
175 | 175 | ||
176 | static long _freq_tbl_determine_rate(struct clk_hw *hw, | 176 | static long _freq_tbl_determine_rate(struct clk_hw *hw, |
177 | const struct freq_tbl *f, unsigned long rate, | 177 | const struct freq_tbl *f, unsigned long rate, |
178 | unsigned long *p_rate, struct clk **p) | 178 | unsigned long *p_rate, struct clk_hw **p_hw) |
179 | { | 179 | { |
180 | unsigned long clk_flags; | 180 | unsigned long clk_flags; |
181 | struct clk *p; | ||
181 | 182 | ||
182 | f = qcom_find_freq(f, rate); | 183 | f = qcom_find_freq(f, rate); |
183 | if (!f) | 184 | if (!f) |
184 | return -EINVAL; | 185 | return -EINVAL; |
185 | 186 | ||
186 | clk_flags = __clk_get_flags(hw->clk); | 187 | clk_flags = __clk_get_flags(hw->clk); |
187 | *p = clk_get_parent_by_index(hw->clk, f->src); | 188 | p = clk_get_parent_by_index(hw->clk, f->src); |
188 | if (clk_flags & CLK_SET_RATE_PARENT) { | 189 | if (clk_flags & CLK_SET_RATE_PARENT) { |
189 | if (f->pre_div) { | 190 | if (f->pre_div) { |
190 | rate /= 2; | 191 | rate /= 2; |
@@ -198,15 +199,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw, | |||
198 | rate = tmp; | 199 | rate = tmp; |
199 | } | 200 | } |
200 | } else { | 201 | } else { |
201 | rate = __clk_get_rate(*p); | 202 | rate = __clk_get_rate(p); |
202 | } | 203 | } |
204 | *p_hw = __clk_get_hw(p); | ||
203 | *p_rate = rate; | 205 | *p_rate = rate; |
204 | 206 | ||
205 | return f->freq; | 207 | return f->freq; |
206 | } | 208 | } |
207 | 209 | ||
208 | static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate, | 210 | static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate, |
209 | unsigned long *p_rate, struct clk **p) | 211 | unsigned long *p_rate, struct clk_hw **p) |
210 | { | 212 | { |
211 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); | 213 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); |
212 | 214 | ||
@@ -359,7 +361,7 @@ static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw, | |||
359 | } | 361 | } |
360 | 362 | ||
361 | static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, | 363 | static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, |
362 | unsigned long *p_rate, struct clk **p) | 364 | unsigned long *p_rate, struct clk_hw **p) |
363 | { | 365 | { |
364 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); | 366 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); |
365 | const struct freq_tbl *f = rcg->freq_tbl; | 367 | const struct freq_tbl *f = rcg->freq_tbl; |
@@ -371,7 +373,7 @@ static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
371 | u32 hid_div; | 373 | u32 hid_div; |
372 | 374 | ||
373 | /* Force the correct parent */ | 375 | /* Force the correct parent */ |
374 | *p = clk_get_parent_by_index(hw->clk, f->src); | 376 | *p = __clk_get_hw(clk_get_parent_by_index(hw->clk, f->src)); |
375 | 377 | ||
376 | if (src_rate == 810000000) | 378 | if (src_rate == 810000000) |
377 | frac = frac_table_810m; | 379 | frac = frac_table_810m; |
@@ -410,18 +412,20 @@ const struct clk_ops clk_edp_pixel_ops = { | |||
410 | EXPORT_SYMBOL_GPL(clk_edp_pixel_ops); | 412 | EXPORT_SYMBOL_GPL(clk_edp_pixel_ops); |
411 | 413 | ||
412 | static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate, | 414 | static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate, |
413 | unsigned long *p_rate, struct clk **p) | 415 | unsigned long *p_rate, struct clk_hw **p_hw) |
414 | { | 416 | { |
415 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); | 417 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); |
416 | const struct freq_tbl *f = rcg->freq_tbl; | 418 | const struct freq_tbl *f = rcg->freq_tbl; |
417 | unsigned long parent_rate, div; | 419 | unsigned long parent_rate, div; |
418 | u32 mask = BIT(rcg->hid_width) - 1; | 420 | u32 mask = BIT(rcg->hid_width) - 1; |
421 | struct clk *p; | ||
419 | 422 | ||
420 | if (rate == 0) | 423 | if (rate == 0) |
421 | return -EINVAL; | 424 | return -EINVAL; |
422 | 425 | ||
423 | *p = clk_get_parent_by_index(hw->clk, f->src); | 426 | p = clk_get_parent_by_index(hw->clk, f->src); |
424 | *p_rate = parent_rate = __clk_round_rate(*p, rate); | 427 | *p_hw = __clk_get_hw(p); |
428 | *p_rate = parent_rate = __clk_round_rate(p, rate); | ||
425 | 429 | ||
426 | div = DIV_ROUND_UP((2 * parent_rate), rate) - 1; | 430 | div = DIV_ROUND_UP((2 * parent_rate), rate) - 1; |
427 | div = min_t(u32, div, mask); | 431 | div = min_t(u32, div, mask); |
@@ -472,14 +476,16 @@ static const struct frac_entry frac_table_pixel[] = { | |||
472 | }; | 476 | }; |
473 | 477 | ||
474 | static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, | 478 | static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, |
475 | unsigned long *p_rate, struct clk **p) | 479 | unsigned long *p_rate, struct clk_hw **p) |
476 | { | 480 | { |
477 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); | 481 | struct clk_rcg2 *rcg = to_clk_rcg2(hw); |
478 | unsigned long request, src_rate; | 482 | unsigned long request, src_rate; |
479 | int delta = 100000; | 483 | int delta = 100000; |
480 | const struct freq_tbl *f = rcg->freq_tbl; | 484 | const struct freq_tbl *f = rcg->freq_tbl; |
481 | const struct frac_entry *frac = frac_table_pixel; | 485 | const struct frac_entry *frac = frac_table_pixel; |
482 | struct clk *parent = *p = clk_get_parent_by_index(hw->clk, f->src); | 486 | struct clk *parent = clk_get_parent_by_index(hw->clk, f->src); |
487 | |||
488 | *p = __clk_get_hw(parent); | ||
483 | 489 | ||
484 | for (; frac->num; frac++) { | 490 | for (; frac->num; frac++) { |
485 | request = (rate * frac->den) / frac->num; | 491 | request = (rate * frac->den) / frac->num; |
diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile index bd8514d63634..2714097f90db 100644 --- a/drivers/clk/rockchip/Makefile +++ b/drivers/clk/rockchip/Makefile | |||
@@ -6,6 +6,7 @@ obj-y += clk-rockchip.o | |||
6 | obj-y += clk.o | 6 | obj-y += clk.o |
7 | obj-y += clk-pll.o | 7 | obj-y += clk-pll.o |
8 | obj-y += clk-cpu.o | 8 | obj-y += clk-cpu.o |
9 | obj-y += clk-mmc-phase.o | ||
9 | obj-$(CONFIG_RESET_CONTROLLER) += softrst.o | 10 | obj-$(CONFIG_RESET_CONTROLLER) += softrst.o |
10 | 11 | ||
11 | obj-y += clk-rk3188.o | 12 | obj-y += clk-rk3188.o |
diff --git a/drivers/clk/rockchip/clk-mmc-phase.c b/drivers/clk/rockchip/clk-mmc-phase.c new file mode 100644 index 000000000000..c842e3b60f21 --- /dev/null +++ b/drivers/clk/rockchip/clk-mmc-phase.c | |||
@@ -0,0 +1,154 @@ | |||
1 | /* | ||
2 | * Copyright 2014 Google, Inc | ||
3 | * Author: Alexandru M Stan <amstan@chromium.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/slab.h> | ||
17 | #include <linux/clk-provider.h> | ||
18 | #include "clk.h" | ||
19 | |||
20 | struct rockchip_mmc_clock { | ||
21 | struct clk_hw hw; | ||
22 | void __iomem *reg; | ||
23 | int id; | ||
24 | int shift; | ||
25 | }; | ||
26 | |||
27 | #define to_mmc_clock(_hw) container_of(_hw, struct rockchip_mmc_clock, hw) | ||
28 | |||
29 | #define RK3288_MMC_CLKGEN_DIV 2 | ||
30 | |||
31 | static unsigned long rockchip_mmc_recalc(struct clk_hw *hw, | ||
32 | unsigned long parent_rate) | ||
33 | { | ||
34 | return parent_rate / RK3288_MMC_CLKGEN_DIV; | ||
35 | } | ||
36 | |||
37 | #define ROCKCHIP_MMC_DELAY_SEL BIT(10) | ||
38 | #define ROCKCHIP_MMC_DEGREE_MASK 0x3 | ||
39 | #define ROCKCHIP_MMC_DELAYNUM_OFFSET 2 | ||
40 | #define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET) | ||
41 | |||
42 | #define PSECS_PER_SEC 1000000000000LL | ||
43 | |||
44 | /* | ||
45 | * Each fine delay is between 40ps-80ps. Assume each fine delay is 60ps to | ||
46 | * simplify calculations. So 45degs could be anywhere between 33deg and 66deg. | ||
47 | */ | ||
48 | #define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60 | ||
49 | |||
50 | static int rockchip_mmc_get_phase(struct clk_hw *hw) | ||
51 | { | ||
52 | struct rockchip_mmc_clock *mmc_clock = to_mmc_clock(hw); | ||
53 | unsigned long rate = clk_get_rate(hw->clk); | ||
54 | u32 raw_value; | ||
55 | u16 degrees; | ||
56 | u32 delay_num = 0; | ||
57 | |||
58 | raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift); | ||
59 | |||
60 | degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90; | ||
61 | |||
62 | if (raw_value & ROCKCHIP_MMC_DELAY_SEL) { | ||
63 | /* degrees/delaynum * 10000 */ | ||
64 | unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) * | ||
65 | 36 * (rate / 1000000); | ||
66 | |||
67 | delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK); | ||
68 | delay_num >>= ROCKCHIP_MMC_DELAYNUM_OFFSET; | ||
69 | degrees += delay_num * factor / 10000; | ||
70 | } | ||
71 | |||
72 | return degrees % 360; | ||
73 | } | ||
74 | |||
75 | static int rockchip_mmc_set_phase(struct clk_hw *hw, int degrees) | ||
76 | { | ||
77 | struct rockchip_mmc_clock *mmc_clock = to_mmc_clock(hw); | ||
78 | unsigned long rate = clk_get_rate(hw->clk); | ||
79 | u8 nineties, remainder; | ||
80 | u8 delay_num; | ||
81 | u32 raw_value; | ||
82 | u64 delay; | ||
83 | |||
84 | /* allow 22 to be 22.5 */ | ||
85 | degrees++; | ||
86 | /* floor to 22.5 increment */ | ||
87 | degrees -= ((degrees) * 10 % 225) / 10; | ||
88 | |||
89 | nineties = degrees / 90; | ||
90 | /* 22.5 multiples */ | ||
91 | remainder = (degrees % 90) / 22; | ||
92 | |||
93 | delay = PSECS_PER_SEC; | ||
94 | do_div(delay, rate); | ||
95 | /* / 360 / 22.5 */ | ||
96 | do_div(delay, 16); | ||
97 | do_div(delay, ROCKCHIP_MMC_DELAY_ELEMENT_PSEC); | ||
98 | |||
99 | delay *= remainder; | ||
100 | delay_num = (u8) min(delay, 255ULL); | ||
101 | |||
102 | raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0; | ||
103 | raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET; | ||
104 | raw_value |= nineties; | ||
105 | writel(HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift), mmc_clock->reg); | ||
106 | |||
107 | pr_debug("%s->set_phase(%d) delay_nums=%u reg[0x%p]=0x%03x actual_degrees=%d\n", | ||
108 | __clk_get_name(hw->clk), degrees, delay_num, | ||
109 | mmc_clock->reg, raw_value>>(mmc_clock->shift), | ||
110 | rockchip_mmc_get_phase(hw) | ||
111 | ); | ||
112 | |||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | static const struct clk_ops rockchip_mmc_clk_ops = { | ||
117 | .recalc_rate = rockchip_mmc_recalc, | ||
118 | .get_phase = rockchip_mmc_get_phase, | ||
119 | .set_phase = rockchip_mmc_set_phase, | ||
120 | }; | ||
121 | |||
122 | struct clk *rockchip_clk_register_mmc(const char *name, | ||
123 | const char **parent_names, u8 num_parents, | ||
124 | void __iomem *reg, int shift) | ||
125 | { | ||
126 | struct clk_init_data init; | ||
127 | struct rockchip_mmc_clock *mmc_clock; | ||
128 | struct clk *clk; | ||
129 | |||
130 | mmc_clock = kmalloc(sizeof(*mmc_clock), GFP_KERNEL); | ||
131 | if (!mmc_clock) | ||
132 | return NULL; | ||
133 | |||
134 | init.num_parents = num_parents; | ||
135 | init.parent_names = parent_names; | ||
136 | init.ops = &rockchip_mmc_clk_ops; | ||
137 | |||
138 | mmc_clock->hw.init = &init; | ||
139 | mmc_clock->reg = reg; | ||
140 | mmc_clock->shift = shift; | ||
141 | |||
142 | if (name) | ||
143 | init.name = name; | ||
144 | |||
145 | clk = clk_register(NULL, &mmc_clock->hw); | ||
146 | if (IS_ERR(clk)) | ||
147 | goto err_free; | ||
148 | |||
149 | return clk; | ||
150 | |||
151 | err_free: | ||
152 | kfree(mmc_clock); | ||
153 | return NULL; | ||
154 | } | ||
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c index a3e886a38480..f8d3baf275b2 100644 --- a/drivers/clk/rockchip/clk-pll.c +++ b/drivers/clk/rockchip/clk-pll.c | |||
@@ -39,6 +39,7 @@ struct rockchip_clk_pll { | |||
39 | int lock_offset; | 39 | int lock_offset; |
40 | unsigned int lock_shift; | 40 | unsigned int lock_shift; |
41 | enum rockchip_pll_type type; | 41 | enum rockchip_pll_type type; |
42 | u8 flags; | ||
42 | const struct rockchip_pll_rate_table *rate_table; | 43 | const struct rockchip_pll_rate_table *rate_table; |
43 | unsigned int rate_count; | 44 | unsigned int rate_count; |
44 | spinlock_t *lock; | 45 | spinlock_t *lock; |
@@ -257,6 +258,55 @@ static int rockchip_rk3066_pll_is_enabled(struct clk_hw *hw) | |||
257 | return !(pllcon & RK3066_PLLCON3_PWRDOWN); | 258 | return !(pllcon & RK3066_PLLCON3_PWRDOWN); |
258 | } | 259 | } |
259 | 260 | ||
261 | static void rockchip_rk3066_pll_init(struct clk_hw *hw) | ||
262 | { | ||
263 | struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); | ||
264 | const struct rockchip_pll_rate_table *rate; | ||
265 | unsigned int nf, nr, no, bwadj; | ||
266 | unsigned long drate; | ||
267 | u32 pllcon; | ||
268 | |||
269 | if (!(pll->flags & ROCKCHIP_PLL_SYNC_RATE)) | ||
270 | return; | ||
271 | |||
272 | drate = __clk_get_rate(hw->clk); | ||
273 | rate = rockchip_get_pll_settings(pll, drate); | ||
274 | |||
275 | /* when no rate setting for the current rate, rely on clk_set_rate */ | ||
276 | if (!rate) | ||
277 | return; | ||
278 | |||
279 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(0)); | ||
280 | nr = ((pllcon >> RK3066_PLLCON0_NR_SHIFT) & RK3066_PLLCON0_NR_MASK) + 1; | ||
281 | no = ((pllcon >> RK3066_PLLCON0_OD_SHIFT) & RK3066_PLLCON0_OD_MASK) + 1; | ||
282 | |||
283 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(1)); | ||
284 | nf = ((pllcon >> RK3066_PLLCON1_NF_SHIFT) & RK3066_PLLCON1_NF_MASK) + 1; | ||
285 | |||
286 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(2)); | ||
287 | bwadj = (pllcon >> RK3066_PLLCON2_BWADJ_SHIFT) & RK3066_PLLCON2_BWADJ_MASK; | ||
288 | |||
289 | pr_debug("%s: pll %s@%lu: nr (%d:%d); no (%d:%d); nf(%d:%d), bwadj(%d:%d)\n", | ||
290 | __func__, __clk_get_name(hw->clk), drate, rate->nr, nr, | ||
291 | rate->no, no, rate->nf, nf, rate->bwadj, bwadj); | ||
292 | if (rate->nr != nr || rate->no != no || rate->nf != nf | ||
293 | || rate->bwadj != bwadj) { | ||
294 | struct clk *parent = __clk_get_parent(hw->clk); | ||
295 | unsigned long prate; | ||
296 | |||
297 | if (!parent) { | ||
298 | pr_warn("%s: parent of %s not available\n", | ||
299 | __func__, __clk_get_name(hw->clk)); | ||
300 | return; | ||
301 | } | ||
302 | |||
303 | pr_debug("%s: pll %s: rate params do not match rate table, adjusting\n", | ||
304 | __func__, __clk_get_name(hw->clk)); | ||
305 | prate = __clk_get_rate(parent); | ||
306 | rockchip_rk3066_pll_set_rate(hw, drate, prate); | ||
307 | } | ||
308 | } | ||
309 | |||
260 | static const struct clk_ops rockchip_rk3066_pll_clk_norate_ops = { | 310 | static const struct clk_ops rockchip_rk3066_pll_clk_norate_ops = { |
261 | .recalc_rate = rockchip_rk3066_pll_recalc_rate, | 311 | .recalc_rate = rockchip_rk3066_pll_recalc_rate, |
262 | .enable = rockchip_rk3066_pll_enable, | 312 | .enable = rockchip_rk3066_pll_enable, |
@@ -271,6 +321,7 @@ static const struct clk_ops rockchip_rk3066_pll_clk_ops = { | |||
271 | .enable = rockchip_rk3066_pll_enable, | 321 | .enable = rockchip_rk3066_pll_enable, |
272 | .disable = rockchip_rk3066_pll_disable, | 322 | .disable = rockchip_rk3066_pll_disable, |
273 | .is_enabled = rockchip_rk3066_pll_is_enabled, | 323 | .is_enabled = rockchip_rk3066_pll_is_enabled, |
324 | .init = rockchip_rk3066_pll_init, | ||
274 | }; | 325 | }; |
275 | 326 | ||
276 | /* | 327 | /* |
@@ -282,7 +333,7 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
282 | void __iomem *base, int con_offset, int grf_lock_offset, | 333 | void __iomem *base, int con_offset, int grf_lock_offset, |
283 | int lock_shift, int mode_offset, int mode_shift, | 334 | int lock_shift, int mode_offset, int mode_shift, |
284 | struct rockchip_pll_rate_table *rate_table, | 335 | struct rockchip_pll_rate_table *rate_table, |
285 | spinlock_t *lock) | 336 | u8 clk_pll_flags, spinlock_t *lock) |
286 | { | 337 | { |
287 | const char *pll_parents[3]; | 338 | const char *pll_parents[3]; |
288 | struct clk_init_data init; | 339 | struct clk_init_data init; |
@@ -345,8 +396,22 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
345 | pll->reg_base = base + con_offset; | 396 | pll->reg_base = base + con_offset; |
346 | pll->lock_offset = grf_lock_offset; | 397 | pll->lock_offset = grf_lock_offset; |
347 | pll->lock_shift = lock_shift; | 398 | pll->lock_shift = lock_shift; |
399 | pll->flags = clk_pll_flags; | ||
348 | pll->lock = lock; | 400 | pll->lock = lock; |
349 | 401 | ||
402 | /* create the mux on top of the real pll */ | ||
403 | pll->pll_mux_ops = &clk_mux_ops; | ||
404 | pll_mux = &pll->pll_mux; | ||
405 | pll_mux->reg = base + mode_offset; | ||
406 | pll_mux->shift = mode_shift; | ||
407 | pll_mux->mask = PLL_MODE_MASK; | ||
408 | pll_mux->flags = 0; | ||
409 | pll_mux->lock = lock; | ||
410 | pll_mux->hw.init = &init; | ||
411 | |||
412 | if (pll_type == pll_rk3066) | ||
413 | pll_mux->flags |= CLK_MUX_HIWORD_MASK; | ||
414 | |||
350 | pll_clk = clk_register(NULL, &pll->hw); | 415 | pll_clk = clk_register(NULL, &pll->hw); |
351 | if (IS_ERR(pll_clk)) { | 416 | if (IS_ERR(pll_clk)) { |
352 | pr_err("%s: failed to register pll clock %s : %ld\n", | 417 | pr_err("%s: failed to register pll clock %s : %ld\n", |
@@ -355,10 +420,6 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
355 | goto err_pll; | 420 | goto err_pll; |
356 | } | 421 | } |
357 | 422 | ||
358 | /* create the mux on top of the real pll */ | ||
359 | pll->pll_mux_ops = &clk_mux_ops; | ||
360 | pll_mux = &pll->pll_mux; | ||
361 | |||
362 | /* the actual muxing is xin24m, pll-output, xin32k */ | 423 | /* the actual muxing is xin24m, pll-output, xin32k */ |
363 | pll_parents[0] = parent_names[0]; | 424 | pll_parents[0] = parent_names[0]; |
364 | pll_parents[1] = pll_name; | 425 | pll_parents[1] = pll_name; |
@@ -370,16 +431,6 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
370 | init.parent_names = pll_parents; | 431 | init.parent_names = pll_parents; |
371 | init.num_parents = ARRAY_SIZE(pll_parents); | 432 | init.num_parents = ARRAY_SIZE(pll_parents); |
372 | 433 | ||
373 | pll_mux->reg = base + mode_offset; | ||
374 | pll_mux->shift = mode_shift; | ||
375 | pll_mux->mask = PLL_MODE_MASK; | ||
376 | pll_mux->flags = 0; | ||
377 | pll_mux->lock = lock; | ||
378 | pll_mux->hw.init = &init; | ||
379 | |||
380 | if (pll_type == pll_rk3066) | ||
381 | pll_mux->flags |= CLK_MUX_HIWORD_MASK; | ||
382 | |||
383 | mux_clk = clk_register(NULL, &pll_mux->hw); | 434 | mux_clk = clk_register(NULL, &pll_mux->hw); |
384 | if (IS_ERR(mux_clk)) | 435 | if (IS_ERR(mux_clk)) |
385 | goto err_mux; | 436 | goto err_mux; |
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c index beed49c79126..c54078960847 100644 --- a/drivers/clk/rockchip/clk-rk3188.c +++ b/drivers/clk/rockchip/clk-rk3188.c | |||
@@ -212,13 +212,13 @@ PNAME(mux_sclk_macref_p) = { "mac_src", "ext_rmii" }; | |||
212 | 212 | ||
213 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { | 213 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { |
214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | 214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), |
215 | RK2928_MODE_CON, 0, 6, rk3188_pll_rates), | 215 | RK2928_MODE_CON, 0, 6, 0, rk3188_pll_rates), |
216 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), | 216 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), |
217 | RK2928_MODE_CON, 4, 5, NULL), | 217 | RK2928_MODE_CON, 4, 5, 0, NULL), |
218 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), | 218 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), |
219 | RK2928_MODE_CON, 8, 7, rk3188_pll_rates), | 219 | RK2928_MODE_CON, 8, 7, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), |
220 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), | 220 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), |
221 | RK2928_MODE_CON, 12, 8, rk3188_pll_rates), | 221 | RK2928_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), |
222 | }; | 222 | }; |
223 | 223 | ||
224 | #define MFLAGS CLK_MUX_HIWORD_MASK | 224 | #define MFLAGS CLK_MUX_HIWORD_MASK |
@@ -257,9 +257,9 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
257 | GATE(0, "hclk_vdpu", "aclk_vdpu", 0, | 257 | GATE(0, "hclk_vdpu", "aclk_vdpu", 0, |
258 | RK2928_CLKGATE_CON(3), 12, GFLAGS), | 258 | RK2928_CLKGATE_CON(3), 12, GFLAGS), |
259 | 259 | ||
260 | GATE(0, "gpll_ddr", "gpll", 0, | 260 | GATE(0, "gpll_ddr", "gpll", CLK_IGNORE_UNUSED, |
261 | RK2928_CLKGATE_CON(1), 7, GFLAGS), | 261 | RK2928_CLKGATE_CON(1), 7, GFLAGS), |
262 | COMPOSITE(0, "ddrphy", mux_ddrphy_p, 0, | 262 | COMPOSITE(0, "ddrphy", mux_ddrphy_p, CLK_IGNORE_UNUSED, |
263 | RK2928_CLKSEL_CON(26), 8, 1, MFLAGS, 0, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, | 263 | RK2928_CLKSEL_CON(26), 8, 1, MFLAGS, 0, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, |
264 | RK2928_CLKGATE_CON(0), 2, GFLAGS), | 264 | RK2928_CLKGATE_CON(0), 2, GFLAGS), |
265 | 265 | ||
@@ -270,10 +270,10 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
270 | RK2928_CLKGATE_CON(0), 6, GFLAGS), | 270 | RK2928_CLKGATE_CON(0), 6, GFLAGS), |
271 | GATE(0, "pclk_cpu", "pclk_cpu_pre", 0, | 271 | GATE(0, "pclk_cpu", "pclk_cpu_pre", 0, |
272 | RK2928_CLKGATE_CON(0), 5, GFLAGS), | 272 | RK2928_CLKGATE_CON(0), 5, GFLAGS), |
273 | GATE(0, "hclk_cpu", "hclk_cpu_pre", 0, | 273 | GATE(0, "hclk_cpu", "hclk_cpu_pre", CLK_IGNORE_UNUSED, |
274 | RK2928_CLKGATE_CON(0), 4, GFLAGS), | 274 | RK2928_CLKGATE_CON(0), 4, GFLAGS), |
275 | 275 | ||
276 | COMPOSITE(0, "aclk_lcdc0_pre", mux_pll_src_cpll_gpll_p, 0, | 276 | COMPOSITE(0, "aclk_lcdc0_pre", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, |
277 | RK2928_CLKSEL_CON(31), 7, 1, MFLAGS, 0, 5, DFLAGS, | 277 | RK2928_CLKSEL_CON(31), 7, 1, MFLAGS, 0, 5, DFLAGS, |
278 | RK2928_CLKGATE_CON(3), 0, GFLAGS), | 278 | RK2928_CLKGATE_CON(3), 0, GFLAGS), |
279 | COMPOSITE(0, "aclk_lcdc1_pre", mux_pll_src_cpll_gpll_p, 0, | 279 | COMPOSITE(0, "aclk_lcdc1_pre", mux_pll_src_cpll_gpll_p, 0, |
@@ -304,9 +304,9 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
304 | * the 480m are generated inside the usb block from these clocks, | 304 | * the 480m are generated inside the usb block from these clocks, |
305 | * but they are also a source for the hsicphy clock. | 305 | * but they are also a source for the hsicphy clock. |
306 | */ | 306 | */ |
307 | GATE(SCLK_OTGPHY0, "sclk_otgphy0", "usb480m", 0, | 307 | GATE(SCLK_OTGPHY0, "sclk_otgphy0", "usb480m", CLK_IGNORE_UNUSED, |
308 | RK2928_CLKGATE_CON(1), 5, GFLAGS), | 308 | RK2928_CLKGATE_CON(1), 5, GFLAGS), |
309 | GATE(SCLK_OTGPHY1, "sclk_otgphy1", "usb480m", 0, | 309 | GATE(SCLK_OTGPHY1, "sclk_otgphy1", "usb480m", CLK_IGNORE_UNUSED, |
310 | RK2928_CLKGATE_CON(1), 6, GFLAGS), | 310 | RK2928_CLKGATE_CON(1), 6, GFLAGS), |
311 | 311 | ||
312 | COMPOSITE(0, "mac_src", mux_mac_p, 0, | 312 | COMPOSITE(0, "mac_src", mux_mac_p, 0, |
@@ -320,9 +320,9 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
320 | COMPOSITE(0, "hsadc_src", mux_pll_src_gpll_cpll_p, 0, | 320 | COMPOSITE(0, "hsadc_src", mux_pll_src_gpll_cpll_p, 0, |
321 | RK2928_CLKSEL_CON(22), 0, 1, MFLAGS, 8, 8, DFLAGS, | 321 | RK2928_CLKSEL_CON(22), 0, 1, MFLAGS, 8, 8, DFLAGS, |
322 | RK2928_CLKGATE_CON(2), 6, GFLAGS), | 322 | RK2928_CLKGATE_CON(2), 6, GFLAGS), |
323 | COMPOSITE_FRAC(0, "hsadc_frac", "hsadc_src", | 323 | COMPOSITE_FRAC(0, "hsadc_frac", "hsadc_src", 0, |
324 | RK2928_CLKSEL_CON(23), 0, | 324 | RK2928_CLKSEL_CON(23), 0, |
325 | RK2928_CLKGATE_CON(2), 7, 0, GFLAGS), | 325 | RK2928_CLKGATE_CON(2), 7, GFLAGS), |
326 | MUX(SCLK_HSADC, "sclk_hsadc", mux_sclk_hsadc_p, 0, | 326 | MUX(SCLK_HSADC, "sclk_hsadc", mux_sclk_hsadc_p, 0, |
327 | RK2928_CLKSEL_CON(22), 4, 2, MFLAGS), | 327 | RK2928_CLKSEL_CON(22), 4, 2, MFLAGS), |
328 | 328 | ||
@@ -330,6 +330,15 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
330 | RK2928_CLKSEL_CON(24), 8, 8, DFLAGS, | 330 | RK2928_CLKSEL_CON(24), 8, 8, DFLAGS, |
331 | RK2928_CLKGATE_CON(2), 8, GFLAGS), | 331 | RK2928_CLKGATE_CON(2), 8, GFLAGS), |
332 | 332 | ||
333 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
334 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
335 | RK2928_CLKGATE_CON(0), 13, GFLAGS), | ||
336 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
337 | RK2928_CLKSEL_CON(9), 0, | ||
338 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
339 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
340 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
341 | |||
333 | /* | 342 | /* |
334 | * Clock-Architecture Diagram 4 | 343 | * Clock-Architecture Diagram 4 |
335 | */ | 344 | */ |
@@ -399,8 +408,8 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
399 | 408 | ||
400 | /* aclk_cpu gates */ | 409 | /* aclk_cpu gates */ |
401 | GATE(ACLK_DMA1, "aclk_dma1", "aclk_cpu", 0, RK2928_CLKGATE_CON(5), 0, GFLAGS), | 410 | GATE(ACLK_DMA1, "aclk_dma1", "aclk_cpu", 0, RK2928_CLKGATE_CON(5), 0, GFLAGS), |
402 | GATE(0, "aclk_intmem", "aclk_cpu", 0, RK2928_CLKGATE_CON(4), 12, GFLAGS), | 411 | GATE(0, "aclk_intmem", "aclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 12, GFLAGS), |
403 | GATE(0, "aclk_strc_sys", "aclk_cpu", 0, RK2928_CLKGATE_CON(4), 10, GFLAGS), | 412 | GATE(0, "aclk_strc_sys", "aclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 10, GFLAGS), |
404 | 413 | ||
405 | /* hclk_cpu gates */ | 414 | /* hclk_cpu gates */ |
406 | GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", 0, RK2928_CLKGATE_CON(5), 6, GFLAGS), | 415 | GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", 0, RK2928_CLKGATE_CON(5), 6, GFLAGS), |
@@ -410,14 +419,14 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
410 | /* hclk_ahb2apb is part of a clk branch */ | 419 | /* hclk_ahb2apb is part of a clk branch */ |
411 | GATE(0, "hclk_vio_bus", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 12, GFLAGS), | 420 | GATE(0, "hclk_vio_bus", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 12, GFLAGS), |
412 | GATE(HCLK_LCDC0, "hclk_lcdc0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 1, GFLAGS), | 421 | GATE(HCLK_LCDC0, "hclk_lcdc0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 1, GFLAGS), |
413 | GATE(HCLK_LCDC1, "hclk_lcdc1", "aclk_cpu", 0, RK2928_CLKGATE_CON(6), 2, GFLAGS), | 422 | GATE(HCLK_LCDC1, "hclk_lcdc1", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 2, GFLAGS), |
414 | GATE(HCLK_CIF0, "hclk_cif0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 4, GFLAGS), | 423 | GATE(HCLK_CIF0, "hclk_cif0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 4, GFLAGS), |
415 | GATE(HCLK_IPP, "hclk_ipp", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 9, GFLAGS), | 424 | GATE(HCLK_IPP, "hclk_ipp", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 9, GFLAGS), |
416 | GATE(HCLK_RGA, "hclk_rga", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 10, GFLAGS), | 425 | GATE(HCLK_RGA, "hclk_rga", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 10, GFLAGS), |
417 | 426 | ||
418 | /* hclk_peri gates */ | 427 | /* hclk_peri gates */ |
419 | GATE(0, "hclk_peri_axi_matrix", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 0, GFLAGS), | 428 | GATE(0, "hclk_peri_axi_matrix", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 0, GFLAGS), |
420 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 6, GFLAGS), | 429 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 6, GFLAGS), |
421 | GATE(0, "hclk_emem_peri", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 7, GFLAGS), | 430 | GATE(0, "hclk_emem_peri", "hclk_peri", 0, RK2928_CLKGATE_CON(4), 7, GFLAGS), |
422 | GATE(HCLK_EMAC, "hclk_emac", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, GFLAGS), | 431 | GATE(HCLK_EMAC, "hclk_emac", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 0, GFLAGS), |
423 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 9, GFLAGS), | 432 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 9, GFLAGS), |
@@ -457,18 +466,18 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
457 | GATE(0, "pclk_ddrupctl", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 7, GFLAGS), | 466 | GATE(0, "pclk_ddrupctl", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 7, GFLAGS), |
458 | GATE(0, "pclk_ddrpubl", "pclk_cpu", 0, RK2928_CLKGATE_CON(9), 6, GFLAGS), | 467 | GATE(0, "pclk_ddrpubl", "pclk_cpu", 0, RK2928_CLKGATE_CON(9), 6, GFLAGS), |
459 | GATE(0, "pclk_dbg", "pclk_cpu", 0, RK2928_CLKGATE_CON(9), 1, GFLAGS), | 468 | GATE(0, "pclk_dbg", "pclk_cpu", 0, RK2928_CLKGATE_CON(9), 1, GFLAGS), |
460 | GATE(PCLK_GRF, "pclk_grf", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 4, GFLAGS), | 469 | GATE(PCLK_GRF, "pclk_grf", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 4, GFLAGS), |
461 | GATE(PCLK_PMU, "pclk_pmu", "pclk_cpu", 0, RK2928_CLKGATE_CON(5), 5, GFLAGS), | 470 | GATE(PCLK_PMU, "pclk_pmu", "pclk_cpu", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(5), 5, GFLAGS), |
462 | 471 | ||
463 | /* aclk_peri */ | 472 | /* aclk_peri */ |
464 | GATE(ACLK_DMA2, "aclk_dma2", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 1, GFLAGS), | 473 | GATE(ACLK_DMA2, "aclk_dma2", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 1, GFLAGS), |
465 | GATE(ACLK_SMC, "aclk_smc", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 8, GFLAGS), | 474 | GATE(ACLK_SMC, "aclk_smc", "aclk_peri", 0, RK2928_CLKGATE_CON(5), 8, GFLAGS), |
466 | GATE(0, "aclk_peri_niu", "aclk_peri", 0, RK2928_CLKGATE_CON(4), 4, GFLAGS), | 475 | GATE(0, "aclk_peri_niu", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 4, GFLAGS), |
467 | GATE(0, "aclk_cpu_peri", "aclk_peri", 0, RK2928_CLKGATE_CON(4), 2, GFLAGS), | 476 | GATE(0, "aclk_cpu_peri", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 2, GFLAGS), |
468 | GATE(0, "aclk_peri_axi_matrix", "aclk_peri", 0, RK2928_CLKGATE_CON(4), 3, GFLAGS), | 477 | GATE(0, "aclk_peri_axi_matrix", "aclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 3, GFLAGS), |
469 | 478 | ||
470 | /* pclk_peri gates */ | 479 | /* pclk_peri gates */ |
471 | GATE(0, "pclk_peri_axi_matrix", "pclk_peri", 0, RK2928_CLKGATE_CON(4), 1, GFLAGS), | 480 | GATE(0, "pclk_peri_axi_matrix", "pclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(4), 1, GFLAGS), |
472 | GATE(PCLK_PWM23, "pclk_pwm23", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 11, GFLAGS), | 481 | GATE(PCLK_PWM23, "pclk_pwm23", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 11, GFLAGS), |
473 | GATE(PCLK_WDT, "pclk_wdt", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 15, GFLAGS), | 482 | GATE(PCLK_WDT, "pclk_wdt", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 15, GFLAGS), |
474 | GATE(PCLK_SPI0, "pclk_spi0", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 12, GFLAGS), | 483 | GATE(PCLK_SPI0, "pclk_spi0", "pclk_peri", 0, RK2928_CLKGATE_CON(7), 12, GFLAGS), |
@@ -511,7 +520,7 @@ static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { | |||
511 | | CLK_DIVIDER_READ_ONLY, | 520 | | CLK_DIVIDER_READ_ONLY, |
512 | RK2928_CLKGATE_CON(4), 9, GFLAGS), | 521 | RK2928_CLKGATE_CON(4), 9, GFLAGS), |
513 | 522 | ||
514 | GATE(CORE_L2C, "core_l2c", "aclk_cpu", 0, | 523 | GATE(CORE_L2C, "core_l2c", "aclk_cpu", CLK_IGNORE_UNUSED, |
515 | RK2928_CLKGATE_CON(9), 4, GFLAGS), | 524 | RK2928_CLKGATE_CON(9), 4, GFLAGS), |
516 | 525 | ||
517 | COMPOSITE(0, "aclk_peri_pre", mux_pll_src_gpll_cpll_p, 0, | 526 | COMPOSITE(0, "aclk_peri_pre", mux_pll_src_gpll_cpll_p, 0, |
@@ -577,14 +586,6 @@ static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { | |||
577 | RK2928_CLKGATE_CON(0), 12, GFLAGS), | 586 | RK2928_CLKGATE_CON(0), 12, GFLAGS), |
578 | MUX(SCLK_I2S2, "sclk_i2s2", mux_sclk_i2s2_p, 0, | 587 | MUX(SCLK_I2S2, "sclk_i2s2", mux_sclk_i2s2_p, 0, |
579 | RK2928_CLKSEL_CON(4), 8, 2, MFLAGS), | 588 | RK2928_CLKSEL_CON(4), 8, 2, MFLAGS), |
580 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
581 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
582 | RK2928_CLKGATE_CON(0), 13, GFLAGS), | ||
583 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
584 | RK2928_CLKSEL_CON(9), 0, | ||
585 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
586 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
587 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
588 | 589 | ||
589 | GATE(HCLK_I2S1, "hclk_i2s1", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), | 590 | GATE(HCLK_I2S1, "hclk_i2s1", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), |
590 | GATE(HCLK_I2S2, "hclk_i2s2", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), | 591 | GATE(HCLK_I2S2, "hclk_i2s2", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), |
@@ -618,7 +619,7 @@ PNAME(mux_hsicphy_p) = { "sclk_otgphy0", "sclk_otgphy1", | |||
618 | "gpll", "cpll" }; | 619 | "gpll", "cpll" }; |
619 | 620 | ||
620 | static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | 621 | static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { |
621 | COMPOSITE_NOMUX_DIVTBL(0, "aclk_core", "armclk", 0, | 622 | COMPOSITE_NOMUX_DIVTBL(0, "aclk_core", "armclk", CLK_IGNORE_UNUSED, |
622 | RK2928_CLKSEL_CON(1), 3, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 623 | RK2928_CLKSEL_CON(1), 3, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
623 | div_rk3188_aclk_core_t, RK2928_CLKGATE_CON(0), 7, GFLAGS), | 624 | div_rk3188_aclk_core_t, RK2928_CLKGATE_CON(0), 7, GFLAGS), |
624 | 625 | ||
@@ -633,7 +634,7 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
633 | RK2928_CLKSEL_CON(1), 14, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, | 634 | RK2928_CLKSEL_CON(1), 14, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, |
634 | RK2928_CLKGATE_CON(4), 9, GFLAGS), | 635 | RK2928_CLKGATE_CON(4), 9, GFLAGS), |
635 | 636 | ||
636 | GATE(CORE_L2C, "core_l2c", "armclk", 0, | 637 | GATE(CORE_L2C, "core_l2c", "armclk", CLK_IGNORE_UNUSED, |
637 | RK2928_CLKGATE_CON(9), 4, GFLAGS), | 638 | RK2928_CLKGATE_CON(9), 4, GFLAGS), |
638 | 639 | ||
639 | COMPOSITE(0, "aclk_peri_pre", mux_pll_src_cpll_gpll_p, 0, | 640 | COMPOSITE(0, "aclk_peri_pre", mux_pll_src_cpll_gpll_p, 0, |
@@ -663,7 +664,7 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
663 | RK2928_CLKSEL_CON(30), 0, 2, DFLAGS, | 664 | RK2928_CLKSEL_CON(30), 0, 2, DFLAGS, |
664 | RK2928_CLKGATE_CON(3), 6, GFLAGS), | 665 | RK2928_CLKGATE_CON(3), 6, GFLAGS), |
665 | DIV(0, "sclk_hsicphy_12m", "sclk_hsicphy_480m", 0, | 666 | DIV(0, "sclk_hsicphy_12m", "sclk_hsicphy_480m", 0, |
666 | RK2928_CLKGATE_CON(11), 8, 6, DFLAGS), | 667 | RK2928_CLKSEL_CON(11), 8, 6, DFLAGS), |
667 | 668 | ||
668 | MUX(0, "i2s_src", mux_pll_src_gpll_cpll_p, 0, | 669 | MUX(0, "i2s_src", mux_pll_src_gpll_cpll_p, 0, |
669 | RK2928_CLKSEL_CON(2), 15, 1, MFLAGS), | 670 | RK2928_CLKSEL_CON(2), 15, 1, MFLAGS), |
@@ -675,14 +676,6 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
675 | RK2928_CLKGATE_CON(0), 10, GFLAGS), | 676 | RK2928_CLKGATE_CON(0), 10, GFLAGS), |
676 | MUX(SCLK_I2S0, "sclk_i2s0", mux_sclk_i2s0_p, 0, | 677 | MUX(SCLK_I2S0, "sclk_i2s0", mux_sclk_i2s0_p, 0, |
677 | RK2928_CLKSEL_CON(3), 8, 2, MFLAGS), | 678 | RK2928_CLKSEL_CON(3), 8, 2, MFLAGS), |
678 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
679 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
680 | RK2928_CLKGATE_CON(13), 13, GFLAGS), | ||
681 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
682 | RK2928_CLKSEL_CON(9), 0, | ||
683 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
684 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
685 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
686 | 679 | ||
687 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), | 680 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), |
688 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), | 681 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), |
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index 23278291da44..ac6be7c0132d 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/clk-provider.h> | 16 | #include <linux/clk-provider.h> |
17 | #include <linux/of.h> | 17 | #include <linux/of.h> |
18 | #include <linux/of_address.h> | 18 | #include <linux/of_address.h> |
19 | #include <linux/syscore_ops.h> | ||
19 | #include <dt-bindings/clock/rk3288-cru.h> | 20 | #include <dt-bindings/clock/rk3288-cru.h> |
20 | #include "clk.h" | 21 | #include "clk.h" |
21 | 22 | ||
@@ -83,11 +84,13 @@ struct rockchip_pll_rate_table rk3288_pll_rates[] = { | |||
83 | RK3066_PLL_RATE( 742500000, 8, 495, 2), | 84 | RK3066_PLL_RATE( 742500000, 8, 495, 2), |
84 | RK3066_PLL_RATE( 696000000, 1, 58, 2), | 85 | RK3066_PLL_RATE( 696000000, 1, 58, 2), |
85 | RK3066_PLL_RATE( 600000000, 1, 50, 2), | 86 | RK3066_PLL_RATE( 600000000, 1, 50, 2), |
86 | RK3066_PLL_RATE( 594000000, 2, 198, 4), | 87 | RK3066_PLL_RATE_BWADJ(594000000, 1, 198, 8, 1), |
87 | RK3066_PLL_RATE( 552000000, 1, 46, 2), | 88 | RK3066_PLL_RATE( 552000000, 1, 46, 2), |
88 | RK3066_PLL_RATE( 504000000, 1, 84, 4), | 89 | RK3066_PLL_RATE( 504000000, 1, 84, 4), |
90 | RK3066_PLL_RATE( 500000000, 3, 125, 2), | ||
89 | RK3066_PLL_RATE( 456000000, 1, 76, 4), | 91 | RK3066_PLL_RATE( 456000000, 1, 76, 4), |
90 | RK3066_PLL_RATE( 408000000, 1, 68, 4), | 92 | RK3066_PLL_RATE( 408000000, 1, 68, 4), |
93 | RK3066_PLL_RATE( 400000000, 3, 100, 2), | ||
91 | RK3066_PLL_RATE( 384000000, 2, 128, 4), | 94 | RK3066_PLL_RATE( 384000000, 2, 128, 4), |
92 | RK3066_PLL_RATE( 360000000, 1, 60, 4), | 95 | RK3066_PLL_RATE( 360000000, 1, 60, 4), |
93 | RK3066_PLL_RATE( 312000000, 1, 52, 4), | 96 | RK3066_PLL_RATE( 312000000, 1, 52, 4), |
@@ -173,14 +176,14 @@ PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu" }; | |||
173 | PNAME(mux_pll_src_cpll_gpll_p) = { "cpll", "gpll" }; | 176 | PNAME(mux_pll_src_cpll_gpll_p) = { "cpll", "gpll" }; |
174 | PNAME(mux_pll_src_npll_cpll_gpll_p) = { "npll", "cpll", "gpll" }; | 177 | PNAME(mux_pll_src_npll_cpll_gpll_p) = { "npll", "cpll", "gpll" }; |
175 | PNAME(mux_pll_src_cpll_gpll_npll_p) = { "cpll", "gpll", "npll" }; | 178 | PNAME(mux_pll_src_cpll_gpll_npll_p) = { "cpll", "gpll", "npll" }; |
176 | PNAME(mux_pll_src_cpll_gpll_usb480m_p) = { "cpll", "gpll", "usb480m" }; | 179 | PNAME(mux_pll_src_cpll_gpll_usb480m_p) = { "cpll", "gpll", "usbphy480m_src" }; |
180 | PNAME(mux_pll_src_cpll_gll_usb_npll_p) = { "cpll", "gpll", "usbphy480m_src", "npll" }; | ||
177 | 181 | ||
178 | PNAME(mux_mmc_src_p) = { "cpll", "gpll", "xin24m", "xin24m" }; | 182 | PNAME(mux_mmc_src_p) = { "cpll", "gpll", "xin24m", "xin24m" }; |
179 | PNAME(mux_i2s_pre_p) = { "i2s_src", "i2s_frac", "ext_i2s", "xin12m" }; | 183 | PNAME(mux_i2s_pre_p) = { "i2s_src", "i2s_frac", "ext_i2s", "xin12m" }; |
180 | PNAME(mux_i2s_clkout_p) = { "i2s_pre", "xin12m" }; | 184 | PNAME(mux_i2s_clkout_p) = { "i2s_pre", "xin12m" }; |
181 | PNAME(mux_spdif_p) = { "spdif_pre", "spdif_frac", "xin12m" }; | 185 | PNAME(mux_spdif_p) = { "spdif_pre", "spdif_frac", "xin12m" }; |
182 | PNAME(mux_spdif_8ch_p) = { "spdif_8ch_pre", "spdif_8ch_frac", "xin12m" }; | 186 | PNAME(mux_spdif_8ch_p) = { "spdif_8ch_pre", "spdif_8ch_frac", "xin12m" }; |
183 | PNAME(mux_uart0_pll_p) = { "cpll", "gpll", "usbphy_480m_src", "npll" }; | ||
184 | PNAME(mux_uart0_p) = { "uart0_src", "uart0_frac", "xin24m" }; | 187 | PNAME(mux_uart0_p) = { "uart0_src", "uart0_frac", "xin24m" }; |
185 | PNAME(mux_uart1_p) = { "uart1_src", "uart1_frac", "xin24m" }; | 188 | PNAME(mux_uart1_p) = { "uart1_src", "uart1_frac", "xin24m" }; |
186 | PNAME(mux_uart2_p) = { "uart2_src", "uart2_frac", "xin24m" }; | 189 | PNAME(mux_uart2_p) = { "uart2_src", "uart2_frac", "xin24m" }; |
@@ -192,22 +195,22 @@ PNAME(mux_hsadcout_p) = { "hsadc_src", "ext_hsadc" }; | |||
192 | PNAME(mux_edp_24m_p) = { "ext_edp_24m", "xin24m" }; | 195 | PNAME(mux_edp_24m_p) = { "ext_edp_24m", "xin24m" }; |
193 | PNAME(mux_tspout_p) = { "cpll", "gpll", "npll", "xin27m" }; | 196 | PNAME(mux_tspout_p) = { "cpll", "gpll", "npll", "xin27m" }; |
194 | 197 | ||
195 | PNAME(mux_usbphy480m_p) = { "sclk_otgphy0", "sclk_otgphy1", | 198 | PNAME(mux_usbphy480m_p) = { "sclk_otgphy1", "sclk_otgphy2", |
196 | "sclk_otgphy2" }; | 199 | "sclk_otgphy0" }; |
197 | PNAME(mux_hsicphy480m_p) = { "cpll", "gpll", "usbphy480m_src" }; | 200 | PNAME(mux_hsicphy480m_p) = { "cpll", "gpll", "usbphy480m_src" }; |
198 | PNAME(mux_hsicphy12m_p) = { "hsicphy12m_xin12m", "hsicphy12m_usbphy" }; | 201 | PNAME(mux_hsicphy12m_p) = { "hsicphy12m_xin12m", "hsicphy12m_usbphy" }; |
199 | 202 | ||
200 | static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { | 203 | static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { |
201 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK3288_PLL_CON(0), | 204 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK3288_PLL_CON(0), |
202 | RK3288_MODE_CON, 0, 6, rk3288_pll_rates), | 205 | RK3288_MODE_CON, 0, 6, 0, rk3288_pll_rates), |
203 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK3288_PLL_CON(4), | 206 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK3288_PLL_CON(4), |
204 | RK3288_MODE_CON, 4, 5, NULL), | 207 | RK3288_MODE_CON, 4, 5, 0, NULL), |
205 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK3288_PLL_CON(8), | 208 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK3288_PLL_CON(8), |
206 | RK3288_MODE_CON, 8, 7, rk3288_pll_rates), | 209 | RK3288_MODE_CON, 8, 7, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
207 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), | 210 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), |
208 | RK3288_MODE_CON, 12, 8, rk3288_pll_rates), | 211 | RK3288_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
209 | [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), | 212 | [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), |
210 | RK3288_MODE_CON, 14, 9, rk3288_pll_rates), | 213 | RK3288_MODE_CON, 14, 9, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
211 | }; | 214 | }; |
212 | 215 | ||
213 | static struct clk_div_table div_hclk_cpu_t[] = { | 216 | static struct clk_div_table div_hclk_cpu_t[] = { |
@@ -226,67 +229,67 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
226 | * Clock-Architecture Diagram 1 | 229 | * Clock-Architecture Diagram 1 |
227 | */ | 230 | */ |
228 | 231 | ||
229 | GATE(0, "apll_core", "apll", 0, | 232 | GATE(0, "apll_core", "apll", CLK_IGNORE_UNUSED, |
230 | RK3288_CLKGATE_CON(0), 1, GFLAGS), | 233 | RK3288_CLKGATE_CON(0), 1, GFLAGS), |
231 | GATE(0, "gpll_core", "gpll", 0, | 234 | GATE(0, "gpll_core", "gpll", CLK_IGNORE_UNUSED, |
232 | RK3288_CLKGATE_CON(0), 2, GFLAGS), | 235 | RK3288_CLKGATE_CON(0), 2, GFLAGS), |
233 | 236 | ||
234 | COMPOSITE_NOMUX(0, "armcore0", "armclk", 0, | 237 | COMPOSITE_NOMUX(0, "armcore0", "armclk", CLK_IGNORE_UNUSED, |
235 | RK3288_CLKSEL_CON(36), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 238 | RK3288_CLKSEL_CON(36), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
236 | RK3288_CLKGATE_CON(12), 0, GFLAGS), | 239 | RK3288_CLKGATE_CON(12), 0, GFLAGS), |
237 | COMPOSITE_NOMUX(0, "armcore1", "armclk", 0, | 240 | COMPOSITE_NOMUX(0, "armcore1", "armclk", CLK_IGNORE_UNUSED, |
238 | RK3288_CLKSEL_CON(36), 4, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 241 | RK3288_CLKSEL_CON(36), 4, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
239 | RK3288_CLKGATE_CON(12), 1, GFLAGS), | 242 | RK3288_CLKGATE_CON(12), 1, GFLAGS), |
240 | COMPOSITE_NOMUX(0, "armcore2", "armclk", 0, | 243 | COMPOSITE_NOMUX(0, "armcore2", "armclk", CLK_IGNORE_UNUSED, |
241 | RK3288_CLKSEL_CON(36), 8, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 244 | RK3288_CLKSEL_CON(36), 8, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
242 | RK3288_CLKGATE_CON(12), 2, GFLAGS), | 245 | RK3288_CLKGATE_CON(12), 2, GFLAGS), |
243 | COMPOSITE_NOMUX(0, "armcore3", "armclk", 0, | 246 | COMPOSITE_NOMUX(0, "armcore3", "armclk", CLK_IGNORE_UNUSED, |
244 | RK3288_CLKSEL_CON(36), 12, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 247 | RK3288_CLKSEL_CON(36), 12, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
245 | RK3288_CLKGATE_CON(12), 3, GFLAGS), | 248 | RK3288_CLKGATE_CON(12), 3, GFLAGS), |
246 | COMPOSITE_NOMUX(0, "l2ram", "armclk", 0, | 249 | COMPOSITE_NOMUX(0, "l2ram", "armclk", CLK_IGNORE_UNUSED, |
247 | RK3288_CLKSEL_CON(37), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, | 250 | RK3288_CLKSEL_CON(37), 0, 3, DFLAGS | CLK_DIVIDER_READ_ONLY, |
248 | RK3288_CLKGATE_CON(12), 4, GFLAGS), | 251 | RK3288_CLKGATE_CON(12), 4, GFLAGS), |
249 | COMPOSITE_NOMUX(0, "aclk_core_m0", "armclk", 0, | 252 | COMPOSITE_NOMUX(0, "aclk_core_m0", "armclk", CLK_IGNORE_UNUSED, |
250 | RK3288_CLKSEL_CON(0), 0, 4, DFLAGS | CLK_DIVIDER_READ_ONLY, | 253 | RK3288_CLKSEL_CON(0), 0, 4, DFLAGS | CLK_DIVIDER_READ_ONLY, |
251 | RK3288_CLKGATE_CON(12), 5, GFLAGS), | 254 | RK3288_CLKGATE_CON(12), 5, GFLAGS), |
252 | COMPOSITE_NOMUX(0, "aclk_core_mp", "armclk", 0, | 255 | COMPOSITE_NOMUX(0, "aclk_core_mp", "armclk", CLK_IGNORE_UNUSED, |
253 | RK3288_CLKSEL_CON(0), 4, 4, DFLAGS | CLK_DIVIDER_READ_ONLY, | 256 | RK3288_CLKSEL_CON(0), 4, 4, DFLAGS | CLK_DIVIDER_READ_ONLY, |
254 | RK3288_CLKGATE_CON(12), 6, GFLAGS), | 257 | RK3288_CLKGATE_CON(12), 6, GFLAGS), |
255 | COMPOSITE_NOMUX(0, "atclk", "armclk", 0, | 258 | COMPOSITE_NOMUX(0, "atclk", "armclk", 0, |
256 | RK3288_CLKSEL_CON(37), 4, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, | 259 | RK3288_CLKSEL_CON(37), 4, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, |
257 | RK3288_CLKGATE_CON(12), 7, GFLAGS), | 260 | RK3288_CLKGATE_CON(12), 7, GFLAGS), |
258 | COMPOSITE_NOMUX(0, "pclk_dbg_pre", "armclk", 0, | 261 | COMPOSITE_NOMUX(0, "pclk_dbg_pre", "armclk", CLK_IGNORE_UNUSED, |
259 | RK3288_CLKSEL_CON(37), 9, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, | 262 | RK3288_CLKSEL_CON(37), 9, 5, DFLAGS | CLK_DIVIDER_READ_ONLY, |
260 | RK3288_CLKGATE_CON(12), 8, GFLAGS), | 263 | RK3288_CLKGATE_CON(12), 8, GFLAGS), |
261 | GATE(0, "pclk_dbg", "pclk_dbg_pre", 0, | 264 | GATE(0, "pclk_dbg", "pclk_dbg_pre", 0, |
262 | RK3288_CLKGATE_CON(12), 9, GFLAGS), | 265 | RK3288_CLKGATE_CON(12), 9, GFLAGS), |
263 | GATE(0, "cs_dbg", "pclk_dbg_pre", 0, | 266 | GATE(0, "cs_dbg", "pclk_dbg_pre", CLK_IGNORE_UNUSED, |
264 | RK3288_CLKGATE_CON(12), 10, GFLAGS), | 267 | RK3288_CLKGATE_CON(12), 10, GFLAGS), |
265 | GATE(0, "pclk_core_niu", "pclk_dbg_pre", 0, | 268 | GATE(0, "pclk_core_niu", "pclk_dbg_pre", 0, |
266 | RK3288_CLKGATE_CON(12), 11, GFLAGS), | 269 | RK3288_CLKGATE_CON(12), 11, GFLAGS), |
267 | 270 | ||
268 | GATE(0, "dpll_ddr", "dpll", 0, | 271 | GATE(0, "dpll_ddr", "dpll", CLK_IGNORE_UNUSED, |
269 | RK3288_CLKGATE_CON(0), 8, GFLAGS), | 272 | RK3288_CLKGATE_CON(0), 8, GFLAGS), |
270 | GATE(0, "gpll_ddr", "gpll", 0, | 273 | GATE(0, "gpll_ddr", "gpll", 0, |
271 | RK3288_CLKGATE_CON(0), 9, GFLAGS), | 274 | RK3288_CLKGATE_CON(0), 9, GFLAGS), |
272 | COMPOSITE_NOGATE(0, "ddrphy", mux_ddrphy_p, 0, | 275 | COMPOSITE_NOGATE(0, "ddrphy", mux_ddrphy_p, CLK_IGNORE_UNUSED, |
273 | RK3288_CLKSEL_CON(26), 2, 1, MFLAGS, 0, 2, | 276 | RK3288_CLKSEL_CON(26), 2, 1, MFLAGS, 0, 2, |
274 | DFLAGS | CLK_DIVIDER_POWER_OF_TWO), | 277 | DFLAGS | CLK_DIVIDER_POWER_OF_TWO), |
275 | 278 | ||
276 | GATE(0, "gpll_aclk_cpu", "gpll", 0, | 279 | GATE(0, "gpll_aclk_cpu", "gpll", CLK_IGNORE_UNUSED, |
277 | RK3288_CLKGATE_CON(0), 10, GFLAGS), | 280 | RK3288_CLKGATE_CON(0), 10, GFLAGS), |
278 | GATE(0, "cpll_aclk_cpu", "cpll", 0, | 281 | GATE(0, "cpll_aclk_cpu", "cpll", CLK_IGNORE_UNUSED, |
279 | RK3288_CLKGATE_CON(0), 11, GFLAGS), | 282 | RK3288_CLKGATE_CON(0), 11, GFLAGS), |
280 | COMPOSITE_NOGATE(0, "aclk_cpu_src", mux_aclk_cpu_src_p, 0, | 283 | COMPOSITE_NOGATE(0, "aclk_cpu_src", mux_aclk_cpu_src_p, CLK_IGNORE_UNUSED, |
281 | RK3288_CLKSEL_CON(1), 15, 1, MFLAGS, 3, 5, DFLAGS), | 284 | RK3288_CLKSEL_CON(1), 15, 1, MFLAGS, 3, 5, DFLAGS), |
282 | DIV(0, "aclk_cpu_pre", "aclk_cpu_src", 0, | 285 | DIV(0, "aclk_cpu_pre", "aclk_cpu_src", CLK_SET_RATE_PARENT, |
283 | RK3288_CLKSEL_CON(1), 0, 3, DFLAGS), | 286 | RK3288_CLKSEL_CON(1), 0, 3, DFLAGS), |
284 | GATE(ACLK_CPU, "aclk_cpu", "aclk_cpu_pre", 0, | 287 | GATE(ACLK_CPU, "aclk_cpu", "aclk_cpu_pre", CLK_IGNORE_UNUSED, |
285 | RK3288_CLKGATE_CON(0), 3, GFLAGS), | 288 | RK3288_CLKGATE_CON(0), 3, GFLAGS), |
286 | COMPOSITE_NOMUX(PCLK_CPU, "pclk_cpu", "aclk_cpu_pre", 0, | 289 | COMPOSITE_NOMUX(PCLK_CPU, "pclk_cpu", "aclk_cpu_pre", CLK_IGNORE_UNUSED, |
287 | RK3288_CLKSEL_CON(1), 12, 3, DFLAGS, | 290 | RK3288_CLKSEL_CON(1), 12, 3, DFLAGS, |
288 | RK3288_CLKGATE_CON(0), 5, GFLAGS), | 291 | RK3288_CLKGATE_CON(0), 5, GFLAGS), |
289 | COMPOSITE_NOMUX_DIVTBL(HCLK_CPU, "hclk_cpu", "aclk_cpu_pre", 0, | 292 | COMPOSITE_NOMUX_DIVTBL(HCLK_CPU, "hclk_cpu", "aclk_cpu_pre", CLK_IGNORE_UNUSED, |
290 | RK3288_CLKSEL_CON(1), 8, 2, DFLAGS, div_hclk_cpu_t, | 293 | RK3288_CLKSEL_CON(1), 8, 2, DFLAGS, div_hclk_cpu_t, |
291 | RK3288_CLKGATE_CON(0), 4, GFLAGS), | 294 | RK3288_CLKGATE_CON(0), 4, GFLAGS), |
292 | GATE(0, "c2c_host", "aclk_cpu_src", 0, | 295 | GATE(0, "c2c_host", "aclk_cpu_src", 0, |
@@ -294,7 +297,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
294 | COMPOSITE_NOMUX(0, "crypto", "aclk_cpu_pre", 0, | 297 | COMPOSITE_NOMUX(0, "crypto", "aclk_cpu_pre", 0, |
295 | RK3288_CLKSEL_CON(26), 6, 2, DFLAGS, | 298 | RK3288_CLKSEL_CON(26), 6, 2, DFLAGS, |
296 | RK3288_CLKGATE_CON(5), 4, GFLAGS), | 299 | RK3288_CLKGATE_CON(5), 4, GFLAGS), |
297 | GATE(0, "aclk_bus_2pmu", "aclk_cpu_pre", 0, | 300 | GATE(0, "aclk_bus_2pmu", "aclk_cpu_pre", CLK_IGNORE_UNUSED, |
298 | RK3288_CLKGATE_CON(0), 7, GFLAGS), | 301 | RK3288_CLKGATE_CON(0), 7, GFLAGS), |
299 | 302 | ||
300 | COMPOSITE(0, "i2s_src", mux_pll_src_cpll_gpll_p, 0, | 303 | COMPOSITE(0, "i2s_src", mux_pll_src_cpll_gpll_p, 0, |
@@ -305,7 +308,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
305 | RK3288_CLKGATE_CON(4), 2, GFLAGS), | 308 | RK3288_CLKGATE_CON(4), 2, GFLAGS), |
306 | MUX(0, "i2s_pre", mux_i2s_pre_p, CLK_SET_RATE_PARENT, | 309 | MUX(0, "i2s_pre", mux_i2s_pre_p, CLK_SET_RATE_PARENT, |
307 | RK3288_CLKSEL_CON(4), 8, 2, MFLAGS), | 310 | RK3288_CLKSEL_CON(4), 8, 2, MFLAGS), |
308 | COMPOSITE_NODIV(0, "i2s0_clkout", mux_i2s_clkout_p, CLK_SET_RATE_PARENT, | 311 | COMPOSITE_NODIV(SCLK_I2S0_OUT, "i2s0_clkout", mux_i2s_clkout_p, 0, |
309 | RK3288_CLKSEL_CON(4), 12, 1, MFLAGS, | 312 | RK3288_CLKSEL_CON(4), 12, 1, MFLAGS, |
310 | RK3288_CLKGATE_CON(4), 0, GFLAGS), | 313 | RK3288_CLKGATE_CON(4), 0, GFLAGS), |
311 | GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", CLK_SET_RATE_PARENT, | 314 | GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", CLK_SET_RATE_PARENT, |
@@ -325,7 +328,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
325 | COMPOSITE_NOMUX(0, "spdif_8ch_pre", "spdif_src", 0, | 328 | COMPOSITE_NOMUX(0, "spdif_8ch_pre", "spdif_src", 0, |
326 | RK3288_CLKSEL_CON(40), 0, 7, DFLAGS, | 329 | RK3288_CLKSEL_CON(40), 0, 7, DFLAGS, |
327 | RK3288_CLKGATE_CON(4), 7, GFLAGS), | 330 | RK3288_CLKGATE_CON(4), 7, GFLAGS), |
328 | COMPOSITE_FRAC(0, "spdif_8ch_frac", "spdif_8ch_src", 0, | 331 | COMPOSITE_FRAC(0, "spdif_8ch_frac", "spdif_8ch_pre", 0, |
329 | RK3288_CLKSEL_CON(41), 0, | 332 | RK3288_CLKSEL_CON(41), 0, |
330 | RK3288_CLKGATE_CON(4), 8, GFLAGS), | 333 | RK3288_CLKGATE_CON(4), 8, GFLAGS), |
331 | COMPOSITE_NODIV(SCLK_SPDIF8CH, "sclk_spdif_8ch", mux_spdif_8ch_p, 0, | 334 | COMPOSITE_NODIV(SCLK_SPDIF8CH, "sclk_spdif_8ch", mux_spdif_8ch_p, 0, |
@@ -373,12 +376,12 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
373 | GATE(HCLK_VCODEC, "hclk_vcodec", "hclk_vcodec_pre", 0, | 376 | GATE(HCLK_VCODEC, "hclk_vcodec", "hclk_vcodec_pre", 0, |
374 | RK3288_CLKGATE_CON(9), 1, GFLAGS), | 377 | RK3288_CLKGATE_CON(9), 1, GFLAGS), |
375 | 378 | ||
376 | COMPOSITE(0, "aclk_vio0", mux_pll_src_cpll_gpll_usb480m_p, 0, | 379 | COMPOSITE(0, "aclk_vio0", mux_pll_src_cpll_gpll_usb480m_p, CLK_IGNORE_UNUSED, |
377 | RK3288_CLKSEL_CON(31), 6, 2, MFLAGS, 0, 5, DFLAGS, | 380 | RK3288_CLKSEL_CON(31), 6, 2, MFLAGS, 0, 5, DFLAGS, |
378 | RK3288_CLKGATE_CON(3), 0, GFLAGS), | 381 | RK3288_CLKGATE_CON(3), 0, GFLAGS), |
379 | DIV(0, "hclk_vio", "aclk_vio0", 0, | 382 | DIV(0, "hclk_vio", "aclk_vio0", 0, |
380 | RK3288_CLKSEL_CON(28), 8, 5, DFLAGS), | 383 | RK3288_CLKSEL_CON(28), 8, 5, DFLAGS), |
381 | COMPOSITE(0, "aclk_vio1", mux_pll_src_cpll_gpll_usb480m_p, 0, | 384 | COMPOSITE(0, "aclk_vio1", mux_pll_src_cpll_gpll_usb480m_p, CLK_IGNORE_UNUSED, |
382 | RK3288_CLKSEL_CON(31), 14, 2, MFLAGS, 8, 5, DFLAGS, | 385 | RK3288_CLKSEL_CON(31), 14, 2, MFLAGS, 8, 5, DFLAGS, |
383 | RK3288_CLKGATE_CON(3), 2, GFLAGS), | 386 | RK3288_CLKGATE_CON(3), 2, GFLAGS), |
384 | 387 | ||
@@ -436,24 +439,24 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
436 | 439 | ||
437 | DIV(0, "pclk_pd_alive", "gpll", 0, | 440 | DIV(0, "pclk_pd_alive", "gpll", 0, |
438 | RK3288_CLKSEL_CON(33), 8, 5, DFLAGS), | 441 | RK3288_CLKSEL_CON(33), 8, 5, DFLAGS), |
439 | COMPOSITE_NOMUX(0, "pclk_pd_pmu", "gpll", 0, | 442 | COMPOSITE_NOMUX(0, "pclk_pd_pmu", "gpll", CLK_IGNORE_UNUSED, |
440 | RK3288_CLKSEL_CON(33), 0, 5, DFLAGS, | 443 | RK3288_CLKSEL_CON(33), 0, 5, DFLAGS, |
441 | RK3288_CLKGATE_CON(5), 8, GFLAGS), | 444 | RK3288_CLKGATE_CON(5), 8, GFLAGS), |
442 | 445 | ||
443 | COMPOSITE(SCLK_GPU, "sclk_gpu", mux_pll_src_cpll_gpll_usb480m_p, 0, | 446 | COMPOSITE(SCLK_GPU, "sclk_gpu", mux_pll_src_cpll_gll_usb_npll_p, 0, |
444 | RK3288_CLKSEL_CON(34), 6, 2, MFLAGS, 0, 5, DFLAGS, | 447 | RK3288_CLKSEL_CON(34), 6, 2, MFLAGS, 0, 5, DFLAGS, |
445 | RK3288_CLKGATE_CON(5), 7, GFLAGS), | 448 | RK3288_CLKGATE_CON(5), 7, GFLAGS), |
446 | 449 | ||
447 | COMPOSITE(0, "aclk_peri_src", mux_pll_src_cpll_gpll_p, 0, | 450 | COMPOSITE(0, "aclk_peri_src", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, |
448 | RK3288_CLKSEL_CON(10), 15, 1, MFLAGS, 0, 5, DFLAGS, | 451 | RK3288_CLKSEL_CON(10), 15, 1, MFLAGS, 0, 5, DFLAGS, |
449 | RK3288_CLKGATE_CON(2), 0, GFLAGS), | 452 | RK3288_CLKGATE_CON(2), 0, GFLAGS), |
450 | COMPOSITE_NOMUX(PCLK_PERI, "pclk_peri", "aclk_peri_src", 0, | 453 | COMPOSITE_NOMUX(PCLK_PERI, "pclk_peri", "aclk_peri_src", 0, |
451 | RK3288_CLKSEL_CON(10), 12, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, | 454 | RK3288_CLKSEL_CON(10), 12, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, |
452 | RK3288_CLKGATE_CON(2), 3, GFLAGS), | 455 | RK3288_CLKGATE_CON(2), 3, GFLAGS), |
453 | COMPOSITE_NOMUX(HCLK_PERI, "hclk_peri", "aclk_peri_src", 0, | 456 | COMPOSITE_NOMUX(HCLK_PERI, "hclk_peri", "aclk_peri_src", CLK_IGNORE_UNUSED, |
454 | RK3288_CLKSEL_CON(10), 8, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, | 457 | RK3288_CLKSEL_CON(10), 8, 2, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, |
455 | RK3288_CLKGATE_CON(2), 2, GFLAGS), | 458 | RK3288_CLKGATE_CON(2), 2, GFLAGS), |
456 | GATE(ACLK_PERI, "aclk_peri", "aclk_peri_src", 0, | 459 | GATE(ACLK_PERI, "aclk_peri", "aclk_peri_src", CLK_IGNORE_UNUSED, |
457 | RK3288_CLKGATE_CON(2), 1, GFLAGS), | 460 | RK3288_CLKGATE_CON(2), 1, GFLAGS), |
458 | 461 | ||
459 | /* | 462 | /* |
@@ -483,6 +486,18 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
483 | RK3288_CLKSEL_CON(12), 14, 2, MFLAGS, 8, 6, DFLAGS, | 486 | RK3288_CLKSEL_CON(12), 14, 2, MFLAGS, 8, 6, DFLAGS, |
484 | RK3288_CLKGATE_CON(13), 3, GFLAGS), | 487 | RK3288_CLKGATE_CON(13), 3, GFLAGS), |
485 | 488 | ||
489 | MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "sclk_sdmmc", RK3288_SDMMC_CON0, 1), | ||
490 | MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "sclk_sdmmc", RK3288_SDMMC_CON1, 0), | ||
491 | |||
492 | MMC(SCLK_SDIO0_DRV, "sdio0_drv", "sclk_sdio0", RK3288_SDIO0_CON0, 1), | ||
493 | MMC(SCLK_SDIO0_SAMPLE, "sdio0_sample", "sclk_sdio0", RK3288_SDIO0_CON1, 0), | ||
494 | |||
495 | MMC(SCLK_SDIO1_DRV, "sdio1_drv", "sclk_sdio1", RK3288_SDIO1_CON0, 1), | ||
496 | MMC(SCLK_SDIO1_SAMPLE, "sdio1_sample", "sclk_sdio1", RK3288_SDIO1_CON1, 0), | ||
497 | |||
498 | MMC(SCLK_EMMC_DRV, "emmc_drv", "sclk_emmc", RK3288_EMMC_CON0, 1), | ||
499 | MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "sclk_emmc", RK3288_EMMC_CON1, 0), | ||
500 | |||
486 | COMPOSITE(0, "sclk_tspout", mux_tspout_p, 0, | 501 | COMPOSITE(0, "sclk_tspout", mux_tspout_p, 0, |
487 | RK3288_CLKSEL_CON(35), 14, 2, MFLAGS, 8, 5, DFLAGS, | 502 | RK3288_CLKSEL_CON(35), 14, 2, MFLAGS, 8, 5, DFLAGS, |
488 | RK3288_CLKGATE_CON(4), 11, GFLAGS), | 503 | RK3288_CLKGATE_CON(4), 11, GFLAGS), |
@@ -490,13 +505,13 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
490 | RK3288_CLKSEL_CON(35), 6, 2, MFLAGS, 0, 5, DFLAGS, | 505 | RK3288_CLKSEL_CON(35), 6, 2, MFLAGS, 0, 5, DFLAGS, |
491 | RK3288_CLKGATE_CON(4), 10, GFLAGS), | 506 | RK3288_CLKGATE_CON(4), 10, GFLAGS), |
492 | 507 | ||
493 | GATE(SCLK_OTGPHY0, "sclk_otgphy0", "usb480m", 0, | 508 | GATE(SCLK_OTGPHY0, "sclk_otgphy0", "usb480m", CLK_IGNORE_UNUSED, |
494 | RK3288_CLKGATE_CON(13), 4, GFLAGS), | 509 | RK3288_CLKGATE_CON(13), 4, GFLAGS), |
495 | GATE(SCLK_OTGPHY1, "sclk_otgphy1", "usb480m", 0, | 510 | GATE(SCLK_OTGPHY1, "sclk_otgphy1", "usb480m", CLK_IGNORE_UNUSED, |
496 | RK3288_CLKGATE_CON(13), 5, GFLAGS), | 511 | RK3288_CLKGATE_CON(13), 5, GFLAGS), |
497 | GATE(SCLK_OTGPHY2, "sclk_otgphy2", "usb480m", 0, | 512 | GATE(SCLK_OTGPHY2, "sclk_otgphy2", "usb480m", CLK_IGNORE_UNUSED, |
498 | RK3288_CLKGATE_CON(13), 6, GFLAGS), | 513 | RK3288_CLKGATE_CON(13), 6, GFLAGS), |
499 | GATE(SCLK_OTG_ADP, "sclk_otg_adp", "xin32k", 0, | 514 | GATE(SCLK_OTG_ADP, "sclk_otg_adp", "xin32k", CLK_IGNORE_UNUSED, |
500 | RK3288_CLKGATE_CON(13), 7, GFLAGS), | 515 | RK3288_CLKGATE_CON(13), 7, GFLAGS), |
501 | 516 | ||
502 | COMPOSITE_NOMUX(SCLK_TSADC, "sclk_tsadc", "xin32k", 0, | 517 | COMPOSITE_NOMUX(SCLK_TSADC, "sclk_tsadc", "xin32k", 0, |
@@ -517,7 +532,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
517 | RK3288_CLKSEL_CON(38), 15, 1, MFLAGS, 8, 5, DFLAGS, | 532 | RK3288_CLKSEL_CON(38), 15, 1, MFLAGS, 8, 5, DFLAGS, |
518 | RK3288_CLKGATE_CON(5), 6, GFLAGS), | 533 | RK3288_CLKGATE_CON(5), 6, GFLAGS), |
519 | 534 | ||
520 | COMPOSITE(0, "uart0_src", mux_uart0_pll_p, 0, | 535 | COMPOSITE(0, "uart0_src", mux_pll_src_cpll_gll_usb_npll_p, 0, |
521 | RK3288_CLKSEL_CON(13), 13, 2, MFLAGS, 0, 7, DFLAGS, | 536 | RK3288_CLKSEL_CON(13), 13, 2, MFLAGS, 0, 7, DFLAGS, |
522 | RK3288_CLKGATE_CON(1), 8, GFLAGS), | 537 | RK3288_CLKGATE_CON(1), 8, GFLAGS), |
523 | COMPOSITE_FRAC(0, "uart0_frac", "uart0_src", 0, | 538 | COMPOSITE_FRAC(0, "uart0_frac", "uart0_src", 0, |
@@ -585,7 +600,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
585 | 600 | ||
586 | COMPOSITE_NODIV(0, "usbphy480m_src", mux_usbphy480m_p, 0, | 601 | COMPOSITE_NODIV(0, "usbphy480m_src", mux_usbphy480m_p, 0, |
587 | RK3288_CLKSEL_CON(13), 11, 2, MFLAGS, | 602 | RK3288_CLKSEL_CON(13), 11, 2, MFLAGS, |
588 | RK3288_CLKGATE_CON(5), 15, GFLAGS), | 603 | RK3288_CLKGATE_CON(5), 14, GFLAGS), |
589 | COMPOSITE_NODIV(SCLK_HSICPHY480M, "sclk_hsicphy480m", mux_hsicphy480m_p, 0, | 604 | COMPOSITE_NODIV(SCLK_HSICPHY480M, "sclk_hsicphy480m", mux_hsicphy480m_p, 0, |
590 | RK3288_CLKSEL_CON(29), 0, 2, MFLAGS, | 605 | RK3288_CLKSEL_CON(29), 0, 2, MFLAGS, |
591 | RK3288_CLKGATE_CON(3), 6, GFLAGS), | 606 | RK3288_CLKGATE_CON(3), 6, GFLAGS), |
@@ -601,19 +616,19 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
601 | */ | 616 | */ |
602 | 617 | ||
603 | /* aclk_cpu gates */ | 618 | /* aclk_cpu gates */ |
604 | GATE(0, "sclk_intmem0", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 5, GFLAGS), | 619 | GATE(0, "sclk_intmem0", "aclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 5, GFLAGS), |
605 | GATE(0, "sclk_intmem1", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 6, GFLAGS), | 620 | GATE(0, "sclk_intmem1", "aclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 6, GFLAGS), |
606 | GATE(0, "sclk_intmem2", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 7, GFLAGS), | 621 | GATE(0, "sclk_intmem2", "aclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 7, GFLAGS), |
607 | GATE(ACLK_DMAC1, "aclk_dmac1", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 12, GFLAGS), | 622 | GATE(ACLK_DMAC1, "aclk_dmac1", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 12, GFLAGS), |
608 | GATE(0, "aclk_strc_sys", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 13, GFLAGS), | 623 | GATE(0, "aclk_strc_sys", "aclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 13, GFLAGS), |
609 | GATE(0, "aclk_intmem", "aclk_cpu", 0, RK3288_CLKGATE_CON(10), 4, GFLAGS), | 624 | GATE(0, "aclk_intmem", "aclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 4, GFLAGS), |
610 | GATE(ACLK_CRYPTO, "aclk_crypto", "aclk_cpu", 0, RK3288_CLKGATE_CON(11), 6, GFLAGS), | 625 | GATE(ACLK_CRYPTO, "aclk_crypto", "aclk_cpu", 0, RK3288_CLKGATE_CON(11), 6, GFLAGS), |
611 | GATE(0, "aclk_ccp", "aclk_cpu", 0, RK3288_CLKGATE_CON(11), 8, GFLAGS), | 626 | GATE(0, "aclk_ccp", "aclk_cpu", 0, RK3288_CLKGATE_CON(11), 8, GFLAGS), |
612 | 627 | ||
613 | /* hclk_cpu gates */ | 628 | /* hclk_cpu gates */ |
614 | GATE(HCLK_CRYPTO, "hclk_crypto", "hclk_cpu", 0, RK3288_CLKGATE_CON(11), 7, GFLAGS), | 629 | GATE(HCLK_CRYPTO, "hclk_crypto", "hclk_cpu", 0, RK3288_CLKGATE_CON(11), 7, GFLAGS), |
615 | GATE(HCLK_I2S0, "hclk_i2s0", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 8, GFLAGS), | 630 | GATE(HCLK_I2S0, "hclk_i2s0", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 8, GFLAGS), |
616 | GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 9, GFLAGS), | 631 | GATE(HCLK_ROM, "hclk_rom", "hclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(10), 9, GFLAGS), |
617 | GATE(HCLK_SPDIF, "hclk_spdif", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 10, GFLAGS), | 632 | GATE(HCLK_SPDIF, "hclk_spdif", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 10, GFLAGS), |
618 | GATE(HCLK_SPDIF8CH, "hclk_spdif_8ch", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 11, GFLAGS), | 633 | GATE(HCLK_SPDIF8CH, "hclk_spdif_8ch", "hclk_cpu", 0, RK3288_CLKGATE_CON(10), 11, GFLAGS), |
619 | 634 | ||
@@ -622,42 +637,42 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
622 | GATE(PCLK_TIMER, "pclk_timer", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 1, GFLAGS), | 637 | GATE(PCLK_TIMER, "pclk_timer", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 1, GFLAGS), |
623 | GATE(PCLK_I2C0, "pclk_i2c0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 2, GFLAGS), | 638 | GATE(PCLK_I2C0, "pclk_i2c0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 2, GFLAGS), |
624 | GATE(PCLK_I2C2, "pclk_i2c2", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 3, GFLAGS), | 639 | GATE(PCLK_I2C2, "pclk_i2c2", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 3, GFLAGS), |
625 | GATE(0, "pclk_ddrupctl0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 14, GFLAGS), | 640 | GATE(PCLK_DDRUPCTL0, "pclk_ddrupctl0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 14, GFLAGS), |
626 | GATE(0, "pclk_publ0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 15, GFLAGS), | 641 | GATE(PCLK_PUBL0, "pclk_publ0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 15, GFLAGS), |
627 | GATE(0, "pclk_ddrupctl1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 0, GFLAGS), | 642 | GATE(PCLK_DDRUPCTL1, "pclk_ddrupctl1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 0, GFLAGS), |
628 | GATE(0, "pclk_publ1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 1, GFLAGS), | 643 | GATE(PCLK_PUBL1, "pclk_publ1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 1, GFLAGS), |
629 | GATE(0, "pclk_efuse_1024", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 2, GFLAGS), | 644 | GATE(0, "pclk_efuse_1024", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 2, GFLAGS), |
630 | GATE(PCLK_TZPC, "pclk_tzpc", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 3, GFLAGS), | 645 | GATE(PCLK_TZPC, "pclk_tzpc", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 3, GFLAGS), |
631 | GATE(PCLK_UART2, "pclk_uart2", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 9, GFLAGS), | 646 | GATE(PCLK_UART2, "pclk_uart2", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 9, GFLAGS), |
632 | GATE(0, "pclk_efuse_256", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 10, GFLAGS), | 647 | GATE(0, "pclk_efuse_256", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 10, GFLAGS), |
633 | GATE(PCLK_RKPWM, "pclk_rkpwm", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 11, GFLAGS), | 648 | GATE(PCLK_RKPWM, "pclk_rkpwm", "pclk_cpu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(11), 11, GFLAGS), |
634 | 649 | ||
635 | /* ddrctrl [DDR Controller PHY clock] gates */ | 650 | /* ddrctrl [DDR Controller PHY clock] gates */ |
636 | GATE(0, "nclk_ddrupctl0", "ddrphy", 0, RK3288_CLKGATE_CON(11), 4, GFLAGS), | 651 | GATE(0, "nclk_ddrupctl0", "ddrphy", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(11), 4, GFLAGS), |
637 | GATE(0, "nclk_ddrupctl1", "ddrphy", 0, RK3288_CLKGATE_CON(11), 5, GFLAGS), | 652 | GATE(0, "nclk_ddrupctl1", "ddrphy", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(11), 5, GFLAGS), |
638 | 653 | ||
639 | /* ddrphy gates */ | 654 | /* ddrphy gates */ |
640 | GATE(0, "sclk_ddrphy0", "ddrphy", 0, RK3288_CLKGATE_CON(4), 12, GFLAGS), | 655 | GATE(0, "sclk_ddrphy0", "ddrphy", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(4), 12, GFLAGS), |
641 | GATE(0, "sclk_ddrphy1", "ddrphy", 0, RK3288_CLKGATE_CON(4), 13, GFLAGS), | 656 | GATE(0, "sclk_ddrphy1", "ddrphy", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(4), 13, GFLAGS), |
642 | 657 | ||
643 | /* aclk_peri gates */ | 658 | /* aclk_peri gates */ |
644 | GATE(0, "aclk_peri_axi_matrix", "aclk_peri", 0, RK3288_CLKGATE_CON(6), 2, GFLAGS), | 659 | GATE(0, "aclk_peri_axi_matrix", "aclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(6), 2, GFLAGS), |
645 | GATE(ACLK_DMAC2, "aclk_dmac2", "aclk_peri", 0, RK3288_CLKGATE_CON(6), 3, GFLAGS), | 660 | GATE(ACLK_DMAC2, "aclk_dmac2", "aclk_peri", 0, RK3288_CLKGATE_CON(6), 3, GFLAGS), |
646 | GATE(0, "aclk_peri_niu", "aclk_peri", 0, RK3288_CLKGATE_CON(7), 11, GFLAGS), | 661 | GATE(0, "aclk_peri_niu", "aclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 11, GFLAGS), |
647 | GATE(ACLK_MMU, "aclk_mmu", "aclk_peri", 0, RK3288_CLKGATE_CON(8), 12, GFLAGS), | 662 | GATE(ACLK_MMU, "aclk_mmu", "aclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(8), 12, GFLAGS), |
648 | GATE(ACLK_GMAC, "aclk_gmac", "aclk_peri", 0, RK3288_CLKGATE_CON(8), 0, GFLAGS), | 663 | GATE(ACLK_GMAC, "aclk_gmac", "aclk_peri", 0, RK3288_CLKGATE_CON(8), 0, GFLAGS), |
649 | GATE(HCLK_GPS, "hclk_gps", "aclk_peri", 0, RK3288_CLKGATE_CON(8), 2, GFLAGS), | 664 | GATE(HCLK_GPS, "hclk_gps", "aclk_peri", 0, RK3288_CLKGATE_CON(8), 2, GFLAGS), |
650 | 665 | ||
651 | /* hclk_peri gates */ | 666 | /* hclk_peri gates */ |
652 | GATE(0, "hclk_peri_matrix", "hclk_peri", 0, RK3288_CLKGATE_CON(6), 0, GFLAGS), | 667 | GATE(0, "hclk_peri_matrix", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(6), 0, GFLAGS), |
653 | GATE(HCLK_OTG0, "hclk_otg0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 4, GFLAGS), | 668 | GATE(HCLK_OTG0, "hclk_otg0", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 4, GFLAGS), |
654 | GATE(HCLK_USBHOST0, "hclk_host0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 6, GFLAGS), | 669 | GATE(HCLK_USBHOST0, "hclk_host0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 6, GFLAGS), |
655 | GATE(HCLK_USBHOST1, "hclk_host1", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 7, GFLAGS), | 670 | GATE(HCLK_USBHOST1, "hclk_host1", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 7, GFLAGS), |
656 | GATE(HCLK_HSIC, "hclk_hsic", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 8, GFLAGS), | 671 | GATE(HCLK_HSIC, "hclk_hsic", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 8, GFLAGS), |
657 | GATE(0, "hclk_usb_peri", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 9, GFLAGS), | 672 | GATE(0, "hclk_usb_peri", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 9, GFLAGS), |
658 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 10, GFLAGS), | 673 | GATE(0, "hclk_peri_ahb_arbi", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 10, GFLAGS), |
659 | GATE(0, "hclk_emem", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 12, GFLAGS), | 674 | GATE(0, "hclk_emem", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 12, GFLAGS), |
660 | GATE(0, "hclk_mem", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 13, GFLAGS), | 675 | GATE(0, "hclk_mem", "hclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(7), 13, GFLAGS), |
661 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 14, GFLAGS), | 676 | GATE(HCLK_NANDC0, "hclk_nandc0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 14, GFLAGS), |
662 | GATE(HCLK_NANDC1, "hclk_nandc1", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 15, GFLAGS), | 677 | GATE(HCLK_NANDC1, "hclk_nandc1", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 15, GFLAGS), |
663 | GATE(HCLK_TSP, "hclk_tsp", "hclk_peri", 0, RK3288_CLKGATE_CON(8), 8, GFLAGS), | 678 | GATE(HCLK_TSP, "hclk_tsp", "hclk_peri", 0, RK3288_CLKGATE_CON(8), 8, GFLAGS), |
@@ -669,7 +684,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
669 | GATE(0, "pmu_hclk_otg0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 5, GFLAGS), | 684 | GATE(0, "pmu_hclk_otg0", "hclk_peri", 0, RK3288_CLKGATE_CON(7), 5, GFLAGS), |
670 | 685 | ||
671 | /* pclk_peri gates */ | 686 | /* pclk_peri gates */ |
672 | GATE(0, "pclk_peri_matrix", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 1, GFLAGS), | 687 | GATE(0, "pclk_peri_matrix", "pclk_peri", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(6), 1, GFLAGS), |
673 | GATE(PCLK_SPI0, "pclk_spi0", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 4, GFLAGS), | 688 | GATE(PCLK_SPI0, "pclk_spi0", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 4, GFLAGS), |
674 | GATE(PCLK_SPI1, "pclk_spi1", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 5, GFLAGS), | 689 | GATE(PCLK_SPI1, "pclk_spi1", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 5, GFLAGS), |
675 | GATE(PCLK_SPI2, "pclk_spi2", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 6, GFLAGS), | 690 | GATE(PCLK_SPI2, "pclk_spi2", "pclk_peri", 0, RK3288_CLKGATE_CON(6), 6, GFLAGS), |
@@ -705,48 +720,48 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
705 | GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 4, GFLAGS), | 720 | GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 4, GFLAGS), |
706 | GATE(PCLK_GPIO5, "pclk_gpio5", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 5, GFLAGS), | 721 | GATE(PCLK_GPIO5, "pclk_gpio5", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 5, GFLAGS), |
707 | GATE(PCLK_GPIO6, "pclk_gpio6", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 6, GFLAGS), | 722 | GATE(PCLK_GPIO6, "pclk_gpio6", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 6, GFLAGS), |
708 | GATE(PCLK_GRF, "pclk_grf", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 11, GFLAGS), | 723 | GATE(PCLK_GRF, "pclk_grf", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(14), 11, GFLAGS), |
709 | GATE(0, "pclk_alive_niu", "pclk_pd_alive", 0, RK3288_CLKGATE_CON(14), 12, GFLAGS), | 724 | GATE(0, "pclk_alive_niu", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(14), 12, GFLAGS), |
710 | 725 | ||
711 | /* pclk_pd_pmu gates */ | 726 | /* pclk_pd_pmu gates */ |
712 | GATE(PCLK_PMU, "pclk_pmu", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 0, GFLAGS), | 727 | GATE(PCLK_PMU, "pclk_pmu", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(17), 0, GFLAGS), |
713 | GATE(0, "pclk_intmem1", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 1, GFLAGS), | 728 | GATE(0, "pclk_intmem1", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(17), 1, GFLAGS), |
714 | GATE(0, "pclk_pmu_niu", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 2, GFLAGS), | 729 | GATE(0, "pclk_pmu_niu", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(17), 2, GFLAGS), |
715 | GATE(PCLK_SGRF, "pclk_sgrf", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 3, GFLAGS), | 730 | GATE(PCLK_SGRF, "pclk_sgrf", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(17), 3, GFLAGS), |
716 | GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 4, GFLAGS), | 731 | GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pd_pmu", 0, RK3288_CLKGATE_CON(17), 4, GFLAGS), |
717 | 732 | ||
718 | /* hclk_vio gates */ | 733 | /* hclk_vio gates */ |
719 | GATE(HCLK_RGA, "hclk_rga", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 1, GFLAGS), | 734 | GATE(HCLK_RGA, "hclk_rga", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 1, GFLAGS), |
720 | GATE(HCLK_VOP0, "hclk_vop0", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 6, GFLAGS), | 735 | GATE(HCLK_VOP0, "hclk_vop0", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 6, GFLAGS), |
721 | GATE(HCLK_VOP1, "hclk_vop1", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 8, GFLAGS), | 736 | GATE(HCLK_VOP1, "hclk_vop1", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 8, GFLAGS), |
722 | GATE(HCLK_VIO_AHB_ARBI, "hclk_vio_ahb_arbi", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 9, GFLAGS), | 737 | GATE(HCLK_VIO_AHB_ARBI, "hclk_vio_ahb_arbi", "hclk_vio", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(15), 9, GFLAGS), |
723 | GATE(HCLK_VIO_NIU, "hclk_vio_niu", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 10, GFLAGS), | 738 | GATE(HCLK_VIO_NIU, "hclk_vio_niu", "hclk_vio", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(15), 10, GFLAGS), |
724 | GATE(HCLK_VIP, "hclk_vip", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 15, GFLAGS), | 739 | GATE(HCLK_VIP, "hclk_vip", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 15, GFLAGS), |
725 | GATE(HCLK_IEP, "hclk_iep", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 3, GFLAGS), | 740 | GATE(HCLK_IEP, "hclk_iep", "hclk_vio", 0, RK3288_CLKGATE_CON(15), 3, GFLAGS), |
726 | GATE(HCLK_ISP, "hclk_isp", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 1, GFLAGS), | 741 | GATE(HCLK_ISP, "hclk_isp", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 1, GFLAGS), |
727 | GATE(HCLK_VIO2_H2P, "hclk_vio2_h2p", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 10, GFLAGS), | 742 | GATE(HCLK_VIO2_H2P, "hclk_vio2_h2p", "hclk_vio", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(16), 10, GFLAGS), |
728 | GATE(PCLK_MIPI_DSI0, "pclk_mipi_dsi0", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 4, GFLAGS), | 743 | GATE(PCLK_MIPI_DSI0, "pclk_mipi_dsi0", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 4, GFLAGS), |
729 | GATE(PCLK_MIPI_DSI1, "pclk_mipi_dsi1", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 5, GFLAGS), | 744 | GATE(PCLK_MIPI_DSI1, "pclk_mipi_dsi1", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 5, GFLAGS), |
730 | GATE(PCLK_MIPI_CSI, "pclk_mipi_csi", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 6, GFLAGS), | 745 | GATE(PCLK_MIPI_CSI, "pclk_mipi_csi", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 6, GFLAGS), |
731 | GATE(PCLK_LVDS_PHY, "pclk_lvds_phy", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 7, GFLAGS), | 746 | GATE(PCLK_LVDS_PHY, "pclk_lvds_phy", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 7, GFLAGS), |
732 | GATE(PCLK_EDP_CTRL, "pclk_edp_ctrl", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 8, GFLAGS), | 747 | GATE(PCLK_EDP_CTRL, "pclk_edp_ctrl", "hclk_vio", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(16), 8, GFLAGS), |
733 | GATE(PCLK_HDMI_CTRL, "pclk_hdmi_ctrl", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 9, GFLAGS), | 748 | GATE(PCLK_HDMI_CTRL, "pclk_hdmi_ctrl", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 9, GFLAGS), |
734 | GATE(PCLK_VIO2_H2P, "pclk_vio2_h2p", "hclk_vio", 0, RK3288_CLKGATE_CON(16), 11, GFLAGS), | 749 | GATE(PCLK_VIO2_H2P, "pclk_vio2_h2p", "hclk_vio", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(16), 11, GFLAGS), |
735 | 750 | ||
736 | /* aclk_vio0 gates */ | 751 | /* aclk_vio0 gates */ |
737 | GATE(ACLK_VOP0, "aclk_vop0", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 5, GFLAGS), | 752 | GATE(ACLK_VOP0, "aclk_vop0", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 5, GFLAGS), |
738 | GATE(ACLK_IEP, "aclk_iep", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 2, GFLAGS), | 753 | GATE(ACLK_IEP, "aclk_iep", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 2, GFLAGS), |
739 | GATE(ACLK_VIO0_NIU, "aclk_vio0_niu", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 11, GFLAGS), | 754 | GATE(ACLK_VIO0_NIU, "aclk_vio0_niu", "aclk_vio0", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(15), 11, GFLAGS), |
740 | GATE(ACLK_VIP, "aclk_vip", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 14, GFLAGS), | 755 | GATE(ACLK_VIP, "aclk_vip", "aclk_vio0", 0, RK3288_CLKGATE_CON(15), 14, GFLAGS), |
741 | 756 | ||
742 | /* aclk_vio1 gates */ | 757 | /* aclk_vio1 gates */ |
743 | GATE(ACLK_VOP1, "aclk_vop1", "aclk_vio1", 0, RK3288_CLKGATE_CON(15), 7, GFLAGS), | 758 | GATE(ACLK_VOP1, "aclk_vop1", "aclk_vio1", 0, RK3288_CLKGATE_CON(15), 7, GFLAGS), |
744 | GATE(ACLK_ISP, "aclk_isp", "aclk_vio1", 0, RK3288_CLKGATE_CON(16), 2, GFLAGS), | 759 | GATE(ACLK_ISP, "aclk_isp", "aclk_vio1", 0, RK3288_CLKGATE_CON(16), 2, GFLAGS), |
745 | GATE(ACLK_VIO1_NIU, "aclk_vio1_niu", "aclk_vio1", 0, RK3288_CLKGATE_CON(15), 12, GFLAGS), | 760 | GATE(ACLK_VIO1_NIU, "aclk_vio1_niu", "aclk_vio1", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(15), 12, GFLAGS), |
746 | 761 | ||
747 | /* aclk_rga_pre gates */ | 762 | /* aclk_rga_pre gates */ |
748 | GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", 0, RK3288_CLKGATE_CON(15), 0, GFLAGS), | 763 | GATE(ACLK_RGA, "aclk_rga", "aclk_rga_pre", 0, RK3288_CLKGATE_CON(15), 0, GFLAGS), |
749 | GATE(ACLK_RGA_NIU, "aclk_rga_niu", "aclk_rga_pre", 0, RK3288_CLKGATE_CON(15), 13, GFLAGS), | 764 | GATE(ACLK_RGA_NIU, "aclk_rga_niu", "aclk_rga_pre", CLK_IGNORE_UNUSED, RK3288_CLKGATE_CON(15), 13, GFLAGS), |
750 | 765 | ||
751 | /* | 766 | /* |
752 | * Other ungrouped clocks. | 767 | * Other ungrouped clocks. |
@@ -762,6 +777,64 @@ static const char *rk3288_critical_clocks[] __initconst = { | |||
762 | "hclk_peri", | 777 | "hclk_peri", |
763 | }; | 778 | }; |
764 | 779 | ||
780 | #ifdef CONFIG_PM_SLEEP | ||
781 | static void __iomem *rk3288_cru_base; | ||
782 | |||
783 | /* Some CRU registers will be reset in maskrom when the system | ||
784 | * wakes up from fastboot. | ||
785 | * So save them before suspend, restore them after resume. | ||
786 | */ | ||
787 | static const int rk3288_saved_cru_reg_ids[] = { | ||
788 | RK3288_MODE_CON, | ||
789 | RK3288_CLKSEL_CON(0), | ||
790 | RK3288_CLKSEL_CON(1), | ||
791 | RK3288_CLKSEL_CON(10), | ||
792 | RK3288_CLKSEL_CON(33), | ||
793 | RK3288_CLKSEL_CON(37), | ||
794 | }; | ||
795 | |||
796 | static u32 rk3288_saved_cru_regs[ARRAY_SIZE(rk3288_saved_cru_reg_ids)]; | ||
797 | |||
798 | static int rk3288_clk_suspend(void) | ||
799 | { | ||
800 | int i, reg_id; | ||
801 | |||
802 | for (i = 0; i < ARRAY_SIZE(rk3288_saved_cru_reg_ids); i++) { | ||
803 | reg_id = rk3288_saved_cru_reg_ids[i]; | ||
804 | |||
805 | rk3288_saved_cru_regs[i] = | ||
806 | readl_relaxed(rk3288_cru_base + reg_id); | ||
807 | } | ||
808 | return 0; | ||
809 | } | ||
810 | |||
811 | static void rk3288_clk_resume(void) | ||
812 | { | ||
813 | int i, reg_id; | ||
814 | |||
815 | for (i = ARRAY_SIZE(rk3288_saved_cru_reg_ids) - 1; i >= 0; i--) { | ||
816 | reg_id = rk3288_saved_cru_reg_ids[i]; | ||
817 | |||
818 | writel_relaxed(rk3288_saved_cru_regs[i] | 0xffff0000, | ||
819 | rk3288_cru_base + reg_id); | ||
820 | } | ||
821 | } | ||
822 | |||
823 | static struct syscore_ops rk3288_clk_syscore_ops = { | ||
824 | .suspend = rk3288_clk_suspend, | ||
825 | .resume = rk3288_clk_resume, | ||
826 | }; | ||
827 | |||
828 | static void rk3288_clk_sleep_init(void __iomem *reg_base) | ||
829 | { | ||
830 | rk3288_cru_base = reg_base; | ||
831 | register_syscore_ops(&rk3288_clk_syscore_ops); | ||
832 | } | ||
833 | |||
834 | #else /* CONFIG_PM_SLEEP */ | ||
835 | static void rk3288_clk_sleep_init(void __iomem *reg_base) {} | ||
836 | #endif | ||
837 | |||
765 | static void __init rk3288_clk_init(struct device_node *np) | 838 | static void __init rk3288_clk_init(struct device_node *np) |
766 | { | 839 | { |
767 | void __iomem *reg_base; | 840 | void __iomem *reg_base; |
@@ -810,5 +883,6 @@ static void __init rk3288_clk_init(struct device_node *np) | |||
810 | ROCKCHIP_SOFTRST_HIWORD_MASK); | 883 | ROCKCHIP_SOFTRST_HIWORD_MASK); |
811 | 884 | ||
812 | rockchip_register_restart_notifier(RK3288_GLB_SRST_FST); | 885 | rockchip_register_restart_notifier(RK3288_GLB_SRST_FST); |
886 | rk3288_clk_sleep_init(reg_base); | ||
813 | } | 887 | } |
814 | CLK_OF_DECLARE(rk3288_cru, "rockchip,rk3288-cru", rk3288_clk_init); | 888 | CLK_OF_DECLARE(rk3288_cru, "rockchip,rk3288-cru", rk3288_clk_init); |
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c index 880a266f0143..20e05bbb3a67 100644 --- a/drivers/clk/rockchip/clk.c +++ b/drivers/clk/rockchip/clk.c | |||
@@ -197,7 +197,8 @@ void __init rockchip_clk_register_plls(struct rockchip_pll_clock *list, | |||
197 | list->parent_names, list->num_parents, | 197 | list->parent_names, list->num_parents, |
198 | reg_base, list->con_offset, grf_lock_offset, | 198 | reg_base, list->con_offset, grf_lock_offset, |
199 | list->lock_shift, list->mode_offset, | 199 | list->lock_shift, list->mode_offset, |
200 | list->mode_shift, list->rate_table, &clk_lock); | 200 | list->mode_shift, list->rate_table, |
201 | list->pll_flags, &clk_lock); | ||
201 | if (IS_ERR(clk)) { | 202 | if (IS_ERR(clk)) { |
202 | pr_err("%s: failed to register clock %s\n", __func__, | 203 | pr_err("%s: failed to register clock %s\n", __func__, |
203 | list->name); | 204 | list->name); |
@@ -244,9 +245,6 @@ void __init rockchip_clk_register_branches( | |||
244 | list->div_flags, &clk_lock); | 245 | list->div_flags, &clk_lock); |
245 | break; | 246 | break; |
246 | case branch_fraction_divider: | 247 | case branch_fraction_divider: |
247 | /* keep all gates untouched for now */ | ||
248 | flags |= CLK_IGNORE_UNUSED; | ||
249 | |||
250 | clk = rockchip_clk_register_frac_branch(list->name, | 248 | clk = rockchip_clk_register_frac_branch(list->name, |
251 | list->parent_names, list->num_parents, | 249 | list->parent_names, list->num_parents, |
252 | reg_base, list->muxdiv_offset, list->div_flags, | 250 | reg_base, list->muxdiv_offset, list->div_flags, |
@@ -256,18 +254,12 @@ void __init rockchip_clk_register_branches( | |||
256 | case branch_gate: | 254 | case branch_gate: |
257 | flags |= CLK_SET_RATE_PARENT; | 255 | flags |= CLK_SET_RATE_PARENT; |
258 | 256 | ||
259 | /* keep all gates untouched for now */ | ||
260 | flags |= CLK_IGNORE_UNUSED; | ||
261 | |||
262 | clk = clk_register_gate(NULL, list->name, | 257 | clk = clk_register_gate(NULL, list->name, |
263 | list->parent_names[0], flags, | 258 | list->parent_names[0], flags, |
264 | reg_base + list->gate_offset, | 259 | reg_base + list->gate_offset, |
265 | list->gate_shift, list->gate_flags, &clk_lock); | 260 | list->gate_shift, list->gate_flags, &clk_lock); |
266 | break; | 261 | break; |
267 | case branch_composite: | 262 | case branch_composite: |
268 | /* keep all gates untouched for now */ | ||
269 | flags |= CLK_IGNORE_UNUSED; | ||
270 | |||
271 | clk = rockchip_clk_register_branch(list->name, | 263 | clk = rockchip_clk_register_branch(list->name, |
272 | list->parent_names, list->num_parents, | 264 | list->parent_names, list->num_parents, |
273 | reg_base, list->muxdiv_offset, list->mux_shift, | 265 | reg_base, list->muxdiv_offset, list->mux_shift, |
@@ -277,6 +269,14 @@ void __init rockchip_clk_register_branches( | |||
277 | list->gate_offset, list->gate_shift, | 269 | list->gate_offset, list->gate_shift, |
278 | list->gate_flags, flags, &clk_lock); | 270 | list->gate_flags, flags, &clk_lock); |
279 | break; | 271 | break; |
272 | case branch_mmc: | ||
273 | clk = rockchip_clk_register_mmc( | ||
274 | list->name, | ||
275 | list->parent_names, list->num_parents, | ||
276 | reg_base + list->muxdiv_offset, | ||
277 | list->div_shift | ||
278 | ); | ||
279 | break; | ||
280 | } | 280 | } |
281 | 281 | ||
282 | /* none of the cases above matched */ | 282 | /* none of the cases above matched */ |
diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h index ca009ab0a33a..58d2e3bdf22f 100644 --- a/drivers/clk/rockchip/clk.h +++ b/drivers/clk/rockchip/clk.h | |||
@@ -48,6 +48,14 @@ | |||
48 | #define RK3288_GLB_SRST_SND 0x1b4 | 48 | #define RK3288_GLB_SRST_SND 0x1b4 |
49 | #define RK3288_SOFTRST_CON(x) (x * 0x4 + 0x1b8) | 49 | #define RK3288_SOFTRST_CON(x) (x * 0x4 + 0x1b8) |
50 | #define RK3288_MISC_CON 0x1e8 | 50 | #define RK3288_MISC_CON 0x1e8 |
51 | #define RK3288_SDMMC_CON0 0x200 | ||
52 | #define RK3288_SDMMC_CON1 0x204 | ||
53 | #define RK3288_SDIO0_CON0 0x208 | ||
54 | #define RK3288_SDIO0_CON1 0x20c | ||
55 | #define RK3288_SDIO1_CON0 0x210 | ||
56 | #define RK3288_SDIO1_CON1 0x214 | ||
57 | #define RK3288_EMMC_CON0 0x218 | ||
58 | #define RK3288_EMMC_CON1 0x21c | ||
51 | 59 | ||
52 | enum rockchip_pll_type { | 60 | enum rockchip_pll_type { |
53 | pll_rk3066, | 61 | pll_rk3066, |
@@ -62,6 +70,15 @@ enum rockchip_pll_type { | |||
62 | .bwadj = (_nf >> 1), \ | 70 | .bwadj = (_nf >> 1), \ |
63 | } | 71 | } |
64 | 72 | ||
73 | #define RK3066_PLL_RATE_BWADJ(_rate, _nr, _nf, _no, _bw) \ | ||
74 | { \ | ||
75 | .rate = _rate##U, \ | ||
76 | .nr = _nr, \ | ||
77 | .nf = _nf, \ | ||
78 | .no = _no, \ | ||
79 | .bwadj = _bw, \ | ||
80 | } | ||
81 | |||
65 | struct rockchip_pll_rate_table { | 82 | struct rockchip_pll_rate_table { |
66 | unsigned long rate; | 83 | unsigned long rate; |
67 | unsigned int nr; | 84 | unsigned int nr; |
@@ -81,7 +98,12 @@ struct rockchip_pll_rate_table { | |||
81 | * @mode_shift: offset inside the mode-register for the mode of this pll. | 98 | * @mode_shift: offset inside the mode-register for the mode of this pll. |
82 | * @lock_shift: offset inside the lock register for the lock status. | 99 | * @lock_shift: offset inside the lock register for the lock status. |
83 | * @type: Type of PLL to be registered. | 100 | * @type: Type of PLL to be registered. |
101 | * @pll_flags: hardware-specific flags | ||
84 | * @rate_table: Table of usable pll rates | 102 | * @rate_table: Table of usable pll rates |
103 | * | ||
104 | * Flags: | ||
105 | * ROCKCHIP_PLL_SYNC_RATE - check rate parameters to match against the | ||
106 | * rate_table parameters and ajust them if necessary. | ||
85 | */ | 107 | */ |
86 | struct rockchip_pll_clock { | 108 | struct rockchip_pll_clock { |
87 | unsigned int id; | 109 | unsigned int id; |
@@ -94,11 +116,14 @@ struct rockchip_pll_clock { | |||
94 | int mode_shift; | 116 | int mode_shift; |
95 | int lock_shift; | 117 | int lock_shift; |
96 | enum rockchip_pll_type type; | 118 | enum rockchip_pll_type type; |
119 | u8 pll_flags; | ||
97 | struct rockchip_pll_rate_table *rate_table; | 120 | struct rockchip_pll_rate_table *rate_table; |
98 | }; | 121 | }; |
99 | 122 | ||
123 | #define ROCKCHIP_PLL_SYNC_RATE BIT(0) | ||
124 | |||
100 | #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \ | 125 | #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \ |
101 | _lshift, _rtable) \ | 126 | _lshift, _pflags, _rtable) \ |
102 | { \ | 127 | { \ |
103 | .id = _id, \ | 128 | .id = _id, \ |
104 | .type = _type, \ | 129 | .type = _type, \ |
@@ -110,6 +135,7 @@ struct rockchip_pll_clock { | |||
110 | .mode_offset = _mode, \ | 135 | .mode_offset = _mode, \ |
111 | .mode_shift = _mshift, \ | 136 | .mode_shift = _mshift, \ |
112 | .lock_shift = _lshift, \ | 137 | .lock_shift = _lshift, \ |
138 | .pll_flags = _pflags, \ | ||
113 | .rate_table = _rtable, \ | 139 | .rate_table = _rtable, \ |
114 | } | 140 | } |
115 | 141 | ||
@@ -118,7 +144,7 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
118 | void __iomem *base, int con_offset, int grf_lock_offset, | 144 | void __iomem *base, int con_offset, int grf_lock_offset, |
119 | int lock_shift, int reg_mode, int mode_shift, | 145 | int lock_shift, int reg_mode, int mode_shift, |
120 | struct rockchip_pll_rate_table *rate_table, | 146 | struct rockchip_pll_rate_table *rate_table, |
121 | spinlock_t *lock); | 147 | u8 clk_pll_flags, spinlock_t *lock); |
122 | 148 | ||
123 | struct rockchip_cpuclk_clksel { | 149 | struct rockchip_cpuclk_clksel { |
124 | int reg; | 150 | int reg; |
@@ -152,6 +178,10 @@ struct clk *rockchip_clk_register_cpuclk(const char *name, | |||
152 | const struct rockchip_cpuclk_rate_table *rates, | 178 | const struct rockchip_cpuclk_rate_table *rates, |
153 | int nrates, void __iomem *reg_base, spinlock_t *lock); | 179 | int nrates, void __iomem *reg_base, spinlock_t *lock); |
154 | 180 | ||
181 | struct clk *rockchip_clk_register_mmc(const char *name, | ||
182 | const char **parent_names, u8 num_parents, | ||
183 | void __iomem *reg, int shift); | ||
184 | |||
155 | #define PNAME(x) static const char *x[] __initconst | 185 | #define PNAME(x) static const char *x[] __initconst |
156 | 186 | ||
157 | enum rockchip_clk_branch_type { | 187 | enum rockchip_clk_branch_type { |
@@ -160,6 +190,7 @@ enum rockchip_clk_branch_type { | |||
160 | branch_divider, | 190 | branch_divider, |
161 | branch_fraction_divider, | 191 | branch_fraction_divider, |
162 | branch_gate, | 192 | branch_gate, |
193 | branch_mmc, | ||
163 | }; | 194 | }; |
164 | 195 | ||
165 | struct rockchip_clk_branch { | 196 | struct rockchip_clk_branch { |
@@ -352,6 +383,16 @@ struct rockchip_clk_branch { | |||
352 | .gate_flags = gf, \ | 383 | .gate_flags = gf, \ |
353 | } | 384 | } |
354 | 385 | ||
386 | #define MMC(_id, cname, pname, offset, shift) \ | ||
387 | { \ | ||
388 | .id = _id, \ | ||
389 | .branch_type = branch_mmc, \ | ||
390 | .name = cname, \ | ||
391 | .parent_names = (const char *[]){ pname }, \ | ||
392 | .num_parents = 1, \ | ||
393 | .muxdiv_offset = offset, \ | ||
394 | .div_shift = shift, \ | ||
395 | } | ||
355 | 396 | ||
356 | void rockchip_clk_init(struct device_node *np, void __iomem *base, | 397 | void rockchip_clk_init(struct device_node *np, void __iomem *base, |
357 | unsigned long nr_clks); | 398 | unsigned long nr_clks); |
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile index 6fb4bc602e8a..006c6f294310 100644 --- a/drivers/clk/samsung/Makefile +++ b/drivers/clk/samsung/Makefile | |||
@@ -5,6 +5,7 @@ | |||
5 | obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o | 5 | obj-$(CONFIG_COMMON_CLK) += clk.o clk-pll.o |
6 | obj-$(CONFIG_SOC_EXYNOS3250) += clk-exynos3250.o | 6 | obj-$(CONFIG_SOC_EXYNOS3250) += clk-exynos3250.o |
7 | obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o | 7 | obj-$(CONFIG_ARCH_EXYNOS4) += clk-exynos4.o |
8 | obj-$(CONFIG_SOC_EXYNOS4415) += clk-exynos4415.o | ||
8 | obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o | 9 | obj-$(CONFIG_SOC_EXYNOS5250) += clk-exynos5250.o |
9 | obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o | 10 | obj-$(CONFIG_SOC_EXYNOS5260) += clk-exynos5260.o |
10 | obj-$(CONFIG_SOC_EXYNOS5410) += clk-exynos5410.o | 11 | obj-$(CONFIG_SOC_EXYNOS5410) += clk-exynos5410.o |
@@ -12,6 +13,7 @@ obj-$(CONFIG_SOC_EXYNOS5420) += clk-exynos5420.o | |||
12 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o | 13 | obj-$(CONFIG_SOC_EXYNOS5440) += clk-exynos5440.o |
13 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o | 14 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-audss.o |
14 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-clkout.o | 15 | obj-$(CONFIG_ARCH_EXYNOS) += clk-exynos-clkout.o |
16 | obj-$(CONFIG_ARCH_EXYNOS7) += clk-exynos7.o | ||
15 | obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o | 17 | obj-$(CONFIG_S3C2410_COMMON_CLK)+= clk-s3c2410.o |
16 | obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o | 18 | obj-$(CONFIG_S3C2410_COMMON_DCLK)+= clk-s3c2410-dclk.o |
17 | obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o | 19 | obj-$(CONFIG_S3C2412_COMMON_CLK)+= clk-s3c2412.o |
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c index acce708ace18..f2c2ccce49bb 100644 --- a/drivers/clk/samsung/clk-exynos-audss.c +++ b/drivers/clk/samsung/clk-exynos-audss.c | |||
@@ -29,6 +29,13 @@ static DEFINE_SPINLOCK(lock); | |||
29 | static struct clk **clk_table; | 29 | static struct clk **clk_table; |
30 | static void __iomem *reg_base; | 30 | static void __iomem *reg_base; |
31 | static struct clk_onecell_data clk_data; | 31 | static struct clk_onecell_data clk_data; |
32 | /* | ||
33 | * On Exynos5420 this will be a clock which has to be enabled before any | ||
34 | * access to audss registers. Typically a child of EPLL. | ||
35 | * | ||
36 | * On other platforms this will be -ENODEV. | ||
37 | */ | ||
38 | static struct clk *epll; | ||
32 | 39 | ||
33 | #define ASS_CLK_SRC 0x0 | 40 | #define ASS_CLK_SRC 0x0 |
34 | #define ASS_CLK_DIV 0x4 | 41 | #define ASS_CLK_DIV 0x4 |
@@ -98,6 +105,8 @@ static int exynos_audss_clk_probe(struct platform_device *pdev) | |||
98 | dev_err(&pdev->dev, "failed to map audss registers\n"); | 105 | dev_err(&pdev->dev, "failed to map audss registers\n"); |
99 | return PTR_ERR(reg_base); | 106 | return PTR_ERR(reg_base); |
100 | } | 107 | } |
108 | /* EPLL don't have to be enabled for boards other than Exynos5420 */ | ||
109 | epll = ERR_PTR(-ENODEV); | ||
101 | 110 | ||
102 | clk_table = devm_kzalloc(&pdev->dev, | 111 | clk_table = devm_kzalloc(&pdev->dev, |
103 | sizeof(struct clk *) * EXYNOS_AUDSS_MAX_CLKS, | 112 | sizeof(struct clk *) * EXYNOS_AUDSS_MAX_CLKS, |
@@ -115,8 +124,20 @@ static int exynos_audss_clk_probe(struct platform_device *pdev) | |||
115 | pll_in = devm_clk_get(&pdev->dev, "pll_in"); | 124 | pll_in = devm_clk_get(&pdev->dev, "pll_in"); |
116 | if (!IS_ERR(pll_ref)) | 125 | if (!IS_ERR(pll_ref)) |
117 | mout_audss_p[0] = __clk_get_name(pll_ref); | 126 | mout_audss_p[0] = __clk_get_name(pll_ref); |
118 | if (!IS_ERR(pll_in)) | 127 | if (!IS_ERR(pll_in)) { |
119 | mout_audss_p[1] = __clk_get_name(pll_in); | 128 | mout_audss_p[1] = __clk_get_name(pll_in); |
129 | |||
130 | if (variant == TYPE_EXYNOS5420) { | ||
131 | epll = pll_in; | ||
132 | |||
133 | ret = clk_prepare_enable(epll); | ||
134 | if (ret) { | ||
135 | dev_err(&pdev->dev, | ||
136 | "failed to prepare the epll clock\n"); | ||
137 | return ret; | ||
138 | } | ||
139 | } | ||
140 | } | ||
120 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", | 141 | clk_table[EXYNOS_MOUT_AUDSS] = clk_register_mux(NULL, "mout_audss", |
121 | mout_audss_p, ARRAY_SIZE(mout_audss_p), | 142 | mout_audss_p, ARRAY_SIZE(mout_audss_p), |
122 | CLK_SET_RATE_NO_REPARENT, | 143 | CLK_SET_RATE_NO_REPARENT, |
@@ -203,6 +224,9 @@ unregister: | |||
203 | clk_unregister(clk_table[i]); | 224 | clk_unregister(clk_table[i]); |
204 | } | 225 | } |
205 | 226 | ||
227 | if (!IS_ERR(epll)) | ||
228 | clk_disable_unprepare(epll); | ||
229 | |||
206 | return ret; | 230 | return ret; |
207 | } | 231 | } |
208 | 232 | ||
@@ -210,6 +234,10 @@ static int exynos_audss_clk_remove(struct platform_device *pdev) | |||
210 | { | 234 | { |
211 | int i; | 235 | int i; |
212 | 236 | ||
237 | #ifdef CONFIG_PM_SLEEP | ||
238 | unregister_syscore_ops(&exynos_audss_clk_syscore_ops); | ||
239 | #endif | ||
240 | |||
213 | of_clk_del_provider(pdev->dev.of_node); | 241 | of_clk_del_provider(pdev->dev.of_node); |
214 | 242 | ||
215 | for (i = 0; i < clk_data.clk_num; i++) { | 243 | for (i = 0; i < clk_data.clk_num; i++) { |
@@ -217,6 +245,9 @@ static int exynos_audss_clk_remove(struct platform_device *pdev) | |||
217 | clk_unregister(clk_table[i]); | 245 | clk_unregister(clk_table[i]); |
218 | } | 246 | } |
219 | 247 | ||
248 | if (!IS_ERR(epll)) | ||
249 | clk_disable_unprepare(epll); | ||
250 | |||
220 | return 0; | 251 | return 0; |
221 | } | 252 | } |
222 | 253 | ||
diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c index 940f02837b82..88e8c6bbd77f 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c | |||
@@ -505,7 +505,7 @@ static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata | |||
505 | /* fixed rate clocks generated inside the soc */ | 505 | /* fixed rate clocks generated inside the soc */ |
506 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { | 506 | static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = { |
507 | FRATE(0, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), | 507 | FRATE(0, "sclk_hdmi24m", NULL, CLK_IS_ROOT, 24000000), |
508 | FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), | 508 | FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", "hdmi", 0, 27000000), |
509 | FRATE(0, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), | 509 | FRATE(0, "sclk_usbphy0", NULL, CLK_IS_ROOT, 48000000), |
510 | }; | 510 | }; |
511 | 511 | ||
diff --git a/drivers/clk/samsung/clk-exynos4415.c b/drivers/clk/samsung/clk-exynos4415.c new file mode 100644 index 000000000000..2123fc251e0f --- /dev/null +++ b/drivers/clk/samsung/clk-exynos4415.c | |||
@@ -0,0 +1,1144 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Samsung Electronics Co., Ltd. | ||
3 | * Author: Chanwoo Choi <cw00.choi@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * Common Clock Framework support for Exynos4415 SoC. | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk.h> | ||
13 | #include <linux/clkdev.h> | ||
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/of.h> | ||
16 | #include <linux/of_address.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/syscore_ops.h> | ||
19 | |||
20 | #include <dt-bindings/clock/exynos4415.h> | ||
21 | |||
22 | #include "clk.h" | ||
23 | #include "clk-pll.h" | ||
24 | |||
25 | #define SRC_LEFTBUS 0x4200 | ||
26 | #define DIV_LEFTBUS 0x4500 | ||
27 | #define GATE_IP_LEFTBUS 0x4800 | ||
28 | #define GATE_IP_IMAGE 0x4930 | ||
29 | #define SRC_RIGHTBUS 0x8200 | ||
30 | #define DIV_RIGHTBUS 0x8500 | ||
31 | #define GATE_IP_RIGHTBUS 0x8800 | ||
32 | #define GATE_IP_PERIR 0x8960 | ||
33 | #define EPLL_LOCK 0xc010 | ||
34 | #define G3D_PLL_LOCK 0xc020 | ||
35 | #define DISP_PLL_LOCK 0xc030 | ||
36 | #define ISP_PLL_LOCK 0xc040 | ||
37 | #define EPLL_CON0 0xc110 | ||
38 | #define EPLL_CON1 0xc114 | ||
39 | #define EPLL_CON2 0xc118 | ||
40 | #define G3D_PLL_CON0 0xc120 | ||
41 | #define G3D_PLL_CON1 0xc124 | ||
42 | #define G3D_PLL_CON2 0xc128 | ||
43 | #define ISP_PLL_CON0 0xc130 | ||
44 | #define ISP_PLL_CON1 0xc134 | ||
45 | #define ISP_PLL_CON2 0xc138 | ||
46 | #define DISP_PLL_CON0 0xc140 | ||
47 | #define DISP_PLL_CON1 0xc144 | ||
48 | #define DISP_PLL_CON2 0xc148 | ||
49 | #define SRC_TOP0 0xc210 | ||
50 | #define SRC_TOP1 0xc214 | ||
51 | #define SRC_CAM 0xc220 | ||
52 | #define SRC_TV 0xc224 | ||
53 | #define SRC_MFC 0xc228 | ||
54 | #define SRC_G3D 0xc22c | ||
55 | #define SRC_LCD 0xc234 | ||
56 | #define SRC_ISP 0xc238 | ||
57 | #define SRC_MAUDIO 0xc23c | ||
58 | #define SRC_FSYS 0xc240 | ||
59 | #define SRC_PERIL0 0xc250 | ||
60 | #define SRC_PERIL1 0xc254 | ||
61 | #define SRC_CAM1 0xc258 | ||
62 | #define SRC_TOP_ISP0 0xc25c | ||
63 | #define SRC_TOP_ISP1 0xc260 | ||
64 | #define SRC_MASK_TOP 0xc310 | ||
65 | #define SRC_MASK_CAM 0xc320 | ||
66 | #define SRC_MASK_TV 0xc324 | ||
67 | #define SRC_MASK_LCD 0xc334 | ||
68 | #define SRC_MASK_ISP 0xc338 | ||
69 | #define SRC_MASK_MAUDIO 0xc33c | ||
70 | #define SRC_MASK_FSYS 0xc340 | ||
71 | #define SRC_MASK_PERIL0 0xc350 | ||
72 | #define SRC_MASK_PERIL1 0xc354 | ||
73 | #define DIV_TOP 0xc510 | ||
74 | #define DIV_CAM 0xc520 | ||
75 | #define DIV_TV 0xc524 | ||
76 | #define DIV_MFC 0xc528 | ||
77 | #define DIV_G3D 0xc52c | ||
78 | #define DIV_LCD 0xc534 | ||
79 | #define DIV_ISP 0xc538 | ||
80 | #define DIV_MAUDIO 0xc53c | ||
81 | #define DIV_FSYS0 0xc540 | ||
82 | #define DIV_FSYS1 0xc544 | ||
83 | #define DIV_FSYS2 0xc548 | ||
84 | #define DIV_PERIL0 0xc550 | ||
85 | #define DIV_PERIL1 0xc554 | ||
86 | #define DIV_PERIL2 0xc558 | ||
87 | #define DIV_PERIL3 0xc55c | ||
88 | #define DIV_PERIL4 0xc560 | ||
89 | #define DIV_PERIL5 0xc564 | ||
90 | #define DIV_CAM1 0xc568 | ||
91 | #define DIV_TOP_ISP1 0xc56c | ||
92 | #define DIV_TOP_ISP0 0xc570 | ||
93 | #define CLKDIV2_RATIO 0xc580 | ||
94 | #define GATE_SCLK_CAM 0xc820 | ||
95 | #define GATE_SCLK_TV 0xc824 | ||
96 | #define GATE_SCLK_MFC 0xc828 | ||
97 | #define GATE_SCLK_G3D 0xc82c | ||
98 | #define GATE_SCLK_LCD 0xc834 | ||
99 | #define GATE_SCLK_MAUDIO 0xc83c | ||
100 | #define GATE_SCLK_FSYS 0xc840 | ||
101 | #define GATE_SCLK_PERIL 0xc850 | ||
102 | #define GATE_IP_CAM 0xc920 | ||
103 | #define GATE_IP_TV 0xc924 | ||
104 | #define GATE_IP_MFC 0xc928 | ||
105 | #define GATE_IP_G3D 0xc92c | ||
106 | #define GATE_IP_LCD 0xc934 | ||
107 | #define GATE_IP_FSYS 0xc940 | ||
108 | #define GATE_IP_PERIL 0xc950 | ||
109 | #define GATE_BLOCK 0xc970 | ||
110 | #define APLL_LOCK 0x14000 | ||
111 | #define APLL_CON0 0x14100 | ||
112 | #define SRC_CPU 0x14200 | ||
113 | #define DIV_CPU0 0x14500 | ||
114 | #define DIV_CPU1 0x14504 | ||
115 | |||
116 | enum exynos4415_plls { | ||
117 | apll, epll, g3d_pll, isp_pll, disp_pll, | ||
118 | nr_plls, | ||
119 | }; | ||
120 | |||
121 | static struct samsung_clk_provider *exynos4415_ctx; | ||
122 | |||
123 | /* | ||
124 | * Support for CMU save/restore across system suspends | ||
125 | */ | ||
126 | #ifdef CONFIG_PM_SLEEP | ||
127 | static struct samsung_clk_reg_dump *exynos4415_clk_regs; | ||
128 | |||
129 | static unsigned long exynos4415_cmu_clk_regs[] __initdata = { | ||
130 | SRC_LEFTBUS, | ||
131 | DIV_LEFTBUS, | ||
132 | GATE_IP_LEFTBUS, | ||
133 | GATE_IP_IMAGE, | ||
134 | SRC_RIGHTBUS, | ||
135 | DIV_RIGHTBUS, | ||
136 | GATE_IP_RIGHTBUS, | ||
137 | GATE_IP_PERIR, | ||
138 | EPLL_LOCK, | ||
139 | G3D_PLL_LOCK, | ||
140 | DISP_PLL_LOCK, | ||
141 | ISP_PLL_LOCK, | ||
142 | EPLL_CON0, | ||
143 | EPLL_CON1, | ||
144 | EPLL_CON2, | ||
145 | G3D_PLL_CON0, | ||
146 | G3D_PLL_CON1, | ||
147 | G3D_PLL_CON2, | ||
148 | ISP_PLL_CON0, | ||
149 | ISP_PLL_CON1, | ||
150 | ISP_PLL_CON2, | ||
151 | DISP_PLL_CON0, | ||
152 | DISP_PLL_CON1, | ||
153 | DISP_PLL_CON2, | ||
154 | SRC_TOP0, | ||
155 | SRC_TOP1, | ||
156 | SRC_CAM, | ||
157 | SRC_TV, | ||
158 | SRC_MFC, | ||
159 | SRC_G3D, | ||
160 | SRC_LCD, | ||
161 | SRC_ISP, | ||
162 | SRC_MAUDIO, | ||
163 | SRC_FSYS, | ||
164 | SRC_PERIL0, | ||
165 | SRC_PERIL1, | ||
166 | SRC_CAM1, | ||
167 | SRC_TOP_ISP0, | ||
168 | SRC_TOP_ISP1, | ||
169 | SRC_MASK_TOP, | ||
170 | SRC_MASK_CAM, | ||
171 | SRC_MASK_TV, | ||
172 | SRC_MASK_LCD, | ||
173 | SRC_MASK_ISP, | ||
174 | SRC_MASK_MAUDIO, | ||
175 | SRC_MASK_FSYS, | ||
176 | SRC_MASK_PERIL0, | ||
177 | SRC_MASK_PERIL1, | ||
178 | DIV_TOP, | ||
179 | DIV_CAM, | ||
180 | DIV_TV, | ||
181 | DIV_MFC, | ||
182 | DIV_G3D, | ||
183 | DIV_LCD, | ||
184 | DIV_ISP, | ||
185 | DIV_MAUDIO, | ||
186 | DIV_FSYS0, | ||
187 | DIV_FSYS1, | ||
188 | DIV_FSYS2, | ||
189 | DIV_PERIL0, | ||
190 | DIV_PERIL1, | ||
191 | DIV_PERIL2, | ||
192 | DIV_PERIL3, | ||
193 | DIV_PERIL4, | ||
194 | DIV_PERIL5, | ||
195 | DIV_CAM1, | ||
196 | DIV_TOP_ISP1, | ||
197 | DIV_TOP_ISP0, | ||
198 | CLKDIV2_RATIO, | ||
199 | GATE_SCLK_CAM, | ||
200 | GATE_SCLK_TV, | ||
201 | GATE_SCLK_MFC, | ||
202 | GATE_SCLK_G3D, | ||
203 | GATE_SCLK_LCD, | ||
204 | GATE_SCLK_MAUDIO, | ||
205 | GATE_SCLK_FSYS, | ||
206 | GATE_SCLK_PERIL, | ||
207 | GATE_IP_CAM, | ||
208 | GATE_IP_TV, | ||
209 | GATE_IP_MFC, | ||
210 | GATE_IP_G3D, | ||
211 | GATE_IP_LCD, | ||
212 | GATE_IP_FSYS, | ||
213 | GATE_IP_PERIL, | ||
214 | GATE_BLOCK, | ||
215 | APLL_LOCK, | ||
216 | APLL_CON0, | ||
217 | SRC_CPU, | ||
218 | DIV_CPU0, | ||
219 | DIV_CPU1, | ||
220 | }; | ||
221 | |||
222 | static int exynos4415_clk_suspend(void) | ||
223 | { | ||
224 | samsung_clk_save(exynos4415_ctx->reg_base, exynos4415_clk_regs, | ||
225 | ARRAY_SIZE(exynos4415_cmu_clk_regs)); | ||
226 | |||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static void exynos4415_clk_resume(void) | ||
231 | { | ||
232 | samsung_clk_restore(exynos4415_ctx->reg_base, exynos4415_clk_regs, | ||
233 | ARRAY_SIZE(exynos4415_cmu_clk_regs)); | ||
234 | } | ||
235 | |||
236 | static struct syscore_ops exynos4415_clk_syscore_ops = { | ||
237 | .suspend = exynos4415_clk_suspend, | ||
238 | .resume = exynos4415_clk_resume, | ||
239 | }; | ||
240 | |||
241 | static void exynos4415_clk_sleep_init(void) | ||
242 | { | ||
243 | exynos4415_clk_regs = | ||
244 | samsung_clk_alloc_reg_dump(exynos4415_cmu_clk_regs, | ||
245 | ARRAY_SIZE(exynos4415_cmu_clk_regs)); | ||
246 | if (!exynos4415_clk_regs) { | ||
247 | pr_warn("%s: Failed to allocate sleep save data\n", __func__); | ||
248 | return; | ||
249 | } | ||
250 | |||
251 | register_syscore_ops(&exynos4415_clk_syscore_ops); | ||
252 | } | ||
253 | #else | ||
254 | static inline void exynos4415_clk_sleep_init(void) { } | ||
255 | #endif | ||
256 | |||
257 | /* list of all parent clock list */ | ||
258 | PNAME(mout_g3d_pllsrc_p) = { "fin_pll", }; | ||
259 | |||
260 | PNAME(mout_apll_p) = { "fin_pll", "fout_apll", }; | ||
261 | PNAME(mout_g3d_pll_p) = { "fin_pll", "fout_g3d_pll", }; | ||
262 | PNAME(mout_isp_pll_p) = { "fin_pll", "fout_isp_pll", }; | ||
263 | PNAME(mout_disp_pll_p) = { "fin_pll", "fout_disp_pll", }; | ||
264 | |||
265 | PNAME(mout_mpll_user_p) = { "fin_pll", "div_mpll_pre", }; | ||
266 | PNAME(mout_epll_p) = { "fin_pll", "fout_epll", }; | ||
267 | PNAME(mout_core_p) = { "mout_apll", "mout_mpll_user_c", }; | ||
268 | PNAME(mout_hpm_p) = { "mout_apll", "mout_mpll_user_c", }; | ||
269 | |||
270 | PNAME(mout_ebi_p) = { "div_aclk_200", "div_aclk_160", }; | ||
271 | PNAME(mout_ebi_1_p) = { "mout_ebi", "mout_g3d_pll", }; | ||
272 | |||
273 | PNAME(mout_gdl_p) = { "mout_mpll_user_l", }; | ||
274 | PNAME(mout_gdr_p) = { "mout_mpll_user_r", }; | ||
275 | |||
276 | PNAME(mout_aclk_266_p) = { "mout_mpll_user_t", "mout_g3d_pll", }; | ||
277 | |||
278 | PNAME(group_epll_g3dpll_p) = { "mout_epll", "mout_g3d_pll" }; | ||
279 | PNAME(group_sclk_p) = { "xxti", "xusbxti", | ||
280 | "none", "mout_isp_pll", | ||
281 | "none", "none", "div_mpll_pre", | ||
282 | "mout_epll", "mout_g3d_pll", }; | ||
283 | PNAME(group_spdif_p) = { "mout_audio0", "mout_audio1", | ||
284 | "mout_audio2", "spdif_extclk", }; | ||
285 | PNAME(group_sclk_audio2_p) = { "audiocdclk2", "none", | ||
286 | "none", "mout_isp_pll", | ||
287 | "mout_disp_pll", "xusbxti", | ||
288 | "div_mpll_pre", "mout_epll", | ||
289 | "mout_g3d_pll", }; | ||
290 | PNAME(group_sclk_audio1_p) = { "audiocdclk1", "none", | ||
291 | "none", "mout_isp_pll", | ||
292 | "mout_disp_pll", "xusbxti", | ||
293 | "div_mpll_pre", "mout_epll", | ||
294 | "mout_g3d_pll", }; | ||
295 | PNAME(group_sclk_audio0_p) = { "audiocdclk0", "none", | ||
296 | "none", "mout_isp_pll", | ||
297 | "mout_disp_pll", "xusbxti", | ||
298 | "div_mpll_pre", "mout_epll", | ||
299 | "mout_g3d_pll", }; | ||
300 | PNAME(group_fimc_lclk_p) = { "xxti", "xusbxti", | ||
301 | "none", "mout_isp_pll", | ||
302 | "none", "mout_disp_pll", | ||
303 | "mout_mpll_user_t", "mout_epll", | ||
304 | "mout_g3d_pll", }; | ||
305 | PNAME(group_sclk_fimd0_p) = { "xxti", "xusbxti", | ||
306 | "m_bitclkhsdiv4_4l", "mout_isp_pll", | ||
307 | "mout_disp_pll", "sclk_hdmiphy", | ||
308 | "div_mpll_pre", "mout_epll", | ||
309 | "mout_g3d_pll", }; | ||
310 | PNAME(mout_hdmi_p) = { "sclk_pixel", "sclk_hdmiphy" }; | ||
311 | PNAME(mout_mfc_p) = { "mout_mfc_0", "mout_mfc_1" }; | ||
312 | PNAME(mout_g3d_p) = { "mout_g3d_0", "mout_g3d_1" }; | ||
313 | PNAME(mout_jpeg_p) = { "mout_jpeg_0", "mout_jpeg_1" }; | ||
314 | PNAME(mout_jpeg1_p) = { "mout_epll", "mout_g3d_pll" }; | ||
315 | PNAME(group_aclk_isp0_300_p) = { "mout_isp_pll", "div_mpll_pre" }; | ||
316 | PNAME(group_aclk_isp0_400_user_p) = { "fin_pll", "div_aclk_400_mcuisp" }; | ||
317 | PNAME(group_aclk_isp0_300_user_p) = { "fin_pll", "mout_aclk_isp0_300" }; | ||
318 | PNAME(group_aclk_isp1_300_user_p) = { "fin_pll", "mout_aclk_isp1_300" }; | ||
319 | PNAME(group_mout_mpll_user_t_p) = { "mout_mpll_user_t" }; | ||
320 | |||
321 | static struct samsung_fixed_factor_clock exynos4415_fixed_factor_clks[] __initdata = { | ||
322 | /* HACK: fin_pll hardcoded to xusbxti until detection is implemented. */ | ||
323 | FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0), | ||
324 | }; | ||
325 | |||
326 | static struct samsung_fixed_rate_clock exynos4415_fixed_rate_clks[] __initdata = { | ||
327 | FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 27000000), | ||
328 | }; | ||
329 | |||
330 | static struct samsung_mux_clock exynos4415_mux_clks[] __initdata = { | ||
331 | /* | ||
332 | * NOTE: Following table is sorted by register address in ascending | ||
333 | * order and then bitfield shift in descending order, as it is done | ||
334 | * in the User's Manual. When adding new entries, please make sure | ||
335 | * that the order is preserved, to avoid merge conflicts and make | ||
336 | * further work with defined data easier. | ||
337 | */ | ||
338 | |||
339 | /* SRC_LEFTBUS */ | ||
340 | MUX(CLK_MOUT_MPLL_USER_L, "mout_mpll_user_l", mout_mpll_user_p, | ||
341 | SRC_LEFTBUS, 4, 1), | ||
342 | MUX(CLK_MOUT_GDL, "mout_gdl", mout_gdl_p, SRC_LEFTBUS, 0, 1), | ||
343 | |||
344 | /* SRC_RIGHTBUS */ | ||
345 | MUX(CLK_MOUT_MPLL_USER_R, "mout_mpll_user_r", mout_mpll_user_p, | ||
346 | SRC_RIGHTBUS, 4, 1), | ||
347 | MUX(CLK_MOUT_GDR, "mout_gdr", mout_gdr_p, SRC_RIGHTBUS, 0, 1), | ||
348 | |||
349 | /* SRC_TOP0 */ | ||
350 | MUX(CLK_MOUT_EBI, "mout_ebi", mout_ebi_p, SRC_TOP0, 28, 1), | ||
351 | MUX(CLK_MOUT_ACLK_200, "mout_aclk_200", group_mout_mpll_user_t_p, | ||
352 | SRC_TOP0, 24, 1), | ||
353 | MUX(CLK_MOUT_ACLK_160, "mout_aclk_160", group_mout_mpll_user_t_p, | ||
354 | SRC_TOP0, 20, 1), | ||
355 | MUX(CLK_MOUT_ACLK_100, "mout_aclk_100", group_mout_mpll_user_t_p, | ||
356 | SRC_TOP0, 16, 1), | ||
357 | MUX(CLK_MOUT_ACLK_266, "mout_aclk_266", mout_aclk_266_p, | ||
358 | SRC_TOP0, 12, 1), | ||
359 | MUX(CLK_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p, | ||
360 | SRC_TOP0, 8, 1), | ||
361 | MUX(CLK_MOUT_EPLL, "mout_epll", mout_epll_p, SRC_TOP0, 4, 1), | ||
362 | MUX(CLK_MOUT_EBI_1, "mout_ebi_1", mout_ebi_1_p, SRC_TOP0, 0, 1), | ||
363 | |||
364 | /* SRC_TOP1 */ | ||
365 | MUX(CLK_MOUT_ISP_PLL, "mout_isp_pll", mout_isp_pll_p, | ||
366 | SRC_TOP1, 28, 1), | ||
367 | MUX(CLK_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, | ||
368 | SRC_TOP1, 16, 1), | ||
369 | MUX(CLK_MOUT_MPLL_USER_T, "mout_mpll_user_t", mout_mpll_user_p, | ||
370 | SRC_TOP1, 12, 1), | ||
371 | MUX(CLK_MOUT_ACLK_400_MCUISP, "mout_aclk_400_mcuisp", | ||
372 | group_mout_mpll_user_t_p, SRC_TOP1, 8, 1), | ||
373 | MUX(CLK_MOUT_G3D_PLLSRC, "mout_g3d_pllsrc", mout_g3d_pllsrc_p, | ||
374 | SRC_TOP1, 0, 1), | ||
375 | |||
376 | /* SRC_CAM */ | ||
377 | MUX(CLK_MOUT_CSIS1, "mout_csis1", group_fimc_lclk_p, SRC_CAM, 28, 4), | ||
378 | MUX(CLK_MOUT_CSIS0, "mout_csis0", group_fimc_lclk_p, SRC_CAM, 24, 4), | ||
379 | MUX(CLK_MOUT_CAM1, "mout_cam1", group_fimc_lclk_p, SRC_CAM, 20, 4), | ||
380 | MUX(CLK_MOUT_FIMC3_LCLK, "mout_fimc3_lclk", group_fimc_lclk_p, SRC_CAM, | ||
381 | 12, 4), | ||
382 | MUX(CLK_MOUT_FIMC2_LCLK, "mout_fimc2_lclk", group_fimc_lclk_p, SRC_CAM, | ||
383 | 8, 4), | ||
384 | MUX(CLK_MOUT_FIMC1_LCLK, "mout_fimc1_lclk", group_fimc_lclk_p, SRC_CAM, | ||
385 | 4, 4), | ||
386 | MUX(CLK_MOUT_FIMC0_LCLK, "mout_fimc0_lclk", group_fimc_lclk_p, SRC_CAM, | ||
387 | 0, 4), | ||
388 | |||
389 | /* SRC_TV */ | ||
390 | MUX(CLK_MOUT_HDMI, "mout_hdmi", mout_hdmi_p, SRC_TV, 0, 1), | ||
391 | |||
392 | /* SRC_MFC */ | ||
393 | MUX(CLK_MOUT_MFC, "mout_mfc", mout_mfc_p, SRC_MFC, 8, 1), | ||
394 | MUX(CLK_MOUT_MFC_1, "mout_mfc_1", group_epll_g3dpll_p, SRC_MFC, 4, 1), | ||
395 | MUX(CLK_MOUT_MFC_0, "mout_mfc_0", group_mout_mpll_user_t_p, SRC_MFC, 0, | ||
396 | 1), | ||
397 | |||
398 | /* SRC_G3D */ | ||
399 | MUX(CLK_MOUT_G3D, "mout_g3d", mout_g3d_p, SRC_G3D, 8, 1), | ||
400 | MUX(CLK_MOUT_G3D_1, "mout_g3d_1", group_epll_g3dpll_p, SRC_G3D, 4, 1), | ||
401 | MUX(CLK_MOUT_G3D_0, "mout_g3d_0", group_mout_mpll_user_t_p, SRC_G3D, 0, | ||
402 | 1), | ||
403 | |||
404 | /* SRC_LCD */ | ||
405 | MUX(CLK_MOUT_MIPI0, "mout_mipi0", group_fimc_lclk_p, SRC_LCD, 12, 4), | ||
406 | MUX(CLK_MOUT_FIMD0, "mout_fimd0", group_sclk_fimd0_p, SRC_LCD, 0, 4), | ||
407 | |||
408 | /* SRC_ISP */ | ||
409 | MUX(CLK_MOUT_TSADC_ISP, "mout_tsadc_isp", group_fimc_lclk_p, SRC_ISP, | ||
410 | 16, 4), | ||
411 | MUX(CLK_MOUT_UART_ISP, "mout_uart_isp", group_fimc_lclk_p, SRC_ISP, | ||
412 | 12, 4), | ||
413 | MUX(CLK_MOUT_SPI1_ISP, "mout_spi1_isp", group_fimc_lclk_p, SRC_ISP, | ||
414 | 8, 4), | ||
415 | MUX(CLK_MOUT_SPI0_ISP, "mout_spi0_isp", group_fimc_lclk_p, SRC_ISP, | ||
416 | 4, 4), | ||
417 | MUX(CLK_MOUT_PWM_ISP, "mout_pwm_isp", group_fimc_lclk_p, SRC_ISP, | ||
418 | 0, 4), | ||
419 | |||
420 | /* SRC_MAUDIO */ | ||
421 | MUX(CLK_MOUT_AUDIO0, "mout_audio0", group_sclk_audio0_p, SRC_MAUDIO, | ||
422 | 0, 4), | ||
423 | |||
424 | /* SRC_FSYS */ | ||
425 | MUX(CLK_MOUT_TSADC, "mout_tsadc", group_sclk_p, SRC_FSYS, 28, 4), | ||
426 | MUX(CLK_MOUT_MMC2, "mout_mmc2", group_sclk_p, SRC_FSYS, 8, 4), | ||
427 | MUX(CLK_MOUT_MMC1, "mout_mmc1", group_sclk_p, SRC_FSYS, 4, 4), | ||
428 | MUX(CLK_MOUT_MMC0, "mout_mmc0", group_sclk_p, SRC_FSYS, 0, 4), | ||
429 | |||
430 | /* SRC_PERIL0 */ | ||
431 | MUX(CLK_MOUT_UART3, "mout_uart3", group_sclk_p, SRC_PERIL0, 12, 4), | ||
432 | MUX(CLK_MOUT_UART2, "mout_uart2", group_sclk_p, SRC_PERIL0, 8, 4), | ||
433 | MUX(CLK_MOUT_UART1, "mout_uart1", group_sclk_p, SRC_PERIL0, 4, 4), | ||
434 | MUX(CLK_MOUT_UART0, "mout_uart0", group_sclk_p, SRC_PERIL0, 0, 4), | ||
435 | |||
436 | /* SRC_PERIL1 */ | ||
437 | MUX(CLK_MOUT_SPI2, "mout_spi2", group_sclk_p, SRC_PERIL1, 24, 4), | ||
438 | MUX(CLK_MOUT_SPI1, "mout_spi1", group_sclk_p, SRC_PERIL1, 20, 4), | ||
439 | MUX(CLK_MOUT_SPI0, "mout_spi0", group_sclk_p, SRC_PERIL1, 16, 4), | ||
440 | MUX(CLK_MOUT_SPDIF, "mout_spdif", group_spdif_p, SRC_PERIL1, 8, 4), | ||
441 | MUX(CLK_MOUT_AUDIO2, "mout_audio2", group_sclk_audio2_p, SRC_PERIL1, | ||
442 | 4, 4), | ||
443 | MUX(CLK_MOUT_AUDIO1, "mout_audio1", group_sclk_audio1_p, SRC_PERIL1, | ||
444 | 0, 4), | ||
445 | |||
446 | /* SRC_CPU */ | ||
447 | MUX(CLK_MOUT_MPLL_USER_C, "mout_mpll_user_c", mout_mpll_user_p, | ||
448 | SRC_CPU, 24, 1), | ||
449 | MUX(CLK_MOUT_HPM, "mout_hpm", mout_hpm_p, SRC_CPU, 20, 1), | ||
450 | MUX_F(CLK_MOUT_CORE, "mout_core", mout_core_p, SRC_CPU, 16, 1, 0, | ||
451 | CLK_MUX_READ_ONLY), | ||
452 | MUX_F(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1, | ||
453 | CLK_SET_RATE_PARENT, 0), | ||
454 | |||
455 | /* SRC_CAM1 */ | ||
456 | MUX(CLK_MOUT_PXLASYNC_CSIS1_FIMC, "mout_pxlasync_csis1", | ||
457 | group_fimc_lclk_p, SRC_CAM1, 20, 1), | ||
458 | MUX(CLK_MOUT_PXLASYNC_CSIS0_FIMC, "mout_pxlasync_csis0", | ||
459 | group_fimc_lclk_p, SRC_CAM1, 16, 1), | ||
460 | MUX(CLK_MOUT_JPEG, "mout_jpeg", mout_jpeg_p, SRC_CAM1, 8, 1), | ||
461 | MUX(CLK_MOUT_JPEG1, "mout_jpeg_1", mout_jpeg1_p, SRC_CAM1, 4, 1), | ||
462 | MUX(CLK_MOUT_JPEG0, "mout_jpeg_0", group_mout_mpll_user_t_p, SRC_CAM1, | ||
463 | 0, 1), | ||
464 | |||
465 | /* SRC_TOP_ISP0 */ | ||
466 | MUX(CLK_MOUT_ACLK_ISP0_300, "mout_aclk_isp0_300", | ||
467 | group_aclk_isp0_300_p, SRC_TOP_ISP0, 8, 1), | ||
468 | MUX(CLK_MOUT_ACLK_ISP0_400, "mout_aclk_isp0_400_user", | ||
469 | group_aclk_isp0_400_user_p, SRC_TOP_ISP0, 4, 1), | ||
470 | MUX(CLK_MOUT_ACLK_ISP0_300_USER, "mout_aclk_isp0_300_user", | ||
471 | group_aclk_isp0_300_user_p, SRC_TOP_ISP0, 0, 1), | ||
472 | |||
473 | /* SRC_TOP_ISP1 */ | ||
474 | MUX(CLK_MOUT_ACLK_ISP1_300, "mout_aclk_isp1_300", | ||
475 | group_aclk_isp0_300_p, SRC_TOP_ISP1, 4, 1), | ||
476 | MUX(CLK_MOUT_ACLK_ISP1_300_USER, "mout_aclk_isp1_300_user", | ||
477 | group_aclk_isp1_300_user_p, SRC_TOP_ISP1, 0, 1), | ||
478 | }; | ||
479 | |||
480 | static struct samsung_div_clock exynos4415_div_clks[] __initdata = { | ||
481 | /* | ||
482 | * NOTE: Following table is sorted by register address in ascending | ||
483 | * order and then bitfield shift in descending order, as it is done | ||
484 | * in the User's Manual. When adding new entries, please make sure | ||
485 | * that the order is preserved, to avoid merge conflicts and make | ||
486 | * further work with defined data easier. | ||
487 | */ | ||
488 | |||
489 | /* DIV_LEFTBUS */ | ||
490 | DIV(CLK_DIV_GPL, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3), | ||
491 | DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 4), | ||
492 | |||
493 | /* DIV_RIGHTBUS */ | ||
494 | DIV(CLK_DIV_GPR, "div_gpr", "div_gdr", DIV_RIGHTBUS, 4, 3), | ||
495 | DIV(CLK_DIV_GDR, "div_gdr", "mout_gdr", DIV_RIGHTBUS, 0, 4), | ||
496 | |||
497 | /* DIV_TOP */ | ||
498 | DIV(CLK_DIV_ACLK_400_MCUISP, "div_aclk_400_mcuisp", | ||
499 | "mout_aclk_400_mcuisp", DIV_TOP, 24, 3), | ||
500 | DIV(CLK_DIV_EBI, "div_ebi", "mout_ebi_1", DIV_TOP, 16, 3), | ||
501 | DIV(CLK_DIV_ACLK_200, "div_aclk_200", "mout_aclk_200", DIV_TOP, 12, 3), | ||
502 | DIV(CLK_DIV_ACLK_160, "div_aclk_160", "mout_aclk_160", DIV_TOP, 8, 3), | ||
503 | DIV(CLK_DIV_ACLK_100, "div_aclk_100", "mout_aclk_100", DIV_TOP, 4, 4), | ||
504 | DIV(CLK_DIV_ACLK_266, "div_aclk_266", "mout_aclk_266", DIV_TOP, 0, 3), | ||
505 | |||
506 | /* DIV_CAM */ | ||
507 | DIV(CLK_DIV_CSIS1, "div_csis1", "mout_csis1", DIV_CAM, 28, 4), | ||
508 | DIV(CLK_DIV_CSIS0, "div_csis0", "mout_csis0", DIV_CAM, 24, 4), | ||
509 | DIV(CLK_DIV_CAM1, "div_cam1", "mout_cam1", DIV_CAM, 20, 4), | ||
510 | DIV(CLK_DIV_FIMC3_LCLK, "div_fimc3_lclk", "mout_fimc3_lclk", DIV_CAM, | ||
511 | 12, 4), | ||
512 | DIV(CLK_DIV_FIMC2_LCLK, "div_fimc2_lclk", "mout_fimc2_lclk", DIV_CAM, | ||
513 | 8, 4), | ||
514 | DIV(CLK_DIV_FIMC1_LCLK, "div_fimc1_lclk", "mout_fimc1_lclk", DIV_CAM, | ||
515 | 4, 4), | ||
516 | DIV(CLK_DIV_FIMC0_LCLK, "div_fimc0_lclk", "mout_fimc0_lclk", DIV_CAM, | ||
517 | 0, 4), | ||
518 | |||
519 | /* DIV_TV */ | ||
520 | DIV(CLK_DIV_TV_BLK, "div_tv_blk", "mout_g3d_pll", DIV_TV, 0, 4), | ||
521 | |||
522 | /* DIV_MFC */ | ||
523 | DIV(CLK_DIV_MFC, "div_mfc", "mout_mfc", DIV_MFC, 0, 4), | ||
524 | |||
525 | /* DIV_G3D */ | ||
526 | DIV(CLK_DIV_G3D, "div_g3d", "mout_g3d", DIV_G3D, 0, 4), | ||
527 | |||
528 | /* DIV_LCD */ | ||
529 | DIV_F(CLK_DIV_MIPI0_PRE, "div_mipi0_pre", "div_mipi0", DIV_LCD, 20, 4, | ||
530 | CLK_SET_RATE_PARENT, 0), | ||
531 | DIV(CLK_DIV_MIPI0, "div_mipi0", "mout_mipi0", DIV_LCD, 16, 4), | ||
532 | DIV(CLK_DIV_FIMD0, "div_fimd0", "mout_fimd0", DIV_LCD, 0, 4), | ||
533 | |||
534 | /* DIV_ISP */ | ||
535 | DIV(CLK_DIV_UART_ISP, "div_uart_isp", "mout_uart_isp", DIV_ISP, 28, 4), | ||
536 | DIV_F(CLK_DIV_SPI1_ISP_PRE, "div_spi1_isp_pre", "div_spi1_isp", | ||
537 | DIV_ISP, 20, 8, CLK_SET_RATE_PARENT, 0), | ||
538 | DIV(CLK_DIV_SPI1_ISP, "div_spi1_isp", "mout_spi1_isp", DIV_ISP, 16, 4), | ||
539 | DIV_F(CLK_DIV_SPI0_ISP_PRE, "div_spi0_isp_pre", "div_spi0_isp", | ||
540 | DIV_ISP, 8, 8, CLK_SET_RATE_PARENT, 0), | ||
541 | DIV(CLK_DIV_SPI0_ISP, "div_spi0_isp", "mout_spi0_isp", DIV_ISP, 4, 4), | ||
542 | DIV(CLK_DIV_PWM_ISP, "div_pwm_isp", "mout_pwm_isp", DIV_ISP, 0, 4), | ||
543 | |||
544 | /* DIV_MAUDIO */ | ||
545 | DIV(CLK_DIV_PCM0, "div_pcm0", "div_audio0", DIV_MAUDIO, 4, 8), | ||
546 | DIV(CLK_DIV_AUDIO0, "div_audio0", "mout_audio0", DIV_MAUDIO, 0, 4), | ||
547 | |||
548 | /* DIV_FSYS0 */ | ||
549 | DIV_F(CLK_DIV_TSADC_PRE, "div_tsadc_pre", "div_tsadc", DIV_FSYS0, 8, 8, | ||
550 | CLK_SET_RATE_PARENT, 0), | ||
551 | DIV(CLK_DIV_TSADC, "div_tsadc", "mout_tsadc", DIV_FSYS0, 0, 4), | ||
552 | |||
553 | /* DIV_FSYS1 */ | ||
554 | DIV_F(CLK_DIV_MMC1_PRE, "div_mmc1_pre", "div_mmc1", DIV_FSYS1, 24, 8, | ||
555 | CLK_SET_RATE_PARENT, 0), | ||
556 | DIV(CLK_DIV_MMC1, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4), | ||
557 | DIV_F(CLK_DIV_MMC0_PRE, "div_mmc0_pre", "div_mmc0", DIV_FSYS1, 8, 8, | ||
558 | CLK_SET_RATE_PARENT, 0), | ||
559 | DIV(CLK_DIV_MMC0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4), | ||
560 | |||
561 | /* DIV_FSYS2 */ | ||
562 | DIV_F(CLK_DIV_MMC2_PRE, "div_mmc2_pre", "div_mmc2", DIV_FSYS2, 8, 8, | ||
563 | CLK_SET_RATE_PARENT, 0), | ||
564 | DIV_F(CLK_DIV_MMC2_PRE, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4, | ||
565 | CLK_SET_RATE_PARENT, 0), | ||
566 | |||
567 | /* DIV_PERIL0 */ | ||
568 | DIV(CLK_DIV_UART3, "div_uart3", "mout_uart3", DIV_PERIL0, 12, 4), | ||
569 | DIV(CLK_DIV_UART2, "div_uart2", "mout_uart2", DIV_PERIL0, 8, 4), | ||
570 | DIV(CLK_DIV_UART1, "div_uart1", "mout_uart1", DIV_PERIL0, 4, 4), | ||
571 | DIV(CLK_DIV_UART0, "div_uart0", "mout_uart0", DIV_PERIL0, 0, 4), | ||
572 | |||
573 | /* DIV_PERIL1 */ | ||
574 | DIV_F(CLK_DIV_SPI1_PRE, "div_spi1_pre", "div_spi1", DIV_PERIL1, 24, 8, | ||
575 | CLK_SET_RATE_PARENT, 0), | ||
576 | DIV(CLK_DIV_SPI1, "div_spi1", "mout_spi1", DIV_PERIL1, 16, 4), | ||
577 | DIV_F(CLK_DIV_SPI0_PRE, "div_spi0_pre", "div_spi0", DIV_PERIL1, 8, 8, | ||
578 | CLK_SET_RATE_PARENT, 0), | ||
579 | DIV(CLK_DIV_SPI0, "div_spi0", "mout_spi0", DIV_PERIL1, 0, 4), | ||
580 | |||
581 | /* DIV_PERIL2 */ | ||
582 | DIV_F(CLK_DIV_SPI2_PRE, "div_spi2_pre", "div_spi2", DIV_PERIL2, 8, 8, | ||
583 | CLK_SET_RATE_PARENT, 0), | ||
584 | DIV(CLK_DIV_SPI2, "div_spi2", "mout_spi2", DIV_PERIL2, 0, 4), | ||
585 | |||
586 | /* DIV_PERIL4 */ | ||
587 | DIV(CLK_DIV_PCM2, "div_pcm2", "div_audio2", DIV_PERIL4, 20, 8), | ||
588 | DIV(CLK_DIV_AUDIO2, "div_audio2", "mout_audio2", DIV_PERIL4, 16, 4), | ||
589 | DIV(CLK_DIV_PCM1, "div_pcm1", "div_audio1", DIV_PERIL4, 20, 8), | ||
590 | DIV(CLK_DIV_AUDIO1, "div_audio1", "mout_audio1", DIV_PERIL4, 0, 4), | ||
591 | |||
592 | /* DIV_PERIL5 */ | ||
593 | DIV(CLK_DIV_I2S1, "div_i2s1", "div_audio1", DIV_PERIL5, 0, 6), | ||
594 | |||
595 | /* DIV_CAM1 */ | ||
596 | DIV(CLK_DIV_PXLASYNC_CSIS1_FIMC, "div_pxlasync_csis1_fimc", | ||
597 | "mout_pxlasync_csis1", DIV_CAM1, 24, 4), | ||
598 | DIV(CLK_DIV_PXLASYNC_CSIS0_FIMC, "div_pxlasync_csis0_fimc", | ||
599 | "mout_pxlasync_csis0", DIV_CAM1, 20, 4), | ||
600 | DIV(CLK_DIV_JPEG, "div_jpeg", "mout_jpeg", DIV_CAM1, 0, 4), | ||
601 | |||
602 | /* DIV_CPU0 */ | ||
603 | DIV(CLK_DIV_CORE2, "div_core2", "div_core", DIV_CPU0, 28, 3), | ||
604 | DIV_F(CLK_DIV_APLL, "div_apll", "mout_apll", DIV_CPU0, 24, 3, | ||
605 | CLK_GET_RATE_NOCACHE, CLK_DIVIDER_READ_ONLY), | ||
606 | DIV(CLK_DIV_PCLK_DBG, "div_pclk_dbg", "div_core2", DIV_CPU0, 20, 3), | ||
607 | DIV(CLK_DIV_ATB, "div_atb", "div_core2", DIV_CPU0, 16, 3), | ||
608 | DIV(CLK_DIV_PERIPH, "div_periph", "div_core2", DIV_CPU0, 12, 3), | ||
609 | DIV(CLK_DIV_COREM1, "div_corem1", "div_core2", DIV_CPU0, 8, 3), | ||
610 | DIV(CLK_DIV_COREM0, "div_corem0", "div_core2", DIV_CPU0, 4, 3), | ||
611 | DIV_F(CLK_DIV_CORE, "div_core", "mout_core", DIV_CPU0, 0, 3, | ||
612 | CLK_GET_RATE_NOCACHE, CLK_DIVIDER_READ_ONLY), | ||
613 | |||
614 | /* DIV_CPU1 */ | ||
615 | DIV(CLK_DIV_HPM, "div_hpm", "div_copy", DIV_CPU1, 4, 3), | ||
616 | DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3), | ||
617 | }; | ||
618 | |||
619 | static struct samsung_gate_clock exynos4415_gate_clks[] __initdata = { | ||
620 | /* | ||
621 | * NOTE: Following table is sorted by register address in ascending | ||
622 | * order and then bitfield shift in descending order, as it is done | ||
623 | * in the User's Manual. When adding new entries, please make sure | ||
624 | * that the order is preserved, to avoid merge conflicts and make | ||
625 | * further work with defined data easier. | ||
626 | */ | ||
627 | |||
628 | /* GATE_IP_LEFTBUS */ | ||
629 | GATE(CLK_ASYNC_G3D, "async_g3d", "div_aclk_100", GATE_IP_LEFTBUS, 6, | ||
630 | CLK_IGNORE_UNUSED, 0), | ||
631 | GATE(CLK_ASYNC_MFCL, "async_mfcl", "div_aclk_100", GATE_IP_LEFTBUS, 4, | ||
632 | CLK_IGNORE_UNUSED, 0), | ||
633 | GATE(CLK_ASYNC_TVX, "async_tvx", "div_aclk_100", GATE_IP_LEFTBUS, 3, | ||
634 | CLK_IGNORE_UNUSED, 0), | ||
635 | GATE(CLK_PPMULEFT, "ppmuleft", "div_aclk_100", GATE_IP_LEFTBUS, 1, | ||
636 | CLK_IGNORE_UNUSED, 0), | ||
637 | GATE(CLK_GPIO_LEFT, "gpio_left", "div_aclk_100", GATE_IP_LEFTBUS, 0, | ||
638 | CLK_IGNORE_UNUSED, 0), | ||
639 | |||
640 | /* GATE_IP_IMAGE */ | ||
641 | GATE(CLK_PPMUIMAGE, "ppmuimage", "div_aclk_100", GATE_IP_IMAGE, | ||
642 | 9, 0, 0), | ||
643 | GATE(CLK_QEMDMA2, "qe_mdma2", "div_aclk_100", GATE_IP_IMAGE, | ||
644 | 8, 0, 0), | ||
645 | GATE(CLK_QEROTATOR, "qe_rotator", "div_aclk_100", GATE_IP_IMAGE, | ||
646 | 7, 0, 0), | ||
647 | GATE(CLK_SMMUMDMA2, "smmu_mdam2", "div_aclk_100", GATE_IP_IMAGE, | ||
648 | 5, 0, 0), | ||
649 | GATE(CLK_SMMUROTATOR, "smmu_rotator", "div_aclk_100", GATE_IP_IMAGE, | ||
650 | 4, 0, 0), | ||
651 | GATE(CLK_MDMA2, "mdma2", "div_aclk_100", GATE_IP_IMAGE, 2, 0, 0), | ||
652 | GATE(CLK_ROTATOR, "rotator", "div_aclk_100", GATE_IP_IMAGE, 1, 0, 0), | ||
653 | |||
654 | /* GATE_IP_RIGHTBUS */ | ||
655 | GATE(CLK_ASYNC_ISPMX, "async_ispmx", "div_aclk_100", | ||
656 | GATE_IP_RIGHTBUS, 9, CLK_IGNORE_UNUSED, 0), | ||
657 | GATE(CLK_ASYNC_MAUDIOX, "async_maudiox", "div_aclk_100", | ||
658 | GATE_IP_RIGHTBUS, 7, CLK_IGNORE_UNUSED, 0), | ||
659 | GATE(CLK_ASYNC_MFCR, "async_mfcr", "div_aclk_100", | ||
660 | GATE_IP_RIGHTBUS, 6, CLK_IGNORE_UNUSED, 0), | ||
661 | GATE(CLK_ASYNC_FSYSD, "async_fsysd", "div_aclk_100", | ||
662 | GATE_IP_RIGHTBUS, 5, CLK_IGNORE_UNUSED, 0), | ||
663 | GATE(CLK_ASYNC_LCD0X, "async_lcd0x", "div_aclk_100", | ||
664 | GATE_IP_RIGHTBUS, 3, CLK_IGNORE_UNUSED, 0), | ||
665 | GATE(CLK_ASYNC_CAMX, "async_camx", "div_aclk_100", | ||
666 | GATE_IP_RIGHTBUS, 2, CLK_IGNORE_UNUSED, 0), | ||
667 | GATE(CLK_PPMURIGHT, "ppmuright", "div_aclk_100", | ||
668 | GATE_IP_RIGHTBUS, 1, CLK_IGNORE_UNUSED, 0), | ||
669 | GATE(CLK_GPIO_RIGHT, "gpio_right", "div_aclk_100", | ||
670 | GATE_IP_RIGHTBUS, 0, CLK_IGNORE_UNUSED, 0), | ||
671 | |||
672 | /* GATE_IP_PERIR */ | ||
673 | GATE(CLK_ANTIRBK_APBIF, "antirbk_apbif", "div_aclk_100", | ||
674 | GATE_IP_PERIR, 24, CLK_IGNORE_UNUSED, 0), | ||
675 | GATE(CLK_EFUSE_WRITER_APBIF, "efuse_writer_apbif", "div_aclk_100", | ||
676 | GATE_IP_PERIR, 23, CLK_IGNORE_UNUSED, 0), | ||
677 | GATE(CLK_MONOCNT, "monocnt", "div_aclk_100", GATE_IP_PERIR, 22, | ||
678 | CLK_IGNORE_UNUSED, 0), | ||
679 | GATE(CLK_TZPC6, "tzpc6", "div_aclk_100", GATE_IP_PERIR, 21, | ||
680 | CLK_IGNORE_UNUSED, 0), | ||
681 | GATE(CLK_PROVISIONKEY1, "provisionkey1", "div_aclk_100", | ||
682 | GATE_IP_PERIR, 20, CLK_IGNORE_UNUSED, 0), | ||
683 | GATE(CLK_PROVISIONKEY0, "provisionkey0", "div_aclk_100", | ||
684 | GATE_IP_PERIR, 19, CLK_IGNORE_UNUSED, 0), | ||
685 | GATE(CLK_CMU_ISPPART, "cmu_isppart", "div_aclk_100", GATE_IP_PERIR, 18, | ||
686 | CLK_IGNORE_UNUSED, 0), | ||
687 | GATE(CLK_TMU_APBIF, "tmu_apbif", "div_aclk_100", | ||
688 | GATE_IP_PERIR, 17, 0, 0), | ||
689 | GATE(CLK_KEYIF, "keyif", "div_aclk_100", GATE_IP_PERIR, 16, 0, 0), | ||
690 | GATE(CLK_RTC, "rtc", "div_aclk_100", GATE_IP_PERIR, 15, 0, 0), | ||
691 | GATE(CLK_WDT, "wdt", "div_aclk_100", GATE_IP_PERIR, 14, 0, 0), | ||
692 | GATE(CLK_MCT, "mct", "div_aclk_100", GATE_IP_PERIR, 13, 0, 0), | ||
693 | GATE(CLK_SECKEY, "seckey", "div_aclk_100", GATE_IP_PERIR, 12, | ||
694 | CLK_IGNORE_UNUSED, 0), | ||
695 | GATE(CLK_HDMI_CEC, "hdmi_cec", "div_aclk_100", GATE_IP_PERIR, 11, | ||
696 | CLK_IGNORE_UNUSED, 0), | ||
697 | GATE(CLK_TZPC5, "tzpc5", "div_aclk_100", GATE_IP_PERIR, 10, | ||
698 | CLK_IGNORE_UNUSED, 0), | ||
699 | GATE(CLK_TZPC4, "tzpc4", "div_aclk_100", GATE_IP_PERIR, 9, | ||
700 | CLK_IGNORE_UNUSED, 0), | ||
701 | GATE(CLK_TZPC3, "tzpc3", "div_aclk_100", GATE_IP_PERIR, 8, | ||
702 | CLK_IGNORE_UNUSED, 0), | ||
703 | GATE(CLK_TZPC2, "tzpc2", "div_aclk_100", GATE_IP_PERIR, 7, | ||
704 | CLK_IGNORE_UNUSED, 0), | ||
705 | GATE(CLK_TZPC1, "tzpc1", "div_aclk_100", GATE_IP_PERIR, 6, | ||
706 | CLK_IGNORE_UNUSED, 0), | ||
707 | GATE(CLK_TZPC0, "tzpc0", "div_aclk_100", GATE_IP_PERIR, 5, | ||
708 | CLK_IGNORE_UNUSED, 0), | ||
709 | GATE(CLK_CMU_COREPART, "cmu_corepart", "div_aclk_100", GATE_IP_PERIR, 4, | ||
710 | CLK_IGNORE_UNUSED, 0), | ||
711 | GATE(CLK_CMU_TOPPART, "cmu_toppart", "div_aclk_100", GATE_IP_PERIR, 3, | ||
712 | CLK_IGNORE_UNUSED, 0), | ||
713 | GATE(CLK_PMU_APBIF, "pmu_apbif", "div_aclk_100", GATE_IP_PERIR, 2, | ||
714 | CLK_IGNORE_UNUSED, 0), | ||
715 | GATE(CLK_SYSREG, "sysreg", "div_aclk_100", GATE_IP_PERIR, 1, | ||
716 | CLK_IGNORE_UNUSED, 0), | ||
717 | GATE(CLK_CHIP_ID, "chip_id", "div_aclk_100", GATE_IP_PERIR, 0, | ||
718 | CLK_IGNORE_UNUSED, 0), | ||
719 | |||
720 | /* GATE_SCLK_CAM - non-completed */ | ||
721 | GATE(CLK_SCLK_PXLAYSNC_CSIS1_FIMC, "sclk_pxlasync_csis1_fimc", | ||
722 | "div_pxlasync_csis1_fimc", GATE_SCLK_CAM, 11, | ||
723 | CLK_SET_RATE_PARENT, 0), | ||
724 | GATE(CLK_SCLK_PXLAYSNC_CSIS0_FIMC, "sclk_pxlasync_csis0_fimc", | ||
725 | "div_pxlasync_csis0_fimc", GATE_SCLK_CAM, | ||
726 | 10, CLK_SET_RATE_PARENT, 0), | ||
727 | GATE(CLK_SCLK_JPEG, "sclk_jpeg", "div_jpeg", | ||
728 | GATE_SCLK_CAM, 8, CLK_SET_RATE_PARENT, 0), | ||
729 | GATE(CLK_SCLK_CSIS1, "sclk_csis1", "div_csis1", | ||
730 | GATE_SCLK_CAM, 7, CLK_SET_RATE_PARENT, 0), | ||
731 | GATE(CLK_SCLK_CSIS0, "sclk_csis0", "div_csis0", | ||
732 | GATE_SCLK_CAM, 6, CLK_SET_RATE_PARENT, 0), | ||
733 | GATE(CLK_SCLK_CAM1, "sclk_cam1", "div_cam1", | ||
734 | GATE_SCLK_CAM, 5, CLK_SET_RATE_PARENT, 0), | ||
735 | GATE(CLK_SCLK_FIMC3_LCLK, "sclk_fimc3_lclk", "div_fimc3_lclk", | ||
736 | GATE_SCLK_CAM, 3, CLK_SET_RATE_PARENT, 0), | ||
737 | GATE(CLK_SCLK_FIMC2_LCLK, "sclk_fimc2_lclk", "div_fimc2_lclk", | ||
738 | GATE_SCLK_CAM, 2, CLK_SET_RATE_PARENT, 0), | ||
739 | GATE(CLK_SCLK_FIMC1_LCLK, "sclk_fimc1_lclk", "div_fimc1_lclk", | ||
740 | GATE_SCLK_CAM, 1, CLK_SET_RATE_PARENT, 0), | ||
741 | GATE(CLK_SCLK_FIMC0_LCLK, "sclk_fimc0_lclk", "div_fimc0_lclk", | ||
742 | GATE_SCLK_CAM, 0, CLK_SET_RATE_PARENT, 0), | ||
743 | |||
744 | /* GATE_SCLK_TV */ | ||
745 | GATE(CLK_SCLK_PIXEL, "sclk_pixel", "div_tv_blk", | ||
746 | GATE_SCLK_TV, 3, CLK_SET_RATE_PARENT, 0), | ||
747 | GATE(CLK_SCLK_HDMI, "sclk_hdmi", "mout_hdmi", | ||
748 | GATE_SCLK_TV, 2, CLK_SET_RATE_PARENT, 0), | ||
749 | GATE(CLK_SCLK_MIXER, "sclk_mixer", "div_tv_blk", | ||
750 | GATE_SCLK_TV, 0, CLK_SET_RATE_PARENT, 0), | ||
751 | |||
752 | /* GATE_SCLK_MFC */ | ||
753 | GATE(CLK_SCLK_MFC, "sclk_mfc", "div_mfc", | ||
754 | GATE_SCLK_MFC, 0, CLK_SET_RATE_PARENT, 0), | ||
755 | |||
756 | /* GATE_SCLK_G3D */ | ||
757 | GATE(CLK_SCLK_G3D, "sclk_g3d", "div_g3d", | ||
758 | GATE_SCLK_G3D, 0, CLK_SET_RATE_PARENT, 0), | ||
759 | |||
760 | /* GATE_SCLK_LCD */ | ||
761 | GATE(CLK_SCLK_MIPIDPHY4L, "sclk_mipidphy4l", "div_mipi0", | ||
762 | GATE_SCLK_LCD, 4, CLK_SET_RATE_PARENT, 0), | ||
763 | GATE(CLK_SCLK_MIPI0, "sclk_mipi0", "div_mipi0_pre", | ||
764 | GATE_SCLK_LCD, 3, CLK_SET_RATE_PARENT, 0), | ||
765 | GATE(CLK_SCLK_MDNIE0, "sclk_mdnie0", "div_fimd0", | ||
766 | GATE_SCLK_LCD, 1, CLK_SET_RATE_PARENT, 0), | ||
767 | GATE(CLK_SCLK_FIMD0, "sclk_fimd0", "div_fimd0", | ||
768 | GATE_SCLK_LCD, 0, CLK_SET_RATE_PARENT, 0), | ||
769 | |||
770 | /* GATE_SCLK_MAUDIO */ | ||
771 | GATE(CLK_SCLK_PCM0, "sclk_pcm0", "div_pcm0", | ||
772 | GATE_SCLK_MAUDIO, 1, CLK_SET_RATE_PARENT, 0), | ||
773 | GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_audio0", | ||
774 | GATE_SCLK_MAUDIO, 0, CLK_SET_RATE_PARENT, 0), | ||
775 | |||
776 | /* GATE_SCLK_FSYS */ | ||
777 | GATE(CLK_SCLK_TSADC, "sclk_tsadc", "div_tsadc_pre", | ||
778 | GATE_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0), | ||
779 | GATE(CLK_SCLK_EBI, "sclk_ebi", "div_ebi", | ||
780 | GATE_SCLK_FSYS, 6, CLK_SET_RATE_PARENT, 0), | ||
781 | GATE(CLK_SCLK_MMC2, "sclk_mmc2", "div_mmc2_pre", | ||
782 | GATE_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0), | ||
783 | GATE(CLK_SCLK_MMC1, "sclk_mmc1", "div_mmc1_pre", | ||
784 | GATE_SCLK_FSYS, 1, CLK_SET_RATE_PARENT, 0), | ||
785 | GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc0_pre", | ||
786 | GATE_SCLK_FSYS, 0, CLK_SET_RATE_PARENT, 0), | ||
787 | |||
788 | /* GATE_SCLK_PERIL */ | ||
789 | GATE(CLK_SCLK_I2S, "sclk_i2s1", "div_i2s1", | ||
790 | GATE_SCLK_PERIL, 18, CLK_SET_RATE_PARENT, 0), | ||
791 | GATE(CLK_SCLK_PCM2, "sclk_pcm2", "div_pcm2", | ||
792 | GATE_SCLK_PERIL, 16, CLK_SET_RATE_PARENT, 0), | ||
793 | GATE(CLK_SCLK_PCM1, "sclk_pcm1", "div_pcm1", | ||
794 | GATE_SCLK_PERIL, 15, CLK_SET_RATE_PARENT, 0), | ||
795 | GATE(CLK_SCLK_AUDIO2, "sclk_audio2", "div_audio2", | ||
796 | GATE_SCLK_PERIL, 14, CLK_SET_RATE_PARENT, 0), | ||
797 | GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_audio1", | ||
798 | GATE_SCLK_PERIL, 13, CLK_SET_RATE_PARENT, 0), | ||
799 | GATE(CLK_SCLK_SPDIF, "sclk_spdif", "mout_spdif", | ||
800 | GATE_SCLK_PERIL, 10, CLK_SET_RATE_PARENT, 0), | ||
801 | GATE(CLK_SCLK_SPI2, "sclk_spi2", "div_spi2_pre", | ||
802 | GATE_SCLK_PERIL, 8, CLK_SET_RATE_PARENT, 0), | ||
803 | GATE(CLK_SCLK_SPI1, "sclk_spi1", "div_spi1_pre", | ||
804 | GATE_SCLK_PERIL, 7, CLK_SET_RATE_PARENT, 0), | ||
805 | GATE(CLK_SCLK_SPI0, "sclk_spi0", "div_spi0_pre", | ||
806 | GATE_SCLK_PERIL, 6, CLK_SET_RATE_PARENT, 0), | ||
807 | GATE(CLK_SCLK_UART3, "sclk_uart3", "div_uart3", | ||
808 | GATE_SCLK_PERIL, 3, CLK_SET_RATE_PARENT, 0), | ||
809 | GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2", | ||
810 | GATE_SCLK_PERIL, 2, CLK_SET_RATE_PARENT, 0), | ||
811 | GATE(CLK_SCLK_UART1, "sclk_uart1", "div_uart1", | ||
812 | GATE_SCLK_PERIL, 1, CLK_SET_RATE_PARENT, 0), | ||
813 | GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0", | ||
814 | GATE_SCLK_PERIL, 0, CLK_SET_RATE_PARENT, 0), | ||
815 | |||
816 | /* GATE_IP_CAM */ | ||
817 | GATE(CLK_SMMUFIMC_LITE2, "smmufimc_lite2", "div_aclk_160", GATE_IP_CAM, | ||
818 | 22, CLK_IGNORE_UNUSED, 0), | ||
819 | GATE(CLK_FIMC_LITE2, "fimc_lite2", "div_aclk_160", GATE_IP_CAM, | ||
820 | 20, CLK_IGNORE_UNUSED, 0), | ||
821 | GATE(CLK_PIXELASYNCM1, "pixelasyncm1", "div_aclk_160", GATE_IP_CAM, | ||
822 | 18, CLK_IGNORE_UNUSED, 0), | ||
823 | GATE(CLK_PIXELASYNCM0, "pixelasyncm0", "div_aclk_160", GATE_IP_CAM, | ||
824 | 17, CLK_IGNORE_UNUSED, 0), | ||
825 | GATE(CLK_PPMUCAMIF, "ppmucamif", "div_aclk_160", GATE_IP_CAM, | ||
826 | 16, CLK_IGNORE_UNUSED, 0), | ||
827 | GATE(CLK_SMMUJPEG, "smmujpeg", "div_aclk_160", GATE_IP_CAM, 11, 0, 0), | ||
828 | GATE(CLK_SMMUFIMC3, "smmufimc3", "div_aclk_160", GATE_IP_CAM, 10, 0, 0), | ||
829 | GATE(CLK_SMMUFIMC2, "smmufimc2", "div_aclk_160", GATE_IP_CAM, 9, 0, 0), | ||
830 | GATE(CLK_SMMUFIMC1, "smmufimc1", "div_aclk_160", GATE_IP_CAM, 8, 0, 0), | ||
831 | GATE(CLK_SMMUFIMC0, "smmufimc0", "div_aclk_160", GATE_IP_CAM, 7, 0, 0), | ||
832 | GATE(CLK_JPEG, "jpeg", "div_aclk_160", GATE_IP_CAM, 6, 0, 0), | ||
833 | GATE(CLK_CSIS1, "csis1", "div_aclk_160", GATE_IP_CAM, 5, 0, 0), | ||
834 | GATE(CLK_CSIS0, "csis0", "div_aclk_160", GATE_IP_CAM, 4, 0, 0), | ||
835 | GATE(CLK_FIMC3, "fimc3", "div_aclk_160", GATE_IP_CAM, 3, 0, 0), | ||
836 | GATE(CLK_FIMC2, "fimc2", "div_aclk_160", GATE_IP_CAM, 2, 0, 0), | ||
837 | GATE(CLK_FIMC1, "fimc1", "div_aclk_160", GATE_IP_CAM, 1, 0, 0), | ||
838 | GATE(CLK_FIMC0, "fimc0", "div_aclk_160", GATE_IP_CAM, 0, 0, 0), | ||
839 | |||
840 | /* GATE_IP_TV */ | ||
841 | GATE(CLK_PPMUTV, "ppmutv", "div_aclk_100", GATE_IP_TV, 5, 0, 0), | ||
842 | GATE(CLK_SMMUTV, "smmutv", "div_aclk_100", GATE_IP_TV, 4, 0, 0), | ||
843 | GATE(CLK_HDMI, "hdmi", "div_aclk_100", GATE_IP_TV, 3, 0, 0), | ||
844 | GATE(CLK_MIXER, "mixer", "div_aclk_100", GATE_IP_TV, 1, 0, 0), | ||
845 | GATE(CLK_VP, "vp", "div_aclk_100", GATE_IP_TV, 0, 0, 0), | ||
846 | |||
847 | /* GATE_IP_MFC */ | ||
848 | GATE(CLK_PPMUMFC_R, "ppmumfc_r", "div_aclk_200", GATE_IP_MFC, 4, | ||
849 | CLK_IGNORE_UNUSED, 0), | ||
850 | GATE(CLK_PPMUMFC_L, "ppmumfc_l", "div_aclk_200", GATE_IP_MFC, 3, | ||
851 | CLK_IGNORE_UNUSED, 0), | ||
852 | GATE(CLK_SMMUMFC_R, "smmumfc_r", "div_aclk_200", GATE_IP_MFC, 2, 0, 0), | ||
853 | GATE(CLK_SMMUMFC_L, "smmumfc_l", "div_aclk_200", GATE_IP_MFC, 1, 0, 0), | ||
854 | GATE(CLK_MFC, "mfc", "div_aclk_200", GATE_IP_MFC, 0, 0, 0), | ||
855 | |||
856 | /* GATE_IP_G3D */ | ||
857 | GATE(CLK_PPMUG3D, "ppmug3d", "div_aclk_200", GATE_IP_G3D, 1, | ||
858 | CLK_IGNORE_UNUSED, 0), | ||
859 | GATE(CLK_G3D, "g3d", "div_aclk_200", GATE_IP_G3D, 0, 0, 0), | ||
860 | |||
861 | /* GATE_IP_LCD */ | ||
862 | GATE(CLK_PPMULCD0, "ppmulcd0", "div_aclk_160", GATE_IP_LCD, 5, | ||
863 | CLK_IGNORE_UNUSED, 0), | ||
864 | GATE(CLK_SMMUFIMD0, "smmufimd0", "div_aclk_160", GATE_IP_LCD, 4, 0, 0), | ||
865 | GATE(CLK_DSIM0, "dsim0", "div_aclk_160", GATE_IP_LCD, 3, 0, 0), | ||
866 | GATE(CLK_SMIES, "smies", "div_aclk_160", GATE_IP_LCD, 2, 0, 0), | ||
867 | GATE(CLK_MIE0, "mie0", "div_aclk_160", GATE_IP_LCD, 1, 0, 0), | ||
868 | GATE(CLK_FIMD0, "fimd0", "div_aclk_160", GATE_IP_LCD, 0, 0, 0), | ||
869 | |||
870 | /* GATE_IP_FSYS */ | ||
871 | GATE(CLK_TSADC, "tsadc", "div_aclk_200", GATE_IP_FSYS, 20, 0, 0), | ||
872 | GATE(CLK_PPMUFILE, "ppmufile", "div_aclk_200", GATE_IP_FSYS, 17, | ||
873 | CLK_IGNORE_UNUSED, 0), | ||
874 | GATE(CLK_NFCON, "nfcon", "div_aclk_200", GATE_IP_FSYS, 16, 0, 0), | ||
875 | GATE(CLK_USBDEVICE, "usbdevice", "div_aclk_200", GATE_IP_FSYS, 13, | ||
876 | 0, 0), | ||
877 | GATE(CLK_USBHOST, "usbhost", "div_aclk_200", GATE_IP_FSYS, 12, 0, 0), | ||
878 | GATE(CLK_SROMC, "sromc", "div_aclk_200", GATE_IP_FSYS, 11, 0, 0), | ||
879 | GATE(CLK_SDMMC2, "sdmmc2", "div_aclk_200", GATE_IP_FSYS, 7, 0, 0), | ||
880 | GATE(CLK_SDMMC1, "sdmmc1", "div_aclk_200", GATE_IP_FSYS, 6, 0, 0), | ||
881 | GATE(CLK_SDMMC0, "sdmmc0", "div_aclk_200", GATE_IP_FSYS, 5, 0, 0), | ||
882 | GATE(CLK_PDMA1, "pdma1", "div_aclk_200", GATE_IP_FSYS, 1, 0, 0), | ||
883 | GATE(CLK_PDMA0, "pdma0", "div_aclk_200", GATE_IP_FSYS, 0, 0, 0), | ||
884 | |||
885 | /* GATE_IP_PERIL */ | ||
886 | GATE(CLK_SPDIF, "spdif", "div_aclk_100", GATE_IP_PERIL, 26, 0, 0), | ||
887 | GATE(CLK_PWM, "pwm", "div_aclk_100", GATE_IP_PERIL, 24, 0, 0), | ||
888 | GATE(CLK_PCM2, "pcm2", "div_aclk_100", GATE_IP_PERIL, 23, 0, 0), | ||
889 | GATE(CLK_PCM1, "pcm1", "div_aclk_100", GATE_IP_PERIL, 22, 0, 0), | ||
890 | GATE(CLK_I2S1, "i2s1", "div_aclk_100", GATE_IP_PERIL, 20, 0, 0), | ||
891 | GATE(CLK_SPI2, "spi2", "div_aclk_100", GATE_IP_PERIL, 18, 0, 0), | ||
892 | GATE(CLK_SPI1, "spi1", "div_aclk_100", GATE_IP_PERIL, 17, 0, 0), | ||
893 | GATE(CLK_SPI0, "spi0", "div_aclk_100", GATE_IP_PERIL, 16, 0, 0), | ||
894 | GATE(CLK_I2CHDMI, "i2chdmi", "div_aclk_100", GATE_IP_PERIL, 14, 0, 0), | ||
895 | GATE(CLK_I2C7, "i2c7", "div_aclk_100", GATE_IP_PERIL, 13, 0, 0), | ||
896 | GATE(CLK_I2C6, "i2c6", "div_aclk_100", GATE_IP_PERIL, 12, 0, 0), | ||
897 | GATE(CLK_I2C5, "i2c5", "div_aclk_100", GATE_IP_PERIL, 11, 0, 0), | ||
898 | GATE(CLK_I2C4, "i2c4", "div_aclk_100", GATE_IP_PERIL, 10, 0, 0), | ||
899 | GATE(CLK_I2C3, "i2c3", "div_aclk_100", GATE_IP_PERIL, 9, 0, 0), | ||
900 | GATE(CLK_I2C2, "i2c2", "div_aclk_100", GATE_IP_PERIL, 8, 0, 0), | ||
901 | GATE(CLK_I2C1, "i2c1", "div_aclk_100", GATE_IP_PERIL, 7, 0, 0), | ||
902 | GATE(CLK_I2C0, "i2c0", "div_aclk_100", GATE_IP_PERIL, 6, 0, 0), | ||
903 | GATE(CLK_UART3, "uart3", "div_aclk_100", GATE_IP_PERIL, 3, 0, 0), | ||
904 | GATE(CLK_UART2, "uart2", "div_aclk_100", GATE_IP_PERIL, 2, 0, 0), | ||
905 | GATE(CLK_UART1, "uart1", "div_aclk_100", GATE_IP_PERIL, 1, 0, 0), | ||
906 | GATE(CLK_UART0, "uart0", "div_aclk_100", GATE_IP_PERIL, 0, 0, 0), | ||
907 | }; | ||
908 | |||
909 | /* | ||
910 | * APLL & MPLL & BPLL & ISP_PLL & DISP_PLL & G3D_PLL | ||
911 | */ | ||
912 | static struct samsung_pll_rate_table exynos4415_pll_rates[] = { | ||
913 | PLL_35XX_RATE(1600000000, 400, 3, 1), | ||
914 | PLL_35XX_RATE(1500000000, 250, 2, 1), | ||
915 | PLL_35XX_RATE(1400000000, 175, 3, 0), | ||
916 | PLL_35XX_RATE(1300000000, 325, 3, 1), | ||
917 | PLL_35XX_RATE(1200000000, 400, 4, 1), | ||
918 | PLL_35XX_RATE(1100000000, 275, 3, 1), | ||
919 | PLL_35XX_RATE(1066000000, 533, 6, 1), | ||
920 | PLL_35XX_RATE(1000000000, 250, 3, 1), | ||
921 | PLL_35XX_RATE(960000000, 320, 4, 1), | ||
922 | PLL_35XX_RATE(900000000, 300, 4, 1), | ||
923 | PLL_35XX_RATE(850000000, 425, 6, 1), | ||
924 | PLL_35XX_RATE(800000000, 200, 3, 1), | ||
925 | PLL_35XX_RATE(700000000, 175, 3, 1), | ||
926 | PLL_35XX_RATE(667000000, 667, 12, 1), | ||
927 | PLL_35XX_RATE(600000000, 400, 4, 2), | ||
928 | PLL_35XX_RATE(550000000, 275, 3, 2), | ||
929 | PLL_35XX_RATE(533000000, 533, 6, 2), | ||
930 | PLL_35XX_RATE(520000000, 260, 3, 2), | ||
931 | PLL_35XX_RATE(500000000, 250, 3, 2), | ||
932 | PLL_35XX_RATE(440000000, 220, 3, 2), | ||
933 | PLL_35XX_RATE(400000000, 200, 3, 2), | ||
934 | PLL_35XX_RATE(350000000, 175, 3, 2), | ||
935 | PLL_35XX_RATE(300000000, 300, 3, 3), | ||
936 | PLL_35XX_RATE(266000000, 266, 3, 3), | ||
937 | PLL_35XX_RATE(200000000, 200, 3, 3), | ||
938 | PLL_35XX_RATE(160000000, 160, 3, 3), | ||
939 | PLL_35XX_RATE(100000000, 200, 3, 4), | ||
940 | { /* sentinel */ } | ||
941 | }; | ||
942 | |||
943 | /* EPLL */ | ||
944 | static struct samsung_pll_rate_table exynos4415_epll_rates[] = { | ||
945 | PLL_36XX_RATE(800000000, 200, 3, 1, 0), | ||
946 | PLL_36XX_RATE(288000000, 96, 2, 2, 0), | ||
947 | PLL_36XX_RATE(192000000, 128, 2, 3, 0), | ||
948 | PLL_36XX_RATE(144000000, 96, 2, 3, 0), | ||
949 | PLL_36XX_RATE(96000000, 128, 2, 4, 0), | ||
950 | PLL_36XX_RATE(84000000, 112, 2, 4, 0), | ||
951 | PLL_36XX_RATE(80750011, 107, 2, 4, 43691), | ||
952 | PLL_36XX_RATE(73728004, 98, 2, 4, 19923), | ||
953 | PLL_36XX_RATE(67987602, 271, 3, 5, 62285), | ||
954 | PLL_36XX_RATE(65911004, 175, 2, 5, 49982), | ||
955 | PLL_36XX_RATE(50000000, 200, 3, 5, 0), | ||
956 | PLL_36XX_RATE(49152003, 131, 2, 5, 4719), | ||
957 | PLL_36XX_RATE(48000000, 128, 2, 5, 0), | ||
958 | PLL_36XX_RATE(45250000, 181, 3, 5, 0), | ||
959 | { /* sentinel */ } | ||
960 | }; | ||
961 | |||
962 | static struct samsung_pll_clock exynos4415_plls[nr_plls] __initdata = { | ||
963 | [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", | ||
964 | APLL_LOCK, APLL_CON0, NULL), | ||
965 | [epll] = PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll", | ||
966 | EPLL_LOCK, EPLL_CON0, NULL), | ||
967 | [g3d_pll] = PLL(pll_35xx, CLK_FOUT_G3D_PLL, "fout_g3d_pll", | ||
968 | "mout_g3d_pllsrc", G3D_PLL_LOCK, G3D_PLL_CON0, NULL), | ||
969 | [isp_pll] = PLL(pll_35xx, CLK_FOUT_ISP_PLL, "fout_isp_pll", "fin_pll", | ||
970 | ISP_PLL_LOCK, ISP_PLL_CON0, NULL), | ||
971 | [disp_pll] = PLL(pll_35xx, CLK_FOUT_DISP_PLL, "fout_disp_pll", | ||
972 | "fin_pll", DISP_PLL_LOCK, DISP_PLL_CON0, NULL), | ||
973 | }; | ||
974 | |||
975 | static void __init exynos4415_cmu_init(struct device_node *np) | ||
976 | { | ||
977 | void __iomem *reg_base; | ||
978 | |||
979 | reg_base = of_iomap(np, 0); | ||
980 | if (!reg_base) | ||
981 | panic("%s: failed to map registers\n", __func__); | ||
982 | |||
983 | exynos4415_ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS); | ||
984 | if (!exynos4415_ctx) | ||
985 | panic("%s: unable to allocate context.\n", __func__); | ||
986 | |||
987 | exynos4415_plls[apll].rate_table = exynos4415_pll_rates; | ||
988 | exynos4415_plls[epll].rate_table = exynos4415_epll_rates; | ||
989 | exynos4415_plls[g3d_pll].rate_table = exynos4415_pll_rates; | ||
990 | exynos4415_plls[isp_pll].rate_table = exynos4415_pll_rates; | ||
991 | exynos4415_plls[disp_pll].rate_table = exynos4415_pll_rates; | ||
992 | |||
993 | samsung_clk_register_fixed_factor(exynos4415_ctx, | ||
994 | exynos4415_fixed_factor_clks, | ||
995 | ARRAY_SIZE(exynos4415_fixed_factor_clks)); | ||
996 | samsung_clk_register_fixed_rate(exynos4415_ctx, | ||
997 | exynos4415_fixed_rate_clks, | ||
998 | ARRAY_SIZE(exynos4415_fixed_rate_clks)); | ||
999 | |||
1000 | samsung_clk_register_pll(exynos4415_ctx, exynos4415_plls, | ||
1001 | ARRAY_SIZE(exynos4415_plls), reg_base); | ||
1002 | samsung_clk_register_mux(exynos4415_ctx, exynos4415_mux_clks, | ||
1003 | ARRAY_SIZE(exynos4415_mux_clks)); | ||
1004 | samsung_clk_register_div(exynos4415_ctx, exynos4415_div_clks, | ||
1005 | ARRAY_SIZE(exynos4415_div_clks)); | ||
1006 | samsung_clk_register_gate(exynos4415_ctx, exynos4415_gate_clks, | ||
1007 | ARRAY_SIZE(exynos4415_gate_clks)); | ||
1008 | |||
1009 | exynos4415_clk_sleep_init(); | ||
1010 | |||
1011 | samsung_clk_of_add_provider(np, exynos4415_ctx); | ||
1012 | } | ||
1013 | CLK_OF_DECLARE(exynos4415_cmu, "samsung,exynos4415-cmu", exynos4415_cmu_init); | ||
1014 | |||
1015 | /* | ||
1016 | * CMU DMC | ||
1017 | */ | ||
1018 | |||
1019 | #define MPLL_LOCK 0x008 | ||
1020 | #define MPLL_CON0 0x108 | ||
1021 | #define MPLL_CON1 0x10c | ||
1022 | #define MPLL_CON2 0x110 | ||
1023 | #define BPLL_LOCK 0x118 | ||
1024 | #define BPLL_CON0 0x218 | ||
1025 | #define BPLL_CON1 0x21c | ||
1026 | #define BPLL_CON2 0x220 | ||
1027 | #define SRC_DMC 0x300 | ||
1028 | #define DIV_DMC1 0x504 | ||
1029 | |||
1030 | enum exynos4415_dmc_plls { | ||
1031 | mpll, bpll, | ||
1032 | nr_dmc_plls, | ||
1033 | }; | ||
1034 | |||
1035 | static struct samsung_clk_provider *exynos4415_dmc_ctx; | ||
1036 | |||
1037 | #ifdef CONFIG_PM_SLEEP | ||
1038 | static struct samsung_clk_reg_dump *exynos4415_dmc_clk_regs; | ||
1039 | |||
1040 | static unsigned long exynos4415_cmu_dmc_clk_regs[] __initdata = { | ||
1041 | MPLL_LOCK, | ||
1042 | MPLL_CON0, | ||
1043 | MPLL_CON1, | ||
1044 | MPLL_CON2, | ||
1045 | BPLL_LOCK, | ||
1046 | BPLL_CON0, | ||
1047 | BPLL_CON1, | ||
1048 | BPLL_CON2, | ||
1049 | SRC_DMC, | ||
1050 | DIV_DMC1, | ||
1051 | }; | ||
1052 | |||
1053 | static int exynos4415_dmc_clk_suspend(void) | ||
1054 | { | ||
1055 | samsung_clk_save(exynos4415_dmc_ctx->reg_base, | ||
1056 | exynos4415_dmc_clk_regs, | ||
1057 | ARRAY_SIZE(exynos4415_cmu_dmc_clk_regs)); | ||
1058 | return 0; | ||
1059 | } | ||
1060 | |||
1061 | static void exynos4415_dmc_clk_resume(void) | ||
1062 | { | ||
1063 | samsung_clk_restore(exynos4415_dmc_ctx->reg_base, | ||
1064 | exynos4415_dmc_clk_regs, | ||
1065 | ARRAY_SIZE(exynos4415_cmu_dmc_clk_regs)); | ||
1066 | } | ||
1067 | |||
1068 | static struct syscore_ops exynos4415_dmc_clk_syscore_ops = { | ||
1069 | .suspend = exynos4415_dmc_clk_suspend, | ||
1070 | .resume = exynos4415_dmc_clk_resume, | ||
1071 | }; | ||
1072 | |||
1073 | static void exynos4415_dmc_clk_sleep_init(void) | ||
1074 | { | ||
1075 | exynos4415_dmc_clk_regs = | ||
1076 | samsung_clk_alloc_reg_dump(exynos4415_cmu_dmc_clk_regs, | ||
1077 | ARRAY_SIZE(exynos4415_cmu_dmc_clk_regs)); | ||
1078 | if (!exynos4415_dmc_clk_regs) { | ||
1079 | pr_warn("%s: Failed to allocate sleep save data\n", __func__); | ||
1080 | return; | ||
1081 | } | ||
1082 | |||
1083 | register_syscore_ops(&exynos4415_dmc_clk_syscore_ops); | ||
1084 | } | ||
1085 | #else | ||
1086 | static inline void exynos4415_dmc_clk_sleep_init(void) { } | ||
1087 | #endif /* CONFIG_PM_SLEEP */ | ||
1088 | |||
1089 | PNAME(mout_mpll_p) = { "fin_pll", "fout_mpll", }; | ||
1090 | PNAME(mout_bpll_p) = { "fin_pll", "fout_bpll", }; | ||
1091 | PNAME(mbpll_p) = { "mout_mpll", "mout_bpll", }; | ||
1092 | |||
1093 | static struct samsung_mux_clock exynos4415_dmc_mux_clks[] __initdata = { | ||
1094 | MUX(CLK_DMC_MOUT_MPLL, "mout_mpll", mout_mpll_p, SRC_DMC, 12, 1), | ||
1095 | MUX(CLK_DMC_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_DMC, 10, 1), | ||
1096 | MUX(CLK_DMC_MOUT_DPHY, "mout_dphy", mbpll_p, SRC_DMC, 8, 1), | ||
1097 | MUX(CLK_DMC_MOUT_DMC_BUS, "mout_dmc_bus", mbpll_p, SRC_DMC, 4, 1), | ||
1098 | }; | ||
1099 | |||
1100 | static struct samsung_div_clock exynos4415_dmc_div_clks[] __initdata = { | ||
1101 | DIV(CLK_DMC_DIV_DMC, "div_dmc", "div_dmc_pre", DIV_DMC1, 27, 3), | ||
1102 | DIV(CLK_DMC_DIV_DPHY, "div_dphy", "mout_dphy", DIV_DMC1, 23, 3), | ||
1103 | DIV(CLK_DMC_DIV_DMC_PRE, "div_dmc_pre", "mout_dmc_bus", | ||
1104 | DIV_DMC1, 19, 2), | ||
1105 | DIV(CLK_DMC_DIV_DMCP, "div_dmcp", "div_dmcd", DIV_DMC1, 15, 3), | ||
1106 | DIV(CLK_DMC_DIV_DMCD, "div_dmcd", "div_dmc", DIV_DMC1, 11, 3), | ||
1107 | DIV(CLK_DMC_DIV_MPLL_PRE, "div_mpll_pre", "mout_mpll", DIV_DMC1, 8, 2), | ||
1108 | }; | ||
1109 | |||
1110 | static struct samsung_pll_clock exynos4415_dmc_plls[nr_dmc_plls] __initdata = { | ||
1111 | [mpll] = PLL(pll_35xx, CLK_DMC_FOUT_MPLL, "fout_mpll", "fin_pll", | ||
1112 | MPLL_LOCK, MPLL_CON0, NULL), | ||
1113 | [bpll] = PLL(pll_35xx, CLK_DMC_FOUT_BPLL, "fout_bpll", "fin_pll", | ||
1114 | BPLL_LOCK, BPLL_CON0, NULL), | ||
1115 | }; | ||
1116 | |||
1117 | static void __init exynos4415_cmu_dmc_init(struct device_node *np) | ||
1118 | { | ||
1119 | void __iomem *reg_base; | ||
1120 | |||
1121 | reg_base = of_iomap(np, 0); | ||
1122 | if (!reg_base) | ||
1123 | panic("%s: failed to map registers\n", __func__); | ||
1124 | |||
1125 | exynos4415_dmc_ctx = samsung_clk_init(np, reg_base, NR_CLKS_DMC); | ||
1126 | if (!exynos4415_dmc_ctx) | ||
1127 | panic("%s: unable to allocate context.\n", __func__); | ||
1128 | |||
1129 | exynos4415_dmc_plls[mpll].rate_table = exynos4415_pll_rates; | ||
1130 | exynos4415_dmc_plls[bpll].rate_table = exynos4415_pll_rates; | ||
1131 | |||
1132 | samsung_clk_register_pll(exynos4415_dmc_ctx, exynos4415_dmc_plls, | ||
1133 | ARRAY_SIZE(exynos4415_dmc_plls), reg_base); | ||
1134 | samsung_clk_register_mux(exynos4415_dmc_ctx, exynos4415_dmc_mux_clks, | ||
1135 | ARRAY_SIZE(exynos4415_dmc_mux_clks)); | ||
1136 | samsung_clk_register_div(exynos4415_dmc_ctx, exynos4415_dmc_div_clks, | ||
1137 | ARRAY_SIZE(exynos4415_dmc_div_clks)); | ||
1138 | |||
1139 | exynos4415_dmc_clk_sleep_init(); | ||
1140 | |||
1141 | samsung_clk_of_add_provider(np, exynos4415_dmc_ctx); | ||
1142 | } | ||
1143 | CLK_OF_DECLARE(exynos4415_cmu_dmc, "samsung,exynos4415-cmu-dmc", | ||
1144 | exynos4415_cmu_dmc_init); | ||
diff --git a/drivers/clk/samsung/clk-exynos5260.c b/drivers/clk/samsung/clk-exynos5260.c index 2527e39aadcf..e2e5193d1049 100644 --- a/drivers/clk/samsung/clk-exynos5260.c +++ b/drivers/clk/samsung/clk-exynos5260.c | |||
@@ -11,10 +11,8 @@ | |||
11 | 11 | ||
12 | #include <linux/clk.h> | 12 | #include <linux/clk.h> |
13 | #include <linux/clkdev.h> | 13 | #include <linux/clkdev.h> |
14 | #include <linux/clk-provider.h> | ||
15 | #include <linux/of.h> | 14 | #include <linux/of.h> |
16 | #include <linux/of_address.h> | 15 | #include <linux/of_address.h> |
17 | #include <linux/syscore_ops.h> | ||
18 | 16 | ||
19 | #include "clk-exynos5260.h" | 17 | #include "clk-exynos5260.h" |
20 | #include "clk.h" | 18 | #include "clk.h" |
@@ -22,39 +20,6 @@ | |||
22 | 20 | ||
23 | #include <dt-bindings/clock/exynos5260-clk.h> | 21 | #include <dt-bindings/clock/exynos5260-clk.h> |
24 | 22 | ||
25 | static LIST_HEAD(clock_reg_cache_list); | ||
26 | |||
27 | struct exynos5260_clock_reg_cache { | ||
28 | struct list_head node; | ||
29 | void __iomem *reg_base; | ||
30 | struct samsung_clk_reg_dump *rdump; | ||
31 | unsigned int rd_num; | ||
32 | }; | ||
33 | |||
34 | struct exynos5260_cmu_info { | ||
35 | /* list of pll clocks and respective count */ | ||
36 | struct samsung_pll_clock *pll_clks; | ||
37 | unsigned int nr_pll_clks; | ||
38 | /* list of mux clocks and respective count */ | ||
39 | struct samsung_mux_clock *mux_clks; | ||
40 | unsigned int nr_mux_clks; | ||
41 | /* list of div clocks and respective count */ | ||
42 | struct samsung_div_clock *div_clks; | ||
43 | unsigned int nr_div_clks; | ||
44 | /* list of gate clocks and respective count */ | ||
45 | struct samsung_gate_clock *gate_clks; | ||
46 | unsigned int nr_gate_clks; | ||
47 | /* list of fixed clocks and respective count */ | ||
48 | struct samsung_fixed_rate_clock *fixed_clks; | ||
49 | unsigned int nr_fixed_clks; | ||
50 | /* total number of clocks with IDs assigned*/ | ||
51 | unsigned int nr_clk_ids; | ||
52 | |||
53 | /* list and number of clocks registers */ | ||
54 | unsigned long *clk_regs; | ||
55 | unsigned int nr_clk_regs; | ||
56 | }; | ||
57 | |||
58 | /* | 23 | /* |
59 | * Applicable for all 2550 Type PLLS for Exynos5260, listed below | 24 | * Applicable for all 2550 Type PLLS for Exynos5260, listed below |
60 | * DISP_PLL, EGL_PLL, KFC_PLL, MEM_PLL, BUS_PLL, MEDIA_PLL, G3D_PLL. | 25 | * DISP_PLL, EGL_PLL, KFC_PLL, MEM_PLL, BUS_PLL, MEDIA_PLL, G3D_PLL. |
@@ -113,104 +78,6 @@ static struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initdata = { | |||
113 | PLL_36XX_RATE(66000000, 176, 2, 5, 0), | 78 | PLL_36XX_RATE(66000000, 176, 2, 5, 0), |
114 | }; | 79 | }; |
115 | 80 | ||
116 | #ifdef CONFIG_PM_SLEEP | ||
117 | |||
118 | static int exynos5260_clk_suspend(void) | ||
119 | { | ||
120 | struct exynos5260_clock_reg_cache *cache; | ||
121 | |||
122 | list_for_each_entry(cache, &clock_reg_cache_list, node) | ||
123 | samsung_clk_save(cache->reg_base, cache->rdump, | ||
124 | cache->rd_num); | ||
125 | |||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | static void exynos5260_clk_resume(void) | ||
130 | { | ||
131 | struct exynos5260_clock_reg_cache *cache; | ||
132 | |||
133 | list_for_each_entry(cache, &clock_reg_cache_list, node) | ||
134 | samsung_clk_restore(cache->reg_base, cache->rdump, | ||
135 | cache->rd_num); | ||
136 | } | ||
137 | |||
138 | static struct syscore_ops exynos5260_clk_syscore_ops = { | ||
139 | .suspend = exynos5260_clk_suspend, | ||
140 | .resume = exynos5260_clk_resume, | ||
141 | }; | ||
142 | |||
143 | static void exynos5260_clk_sleep_init(void __iomem *reg_base, | ||
144 | unsigned long *rdump, | ||
145 | unsigned long nr_rdump) | ||
146 | { | ||
147 | struct exynos5260_clock_reg_cache *reg_cache; | ||
148 | |||
149 | reg_cache = kzalloc(sizeof(struct exynos5260_clock_reg_cache), | ||
150 | GFP_KERNEL); | ||
151 | if (!reg_cache) | ||
152 | panic("could not allocate register cache.\n"); | ||
153 | |||
154 | reg_cache->rdump = samsung_clk_alloc_reg_dump(rdump, nr_rdump); | ||
155 | |||
156 | if (!reg_cache->rdump) | ||
157 | panic("could not allocate register dump storage.\n"); | ||
158 | |||
159 | if (list_empty(&clock_reg_cache_list)) | ||
160 | register_syscore_ops(&exynos5260_clk_syscore_ops); | ||
161 | |||
162 | reg_cache->rd_num = nr_rdump; | ||
163 | reg_cache->reg_base = reg_base; | ||
164 | list_add_tail(®_cache->node, &clock_reg_cache_list); | ||
165 | } | ||
166 | |||
167 | #else | ||
168 | static void exynos5260_clk_sleep_init(void __iomem *reg_base, | ||
169 | unsigned long *rdump, | ||
170 | unsigned long nr_rdump){} | ||
171 | #endif | ||
172 | |||
173 | /* | ||
174 | * Common function which registers plls, muxes, dividers and gates | ||
175 | * for each CMU. It also add CMU register list to register cache. | ||
176 | */ | ||
177 | |||
178 | void __init exynos5260_cmu_register_one(struct device_node *np, | ||
179 | struct exynos5260_cmu_info *cmu) | ||
180 | { | ||
181 | void __iomem *reg_base; | ||
182 | struct samsung_clk_provider *ctx; | ||
183 | |||
184 | reg_base = of_iomap(np, 0); | ||
185 | if (!reg_base) | ||
186 | panic("%s: failed to map registers\n", __func__); | ||
187 | |||
188 | ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); | ||
189 | if (!ctx) | ||
190 | panic("%s: unable to alllocate ctx\n", __func__); | ||
191 | |||
192 | if (cmu->pll_clks) | ||
193 | samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks, | ||
194 | reg_base); | ||
195 | if (cmu->mux_clks) | ||
196 | samsung_clk_register_mux(ctx, cmu->mux_clks, | ||
197 | cmu->nr_mux_clks); | ||
198 | if (cmu->div_clks) | ||
199 | samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks); | ||
200 | if (cmu->gate_clks) | ||
201 | samsung_clk_register_gate(ctx, cmu->gate_clks, | ||
202 | cmu->nr_gate_clks); | ||
203 | if (cmu->fixed_clks) | ||
204 | samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks, | ||
205 | cmu->nr_fixed_clks); | ||
206 | if (cmu->clk_regs) | ||
207 | exynos5260_clk_sleep_init(reg_base, cmu->clk_regs, | ||
208 | cmu->nr_clk_regs); | ||
209 | |||
210 | samsung_clk_of_add_provider(np, ctx); | ||
211 | } | ||
212 | |||
213 | |||
214 | /* CMU_AUD */ | 81 | /* CMU_AUD */ |
215 | 82 | ||
216 | static unsigned long aud_clk_regs[] __initdata = { | 83 | static unsigned long aud_clk_regs[] __initdata = { |
@@ -268,7 +135,7 @@ struct samsung_gate_clock aud_gate_clks[] __initdata = { | |||
268 | 135 | ||
269 | static void __init exynos5260_clk_aud_init(struct device_node *np) | 136 | static void __init exynos5260_clk_aud_init(struct device_node *np) |
270 | { | 137 | { |
271 | struct exynos5260_cmu_info cmu = {0}; | 138 | struct samsung_cmu_info cmu = {0}; |
272 | 139 | ||
273 | cmu.mux_clks = aud_mux_clks; | 140 | cmu.mux_clks = aud_mux_clks; |
274 | cmu.nr_mux_clks = ARRAY_SIZE(aud_mux_clks); | 141 | cmu.nr_mux_clks = ARRAY_SIZE(aud_mux_clks); |
@@ -280,7 +147,7 @@ static void __init exynos5260_clk_aud_init(struct device_node *np) | |||
280 | cmu.clk_regs = aud_clk_regs; | 147 | cmu.clk_regs = aud_clk_regs; |
281 | cmu.nr_clk_regs = ARRAY_SIZE(aud_clk_regs); | 148 | cmu.nr_clk_regs = ARRAY_SIZE(aud_clk_regs); |
282 | 149 | ||
283 | exynos5260_cmu_register_one(np, &cmu); | 150 | samsung_cmu_register_one(np, &cmu); |
284 | } | 151 | } |
285 | 152 | ||
286 | CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud", | 153 | CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud", |
@@ -458,7 +325,7 @@ struct samsung_gate_clock disp_gate_clks[] __initdata = { | |||
458 | 325 | ||
459 | static void __init exynos5260_clk_disp_init(struct device_node *np) | 326 | static void __init exynos5260_clk_disp_init(struct device_node *np) |
460 | { | 327 | { |
461 | struct exynos5260_cmu_info cmu = {0}; | 328 | struct samsung_cmu_info cmu = {0}; |
462 | 329 | ||
463 | cmu.mux_clks = disp_mux_clks; | 330 | cmu.mux_clks = disp_mux_clks; |
464 | cmu.nr_mux_clks = ARRAY_SIZE(disp_mux_clks); | 331 | cmu.nr_mux_clks = ARRAY_SIZE(disp_mux_clks); |
@@ -470,7 +337,7 @@ static void __init exynos5260_clk_disp_init(struct device_node *np) | |||
470 | cmu.clk_regs = disp_clk_regs; | 337 | cmu.clk_regs = disp_clk_regs; |
471 | cmu.nr_clk_regs = ARRAY_SIZE(disp_clk_regs); | 338 | cmu.nr_clk_regs = ARRAY_SIZE(disp_clk_regs); |
472 | 339 | ||
473 | exynos5260_cmu_register_one(np, &cmu); | 340 | samsung_cmu_register_one(np, &cmu); |
474 | } | 341 | } |
475 | 342 | ||
476 | CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp", | 343 | CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp", |
@@ -522,7 +389,7 @@ static struct samsung_pll_clock egl_pll_clks[] __initdata = { | |||
522 | 389 | ||
523 | static void __init exynos5260_clk_egl_init(struct device_node *np) | 390 | static void __init exynos5260_clk_egl_init(struct device_node *np) |
524 | { | 391 | { |
525 | struct exynos5260_cmu_info cmu = {0}; | 392 | struct samsung_cmu_info cmu = {0}; |
526 | 393 | ||
527 | cmu.pll_clks = egl_pll_clks; | 394 | cmu.pll_clks = egl_pll_clks; |
528 | cmu.nr_pll_clks = ARRAY_SIZE(egl_pll_clks); | 395 | cmu.nr_pll_clks = ARRAY_SIZE(egl_pll_clks); |
@@ -534,7 +401,7 @@ static void __init exynos5260_clk_egl_init(struct device_node *np) | |||
534 | cmu.clk_regs = egl_clk_regs; | 401 | cmu.clk_regs = egl_clk_regs; |
535 | cmu.nr_clk_regs = ARRAY_SIZE(egl_clk_regs); | 402 | cmu.nr_clk_regs = ARRAY_SIZE(egl_clk_regs); |
536 | 403 | ||
537 | exynos5260_cmu_register_one(np, &cmu); | 404 | samsung_cmu_register_one(np, &cmu); |
538 | } | 405 | } |
539 | 406 | ||
540 | CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl", | 407 | CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl", |
@@ -624,7 +491,7 @@ struct samsung_gate_clock fsys_gate_clks[] __initdata = { | |||
624 | 491 | ||
625 | static void __init exynos5260_clk_fsys_init(struct device_node *np) | 492 | static void __init exynos5260_clk_fsys_init(struct device_node *np) |
626 | { | 493 | { |
627 | struct exynos5260_cmu_info cmu = {0}; | 494 | struct samsung_cmu_info cmu = {0}; |
628 | 495 | ||
629 | cmu.mux_clks = fsys_mux_clks; | 496 | cmu.mux_clks = fsys_mux_clks; |
630 | cmu.nr_mux_clks = ARRAY_SIZE(fsys_mux_clks); | 497 | cmu.nr_mux_clks = ARRAY_SIZE(fsys_mux_clks); |
@@ -634,7 +501,7 @@ static void __init exynos5260_clk_fsys_init(struct device_node *np) | |||
634 | cmu.clk_regs = fsys_clk_regs; | 501 | cmu.clk_regs = fsys_clk_regs; |
635 | cmu.nr_clk_regs = ARRAY_SIZE(fsys_clk_regs); | 502 | cmu.nr_clk_regs = ARRAY_SIZE(fsys_clk_regs); |
636 | 503 | ||
637 | exynos5260_cmu_register_one(np, &cmu); | 504 | samsung_cmu_register_one(np, &cmu); |
638 | } | 505 | } |
639 | 506 | ||
640 | CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys", | 507 | CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys", |
@@ -713,7 +580,7 @@ struct samsung_gate_clock g2d_gate_clks[] __initdata = { | |||
713 | 580 | ||
714 | static void __init exynos5260_clk_g2d_init(struct device_node *np) | 581 | static void __init exynos5260_clk_g2d_init(struct device_node *np) |
715 | { | 582 | { |
716 | struct exynos5260_cmu_info cmu = {0}; | 583 | struct samsung_cmu_info cmu = {0}; |
717 | 584 | ||
718 | cmu.mux_clks = g2d_mux_clks; | 585 | cmu.mux_clks = g2d_mux_clks; |
719 | cmu.nr_mux_clks = ARRAY_SIZE(g2d_mux_clks); | 586 | cmu.nr_mux_clks = ARRAY_SIZE(g2d_mux_clks); |
@@ -725,7 +592,7 @@ static void __init exynos5260_clk_g2d_init(struct device_node *np) | |||
725 | cmu.clk_regs = g2d_clk_regs; | 592 | cmu.clk_regs = g2d_clk_regs; |
726 | cmu.nr_clk_regs = ARRAY_SIZE(g2d_clk_regs); | 593 | cmu.nr_clk_regs = ARRAY_SIZE(g2d_clk_regs); |
727 | 594 | ||
728 | exynos5260_cmu_register_one(np, &cmu); | 595 | samsung_cmu_register_one(np, &cmu); |
729 | } | 596 | } |
730 | 597 | ||
731 | CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d", | 598 | CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d", |
@@ -774,7 +641,7 @@ static struct samsung_pll_clock g3d_pll_clks[] __initdata = { | |||
774 | 641 | ||
775 | static void __init exynos5260_clk_g3d_init(struct device_node *np) | 642 | static void __init exynos5260_clk_g3d_init(struct device_node *np) |
776 | { | 643 | { |
777 | struct exynos5260_cmu_info cmu = {0}; | 644 | struct samsung_cmu_info cmu = {0}; |
778 | 645 | ||
779 | cmu.pll_clks = g3d_pll_clks; | 646 | cmu.pll_clks = g3d_pll_clks; |
780 | cmu.nr_pll_clks = ARRAY_SIZE(g3d_pll_clks); | 647 | cmu.nr_pll_clks = ARRAY_SIZE(g3d_pll_clks); |
@@ -788,7 +655,7 @@ static void __init exynos5260_clk_g3d_init(struct device_node *np) | |||
788 | cmu.clk_regs = g3d_clk_regs; | 655 | cmu.clk_regs = g3d_clk_regs; |
789 | cmu.nr_clk_regs = ARRAY_SIZE(g3d_clk_regs); | 656 | cmu.nr_clk_regs = ARRAY_SIZE(g3d_clk_regs); |
790 | 657 | ||
791 | exynos5260_cmu_register_one(np, &cmu); | 658 | samsung_cmu_register_one(np, &cmu); |
792 | } | 659 | } |
793 | 660 | ||
794 | CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d", | 661 | CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d", |
@@ -909,7 +776,7 @@ struct samsung_gate_clock gscl_gate_clks[] __initdata = { | |||
909 | 776 | ||
910 | static void __init exynos5260_clk_gscl_init(struct device_node *np) | 777 | static void __init exynos5260_clk_gscl_init(struct device_node *np) |
911 | { | 778 | { |
912 | struct exynos5260_cmu_info cmu = {0}; | 779 | struct samsung_cmu_info cmu = {0}; |
913 | 780 | ||
914 | cmu.mux_clks = gscl_mux_clks; | 781 | cmu.mux_clks = gscl_mux_clks; |
915 | cmu.nr_mux_clks = ARRAY_SIZE(gscl_mux_clks); | 782 | cmu.nr_mux_clks = ARRAY_SIZE(gscl_mux_clks); |
@@ -921,7 +788,7 @@ static void __init exynos5260_clk_gscl_init(struct device_node *np) | |||
921 | cmu.clk_regs = gscl_clk_regs; | 788 | cmu.clk_regs = gscl_clk_regs; |
922 | cmu.nr_clk_regs = ARRAY_SIZE(gscl_clk_regs); | 789 | cmu.nr_clk_regs = ARRAY_SIZE(gscl_clk_regs); |
923 | 790 | ||
924 | exynos5260_cmu_register_one(np, &cmu); | 791 | samsung_cmu_register_one(np, &cmu); |
925 | } | 792 | } |
926 | 793 | ||
927 | CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl", | 794 | CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl", |
@@ -1028,7 +895,7 @@ struct samsung_gate_clock isp_gate_clks[] __initdata = { | |||
1028 | 895 | ||
1029 | static void __init exynos5260_clk_isp_init(struct device_node *np) | 896 | static void __init exynos5260_clk_isp_init(struct device_node *np) |
1030 | { | 897 | { |
1031 | struct exynos5260_cmu_info cmu = {0}; | 898 | struct samsung_cmu_info cmu = {0}; |
1032 | 899 | ||
1033 | cmu.mux_clks = isp_mux_clks; | 900 | cmu.mux_clks = isp_mux_clks; |
1034 | cmu.nr_mux_clks = ARRAY_SIZE(isp_mux_clks); | 901 | cmu.nr_mux_clks = ARRAY_SIZE(isp_mux_clks); |
@@ -1040,7 +907,7 @@ static void __init exynos5260_clk_isp_init(struct device_node *np) | |||
1040 | cmu.clk_regs = isp_clk_regs; | 907 | cmu.clk_regs = isp_clk_regs; |
1041 | cmu.nr_clk_regs = ARRAY_SIZE(isp_clk_regs); | 908 | cmu.nr_clk_regs = ARRAY_SIZE(isp_clk_regs); |
1042 | 909 | ||
1043 | exynos5260_cmu_register_one(np, &cmu); | 910 | samsung_cmu_register_one(np, &cmu); |
1044 | } | 911 | } |
1045 | 912 | ||
1046 | CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp", | 913 | CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp", |
@@ -1092,7 +959,7 @@ static struct samsung_pll_clock kfc_pll_clks[] __initdata = { | |||
1092 | 959 | ||
1093 | static void __init exynos5260_clk_kfc_init(struct device_node *np) | 960 | static void __init exynos5260_clk_kfc_init(struct device_node *np) |
1094 | { | 961 | { |
1095 | struct exynos5260_cmu_info cmu = {0}; | 962 | struct samsung_cmu_info cmu = {0}; |
1096 | 963 | ||
1097 | cmu.pll_clks = kfc_pll_clks; | 964 | cmu.pll_clks = kfc_pll_clks; |
1098 | cmu.nr_pll_clks = ARRAY_SIZE(kfc_pll_clks); | 965 | cmu.nr_pll_clks = ARRAY_SIZE(kfc_pll_clks); |
@@ -1104,7 +971,7 @@ static void __init exynos5260_clk_kfc_init(struct device_node *np) | |||
1104 | cmu.clk_regs = kfc_clk_regs; | 971 | cmu.clk_regs = kfc_clk_regs; |
1105 | cmu.nr_clk_regs = ARRAY_SIZE(kfc_clk_regs); | 972 | cmu.nr_clk_regs = ARRAY_SIZE(kfc_clk_regs); |
1106 | 973 | ||
1107 | exynos5260_cmu_register_one(np, &cmu); | 974 | samsung_cmu_register_one(np, &cmu); |
1108 | } | 975 | } |
1109 | 976 | ||
1110 | CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc", | 977 | CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc", |
@@ -1148,7 +1015,7 @@ struct samsung_gate_clock mfc_gate_clks[] __initdata = { | |||
1148 | 1015 | ||
1149 | static void __init exynos5260_clk_mfc_init(struct device_node *np) | 1016 | static void __init exynos5260_clk_mfc_init(struct device_node *np) |
1150 | { | 1017 | { |
1151 | struct exynos5260_cmu_info cmu = {0}; | 1018 | struct samsung_cmu_info cmu = {0}; |
1152 | 1019 | ||
1153 | cmu.mux_clks = mfc_mux_clks; | 1020 | cmu.mux_clks = mfc_mux_clks; |
1154 | cmu.nr_mux_clks = ARRAY_SIZE(mfc_mux_clks); | 1021 | cmu.nr_mux_clks = ARRAY_SIZE(mfc_mux_clks); |
@@ -1160,7 +1027,7 @@ static void __init exynos5260_clk_mfc_init(struct device_node *np) | |||
1160 | cmu.clk_regs = mfc_clk_regs; | 1027 | cmu.clk_regs = mfc_clk_regs; |
1161 | cmu.nr_clk_regs = ARRAY_SIZE(mfc_clk_regs); | 1028 | cmu.nr_clk_regs = ARRAY_SIZE(mfc_clk_regs); |
1162 | 1029 | ||
1163 | exynos5260_cmu_register_one(np, &cmu); | 1030 | samsung_cmu_register_one(np, &cmu); |
1164 | } | 1031 | } |
1165 | 1032 | ||
1166 | CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc", | 1033 | CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc", |
@@ -1295,7 +1162,7 @@ static struct samsung_pll_clock mif_pll_clks[] __initdata = { | |||
1295 | 1162 | ||
1296 | static void __init exynos5260_clk_mif_init(struct device_node *np) | 1163 | static void __init exynos5260_clk_mif_init(struct device_node *np) |
1297 | { | 1164 | { |
1298 | struct exynos5260_cmu_info cmu = {0}; | 1165 | struct samsung_cmu_info cmu = {0}; |
1299 | 1166 | ||
1300 | cmu.pll_clks = mif_pll_clks; | 1167 | cmu.pll_clks = mif_pll_clks; |
1301 | cmu.nr_pll_clks = ARRAY_SIZE(mif_pll_clks); | 1168 | cmu.nr_pll_clks = ARRAY_SIZE(mif_pll_clks); |
@@ -1309,7 +1176,7 @@ static void __init exynos5260_clk_mif_init(struct device_node *np) | |||
1309 | cmu.clk_regs = mif_clk_regs; | 1176 | cmu.clk_regs = mif_clk_regs; |
1310 | cmu.nr_clk_regs = ARRAY_SIZE(mif_clk_regs); | 1177 | cmu.nr_clk_regs = ARRAY_SIZE(mif_clk_regs); |
1311 | 1178 | ||
1312 | exynos5260_cmu_register_one(np, &cmu); | 1179 | samsung_cmu_register_one(np, &cmu); |
1313 | } | 1180 | } |
1314 | 1181 | ||
1315 | CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif", | 1182 | CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif", |
@@ -1503,7 +1370,7 @@ struct samsung_gate_clock peri_gate_clks[] __initdata = { | |||
1503 | 1370 | ||
1504 | static void __init exynos5260_clk_peri_init(struct device_node *np) | 1371 | static void __init exynos5260_clk_peri_init(struct device_node *np) |
1505 | { | 1372 | { |
1506 | struct exynos5260_cmu_info cmu = {0}; | 1373 | struct samsung_cmu_info cmu = {0}; |
1507 | 1374 | ||
1508 | cmu.mux_clks = peri_mux_clks; | 1375 | cmu.mux_clks = peri_mux_clks; |
1509 | cmu.nr_mux_clks = ARRAY_SIZE(peri_mux_clks); | 1376 | cmu.nr_mux_clks = ARRAY_SIZE(peri_mux_clks); |
@@ -1515,7 +1382,7 @@ static void __init exynos5260_clk_peri_init(struct device_node *np) | |||
1515 | cmu.clk_regs = peri_clk_regs; | 1382 | cmu.clk_regs = peri_clk_regs; |
1516 | cmu.nr_clk_regs = ARRAY_SIZE(peri_clk_regs); | 1383 | cmu.nr_clk_regs = ARRAY_SIZE(peri_clk_regs); |
1517 | 1384 | ||
1518 | exynos5260_cmu_register_one(np, &cmu); | 1385 | samsung_cmu_register_one(np, &cmu); |
1519 | } | 1386 | } |
1520 | 1387 | ||
1521 | CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri", | 1388 | CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri", |
@@ -1959,7 +1826,7 @@ static struct samsung_pll_clock top_pll_clks[] __initdata = { | |||
1959 | 1826 | ||
1960 | static void __init exynos5260_clk_top_init(struct device_node *np) | 1827 | static void __init exynos5260_clk_top_init(struct device_node *np) |
1961 | { | 1828 | { |
1962 | struct exynos5260_cmu_info cmu = {0}; | 1829 | struct samsung_cmu_info cmu = {0}; |
1963 | 1830 | ||
1964 | cmu.pll_clks = top_pll_clks; | 1831 | cmu.pll_clks = top_pll_clks; |
1965 | cmu.nr_pll_clks = ARRAY_SIZE(top_pll_clks); | 1832 | cmu.nr_pll_clks = ARRAY_SIZE(top_pll_clks); |
@@ -1975,7 +1842,7 @@ static void __init exynos5260_clk_top_init(struct device_node *np) | |||
1975 | cmu.clk_regs = top_clk_regs; | 1842 | cmu.clk_regs = top_clk_regs; |
1976 | cmu.nr_clk_regs = ARRAY_SIZE(top_clk_regs); | 1843 | cmu.nr_clk_regs = ARRAY_SIZE(top_clk_regs); |
1977 | 1844 | ||
1978 | exynos5260_cmu_register_one(np, &cmu); | 1845 | samsung_cmu_register_one(np, &cmu); |
1979 | } | 1846 | } |
1980 | 1847 | ||
1981 | CLK_OF_DECLARE(exynos5260_clk_top, "samsung,exynos5260-clock-top", | 1848 | CLK_OF_DECLARE(exynos5260_clk_top, "samsung,exynos5260-clock-top", |
diff --git a/drivers/clk/samsung/clk-exynos7.c b/drivers/clk/samsung/clk-exynos7.c new file mode 100644 index 000000000000..ea4483b8d62e --- /dev/null +++ b/drivers/clk/samsung/clk-exynos7.c | |||
@@ -0,0 +1,743 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Samsung Electronics Co., Ltd. | ||
3 | * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/clk.h> | ||
12 | #include <linux/clkdev.h> | ||
13 | #include <linux/clk-provider.h> | ||
14 | #include <linux/of.h> | ||
15 | |||
16 | #include "clk.h" | ||
17 | #include <dt-bindings/clock/exynos7-clk.h> | ||
18 | |||
19 | /* Register Offset definitions for CMU_TOPC (0x10570000) */ | ||
20 | #define CC_PLL_LOCK 0x0000 | ||
21 | #define BUS0_PLL_LOCK 0x0004 | ||
22 | #define BUS1_DPLL_LOCK 0x0008 | ||
23 | #define MFC_PLL_LOCK 0x000C | ||
24 | #define AUD_PLL_LOCK 0x0010 | ||
25 | #define CC_PLL_CON0 0x0100 | ||
26 | #define BUS0_PLL_CON0 0x0110 | ||
27 | #define BUS1_DPLL_CON0 0x0120 | ||
28 | #define MFC_PLL_CON0 0x0130 | ||
29 | #define AUD_PLL_CON0 0x0140 | ||
30 | #define MUX_SEL_TOPC0 0x0200 | ||
31 | #define MUX_SEL_TOPC1 0x0204 | ||
32 | #define MUX_SEL_TOPC2 0x0208 | ||
33 | #define MUX_SEL_TOPC3 0x020C | ||
34 | #define DIV_TOPC0 0x0600 | ||
35 | #define DIV_TOPC1 0x0604 | ||
36 | #define DIV_TOPC3 0x060C | ||
37 | |||
38 | static struct samsung_fixed_factor_clock topc_fixed_factor_clks[] __initdata = { | ||
39 | FFACTOR(0, "ffac_topc_bus0_pll_div2", "mout_bus0_pll_ctrl", 1, 2, 0), | ||
40 | FFACTOR(0, "ffac_topc_bus0_pll_div4", | ||
41 | "ffac_topc_bus0_pll_div2", 1, 2, 0), | ||
42 | FFACTOR(0, "ffac_topc_bus1_pll_div2", "mout_bus1_pll_ctrl", 1, 2, 0), | ||
43 | FFACTOR(0, "ffac_topc_cc_pll_div2", "mout_cc_pll_ctrl", 1, 2, 0), | ||
44 | FFACTOR(0, "ffac_topc_mfc_pll_div2", "mout_mfc_pll_ctrl", 1, 2, 0), | ||
45 | }; | ||
46 | |||
47 | /* List of parent clocks for Muxes in CMU_TOPC */ | ||
48 | PNAME(mout_bus0_pll_ctrl_p) = { "fin_pll", "fout_bus0_pll" }; | ||
49 | PNAME(mout_bus1_pll_ctrl_p) = { "fin_pll", "fout_bus1_pll" }; | ||
50 | PNAME(mout_cc_pll_ctrl_p) = { "fin_pll", "fout_cc_pll" }; | ||
51 | PNAME(mout_mfc_pll_ctrl_p) = { "fin_pll", "fout_mfc_pll" }; | ||
52 | |||
53 | PNAME(mout_topc_group2) = { "mout_sclk_bus0_pll_cmuc", | ||
54 | "mout_sclk_bus1_pll_cmuc", "mout_sclk_cc_pll_cmuc", | ||
55 | "mout_sclk_mfc_pll_cmuc" }; | ||
56 | |||
57 | PNAME(mout_sclk_bus0_pll_cmuc_p) = { "mout_bus0_pll_ctrl", | ||
58 | "ffac_topc_bus0_pll_div2", "ffac_topc_bus0_pll_div4"}; | ||
59 | PNAME(mout_sclk_bus1_pll_cmuc_p) = { "mout_bus1_pll_ctrl", | ||
60 | "ffac_topc_bus1_pll_div2"}; | ||
61 | PNAME(mout_sclk_cc_pll_cmuc_p) = { "mout_cc_pll_ctrl", | ||
62 | "ffac_topc_cc_pll_div2"}; | ||
63 | PNAME(mout_sclk_mfc_pll_cmuc_p) = { "mout_mfc_pll_ctrl", | ||
64 | "ffac_topc_mfc_pll_div2"}; | ||
65 | |||
66 | |||
67 | PNAME(mout_sclk_bus0_pll_out_p) = {"mout_bus0_pll_ctrl", | ||
68 | "ffac_topc_bus0_pll_div2"}; | ||
69 | |||
70 | static unsigned long topc_clk_regs[] __initdata = { | ||
71 | CC_PLL_LOCK, | ||
72 | BUS0_PLL_LOCK, | ||
73 | BUS1_DPLL_LOCK, | ||
74 | MFC_PLL_LOCK, | ||
75 | AUD_PLL_LOCK, | ||
76 | CC_PLL_CON0, | ||
77 | BUS0_PLL_CON0, | ||
78 | BUS1_DPLL_CON0, | ||
79 | MFC_PLL_CON0, | ||
80 | AUD_PLL_CON0, | ||
81 | MUX_SEL_TOPC0, | ||
82 | MUX_SEL_TOPC1, | ||
83 | MUX_SEL_TOPC2, | ||
84 | MUX_SEL_TOPC3, | ||
85 | DIV_TOPC0, | ||
86 | DIV_TOPC1, | ||
87 | DIV_TOPC3, | ||
88 | }; | ||
89 | |||
90 | static struct samsung_mux_clock topc_mux_clks[] __initdata = { | ||
91 | MUX(0, "mout_bus0_pll_ctrl", mout_bus0_pll_ctrl_p, MUX_SEL_TOPC0, 0, 1), | ||
92 | MUX(0, "mout_bus1_pll_ctrl", mout_bus1_pll_ctrl_p, MUX_SEL_TOPC0, 4, 1), | ||
93 | MUX(0, "mout_cc_pll_ctrl", mout_cc_pll_ctrl_p, MUX_SEL_TOPC0, 8, 1), | ||
94 | MUX(0, "mout_mfc_pll_ctrl", mout_mfc_pll_ctrl_p, MUX_SEL_TOPC0, 12, 1), | ||
95 | |||
96 | MUX(0, "mout_sclk_bus0_pll_cmuc", mout_sclk_bus0_pll_cmuc_p, | ||
97 | MUX_SEL_TOPC0, 16, 2), | ||
98 | MUX(0, "mout_sclk_bus1_pll_cmuc", mout_sclk_bus1_pll_cmuc_p, | ||
99 | MUX_SEL_TOPC0, 20, 1), | ||
100 | MUX(0, "mout_sclk_cc_pll_cmuc", mout_sclk_cc_pll_cmuc_p, | ||
101 | MUX_SEL_TOPC0, 24, 1), | ||
102 | MUX(0, "mout_sclk_mfc_pll_cmuc", mout_sclk_mfc_pll_cmuc_p, | ||
103 | MUX_SEL_TOPC0, 28, 1), | ||
104 | |||
105 | MUX(0, "mout_sclk_bus0_pll_out", mout_sclk_bus0_pll_out_p, | ||
106 | MUX_SEL_TOPC1, 16, 1), | ||
107 | |||
108 | MUX(0, "mout_aclk_ccore_133", mout_topc_group2, MUX_SEL_TOPC2, 4, 2), | ||
109 | |||
110 | MUX(0, "mout_aclk_peris_66", mout_topc_group2, MUX_SEL_TOPC3, 24, 2), | ||
111 | }; | ||
112 | |||
113 | static struct samsung_div_clock topc_div_clks[] __initdata = { | ||
114 | DIV(DOUT_ACLK_CCORE_133, "dout_aclk_ccore_133", "mout_aclk_ccore_133", | ||
115 | DIV_TOPC0, 4, 4), | ||
116 | |||
117 | DIV(DOUT_ACLK_PERIS, "dout_aclk_peris_66", "mout_aclk_peris_66", | ||
118 | DIV_TOPC1, 24, 4), | ||
119 | |||
120 | DIV(DOUT_SCLK_BUS0_PLL, "dout_sclk_bus0_pll", "mout_sclk_bus0_pll_out", | ||
121 | DIV_TOPC3, 0, 3), | ||
122 | DIV(DOUT_SCLK_BUS1_PLL, "dout_sclk_bus1_pll", "mout_bus1_pll_ctrl", | ||
123 | DIV_TOPC3, 8, 3), | ||
124 | DIV(DOUT_SCLK_CC_PLL, "dout_sclk_cc_pll", "mout_cc_pll_ctrl", | ||
125 | DIV_TOPC3, 12, 3), | ||
126 | DIV(DOUT_SCLK_MFC_PLL, "dout_sclk_mfc_pll", "mout_mfc_pll_ctrl", | ||
127 | DIV_TOPC3, 16, 3), | ||
128 | }; | ||
129 | |||
130 | static struct samsung_pll_clock topc_pll_clks[] __initdata = { | ||
131 | PLL(pll_1451x, 0, "fout_bus0_pll", "fin_pll", BUS0_PLL_LOCK, | ||
132 | BUS0_PLL_CON0, NULL), | ||
133 | PLL(pll_1452x, 0, "fout_cc_pll", "fin_pll", CC_PLL_LOCK, | ||
134 | CC_PLL_CON0, NULL), | ||
135 | PLL(pll_1452x, 0, "fout_bus1_pll", "fin_pll", BUS1_DPLL_LOCK, | ||
136 | BUS1_DPLL_CON0, NULL), | ||
137 | PLL(pll_1452x, 0, "fout_mfc_pll", "fin_pll", MFC_PLL_LOCK, | ||
138 | MFC_PLL_CON0, NULL), | ||
139 | PLL(pll_1460x, 0, "fout_aud_pll", "fin_pll", AUD_PLL_LOCK, | ||
140 | AUD_PLL_CON0, NULL), | ||
141 | }; | ||
142 | |||
143 | static struct samsung_cmu_info topc_cmu_info __initdata = { | ||
144 | .pll_clks = topc_pll_clks, | ||
145 | .nr_pll_clks = ARRAY_SIZE(topc_pll_clks), | ||
146 | .mux_clks = topc_mux_clks, | ||
147 | .nr_mux_clks = ARRAY_SIZE(topc_mux_clks), | ||
148 | .div_clks = topc_div_clks, | ||
149 | .nr_div_clks = ARRAY_SIZE(topc_div_clks), | ||
150 | .fixed_factor_clks = topc_fixed_factor_clks, | ||
151 | .nr_fixed_factor_clks = ARRAY_SIZE(topc_fixed_factor_clks), | ||
152 | .nr_clk_ids = TOPC_NR_CLK, | ||
153 | .clk_regs = topc_clk_regs, | ||
154 | .nr_clk_regs = ARRAY_SIZE(topc_clk_regs), | ||
155 | }; | ||
156 | |||
157 | static void __init exynos7_clk_topc_init(struct device_node *np) | ||
158 | { | ||
159 | samsung_cmu_register_one(np, &topc_cmu_info); | ||
160 | } | ||
161 | |||
162 | CLK_OF_DECLARE(exynos7_clk_topc, "samsung,exynos7-clock-topc", | ||
163 | exynos7_clk_topc_init); | ||
164 | |||
165 | /* Register Offset definitions for CMU_TOP0 (0x105D0000) */ | ||
166 | #define MUX_SEL_TOP00 0x0200 | ||
167 | #define MUX_SEL_TOP01 0x0204 | ||
168 | #define MUX_SEL_TOP03 0x020C | ||
169 | #define MUX_SEL_TOP0_PERIC3 0x023C | ||
170 | #define DIV_TOP03 0x060C | ||
171 | #define DIV_TOP0_PERIC3 0x063C | ||
172 | #define ENABLE_SCLK_TOP0_PERIC3 0x0A3C | ||
173 | |||
174 | /* List of parent clocks for Muxes in CMU_TOP0 */ | ||
175 | PNAME(mout_bus0_pll_p) = { "fin_pll", "dout_sclk_bus0_pll" }; | ||
176 | PNAME(mout_bus1_pll_p) = { "fin_pll", "dout_sclk_bus1_pll" }; | ||
177 | PNAME(mout_cc_pll_p) = { "fin_pll", "dout_sclk_cc_pll" }; | ||
178 | PNAME(mout_mfc_pll_p) = { "fin_pll", "dout_sclk_mfc_pll" }; | ||
179 | |||
180 | PNAME(mout_top0_half_bus0_pll_p) = {"mout_top0_bus0_pll", | ||
181 | "ffac_top0_bus0_pll_div2"}; | ||
182 | PNAME(mout_top0_half_bus1_pll_p) = {"mout_top0_bus1_pll", | ||
183 | "ffac_top0_bus1_pll_div2"}; | ||
184 | PNAME(mout_top0_half_cc_pll_p) = {"mout_top0_cc_pll", | ||
185 | "ffac_top0_cc_pll_div2"}; | ||
186 | PNAME(mout_top0_half_mfc_pll_p) = {"mout_top0_mfc_pll", | ||
187 | "ffac_top0_mfc_pll_div2"}; | ||
188 | |||
189 | PNAME(mout_top0_group1) = {"mout_top0_half_bus0_pll", | ||
190 | "mout_top0_half_bus1_pll", "mout_top0_half_cc_pll", | ||
191 | "mout_top0_half_mfc_pll"}; | ||
192 | |||
193 | static unsigned long top0_clk_regs[] __initdata = { | ||
194 | MUX_SEL_TOP00, | ||
195 | MUX_SEL_TOP01, | ||
196 | MUX_SEL_TOP03, | ||
197 | MUX_SEL_TOP0_PERIC3, | ||
198 | DIV_TOP03, | ||
199 | DIV_TOP0_PERIC3, | ||
200 | ENABLE_SCLK_TOP0_PERIC3, | ||
201 | }; | ||
202 | |||
203 | static struct samsung_mux_clock top0_mux_clks[] __initdata = { | ||
204 | MUX(0, "mout_top0_mfc_pll", mout_mfc_pll_p, MUX_SEL_TOP00, 4, 1), | ||
205 | MUX(0, "mout_top0_cc_pll", mout_cc_pll_p, MUX_SEL_TOP00, 8, 1), | ||
206 | MUX(0, "mout_top0_bus1_pll", mout_bus1_pll_p, MUX_SEL_TOP00, 12, 1), | ||
207 | MUX(0, "mout_top0_bus0_pll", mout_bus0_pll_p, MUX_SEL_TOP00, 16, 1), | ||
208 | |||
209 | MUX(0, "mout_top0_half_mfc_pll", mout_top0_half_mfc_pll_p, | ||
210 | MUX_SEL_TOP01, 4, 1), | ||
211 | MUX(0, "mout_top0_half_cc_pll", mout_top0_half_cc_pll_p, | ||
212 | MUX_SEL_TOP01, 8, 1), | ||
213 | MUX(0, "mout_top0_half_bus1_pll", mout_top0_half_bus1_pll_p, | ||
214 | MUX_SEL_TOP01, 12, 1), | ||
215 | MUX(0, "mout_top0_half_bus0_pll", mout_top0_half_bus0_pll_p, | ||
216 | MUX_SEL_TOP01, 16, 1), | ||
217 | |||
218 | MUX(0, "mout_aclk_peric1_66", mout_top0_group1, MUX_SEL_TOP03, 12, 2), | ||
219 | MUX(0, "mout_aclk_peric0_66", mout_top0_group1, MUX_SEL_TOP03, 20, 2), | ||
220 | |||
221 | MUX(0, "mout_sclk_uart3", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 4, 2), | ||
222 | MUX(0, "mout_sclk_uart2", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 8, 2), | ||
223 | MUX(0, "mout_sclk_uart1", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 12, 2), | ||
224 | MUX(0, "mout_sclk_uart0", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 16, 2), | ||
225 | }; | ||
226 | |||
227 | static struct samsung_div_clock top0_div_clks[] __initdata = { | ||
228 | DIV(DOUT_ACLK_PERIC1, "dout_aclk_peric1_66", "mout_aclk_peric1_66", | ||
229 | DIV_TOP03, 12, 6), | ||
230 | DIV(DOUT_ACLK_PERIC0, "dout_aclk_peric0_66", "mout_aclk_peric0_66", | ||
231 | DIV_TOP03, 20, 6), | ||
232 | |||
233 | DIV(0, "dout_sclk_uart3", "mout_sclk_uart3", DIV_TOP0_PERIC3, 4, 4), | ||
234 | DIV(0, "dout_sclk_uart2", "mout_sclk_uart2", DIV_TOP0_PERIC3, 8, 4), | ||
235 | DIV(0, "dout_sclk_uart1", "mout_sclk_uart1", DIV_TOP0_PERIC3, 12, 4), | ||
236 | DIV(0, "dout_sclk_uart0", "mout_sclk_uart0", DIV_TOP0_PERIC3, 16, 4), | ||
237 | }; | ||
238 | |||
239 | static struct samsung_gate_clock top0_gate_clks[] __initdata = { | ||
240 | GATE(CLK_SCLK_UART3, "sclk_uart3", "dout_sclk_uart3", | ||
241 | ENABLE_SCLK_TOP0_PERIC3, 4, 0, 0), | ||
242 | GATE(CLK_SCLK_UART2, "sclk_uart2", "dout_sclk_uart2", | ||
243 | ENABLE_SCLK_TOP0_PERIC3, 8, 0, 0), | ||
244 | GATE(CLK_SCLK_UART1, "sclk_uart1", "dout_sclk_uart1", | ||
245 | ENABLE_SCLK_TOP0_PERIC3, 12, 0, 0), | ||
246 | GATE(CLK_SCLK_UART0, "sclk_uart0", "dout_sclk_uart0", | ||
247 | ENABLE_SCLK_TOP0_PERIC3, 16, 0, 0), | ||
248 | }; | ||
249 | |||
250 | static struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initdata = { | ||
251 | FFACTOR(0, "ffac_top0_bus0_pll_div2", "mout_top0_bus0_pll", 1, 2, 0), | ||
252 | FFACTOR(0, "ffac_top0_bus1_pll_div2", "mout_top0_bus1_pll", 1, 2, 0), | ||
253 | FFACTOR(0, "ffac_top0_cc_pll_div2", "mout_top0_cc_pll", 1, 2, 0), | ||
254 | FFACTOR(0, "ffac_top0_mfc_pll_div2", "mout_top0_mfc_pll", 1, 2, 0), | ||
255 | }; | ||
256 | |||
257 | static struct samsung_cmu_info top0_cmu_info __initdata = { | ||
258 | .mux_clks = top0_mux_clks, | ||
259 | .nr_mux_clks = ARRAY_SIZE(top0_mux_clks), | ||
260 | .div_clks = top0_div_clks, | ||
261 | .nr_div_clks = ARRAY_SIZE(top0_div_clks), | ||
262 | .gate_clks = top0_gate_clks, | ||
263 | .nr_gate_clks = ARRAY_SIZE(top0_gate_clks), | ||
264 | .fixed_factor_clks = top0_fixed_factor_clks, | ||
265 | .nr_fixed_factor_clks = ARRAY_SIZE(top0_fixed_factor_clks), | ||
266 | .nr_clk_ids = TOP0_NR_CLK, | ||
267 | .clk_regs = top0_clk_regs, | ||
268 | .nr_clk_regs = ARRAY_SIZE(top0_clk_regs), | ||
269 | }; | ||
270 | |||
271 | static void __init exynos7_clk_top0_init(struct device_node *np) | ||
272 | { | ||
273 | samsung_cmu_register_one(np, &top0_cmu_info); | ||
274 | } | ||
275 | |||
276 | CLK_OF_DECLARE(exynos7_clk_top0, "samsung,exynos7-clock-top0", | ||
277 | exynos7_clk_top0_init); | ||
278 | |||
279 | /* Register Offset definitions for CMU_TOP1 (0x105E0000) */ | ||
280 | #define MUX_SEL_TOP10 0x0200 | ||
281 | #define MUX_SEL_TOP11 0x0204 | ||
282 | #define MUX_SEL_TOP13 0x020C | ||
283 | #define MUX_SEL_TOP1_FSYS0 0x0224 | ||
284 | #define MUX_SEL_TOP1_FSYS1 0x0228 | ||
285 | #define DIV_TOP13 0x060C | ||
286 | #define DIV_TOP1_FSYS0 0x0624 | ||
287 | #define DIV_TOP1_FSYS1 0x0628 | ||
288 | #define ENABLE_ACLK_TOP13 0x080C | ||
289 | #define ENABLE_SCLK_TOP1_FSYS0 0x0A24 | ||
290 | #define ENABLE_SCLK_TOP1_FSYS1 0x0A28 | ||
291 | |||
292 | /* List of parent clocks for Muxes in CMU_TOP1 */ | ||
293 | PNAME(mout_top1_bus0_pll_p) = { "fin_pll", "dout_sclk_bus0_pll" }; | ||
294 | PNAME(mout_top1_bus1_pll_p) = { "fin_pll", "dout_sclk_bus1_pll_b" }; | ||
295 | PNAME(mout_top1_cc_pll_p) = { "fin_pll", "dout_sclk_cc_pll_b" }; | ||
296 | PNAME(mout_top1_mfc_pll_p) = { "fin_pll", "dout_sclk_mfc_pll_b" }; | ||
297 | |||
298 | PNAME(mout_top1_half_bus0_pll_p) = {"mout_top1_bus0_pll", | ||
299 | "ffac_top1_bus0_pll_div2"}; | ||
300 | PNAME(mout_top1_half_bus1_pll_p) = {"mout_top1_bus1_pll", | ||
301 | "ffac_top1_bus1_pll_div2"}; | ||
302 | PNAME(mout_top1_half_cc_pll_p) = {"mout_top1_cc_pll", | ||
303 | "ffac_top1_cc_pll_div2"}; | ||
304 | PNAME(mout_top1_half_mfc_pll_p) = {"mout_top1_mfc_pll", | ||
305 | "ffac_top1_mfc_pll_div2"}; | ||
306 | |||
307 | PNAME(mout_top1_group1) = {"mout_top1_half_bus0_pll", | ||
308 | "mout_top1_half_bus1_pll", "mout_top1_half_cc_pll", | ||
309 | "mout_top1_half_mfc_pll"}; | ||
310 | |||
311 | static unsigned long top1_clk_regs[] __initdata = { | ||
312 | MUX_SEL_TOP10, | ||
313 | MUX_SEL_TOP11, | ||
314 | MUX_SEL_TOP13, | ||
315 | MUX_SEL_TOP1_FSYS0, | ||
316 | MUX_SEL_TOP1_FSYS1, | ||
317 | DIV_TOP13, | ||
318 | DIV_TOP1_FSYS0, | ||
319 | DIV_TOP1_FSYS1, | ||
320 | ENABLE_ACLK_TOP13, | ||
321 | ENABLE_SCLK_TOP1_FSYS0, | ||
322 | ENABLE_SCLK_TOP1_FSYS1, | ||
323 | }; | ||
324 | |||
325 | static struct samsung_mux_clock top1_mux_clks[] __initdata = { | ||
326 | MUX(0, "mout_top1_mfc_pll", mout_top1_mfc_pll_p, MUX_SEL_TOP10, 4, 1), | ||
327 | MUX(0, "mout_top1_cc_pll", mout_top1_cc_pll_p, MUX_SEL_TOP10, 8, 1), | ||
328 | MUX(0, "mout_top1_bus1_pll", mout_top1_bus1_pll_p, | ||
329 | MUX_SEL_TOP10, 12, 1), | ||
330 | MUX(0, "mout_top1_bus0_pll", mout_top1_bus0_pll_p, | ||
331 | MUX_SEL_TOP10, 16, 1), | ||
332 | |||
333 | MUX(0, "mout_top1_half_mfc_pll", mout_top1_half_mfc_pll_p, | ||
334 | MUX_SEL_TOP11, 4, 1), | ||
335 | MUX(0, "mout_top1_half_cc_pll", mout_top1_half_cc_pll_p, | ||
336 | MUX_SEL_TOP11, 8, 1), | ||
337 | MUX(0, "mout_top1_half_bus1_pll", mout_top1_half_bus1_pll_p, | ||
338 | MUX_SEL_TOP11, 12, 1), | ||
339 | MUX(0, "mout_top1_half_bus0_pll", mout_top1_half_bus0_pll_p, | ||
340 | MUX_SEL_TOP11, 16, 1), | ||
341 | |||
342 | MUX(0, "mout_aclk_fsys1_200", mout_top1_group1, MUX_SEL_TOP13, 24, 2), | ||
343 | MUX(0, "mout_aclk_fsys0_200", mout_top1_group1, MUX_SEL_TOP13, 28, 2), | ||
344 | |||
345 | MUX(0, "mout_sclk_mmc2", mout_top1_group1, MUX_SEL_TOP1_FSYS0, 24, 2), | ||
346 | |||
347 | MUX(0, "mout_sclk_mmc1", mout_top1_group1, MUX_SEL_TOP1_FSYS1, 24, 2), | ||
348 | MUX(0, "mout_sclk_mmc0", mout_top1_group1, MUX_SEL_TOP1_FSYS1, 28, 2), | ||
349 | }; | ||
350 | |||
351 | static struct samsung_div_clock top1_div_clks[] __initdata = { | ||
352 | DIV(DOUT_ACLK_FSYS1_200, "dout_aclk_fsys1_200", "mout_aclk_fsys1_200", | ||
353 | DIV_TOP13, 24, 4), | ||
354 | DIV(DOUT_ACLK_FSYS0_200, "dout_aclk_fsys0_200", "mout_aclk_fsys0_200", | ||
355 | DIV_TOP13, 28, 4), | ||
356 | |||
357 | DIV(DOUT_SCLK_MMC2, "dout_sclk_mmc2", "mout_sclk_mmc2", | ||
358 | DIV_TOP1_FSYS0, 24, 4), | ||
359 | |||
360 | DIV(DOUT_SCLK_MMC1, "dout_sclk_mmc1", "mout_sclk_mmc1", | ||
361 | DIV_TOP1_FSYS1, 24, 4), | ||
362 | DIV(DOUT_SCLK_MMC0, "dout_sclk_mmc0", "mout_sclk_mmc0", | ||
363 | DIV_TOP1_FSYS1, 28, 4), | ||
364 | }; | ||
365 | |||
366 | static struct samsung_gate_clock top1_gate_clks[] __initdata = { | ||
367 | GATE(CLK_SCLK_MMC2, "sclk_mmc2", "dout_sclk_mmc2", | ||
368 | ENABLE_SCLK_TOP1_FSYS0, 24, CLK_SET_RATE_PARENT, 0), | ||
369 | |||
370 | GATE(CLK_SCLK_MMC1, "sclk_mmc1", "dout_sclk_mmc1", | ||
371 | ENABLE_SCLK_TOP1_FSYS1, 24, CLK_SET_RATE_PARENT, 0), | ||
372 | GATE(CLK_SCLK_MMC0, "sclk_mmc0", "dout_sclk_mmc0", | ||
373 | ENABLE_SCLK_TOP1_FSYS1, 28, CLK_SET_RATE_PARENT, 0), | ||
374 | }; | ||
375 | |||
376 | static struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initdata = { | ||
377 | FFACTOR(0, "ffac_top1_bus0_pll_div2", "mout_top1_bus0_pll", 1, 2, 0), | ||
378 | FFACTOR(0, "ffac_top1_bus1_pll_div2", "mout_top1_bus1_pll", 1, 2, 0), | ||
379 | FFACTOR(0, "ffac_top1_cc_pll_div2", "mout_top1_cc_pll", 1, 2, 0), | ||
380 | FFACTOR(0, "ffac_top1_mfc_pll_div2", "mout_top1_mfc_pll", 1, 2, 0), | ||
381 | }; | ||
382 | |||
383 | static struct samsung_cmu_info top1_cmu_info __initdata = { | ||
384 | .mux_clks = top1_mux_clks, | ||
385 | .nr_mux_clks = ARRAY_SIZE(top1_mux_clks), | ||
386 | .div_clks = top1_div_clks, | ||
387 | .nr_div_clks = ARRAY_SIZE(top1_div_clks), | ||
388 | .gate_clks = top1_gate_clks, | ||
389 | .nr_gate_clks = ARRAY_SIZE(top1_gate_clks), | ||
390 | .fixed_factor_clks = top1_fixed_factor_clks, | ||
391 | .nr_fixed_factor_clks = ARRAY_SIZE(top1_fixed_factor_clks), | ||
392 | .nr_clk_ids = TOP1_NR_CLK, | ||
393 | .clk_regs = top1_clk_regs, | ||
394 | .nr_clk_regs = ARRAY_SIZE(top1_clk_regs), | ||
395 | }; | ||
396 | |||
397 | static void __init exynos7_clk_top1_init(struct device_node *np) | ||
398 | { | ||
399 | samsung_cmu_register_one(np, &top1_cmu_info); | ||
400 | } | ||
401 | |||
402 | CLK_OF_DECLARE(exynos7_clk_top1, "samsung,exynos7-clock-top1", | ||
403 | exynos7_clk_top1_init); | ||
404 | |||
405 | /* Register Offset definitions for CMU_CCORE (0x105B0000) */ | ||
406 | #define MUX_SEL_CCORE 0x0200 | ||
407 | #define DIV_CCORE 0x0600 | ||
408 | #define ENABLE_ACLK_CCORE0 0x0800 | ||
409 | #define ENABLE_ACLK_CCORE1 0x0804 | ||
410 | #define ENABLE_PCLK_CCORE 0x0900 | ||
411 | |||
412 | /* | ||
413 | * List of parent clocks for Muxes in CMU_CCORE | ||
414 | */ | ||
415 | PNAME(mout_aclk_ccore_133_p) = { "fin_pll", "dout_aclk_ccore_133" }; | ||
416 | |||
417 | static unsigned long ccore_clk_regs[] __initdata = { | ||
418 | MUX_SEL_CCORE, | ||
419 | ENABLE_PCLK_CCORE, | ||
420 | }; | ||
421 | |||
422 | static struct samsung_mux_clock ccore_mux_clks[] __initdata = { | ||
423 | MUX(0, "mout_aclk_ccore_133_user", mout_aclk_ccore_133_p, | ||
424 | MUX_SEL_CCORE, 1, 1), | ||
425 | }; | ||
426 | |||
427 | static struct samsung_gate_clock ccore_gate_clks[] __initdata = { | ||
428 | GATE(PCLK_RTC, "pclk_rtc", "mout_aclk_ccore_133_user", | ||
429 | ENABLE_PCLK_CCORE, 8, 0, 0), | ||
430 | }; | ||
431 | |||
432 | static struct samsung_cmu_info ccore_cmu_info __initdata = { | ||
433 | .mux_clks = ccore_mux_clks, | ||
434 | .nr_mux_clks = ARRAY_SIZE(ccore_mux_clks), | ||
435 | .gate_clks = ccore_gate_clks, | ||
436 | .nr_gate_clks = ARRAY_SIZE(ccore_gate_clks), | ||
437 | .nr_clk_ids = CCORE_NR_CLK, | ||
438 | .clk_regs = ccore_clk_regs, | ||
439 | .nr_clk_regs = ARRAY_SIZE(ccore_clk_regs), | ||
440 | }; | ||
441 | |||
442 | static void __init exynos7_clk_ccore_init(struct device_node *np) | ||
443 | { | ||
444 | samsung_cmu_register_one(np, &ccore_cmu_info); | ||
445 | } | ||
446 | |||
447 | CLK_OF_DECLARE(exynos7_clk_ccore, "samsung,exynos7-clock-ccore", | ||
448 | exynos7_clk_ccore_init); | ||
449 | |||
450 | /* Register Offset definitions for CMU_PERIC0 (0x13610000) */ | ||
451 | #define MUX_SEL_PERIC0 0x0200 | ||
452 | #define ENABLE_PCLK_PERIC0 0x0900 | ||
453 | #define ENABLE_SCLK_PERIC0 0x0A00 | ||
454 | |||
455 | /* List of parent clocks for Muxes in CMU_PERIC0 */ | ||
456 | PNAME(mout_aclk_peric0_66_p) = { "fin_pll", "dout_aclk_peric0_66" }; | ||
457 | PNAME(mout_sclk_uart0_p) = { "fin_pll", "sclk_uart0" }; | ||
458 | |||
459 | static unsigned long peric0_clk_regs[] __initdata = { | ||
460 | MUX_SEL_PERIC0, | ||
461 | ENABLE_PCLK_PERIC0, | ||
462 | ENABLE_SCLK_PERIC0, | ||
463 | }; | ||
464 | |||
465 | static struct samsung_mux_clock peric0_mux_clks[] __initdata = { | ||
466 | MUX(0, "mout_aclk_peric0_66_user", mout_aclk_peric0_66_p, | ||
467 | MUX_SEL_PERIC0, 0, 1), | ||
468 | MUX(0, "mout_sclk_uart0_user", mout_sclk_uart0_p, | ||
469 | MUX_SEL_PERIC0, 16, 1), | ||
470 | }; | ||
471 | |||
472 | static struct samsung_gate_clock peric0_gate_clks[] __initdata = { | ||
473 | GATE(PCLK_HSI2C0, "pclk_hsi2c0", "mout_aclk_peric0_66_user", | ||
474 | ENABLE_PCLK_PERIC0, 8, 0, 0), | ||
475 | GATE(PCLK_HSI2C1, "pclk_hsi2c1", "mout_aclk_peric0_66_user", | ||
476 | ENABLE_PCLK_PERIC0, 9, 0, 0), | ||
477 | GATE(PCLK_HSI2C4, "pclk_hsi2c4", "mout_aclk_peric0_66_user", | ||
478 | ENABLE_PCLK_PERIC0, 10, 0, 0), | ||
479 | GATE(PCLK_HSI2C5, "pclk_hsi2c5", "mout_aclk_peric0_66_user", | ||
480 | ENABLE_PCLK_PERIC0, 11, 0, 0), | ||
481 | GATE(PCLK_HSI2C9, "pclk_hsi2c9", "mout_aclk_peric0_66_user", | ||
482 | ENABLE_PCLK_PERIC0, 12, 0, 0), | ||
483 | GATE(PCLK_HSI2C10, "pclk_hsi2c10", "mout_aclk_peric0_66_user", | ||
484 | ENABLE_PCLK_PERIC0, 13, 0, 0), | ||
485 | GATE(PCLK_HSI2C11, "pclk_hsi2c11", "mout_aclk_peric0_66_user", | ||
486 | ENABLE_PCLK_PERIC0, 14, 0, 0), | ||
487 | GATE(PCLK_UART0, "pclk_uart0", "mout_aclk_peric0_66_user", | ||
488 | ENABLE_PCLK_PERIC0, 16, 0, 0), | ||
489 | GATE(PCLK_ADCIF, "pclk_adcif", "mout_aclk_peric0_66_user", | ||
490 | ENABLE_PCLK_PERIC0, 20, 0, 0), | ||
491 | GATE(PCLK_PWM, "pclk_pwm", "mout_aclk_peric0_66_user", | ||
492 | ENABLE_PCLK_PERIC0, 21, 0, 0), | ||
493 | |||
494 | GATE(SCLK_UART0, "sclk_uart0_user", "mout_sclk_uart0_user", | ||
495 | ENABLE_SCLK_PERIC0, 16, 0, 0), | ||
496 | GATE(SCLK_PWM, "sclk_pwm", "fin_pll", ENABLE_SCLK_PERIC0, 21, 0, 0), | ||
497 | }; | ||
498 | |||
499 | static struct samsung_cmu_info peric0_cmu_info __initdata = { | ||
500 | .mux_clks = peric0_mux_clks, | ||
501 | .nr_mux_clks = ARRAY_SIZE(peric0_mux_clks), | ||
502 | .gate_clks = peric0_gate_clks, | ||
503 | .nr_gate_clks = ARRAY_SIZE(peric0_gate_clks), | ||
504 | .nr_clk_ids = PERIC0_NR_CLK, | ||
505 | .clk_regs = peric0_clk_regs, | ||
506 | .nr_clk_regs = ARRAY_SIZE(peric0_clk_regs), | ||
507 | }; | ||
508 | |||
509 | static void __init exynos7_clk_peric0_init(struct device_node *np) | ||
510 | { | ||
511 | samsung_cmu_register_one(np, &peric0_cmu_info); | ||
512 | } | ||
513 | |||
514 | /* Register Offset definitions for CMU_PERIC1 (0x14C80000) */ | ||
515 | #define MUX_SEL_PERIC10 0x0200 | ||
516 | #define MUX_SEL_PERIC11 0x0204 | ||
517 | #define ENABLE_PCLK_PERIC1 0x0900 | ||
518 | #define ENABLE_SCLK_PERIC10 0x0A00 | ||
519 | |||
520 | CLK_OF_DECLARE(exynos7_clk_peric0, "samsung,exynos7-clock-peric0", | ||
521 | exynos7_clk_peric0_init); | ||
522 | |||
523 | /* List of parent clocks for Muxes in CMU_PERIC1 */ | ||
524 | PNAME(mout_aclk_peric1_66_p) = { "fin_pll", "dout_aclk_peric1_66" }; | ||
525 | PNAME(mout_sclk_uart1_p) = { "fin_pll", "sclk_uart1" }; | ||
526 | PNAME(mout_sclk_uart2_p) = { "fin_pll", "sclk_uart2" }; | ||
527 | PNAME(mout_sclk_uart3_p) = { "fin_pll", "sclk_uart3" }; | ||
528 | |||
529 | static unsigned long peric1_clk_regs[] __initdata = { | ||
530 | MUX_SEL_PERIC10, | ||
531 | MUX_SEL_PERIC11, | ||
532 | ENABLE_PCLK_PERIC1, | ||
533 | ENABLE_SCLK_PERIC10, | ||
534 | }; | ||
535 | |||
536 | static struct samsung_mux_clock peric1_mux_clks[] __initdata = { | ||
537 | MUX(0, "mout_aclk_peric1_66_user", mout_aclk_peric1_66_p, | ||
538 | MUX_SEL_PERIC10, 0, 1), | ||
539 | |||
540 | MUX(0, "mout_sclk_uart1_user", mout_sclk_uart1_p, | ||
541 | MUX_SEL_PERIC11, 20, 1), | ||
542 | MUX(0, "mout_sclk_uart2_user", mout_sclk_uart2_p, | ||
543 | MUX_SEL_PERIC11, 24, 1), | ||
544 | MUX(0, "mout_sclk_uart3_user", mout_sclk_uart3_p, | ||
545 | MUX_SEL_PERIC11, 28, 1), | ||
546 | }; | ||
547 | |||
548 | static struct samsung_gate_clock peric1_gate_clks[] __initdata = { | ||
549 | GATE(PCLK_HSI2C2, "pclk_hsi2c2", "mout_aclk_peric1_66_user", | ||
550 | ENABLE_PCLK_PERIC1, 4, 0, 0), | ||
551 | GATE(PCLK_HSI2C3, "pclk_hsi2c3", "mout_aclk_peric1_66_user", | ||
552 | ENABLE_PCLK_PERIC1, 5, 0, 0), | ||
553 | GATE(PCLK_HSI2C6, "pclk_hsi2c6", "mout_aclk_peric1_66_user", | ||
554 | ENABLE_PCLK_PERIC1, 6, 0, 0), | ||
555 | GATE(PCLK_HSI2C7, "pclk_hsi2c7", "mout_aclk_peric1_66_user", | ||
556 | ENABLE_PCLK_PERIC1, 7, 0, 0), | ||
557 | GATE(PCLK_HSI2C8, "pclk_hsi2c8", "mout_aclk_peric1_66_user", | ||
558 | ENABLE_PCLK_PERIC1, 8, 0, 0), | ||
559 | GATE(PCLK_UART1, "pclk_uart1", "mout_aclk_peric1_66_user", | ||
560 | ENABLE_PCLK_PERIC1, 9, 0, 0), | ||
561 | GATE(PCLK_UART2, "pclk_uart2", "mout_aclk_peric1_66_user", | ||
562 | ENABLE_PCLK_PERIC1, 10, 0, 0), | ||
563 | GATE(PCLK_UART3, "pclk_uart3", "mout_aclk_peric1_66_user", | ||
564 | ENABLE_PCLK_PERIC1, 11, 0, 0), | ||
565 | |||
566 | GATE(SCLK_UART1, "sclk_uart1_user", "mout_sclk_uart1_user", | ||
567 | ENABLE_SCLK_PERIC10, 9, 0, 0), | ||
568 | GATE(SCLK_UART2, "sclk_uart2_user", "mout_sclk_uart2_user", | ||
569 | ENABLE_SCLK_PERIC10, 10, 0, 0), | ||
570 | GATE(SCLK_UART3, "sclk_uart3_user", "mout_sclk_uart3_user", | ||
571 | ENABLE_SCLK_PERIC10, 11, 0, 0), | ||
572 | }; | ||
573 | |||
574 | static struct samsung_cmu_info peric1_cmu_info __initdata = { | ||
575 | .mux_clks = peric1_mux_clks, | ||
576 | .nr_mux_clks = ARRAY_SIZE(peric1_mux_clks), | ||
577 | .gate_clks = peric1_gate_clks, | ||
578 | .nr_gate_clks = ARRAY_SIZE(peric1_gate_clks), | ||
579 | .nr_clk_ids = PERIC1_NR_CLK, | ||
580 | .clk_regs = peric1_clk_regs, | ||
581 | .nr_clk_regs = ARRAY_SIZE(peric1_clk_regs), | ||
582 | }; | ||
583 | |||
584 | static void __init exynos7_clk_peric1_init(struct device_node *np) | ||
585 | { | ||
586 | samsung_cmu_register_one(np, &peric1_cmu_info); | ||
587 | } | ||
588 | |||
589 | CLK_OF_DECLARE(exynos7_clk_peric1, "samsung,exynos7-clock-peric1", | ||
590 | exynos7_clk_peric1_init); | ||
591 | |||
592 | /* Register Offset definitions for CMU_PERIS (0x10040000) */ | ||
593 | #define MUX_SEL_PERIS 0x0200 | ||
594 | #define ENABLE_PCLK_PERIS 0x0900 | ||
595 | #define ENABLE_PCLK_PERIS_SECURE_CHIPID 0x0910 | ||
596 | #define ENABLE_SCLK_PERIS 0x0A00 | ||
597 | #define ENABLE_SCLK_PERIS_SECURE_CHIPID 0x0A10 | ||
598 | |||
599 | /* List of parent clocks for Muxes in CMU_PERIS */ | ||
600 | PNAME(mout_aclk_peris_66_p) = { "fin_pll", "dout_aclk_peris_66" }; | ||
601 | |||
602 | static unsigned long peris_clk_regs[] __initdata = { | ||
603 | MUX_SEL_PERIS, | ||
604 | ENABLE_PCLK_PERIS, | ||
605 | ENABLE_PCLK_PERIS_SECURE_CHIPID, | ||
606 | ENABLE_SCLK_PERIS, | ||
607 | ENABLE_SCLK_PERIS_SECURE_CHIPID, | ||
608 | }; | ||
609 | |||
610 | static struct samsung_mux_clock peris_mux_clks[] __initdata = { | ||
611 | MUX(0, "mout_aclk_peris_66_user", | ||
612 | mout_aclk_peris_66_p, MUX_SEL_PERIS, 0, 1), | ||
613 | }; | ||
614 | |||
615 | static struct samsung_gate_clock peris_gate_clks[] __initdata = { | ||
616 | GATE(PCLK_WDT, "pclk_wdt", "mout_aclk_peris_66_user", | ||
617 | ENABLE_PCLK_PERIS, 6, 0, 0), | ||
618 | GATE(PCLK_TMU, "pclk_tmu_apbif", "mout_aclk_peris_66_user", | ||
619 | ENABLE_PCLK_PERIS, 10, 0, 0), | ||
620 | |||
621 | GATE(PCLK_CHIPID, "pclk_chipid", "mout_aclk_peris_66_user", | ||
622 | ENABLE_PCLK_PERIS_SECURE_CHIPID, 0, 0, 0), | ||
623 | GATE(SCLK_CHIPID, "sclk_chipid", "fin_pll", | ||
624 | ENABLE_SCLK_PERIS_SECURE_CHIPID, 0, 0, 0), | ||
625 | |||
626 | GATE(SCLK_TMU, "sclk_tmu", "fin_pll", ENABLE_SCLK_PERIS, 10, 0, 0), | ||
627 | }; | ||
628 | |||
629 | static struct samsung_cmu_info peris_cmu_info __initdata = { | ||
630 | .mux_clks = peris_mux_clks, | ||
631 | .nr_mux_clks = ARRAY_SIZE(peris_mux_clks), | ||
632 | .gate_clks = peris_gate_clks, | ||
633 | .nr_gate_clks = ARRAY_SIZE(peris_gate_clks), | ||
634 | .nr_clk_ids = PERIS_NR_CLK, | ||
635 | .clk_regs = peris_clk_regs, | ||
636 | .nr_clk_regs = ARRAY_SIZE(peris_clk_regs), | ||
637 | }; | ||
638 | |||
639 | static void __init exynos7_clk_peris_init(struct device_node *np) | ||
640 | { | ||
641 | samsung_cmu_register_one(np, &peris_cmu_info); | ||
642 | } | ||
643 | |||
644 | CLK_OF_DECLARE(exynos7_clk_peris, "samsung,exynos7-clock-peris", | ||
645 | exynos7_clk_peris_init); | ||
646 | |||
647 | /* Register Offset definitions for CMU_FSYS0 (0x10E90000) */ | ||
648 | #define MUX_SEL_FSYS00 0x0200 | ||
649 | #define MUX_SEL_FSYS01 0x0204 | ||
650 | #define ENABLE_ACLK_FSYS01 0x0804 | ||
651 | |||
652 | /* | ||
653 | * List of parent clocks for Muxes in CMU_FSYS0 | ||
654 | */ | ||
655 | PNAME(mout_aclk_fsys0_200_p) = { "fin_pll", "dout_aclk_fsys0_200" }; | ||
656 | PNAME(mout_sclk_mmc2_p) = { "fin_pll", "sclk_mmc2" }; | ||
657 | |||
658 | static unsigned long fsys0_clk_regs[] __initdata = { | ||
659 | MUX_SEL_FSYS00, | ||
660 | MUX_SEL_FSYS01, | ||
661 | ENABLE_ACLK_FSYS01, | ||
662 | }; | ||
663 | |||
664 | static struct samsung_mux_clock fsys0_mux_clks[] __initdata = { | ||
665 | MUX(0, "mout_aclk_fsys0_200_user", mout_aclk_fsys0_200_p, | ||
666 | MUX_SEL_FSYS00, 24, 1), | ||
667 | |||
668 | MUX(0, "mout_sclk_mmc2_user", mout_sclk_mmc2_p, MUX_SEL_FSYS01, 24, 1), | ||
669 | }; | ||
670 | |||
671 | static struct samsung_gate_clock fsys0_gate_clks[] __initdata = { | ||
672 | GATE(ACLK_MMC2, "aclk_mmc2", "mout_aclk_fsys0_200_user", | ||
673 | ENABLE_ACLK_FSYS01, 31, 0, 0), | ||
674 | }; | ||
675 | |||
676 | static struct samsung_cmu_info fsys0_cmu_info __initdata = { | ||
677 | .mux_clks = fsys0_mux_clks, | ||
678 | .nr_mux_clks = ARRAY_SIZE(fsys0_mux_clks), | ||
679 | .gate_clks = fsys0_gate_clks, | ||
680 | .nr_gate_clks = ARRAY_SIZE(fsys0_gate_clks), | ||
681 | .nr_clk_ids = TOP1_NR_CLK, | ||
682 | .clk_regs = fsys0_clk_regs, | ||
683 | .nr_clk_regs = ARRAY_SIZE(fsys0_clk_regs), | ||
684 | }; | ||
685 | |||
686 | static void __init exynos7_clk_fsys0_init(struct device_node *np) | ||
687 | { | ||
688 | samsung_cmu_register_one(np, &fsys0_cmu_info); | ||
689 | } | ||
690 | |||
691 | CLK_OF_DECLARE(exynos7_clk_fsys0, "samsung,exynos7-clock-fsys0", | ||
692 | exynos7_clk_fsys0_init); | ||
693 | |||
694 | /* Register Offset definitions for CMU_FSYS1 (0x156E0000) */ | ||
695 | #define MUX_SEL_FSYS10 0x0200 | ||
696 | #define MUX_SEL_FSYS11 0x0204 | ||
697 | #define ENABLE_ACLK_FSYS1 0x0800 | ||
698 | |||
699 | /* | ||
700 | * List of parent clocks for Muxes in CMU_FSYS1 | ||
701 | */ | ||
702 | PNAME(mout_aclk_fsys1_200_p) = { "fin_pll", "dout_aclk_fsys1_200" }; | ||
703 | PNAME(mout_sclk_mmc0_p) = { "fin_pll", "sclk_mmc0" }; | ||
704 | PNAME(mout_sclk_mmc1_p) = { "fin_pll", "sclk_mmc1" }; | ||
705 | |||
706 | static unsigned long fsys1_clk_regs[] __initdata = { | ||
707 | MUX_SEL_FSYS10, | ||
708 | MUX_SEL_FSYS11, | ||
709 | ENABLE_ACLK_FSYS1, | ||
710 | }; | ||
711 | |||
712 | static struct samsung_mux_clock fsys1_mux_clks[] __initdata = { | ||
713 | MUX(0, "mout_aclk_fsys1_200_user", mout_aclk_fsys1_200_p, | ||
714 | MUX_SEL_FSYS10, 28, 1), | ||
715 | |||
716 | MUX(0, "mout_sclk_mmc1_user", mout_sclk_mmc1_p, MUX_SEL_FSYS11, 24, 1), | ||
717 | MUX(0, "mout_sclk_mmc0_user", mout_sclk_mmc0_p, MUX_SEL_FSYS11, 28, 1), | ||
718 | }; | ||
719 | |||
720 | static struct samsung_gate_clock fsys1_gate_clks[] __initdata = { | ||
721 | GATE(ACLK_MMC1, "aclk_mmc1", "mout_aclk_fsys1_200_user", | ||
722 | ENABLE_ACLK_FSYS1, 29, 0, 0), | ||
723 | GATE(ACLK_MMC0, "aclk_mmc0", "mout_aclk_fsys1_200_user", | ||
724 | ENABLE_ACLK_FSYS1, 30, 0, 0), | ||
725 | }; | ||
726 | |||
727 | static struct samsung_cmu_info fsys1_cmu_info __initdata = { | ||
728 | .mux_clks = fsys1_mux_clks, | ||
729 | .nr_mux_clks = ARRAY_SIZE(fsys1_mux_clks), | ||
730 | .gate_clks = fsys1_gate_clks, | ||
731 | .nr_gate_clks = ARRAY_SIZE(fsys1_gate_clks), | ||
732 | .nr_clk_ids = TOP1_NR_CLK, | ||
733 | .clk_regs = fsys1_clk_regs, | ||
734 | .nr_clk_regs = ARRAY_SIZE(fsys1_clk_regs), | ||
735 | }; | ||
736 | |||
737 | static void __init exynos7_clk_fsys1_init(struct device_node *np) | ||
738 | { | ||
739 | samsung_cmu_register_one(np, &fsys1_cmu_info); | ||
740 | } | ||
741 | |||
742 | CLK_OF_DECLARE(exynos7_clk_fsys1, "samsung,exynos7-clock-fsys1", | ||
743 | exynos7_clk_fsys1_init); | ||
diff --git a/drivers/clk/samsung/clk-pll.c b/drivers/clk/samsung/clk-pll.c index b07fad2a9167..9d70e5c03804 100644 --- a/drivers/clk/samsung/clk-pll.c +++ b/drivers/clk/samsung/clk-pll.c | |||
@@ -482,6 +482,8 @@ static const struct clk_ops samsung_pll45xx_clk_min_ops = { | |||
482 | 482 | ||
483 | #define PLL46XX_VSEL_MASK (1) | 483 | #define PLL46XX_VSEL_MASK (1) |
484 | #define PLL46XX_MDIV_MASK (0x1FF) | 484 | #define PLL46XX_MDIV_MASK (0x1FF) |
485 | #define PLL1460X_MDIV_MASK (0x3FF) | ||
486 | |||
485 | #define PLL46XX_PDIV_MASK (0x3F) | 487 | #define PLL46XX_PDIV_MASK (0x3F) |
486 | #define PLL46XX_SDIV_MASK (0x7) | 488 | #define PLL46XX_SDIV_MASK (0x7) |
487 | #define PLL46XX_VSEL_SHIFT (27) | 489 | #define PLL46XX_VSEL_SHIFT (27) |
@@ -511,13 +513,15 @@ static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw, | |||
511 | 513 | ||
512 | pll_con0 = __raw_readl(pll->con_reg); | 514 | pll_con0 = __raw_readl(pll->con_reg); |
513 | pll_con1 = __raw_readl(pll->con_reg + 4); | 515 | pll_con1 = __raw_readl(pll->con_reg + 4); |
514 | mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK; | 516 | mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & ((pll->type == pll_1460x) ? |
517 | PLL1460X_MDIV_MASK : PLL46XX_MDIV_MASK); | ||
515 | pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; | 518 | pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK; |
516 | sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK; | 519 | sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK; |
517 | kdiv = pll->type == pll_4650c ? pll_con1 & PLL4650C_KDIV_MASK : | 520 | kdiv = pll->type == pll_4650c ? pll_con1 & PLL4650C_KDIV_MASK : |
518 | pll_con1 & PLL46XX_KDIV_MASK; | 521 | pll_con1 & PLL46XX_KDIV_MASK; |
519 | 522 | ||
520 | shift = pll->type == pll_4600 ? 16 : 10; | 523 | shift = ((pll->type == pll_4600) || (pll->type == pll_1460x)) ? 16 : 10; |
524 | |||
521 | fvco *= (mdiv << shift) + kdiv; | 525 | fvco *= (mdiv << shift) + kdiv; |
522 | do_div(fvco, (pdiv << sdiv)); | 526 | do_div(fvco, (pdiv << sdiv)); |
523 | fvco >>= shift; | 527 | fvco >>= shift; |
@@ -573,14 +577,21 @@ static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate, | |||
573 | lock = 0xffff; | 577 | lock = 0xffff; |
574 | 578 | ||
575 | /* Set PLL PMS and VSEL values. */ | 579 | /* Set PLL PMS and VSEL values. */ |
576 | con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | 580 | if (pll->type == pll_1460x) { |
581 | con0 &= ~((PLL1460X_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | ||
582 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | | ||
583 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT)); | ||
584 | } else { | ||
585 | con0 &= ~((PLL46XX_MDIV_MASK << PLL46XX_MDIV_SHIFT) | | ||
577 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | | 586 | (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT) | |
578 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | | 587 | (PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT) | |
579 | (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); | 588 | (PLL46XX_VSEL_MASK << PLL46XX_VSEL_SHIFT)); |
589 | con0 |= rate->vsel << PLL46XX_VSEL_SHIFT; | ||
590 | } | ||
591 | |||
580 | con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | | 592 | con0 |= (rate->mdiv << PLL46XX_MDIV_SHIFT) | |
581 | (rate->pdiv << PLL46XX_PDIV_SHIFT) | | 593 | (rate->pdiv << PLL46XX_PDIV_SHIFT) | |
582 | (rate->sdiv << PLL46XX_SDIV_SHIFT) | | 594 | (rate->sdiv << PLL46XX_SDIV_SHIFT); |
583 | (rate->vsel << PLL46XX_VSEL_SHIFT); | ||
584 | 595 | ||
585 | /* Set PLL K, MFR and MRR values. */ | 596 | /* Set PLL K, MFR and MRR values. */ |
586 | con1 = __raw_readl(pll->con_reg + 0x4); | 597 | con1 = __raw_readl(pll->con_reg + 0x4); |
@@ -1190,6 +1201,9 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, | |||
1190 | /* clk_ops for 35xx and 2550 are similar */ | 1201 | /* clk_ops for 35xx and 2550 are similar */ |
1191 | case pll_35xx: | 1202 | case pll_35xx: |
1192 | case pll_2550: | 1203 | case pll_2550: |
1204 | case pll_1450x: | ||
1205 | case pll_1451x: | ||
1206 | case pll_1452x: | ||
1193 | if (!pll->rate_table) | 1207 | if (!pll->rate_table) |
1194 | init.ops = &samsung_pll35xx_clk_min_ops; | 1208 | init.ops = &samsung_pll35xx_clk_min_ops; |
1195 | else | 1209 | else |
@@ -1223,6 +1237,7 @@ static void __init _samsung_clk_register_pll(struct samsung_clk_provider *ctx, | |||
1223 | case pll_4600: | 1237 | case pll_4600: |
1224 | case pll_4650: | 1238 | case pll_4650: |
1225 | case pll_4650c: | 1239 | case pll_4650c: |
1240 | case pll_1460x: | ||
1226 | if (!pll->rate_table) | 1241 | if (!pll->rate_table) |
1227 | init.ops = &samsung_pll46xx_clk_min_ops; | 1242 | init.ops = &samsung_pll46xx_clk_min_ops; |
1228 | else | 1243 | else |
diff --git a/drivers/clk/samsung/clk-pll.h b/drivers/clk/samsung/clk-pll.h index c0ed4d41fd90..213de9af8b4f 100644 --- a/drivers/clk/samsung/clk-pll.h +++ b/drivers/clk/samsung/clk-pll.h | |||
@@ -33,6 +33,10 @@ enum samsung_pll_type { | |||
33 | pll_s3c2440_mpll, | 33 | pll_s3c2440_mpll, |
34 | pll_2550xx, | 34 | pll_2550xx, |
35 | pll_2650xx, | 35 | pll_2650xx, |
36 | pll_1450x, | ||
37 | pll_1451x, | ||
38 | pll_1452x, | ||
39 | pll_1460x, | ||
36 | }; | 40 | }; |
37 | 41 | ||
38 | #define PLL_35XX_RATE(_rate, _m, _p, _s) \ | 42 | #define PLL_35XX_RATE(_rate, _m, _p, _s) \ |
diff --git a/drivers/clk/samsung/clk.c b/drivers/clk/samsung/clk.c index deab84d9f37d..4bda54095a16 100644 --- a/drivers/clk/samsung/clk.c +++ b/drivers/clk/samsung/clk.c | |||
@@ -11,9 +11,13 @@ | |||
11 | * clock framework for Samsung platforms. | 11 | * clock framework for Samsung platforms. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/of_address.h> | ||
14 | #include <linux/syscore_ops.h> | 15 | #include <linux/syscore_ops.h> |
16 | |||
15 | #include "clk.h" | 17 | #include "clk.h" |
16 | 18 | ||
19 | static LIST_HEAD(clock_reg_cache_list); | ||
20 | |||
17 | void samsung_clk_save(void __iomem *base, | 21 | void samsung_clk_save(void __iomem *base, |
18 | struct samsung_clk_reg_dump *rd, | 22 | struct samsung_clk_reg_dump *rd, |
19 | unsigned int num_regs) | 23 | unsigned int num_regs) |
@@ -281,7 +285,6 @@ void __init samsung_clk_register_gate(struct samsung_clk_provider *ctx, | |||
281 | * obtain the clock speed of all external fixed clock sources from device | 285 | * obtain the clock speed of all external fixed clock sources from device |
282 | * tree and register it | 286 | * tree and register it |
283 | */ | 287 | */ |
284 | #ifdef CONFIG_OF | ||
285 | void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx, | 288 | void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx, |
286 | struct samsung_fixed_rate_clock *fixed_rate_clk, | 289 | struct samsung_fixed_rate_clock *fixed_rate_clk, |
287 | unsigned int nr_fixed_rate_clk, | 290 | unsigned int nr_fixed_rate_clk, |
@@ -298,7 +301,6 @@ void __init samsung_clk_of_register_fixed_ext(struct samsung_clk_provider *ctx, | |||
298 | } | 301 | } |
299 | samsung_clk_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk); | 302 | samsung_clk_register_fixed_rate(ctx, fixed_rate_clk, nr_fixed_rate_clk); |
300 | } | 303 | } |
301 | #endif | ||
302 | 304 | ||
303 | /* utility function to get the rate of a specified clock */ | 305 | /* utility function to get the rate of a specified clock */ |
304 | unsigned long _get_rate(const char *clk_name) | 306 | unsigned long _get_rate(const char *clk_name) |
@@ -313,3 +315,99 @@ unsigned long _get_rate(const char *clk_name) | |||
313 | 315 | ||
314 | return clk_get_rate(clk); | 316 | return clk_get_rate(clk); |
315 | } | 317 | } |
318 | |||
319 | #ifdef CONFIG_PM_SLEEP | ||
320 | static int samsung_clk_suspend(void) | ||
321 | { | ||
322 | struct samsung_clock_reg_cache *reg_cache; | ||
323 | |||
324 | list_for_each_entry(reg_cache, &clock_reg_cache_list, node) | ||
325 | samsung_clk_save(reg_cache->reg_base, reg_cache->rdump, | ||
326 | reg_cache->rd_num); | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | static void samsung_clk_resume(void) | ||
331 | { | ||
332 | struct samsung_clock_reg_cache *reg_cache; | ||
333 | |||
334 | list_for_each_entry(reg_cache, &clock_reg_cache_list, node) | ||
335 | samsung_clk_restore(reg_cache->reg_base, reg_cache->rdump, | ||
336 | reg_cache->rd_num); | ||
337 | } | ||
338 | |||
339 | static struct syscore_ops samsung_clk_syscore_ops = { | ||
340 | .suspend = samsung_clk_suspend, | ||
341 | .resume = samsung_clk_resume, | ||
342 | }; | ||
343 | |||
344 | static void samsung_clk_sleep_init(void __iomem *reg_base, | ||
345 | const unsigned long *rdump, | ||
346 | unsigned long nr_rdump) | ||
347 | { | ||
348 | struct samsung_clock_reg_cache *reg_cache; | ||
349 | |||
350 | reg_cache = kzalloc(sizeof(struct samsung_clock_reg_cache), | ||
351 | GFP_KERNEL); | ||
352 | if (!reg_cache) | ||
353 | panic("could not allocate register reg_cache.\n"); | ||
354 | reg_cache->rdump = samsung_clk_alloc_reg_dump(rdump, nr_rdump); | ||
355 | |||
356 | if (!reg_cache->rdump) | ||
357 | panic("could not allocate register dump storage.\n"); | ||
358 | |||
359 | if (list_empty(&clock_reg_cache_list)) | ||
360 | register_syscore_ops(&samsung_clk_syscore_ops); | ||
361 | |||
362 | reg_cache->reg_base = reg_base; | ||
363 | reg_cache->rd_num = nr_rdump; | ||
364 | list_add_tail(®_cache->node, &clock_reg_cache_list); | ||
365 | } | ||
366 | |||
367 | #else | ||
368 | static void samsung_clk_sleep_init(void __iomem *reg_base, | ||
369 | const unsigned long *rdump, | ||
370 | unsigned long nr_rdump) {} | ||
371 | #endif | ||
372 | |||
373 | /* | ||
374 | * Common function which registers plls, muxes, dividers and gates | ||
375 | * for each CMU. It also add CMU register list to register cache. | ||
376 | */ | ||
377 | void __init samsung_cmu_register_one(struct device_node *np, | ||
378 | struct samsung_cmu_info *cmu) | ||
379 | { | ||
380 | void __iomem *reg_base; | ||
381 | struct samsung_clk_provider *ctx; | ||
382 | |||
383 | reg_base = of_iomap(np, 0); | ||
384 | if (!reg_base) | ||
385 | panic("%s: failed to map registers\n", __func__); | ||
386 | |||
387 | ctx = samsung_clk_init(np, reg_base, cmu->nr_clk_ids); | ||
388 | if (!ctx) | ||
389 | panic("%s: unable to alllocate ctx\n", __func__); | ||
390 | |||
391 | if (cmu->pll_clks) | ||
392 | samsung_clk_register_pll(ctx, cmu->pll_clks, cmu->nr_pll_clks, | ||
393 | reg_base); | ||
394 | if (cmu->mux_clks) | ||
395 | samsung_clk_register_mux(ctx, cmu->mux_clks, | ||
396 | cmu->nr_mux_clks); | ||
397 | if (cmu->div_clks) | ||
398 | samsung_clk_register_div(ctx, cmu->div_clks, cmu->nr_div_clks); | ||
399 | if (cmu->gate_clks) | ||
400 | samsung_clk_register_gate(ctx, cmu->gate_clks, | ||
401 | cmu->nr_gate_clks); | ||
402 | if (cmu->fixed_clks) | ||
403 | samsung_clk_register_fixed_rate(ctx, cmu->fixed_clks, | ||
404 | cmu->nr_fixed_clks); | ||
405 | if (cmu->fixed_factor_clks) | ||
406 | samsung_clk_register_fixed_factor(ctx, cmu->fixed_factor_clks, | ||
407 | cmu->nr_fixed_factor_clks); | ||
408 | if (cmu->clk_regs) | ||
409 | samsung_clk_sleep_init(reg_base, cmu->clk_regs, | ||
410 | cmu->nr_clk_regs); | ||
411 | |||
412 | samsung_clk_of_add_provider(np, ctx); | ||
413 | } | ||
diff --git a/drivers/clk/samsung/clk.h b/drivers/clk/samsung/clk.h index 66ab36b5cef1..8acabe1f32c4 100644 --- a/drivers/clk/samsung/clk.h +++ b/drivers/clk/samsung/clk.h | |||
@@ -13,19 +13,15 @@ | |||
13 | #ifndef __SAMSUNG_CLK_H | 13 | #ifndef __SAMSUNG_CLK_H |
14 | #define __SAMSUNG_CLK_H | 14 | #define __SAMSUNG_CLK_H |
15 | 15 | ||
16 | #include <linux/clk.h> | ||
17 | #include <linux/clkdev.h> | 16 | #include <linux/clkdev.h> |
18 | #include <linux/io.h> | ||
19 | #include <linux/clk-provider.h> | 17 | #include <linux/clk-provider.h> |
20 | #include <linux/of.h> | ||
21 | #include <linux/of_address.h> | ||
22 | #include "clk-pll.h" | 18 | #include "clk-pll.h" |
23 | 19 | ||
24 | /** | 20 | /** |
25 | * struct samsung_clk_provider: information about clock provider | 21 | * struct samsung_clk_provider: information about clock provider |
26 | * @reg_base: virtual address for the register base. | 22 | * @reg_base: virtual address for the register base. |
27 | * @clk_data: holds clock related data like clk* and number of clocks. | 23 | * @clk_data: holds clock related data like clk* and number of clocks. |
28 | * @lock: maintains exclusion bwtween callbacks for a given clock-provider. | 24 | * @lock: maintains exclusion between callbacks for a given clock-provider. |
29 | */ | 25 | */ |
30 | struct samsung_clk_provider { | 26 | struct samsung_clk_provider { |
31 | void __iomem *reg_base; | 27 | void __iomem *reg_base; |
@@ -324,6 +320,40 @@ struct samsung_pll_clock { | |||
324 | __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ | 320 | __PLL(_typ, _id, NULL, _name, _pname, CLK_GET_RATE_NOCACHE, \ |
325 | _lock, _con, _rtable, _alias) | 321 | _lock, _con, _rtable, _alias) |
326 | 322 | ||
323 | struct samsung_clock_reg_cache { | ||
324 | struct list_head node; | ||
325 | void __iomem *reg_base; | ||
326 | struct samsung_clk_reg_dump *rdump; | ||
327 | unsigned int rd_num; | ||
328 | }; | ||
329 | |||
330 | struct samsung_cmu_info { | ||
331 | /* list of pll clocks and respective count */ | ||
332 | struct samsung_pll_clock *pll_clks; | ||
333 | unsigned int nr_pll_clks; | ||
334 | /* list of mux clocks and respective count */ | ||
335 | struct samsung_mux_clock *mux_clks; | ||
336 | unsigned int nr_mux_clks; | ||
337 | /* list of div clocks and respective count */ | ||
338 | struct samsung_div_clock *div_clks; | ||
339 | unsigned int nr_div_clks; | ||
340 | /* list of gate clocks and respective count */ | ||
341 | struct samsung_gate_clock *gate_clks; | ||
342 | unsigned int nr_gate_clks; | ||
343 | /* list of fixed clocks and respective count */ | ||
344 | struct samsung_fixed_rate_clock *fixed_clks; | ||
345 | unsigned int nr_fixed_clks; | ||
346 | /* list of fixed factor clocks and respective count */ | ||
347 | struct samsung_fixed_factor_clock *fixed_factor_clks; | ||
348 | unsigned int nr_fixed_factor_clks; | ||
349 | /* total number of clocks with IDs assigned*/ | ||
350 | unsigned int nr_clk_ids; | ||
351 | |||
352 | /* list and number of clocks registers */ | ||
353 | unsigned long *clk_regs; | ||
354 | unsigned int nr_clk_regs; | ||
355 | }; | ||
356 | |||
327 | extern struct samsung_clk_provider *__init samsung_clk_init( | 357 | extern struct samsung_clk_provider *__init samsung_clk_init( |
328 | struct device_node *np, void __iomem *base, | 358 | struct device_node *np, void __iomem *base, |
329 | unsigned long nr_clks); | 359 | unsigned long nr_clks); |
@@ -362,6 +392,9 @@ extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx, | |||
362 | struct samsung_pll_clock *pll_list, | 392 | struct samsung_pll_clock *pll_list, |
363 | unsigned int nr_clk, void __iomem *base); | 393 | unsigned int nr_clk, void __iomem *base); |
364 | 394 | ||
395 | extern void __init samsung_cmu_register_one(struct device_node *, | ||
396 | struct samsung_cmu_info *); | ||
397 | |||
365 | extern unsigned long _get_rate(const char *clk_name); | 398 | extern unsigned long _get_rate(const char *clk_name); |
366 | 399 | ||
367 | extern void samsung_clk_save(void __iomem *base, | 400 | extern void samsung_clk_save(void __iomem *base, |
diff --git a/drivers/clk/shmobile/clk-div6.c b/drivers/clk/shmobile/clk-div6.c index f065f694cb65..639241e31e03 100644 --- a/drivers/clk/shmobile/clk-div6.c +++ b/drivers/clk/shmobile/clk-div6.c | |||
@@ -32,6 +32,9 @@ struct div6_clock { | |||
32 | struct clk_hw hw; | 32 | struct clk_hw hw; |
33 | void __iomem *reg; | 33 | void __iomem *reg; |
34 | unsigned int div; | 34 | unsigned int div; |
35 | u32 src_shift; | ||
36 | u32 src_width; | ||
37 | u8 *parents; | ||
35 | }; | 38 | }; |
36 | 39 | ||
37 | #define to_div6_clock(_hw) container_of(_hw, struct div6_clock, hw) | 40 | #define to_div6_clock(_hw) container_of(_hw, struct div6_clock, hw) |
@@ -39,8 +42,11 @@ struct div6_clock { | |||
39 | static int cpg_div6_clock_enable(struct clk_hw *hw) | 42 | static int cpg_div6_clock_enable(struct clk_hw *hw) |
40 | { | 43 | { |
41 | struct div6_clock *clock = to_div6_clock(hw); | 44 | struct div6_clock *clock = to_div6_clock(hw); |
45 | u32 val; | ||
42 | 46 | ||
43 | clk_writel(CPG_DIV6_DIV(clock->div - 1), clock->reg); | 47 | val = (clk_readl(clock->reg) & ~(CPG_DIV6_DIV_MASK | CPG_DIV6_CKSTP)) |
48 | | CPG_DIV6_DIV(clock->div - 1); | ||
49 | clk_writel(val, clock->reg); | ||
44 | 50 | ||
45 | return 0; | 51 | return 0; |
46 | } | 52 | } |
@@ -52,7 +58,7 @@ static void cpg_div6_clock_disable(struct clk_hw *hw) | |||
52 | /* DIV6 clocks require the divisor field to be non-zero when stopping | 58 | /* DIV6 clocks require the divisor field to be non-zero when stopping |
53 | * the clock. | 59 | * the clock. |
54 | */ | 60 | */ |
55 | clk_writel(CPG_DIV6_CKSTP | CPG_DIV6_DIV(CPG_DIV6_DIV_MASK), | 61 | clk_writel(clk_readl(clock->reg) | CPG_DIV6_CKSTP | CPG_DIV6_DIV_MASK, |
56 | clock->reg); | 62 | clock->reg); |
57 | } | 63 | } |
58 | 64 | ||
@@ -94,12 +100,53 @@ static int cpg_div6_clock_set_rate(struct clk_hw *hw, unsigned long rate, | |||
94 | { | 100 | { |
95 | struct div6_clock *clock = to_div6_clock(hw); | 101 | struct div6_clock *clock = to_div6_clock(hw); |
96 | unsigned int div = cpg_div6_clock_calc_div(rate, parent_rate); | 102 | unsigned int div = cpg_div6_clock_calc_div(rate, parent_rate); |
103 | u32 val; | ||
97 | 104 | ||
98 | clock->div = div; | 105 | clock->div = div; |
99 | 106 | ||
107 | val = clk_readl(clock->reg) & ~CPG_DIV6_DIV_MASK; | ||
100 | /* Only program the new divisor if the clock isn't stopped. */ | 108 | /* Only program the new divisor if the clock isn't stopped. */ |
101 | if (!(clk_readl(clock->reg) & CPG_DIV6_CKSTP)) | 109 | if (!(val & CPG_DIV6_CKSTP)) |
102 | clk_writel(CPG_DIV6_DIV(clock->div - 1), clock->reg); | 110 | clk_writel(val | CPG_DIV6_DIV(clock->div - 1), clock->reg); |
111 | |||
112 | return 0; | ||
113 | } | ||
114 | |||
115 | static u8 cpg_div6_clock_get_parent(struct clk_hw *hw) | ||
116 | { | ||
117 | struct div6_clock *clock = to_div6_clock(hw); | ||
118 | unsigned int i; | ||
119 | u8 hw_index; | ||
120 | |||
121 | if (clock->src_width == 0) | ||
122 | return 0; | ||
123 | |||
124 | hw_index = (clk_readl(clock->reg) >> clock->src_shift) & | ||
125 | (BIT(clock->src_width) - 1); | ||
126 | for (i = 0; i < __clk_get_num_parents(hw->clk); i++) { | ||
127 | if (clock->parents[i] == hw_index) | ||
128 | return i; | ||
129 | } | ||
130 | |||
131 | pr_err("%s: %s DIV6 clock set to invalid parent %u\n", | ||
132 | __func__, __clk_get_name(hw->clk), hw_index); | ||
133 | return 0; | ||
134 | } | ||
135 | |||
136 | static int cpg_div6_clock_set_parent(struct clk_hw *hw, u8 index) | ||
137 | { | ||
138 | struct div6_clock *clock = to_div6_clock(hw); | ||
139 | u8 hw_index; | ||
140 | u32 mask; | ||
141 | |||
142 | if (index >= __clk_get_num_parents(hw->clk)) | ||
143 | return -EINVAL; | ||
144 | |||
145 | mask = ~((BIT(clock->src_width) - 1) << clock->src_shift); | ||
146 | hw_index = clock->parents[index]; | ||
147 | |||
148 | clk_writel((clk_readl(clock->reg) & mask) | | ||
149 | (hw_index << clock->src_shift), clock->reg); | ||
103 | 150 | ||
104 | return 0; | 151 | return 0; |
105 | } | 152 | } |
@@ -108,6 +155,8 @@ static const struct clk_ops cpg_div6_clock_ops = { | |||
108 | .enable = cpg_div6_clock_enable, | 155 | .enable = cpg_div6_clock_enable, |
109 | .disable = cpg_div6_clock_disable, | 156 | .disable = cpg_div6_clock_disable, |
110 | .is_enabled = cpg_div6_clock_is_enabled, | 157 | .is_enabled = cpg_div6_clock_is_enabled, |
158 | .get_parent = cpg_div6_clock_get_parent, | ||
159 | .set_parent = cpg_div6_clock_set_parent, | ||
111 | .recalc_rate = cpg_div6_clock_recalc_rate, | 160 | .recalc_rate = cpg_div6_clock_recalc_rate, |
112 | .round_rate = cpg_div6_clock_round_rate, | 161 | .round_rate = cpg_div6_clock_round_rate, |
113 | .set_rate = cpg_div6_clock_set_rate, | 162 | .set_rate = cpg_div6_clock_set_rate, |
@@ -115,20 +164,33 @@ static const struct clk_ops cpg_div6_clock_ops = { | |||
115 | 164 | ||
116 | static void __init cpg_div6_clock_init(struct device_node *np) | 165 | static void __init cpg_div6_clock_init(struct device_node *np) |
117 | { | 166 | { |
167 | unsigned int num_parents, valid_parents; | ||
168 | const char **parent_names; | ||
118 | struct clk_init_data init; | 169 | struct clk_init_data init; |
119 | struct div6_clock *clock; | 170 | struct div6_clock *clock; |
120 | const char *parent_name; | ||
121 | const char *name; | 171 | const char *name; |
122 | struct clk *clk; | 172 | struct clk *clk; |
173 | unsigned int i; | ||
123 | int ret; | 174 | int ret; |
124 | 175 | ||
125 | clock = kzalloc(sizeof(*clock), GFP_KERNEL); | 176 | clock = kzalloc(sizeof(*clock), GFP_KERNEL); |
126 | if (!clock) { | 177 | if (!clock) |
127 | pr_err("%s: failed to allocate %s DIV6 clock\n", | 178 | return; |
179 | |||
180 | num_parents = of_clk_get_parent_count(np); | ||
181 | if (num_parents < 1) { | ||
182 | pr_err("%s: no parent found for %s DIV6 clock\n", | ||
128 | __func__, np->name); | 183 | __func__, np->name); |
129 | return; | 184 | return; |
130 | } | 185 | } |
131 | 186 | ||
187 | clock->parents = kmalloc_array(num_parents, sizeof(*clock->parents), | ||
188 | GFP_KERNEL); | ||
189 | parent_names = kmalloc_array(num_parents, sizeof(*parent_names), | ||
190 | GFP_KERNEL); | ||
191 | if (!parent_names) | ||
192 | return; | ||
193 | |||
132 | /* Remap the clock register and read the divisor. Disabling the | 194 | /* Remap the clock register and read the divisor. Disabling the |
133 | * clock overwrites the divisor, so we need to cache its value for the | 195 | * clock overwrites the divisor, so we need to cache its value for the |
134 | * enable operation. | 196 | * enable operation. |
@@ -150,9 +212,34 @@ static void __init cpg_div6_clock_init(struct device_node *np) | |||
150 | goto error; | 212 | goto error; |
151 | } | 213 | } |
152 | 214 | ||
153 | parent_name = of_clk_get_parent_name(np, 0); | 215 | |
154 | if (parent_name == NULL) { | 216 | for (i = 0, valid_parents = 0; i < num_parents; i++) { |
155 | pr_err("%s: failed to get %s DIV6 clock parent name\n", | 217 | const char *name = of_clk_get_parent_name(np, i); |
218 | |||
219 | if (name) { | ||
220 | parent_names[valid_parents] = name; | ||
221 | clock->parents[valid_parents] = i; | ||
222 | valid_parents++; | ||
223 | } | ||
224 | } | ||
225 | |||
226 | switch (num_parents) { | ||
227 | case 1: | ||
228 | /* fixed parent clock */ | ||
229 | clock->src_shift = clock->src_width = 0; | ||
230 | break; | ||
231 | case 4: | ||
232 | /* clock with EXSRC bits 6-7 */ | ||
233 | clock->src_shift = 6; | ||
234 | clock->src_width = 2; | ||
235 | break; | ||
236 | case 8: | ||
237 | /* VCLK with EXSRC bits 12-14 */ | ||
238 | clock->src_shift = 12; | ||
239 | clock->src_width = 3; | ||
240 | break; | ||
241 | default: | ||
242 | pr_err("%s: invalid number of parents for DIV6 clock %s\n", | ||
156 | __func__, np->name); | 243 | __func__, np->name); |
157 | goto error; | 244 | goto error; |
158 | } | 245 | } |
@@ -161,8 +248,8 @@ static void __init cpg_div6_clock_init(struct device_node *np) | |||
161 | init.name = name; | 248 | init.name = name; |
162 | init.ops = &cpg_div6_clock_ops; | 249 | init.ops = &cpg_div6_clock_ops; |
163 | init.flags = CLK_IS_BASIC; | 250 | init.flags = CLK_IS_BASIC; |
164 | init.parent_names = &parent_name; | 251 | init.parent_names = parent_names; |
165 | init.num_parents = 1; | 252 | init.num_parents = valid_parents; |
166 | 253 | ||
167 | clock->hw.init = &init; | 254 | clock->hw.init = &init; |
168 | 255 | ||
@@ -175,11 +262,13 @@ static void __init cpg_div6_clock_init(struct device_node *np) | |||
175 | 262 | ||
176 | of_clk_add_provider(np, of_clk_src_simple_get, clk); | 263 | of_clk_add_provider(np, of_clk_src_simple_get, clk); |
177 | 264 | ||
265 | kfree(parent_names); | ||
178 | return; | 266 | return; |
179 | 267 | ||
180 | error: | 268 | error: |
181 | if (clock->reg) | 269 | if (clock->reg) |
182 | iounmap(clock->reg); | 270 | iounmap(clock->reg); |
271 | kfree(parent_names); | ||
183 | kfree(clock); | 272 | kfree(clock); |
184 | } | 273 | } |
185 | CLK_OF_DECLARE(cpg_div6_clk, "renesas,cpg-div6-clock", cpg_div6_clock_init); | 274 | CLK_OF_DECLARE(cpg_div6_clk, "renesas,cpg-div6-clock", cpg_div6_clock_init); |
diff --git a/drivers/clk/sunxi/Makefile b/drivers/clk/sunxi/Makefile index 7ddc2b553846..a66953c0f430 100644 --- a/drivers/clk/sunxi/Makefile +++ b/drivers/clk/sunxi/Makefile | |||
@@ -7,6 +7,7 @@ obj-y += clk-a10-hosc.o | |||
7 | obj-y += clk-a20-gmac.o | 7 | obj-y += clk-a20-gmac.o |
8 | obj-y += clk-mod0.o | 8 | obj-y += clk-mod0.o |
9 | obj-y += clk-sun8i-mbus.o | 9 | obj-y += clk-sun8i-mbus.o |
10 | obj-y += clk-sun9i-core.o | ||
10 | 11 | ||
11 | obj-$(CONFIG_MFD_SUN6I_PRCM) += \ | 12 | obj-$(CONFIG_MFD_SUN6I_PRCM) += \ |
12 | clk-sun6i-ar100.o clk-sun6i-apb0.o clk-sun6i-apb0-gates.o \ | 13 | clk-sun6i-ar100.o clk-sun6i-apb0.o clk-sun6i-apb0-gates.o \ |
diff --git a/drivers/clk/sunxi/clk-a20-gmac.c b/drivers/clk/sunxi/clk-a20-gmac.c index 5296fd6dd7b3..0dcf4f205fb8 100644 --- a/drivers/clk/sunxi/clk-a20-gmac.c +++ b/drivers/clk/sunxi/clk-a20-gmac.c | |||
@@ -53,6 +53,11 @@ static DEFINE_SPINLOCK(gmac_lock); | |||
53 | #define SUN7I_A20_GMAC_MASK 0x3 | 53 | #define SUN7I_A20_GMAC_MASK 0x3 |
54 | #define SUN7I_A20_GMAC_PARENTS 2 | 54 | #define SUN7I_A20_GMAC_PARENTS 2 |
55 | 55 | ||
56 | static u32 sun7i_a20_gmac_mux_table[SUN7I_A20_GMAC_PARENTS] = { | ||
57 | 0x00, /* Select mii_phy_tx_clk */ | ||
58 | 0x02, /* Select gmac_int_tx_clk */ | ||
59 | }; | ||
60 | |||
56 | static void __init sun7i_a20_gmac_clk_setup(struct device_node *node) | 61 | static void __init sun7i_a20_gmac_clk_setup(struct device_node *node) |
57 | { | 62 | { |
58 | struct clk *clk; | 63 | struct clk *clk; |
@@ -90,7 +95,7 @@ static void __init sun7i_a20_gmac_clk_setup(struct device_node *node) | |||
90 | gate->lock = &gmac_lock; | 95 | gate->lock = &gmac_lock; |
91 | mux->reg = reg; | 96 | mux->reg = reg; |
92 | mux->mask = SUN7I_A20_GMAC_MASK; | 97 | mux->mask = SUN7I_A20_GMAC_MASK; |
93 | mux->flags = CLK_MUX_INDEX_BIT; | 98 | mux->table = sun7i_a20_gmac_mux_table; |
94 | mux->lock = &gmac_lock; | 99 | mux->lock = &gmac_lock; |
95 | 100 | ||
96 | clk = clk_register_composite(NULL, clk_name, | 101 | clk = clk_register_composite(NULL, clk_name, |
diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c index f83ba097126c..62e08fb58554 100644 --- a/drivers/clk/sunxi/clk-factors.c +++ b/drivers/clk/sunxi/clk-factors.c | |||
@@ -81,7 +81,7 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate, | |||
81 | 81 | ||
82 | static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, | 82 | static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, |
83 | unsigned long *best_parent_rate, | 83 | unsigned long *best_parent_rate, |
84 | struct clk **best_parent_p) | 84 | struct clk_hw **best_parent_p) |
85 | { | 85 | { |
86 | struct clk *clk = hw->clk, *parent, *best_parent = NULL; | 86 | struct clk *clk = hw->clk, *parent, *best_parent = NULL; |
87 | int i, num_parents; | 87 | int i, num_parents; |
@@ -108,7 +108,7 @@ static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
108 | } | 108 | } |
109 | 109 | ||
110 | if (best_parent) | 110 | if (best_parent) |
111 | *best_parent_p = best_parent; | 111 | *best_parent_p = __clk_get_hw(best_parent); |
112 | *best_parent_rate = best; | 112 | *best_parent_rate = best; |
113 | 113 | ||
114 | return best_child_rate; | 114 | return best_child_rate; |
@@ -224,7 +224,7 @@ struct clk * __init sunxi_factors_register(struct device_node *node, | |||
224 | /* set up gate properties */ | 224 | /* set up gate properties */ |
225 | mux->reg = reg; | 225 | mux->reg = reg; |
226 | mux->shift = data->mux; | 226 | mux->shift = data->mux; |
227 | mux->mask = SUNXI_FACTORS_MUX_MASK; | 227 | mux->mask = data->muxmask; |
228 | mux->lock = factors->lock; | 228 | mux->lock = factors->lock; |
229 | mux_hw = &mux->hw; | 229 | mux_hw = &mux->hw; |
230 | } | 230 | } |
diff --git a/drivers/clk/sunxi/clk-factors.h b/drivers/clk/sunxi/clk-factors.h index 9913840018d3..912238fde132 100644 --- a/drivers/clk/sunxi/clk-factors.h +++ b/drivers/clk/sunxi/clk-factors.h | |||
@@ -7,8 +7,6 @@ | |||
7 | 7 | ||
8 | #define SUNXI_FACTORS_NOT_APPLICABLE (0) | 8 | #define SUNXI_FACTORS_NOT_APPLICABLE (0) |
9 | 9 | ||
10 | #define SUNXI_FACTORS_MUX_MASK 0x3 | ||
11 | |||
12 | struct clk_factors_config { | 10 | struct clk_factors_config { |
13 | u8 nshift; | 11 | u8 nshift; |
14 | u8 nwidth; | 12 | u8 nwidth; |
@@ -24,6 +22,7 @@ struct clk_factors_config { | |||
24 | struct factors_data { | 22 | struct factors_data { |
25 | int enable; | 23 | int enable; |
26 | int mux; | 24 | int mux; |
25 | int muxmask; | ||
27 | struct clk_factors_config *table; | 26 | struct clk_factors_config *table; |
28 | void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p); | 27 | void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p); |
29 | const char *name; | 28 | const char *name; |
diff --git a/drivers/clk/sunxi/clk-mod0.c b/drivers/clk/sunxi/clk-mod0.c index 4a563850ee6e..da0524eaee94 100644 --- a/drivers/clk/sunxi/clk-mod0.c +++ b/drivers/clk/sunxi/clk-mod0.c | |||
@@ -70,6 +70,7 @@ static struct clk_factors_config sun4i_a10_mod0_config = { | |||
70 | static const struct factors_data sun4i_a10_mod0_data __initconst = { | 70 | static const struct factors_data sun4i_a10_mod0_data __initconst = { |
71 | .enable = 31, | 71 | .enable = 31, |
72 | .mux = 24, | 72 | .mux = 24, |
73 | .muxmask = BIT(1) | BIT(0), | ||
73 | .table = &sun4i_a10_mod0_config, | 74 | .table = &sun4i_a10_mod0_config, |
74 | .getter = sun4i_a10_get_mod0_factors, | 75 | .getter = sun4i_a10_get_mod0_factors, |
75 | }; | 76 | }; |
diff --git a/drivers/clk/sunxi/clk-sun6i-ar100.c b/drivers/clk/sunxi/clk-sun6i-ar100.c index acca53290be2..3d282fb8f85c 100644 --- a/drivers/clk/sunxi/clk-sun6i-ar100.c +++ b/drivers/clk/sunxi/clk-sun6i-ar100.c | |||
@@ -46,7 +46,7 @@ static unsigned long ar100_recalc_rate(struct clk_hw *hw, | |||
46 | 46 | ||
47 | static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate, | 47 | static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate, |
48 | unsigned long *best_parent_rate, | 48 | unsigned long *best_parent_rate, |
49 | struct clk **best_parent_clk) | 49 | struct clk_hw **best_parent_clk) |
50 | { | 50 | { |
51 | int nparents = __clk_get_num_parents(hw->clk); | 51 | int nparents = __clk_get_num_parents(hw->clk); |
52 | long best_rate = -EINVAL; | 52 | long best_rate = -EINVAL; |
@@ -100,7 +100,7 @@ static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate, | |||
100 | 100 | ||
101 | tmp_rate = (parent_rate >> shift) / div; | 101 | tmp_rate = (parent_rate >> shift) / div; |
102 | if (!*best_parent_clk || tmp_rate > best_rate) { | 102 | if (!*best_parent_clk || tmp_rate > best_rate) { |
103 | *best_parent_clk = parent; | 103 | *best_parent_clk = __clk_get_hw(parent); |
104 | *best_parent_rate = parent_rate; | 104 | *best_parent_rate = parent_rate; |
105 | best_rate = tmp_rate; | 105 | best_rate = tmp_rate; |
106 | } | 106 | } |
diff --git a/drivers/clk/sunxi/clk-sun8i-mbus.c b/drivers/clk/sunxi/clk-sun8i-mbus.c index 8e49b44cee41..ef49786eefd3 100644 --- a/drivers/clk/sunxi/clk-sun8i-mbus.c +++ b/drivers/clk/sunxi/clk-sun8i-mbus.c | |||
@@ -60,6 +60,7 @@ static struct clk_factors_config sun8i_a23_mbus_config = { | |||
60 | static const struct factors_data sun8i_a23_mbus_data __initconst = { | 60 | static const struct factors_data sun8i_a23_mbus_data __initconst = { |
61 | .enable = 31, | 61 | .enable = 31, |
62 | .mux = 24, | 62 | .mux = 24, |
63 | .muxmask = BIT(1) | BIT(0), | ||
63 | .table = &sun8i_a23_mbus_config, | 64 | .table = &sun8i_a23_mbus_config, |
64 | .getter = sun8i_a23_get_mbus_factors, | 65 | .getter = sun8i_a23_get_mbus_factors, |
65 | }; | 66 | }; |
diff --git a/drivers/clk/sunxi/clk-sun9i-core.c b/drivers/clk/sunxi/clk-sun9i-core.c new file mode 100644 index 000000000000..3cb9036d91bb --- /dev/null +++ b/drivers/clk/sunxi/clk-sun9i-core.c | |||
@@ -0,0 +1,271 @@ | |||
1 | /* | ||
2 | * Copyright 2014 Chen-Yu Tsai | ||
3 | * | ||
4 | * Chen-Yu Tsai <wens@csie.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your 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 | |||
17 | #include <linux/clk-provider.h> | ||
18 | #include <linux/clkdev.h> | ||
19 | #include <linux/of.h> | ||
20 | #include <linux/of_address.h> | ||
21 | #include <linux/log2.h> | ||
22 | |||
23 | #include "clk-factors.h" | ||
24 | |||
25 | |||
26 | /** | ||
27 | * sun9i_a80_get_pll4_factors() - calculates n, p, m factors for PLL1 | ||
28 | * PLL4 rate is calculated as follows | ||
29 | * rate = (parent_rate * n >> p) / (m + 1); | ||
30 | * parent_rate is always 24Mhz | ||
31 | * | ||
32 | * p and m are named div1 and div2 in Allwinner's SDK | ||
33 | */ | ||
34 | |||
35 | static void sun9i_a80_get_pll4_factors(u32 *freq, u32 parent_rate, | ||
36 | u8 *n, u8 *k, u8 *m, u8 *p) | ||
37 | { | ||
38 | int div; | ||
39 | |||
40 | /* Normalize value to a 6M multiple */ | ||
41 | div = DIV_ROUND_UP(*freq, 6000000); | ||
42 | |||
43 | /* divs above 256 cannot be odd */ | ||
44 | if (div > 256) | ||
45 | div = round_up(div, 2); | ||
46 | |||
47 | /* divs above 512 must be a multiple of 4 */ | ||
48 | if (div > 512) | ||
49 | div = round_up(div, 4); | ||
50 | |||
51 | *freq = 6000000 * div; | ||
52 | |||
53 | /* we were called to round the frequency, we can now return */ | ||
54 | if (n == NULL) | ||
55 | return; | ||
56 | |||
57 | /* p will be 1 for divs under 512 */ | ||
58 | if (div < 512) | ||
59 | *p = 1; | ||
60 | else | ||
61 | *p = 0; | ||
62 | |||
63 | /* m will be 1 if div is odd */ | ||
64 | if (div & 1) | ||
65 | *m = 1; | ||
66 | else | ||
67 | *m = 0; | ||
68 | |||
69 | /* calculate a suitable n based on m and p */ | ||
70 | *n = div / (*p + 1) / (*m + 1); | ||
71 | } | ||
72 | |||
73 | static struct clk_factors_config sun9i_a80_pll4_config = { | ||
74 | .mshift = 18, | ||
75 | .mwidth = 1, | ||
76 | .nshift = 8, | ||
77 | .nwidth = 8, | ||
78 | .pshift = 16, | ||
79 | .pwidth = 1, | ||
80 | }; | ||
81 | |||
82 | static const struct factors_data sun9i_a80_pll4_data __initconst = { | ||
83 | .enable = 31, | ||
84 | .table = &sun9i_a80_pll4_config, | ||
85 | .getter = sun9i_a80_get_pll4_factors, | ||
86 | }; | ||
87 | |||
88 | static DEFINE_SPINLOCK(sun9i_a80_pll4_lock); | ||
89 | |||
90 | static void __init sun9i_a80_pll4_setup(struct device_node *node) | ||
91 | { | ||
92 | sunxi_factors_register(node, &sun9i_a80_pll4_data, &sun9i_a80_pll4_lock); | ||
93 | } | ||
94 | CLK_OF_DECLARE(sun9i_a80_pll4, "allwinner,sun9i-a80-pll4-clk", sun9i_a80_pll4_setup); | ||
95 | |||
96 | |||
97 | /** | ||
98 | * sun9i_a80_get_gt_factors() - calculates m factor for GT | ||
99 | * GT rate is calculated as follows | ||
100 | * rate = parent_rate / (m + 1); | ||
101 | */ | ||
102 | |||
103 | static void sun9i_a80_get_gt_factors(u32 *freq, u32 parent_rate, | ||
104 | u8 *n, u8 *k, u8 *m, u8 *p) | ||
105 | { | ||
106 | u32 div; | ||
107 | |||
108 | if (parent_rate < *freq) | ||
109 | *freq = parent_rate; | ||
110 | |||
111 | div = DIV_ROUND_UP(parent_rate, *freq); | ||
112 | |||
113 | /* maximum divider is 4 */ | ||
114 | if (div > 4) | ||
115 | div = 4; | ||
116 | |||
117 | *freq = parent_rate / div; | ||
118 | |||
119 | /* we were called to round the frequency, we can now return */ | ||
120 | if (!m) | ||
121 | return; | ||
122 | |||
123 | *m = div; | ||
124 | } | ||
125 | |||
126 | static struct clk_factors_config sun9i_a80_gt_config = { | ||
127 | .mshift = 0, | ||
128 | .mwidth = 2, | ||
129 | }; | ||
130 | |||
131 | static const struct factors_data sun9i_a80_gt_data __initconst = { | ||
132 | .mux = 24, | ||
133 | .muxmask = BIT(1) | BIT(0), | ||
134 | .table = &sun9i_a80_gt_config, | ||
135 | .getter = sun9i_a80_get_gt_factors, | ||
136 | }; | ||
137 | |||
138 | static DEFINE_SPINLOCK(sun9i_a80_gt_lock); | ||
139 | |||
140 | static void __init sun9i_a80_gt_setup(struct device_node *node) | ||
141 | { | ||
142 | struct clk *gt = sunxi_factors_register(node, &sun9i_a80_gt_data, | ||
143 | &sun9i_a80_gt_lock); | ||
144 | |||
145 | /* The GT bus clock needs to be always enabled */ | ||
146 | __clk_get(gt); | ||
147 | clk_prepare_enable(gt); | ||
148 | } | ||
149 | CLK_OF_DECLARE(sun9i_a80_gt, "allwinner,sun9i-a80-gt-clk", sun9i_a80_gt_setup); | ||
150 | |||
151 | |||
152 | /** | ||
153 | * sun9i_a80_get_ahb_factors() - calculates p factor for AHB0/1/2 | ||
154 | * AHB rate is calculated as follows | ||
155 | * rate = parent_rate >> p; | ||
156 | */ | ||
157 | |||
158 | static void sun9i_a80_get_ahb_factors(u32 *freq, u32 parent_rate, | ||
159 | u8 *n, u8 *k, u8 *m, u8 *p) | ||
160 | { | ||
161 | u32 _p; | ||
162 | |||
163 | if (parent_rate < *freq) | ||
164 | *freq = parent_rate; | ||
165 | |||
166 | _p = order_base_2(DIV_ROUND_UP(parent_rate, *freq)); | ||
167 | |||
168 | /* maximum p is 3 */ | ||
169 | if (_p > 3) | ||
170 | _p = 3; | ||
171 | |||
172 | *freq = parent_rate >> _p; | ||
173 | |||
174 | /* we were called to round the frequency, we can now return */ | ||
175 | if (!p) | ||
176 | return; | ||
177 | |||
178 | *p = _p; | ||
179 | } | ||
180 | |||
181 | static struct clk_factors_config sun9i_a80_ahb_config = { | ||
182 | .pshift = 0, | ||
183 | .pwidth = 2, | ||
184 | }; | ||
185 | |||
186 | static const struct factors_data sun9i_a80_ahb_data __initconst = { | ||
187 | .mux = 24, | ||
188 | .muxmask = BIT(1) | BIT(0), | ||
189 | .table = &sun9i_a80_ahb_config, | ||
190 | .getter = sun9i_a80_get_ahb_factors, | ||
191 | }; | ||
192 | |||
193 | static DEFINE_SPINLOCK(sun9i_a80_ahb_lock); | ||
194 | |||
195 | static void __init sun9i_a80_ahb_setup(struct device_node *node) | ||
196 | { | ||
197 | sunxi_factors_register(node, &sun9i_a80_ahb_data, &sun9i_a80_ahb_lock); | ||
198 | } | ||
199 | CLK_OF_DECLARE(sun9i_a80_ahb, "allwinner,sun9i-a80-ahb-clk", sun9i_a80_ahb_setup); | ||
200 | |||
201 | |||
202 | static const struct factors_data sun9i_a80_apb0_data __initconst = { | ||
203 | .mux = 24, | ||
204 | .muxmask = BIT(0), | ||
205 | .table = &sun9i_a80_ahb_config, | ||
206 | .getter = sun9i_a80_get_ahb_factors, | ||
207 | }; | ||
208 | |||
209 | static DEFINE_SPINLOCK(sun9i_a80_apb0_lock); | ||
210 | |||
211 | static void __init sun9i_a80_apb0_setup(struct device_node *node) | ||
212 | { | ||
213 | sunxi_factors_register(node, &sun9i_a80_apb0_data, &sun9i_a80_apb0_lock); | ||
214 | } | ||
215 | CLK_OF_DECLARE(sun9i_a80_apb0, "allwinner,sun9i-a80-apb0-clk", sun9i_a80_apb0_setup); | ||
216 | |||
217 | |||
218 | /** | ||
219 | * sun9i_a80_get_apb1_factors() - calculates m, p factors for APB1 | ||
220 | * APB1 rate is calculated as follows | ||
221 | * rate = (parent_rate >> p) / (m + 1); | ||
222 | */ | ||
223 | |||
224 | static void sun9i_a80_get_apb1_factors(u32 *freq, u32 parent_rate, | ||
225 | u8 *n, u8 *k, u8 *m, u8 *p) | ||
226 | { | ||
227 | u32 div; | ||
228 | u8 calcm, calcp; | ||
229 | |||
230 | if (parent_rate < *freq) | ||
231 | *freq = parent_rate; | ||
232 | |||
233 | div = DIV_ROUND_UP(parent_rate, *freq); | ||
234 | |||
235 | /* Highest possible divider is 256 (p = 3, m = 31) */ | ||
236 | if (div > 256) | ||
237 | div = 256; | ||
238 | |||
239 | calcp = order_base_2(div); | ||
240 | calcm = (parent_rate >> calcp) - 1; | ||
241 | *freq = (parent_rate >> calcp) / (calcm + 1); | ||
242 | |||
243 | /* we were called to round the frequency, we can now return */ | ||
244 | if (n == NULL) | ||
245 | return; | ||
246 | |||
247 | *m = calcm; | ||
248 | *p = calcp; | ||
249 | } | ||
250 | |||
251 | static struct clk_factors_config sun9i_a80_apb1_config = { | ||
252 | .mshift = 0, | ||
253 | .mwidth = 5, | ||
254 | .pshift = 16, | ||
255 | .pwidth = 2, | ||
256 | }; | ||
257 | |||
258 | static const struct factors_data sun9i_a80_apb1_data __initconst = { | ||
259 | .mux = 24, | ||
260 | .muxmask = BIT(0), | ||
261 | .table = &sun9i_a80_apb1_config, | ||
262 | .getter = sun9i_a80_get_apb1_factors, | ||
263 | }; | ||
264 | |||
265 | static DEFINE_SPINLOCK(sun9i_a80_apb1_lock); | ||
266 | |||
267 | static void __init sun9i_a80_apb1_setup(struct device_node *node) | ||
268 | { | ||
269 | sunxi_factors_register(node, &sun9i_a80_apb1_data, &sun9i_a80_apb1_lock); | ||
270 | } | ||
271 | CLK_OF_DECLARE(sun9i_a80_apb1, "allwinner,sun9i-a80-apb1-clk", sun9i_a80_apb1_setup); | ||
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c index d5dc951264ca..570202582dcf 100644 --- a/drivers/clk/sunxi/clk-sunxi.c +++ b/drivers/clk/sunxi/clk-sunxi.c | |||
@@ -245,9 +245,9 @@ static void sun4i_get_pll5_factors(u32 *freq, u32 parent_rate, | |||
245 | } | 245 | } |
246 | 246 | ||
247 | /** | 247 | /** |
248 | * sun6i_a31_get_pll6_factors() - calculates n, k factors for A31 PLL6 | 248 | * sun6i_a31_get_pll6_factors() - calculates n, k factors for A31 PLL6x2 |
249 | * PLL6 rate is calculated as follows | 249 | * PLL6x2 rate is calculated as follows |
250 | * rate = parent_rate * n * (k + 1) / 2 | 250 | * rate = parent_rate * (n + 1) * (k + 1) |
251 | * parent_rate is always 24Mhz | 251 | * parent_rate is always 24Mhz |
252 | */ | 252 | */ |
253 | 253 | ||
@@ -256,13 +256,7 @@ static void sun6i_a31_get_pll6_factors(u32 *freq, u32 parent_rate, | |||
256 | { | 256 | { |
257 | u8 div; | 257 | u8 div; |
258 | 258 | ||
259 | /* | 259 | /* Normalize value to a parent_rate multiple (24M) */ |
260 | * We always have 24MHz / 2, so we can just say that our | ||
261 | * parent clock is 12MHz. | ||
262 | */ | ||
263 | parent_rate = parent_rate / 2; | ||
264 | |||
265 | /* Normalize value to a parent_rate multiple (24M / 2) */ | ||
266 | div = *freq / parent_rate; | 260 | div = *freq / parent_rate; |
267 | *freq = parent_rate * div; | 261 | *freq = parent_rate * div; |
268 | 262 | ||
@@ -274,7 +268,7 @@ static void sun6i_a31_get_pll6_factors(u32 *freq, u32 parent_rate, | |||
274 | if (*k > 3) | 268 | if (*k > 3) |
275 | *k = 3; | 269 | *k = 3; |
276 | 270 | ||
277 | *n = DIV_ROUND_UP(div, (*k+1)); | 271 | *n = DIV_ROUND_UP(div, (*k+1)) - 1; |
278 | } | 272 | } |
279 | 273 | ||
280 | /** | 274 | /** |
@@ -445,6 +439,7 @@ static struct clk_factors_config sun6i_a31_pll6_config = { | |||
445 | .nwidth = 5, | 439 | .nwidth = 5, |
446 | .kshift = 4, | 440 | .kshift = 4, |
447 | .kwidth = 2, | 441 | .kwidth = 2, |
442 | .n_start = 1, | ||
448 | }; | 443 | }; |
449 | 444 | ||
450 | static struct clk_factors_config sun4i_apb1_config = { | 445 | static struct clk_factors_config sun4i_apb1_config = { |
@@ -504,9 +499,12 @@ static const struct factors_data sun6i_a31_pll6_data __initconst = { | |||
504 | .enable = 31, | 499 | .enable = 31, |
505 | .table = &sun6i_a31_pll6_config, | 500 | .table = &sun6i_a31_pll6_config, |
506 | .getter = sun6i_a31_get_pll6_factors, | 501 | .getter = sun6i_a31_get_pll6_factors, |
502 | .name = "pll6x2", | ||
507 | }; | 503 | }; |
508 | 504 | ||
509 | static const struct factors_data sun4i_apb1_data __initconst = { | 505 | static const struct factors_data sun4i_apb1_data __initconst = { |
506 | .mux = 24, | ||
507 | .muxmask = BIT(1) | BIT(0), | ||
510 | .table = &sun4i_apb1_config, | 508 | .table = &sun4i_apb1_config, |
511 | .getter = sun4i_get_apb1_factors, | 509 | .getter = sun4i_get_apb1_factors, |
512 | }; | 510 | }; |
@@ -514,6 +512,7 @@ static const struct factors_data sun4i_apb1_data __initconst = { | |||
514 | static const struct factors_data sun7i_a20_out_data __initconst = { | 512 | static const struct factors_data sun7i_a20_out_data __initconst = { |
515 | .enable = 31, | 513 | .enable = 31, |
516 | .mux = 24, | 514 | .mux = 24, |
515 | .muxmask = BIT(1) | BIT(0), | ||
517 | .table = &sun7i_a20_out_config, | 516 | .table = &sun7i_a20_out_config, |
518 | .getter = sun7i_a20_get_out_factors, | 517 | .getter = sun7i_a20_get_out_factors, |
519 | }; | 518 | }; |
@@ -544,10 +543,6 @@ static const struct mux_data sun6i_a31_ahb1_mux_data __initconst = { | |||
544 | .shift = 12, | 543 | .shift = 12, |
545 | }; | 544 | }; |
546 | 545 | ||
547 | static const struct mux_data sun4i_apb1_mux_data __initconst = { | ||
548 | .shift = 24, | ||
549 | }; | ||
550 | |||
551 | static void __init sunxi_mux_clk_setup(struct device_node *node, | 546 | static void __init sunxi_mux_clk_setup(struct device_node *node, |
552 | struct mux_data *data) | 547 | struct mux_data *data) |
553 | { | 548 | { |
@@ -633,12 +628,6 @@ static const struct div_data sun4i_apb0_data __initconst = { | |||
633 | .table = sun4i_apb0_table, | 628 | .table = sun4i_apb0_table, |
634 | }; | 629 | }; |
635 | 630 | ||
636 | static const struct div_data sun6i_a31_apb2_div_data __initconst = { | ||
637 | .shift = 0, | ||
638 | .pow = 0, | ||
639 | .width = 4, | ||
640 | }; | ||
641 | |||
642 | static void __init sunxi_divider_clk_setup(struct device_node *node, | 631 | static void __init sunxi_divider_clk_setup(struct device_node *node, |
643 | struct div_data *data) | 632 | struct div_data *data) |
644 | { | 633 | { |
@@ -757,6 +746,18 @@ static const struct gates_data sun8i_a23_ahb1_gates_data __initconst = { | |||
757 | .mask = {0x25386742, 0x2505111}, | 746 | .mask = {0x25386742, 0x2505111}, |
758 | }; | 747 | }; |
759 | 748 | ||
749 | static const struct gates_data sun9i_a80_ahb0_gates_data __initconst = { | ||
750 | .mask = {0xF5F12B}, | ||
751 | }; | ||
752 | |||
753 | static const struct gates_data sun9i_a80_ahb1_gates_data __initconst = { | ||
754 | .mask = {0x1E20003}, | ||
755 | }; | ||
756 | |||
757 | static const struct gates_data sun9i_a80_ahb2_gates_data __initconst = { | ||
758 | .mask = {0x9B7}, | ||
759 | }; | ||
760 | |||
760 | static const struct gates_data sun4i_apb0_gates_data __initconst = { | 761 | static const struct gates_data sun4i_apb0_gates_data __initconst = { |
761 | .mask = {0x4EF}, | 762 | .mask = {0x4EF}, |
762 | }; | 763 | }; |
@@ -773,6 +774,10 @@ static const struct gates_data sun7i_a20_apb0_gates_data __initconst = { | |||
773 | .mask = { 0x4ff }, | 774 | .mask = { 0x4ff }, |
774 | }; | 775 | }; |
775 | 776 | ||
777 | static const struct gates_data sun9i_a80_apb0_gates_data __initconst = { | ||
778 | .mask = {0xEB822}, | ||
779 | }; | ||
780 | |||
776 | static const struct gates_data sun4i_apb1_gates_data __initconst = { | 781 | static const struct gates_data sun4i_apb1_gates_data __initconst = { |
777 | .mask = {0xFF00F7}, | 782 | .mask = {0xFF00F7}, |
778 | }; | 783 | }; |
@@ -801,6 +806,10 @@ static const struct gates_data sun7i_a20_apb1_gates_data __initconst = { | |||
801 | .mask = { 0xff80ff }, | 806 | .mask = { 0xff80ff }, |
802 | }; | 807 | }; |
803 | 808 | ||
809 | static const struct gates_data sun9i_a80_apb1_gates_data __initconst = { | ||
810 | .mask = {0x3F001F}, | ||
811 | }; | ||
812 | |||
804 | static const struct gates_data sun8i_a23_apb2_gates_data __initconst = { | 813 | static const struct gates_data sun8i_a23_apb2_gates_data __initconst = { |
805 | .mask = {0x1F0007}, | 814 | .mask = {0x1F0007}, |
806 | }; | 815 | }; |
@@ -893,6 +902,7 @@ static void __init sunxi_gates_clk_setup(struct device_node *node, | |||
893 | 902 | ||
894 | struct divs_data { | 903 | struct divs_data { |
895 | const struct factors_data *factors; /* data for the factor clock */ | 904 | const struct factors_data *factors; /* data for the factor clock */ |
905 | int ndivs; /* number of children */ | ||
896 | struct { | 906 | struct { |
897 | u8 fixed; /* is it a fixed divisor? if not... */ | 907 | u8 fixed; /* is it a fixed divisor? if not... */ |
898 | struct clk_div_table *table; /* is it a table based divisor? */ | 908 | struct clk_div_table *table; /* is it a table based divisor? */ |
@@ -912,6 +922,7 @@ static struct clk_div_table pll6_sata_tbl[] = { | |||
912 | 922 | ||
913 | static const struct divs_data pll5_divs_data __initconst = { | 923 | static const struct divs_data pll5_divs_data __initconst = { |
914 | .factors = &sun4i_pll5_data, | 924 | .factors = &sun4i_pll5_data, |
925 | .ndivs = 2, | ||
915 | .div = { | 926 | .div = { |
916 | { .shift = 0, .pow = 0, }, /* M, DDR */ | 927 | { .shift = 0, .pow = 0, }, /* M, DDR */ |
917 | { .shift = 16, .pow = 1, }, /* P, other */ | 928 | { .shift = 16, .pow = 1, }, /* P, other */ |
@@ -920,12 +931,21 @@ static const struct divs_data pll5_divs_data __initconst = { | |||
920 | 931 | ||
921 | static const struct divs_data pll6_divs_data __initconst = { | 932 | static const struct divs_data pll6_divs_data __initconst = { |
922 | .factors = &sun4i_pll6_data, | 933 | .factors = &sun4i_pll6_data, |
934 | .ndivs = 2, | ||
923 | .div = { | 935 | .div = { |
924 | { .shift = 0, .table = pll6_sata_tbl, .gate = 14 }, /* M, SATA */ | 936 | { .shift = 0, .table = pll6_sata_tbl, .gate = 14 }, /* M, SATA */ |
925 | { .fixed = 2 }, /* P, other */ | 937 | { .fixed = 2 }, /* P, other */ |
926 | } | 938 | } |
927 | }; | 939 | }; |
928 | 940 | ||
941 | static const struct divs_data sun6i_a31_pll6_divs_data __initconst = { | ||
942 | .factors = &sun6i_a31_pll6_data, | ||
943 | .ndivs = 1, | ||
944 | .div = { | ||
945 | { .fixed = 2 }, /* normal output */ | ||
946 | } | ||
947 | }; | ||
948 | |||
929 | /** | 949 | /** |
930 | * sunxi_divs_clk_setup() - Setup function for leaf divisors on clocks | 950 | * sunxi_divs_clk_setup() - Setup function for leaf divisors on clocks |
931 | * | 951 | * |
@@ -950,7 +970,7 @@ static void __init sunxi_divs_clk_setup(struct device_node *node, | |||
950 | struct clk_fixed_factor *fix_factor; | 970 | struct clk_fixed_factor *fix_factor; |
951 | struct clk_divider *divider; | 971 | struct clk_divider *divider; |
952 | void __iomem *reg; | 972 | void __iomem *reg; |
953 | int i = 0; | 973 | int ndivs = SUNXI_DIVS_MAX_QTY, i = 0; |
954 | int flags, clkflags; | 974 | int flags, clkflags; |
955 | 975 | ||
956 | /* Set up factor clock that we will be dividing */ | 976 | /* Set up factor clock that we will be dividing */ |
@@ -973,7 +993,11 @@ static void __init sunxi_divs_clk_setup(struct device_node *node, | |||
973 | * our RAM clock! */ | 993 | * our RAM clock! */ |
974 | clkflags = !strcmp("pll5", parent) ? 0 : CLK_SET_RATE_PARENT; | 994 | clkflags = !strcmp("pll5", parent) ? 0 : CLK_SET_RATE_PARENT; |
975 | 995 | ||
976 | for (i = 0; i < SUNXI_DIVS_MAX_QTY; i++) { | 996 | /* if number of children known, use it */ |
997 | if (data->ndivs) | ||
998 | ndivs = data->ndivs; | ||
999 | |||
1000 | for (i = 0; i < ndivs; i++) { | ||
977 | if (of_property_read_string_index(node, "clock-output-names", | 1001 | if (of_property_read_string_index(node, "clock-output-names", |
978 | i, &clk_name) != 0) | 1002 | i, &clk_name) != 0) |
979 | break; | 1003 | break; |
@@ -1062,7 +1086,6 @@ static const struct of_device_id clk_factors_match[] __initconst = { | |||
1062 | {.compatible = "allwinner,sun6i-a31-pll1-clk", .data = &sun6i_a31_pll1_data,}, | 1086 | {.compatible = "allwinner,sun6i-a31-pll1-clk", .data = &sun6i_a31_pll1_data,}, |
1063 | {.compatible = "allwinner,sun8i-a23-pll1-clk", .data = &sun8i_a23_pll1_data,}, | 1087 | {.compatible = "allwinner,sun8i-a23-pll1-clk", .data = &sun8i_a23_pll1_data,}, |
1064 | {.compatible = "allwinner,sun7i-a20-pll4-clk", .data = &sun7i_a20_pll4_data,}, | 1088 | {.compatible = "allwinner,sun7i-a20-pll4-clk", .data = &sun7i_a20_pll4_data,}, |
1065 | {.compatible = "allwinner,sun6i-a31-pll6-clk", .data = &sun6i_a31_pll6_data,}, | ||
1066 | {.compatible = "allwinner,sun4i-a10-apb1-clk", .data = &sun4i_apb1_data,}, | 1089 | {.compatible = "allwinner,sun4i-a10-apb1-clk", .data = &sun4i_apb1_data,}, |
1067 | {.compatible = "allwinner,sun7i-a20-out-clk", .data = &sun7i_a20_out_data,}, | 1090 | {.compatible = "allwinner,sun7i-a20-out-clk", .data = &sun7i_a20_out_data,}, |
1068 | {} | 1091 | {} |
@@ -1074,7 +1097,6 @@ static const struct of_device_id clk_div_match[] __initconst = { | |||
1074 | {.compatible = "allwinner,sun8i-a23-axi-clk", .data = &sun8i_a23_axi_data,}, | 1097 | {.compatible = "allwinner,sun8i-a23-axi-clk", .data = &sun8i_a23_axi_data,}, |
1075 | {.compatible = "allwinner,sun4i-a10-ahb-clk", .data = &sun4i_ahb_data,}, | 1098 | {.compatible = "allwinner,sun4i-a10-ahb-clk", .data = &sun4i_ahb_data,}, |
1076 | {.compatible = "allwinner,sun4i-a10-apb0-clk", .data = &sun4i_apb0_data,}, | 1099 | {.compatible = "allwinner,sun4i-a10-apb0-clk", .data = &sun4i_apb0_data,}, |
1077 | {.compatible = "allwinner,sun6i-a31-apb2-div-clk", .data = &sun6i_a31_apb2_div_data,}, | ||
1078 | {} | 1100 | {} |
1079 | }; | 1101 | }; |
1080 | 1102 | ||
@@ -1082,13 +1104,13 @@ static const struct of_device_id clk_div_match[] __initconst = { | |||
1082 | static const struct of_device_id clk_divs_match[] __initconst = { | 1104 | static const struct of_device_id clk_divs_match[] __initconst = { |
1083 | {.compatible = "allwinner,sun4i-a10-pll5-clk", .data = &pll5_divs_data,}, | 1105 | {.compatible = "allwinner,sun4i-a10-pll5-clk", .data = &pll5_divs_data,}, |
1084 | {.compatible = "allwinner,sun4i-a10-pll6-clk", .data = &pll6_divs_data,}, | 1106 | {.compatible = "allwinner,sun4i-a10-pll6-clk", .data = &pll6_divs_data,}, |
1107 | {.compatible = "allwinner,sun6i-a31-pll6-clk", .data = &sun6i_a31_pll6_divs_data,}, | ||
1085 | {} | 1108 | {} |
1086 | }; | 1109 | }; |
1087 | 1110 | ||
1088 | /* Matches for mux clocks */ | 1111 | /* Matches for mux clocks */ |
1089 | static const struct of_device_id clk_mux_match[] __initconst = { | 1112 | static const struct of_device_id clk_mux_match[] __initconst = { |
1090 | {.compatible = "allwinner,sun4i-a10-cpu-clk", .data = &sun4i_cpu_mux_data,}, | 1113 | {.compatible = "allwinner,sun4i-a10-cpu-clk", .data = &sun4i_cpu_mux_data,}, |
1091 | {.compatible = "allwinner,sun4i-a10-apb1-mux-clk", .data = &sun4i_apb1_mux_data,}, | ||
1092 | {.compatible = "allwinner,sun6i-a31-ahb1-mux-clk", .data = &sun6i_a31_ahb1_mux_data,}, | 1114 | {.compatible = "allwinner,sun6i-a31-ahb1-mux-clk", .data = &sun6i_a31_ahb1_mux_data,}, |
1093 | {} | 1115 | {} |
1094 | }; | 1116 | }; |
@@ -1102,16 +1124,21 @@ static const struct of_device_id clk_gates_match[] __initconst = { | |||
1102 | {.compatible = "allwinner,sun6i-a31-ahb1-gates-clk", .data = &sun6i_a31_ahb1_gates_data,}, | 1124 | {.compatible = "allwinner,sun6i-a31-ahb1-gates-clk", .data = &sun6i_a31_ahb1_gates_data,}, |
1103 | {.compatible = "allwinner,sun7i-a20-ahb-gates-clk", .data = &sun7i_a20_ahb_gates_data,}, | 1125 | {.compatible = "allwinner,sun7i-a20-ahb-gates-clk", .data = &sun7i_a20_ahb_gates_data,}, |
1104 | {.compatible = "allwinner,sun8i-a23-ahb1-gates-clk", .data = &sun8i_a23_ahb1_gates_data,}, | 1126 | {.compatible = "allwinner,sun8i-a23-ahb1-gates-clk", .data = &sun8i_a23_ahb1_gates_data,}, |
1127 | {.compatible = "allwinner,sun9i-a80-ahb0-gates-clk", .data = &sun9i_a80_ahb0_gates_data,}, | ||
1128 | {.compatible = "allwinner,sun9i-a80-ahb1-gates-clk", .data = &sun9i_a80_ahb1_gates_data,}, | ||
1129 | {.compatible = "allwinner,sun9i-a80-ahb2-gates-clk", .data = &sun9i_a80_ahb2_gates_data,}, | ||
1105 | {.compatible = "allwinner,sun4i-a10-apb0-gates-clk", .data = &sun4i_apb0_gates_data,}, | 1130 | {.compatible = "allwinner,sun4i-a10-apb0-gates-clk", .data = &sun4i_apb0_gates_data,}, |
1106 | {.compatible = "allwinner,sun5i-a10s-apb0-gates-clk", .data = &sun5i_a10s_apb0_gates_data,}, | 1131 | {.compatible = "allwinner,sun5i-a10s-apb0-gates-clk", .data = &sun5i_a10s_apb0_gates_data,}, |
1107 | {.compatible = "allwinner,sun5i-a13-apb0-gates-clk", .data = &sun5i_a13_apb0_gates_data,}, | 1132 | {.compatible = "allwinner,sun5i-a13-apb0-gates-clk", .data = &sun5i_a13_apb0_gates_data,}, |
1108 | {.compatible = "allwinner,sun7i-a20-apb0-gates-clk", .data = &sun7i_a20_apb0_gates_data,}, | 1133 | {.compatible = "allwinner,sun7i-a20-apb0-gates-clk", .data = &sun7i_a20_apb0_gates_data,}, |
1134 | {.compatible = "allwinner,sun9i-a80-apb0-gates-clk", .data = &sun9i_a80_apb0_gates_data,}, | ||
1109 | {.compatible = "allwinner,sun4i-a10-apb1-gates-clk", .data = &sun4i_apb1_gates_data,}, | 1135 | {.compatible = "allwinner,sun4i-a10-apb1-gates-clk", .data = &sun4i_apb1_gates_data,}, |
1110 | {.compatible = "allwinner,sun5i-a10s-apb1-gates-clk", .data = &sun5i_a10s_apb1_gates_data,}, | 1136 | {.compatible = "allwinner,sun5i-a10s-apb1-gates-clk", .data = &sun5i_a10s_apb1_gates_data,}, |
1111 | {.compatible = "allwinner,sun5i-a13-apb1-gates-clk", .data = &sun5i_a13_apb1_gates_data,}, | 1137 | {.compatible = "allwinner,sun5i-a13-apb1-gates-clk", .data = &sun5i_a13_apb1_gates_data,}, |
1112 | {.compatible = "allwinner,sun6i-a31-apb1-gates-clk", .data = &sun6i_a31_apb1_gates_data,}, | 1138 | {.compatible = "allwinner,sun6i-a31-apb1-gates-clk", .data = &sun6i_a31_apb1_gates_data,}, |
1113 | {.compatible = "allwinner,sun7i-a20-apb1-gates-clk", .data = &sun7i_a20_apb1_gates_data,}, | 1139 | {.compatible = "allwinner,sun7i-a20-apb1-gates-clk", .data = &sun7i_a20_apb1_gates_data,}, |
1114 | {.compatible = "allwinner,sun8i-a23-apb1-gates-clk", .data = &sun8i_a23_apb1_gates_data,}, | 1140 | {.compatible = "allwinner,sun8i-a23-apb1-gates-clk", .data = &sun8i_a23_apb1_gates_data,}, |
1141 | {.compatible = "allwinner,sun9i-a80-apb1-gates-clk", .data = &sun9i_a80_apb1_gates_data,}, | ||
1115 | {.compatible = "allwinner,sun6i-a31-apb2-gates-clk", .data = &sun6i_a31_apb2_gates_data,}, | 1142 | {.compatible = "allwinner,sun6i-a31-apb2-gates-clk", .data = &sun6i_a31_apb2_gates_data,}, |
1116 | {.compatible = "allwinner,sun8i-a23-apb2-gates-clk", .data = &sun8i_a23_apb2_gates_data,}, | 1143 | {.compatible = "allwinner,sun8i-a23-apb2-gates-clk", .data = &sun8i_a23_apb2_gates_data,}, |
1117 | {.compatible = "allwinner,sun4i-a10-usb-clk", .data = &sun4i_a10_usb_gates_data,}, | 1144 | {.compatible = "allwinner,sun4i-a10-usb-clk", .data = &sun4i_a10_usb_gates_data,}, |
@@ -1200,3 +1227,9 @@ static void __init sun6i_init_clocks(struct device_node *node) | |||
1200 | } | 1227 | } |
1201 | CLK_OF_DECLARE(sun6i_a31_clk_init, "allwinner,sun6i-a31", sun6i_init_clocks); | 1228 | CLK_OF_DECLARE(sun6i_a31_clk_init, "allwinner,sun6i-a31", sun6i_init_clocks); |
1202 | CLK_OF_DECLARE(sun8i_a23_clk_init, "allwinner,sun8i-a23", sun6i_init_clocks); | 1229 | CLK_OF_DECLARE(sun8i_a23_clk_init, "allwinner,sun8i-a23", sun6i_init_clocks); |
1230 | |||
1231 | static void __init sun9i_init_clocks(struct device_node *node) | ||
1232 | { | ||
1233 | sunxi_init_clocks(NULL, 0); | ||
1234 | } | ||
1235 | CLK_OF_DECLARE(sun9i_a80_clk_init, "allwinner,sun9i-a80", sun9i_init_clocks); | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 4f7b275f2f7b..7d4974b83af7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | |||
@@ -121,13 +121,9 @@ static int kfd_open(struct inode *inode, struct file *filep) | |||
121 | if (IS_ERR(process)) | 121 | if (IS_ERR(process)) |
122 | return PTR_ERR(process); | 122 | return PTR_ERR(process); |
123 | 123 | ||
124 | process->is_32bit_user_mode = is_32bit_user_mode; | ||
125 | |||
126 | dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n", | 124 | dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n", |
127 | process->pasid, process->is_32bit_user_mode); | 125 | process->pasid, process->is_32bit_user_mode); |
128 | 126 | ||
129 | kfd_init_apertures(process); | ||
130 | |||
131 | return 0; | 127 | return 0; |
132 | } | 128 | } |
133 | 129 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c index 66df4da01c29..e64aa99e5e41 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c | |||
@@ -299,13 +299,13 @@ int kfd_init_apertures(struct kfd_process *process) | |||
299 | struct kfd_dev *dev; | 299 | struct kfd_dev *dev; |
300 | struct kfd_process_device *pdd; | 300 | struct kfd_process_device *pdd; |
301 | 301 | ||
302 | mutex_lock(&process->mutex); | ||
303 | |||
304 | /*Iterating over all devices*/ | 302 | /*Iterating over all devices*/ |
305 | while ((dev = kfd_topology_enum_kfd_devices(id)) != NULL && | 303 | while ((dev = kfd_topology_enum_kfd_devices(id)) != NULL && |
306 | id < NUM_OF_SUPPORTED_GPUS) { | 304 | id < NUM_OF_SUPPORTED_GPUS) { |
307 | 305 | ||
308 | pdd = kfd_get_process_device_data(dev, process, 1); | 306 | pdd = kfd_get_process_device_data(dev, process, 1); |
307 | if (!pdd) | ||
308 | return -1; | ||
309 | 309 | ||
310 | /* | 310 | /* |
311 | * For 64 bit process aperture will be statically reserved in | 311 | * For 64 bit process aperture will be statically reserved in |
@@ -348,8 +348,6 @@ int kfd_init_apertures(struct kfd_process *process) | |||
348 | id++; | 348 | id++; |
349 | } | 349 | } |
350 | 350 | ||
351 | mutex_unlock(&process->mutex); | ||
352 | |||
353 | return 0; | 351 | return 0; |
354 | } | 352 | } |
355 | 353 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index b85eb0b830b4..3c76ef05cbcf 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/amd-iommu.h> | 27 | #include <linux/amd-iommu.h> |
28 | #include <linux/notifier.h> | 28 | #include <linux/notifier.h> |
29 | #include <linux/compat.h> | ||
30 | |||
29 | struct mm_struct; | 31 | struct mm_struct; |
30 | 32 | ||
31 | #include "kfd_priv.h" | 33 | #include "kfd_priv.h" |
@@ -285,8 +287,15 @@ static struct kfd_process *create_process(const struct task_struct *thread) | |||
285 | if (err != 0) | 287 | if (err != 0) |
286 | goto err_process_pqm_init; | 288 | goto err_process_pqm_init; |
287 | 289 | ||
290 | /* init process apertures*/ | ||
291 | process->is_32bit_user_mode = is_compat_task(); | ||
292 | if (kfd_init_apertures(process) != 0) | ||
293 | goto err_init_apretures; | ||
294 | |||
288 | return process; | 295 | return process; |
289 | 296 | ||
297 | err_init_apretures: | ||
298 | pqm_uninit(&process->pqm); | ||
290 | err_process_pqm_init: | 299 | err_process_pqm_init: |
291 | hash_del_rcu(&process->kfd_processes); | 300 | hash_del_rcu(&process->kfd_processes); |
292 | synchronize_rcu(); | 301 | synchronize_rcu(); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 5733e2859e8a..b11792d7e70e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c | |||
@@ -700,8 +700,6 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr, | |||
700 | dev->node_props.simd_per_cu); | 700 | dev->node_props.simd_per_cu); |
701 | sysfs_show_32bit_prop(buffer, "max_slots_scratch_cu", | 701 | sysfs_show_32bit_prop(buffer, "max_slots_scratch_cu", |
702 | dev->node_props.max_slots_scratch_cu); | 702 | dev->node_props.max_slots_scratch_cu); |
703 | sysfs_show_32bit_prop(buffer, "engine_id", | ||
704 | dev->node_props.engine_id); | ||
705 | sysfs_show_32bit_prop(buffer, "vendor_id", | 703 | sysfs_show_32bit_prop(buffer, "vendor_id", |
706 | dev->node_props.vendor_id); | 704 | dev->node_props.vendor_id); |
707 | sysfs_show_32bit_prop(buffer, "device_id", | 705 | sysfs_show_32bit_prop(buffer, "device_id", |
@@ -715,6 +713,12 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr, | |||
715 | dev->gpu->kgd)); | 713 | dev->gpu->kgd)); |
716 | sysfs_show_64bit_prop(buffer, "local_mem_size", | 714 | sysfs_show_64bit_prop(buffer, "local_mem_size", |
717 | kfd2kgd->get_vmem_size(dev->gpu->kgd)); | 715 | kfd2kgd->get_vmem_size(dev->gpu->kgd)); |
716 | |||
717 | sysfs_show_32bit_prop(buffer, "fw_version", | ||
718 | kfd2kgd->get_fw_version( | ||
719 | dev->gpu->kgd, | ||
720 | KGD_ENGINE_MEC1)); | ||
721 | |||
718 | } | 722 | } |
719 | 723 | ||
720 | ret = sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute", | 724 | ret = sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute", |
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 9c729dd8dd50..47b551970a14 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h | |||
@@ -45,6 +45,17 @@ enum kgd_memory_pool { | |||
45 | KGD_POOL_FRAMEBUFFER = 3, | 45 | KGD_POOL_FRAMEBUFFER = 3, |
46 | }; | 46 | }; |
47 | 47 | ||
48 | enum kgd_engine_type { | ||
49 | KGD_ENGINE_PFP = 1, | ||
50 | KGD_ENGINE_ME, | ||
51 | KGD_ENGINE_CE, | ||
52 | KGD_ENGINE_MEC1, | ||
53 | KGD_ENGINE_MEC2, | ||
54 | KGD_ENGINE_RLC, | ||
55 | KGD_ENGINE_SDMA, | ||
56 | KGD_ENGINE_MAX | ||
57 | }; | ||
58 | |||
48 | struct kgd2kfd_shared_resources { | 59 | struct kgd2kfd_shared_resources { |
49 | /* Bit n == 1 means VMID n is available for KFD. */ | 60 | /* Bit n == 1 means VMID n is available for KFD. */ |
50 | unsigned int compute_vmid_bitmap; | 61 | unsigned int compute_vmid_bitmap; |
@@ -137,6 +148,8 @@ struct kgd2kfd_calls { | |||
137 | * | 148 | * |
138 | * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot. | 149 | * @hqd_destroy: Destructs and preempts the queue assigned to that hqd slot. |
139 | * | 150 | * |
151 | * @get_fw_version: Returns FW versions from the header | ||
152 | * | ||
140 | * This structure contains function pointers to services that the kgd driver | 153 | * This structure contains function pointers to services that the kgd driver |
141 | * provides to amdkfd driver. | 154 | * provides to amdkfd driver. |
142 | * | 155 | * |
@@ -176,6 +189,8 @@ struct kfd2kgd_calls { | |||
176 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, | 189 | int (*hqd_destroy)(struct kgd_dev *kgd, uint32_t reset_type, |
177 | unsigned int timeout, uint32_t pipe_id, | 190 | unsigned int timeout, uint32_t pipe_id, |
178 | uint32_t queue_id); | 191 | uint32_t queue_id); |
192 | uint16_t (*get_fw_version)(struct kgd_dev *kgd, | ||
193 | enum kgd_engine_type type); | ||
179 | }; | 194 | }; |
180 | 195 | ||
181 | bool kgd2kfd_init(unsigned interface_version, | 196 | bool kgd2kfd_init(unsigned interface_version, |
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 4a78a773151c..bbdbe4721573 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -61,7 +61,7 @@ drm_atomic_helper_plane_changed(struct drm_atomic_state *state, | |||
61 | struct drm_crtc_state *crtc_state; | 61 | struct drm_crtc_state *crtc_state; |
62 | 62 | ||
63 | if (plane->state->crtc) { | 63 | if (plane->state->crtc) { |
64 | crtc_state = state->crtc_states[drm_crtc_index(plane->crtc)]; | 64 | crtc_state = state->crtc_states[drm_crtc_index(plane->state->crtc)]; |
65 | 65 | ||
66 | if (WARN_ON(!crtc_state)) | 66 | if (WARN_ON(!crtc_state)) |
67 | return; | 67 | return; |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index f5a5f18efa5b..4d79dad9d44f 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -830,6 +830,8 @@ drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, | |||
830 | * vblank events since the system was booted, including lost events due to | 830 | * vblank events since the system was booted, including lost events due to |
831 | * modesetting activity. | 831 | * modesetting activity. |
832 | * | 832 | * |
833 | * This is the legacy version of drm_crtc_vblank_count(). | ||
834 | * | ||
833 | * Returns: | 835 | * Returns: |
834 | * The software vblank counter. | 836 | * The software vblank counter. |
835 | */ | 837 | */ |
@@ -844,6 +846,25 @@ u32 drm_vblank_count(struct drm_device *dev, int crtc) | |||
844 | EXPORT_SYMBOL(drm_vblank_count); | 846 | EXPORT_SYMBOL(drm_vblank_count); |
845 | 847 | ||
846 | /** | 848 | /** |
849 | * drm_crtc_vblank_count - retrieve "cooked" vblank counter value | ||
850 | * @crtc: which counter to retrieve | ||
851 | * | ||
852 | * Fetches the "cooked" vblank count value that represents the number of | ||
853 | * vblank events since the system was booted, including lost events due to | ||
854 | * modesetting activity. | ||
855 | * | ||
856 | * This is the native KMS version of drm_vblank_count(). | ||
857 | * | ||
858 | * Returns: | ||
859 | * The software vblank counter. | ||
860 | */ | ||
861 | u32 drm_crtc_vblank_count(struct drm_crtc *crtc) | ||
862 | { | ||
863 | return drm_vblank_count(crtc->dev, drm_crtc_index(crtc)); | ||
864 | } | ||
865 | EXPORT_SYMBOL(drm_crtc_vblank_count); | ||
866 | |||
867 | /** | ||
847 | * drm_vblank_count_and_time - retrieve "cooked" vblank counter value | 868 | * drm_vblank_count_and_time - retrieve "cooked" vblank counter value |
848 | * and the system timestamp corresponding to that vblank counter value. | 869 | * and the system timestamp corresponding to that vblank counter value. |
849 | * | 870 | * |
@@ -904,6 +925,8 @@ static void send_vblank_event(struct drm_device *dev, | |||
904 | * | 925 | * |
905 | * Updates sequence # and timestamp on event, and sends it to userspace. | 926 | * Updates sequence # and timestamp on event, and sends it to userspace. |
906 | * Caller must hold event lock. | 927 | * Caller must hold event lock. |
928 | * | ||
929 | * This is the legacy version of drm_crtc_send_vblank_event(). | ||
907 | */ | 930 | */ |
908 | void drm_send_vblank_event(struct drm_device *dev, int crtc, | 931 | void drm_send_vblank_event(struct drm_device *dev, int crtc, |
909 | struct drm_pending_vblank_event *e) | 932 | struct drm_pending_vblank_event *e) |
@@ -923,6 +946,23 @@ void drm_send_vblank_event(struct drm_device *dev, int crtc, | |||
923 | EXPORT_SYMBOL(drm_send_vblank_event); | 946 | EXPORT_SYMBOL(drm_send_vblank_event); |
924 | 947 | ||
925 | /** | 948 | /** |
949 | * drm_crtc_send_vblank_event - helper to send vblank event after pageflip | ||
950 | * @crtc: the source CRTC of the vblank event | ||
951 | * @e: the event to send | ||
952 | * | ||
953 | * Updates sequence # and timestamp on event, and sends it to userspace. | ||
954 | * Caller must hold event lock. | ||
955 | * | ||
956 | * This is the native KMS version of drm_send_vblank_event(). | ||
957 | */ | ||
958 | void drm_crtc_send_vblank_event(struct drm_crtc *crtc, | ||
959 | struct drm_pending_vblank_event *e) | ||
960 | { | ||
961 | drm_send_vblank_event(crtc->dev, drm_crtc_index(crtc), e); | ||
962 | } | ||
963 | EXPORT_SYMBOL(drm_crtc_send_vblank_event); | ||
964 | |||
965 | /** | ||
926 | * drm_vblank_enable - enable the vblank interrupt on a CRTC | 966 | * drm_vblank_enable - enable the vblank interrupt on a CRTC |
927 | * @dev: DRM device | 967 | * @dev: DRM device |
928 | * @crtc: CRTC in question | 968 | * @crtc: CRTC in question |
@@ -1594,6 +1634,8 @@ static void drm_handle_vblank_events(struct drm_device *dev, int crtc) | |||
1594 | * | 1634 | * |
1595 | * Drivers should call this routine in their vblank interrupt handlers to | 1635 | * Drivers should call this routine in their vblank interrupt handlers to |
1596 | * update the vblank counter and send any signals that may be pending. | 1636 | * update the vblank counter and send any signals that may be pending. |
1637 | * | ||
1638 | * This is the legacy version of drm_crtc_handle_vblank(). | ||
1597 | */ | 1639 | */ |
1598 | bool drm_handle_vblank(struct drm_device *dev, int crtc) | 1640 | bool drm_handle_vblank(struct drm_device *dev, int crtc) |
1599 | { | 1641 | { |
@@ -1670,3 +1712,21 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) | |||
1670 | return true; | 1712 | return true; |
1671 | } | 1713 | } |
1672 | EXPORT_SYMBOL(drm_handle_vblank); | 1714 | EXPORT_SYMBOL(drm_handle_vblank); |
1715 | |||
1716 | /** | ||
1717 | * drm_crtc_handle_vblank - handle a vblank event | ||
1718 | * @crtc: where this event occurred | ||
1719 | * | ||
1720 | * Drivers should call this routine in their vblank interrupt handlers to | ||
1721 | * update the vblank counter and send any signals that may be pending. | ||
1722 | * | ||
1723 | * This is the native KMS version of drm_handle_vblank(). | ||
1724 | * | ||
1725 | * Returns: | ||
1726 | * True if the event was successfully handled, false on failure. | ||
1727 | */ | ||
1728 | bool drm_crtc_handle_vblank(struct drm_crtc *crtc) | ||
1729 | { | ||
1730 | return drm_handle_vblank(crtc->dev, drm_crtc_index(crtc)); | ||
1731 | } | ||
1732 | EXPORT_SYMBOL(drm_crtc_handle_vblank); | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index f990ab4c3efb..574057cd1d09 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -811,6 +811,8 @@ int i915_reset(struct drm_device *dev) | |||
811 | if (!i915.reset) | 811 | if (!i915.reset) |
812 | return 0; | 812 | return 0; |
813 | 813 | ||
814 | intel_reset_gt_powersave(dev); | ||
815 | |||
814 | mutex_lock(&dev->struct_mutex); | 816 | mutex_lock(&dev->struct_mutex); |
815 | 817 | ||
816 | i915_gem_reset(dev); | 818 | i915_gem_reset(dev); |
@@ -880,7 +882,7 @@ int i915_reset(struct drm_device *dev) | |||
880 | * of re-init after reset. | 882 | * of re-init after reset. |
881 | */ | 883 | */ |
882 | if (INTEL_INFO(dev)->gen > 5) | 884 | if (INTEL_INFO(dev)->gen > 5) |
883 | intel_reset_gt_powersave(dev); | 885 | intel_enable_gt_powersave(dev); |
884 | } else { | 886 | } else { |
885 | mutex_unlock(&dev->struct_mutex); | 887 | mutex_unlock(&dev->struct_mutex); |
886 | } | 888 | } |
@@ -1584,7 +1586,7 @@ static struct drm_driver driver = { | |||
1584 | .gem_prime_import = i915_gem_prime_import, | 1586 | .gem_prime_import = i915_gem_prime_import, |
1585 | 1587 | ||
1586 | .dumb_create = i915_gem_dumb_create, | 1588 | .dumb_create = i915_gem_dumb_create, |
1587 | .dumb_map_offset = i915_gem_dumb_map_offset, | 1589 | .dumb_map_offset = i915_gem_mmap_gtt, |
1588 | .dumb_destroy = drm_gem_dumb_destroy, | 1590 | .dumb_destroy = drm_gem_dumb_destroy, |
1589 | .ioctls = i915_ioctls, | 1591 | .ioctls = i915_ioctls, |
1590 | .fops = &i915_driver_fops, | 1592 | .fops = &i915_driver_fops, |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 63bcda5541ec..70d0f0f06f1a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -2501,9 +2501,8 @@ void i915_vma_move_to_active(struct i915_vma *vma, | |||
2501 | int i915_gem_dumb_create(struct drm_file *file_priv, | 2501 | int i915_gem_dumb_create(struct drm_file *file_priv, |
2502 | struct drm_device *dev, | 2502 | struct drm_device *dev, |
2503 | struct drm_mode_create_dumb *args); | 2503 | struct drm_mode_create_dumb *args); |
2504 | int i915_gem_dumb_map_offset(struct drm_file *file_priv, | 2504 | int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev, |
2505 | struct drm_device *dev, uint32_t handle, | 2505 | uint32_t handle, uint64_t *offset); |
2506 | uint64_t *offset); | ||
2507 | /** | 2506 | /** |
2508 | * Returns true if seq1 is later than seq2. | 2507 | * Returns true if seq1 is later than seq2. |
2509 | */ | 2508 | */ |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 4a9faea626db..52adcb680be3 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -401,7 +401,6 @@ static int | |||
401 | i915_gem_create(struct drm_file *file, | 401 | i915_gem_create(struct drm_file *file, |
402 | struct drm_device *dev, | 402 | struct drm_device *dev, |
403 | uint64_t size, | 403 | uint64_t size, |
404 | bool dumb, | ||
405 | uint32_t *handle_p) | 404 | uint32_t *handle_p) |
406 | { | 405 | { |
407 | struct drm_i915_gem_object *obj; | 406 | struct drm_i915_gem_object *obj; |
@@ -417,7 +416,6 @@ i915_gem_create(struct drm_file *file, | |||
417 | if (obj == NULL) | 416 | if (obj == NULL) |
418 | return -ENOMEM; | 417 | return -ENOMEM; |
419 | 418 | ||
420 | obj->base.dumb = dumb; | ||
421 | ret = drm_gem_handle_create(file, &obj->base, &handle); | 419 | ret = drm_gem_handle_create(file, &obj->base, &handle); |
422 | /* drop reference from allocate - handle holds it now */ | 420 | /* drop reference from allocate - handle holds it now */ |
423 | drm_gem_object_unreference_unlocked(&obj->base); | 421 | drm_gem_object_unreference_unlocked(&obj->base); |
@@ -437,7 +435,7 @@ i915_gem_dumb_create(struct drm_file *file, | |||
437 | args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64); | 435 | args->pitch = ALIGN(args->width * DIV_ROUND_UP(args->bpp, 8), 64); |
438 | args->size = args->pitch * args->height; | 436 | args->size = args->pitch * args->height; |
439 | return i915_gem_create(file, dev, | 437 | return i915_gem_create(file, dev, |
440 | args->size, true, &args->handle); | 438 | args->size, &args->handle); |
441 | } | 439 | } |
442 | 440 | ||
443 | /** | 441 | /** |
@@ -450,7 +448,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data, | |||
450 | struct drm_i915_gem_create *args = data; | 448 | struct drm_i915_gem_create *args = data; |
451 | 449 | ||
452 | return i915_gem_create(file, dev, | 450 | return i915_gem_create(file, dev, |
453 | args->size, false, &args->handle); | 451 | args->size, &args->handle); |
454 | } | 452 | } |
455 | 453 | ||
456 | static inline int | 454 | static inline int |
@@ -1840,10 +1838,10 @@ static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj) | |||
1840 | drm_gem_free_mmap_offset(&obj->base); | 1838 | drm_gem_free_mmap_offset(&obj->base); |
1841 | } | 1839 | } |
1842 | 1840 | ||
1843 | static int | 1841 | int |
1844 | i915_gem_mmap_gtt(struct drm_file *file, | 1842 | i915_gem_mmap_gtt(struct drm_file *file, |
1845 | struct drm_device *dev, | 1843 | struct drm_device *dev, |
1846 | uint32_t handle, bool dumb, | 1844 | uint32_t handle, |
1847 | uint64_t *offset) | 1845 | uint64_t *offset) |
1848 | { | 1846 | { |
1849 | struct drm_i915_private *dev_priv = dev->dev_private; | 1847 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1860,13 +1858,6 @@ i915_gem_mmap_gtt(struct drm_file *file, | |||
1860 | goto unlock; | 1858 | goto unlock; |
1861 | } | 1859 | } |
1862 | 1860 | ||
1863 | /* | ||
1864 | * We don't allow dumb mmaps on objects created using another | ||
1865 | * interface. | ||
1866 | */ | ||
1867 | WARN_ONCE(dumb && !(obj->base.dumb || obj->base.import_attach), | ||
1868 | "Illegal dumb map of accelerated buffer.\n"); | ||
1869 | |||
1870 | if (obj->base.size > dev_priv->gtt.mappable_end) { | 1861 | if (obj->base.size > dev_priv->gtt.mappable_end) { |
1871 | ret = -E2BIG; | 1862 | ret = -E2BIG; |
1872 | goto out; | 1863 | goto out; |
@@ -1891,15 +1882,6 @@ unlock: | |||
1891 | return ret; | 1882 | return ret; |
1892 | } | 1883 | } |
1893 | 1884 | ||
1894 | int | ||
1895 | i915_gem_dumb_map_offset(struct drm_file *file, | ||
1896 | struct drm_device *dev, | ||
1897 | uint32_t handle, | ||
1898 | uint64_t *offset) | ||
1899 | { | ||
1900 | return i915_gem_mmap_gtt(file, dev, handle, true, offset); | ||
1901 | } | ||
1902 | |||
1903 | /** | 1885 | /** |
1904 | * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing | 1886 | * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing |
1905 | * @dev: DRM device | 1887 | * @dev: DRM device |
@@ -1921,7 +1903,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, | |||
1921 | { | 1903 | { |
1922 | struct drm_i915_gem_mmap_gtt *args = data; | 1904 | struct drm_i915_gem_mmap_gtt *args = data; |
1923 | 1905 | ||
1924 | return i915_gem_mmap_gtt(file, dev, args->handle, false, &args->offset); | 1906 | return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset); |
1925 | } | 1907 | } |
1926 | 1908 | ||
1927 | static inline int | 1909 | static inline int |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index d17ff435f276..d011ec82ef1e 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -473,7 +473,12 @@ mi_set_context(struct intel_engine_cs *ring, | |||
473 | u32 hw_flags) | 473 | u32 hw_flags) |
474 | { | 474 | { |
475 | u32 flags = hw_flags | MI_MM_SPACE_GTT; | 475 | u32 flags = hw_flags | MI_MM_SPACE_GTT; |
476 | int ret; | 476 | const int num_rings = |
477 | /* Use an extended w/a on ivb+ if signalling from other rings */ | ||
478 | i915_semaphore_is_enabled(ring->dev) ? | ||
479 | hweight32(INTEL_INFO(ring->dev)->ring_mask) - 1 : | ||
480 | 0; | ||
481 | int len, i, ret; | ||
477 | 482 | ||
478 | /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB | 483 | /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB |
479 | * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value | 484 | * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value |
@@ -490,15 +495,31 @@ mi_set_context(struct intel_engine_cs *ring, | |||
490 | if (!IS_HASWELL(ring->dev) && INTEL_INFO(ring->dev)->gen < 8) | 495 | if (!IS_HASWELL(ring->dev) && INTEL_INFO(ring->dev)->gen < 8) |
491 | flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN); | 496 | flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN); |
492 | 497 | ||
493 | ret = intel_ring_begin(ring, 6); | 498 | |
499 | len = 4; | ||
500 | if (INTEL_INFO(ring->dev)->gen >= 7) | ||
501 | len += 2 + (num_rings ? 4*num_rings + 2 : 0); | ||
502 | |||
503 | ret = intel_ring_begin(ring, len); | ||
494 | if (ret) | 504 | if (ret) |
495 | return ret; | 505 | return ret; |
496 | 506 | ||
497 | /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ | 507 | /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */ |
498 | if (INTEL_INFO(ring->dev)->gen >= 7) | 508 | if (INTEL_INFO(ring->dev)->gen >= 7) { |
499 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); | 509 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE); |
500 | else | 510 | if (num_rings) { |
501 | intel_ring_emit(ring, MI_NOOP); | 511 | struct intel_engine_cs *signaller; |
512 | |||
513 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
514 | for_each_ring(signaller, to_i915(ring->dev), i) { | ||
515 | if (signaller == ring) | ||
516 | continue; | ||
517 | |||
518 | intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
519 | intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
520 | } | ||
521 | } | ||
522 | } | ||
502 | 523 | ||
503 | intel_ring_emit(ring, MI_NOOP); | 524 | intel_ring_emit(ring, MI_NOOP); |
504 | intel_ring_emit(ring, MI_SET_CONTEXT); | 525 | intel_ring_emit(ring, MI_SET_CONTEXT); |
@@ -510,10 +531,21 @@ mi_set_context(struct intel_engine_cs *ring, | |||
510 | */ | 531 | */ |
511 | intel_ring_emit(ring, MI_NOOP); | 532 | intel_ring_emit(ring, MI_NOOP); |
512 | 533 | ||
513 | if (INTEL_INFO(ring->dev)->gen >= 7) | 534 | if (INTEL_INFO(ring->dev)->gen >= 7) { |
535 | if (num_rings) { | ||
536 | struct intel_engine_cs *signaller; | ||
537 | |||
538 | intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings)); | ||
539 | for_each_ring(signaller, to_i915(ring->dev), i) { | ||
540 | if (signaller == ring) | ||
541 | continue; | ||
542 | |||
543 | intel_ring_emit(ring, RING_PSMI_CTL(signaller->mmio_base)); | ||
544 | intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE)); | ||
545 | } | ||
546 | } | ||
514 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); | 547 | intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE); |
515 | else | 548 | } |
516 | intel_ring_emit(ring, MI_NOOP); | ||
517 | 549 | ||
518 | intel_ring_advance(ring); | 550 | intel_ring_advance(ring); |
519 | 551 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index f06027ba3ee5..11738316394a 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
@@ -121,9 +121,6 @@ eb_lookup_vmas(struct eb_vmas *eb, | |||
121 | goto err; | 121 | goto err; |
122 | } | 122 | } |
123 | 123 | ||
124 | WARN_ONCE(obj->base.dumb, | ||
125 | "GPU use of dumb buffer is illegal.\n"); | ||
126 | |||
127 | drm_gem_object_reference(&obj->base); | 124 | drm_gem_object_reference(&obj->base); |
128 | list_add_tail(&obj->obj_exec_link, &objects); | 125 | list_add_tail(&obj->obj_exec_link, &objects); |
129 | } | 126 | } |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 981834b0f9b6..996c2931c499 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -281,10 +281,14 @@ void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
281 | struct drm_i915_private *dev_priv = dev->dev_private; | 281 | struct drm_i915_private *dev_priv = dev->dev_private; |
282 | 282 | ||
283 | spin_lock_irq(&dev_priv->irq_lock); | 283 | spin_lock_irq(&dev_priv->irq_lock); |
284 | |||
284 | WARN_ON(dev_priv->rps.pm_iir); | 285 | WARN_ON(dev_priv->rps.pm_iir); |
285 | WARN_ON(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); | 286 | WARN_ON(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events); |
286 | dev_priv->rps.interrupts_enabled = true; | 287 | dev_priv->rps.interrupts_enabled = true; |
288 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) | | ||
289 | dev_priv->pm_rps_events); | ||
287 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); | 290 | gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
291 | |||
288 | spin_unlock_irq(&dev_priv->irq_lock); | 292 | spin_unlock_irq(&dev_priv->irq_lock); |
289 | } | 293 | } |
290 | 294 | ||
@@ -3307,8 +3311,10 @@ static void gen5_gt_irq_postinstall(struct drm_device *dev) | |||
3307 | GEN5_IRQ_INIT(GT, dev_priv->gt_irq_mask, gt_irqs); | 3311 | GEN5_IRQ_INIT(GT, dev_priv->gt_irq_mask, gt_irqs); |
3308 | 3312 | ||
3309 | if (INTEL_INFO(dev)->gen >= 6) { | 3313 | if (INTEL_INFO(dev)->gen >= 6) { |
3310 | pm_irqs |= dev_priv->pm_rps_events; | 3314 | /* |
3311 | 3315 | * RPS interrupts will get enabled/disabled on demand when RPS | |
3316 | * itself is enabled/disabled. | ||
3317 | */ | ||
3312 | if (HAS_VEBOX(dev)) | 3318 | if (HAS_VEBOX(dev)) |
3313 | pm_irqs |= PM_VEBOX_USER_INTERRUPT; | 3319 | pm_irqs |= PM_VEBOX_USER_INTERRUPT; |
3314 | 3320 | ||
@@ -3520,7 +3526,11 @@ static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv) | |||
3520 | dev_priv->pm_irq_mask = 0xffffffff; | 3526 | dev_priv->pm_irq_mask = 0xffffffff; |
3521 | GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]); | 3527 | GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]); |
3522 | GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]); | 3528 | GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]); |
3523 | GEN8_IRQ_INIT_NDX(GT, 2, dev_priv->pm_irq_mask, dev_priv->pm_rps_events); | 3529 | /* |
3530 | * RPS interrupts will get enabled/disabled on demand when RPS itself | ||
3531 | * is enabled/disabled. | ||
3532 | */ | ||
3533 | GEN8_IRQ_INIT_NDX(GT, 2, dev_priv->pm_irq_mask, 0); | ||
3524 | GEN8_IRQ_INIT_NDX(GT, 3, ~gt_interrupts[3], gt_interrupts[3]); | 3534 | GEN8_IRQ_INIT_NDX(GT, 3, ~gt_interrupts[3], gt_interrupts[3]); |
3525 | } | 3535 | } |
3526 | 3536 | ||
@@ -3609,7 +3619,7 @@ static void vlv_display_irq_uninstall(struct drm_i915_private *dev_priv) | |||
3609 | 3619 | ||
3610 | vlv_display_irq_reset(dev_priv); | 3620 | vlv_display_irq_reset(dev_priv); |
3611 | 3621 | ||
3612 | dev_priv->irq_mask = 0; | 3622 | dev_priv->irq_mask = ~0; |
3613 | } | 3623 | } |
3614 | 3624 | ||
3615 | static void valleyview_irq_uninstall(struct drm_device *dev) | 3625 | static void valleyview_irq_uninstall(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index eefdc238f70b..172de3b3433b 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -395,6 +395,7 @@ | |||
395 | #define PIPE_CONTROL_STORE_DATA_INDEX (1<<21) | 395 | #define PIPE_CONTROL_STORE_DATA_INDEX (1<<21) |
396 | #define PIPE_CONTROL_CS_STALL (1<<20) | 396 | #define PIPE_CONTROL_CS_STALL (1<<20) |
397 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) | 397 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) |
398 | #define PIPE_CONTROL_MEDIA_STATE_CLEAR (1<<16) | ||
398 | #define PIPE_CONTROL_QW_WRITE (1<<14) | 399 | #define PIPE_CONTROL_QW_WRITE (1<<14) |
399 | #define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14) | 400 | #define PIPE_CONTROL_POST_SYNC_OP_MASK (3<<14) |
400 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) | 401 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) |
@@ -1128,6 +1129,7 @@ enum punit_power_well { | |||
1128 | #define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) | 1129 | #define GEN6_VERSYNC (RING_SYNC_1(VEBOX_RING_BASE)) |
1129 | #define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) | 1130 | #define GEN6_VEVSYNC (RING_SYNC_2(VEBOX_RING_BASE)) |
1130 | #define GEN6_NOSYNC 0 | 1131 | #define GEN6_NOSYNC 0 |
1132 | #define RING_PSMI_CTL(base) ((base)+0x50) | ||
1131 | #define RING_MAX_IDLE(base) ((base)+0x54) | 1133 | #define RING_MAX_IDLE(base) ((base)+0x54) |
1132 | #define RING_HWS_PGA(base) ((base)+0x80) | 1134 | #define RING_HWS_PGA(base) ((base)+0x80) |
1133 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) | 1135 | #define RING_HWS_PGA_GEN6(base) ((base)+0x2080) |
@@ -1458,6 +1460,7 @@ enum punit_power_well { | |||
1458 | #define GEN6_BLITTER_FBC_NOTIFY (1<<3) | 1460 | #define GEN6_BLITTER_FBC_NOTIFY (1<<3) |
1459 | 1461 | ||
1460 | #define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 | 1462 | #define GEN6_RC_SLEEP_PSMI_CONTROL 0x2050 |
1463 | #define GEN6_PSMI_SLEEP_MSG_DISABLE (1 << 0) | ||
1461 | #define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) | 1464 | #define GEN8_RC_SEMA_IDLE_MSG_DISABLE (1 << 12) |
1462 | #define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) | 1465 | #define GEN8_FF_DOP_CLOCK_GATE_DISABLE (1<<10) |
1463 | 1466 | ||
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1f4b56e273c8..964b28e3c630 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -6191,6 +6191,20 @@ void intel_cleanup_gt_powersave(struct drm_device *dev) | |||
6191 | valleyview_cleanup_gt_powersave(dev); | 6191 | valleyview_cleanup_gt_powersave(dev); |
6192 | } | 6192 | } |
6193 | 6193 | ||
6194 | static void gen6_suspend_rps(struct drm_device *dev) | ||
6195 | { | ||
6196 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
6197 | |||
6198 | flush_delayed_work(&dev_priv->rps.delayed_resume_work); | ||
6199 | |||
6200 | /* | ||
6201 | * TODO: disable RPS interrupts on GEN9+ too once RPS support | ||
6202 | * is added for it. | ||
6203 | */ | ||
6204 | if (INTEL_INFO(dev)->gen < 9) | ||
6205 | gen6_disable_rps_interrupts(dev); | ||
6206 | } | ||
6207 | |||
6194 | /** | 6208 | /** |
6195 | * intel_suspend_gt_powersave - suspend PM work and helper threads | 6209 | * intel_suspend_gt_powersave - suspend PM work and helper threads |
6196 | * @dev: drm device | 6210 | * @dev: drm device |
@@ -6206,14 +6220,7 @@ void intel_suspend_gt_powersave(struct drm_device *dev) | |||
6206 | if (INTEL_INFO(dev)->gen < 6) | 6220 | if (INTEL_INFO(dev)->gen < 6) |
6207 | return; | 6221 | return; |
6208 | 6222 | ||
6209 | flush_delayed_work(&dev_priv->rps.delayed_resume_work); | 6223 | gen6_suspend_rps(dev); |
6210 | |||
6211 | /* | ||
6212 | * TODO: disable RPS interrupts on GEN9+ too once RPS support | ||
6213 | * is added for it. | ||
6214 | */ | ||
6215 | if (INTEL_INFO(dev)->gen < 9) | ||
6216 | gen6_disable_rps_interrupts(dev); | ||
6217 | 6224 | ||
6218 | /* Force GPU to min freq during suspend */ | 6225 | /* Force GPU to min freq during suspend */ |
6219 | gen6_rps_idle(dev_priv); | 6226 | gen6_rps_idle(dev_priv); |
@@ -6316,8 +6323,11 @@ void intel_reset_gt_powersave(struct drm_device *dev) | |||
6316 | { | 6323 | { |
6317 | struct drm_i915_private *dev_priv = dev->dev_private; | 6324 | struct drm_i915_private *dev_priv = dev->dev_private; |
6318 | 6325 | ||
6326 | if (INTEL_INFO(dev)->gen < 6) | ||
6327 | return; | ||
6328 | |||
6329 | gen6_suspend_rps(dev); | ||
6319 | dev_priv->rps.enabled = false; | 6330 | dev_priv->rps.enabled = false; |
6320 | intel_enable_gt_powersave(dev); | ||
6321 | } | 6331 | } |
6322 | 6332 | ||
6323 | static void ibx_init_clock_gating(struct drm_device *dev) | 6333 | static void ibx_init_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 9f445e9a75d1..c7bc93d28d84 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -362,12 +362,15 @@ gen7_render_ring_flush(struct intel_engine_cs *ring, | |||
362 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | 362 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; |
363 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | 363 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; |
364 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | 364 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; |
365 | flags |= PIPE_CONTROL_MEDIA_STATE_CLEAR; | ||
365 | /* | 366 | /* |
366 | * TLB invalidate requires a post-sync write. | 367 | * TLB invalidate requires a post-sync write. |
367 | */ | 368 | */ |
368 | flags |= PIPE_CONTROL_QW_WRITE; | 369 | flags |= PIPE_CONTROL_QW_WRITE; |
369 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; | 370 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; |
370 | 371 | ||
372 | flags |= PIPE_CONTROL_STALL_AT_SCOREBOARD; | ||
373 | |||
371 | /* Workaround: we must issue a pipe_control with CS-stall bit | 374 | /* Workaround: we must issue a pipe_control with CS-stall bit |
372 | * set before a pipe_control command that has the state cache | 375 | * set before a pipe_control command that has the state cache |
373 | * invalidate bit set. */ | 376 | * invalidate bit set. */ |
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index aa873048308b..94a5bee69fe7 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c | |||
@@ -386,9 +386,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *gpu) | |||
386 | msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id); | 386 | msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id); |
387 | drm_gem_object_unreference(gpu->memptrs_bo); | 387 | drm_gem_object_unreference(gpu->memptrs_bo); |
388 | } | 388 | } |
389 | if (gpu->pm4) | 389 | release_firmware(gpu->pm4); |
390 | release_firmware(gpu->pm4); | 390 | release_firmware(gpu->pfp); |
391 | if (gpu->pfp) | ||
392 | release_firmware(gpu->pfp); | ||
393 | msm_gpu_cleanup(&gpu->base); | 391 | msm_gpu_cleanup(&gpu->base); |
394 | } | 392 | } |
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c index fbebb0405d76..b4e70e0e3cfa 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_connector.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_connector.c | |||
@@ -141,6 +141,15 @@ static int hpd_enable(struct hdmi_connector *hdmi_connector) | |||
141 | uint32_t hpd_ctrl; | 141 | uint32_t hpd_ctrl; |
142 | int i, ret; | 142 | int i, ret; |
143 | 143 | ||
144 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
145 | ret = regulator_enable(hdmi->hpd_regs[i]); | ||
146 | if (ret) { | ||
147 | dev_err(dev->dev, "failed to enable hpd regulator: %s (%d)\n", | ||
148 | config->hpd_reg_names[i], ret); | ||
149 | goto fail; | ||
150 | } | ||
151 | } | ||
152 | |||
144 | ret = gpio_config(hdmi, true); | 153 | ret = gpio_config(hdmi, true); |
145 | if (ret) { | 154 | if (ret) { |
146 | dev_err(dev->dev, "failed to configure GPIOs: %d\n", ret); | 155 | dev_err(dev->dev, "failed to configure GPIOs: %d\n", ret); |
@@ -164,15 +173,6 @@ static int hpd_enable(struct hdmi_connector *hdmi_connector) | |||
164 | } | 173 | } |
165 | } | 174 | } |
166 | 175 | ||
167 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
168 | ret = regulator_enable(hdmi->hpd_regs[i]); | ||
169 | if (ret) { | ||
170 | dev_err(dev->dev, "failed to enable hpd regulator: %s (%d)\n", | ||
171 | config->hpd_reg_names[i], ret); | ||
172 | goto fail; | ||
173 | } | ||
174 | } | ||
175 | |||
176 | hdmi_set_mode(hdmi, false); | 176 | hdmi_set_mode(hdmi, false); |
177 | phy->funcs->reset(phy); | 177 | phy->funcs->reset(phy); |
178 | hdmi_set_mode(hdmi, true); | 178 | hdmi_set_mode(hdmi, true); |
@@ -200,7 +200,7 @@ fail: | |||
200 | return ret; | 200 | return ret; |
201 | } | 201 | } |
202 | 202 | ||
203 | static int hdp_disable(struct hdmi_connector *hdmi_connector) | 203 | static void hdp_disable(struct hdmi_connector *hdmi_connector) |
204 | { | 204 | { |
205 | struct hdmi *hdmi = hdmi_connector->hdmi; | 205 | struct hdmi *hdmi = hdmi_connector->hdmi; |
206 | const struct hdmi_platform_config *config = hdmi->config; | 206 | const struct hdmi_platform_config *config = hdmi->config; |
@@ -212,28 +212,19 @@ static int hdp_disable(struct hdmi_connector *hdmi_connector) | |||
212 | 212 | ||
213 | hdmi_set_mode(hdmi, false); | 213 | hdmi_set_mode(hdmi, false); |
214 | 214 | ||
215 | for (i = 0; i < config->hpd_reg_cnt; i++) { | ||
216 | ret = regulator_disable(hdmi->hpd_regs[i]); | ||
217 | if (ret) { | ||
218 | dev_err(dev->dev, "failed to disable hpd regulator: %s (%d)\n", | ||
219 | config->hpd_reg_names[i], ret); | ||
220 | goto fail; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | for (i = 0; i < config->hpd_clk_cnt; i++) | 215 | for (i = 0; i < config->hpd_clk_cnt; i++) |
225 | clk_disable_unprepare(hdmi->hpd_clks[i]); | 216 | clk_disable_unprepare(hdmi->hpd_clks[i]); |
226 | 217 | ||
227 | ret = gpio_config(hdmi, false); | 218 | ret = gpio_config(hdmi, false); |
228 | if (ret) { | 219 | if (ret) |
229 | dev_err(dev->dev, "failed to unconfigure GPIOs: %d\n", ret); | 220 | dev_warn(dev->dev, "failed to unconfigure GPIOs: %d\n", ret); |
230 | goto fail; | ||
231 | } | ||
232 | |||
233 | return 0; | ||
234 | 221 | ||
235 | fail: | 222 | for (i = 0; i < config->hpd_reg_cnt; i++) { |
236 | return ret; | 223 | ret = regulator_disable(hdmi->hpd_regs[i]); |
224 | if (ret) | ||
225 | dev_warn(dev->dev, "failed to disable hpd regulator: %s (%d)\n", | ||
226 | config->hpd_reg_names[i], ret); | ||
227 | } | ||
237 | } | 228 | } |
238 | 229 | ||
239 | static void | 230 | static void |
@@ -260,11 +251,11 @@ void hdmi_connector_irq(struct drm_connector *connector) | |||
260 | (hpd_int_status & HDMI_HPD_INT_STATUS_INT)) { | 251 | (hpd_int_status & HDMI_HPD_INT_STATUS_INT)) { |
261 | bool detected = !!(hpd_int_status & HDMI_HPD_INT_STATUS_CABLE_DETECTED); | 252 | bool detected = !!(hpd_int_status & HDMI_HPD_INT_STATUS_CABLE_DETECTED); |
262 | 253 | ||
263 | DBG("status=%04x, ctrl=%04x", hpd_int_status, hpd_int_ctrl); | 254 | /* ack & disable (temporarily) HPD events: */ |
264 | |||
265 | /* ack the irq: */ | ||
266 | hdmi_write(hdmi, REG_HDMI_HPD_INT_CTRL, | 255 | hdmi_write(hdmi, REG_HDMI_HPD_INT_CTRL, |
267 | hpd_int_ctrl | HDMI_HPD_INT_CTRL_INT_ACK); | 256 | HDMI_HPD_INT_CTRL_INT_ACK); |
257 | |||
258 | DBG("status=%04x, ctrl=%04x", hpd_int_status, hpd_int_ctrl); | ||
268 | 259 | ||
269 | /* detect disconnect if we are connected or visa versa: */ | 260 | /* detect disconnect if we are connected or visa versa: */ |
270 | hpd_int_ctrl = HDMI_HPD_INT_CTRL_INT_EN; | 261 | hpd_int_ctrl = HDMI_HPD_INT_CTRL_INT_EN; |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index a7672e100d8b..3449213f1e76 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
@@ -331,17 +331,8 @@ static int mdp4_crtc_atomic_check(struct drm_crtc *crtc, | |||
331 | struct drm_crtc_state *state) | 331 | struct drm_crtc_state *state) |
332 | { | 332 | { |
333 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 333 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
334 | struct drm_device *dev = crtc->dev; | ||
335 | |||
336 | DBG("%s: check", mdp4_crtc->name); | 334 | DBG("%s: check", mdp4_crtc->name); |
337 | |||
338 | if (mdp4_crtc->event) { | ||
339 | dev_err(dev->dev, "already pending flip!\n"); | ||
340 | return -EBUSY; | ||
341 | } | ||
342 | |||
343 | // TODO anything else to check? | 335 | // TODO anything else to check? |
344 | |||
345 | return 0; | 336 | return 0; |
346 | } | 337 | } |
347 | 338 | ||
@@ -357,7 +348,7 @@ static void mdp4_crtc_atomic_flush(struct drm_crtc *crtc) | |||
357 | struct drm_device *dev = crtc->dev; | 348 | struct drm_device *dev = crtc->dev; |
358 | unsigned long flags; | 349 | unsigned long flags; |
359 | 350 | ||
360 | DBG("%s: flush", mdp4_crtc->name); | 351 | DBG("%s: event: %p", mdp4_crtc->name, crtc->state->event); |
361 | 352 | ||
362 | WARN_ON(mdp4_crtc->event); | 353 | WARN_ON(mdp4_crtc->event); |
363 | 354 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c index 0e9a2e3a82d7..f021f960a8a2 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | |||
@@ -303,11 +303,6 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, | |||
303 | 303 | ||
304 | DBG("%s: check", mdp5_crtc->name); | 304 | DBG("%s: check", mdp5_crtc->name); |
305 | 305 | ||
306 | if (mdp5_crtc->event) { | ||
307 | dev_err(dev->dev, "already pending flip!\n"); | ||
308 | return -EBUSY; | ||
309 | } | ||
310 | |||
311 | /* request a free CTL, if none is already allocated for this CRTC */ | 306 | /* request a free CTL, if none is already allocated for this CRTC */ |
312 | if (state->enable && !mdp5_crtc->ctl) { | 307 | if (state->enable && !mdp5_crtc->ctl) { |
313 | mdp5_crtc->ctl = mdp5_ctlm_request(mdp5_kms->ctlm, crtc); | 308 | mdp5_crtc->ctl = mdp5_ctlm_request(mdp5_kms->ctlm, crtc); |
@@ -364,7 +359,7 @@ static void mdp5_crtc_atomic_flush(struct drm_crtc *crtc) | |||
364 | struct drm_device *dev = crtc->dev; | 359 | struct drm_device *dev = crtc->dev; |
365 | unsigned long flags; | 360 | unsigned long flags; |
366 | 361 | ||
367 | DBG("%s: flush", mdp5_crtc->name); | 362 | DBG("%s: event: %p", mdp5_crtc->name, crtc->state->event); |
368 | 363 | ||
369 | WARN_ON(mdp5_crtc->event); | 364 | WARN_ON(mdp5_crtc->event); |
370 | 365 | ||
@@ -460,10 +455,7 @@ void mdp5_crtc_set_intf(struct drm_crtc *crtc, int intf, | |||
460 | /* now that we know what irq's we want: */ | 455 | /* now that we know what irq's we want: */ |
461 | mdp5_crtc->err.irqmask = intf2err(intf); | 456 | mdp5_crtc->err.irqmask = intf2err(intf); |
462 | mdp5_crtc->vblank.irqmask = intf2vblank(intf); | 457 | mdp5_crtc->vblank.irqmask = intf2vblank(intf); |
463 | 458 | mdp_irq_update(&mdp5_kms->base); | |
464 | /* when called from modeset_init(), skip the rest until later: */ | ||
465 | if (!mdp5_kms) | ||
466 | return; | ||
467 | 459 | ||
468 | spin_lock_irqsave(&mdp5_kms->resource_lock, flags); | 460 | spin_lock_irqsave(&mdp5_kms->resource_lock, flags); |
469 | intf_sel = mdp5_read(mdp5_kms, REG_MDP5_DISP_INTF_SEL); | 461 | intf_sel = mdp5_read(mdp5_kms, REG_MDP5_DISP_INTF_SEL); |
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c index a11f1b80c488..9f01a4f21af2 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | |||
@@ -216,17 +216,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) | |||
216 | goto fail; | 216 | goto fail; |
217 | } | 217 | } |
218 | 218 | ||
219 | /* NOTE: the vsync and error irq's are actually associated with | 219 | encoder->possible_crtcs = (1 << priv->num_crtcs) - 1;; |
220 | * the INTF/encoder.. the easiest way to deal with this (ie. what | ||
221 | * we do now) is assume a fixed relationship between crtc's and | ||
222 | * encoders. I'm not sure if there is ever a need to more freely | ||
223 | * assign crtcs to encoders, but if there is then we need to take | ||
224 | * care of error and vblank irq's that the crtc has registered, | ||
225 | * and also update user-requested vblank_mask. | ||
226 | */ | ||
227 | encoder->possible_crtcs = BIT(0); | ||
228 | mdp5_crtc_set_intf(priv->crtcs[0], 3, INTF_HDMI); | ||
229 | |||
230 | priv->encoders[priv->num_encoders++] = encoder; | 220 | priv->encoders[priv->num_encoders++] = encoder; |
231 | 221 | ||
232 | /* Construct bridge/connector for HDMI: */ | 222 | /* Construct bridge/connector for HDMI: */ |
diff --git a/drivers/gpu/drm/msm/mdp/mdp_kms.c b/drivers/gpu/drm/msm/mdp/mdp_kms.c index 03455b64a245..2a731722d840 100644 --- a/drivers/gpu/drm/msm/mdp/mdp_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp_kms.c | |||
@@ -42,7 +42,10 @@ static void update_irq(struct mdp_kms *mdp_kms) | |||
42 | mdp_kms->funcs->set_irqmask(mdp_kms, irqmask); | 42 | mdp_kms->funcs->set_irqmask(mdp_kms, irqmask); |
43 | } | 43 | } |
44 | 44 | ||
45 | static void update_irq_unlocked(struct mdp_kms *mdp_kms) | 45 | /* if an mdp_irq's irqmask has changed, such as when mdp5 crtc<->encoder |
46 | * link changes, this must be called to figure out the new global irqmask | ||
47 | */ | ||
48 | void mdp_irq_update(struct mdp_kms *mdp_kms) | ||
46 | { | 49 | { |
47 | unsigned long flags; | 50 | unsigned long flags; |
48 | spin_lock_irqsave(&list_lock, flags); | 51 | spin_lock_irqsave(&list_lock, flags); |
@@ -122,7 +125,7 @@ void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | |||
122 | spin_unlock_irqrestore(&list_lock, flags); | 125 | spin_unlock_irqrestore(&list_lock, flags); |
123 | 126 | ||
124 | if (needs_update) | 127 | if (needs_update) |
125 | update_irq_unlocked(mdp_kms); | 128 | mdp_irq_update(mdp_kms); |
126 | } | 129 | } |
127 | 130 | ||
128 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | 131 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) |
@@ -141,5 +144,5 @@ void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq) | |||
141 | spin_unlock_irqrestore(&list_lock, flags); | 144 | spin_unlock_irqrestore(&list_lock, flags); |
142 | 145 | ||
143 | if (needs_update) | 146 | if (needs_update) |
144 | update_irq_unlocked(mdp_kms); | 147 | mdp_irq_update(mdp_kms); |
145 | } | 148 | } |
diff --git a/drivers/gpu/drm/msm/mdp/mdp_kms.h b/drivers/gpu/drm/msm/mdp/mdp_kms.h index 99557b5ad4fd..b268ce95d394 100644 --- a/drivers/gpu/drm/msm/mdp/mdp_kms.h +++ b/drivers/gpu/drm/msm/mdp/mdp_kms.h | |||
@@ -75,7 +75,7 @@ void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable) | |||
75 | void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); | 75 | void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); |
76 | void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 76 | void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); |
77 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); | 77 | void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); |
78 | 78 | void mdp_irq_update(struct mdp_kms *mdp_kms); | |
79 | 79 | ||
80 | /* | 80 | /* |
81 | * pixel format helpers: | 81 | * pixel format helpers: |
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c index f0de412e13dc..191968256c58 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c | |||
@@ -23,10 +23,41 @@ struct msm_commit { | |||
23 | struct drm_atomic_state *state; | 23 | struct drm_atomic_state *state; |
24 | uint32_t fence; | 24 | uint32_t fence; |
25 | struct msm_fence_cb fence_cb; | 25 | struct msm_fence_cb fence_cb; |
26 | uint32_t crtc_mask; | ||
26 | }; | 27 | }; |
27 | 28 | ||
28 | static void fence_cb(struct msm_fence_cb *cb); | 29 | static void fence_cb(struct msm_fence_cb *cb); |
29 | 30 | ||
31 | /* block until specified crtcs are no longer pending update, and | ||
32 | * atomically mark them as pending update | ||
33 | */ | ||
34 | static int start_atomic(struct msm_drm_private *priv, uint32_t crtc_mask) | ||
35 | { | ||
36 | int ret; | ||
37 | |||
38 | spin_lock(&priv->pending_crtcs_event.lock); | ||
39 | ret = wait_event_interruptible_locked(priv->pending_crtcs_event, | ||
40 | !(priv->pending_crtcs & crtc_mask)); | ||
41 | if (ret == 0) { | ||
42 | DBG("start: %08x", crtc_mask); | ||
43 | priv->pending_crtcs |= crtc_mask; | ||
44 | } | ||
45 | spin_unlock(&priv->pending_crtcs_event.lock); | ||
46 | |||
47 | return ret; | ||
48 | } | ||
49 | |||
50 | /* clear specified crtcs (no longer pending update) | ||
51 | */ | ||
52 | static void end_atomic(struct msm_drm_private *priv, uint32_t crtc_mask) | ||
53 | { | ||
54 | spin_lock(&priv->pending_crtcs_event.lock); | ||
55 | DBG("end: %08x", crtc_mask); | ||
56 | priv->pending_crtcs &= ~crtc_mask; | ||
57 | wake_up_all_locked(&priv->pending_crtcs_event); | ||
58 | spin_unlock(&priv->pending_crtcs_event.lock); | ||
59 | } | ||
60 | |||
30 | static struct msm_commit *new_commit(struct drm_atomic_state *state) | 61 | static struct msm_commit *new_commit(struct drm_atomic_state *state) |
31 | { | 62 | { |
32 | struct msm_commit *c = kzalloc(sizeof(*c), GFP_KERNEL); | 63 | struct msm_commit *c = kzalloc(sizeof(*c), GFP_KERNEL); |
@@ -58,12 +89,27 @@ static void complete_commit(struct msm_commit *c) | |||
58 | 89 | ||
59 | drm_atomic_helper_commit_post_planes(dev, state); | 90 | drm_atomic_helper_commit_post_planes(dev, state); |
60 | 91 | ||
92 | /* NOTE: _wait_for_vblanks() only waits for vblank on | ||
93 | * enabled CRTCs. So we end up faulting when disabling | ||
94 | * due to (potentially) unref'ing the outgoing fb's | ||
95 | * before the vblank when the disable has latched. | ||
96 | * | ||
97 | * But if it did wait on disabled (or newly disabled) | ||
98 | * CRTCs, that would be racy (ie. we could have missed | ||
99 | * the irq. We need some way to poll for pipe shut | ||
100 | * down. Or just live with occasionally hitting the | ||
101 | * timeout in the CRTC disable path (which really should | ||
102 | * not be critical path) | ||
103 | */ | ||
104 | |||
61 | drm_atomic_helper_wait_for_vblanks(dev, state); | 105 | drm_atomic_helper_wait_for_vblanks(dev, state); |
62 | 106 | ||
63 | drm_atomic_helper_cleanup_planes(dev, state); | 107 | drm_atomic_helper_cleanup_planes(dev, state); |
64 | 108 | ||
65 | drm_atomic_state_free(state); | 109 | drm_atomic_state_free(state); |
66 | 110 | ||
111 | end_atomic(dev->dev_private, c->crtc_mask); | ||
112 | |||
67 | kfree(c); | 113 | kfree(c); |
68 | } | 114 | } |
69 | 115 | ||
@@ -97,8 +143,9 @@ static void add_fb(struct msm_commit *c, struct drm_framebuffer *fb) | |||
97 | int msm_atomic_commit(struct drm_device *dev, | 143 | int msm_atomic_commit(struct drm_device *dev, |
98 | struct drm_atomic_state *state, bool async) | 144 | struct drm_atomic_state *state, bool async) |
99 | { | 145 | { |
100 | struct msm_commit *c; | ||
101 | int nplanes = dev->mode_config.num_total_plane; | 146 | int nplanes = dev->mode_config.num_total_plane; |
147 | int ncrtcs = dev->mode_config.num_crtc; | ||
148 | struct msm_commit *c; | ||
102 | int i, ret; | 149 | int i, ret; |
103 | 150 | ||
104 | ret = drm_atomic_helper_prepare_planes(dev, state); | 151 | ret = drm_atomic_helper_prepare_planes(dev, state); |
@@ -106,6 +153,18 @@ int msm_atomic_commit(struct drm_device *dev, | |||
106 | return ret; | 153 | return ret; |
107 | 154 | ||
108 | c = new_commit(state); | 155 | c = new_commit(state); |
156 | if (!c) | ||
157 | return -ENOMEM; | ||
158 | |||
159 | /* | ||
160 | * Figure out what crtcs we have: | ||
161 | */ | ||
162 | for (i = 0; i < ncrtcs; i++) { | ||
163 | struct drm_crtc *crtc = state->crtcs[i]; | ||
164 | if (!crtc) | ||
165 | continue; | ||
166 | c->crtc_mask |= (1 << drm_crtc_index(crtc)); | ||
167 | } | ||
109 | 168 | ||
110 | /* | 169 | /* |
111 | * Figure out what fence to wait for: | 170 | * Figure out what fence to wait for: |
@@ -122,6 +181,14 @@ int msm_atomic_commit(struct drm_device *dev, | |||
122 | } | 181 | } |
123 | 182 | ||
124 | /* | 183 | /* |
184 | * Wait for pending updates on any of the same crtc's and then | ||
185 | * mark our set of crtc's as busy: | ||
186 | */ | ||
187 | ret = start_atomic(dev->dev_private, c->crtc_mask); | ||
188 | if (ret) | ||
189 | return ret; | ||
190 | |||
191 | /* | ||
125 | * This is the point of no return - everything below never fails except | 192 | * This is the point of no return - everything below never fails except |
126 | * when the hw goes bonghits. Which means we can commit the new state on | 193 | * when the hw goes bonghits. Which means we can commit the new state on |
127 | * the software side now. | 194 | * the software side now. |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index c795217e1bfc..9a61546a0b05 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
@@ -193,6 +193,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags) | |||
193 | 193 | ||
194 | priv->wq = alloc_ordered_workqueue("msm", 0); | 194 | priv->wq = alloc_ordered_workqueue("msm", 0); |
195 | init_waitqueue_head(&priv->fence_event); | 195 | init_waitqueue_head(&priv->fence_event); |
196 | init_waitqueue_head(&priv->pending_crtcs_event); | ||
196 | 197 | ||
197 | INIT_LIST_HEAD(&priv->inactive_list); | 198 | INIT_LIST_HEAD(&priv->inactive_list); |
198 | INIT_LIST_HEAD(&priv->fence_cbs); | 199 | INIT_LIST_HEAD(&priv->fence_cbs); |
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 136303818436..b69ef2d5a26c 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h | |||
@@ -96,6 +96,10 @@ struct msm_drm_private { | |||
96 | /* callbacks deferred until bo is inactive: */ | 96 | /* callbacks deferred until bo is inactive: */ |
97 | struct list_head fence_cbs; | 97 | struct list_head fence_cbs; |
98 | 98 | ||
99 | /* crtcs pending async atomic updates: */ | ||
100 | uint32_t pending_crtcs; | ||
101 | wait_queue_head_t pending_crtcs_event; | ||
102 | |||
99 | /* registered MMUs: */ | 103 | /* registered MMUs: */ |
100 | unsigned int num_mmus; | 104 | unsigned int num_mmus; |
101 | struct msm_mmu *mmus[NUM_DOMAINS]; | 105 | struct msm_mmu *mmus[NUM_DOMAINS]; |
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 94d55e526b4e..1f3af13ccede 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
@@ -190,8 +190,7 @@ fail_unlock: | |||
190 | fail: | 190 | fail: |
191 | 191 | ||
192 | if (ret) { | 192 | if (ret) { |
193 | if (fbi) | 193 | framebuffer_release(fbi); |
194 | framebuffer_release(fbi); | ||
195 | if (fb) { | 194 | if (fb) { |
196 | drm_framebuffer_unregister_private(fb); | 195 | drm_framebuffer_unregister_private(fb); |
197 | drm_framebuffer_remove(fb); | 196 | drm_framebuffer_remove(fb); |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 4a6f0e49d5b5..49dea4fb55ac 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -535,8 +535,7 @@ void msm_gem_free_object(struct drm_gem_object *obj) | |||
535 | drm_free_large(msm_obj->pages); | 535 | drm_free_large(msm_obj->pages); |
536 | 536 | ||
537 | } else { | 537 | } else { |
538 | if (msm_obj->vaddr) | 538 | vunmap(msm_obj->vaddr); |
539 | vunmap(msm_obj->vaddr); | ||
540 | put_pages(obj); | 539 | put_pages(obj); |
541 | } | 540 | } |
542 | 541 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 5d93902a91ab..f8042433752b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -876,7 +876,6 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev, | |||
876 | if (ret) | 876 | if (ret) |
877 | return ret; | 877 | return ret; |
878 | 878 | ||
879 | bo->gem.dumb = true; | ||
880 | ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle); | 879 | ret = drm_gem_handle_create(file_priv, &bo->gem, &args->handle); |
881 | drm_gem_object_unreference_unlocked(&bo->gem); | 880 | drm_gem_object_unreference_unlocked(&bo->gem); |
882 | return ret; | 881 | return ret; |
@@ -892,14 +891,6 @@ nouveau_display_dumb_map_offset(struct drm_file *file_priv, | |||
892 | gem = drm_gem_object_lookup(dev, file_priv, handle); | 891 | gem = drm_gem_object_lookup(dev, file_priv, handle); |
893 | if (gem) { | 892 | if (gem) { |
894 | struct nouveau_bo *bo = nouveau_gem_object(gem); | 893 | struct nouveau_bo *bo = nouveau_gem_object(gem); |
895 | |||
896 | /* | ||
897 | * We don't allow dumb mmaps on objects created using another | ||
898 | * interface. | ||
899 | */ | ||
900 | WARN_ONCE(!(gem->dumb || gem->import_attach), | ||
901 | "Illegal dumb map of accelerated buffer.\n"); | ||
902 | |||
903 | *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node); | 894 | *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node); |
904 | drm_gem_object_unreference_unlocked(gem); | 895 | drm_gem_object_unreference_unlocked(gem); |
905 | return 0; | 896 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index 28d51a22a4bf..42c34babc2e5 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c | |||
@@ -444,9 +444,6 @@ validate_list(struct nouveau_channel *chan, struct nouveau_cli *cli, | |||
444 | list_for_each_entry(nvbo, list, entry) { | 444 | list_for_each_entry(nvbo, list, entry) { |
445 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; | 445 | struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; |
446 | 446 | ||
447 | WARN_ONCE(nvbo->gem.dumb, | ||
448 | "GPU use of dumb buffer is illegal.\n"); | ||
449 | |||
450 | ret = nouveau_gem_set_domain(&nvbo->gem, b->read_domains, | 447 | ret = nouveau_gem_set_domain(&nvbo->gem, b->read_domains, |
451 | b->write_domains, | 448 | b->write_domains, |
452 | b->valid_domains); | 449 | b->valid_domains); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 753a6def61e7..3d1cfcb96b6b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "nouveau_ttm.h" | 28 | #include "nouveau_ttm.h" |
29 | #include "nouveau_gem.h" | 29 | #include "nouveau_gem.h" |
30 | 30 | ||
31 | #include "drm_legacy.h" | ||
31 | static int | 32 | static int |
32 | nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long psize) | 33 | nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long psize) |
33 | { | 34 | { |
@@ -281,7 +282,7 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
281 | struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev); | 282 | struct nouveau_drm *drm = nouveau_drm(file_priv->minor->dev); |
282 | 283 | ||
283 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) | 284 | if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) |
284 | return -EINVAL; | 285 | return drm_legacy_mmap(filp, vma); |
285 | 286 | ||
286 | return ttm_bo_mmap(filp, vma, &drm->ttm.bdev); | 287 | return ttm_bo_mmap(filp, vma, &drm->ttm.bdev); |
287 | } | 288 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index fe48f229043e..a46f73737994 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -394,10 +394,9 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, | |||
394 | return r; | 394 | return r; |
395 | } | 395 | } |
396 | 396 | ||
397 | static int radeon_mode_mmap(struct drm_file *filp, | 397 | int radeon_mode_dumb_mmap(struct drm_file *filp, |
398 | struct drm_device *dev, | 398 | struct drm_device *dev, |
399 | uint32_t handle, bool dumb, | 399 | uint32_t handle, uint64_t *offset_p) |
400 | uint64_t *offset_p) | ||
401 | { | 400 | { |
402 | struct drm_gem_object *gobj; | 401 | struct drm_gem_object *gobj; |
403 | struct radeon_bo *robj; | 402 | struct radeon_bo *robj; |
@@ -406,14 +405,6 @@ static int radeon_mode_mmap(struct drm_file *filp, | |||
406 | if (gobj == NULL) { | 405 | if (gobj == NULL) { |
407 | return -ENOENT; | 406 | return -ENOENT; |
408 | } | 407 | } |
409 | |||
410 | /* | ||
411 | * We don't allow dumb mmaps on objects created using another | ||
412 | * interface. | ||
413 | */ | ||
414 | WARN_ONCE(dumb && !(gobj->dumb || gobj->import_attach), | ||
415 | "Illegal dumb map of GPU buffer.\n"); | ||
416 | |||
417 | robj = gem_to_radeon_bo(gobj); | 408 | robj = gem_to_radeon_bo(gobj); |
418 | if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) { | 409 | if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) { |
419 | drm_gem_object_unreference_unlocked(gobj); | 410 | drm_gem_object_unreference_unlocked(gobj); |
@@ -424,20 +415,12 @@ static int radeon_mode_mmap(struct drm_file *filp, | |||
424 | return 0; | 415 | return 0; |
425 | } | 416 | } |
426 | 417 | ||
427 | int radeon_mode_dumb_mmap(struct drm_file *filp, | ||
428 | struct drm_device *dev, | ||
429 | uint32_t handle, uint64_t *offset_p) | ||
430 | { | ||
431 | return radeon_mode_mmap(filp, dev, handle, true, offset_p); | ||
432 | } | ||
433 | |||
434 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, | 418 | int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, |
435 | struct drm_file *filp) | 419 | struct drm_file *filp) |
436 | { | 420 | { |
437 | struct drm_radeon_gem_mmap *args = data; | 421 | struct drm_radeon_gem_mmap *args = data; |
438 | 422 | ||
439 | return radeon_mode_mmap(filp, dev, args->handle, false, | 423 | return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr); |
440 | &args->addr_ptr); | ||
441 | } | 424 | } |
442 | 425 | ||
443 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | 426 | int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, |
@@ -763,7 +746,6 @@ int radeon_mode_dumb_create(struct drm_file *file_priv, | |||
763 | return -ENOMEM; | 746 | return -ENOMEM; |
764 | 747 | ||
765 | r = drm_gem_handle_create(file_priv, gobj, &handle); | 748 | r = drm_gem_handle_create(file_priv, gobj, &handle); |
766 | gobj->dumb = true; | ||
767 | /* drop reference from allocate - handle holds it now */ | 749 | /* drop reference from allocate - handle holds it now */ |
768 | drm_gem_object_unreference_unlocked(gobj); | 750 | drm_gem_object_unreference_unlocked(gobj); |
769 | if (r) { | 751 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 065d02068ec3..242fd8b1b221 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include "cikd.h" | 28 | #include "cikd.h" |
29 | #include "cik_reg.h" | 29 | #include "cik_reg.h" |
30 | #include "radeon_kfd.h" | 30 | #include "radeon_kfd.h" |
31 | #include "radeon_ucode.h" | ||
32 | #include <linux/firmware.h> | ||
31 | 33 | ||
32 | #define CIK_PIPE_PER_MEC (4) | 34 | #define CIK_PIPE_PER_MEC (4) |
33 | 35 | ||
@@ -49,6 +51,7 @@ static uint64_t get_vmem_size(struct kgd_dev *kgd); | |||
49 | static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); | 51 | static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); |
50 | 52 | ||
51 | static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); | 53 | static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); |
54 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); | ||
52 | 55 | ||
53 | /* | 56 | /* |
54 | * Register access functions | 57 | * Register access functions |
@@ -91,6 +94,7 @@ static const struct kfd2kgd_calls kfd2kgd = { | |||
91 | .hqd_load = kgd_hqd_load, | 94 | .hqd_load = kgd_hqd_load, |
92 | .hqd_is_occupies = kgd_hqd_is_occupies, | 95 | .hqd_is_occupies = kgd_hqd_is_occupies, |
93 | .hqd_destroy = kgd_hqd_destroy, | 96 | .hqd_destroy = kgd_hqd_destroy, |
97 | .get_fw_version = get_fw_version | ||
94 | }; | 98 | }; |
95 | 99 | ||
96 | static const struct kgd2kfd_calls *kgd2kfd; | 100 | static const struct kgd2kfd_calls *kgd2kfd; |
@@ -561,3 +565,52 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, | |||
561 | release_queue(kgd); | 565 | release_queue(kgd); |
562 | return 0; | 566 | return 0; |
563 | } | 567 | } |
568 | |||
569 | static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) | ||
570 | { | ||
571 | struct radeon_device *rdev = (struct radeon_device *) kgd; | ||
572 | const union radeon_firmware_header *hdr; | ||
573 | |||
574 | BUG_ON(kgd == NULL || rdev->mec_fw == NULL); | ||
575 | |||
576 | switch (type) { | ||
577 | case KGD_ENGINE_PFP: | ||
578 | hdr = (const union radeon_firmware_header *) rdev->pfp_fw->data; | ||
579 | break; | ||
580 | |||
581 | case KGD_ENGINE_ME: | ||
582 | hdr = (const union radeon_firmware_header *) rdev->me_fw->data; | ||
583 | break; | ||
584 | |||
585 | case KGD_ENGINE_CE: | ||
586 | hdr = (const union radeon_firmware_header *) rdev->ce_fw->data; | ||
587 | break; | ||
588 | |||
589 | case KGD_ENGINE_MEC1: | ||
590 | hdr = (const union radeon_firmware_header *) rdev->mec_fw->data; | ||
591 | break; | ||
592 | |||
593 | case KGD_ENGINE_MEC2: | ||
594 | hdr = (const union radeon_firmware_header *) | ||
595 | rdev->mec2_fw->data; | ||
596 | break; | ||
597 | |||
598 | case KGD_ENGINE_RLC: | ||
599 | hdr = (const union radeon_firmware_header *) rdev->rlc_fw->data; | ||
600 | break; | ||
601 | |||
602 | case KGD_ENGINE_SDMA: | ||
603 | hdr = (const union radeon_firmware_header *) | ||
604 | rdev->sdma_fw->data; | ||
605 | break; | ||
606 | |||
607 | default: | ||
608 | return 0; | ||
609 | } | ||
610 | |||
611 | if (hdr == NULL) | ||
612 | return 0; | ||
613 | |||
614 | /* Only 12 bit in use*/ | ||
615 | return hdr->common.ucode_version; | ||
616 | } | ||
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 7d68223eb469..86fc56434b28 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -529,9 +529,6 @@ int radeon_bo_list_validate(struct radeon_device *rdev, | |||
529 | u32 current_domain = | 529 | u32 current_domain = |
530 | radeon_mem_type_to_domain(bo->tbo.mem.mem_type); | 530 | radeon_mem_type_to_domain(bo->tbo.mem.mem_type); |
531 | 531 | ||
532 | WARN_ONCE(bo->gem_base.dumb, | ||
533 | "GPU use of dumb buffer is illegal.\n"); | ||
534 | |||
535 | /* Check if this buffer will be moved and don't move it | 532 | /* Check if this buffer will be moved and don't move it |
536 | * if we have moved too many buffers for this IB already. | 533 | * if we have moved too many buffers for this IB already. |
537 | * | 534 | * |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 3367960286a6..978993fa3a36 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
@@ -168,7 +168,7 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
168 | const struct tegra_dc_window *window) | 168 | const struct tegra_dc_window *window) |
169 | { | 169 | { |
170 | unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp; | 170 | unsigned h_offset, v_offset, h_size, v_size, h_dda, v_dda, bpp; |
171 | unsigned long value; | 171 | unsigned long value, flags; |
172 | bool yuv, planar; | 172 | bool yuv, planar; |
173 | 173 | ||
174 | /* | 174 | /* |
@@ -181,6 +181,8 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
181 | else | 181 | else |
182 | bpp = planar ? 1 : 2; | 182 | bpp = planar ? 1 : 2; |
183 | 183 | ||
184 | spin_lock_irqsave(&dc->lock, flags); | ||
185 | |||
184 | value = WINDOW_A_SELECT << index; | 186 | value = WINDOW_A_SELECT << index; |
185 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); | 187 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); |
186 | 188 | ||
@@ -273,6 +275,7 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
273 | 275 | ||
274 | case TEGRA_BO_TILING_MODE_BLOCK: | 276 | case TEGRA_BO_TILING_MODE_BLOCK: |
275 | DRM_ERROR("hardware doesn't support block linear mode\n"); | 277 | DRM_ERROR("hardware doesn't support block linear mode\n"); |
278 | spin_unlock_irqrestore(&dc->lock, flags); | ||
276 | return -EINVAL; | 279 | return -EINVAL; |
277 | } | 280 | } |
278 | 281 | ||
@@ -331,6 +334,8 @@ static int tegra_dc_setup_window(struct tegra_dc *dc, unsigned int index, | |||
331 | 334 | ||
332 | tegra_dc_window_commit(dc, index); | 335 | tegra_dc_window_commit(dc, index); |
333 | 336 | ||
337 | spin_unlock_irqrestore(&dc->lock, flags); | ||
338 | |||
334 | return 0; | 339 | return 0; |
335 | } | 340 | } |
336 | 341 | ||
@@ -338,11 +343,14 @@ static int tegra_window_plane_disable(struct drm_plane *plane) | |||
338 | { | 343 | { |
339 | struct tegra_dc *dc = to_tegra_dc(plane->crtc); | 344 | struct tegra_dc *dc = to_tegra_dc(plane->crtc); |
340 | struct tegra_plane *p = to_tegra_plane(plane); | 345 | struct tegra_plane *p = to_tegra_plane(plane); |
346 | unsigned long flags; | ||
341 | u32 value; | 347 | u32 value; |
342 | 348 | ||
343 | if (!plane->crtc) | 349 | if (!plane->crtc) |
344 | return 0; | 350 | return 0; |
345 | 351 | ||
352 | spin_lock_irqsave(&dc->lock, flags); | ||
353 | |||
346 | value = WINDOW_A_SELECT << p->index; | 354 | value = WINDOW_A_SELECT << p->index; |
347 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); | 355 | tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); |
348 | 356 | ||
@@ -352,6 +360,8 @@ static int tegra_window_plane_disable(struct drm_plane *plane) | |||
352 | 360 | ||
353 | tegra_dc_window_commit(dc, p->index); | 361 | tegra_dc_window_commit(dc, p->index); |
354 | 362 | ||
363 | spin_unlock_irqrestore(&dc->lock, flags); | ||
364 | |||
355 | return 0; | 365 | return 0; |
356 | } | 366 | } |
357 | 367 | ||
@@ -699,14 +709,16 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
699 | struct tegra_bo *bo = tegra_fb_get_plane(fb, 0); | 709 | struct tegra_bo *bo = tegra_fb_get_plane(fb, 0); |
700 | unsigned int h_offset = 0, v_offset = 0; | 710 | unsigned int h_offset = 0, v_offset = 0; |
701 | struct tegra_bo_tiling tiling; | 711 | struct tegra_bo_tiling tiling; |
712 | unsigned long value, flags; | ||
702 | unsigned int format, swap; | 713 | unsigned int format, swap; |
703 | unsigned long value; | ||
704 | int err; | 714 | int err; |
705 | 715 | ||
706 | err = tegra_fb_get_tiling(fb, &tiling); | 716 | err = tegra_fb_get_tiling(fb, &tiling); |
707 | if (err < 0) | 717 | if (err < 0) |
708 | return err; | 718 | return err; |
709 | 719 | ||
720 | spin_lock_irqsave(&dc->lock, flags); | ||
721 | |||
710 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); | 722 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); |
711 | 723 | ||
712 | value = fb->offsets[0] + y * fb->pitches[0] + | 724 | value = fb->offsets[0] + y * fb->pitches[0] + |
@@ -752,6 +764,7 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
752 | 764 | ||
753 | case TEGRA_BO_TILING_MODE_BLOCK: | 765 | case TEGRA_BO_TILING_MODE_BLOCK: |
754 | DRM_ERROR("hardware doesn't support block linear mode\n"); | 766 | DRM_ERROR("hardware doesn't support block linear mode\n"); |
767 | spin_unlock_irqrestore(&dc->lock, flags); | ||
755 | return -EINVAL; | 768 | return -EINVAL; |
756 | } | 769 | } |
757 | 770 | ||
@@ -778,6 +791,8 @@ static int tegra_dc_set_base(struct tegra_dc *dc, int x, int y, | |||
778 | tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL); | 791 | tegra_dc_writel(dc, value << 8, DC_CMD_STATE_CONTROL); |
779 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); | 792 | tegra_dc_writel(dc, value, DC_CMD_STATE_CONTROL); |
780 | 793 | ||
794 | spin_unlock_irqrestore(&dc->lock, flags); | ||
795 | |||
781 | return 0; | 796 | return 0; |
782 | } | 797 | } |
783 | 798 | ||
@@ -814,23 +829,32 @@ static void tegra_dc_finish_page_flip(struct tegra_dc *dc) | |||
814 | unsigned long flags, base; | 829 | unsigned long flags, base; |
815 | struct tegra_bo *bo; | 830 | struct tegra_bo *bo; |
816 | 831 | ||
817 | if (!dc->event) | 832 | spin_lock_irqsave(&drm->event_lock, flags); |
833 | |||
834 | if (!dc->event) { | ||
835 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
818 | return; | 836 | return; |
837 | } | ||
819 | 838 | ||
820 | bo = tegra_fb_get_plane(crtc->primary->fb, 0); | 839 | bo = tegra_fb_get_plane(crtc->primary->fb, 0); |
821 | 840 | ||
841 | spin_lock_irqsave(&dc->lock, flags); | ||
842 | |||
822 | /* check if new start address has been latched */ | 843 | /* check if new start address has been latched */ |
844 | tegra_dc_writel(dc, WINDOW_A_SELECT, DC_CMD_DISPLAY_WINDOW_HEADER); | ||
823 | tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS); | 845 | tegra_dc_writel(dc, READ_MUX, DC_CMD_STATE_ACCESS); |
824 | base = tegra_dc_readl(dc, DC_WINBUF_START_ADDR); | 846 | base = tegra_dc_readl(dc, DC_WINBUF_START_ADDR); |
825 | tegra_dc_writel(dc, 0, DC_CMD_STATE_ACCESS); | 847 | tegra_dc_writel(dc, 0, DC_CMD_STATE_ACCESS); |
826 | 848 | ||
849 | spin_unlock_irqrestore(&dc->lock, flags); | ||
850 | |||
827 | if (base == bo->paddr + crtc->primary->fb->offsets[0]) { | 851 | if (base == bo->paddr + crtc->primary->fb->offsets[0]) { |
828 | spin_lock_irqsave(&drm->event_lock, flags); | 852 | drm_crtc_send_vblank_event(crtc, dc->event); |
829 | drm_send_vblank_event(drm, dc->pipe, dc->event); | 853 | drm_crtc_vblank_put(crtc); |
830 | drm_vblank_put(drm, dc->pipe); | ||
831 | dc->event = NULL; | 854 | dc->event = NULL; |
832 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
833 | } | 855 | } |
856 | |||
857 | spin_unlock_irqrestore(&drm->event_lock, flags); | ||
834 | } | 858 | } |
835 | 859 | ||
836 | void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | 860 | void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) |
@@ -843,7 +867,7 @@ void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | |||
843 | 867 | ||
844 | if (dc->event && dc->event->base.file_priv == file) { | 868 | if (dc->event && dc->event->base.file_priv == file) { |
845 | dc->event->base.destroy(&dc->event->base); | 869 | dc->event->base.destroy(&dc->event->base); |
846 | drm_vblank_put(drm, dc->pipe); | 870 | drm_crtc_vblank_put(crtc); |
847 | dc->event = NULL; | 871 | dc->event = NULL; |
848 | } | 872 | } |
849 | 873 | ||
@@ -853,16 +877,16 @@ void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file) | |||
853 | static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, | 877 | static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, |
854 | struct drm_pending_vblank_event *event, uint32_t page_flip_flags) | 878 | struct drm_pending_vblank_event *event, uint32_t page_flip_flags) |
855 | { | 879 | { |
880 | unsigned int pipe = drm_crtc_index(crtc); | ||
856 | struct tegra_dc *dc = to_tegra_dc(crtc); | 881 | struct tegra_dc *dc = to_tegra_dc(crtc); |
857 | struct drm_device *drm = crtc->dev; | ||
858 | 882 | ||
859 | if (dc->event) | 883 | if (dc->event) |
860 | return -EBUSY; | 884 | return -EBUSY; |
861 | 885 | ||
862 | if (event) { | 886 | if (event) { |
863 | event->pipe = dc->pipe; | 887 | event->pipe = pipe; |
864 | dc->event = event; | 888 | dc->event = event; |
865 | drm_vblank_get(drm, dc->pipe); | 889 | drm_crtc_vblank_get(crtc); |
866 | } | 890 | } |
867 | 891 | ||
868 | tegra_dc_set_base(dc, 0, 0, fb); | 892 | tegra_dc_set_base(dc, 0, 0, fb); |
@@ -1127,7 +1151,7 @@ static irqreturn_t tegra_dc_irq(int irq, void *data) | |||
1127 | /* | 1151 | /* |
1128 | dev_dbg(dc->dev, "%s(): vertical blank\n", __func__); | 1152 | dev_dbg(dc->dev, "%s(): vertical blank\n", __func__); |
1129 | */ | 1153 | */ |
1130 | drm_handle_vblank(dc->base.dev, dc->pipe); | 1154 | drm_crtc_handle_vblank(&dc->base); |
1131 | tegra_dc_finish_page_flip(dc); | 1155 | tegra_dc_finish_page_flip(dc); |
1132 | } | 1156 | } |
1133 | 1157 | ||
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index e549afeece1f..d4f827593dfa 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c | |||
@@ -694,24 +694,28 @@ static const struct file_operations tegra_drm_fops = { | |||
694 | .llseek = noop_llseek, | 694 | .llseek = noop_llseek, |
695 | }; | 695 | }; |
696 | 696 | ||
697 | static struct drm_crtc *tegra_crtc_from_pipe(struct drm_device *drm, int pipe) | 697 | static struct drm_crtc *tegra_crtc_from_pipe(struct drm_device *drm, |
698 | unsigned int pipe) | ||
698 | { | 699 | { |
699 | struct drm_crtc *crtc; | 700 | struct drm_crtc *crtc; |
700 | 701 | ||
701 | list_for_each_entry(crtc, &drm->mode_config.crtc_list, head) { | 702 | list_for_each_entry(crtc, &drm->mode_config.crtc_list, head) { |
702 | struct tegra_dc *dc = to_tegra_dc(crtc); | 703 | if (pipe == drm_crtc_index(crtc)) |
703 | |||
704 | if (dc->pipe == pipe) | ||
705 | return crtc; | 704 | return crtc; |
706 | } | 705 | } |
707 | 706 | ||
708 | return NULL; | 707 | return NULL; |
709 | } | 708 | } |
710 | 709 | ||
711 | static u32 tegra_drm_get_vblank_counter(struct drm_device *dev, int crtc) | 710 | static u32 tegra_drm_get_vblank_counter(struct drm_device *drm, int pipe) |
712 | { | 711 | { |
712 | struct drm_crtc *crtc = tegra_crtc_from_pipe(drm, pipe); | ||
713 | |||
714 | if (!crtc) | ||
715 | return 0; | ||
716 | |||
713 | /* TODO: implement real hardware counter using syncpoints */ | 717 | /* TODO: implement real hardware counter using syncpoints */ |
714 | return drm_vblank_count(dev, crtc); | 718 | return drm_crtc_vblank_count(crtc); |
715 | } | 719 | } |
716 | 720 | ||
717 | static int tegra_drm_enable_vblank(struct drm_device *drm, int pipe) | 721 | static int tegra_drm_enable_vblank(struct drm_device *drm, int pipe) |
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index da32086cbeaf..8777b7f75791 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c | |||
@@ -216,32 +216,58 @@ static void tegra_bo_free(struct drm_device *drm, struct tegra_bo *bo) | |||
216 | } | 216 | } |
217 | } | 217 | } |
218 | 218 | ||
219 | static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo, | 219 | static int tegra_bo_get_pages(struct drm_device *drm, struct tegra_bo *bo) |
220 | size_t size) | ||
221 | { | 220 | { |
221 | struct scatterlist *s; | ||
222 | struct sg_table *sgt; | ||
223 | unsigned int i; | ||
224 | |||
222 | bo->pages = drm_gem_get_pages(&bo->gem); | 225 | bo->pages = drm_gem_get_pages(&bo->gem); |
223 | if (IS_ERR(bo->pages)) | 226 | if (IS_ERR(bo->pages)) |
224 | return PTR_ERR(bo->pages); | 227 | return PTR_ERR(bo->pages); |
225 | 228 | ||
226 | bo->num_pages = size >> PAGE_SHIFT; | 229 | bo->num_pages = bo->gem.size >> PAGE_SHIFT; |
227 | 230 | ||
228 | bo->sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); | 231 | sgt = drm_prime_pages_to_sg(bo->pages, bo->num_pages); |
229 | if (IS_ERR(bo->sgt)) { | 232 | if (IS_ERR(sgt)) |
230 | drm_gem_put_pages(&bo->gem, bo->pages, false, false); | 233 | goto put_pages; |
231 | return PTR_ERR(bo->sgt); | 234 | |
235 | /* | ||
236 | * Fake up the SG table so that dma_map_sg() can be used to flush the | ||
237 | * pages associated with it. Note that this relies on the fact that | ||
238 | * the DMA API doesn't hook into IOMMU on Tegra, therefore mapping is | ||
239 | * only cache maintenance. | ||
240 | * | ||
241 | * TODO: Replace this by drm_clflash_sg() once it can be implemented | ||
242 | * without relying on symbols that are not exported. | ||
243 | */ | ||
244 | for_each_sg(sgt->sgl, s, sgt->nents, i) | ||
245 | sg_dma_address(s) = sg_phys(s); | ||
246 | |||
247 | if (dma_map_sg(drm->dev, sgt->sgl, sgt->nents, DMA_TO_DEVICE) == 0) { | ||
248 | sgt = ERR_PTR(-ENOMEM); | ||
249 | goto release_sgt; | ||
232 | } | 250 | } |
233 | 251 | ||
252 | bo->sgt = sgt; | ||
253 | |||
234 | return 0; | 254 | return 0; |
255 | |||
256 | release_sgt: | ||
257 | sg_free_table(sgt); | ||
258 | kfree(sgt); | ||
259 | put_pages: | ||
260 | drm_gem_put_pages(&bo->gem, bo->pages, false, false); | ||
261 | return PTR_ERR(sgt); | ||
235 | } | 262 | } |
236 | 263 | ||
237 | static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo, | 264 | static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo) |
238 | size_t size) | ||
239 | { | 265 | { |
240 | struct tegra_drm *tegra = drm->dev_private; | 266 | struct tegra_drm *tegra = drm->dev_private; |
241 | int err; | 267 | int err; |
242 | 268 | ||
243 | if (tegra->domain) { | 269 | if (tegra->domain) { |
244 | err = tegra_bo_get_pages(drm, bo, size); | 270 | err = tegra_bo_get_pages(drm, bo); |
245 | if (err < 0) | 271 | if (err < 0) |
246 | return err; | 272 | return err; |
247 | 273 | ||
@@ -251,6 +277,8 @@ static int tegra_bo_alloc(struct drm_device *drm, struct tegra_bo *bo, | |||
251 | return err; | 277 | return err; |
252 | } | 278 | } |
253 | } else { | 279 | } else { |
280 | size_t size = bo->gem.size; | ||
281 | |||
254 | bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr, | 282 | bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr, |
255 | GFP_KERNEL | __GFP_NOWARN); | 283 | GFP_KERNEL | __GFP_NOWARN); |
256 | if (!bo->vaddr) { | 284 | if (!bo->vaddr) { |
@@ -274,7 +302,7 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, size_t size, | |||
274 | if (IS_ERR(bo)) | 302 | if (IS_ERR(bo)) |
275 | return bo; | 303 | return bo; |
276 | 304 | ||
277 | err = tegra_bo_alloc(drm, bo, size); | 305 | err = tegra_bo_alloc(drm, bo); |
278 | if (err < 0) | 306 | if (err < 0) |
279 | goto release; | 307 | goto release; |
280 | 308 | ||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 91a488c7cc44..31e8308ba899 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -753,6 +753,7 @@ config I2C_SH7760 | |||
753 | 753 | ||
754 | config I2C_SH_MOBILE | 754 | config I2C_SH_MOBILE |
755 | tristate "SuperH Mobile I2C Controller" | 755 | tristate "SuperH Mobile I2C Controller" |
756 | depends on HAS_DMA | ||
756 | depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST | 757 | depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST |
757 | help | 758 | help |
758 | If you say yes to this option, support will be included for the | 759 | If you say yes to this option, support will be included for the |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index 373f6d4e4080..30059c1df2a3 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
@@ -30,12 +30,12 @@ | |||
30 | #define MV64XXX_I2C_BAUD_DIV_N(val) (val & 0x7) | 30 | #define MV64XXX_I2C_BAUD_DIV_N(val) (val & 0x7) |
31 | #define MV64XXX_I2C_BAUD_DIV_M(val) ((val & 0xf) << 3) | 31 | #define MV64XXX_I2C_BAUD_DIV_M(val) ((val & 0xf) << 3) |
32 | 32 | ||
33 | #define MV64XXX_I2C_REG_CONTROL_ACK 0x00000004 | 33 | #define MV64XXX_I2C_REG_CONTROL_ACK BIT(2) |
34 | #define MV64XXX_I2C_REG_CONTROL_IFLG 0x00000008 | 34 | #define MV64XXX_I2C_REG_CONTROL_IFLG BIT(3) |
35 | #define MV64XXX_I2C_REG_CONTROL_STOP 0x00000010 | 35 | #define MV64XXX_I2C_REG_CONTROL_STOP BIT(4) |
36 | #define MV64XXX_I2C_REG_CONTROL_START 0x00000020 | 36 | #define MV64XXX_I2C_REG_CONTROL_START BIT(5) |
37 | #define MV64XXX_I2C_REG_CONTROL_TWSIEN 0x00000040 | 37 | #define MV64XXX_I2C_REG_CONTROL_TWSIEN BIT(6) |
38 | #define MV64XXX_I2C_REG_CONTROL_INTEN 0x00000080 | 38 | #define MV64XXX_I2C_REG_CONTROL_INTEN BIT(7) |
39 | 39 | ||
40 | /* Ctlr status values */ | 40 | /* Ctlr status values */ |
41 | #define MV64XXX_I2C_STATUS_BUS_ERR 0x00 | 41 | #define MV64XXX_I2C_STATUS_BUS_ERR 0x00 |
@@ -68,19 +68,17 @@ | |||
68 | #define MV64XXX_I2C_REG_BRIDGE_TIMING 0xe0 | 68 | #define MV64XXX_I2C_REG_BRIDGE_TIMING 0xe0 |
69 | 69 | ||
70 | /* Bridge Control values */ | 70 | /* Bridge Control values */ |
71 | #define MV64XXX_I2C_BRIDGE_CONTROL_WR 0x00000001 | 71 | #define MV64XXX_I2C_BRIDGE_CONTROL_WR BIT(0) |
72 | #define MV64XXX_I2C_BRIDGE_CONTROL_RD 0x00000002 | 72 | #define MV64XXX_I2C_BRIDGE_CONTROL_RD BIT(1) |
73 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT 2 | 73 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT 2 |
74 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT 0x00001000 | 74 | #define MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT BIT(12) |
75 | #define MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT 13 | 75 | #define MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT 13 |
76 | #define MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT 16 | 76 | #define MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT 16 |
77 | #define MV64XXX_I2C_BRIDGE_CONTROL_ENABLE 0x00080000 | 77 | #define MV64XXX_I2C_BRIDGE_CONTROL_ENABLE BIT(19) |
78 | #define MV64XXX_I2C_BRIDGE_CONTROL_REPEATED_START BIT(20) | ||
78 | 79 | ||
79 | /* Bridge Status values */ | 80 | /* Bridge Status values */ |
80 | #define MV64XXX_I2C_BRIDGE_STATUS_ERROR 0x00000001 | 81 | #define MV64XXX_I2C_BRIDGE_STATUS_ERROR BIT(0) |
81 | #define MV64XXX_I2C_STATUS_OFFLOAD_ERROR 0xf0000001 | ||
82 | #define MV64XXX_I2C_STATUS_OFFLOAD_OK 0xf0000000 | ||
83 | |||
84 | 82 | ||
85 | /* Driver states */ | 83 | /* Driver states */ |
86 | enum { | 84 | enum { |
@@ -99,14 +97,12 @@ enum { | |||
99 | MV64XXX_I2C_ACTION_INVALID, | 97 | MV64XXX_I2C_ACTION_INVALID, |
100 | MV64XXX_I2C_ACTION_CONTINUE, | 98 | MV64XXX_I2C_ACTION_CONTINUE, |
101 | MV64XXX_I2C_ACTION_SEND_RESTART, | 99 | MV64XXX_I2C_ACTION_SEND_RESTART, |
102 | MV64XXX_I2C_ACTION_OFFLOAD_RESTART, | ||
103 | MV64XXX_I2C_ACTION_SEND_ADDR_1, | 100 | MV64XXX_I2C_ACTION_SEND_ADDR_1, |
104 | MV64XXX_I2C_ACTION_SEND_ADDR_2, | 101 | MV64XXX_I2C_ACTION_SEND_ADDR_2, |
105 | MV64XXX_I2C_ACTION_SEND_DATA, | 102 | MV64XXX_I2C_ACTION_SEND_DATA, |
106 | MV64XXX_I2C_ACTION_RCV_DATA, | 103 | MV64XXX_I2C_ACTION_RCV_DATA, |
107 | MV64XXX_I2C_ACTION_RCV_DATA_STOP, | 104 | MV64XXX_I2C_ACTION_RCV_DATA_STOP, |
108 | MV64XXX_I2C_ACTION_SEND_STOP, | 105 | MV64XXX_I2C_ACTION_SEND_STOP, |
109 | MV64XXX_I2C_ACTION_OFFLOAD_SEND_STOP, | ||
110 | }; | 106 | }; |
111 | 107 | ||
112 | struct mv64xxx_i2c_regs { | 108 | struct mv64xxx_i2c_regs { |
@@ -193,75 +189,6 @@ mv64xxx_i2c_prepare_for_io(struct mv64xxx_i2c_data *drv_data, | |||
193 | } | 189 | } |
194 | } | 190 | } |
195 | 191 | ||
196 | static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data) | ||
197 | { | ||
198 | unsigned long data_reg_hi = 0; | ||
199 | unsigned long data_reg_lo = 0; | ||
200 | unsigned long ctrl_reg; | ||
201 | struct i2c_msg *msg = drv_data->msgs; | ||
202 | |||
203 | if (!drv_data->offload_enabled) | ||
204 | return -EOPNOTSUPP; | ||
205 | |||
206 | /* Only regular transactions can be offloaded */ | ||
207 | if ((msg->flags & ~(I2C_M_TEN | I2C_M_RD)) != 0) | ||
208 | return -EINVAL; | ||
209 | |||
210 | /* Only 1-8 byte transfers can be offloaded */ | ||
211 | if (msg->len < 1 || msg->len > 8) | ||
212 | return -EINVAL; | ||
213 | |||
214 | /* Build transaction */ | ||
215 | ctrl_reg = MV64XXX_I2C_BRIDGE_CONTROL_ENABLE | | ||
216 | (msg->addr << MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT); | ||
217 | |||
218 | if ((msg->flags & I2C_M_TEN) != 0) | ||
219 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT; | ||
220 | |||
221 | if ((msg->flags & I2C_M_RD) == 0) { | ||
222 | u8 local_buf[8] = { 0 }; | ||
223 | |||
224 | memcpy(local_buf, msg->buf, msg->len); | ||
225 | data_reg_lo = cpu_to_le32(*((u32 *)local_buf)); | ||
226 | data_reg_hi = cpu_to_le32(*((u32 *)(local_buf+4))); | ||
227 | |||
228 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR | | ||
229 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT; | ||
230 | |||
231 | writel(data_reg_lo, | ||
232 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); | ||
233 | writel(data_reg_hi, | ||
234 | drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI); | ||
235 | |||
236 | } else { | ||
237 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_RD | | ||
238 | (msg->len - 1) << MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT; | ||
239 | } | ||
240 | |||
241 | /* Execute transaction */ | ||
242 | writel(ctrl_reg, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static void | ||
248 | mv64xxx_i2c_update_offload_data(struct mv64xxx_i2c_data *drv_data) | ||
249 | { | ||
250 | struct i2c_msg *msg = drv_data->msg; | ||
251 | |||
252 | if (msg->flags & I2C_M_RD) { | ||
253 | u32 data_reg_lo = readl(drv_data->reg_base + | ||
254 | MV64XXX_I2C_REG_RX_DATA_LO); | ||
255 | u32 data_reg_hi = readl(drv_data->reg_base + | ||
256 | MV64XXX_I2C_REG_RX_DATA_HI); | ||
257 | u8 local_buf[8] = { 0 }; | ||
258 | |||
259 | *((u32 *)local_buf) = le32_to_cpu(data_reg_lo); | ||
260 | *((u32 *)(local_buf+4)) = le32_to_cpu(data_reg_hi); | ||
261 | memcpy(msg->buf, local_buf, msg->len); | ||
262 | } | ||
263 | |||
264 | } | ||
265 | /* | 192 | /* |
266 | ***************************************************************************** | 193 | ***************************************************************************** |
267 | * | 194 | * |
@@ -389,16 +316,6 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status) | |||
389 | drv_data->rc = -ENXIO; | 316 | drv_data->rc = -ENXIO; |
390 | break; | 317 | break; |
391 | 318 | ||
392 | case MV64XXX_I2C_STATUS_OFFLOAD_OK: | ||
393 | if (drv_data->send_stop || drv_data->aborting) { | ||
394 | drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_SEND_STOP; | ||
395 | drv_data->state = MV64XXX_I2C_STATE_IDLE; | ||
396 | } else { | ||
397 | drv_data->action = MV64XXX_I2C_ACTION_OFFLOAD_RESTART; | ||
398 | drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_RESTART; | ||
399 | } | ||
400 | break; | ||
401 | |||
402 | default: | 319 | default: |
403 | dev_err(&drv_data->adapter.dev, | 320 | dev_err(&drv_data->adapter.dev, |
404 | "mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, " | 321 | "mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, " |
@@ -419,25 +336,15 @@ static void mv64xxx_i2c_send_start(struct mv64xxx_i2c_data *drv_data) | |||
419 | drv_data->aborting = 0; | 336 | drv_data->aborting = 0; |
420 | drv_data->rc = 0; | 337 | drv_data->rc = 0; |
421 | 338 | ||
422 | /* Can we offload this msg ? */ | 339 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); |
423 | if (mv64xxx_i2c_offload_msg(drv_data) < 0) { | 340 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, |
424 | /* No, switch to standard path */ | 341 | drv_data->reg_base + drv_data->reg_offsets.control); |
425 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); | ||
426 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, | ||
427 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
428 | } | ||
429 | } | 342 | } |
430 | 343 | ||
431 | static void | 344 | static void |
432 | mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | 345 | mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) |
433 | { | 346 | { |
434 | switch(drv_data->action) { | 347 | switch(drv_data->action) { |
435 | case MV64XXX_I2C_ACTION_OFFLOAD_RESTART: | ||
436 | mv64xxx_i2c_update_offload_data(drv_data); | ||
437 | writel(0, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | ||
438 | writel(0, drv_data->reg_base + | ||
439 | MV64XXX_I2C_REG_BRIDGE_INTR_CAUSE); | ||
440 | /* FALLTHRU */ | ||
441 | case MV64XXX_I2C_ACTION_SEND_RESTART: | 348 | case MV64XXX_I2C_ACTION_SEND_RESTART: |
442 | /* We should only get here if we have further messages */ | 349 | /* We should only get here if we have further messages */ |
443 | BUG_ON(drv_data->num_msgs == 0); | 350 | BUG_ON(drv_data->num_msgs == 0); |
@@ -518,16 +425,71 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | |||
518 | drv_data->block = 0; | 425 | drv_data->block = 0; |
519 | wake_up(&drv_data->waitq); | 426 | wake_up(&drv_data->waitq); |
520 | break; | 427 | break; |
428 | } | ||
429 | } | ||
521 | 430 | ||
522 | case MV64XXX_I2C_ACTION_OFFLOAD_SEND_STOP: | 431 | static void |
523 | mv64xxx_i2c_update_offload_data(drv_data); | 432 | mv64xxx_i2c_read_offload_rx_data(struct mv64xxx_i2c_data *drv_data, |
524 | writel(0, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | 433 | struct i2c_msg *msg) |
525 | writel(0, drv_data->reg_base + | 434 | { |
526 | MV64XXX_I2C_REG_BRIDGE_INTR_CAUSE); | 435 | u32 buf[2]; |
527 | drv_data->block = 0; | 436 | |
528 | wake_up(&drv_data->waitq); | 437 | buf[0] = readl(drv_data->reg_base + MV64XXX_I2C_REG_RX_DATA_LO); |
529 | break; | 438 | buf[1] = readl(drv_data->reg_base + MV64XXX_I2C_REG_RX_DATA_HI); |
439 | |||
440 | memcpy(msg->buf, buf, msg->len); | ||
441 | } | ||
442 | |||
443 | static int | ||
444 | mv64xxx_i2c_intr_offload(struct mv64xxx_i2c_data *drv_data) | ||
445 | { | ||
446 | u32 cause, status; | ||
447 | |||
448 | cause = readl(drv_data->reg_base + | ||
449 | MV64XXX_I2C_REG_BRIDGE_INTR_CAUSE); | ||
450 | if (!cause) | ||
451 | return IRQ_NONE; | ||
452 | |||
453 | status = readl(drv_data->reg_base + | ||
454 | MV64XXX_I2C_REG_BRIDGE_STATUS); | ||
455 | |||
456 | if (status & MV64XXX_I2C_BRIDGE_STATUS_ERROR) { | ||
457 | drv_data->rc = -EIO; | ||
458 | goto out; | ||
459 | } | ||
460 | |||
461 | drv_data->rc = 0; | ||
462 | |||
463 | /* | ||
464 | * Transaction is a one message read transaction, read data | ||
465 | * for this message. | ||
466 | */ | ||
467 | if (drv_data->num_msgs == 1 && drv_data->msgs[0].flags & I2C_M_RD) { | ||
468 | mv64xxx_i2c_read_offload_rx_data(drv_data, drv_data->msgs); | ||
469 | drv_data->msgs++; | ||
470 | drv_data->num_msgs--; | ||
471 | } | ||
472 | /* | ||
473 | * Transaction is a two messages write/read transaction, read | ||
474 | * data for the second (read) message. | ||
475 | */ | ||
476 | else if (drv_data->num_msgs == 2 && | ||
477 | !(drv_data->msgs[0].flags & I2C_M_RD) && | ||
478 | drv_data->msgs[1].flags & I2C_M_RD) { | ||
479 | mv64xxx_i2c_read_offload_rx_data(drv_data, drv_data->msgs + 1); | ||
480 | drv_data->msgs += 2; | ||
481 | drv_data->num_msgs -= 2; | ||
530 | } | 482 | } |
483 | |||
484 | out: | ||
485 | writel(0, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | ||
486 | writel(0, drv_data->reg_base + | ||
487 | MV64XXX_I2C_REG_BRIDGE_INTR_CAUSE); | ||
488 | drv_data->block = 0; | ||
489 | |||
490 | wake_up(&drv_data->waitq); | ||
491 | |||
492 | return IRQ_HANDLED; | ||
531 | } | 493 | } |
532 | 494 | ||
533 | static irqreturn_t | 495 | static irqreturn_t |
@@ -540,20 +502,9 @@ mv64xxx_i2c_intr(int irq, void *dev_id) | |||
540 | 502 | ||
541 | spin_lock_irqsave(&drv_data->lock, flags); | 503 | spin_lock_irqsave(&drv_data->lock, flags); |
542 | 504 | ||
543 | if (drv_data->offload_enabled) { | 505 | if (drv_data->offload_enabled) |
544 | while (readl(drv_data->reg_base + | 506 | rc = mv64xxx_i2c_intr_offload(drv_data); |
545 | MV64XXX_I2C_REG_BRIDGE_INTR_CAUSE)) { | 507 | |
546 | int reg_status = readl(drv_data->reg_base + | ||
547 | MV64XXX_I2C_REG_BRIDGE_STATUS); | ||
548 | if (reg_status & MV64XXX_I2C_BRIDGE_STATUS_ERROR) | ||
549 | status = MV64XXX_I2C_STATUS_OFFLOAD_ERROR; | ||
550 | else | ||
551 | status = MV64XXX_I2C_STATUS_OFFLOAD_OK; | ||
552 | mv64xxx_i2c_fsm(drv_data, status); | ||
553 | mv64xxx_i2c_do_action(drv_data); | ||
554 | rc = IRQ_HANDLED; | ||
555 | } | ||
556 | } | ||
557 | while (readl(drv_data->reg_base + drv_data->reg_offsets.control) & | 508 | while (readl(drv_data->reg_base + drv_data->reg_offsets.control) & |
558 | MV64XXX_I2C_REG_CONTROL_IFLG) { | 509 | MV64XXX_I2C_REG_CONTROL_IFLG) { |
559 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); | 510 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); |
@@ -635,6 +586,117 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg, | |||
635 | return drv_data->rc; | 586 | return drv_data->rc; |
636 | } | 587 | } |
637 | 588 | ||
589 | static void | ||
590 | mv64xxx_i2c_prepare_tx(struct mv64xxx_i2c_data *drv_data) | ||
591 | { | ||
592 | struct i2c_msg *msg = drv_data->msgs; | ||
593 | u32 buf[2]; | ||
594 | |||
595 | memcpy(buf, msg->buf, msg->len); | ||
596 | |||
597 | writel(buf[0], drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_LO); | ||
598 | writel(buf[1], drv_data->reg_base + MV64XXX_I2C_REG_TX_DATA_HI); | ||
599 | } | ||
600 | |||
601 | static int | ||
602 | mv64xxx_i2c_offload_xfer(struct mv64xxx_i2c_data *drv_data) | ||
603 | { | ||
604 | struct i2c_msg *msgs = drv_data->msgs; | ||
605 | int num = drv_data->num_msgs; | ||
606 | unsigned long ctrl_reg; | ||
607 | unsigned long flags; | ||
608 | |||
609 | spin_lock_irqsave(&drv_data->lock, flags); | ||
610 | |||
611 | /* Build transaction */ | ||
612 | ctrl_reg = MV64XXX_I2C_BRIDGE_CONTROL_ENABLE | | ||
613 | (msgs[0].addr << MV64XXX_I2C_BRIDGE_CONTROL_ADDR_SHIFT); | ||
614 | |||
615 | if (msgs[0].flags & I2C_M_TEN) | ||
616 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_ADDR_EXT; | ||
617 | |||
618 | /* Single write message transaction */ | ||
619 | if (num == 1 && !(msgs[0].flags & I2C_M_RD)) { | ||
620 | size_t len = msgs[0].len - 1; | ||
621 | |||
622 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_WR | | ||
623 | (len << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT); | ||
624 | mv64xxx_i2c_prepare_tx(drv_data); | ||
625 | } | ||
626 | /* Single read message transaction */ | ||
627 | else if (num == 1 && msgs[0].flags & I2C_M_RD) { | ||
628 | size_t len = msgs[0].len - 1; | ||
629 | |||
630 | ctrl_reg |= MV64XXX_I2C_BRIDGE_CONTROL_RD | | ||
631 | (len << MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT); | ||
632 | } | ||
633 | /* | ||
634 | * Transaction with one write and one read message. This is | ||
635 | * guaranteed by the mv64xx_i2c_can_offload() checks. | ||
636 | */ | ||
637 | else if (num == 2) { | ||
638 | size_t lentx = msgs[0].len - 1; | ||
639 | size_t lenrx = msgs[1].len - 1; | ||
640 | |||
641 | ctrl_reg |= | ||
642 | MV64XXX_I2C_BRIDGE_CONTROL_RD | | ||
643 | MV64XXX_I2C_BRIDGE_CONTROL_WR | | ||
644 | (lentx << MV64XXX_I2C_BRIDGE_CONTROL_TX_SIZE_SHIFT) | | ||
645 | (lenrx << MV64XXX_I2C_BRIDGE_CONTROL_RX_SIZE_SHIFT) | | ||
646 | MV64XXX_I2C_BRIDGE_CONTROL_REPEATED_START; | ||
647 | mv64xxx_i2c_prepare_tx(drv_data); | ||
648 | } | ||
649 | |||
650 | /* Execute transaction */ | ||
651 | drv_data->block = 1; | ||
652 | writel(ctrl_reg, drv_data->reg_base + MV64XXX_I2C_REG_BRIDGE_CONTROL); | ||
653 | spin_unlock_irqrestore(&drv_data->lock, flags); | ||
654 | |||
655 | mv64xxx_i2c_wait_for_completion(drv_data); | ||
656 | |||
657 | return drv_data->rc; | ||
658 | } | ||
659 | |||
660 | static bool | ||
661 | mv64xxx_i2c_valid_offload_sz(struct i2c_msg *msg) | ||
662 | { | ||
663 | return msg->len <= 8 && msg->len >= 1; | ||
664 | } | ||
665 | |||
666 | static bool | ||
667 | mv64xxx_i2c_can_offload(struct mv64xxx_i2c_data *drv_data) | ||
668 | { | ||
669 | struct i2c_msg *msgs = drv_data->msgs; | ||
670 | int num = drv_data->num_msgs; | ||
671 | |||
672 | return false; | ||
673 | |||
674 | if (!drv_data->offload_enabled) | ||
675 | return false; | ||
676 | |||
677 | /* | ||
678 | * We can offload a transaction consisting of a single | ||
679 | * message, as long as the message has a length between 1 and | ||
680 | * 8 bytes. | ||
681 | */ | ||
682 | if (num == 1 && mv64xxx_i2c_valid_offload_sz(msgs)) | ||
683 | return true; | ||
684 | |||
685 | /* | ||
686 | * We can offload a transaction consisting of two messages, if | ||
687 | * the first is a write and a second is a read, and both have | ||
688 | * a length between 1 and 8 bytes. | ||
689 | */ | ||
690 | if (num == 2 && | ||
691 | mv64xxx_i2c_valid_offload_sz(msgs) && | ||
692 | mv64xxx_i2c_valid_offload_sz(msgs + 1) && | ||
693 | !(msgs[0].flags & I2C_M_RD) && | ||
694 | msgs[1].flags & I2C_M_RD) | ||
695 | return true; | ||
696 | |||
697 | return false; | ||
698 | } | ||
699 | |||
638 | /* | 700 | /* |
639 | ***************************************************************************** | 701 | ***************************************************************************** |
640 | * | 702 | * |
@@ -658,7 +720,11 @@ mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
658 | drv_data->msgs = msgs; | 720 | drv_data->msgs = msgs; |
659 | drv_data->num_msgs = num; | 721 | drv_data->num_msgs = num; |
660 | 722 | ||
661 | rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[0], num == 1); | 723 | if (mv64xxx_i2c_can_offload(drv_data)) |
724 | rc = mv64xxx_i2c_offload_xfer(drv_data); | ||
725 | else | ||
726 | rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[0], num == 1); | ||
727 | |||
662 | if (rc < 0) | 728 | if (rc < 0) |
663 | ret = rc; | 729 | ret = rc; |
664 | 730 | ||
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index d7efaf44868b..440d5dbc8b5f 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -140,6 +140,7 @@ struct sh_mobile_i2c_data { | |||
140 | int sr; | 140 | int sr; |
141 | bool send_stop; | 141 | bool send_stop; |
142 | 142 | ||
143 | struct resource *res; | ||
143 | struct dma_chan *dma_tx; | 144 | struct dma_chan *dma_tx; |
144 | struct dma_chan *dma_rx; | 145 | struct dma_chan *dma_rx; |
145 | struct scatterlist sg; | 146 | struct scatterlist sg; |
@@ -539,6 +540,42 @@ static void sh_mobile_i2c_dma_callback(void *data) | |||
539 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); | 540 | iic_set_clr(pd, ICIC, 0, ICIC_TDMAE | ICIC_RDMAE); |
540 | } | 541 | } |
541 | 542 | ||
543 | static struct dma_chan *sh_mobile_i2c_request_dma_chan(struct device *dev, | ||
544 | enum dma_transfer_direction dir, dma_addr_t port_addr) | ||
545 | { | ||
546 | struct dma_chan *chan; | ||
547 | struct dma_slave_config cfg; | ||
548 | char *chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx"; | ||
549 | int ret; | ||
550 | |||
551 | chan = dma_request_slave_channel_reason(dev, chan_name); | ||
552 | if (IS_ERR(chan)) { | ||
553 | ret = PTR_ERR(chan); | ||
554 | dev_dbg(dev, "request_channel failed for %s (%d)\n", chan_name, ret); | ||
555 | return chan; | ||
556 | } | ||
557 | |||
558 | memset(&cfg, 0, sizeof(cfg)); | ||
559 | cfg.direction = dir; | ||
560 | if (dir == DMA_MEM_TO_DEV) { | ||
561 | cfg.dst_addr = port_addr; | ||
562 | cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | ||
563 | } else { | ||
564 | cfg.src_addr = port_addr; | ||
565 | cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | ||
566 | } | ||
567 | |||
568 | ret = dmaengine_slave_config(chan, &cfg); | ||
569 | if (ret) { | ||
570 | dev_dbg(dev, "slave_config failed for %s (%d)\n", chan_name, ret); | ||
571 | dma_release_channel(chan); | ||
572 | return ERR_PTR(ret); | ||
573 | } | ||
574 | |||
575 | dev_dbg(dev, "got DMA channel for %s\n", chan_name); | ||
576 | return chan; | ||
577 | } | ||
578 | |||
542 | static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd) | 579 | static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd) |
543 | { | 580 | { |
544 | bool read = pd->msg->flags & I2C_M_RD; | 581 | bool read = pd->msg->flags & I2C_M_RD; |
@@ -548,7 +585,16 @@ static void sh_mobile_i2c_xfer_dma(struct sh_mobile_i2c_data *pd) | |||
548 | dma_addr_t dma_addr; | 585 | dma_addr_t dma_addr; |
549 | dma_cookie_t cookie; | 586 | dma_cookie_t cookie; |
550 | 587 | ||
551 | if (!chan) | 588 | if (PTR_ERR(chan) == -EPROBE_DEFER) { |
589 | if (read) | ||
590 | chan = pd->dma_rx = sh_mobile_i2c_request_dma_chan(pd->dev, DMA_DEV_TO_MEM, | ||
591 | pd->res->start + ICDR); | ||
592 | else | ||
593 | chan = pd->dma_tx = sh_mobile_i2c_request_dma_chan(pd->dev, DMA_MEM_TO_DEV, | ||
594 | pd->res->start + ICDR); | ||
595 | } | ||
596 | |||
597 | if (IS_ERR(chan)) | ||
552 | return; | 598 | return; |
553 | 599 | ||
554 | dma_addr = dma_map_single(chan->device->dev, pd->msg->buf, pd->msg->len, dir); | 600 | dma_addr = dma_map_single(chan->device->dev, pd->msg->buf, pd->msg->len, dir); |
@@ -747,56 +793,16 @@ static const struct of_device_id sh_mobile_i2c_dt_ids[] = { | |||
747 | }; | 793 | }; |
748 | MODULE_DEVICE_TABLE(of, sh_mobile_i2c_dt_ids); | 794 | MODULE_DEVICE_TABLE(of, sh_mobile_i2c_dt_ids); |
749 | 795 | ||
750 | static int sh_mobile_i2c_request_dma_chan(struct device *dev, enum dma_transfer_direction dir, | ||
751 | dma_addr_t port_addr, struct dma_chan **chan_ptr) | ||
752 | { | ||
753 | struct dma_chan *chan; | ||
754 | struct dma_slave_config cfg; | ||
755 | char *chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx"; | ||
756 | int ret; | ||
757 | |||
758 | *chan_ptr = NULL; | ||
759 | |||
760 | chan = dma_request_slave_channel_reason(dev, chan_name); | ||
761 | if (IS_ERR(chan)) { | ||
762 | ret = PTR_ERR(chan); | ||
763 | dev_dbg(dev, "request_channel failed for %s (%d)\n", chan_name, ret); | ||
764 | return ret; | ||
765 | } | ||
766 | |||
767 | memset(&cfg, 0, sizeof(cfg)); | ||
768 | cfg.direction = dir; | ||
769 | if (dir == DMA_MEM_TO_DEV) { | ||
770 | cfg.dst_addr = port_addr; | ||
771 | cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | ||
772 | } else { | ||
773 | cfg.src_addr = port_addr; | ||
774 | cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; | ||
775 | } | ||
776 | |||
777 | ret = dmaengine_slave_config(chan, &cfg); | ||
778 | if (ret) { | ||
779 | dev_dbg(dev, "slave_config failed for %s (%d)\n", chan_name, ret); | ||
780 | dma_release_channel(chan); | ||
781 | return ret; | ||
782 | } | ||
783 | |||
784 | *chan_ptr = chan; | ||
785 | |||
786 | dev_dbg(dev, "got DMA channel for %s\n", chan_name); | ||
787 | return 0; | ||
788 | } | ||
789 | |||
790 | static void sh_mobile_i2c_release_dma(struct sh_mobile_i2c_data *pd) | 796 | static void sh_mobile_i2c_release_dma(struct sh_mobile_i2c_data *pd) |
791 | { | 797 | { |
792 | if (pd->dma_tx) { | 798 | if (!IS_ERR(pd->dma_tx)) { |
793 | dma_release_channel(pd->dma_tx); | 799 | dma_release_channel(pd->dma_tx); |
794 | pd->dma_tx = NULL; | 800 | pd->dma_tx = ERR_PTR(-EPROBE_DEFER); |
795 | } | 801 | } |
796 | 802 | ||
797 | if (pd->dma_rx) { | 803 | if (!IS_ERR(pd->dma_rx)) { |
798 | dma_release_channel(pd->dma_rx); | 804 | dma_release_channel(pd->dma_rx); |
799 | pd->dma_rx = NULL; | 805 | pd->dma_rx = ERR_PTR(-EPROBE_DEFER); |
800 | } | 806 | } |
801 | } | 807 | } |
802 | 808 | ||
@@ -849,6 +855,7 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
849 | 855 | ||
850 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | 856 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); |
851 | 857 | ||
858 | pd->res = res; | ||
852 | pd->reg = devm_ioremap_resource(&dev->dev, res); | 859 | pd->reg = devm_ioremap_resource(&dev->dev, res); |
853 | if (IS_ERR(pd->reg)) | 860 | if (IS_ERR(pd->reg)) |
854 | return PTR_ERR(pd->reg); | 861 | return PTR_ERR(pd->reg); |
@@ -889,17 +896,7 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
889 | /* Init DMA */ | 896 | /* Init DMA */ |
890 | sg_init_table(&pd->sg, 1); | 897 | sg_init_table(&pd->sg, 1); |
891 | pd->dma_direction = DMA_NONE; | 898 | pd->dma_direction = DMA_NONE; |
892 | ret = sh_mobile_i2c_request_dma_chan(pd->dev, DMA_DEV_TO_MEM, | 899 | pd->dma_rx = pd->dma_tx = ERR_PTR(-EPROBE_DEFER); |
893 | res->start + ICDR, &pd->dma_rx); | ||
894 | if (ret == -EPROBE_DEFER) | ||
895 | return ret; | ||
896 | |||
897 | ret = sh_mobile_i2c_request_dma_chan(pd->dev, DMA_MEM_TO_DEV, | ||
898 | res->start + ICDR, &pd->dma_tx); | ||
899 | if (ret == -EPROBE_DEFER) { | ||
900 | sh_mobile_i2c_release_dma(pd); | ||
901 | return ret; | ||
902 | } | ||
903 | 900 | ||
904 | /* Enable Runtime PM for this device. | 901 | /* Enable Runtime PM for this device. |
905 | * | 902 | * |
@@ -937,8 +934,7 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
937 | return ret; | 934 | return ret; |
938 | } | 935 | } |
939 | 936 | ||
940 | dev_info(&dev->dev, "I2C adapter %d, bus speed %lu Hz, DMA=%c\n", | 937 | dev_info(&dev->dev, "I2C adapter %d, bus speed %lu Hz\n", adap->nr, pd->bus_speed); |
941 | adap->nr, pd->bus_speed, (pd->dma_rx || pd->dma_tx) ? 'y' : 'n'); | ||
942 | 938 | ||
943 | return 0; | 939 | return 0; |
944 | } | 940 | } |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index db3c8c851af1..0747c0595a9d 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -2740,7 +2740,6 @@ static struct scsi_host_template srp_template = { | |||
2740 | .info = srp_target_info, | 2740 | .info = srp_target_info, |
2741 | .queuecommand = srp_queuecommand, | 2741 | .queuecommand = srp_queuecommand, |
2742 | .change_queue_depth = srp_change_queue_depth, | 2742 | .change_queue_depth = srp_change_queue_depth, |
2743 | .change_queue_type = scsi_change_queue_type, | ||
2744 | .eh_abort_handler = srp_abort, | 2743 | .eh_abort_handler = srp_abort, |
2745 | .eh_device_reset_handler = srp_reset_device, | 2744 | .eh_device_reset_handler = srp_reset_device, |
2746 | .eh_host_reset_handler = srp_reset_host, | 2745 | .eh_host_reset_handler = srp_reset_host, |
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index dc829682701a..eb694ddad79f 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | |||
@@ -1708,17 +1708,17 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch, | |||
1708 | 1708 | ||
1709 | switch (srp_cmd->task_attr) { | 1709 | switch (srp_cmd->task_attr) { |
1710 | case SRP_CMD_SIMPLE_Q: | 1710 | case SRP_CMD_SIMPLE_Q: |
1711 | cmd->sam_task_attr = MSG_SIMPLE_TAG; | 1711 | cmd->sam_task_attr = TCM_SIMPLE_TAG; |
1712 | break; | 1712 | break; |
1713 | case SRP_CMD_ORDERED_Q: | 1713 | case SRP_CMD_ORDERED_Q: |
1714 | default: | 1714 | default: |
1715 | cmd->sam_task_attr = MSG_ORDERED_TAG; | 1715 | cmd->sam_task_attr = TCM_ORDERED_TAG; |
1716 | break; | 1716 | break; |
1717 | case SRP_CMD_HEAD_OF_Q: | 1717 | case SRP_CMD_HEAD_OF_Q: |
1718 | cmd->sam_task_attr = MSG_HEAD_TAG; | 1718 | cmd->sam_task_attr = TCM_HEAD_TAG; |
1719 | break; | 1719 | break; |
1720 | case SRP_CMD_ACA: | 1720 | case SRP_CMD_ACA: |
1721 | cmd->sam_task_attr = MSG_ACA_TAG; | 1721 | cmd->sam_task_attr = TCM_ACA_TAG; |
1722 | break; | 1722 | break; |
1723 | } | 1723 | } |
1724 | 1724 | ||
@@ -1733,7 +1733,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch, | |||
1733 | sizeof(srp_cmd->lun)); | 1733 | sizeof(srp_cmd->lun)); |
1734 | rc = target_submit_cmd(cmd, ch->sess, srp_cmd->cdb, | 1734 | rc = target_submit_cmd(cmd, ch->sess, srp_cmd->cdb, |
1735 | &send_ioctx->sense_data[0], unpacked_lun, data_len, | 1735 | &send_ioctx->sense_data[0], unpacked_lun, data_len, |
1736 | MSG_SIMPLE_TAG, dir, TARGET_SCF_ACK_KREF); | 1736 | TCM_SIMPLE_TAG, dir, TARGET_SCF_ACK_KREF); |
1737 | if (rc != 0) { | 1737 | if (rc != 0) { |
1738 | ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 1738 | ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
1739 | goto send_sense; | 1739 | goto send_sense; |
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index 3067d56b11a6..5844b80bd90e 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -204,16 +204,6 @@ config THERM_ADT746X | |||
204 | iBook G4, and the ATI based aluminium PowerBooks, allowing slightly | 204 | iBook G4, and the ATI based aluminium PowerBooks, allowing slightly |
205 | better fan behaviour by default, and some manual control. | 205 | better fan behaviour by default, and some manual control. |
206 | 206 | ||
207 | config THERM_PM72 | ||
208 | tristate "Support for thermal management on PowerMac G5 (AGP)" | ||
209 | depends on I2C && I2C_POWERMAC && PPC_PMAC64 | ||
210 | default n | ||
211 | help | ||
212 | This driver provides thermostat and fan control for the desktop | ||
213 | G5 machines. | ||
214 | |||
215 | This is deprecated, use windfarm instead. | ||
216 | |||
217 | config WINDFARM | 207 | config WINDFARM |
218 | tristate "New PowerMac thermal control infrastructure" | 208 | tristate "New PowerMac thermal control infrastructure" |
219 | depends on PPC | 209 | depends on PPC |
diff --git a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile index d2f0120bc878..383ba920085b 100644 --- a/drivers/macintosh/Makefile +++ b/drivers/macintosh/Makefile | |||
@@ -25,7 +25,6 @@ obj-$(CONFIG_ADB_IOP) += adb-iop.o | |||
25 | obj-$(CONFIG_ADB_PMU68K) += via-pmu68k.o | 25 | obj-$(CONFIG_ADB_PMU68K) += via-pmu68k.o |
26 | obj-$(CONFIG_ADB_MACIO) += macio-adb.o | 26 | obj-$(CONFIG_ADB_MACIO) += macio-adb.o |
27 | 27 | ||
28 | obj-$(CONFIG_THERM_PM72) += therm_pm72.o | ||
29 | obj-$(CONFIG_THERM_WINDTUNNEL) += therm_windtunnel.o | 28 | obj-$(CONFIG_THERM_WINDTUNNEL) += therm_windtunnel.o |
30 | obj-$(CONFIG_THERM_ADT746X) += therm_adt746x.o | 29 | obj-$(CONFIG_THERM_ADT746X) += therm_adt746x.o |
31 | obj-$(CONFIG_WINDFARM) += windfarm_core.o | 30 | obj-$(CONFIG_WINDFARM) += windfarm_core.o |
diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c deleted file mode 100644 index 7ed92582d2cf..000000000000 --- a/drivers/macintosh/therm_pm72.c +++ /dev/null | |||
@@ -1,2278 +0,0 @@ | |||
1 | /* | ||
2 | * Device driver for the thermostats & fan controller of the | ||
3 | * Apple G5 "PowerMac7,2" desktop machines. | ||
4 | * | ||
5 | * (c) Copyright IBM Corp. 2003-2004 | ||
6 | * | ||
7 | * Maintained by: Benjamin Herrenschmidt | ||
8 | * <benh@kernel.crashing.org> | ||
9 | * | ||
10 | * | ||
11 | * The algorithm used is the PID control algorithm, used the same | ||
12 | * way the published Darwin code does, using the same values that | ||
13 | * are present in the Darwin 7.0 snapshot property lists. | ||
14 | * | ||
15 | * As far as the CPUs control loops are concerned, I use the | ||
16 | * calibration & PID constants provided by the EEPROM, | ||
17 | * I do _not_ embed any value from the property lists, as the ones | ||
18 | * provided by Darwin 7.0 seem to always have an older version that | ||
19 | * what I've seen on the actual computers. | ||
20 | * It would be interesting to verify that though. Darwin has a | ||
21 | * version code of 1.0.0d11 for all control loops it seems, while | ||
22 | * so far, the machines EEPROMs contain a dataset versioned 1.0.0f | ||
23 | * | ||
24 | * Darwin doesn't provide source to all parts, some missing | ||
25 | * bits like the AppleFCU driver or the actual scale of some | ||
26 | * of the values returned by sensors had to be "guessed" some | ||
27 | * way... or based on what Open Firmware does. | ||
28 | * | ||
29 | * I didn't yet figure out how to get the slots power consumption | ||
30 | * out of the FCU, so that part has not been implemented yet and | ||
31 | * the slots fan is set to a fixed 50% PWM, hoping this value is | ||
32 | * safe enough ... | ||
33 | * | ||
34 | * Note: I have observed strange oscillations of the CPU control | ||
35 | * loop on a dual G5 here. When idle, the CPU exhaust fan tend to | ||
36 | * oscillates slowly (over several minutes) between the minimum | ||
37 | * of 300RPMs and approx. 1000 RPMs. I don't know what is causing | ||
38 | * this, it could be some incorrect constant or an error in the | ||
39 | * way I ported the algorithm, or it could be just normal. I | ||
40 | * don't have full understanding on the way Apple tweaked the PID | ||
41 | * algorithm for the CPU control, it is definitely not a standard | ||
42 | * implementation... | ||
43 | * | ||
44 | * TODO: - Check MPU structure version/signature | ||
45 | * - Add things like /sbin/overtemp for non-critical | ||
46 | * overtemp conditions so userland can take some policy | ||
47 | * decisions, like slowing down CPUs | ||
48 | * - Deal with fan and i2c failures in a better way | ||
49 | * - Maybe do a generic PID based on params used for | ||
50 | * U3 and Drives ? Definitely need to factor code a bit | ||
51 | * better... also make sensor detection more robust using | ||
52 | * the device-tree to probe for them | ||
53 | * - Figure out how to get the slots consumption and set the | ||
54 | * slots fan accordingly | ||
55 | * | ||
56 | * History: | ||
57 | * | ||
58 | * Nov. 13, 2003 : 0.5 | ||
59 | * - First release | ||
60 | * | ||
61 | * Nov. 14, 2003 : 0.6 | ||
62 | * - Read fan speed from FCU, low level fan routines now deal | ||
63 | * with errors & check fan status, though higher level don't | ||
64 | * do much. | ||
65 | * - Move a bunch of definitions to .h file | ||
66 | * | ||
67 | * Nov. 18, 2003 : 0.7 | ||
68 | * - Fix build on ppc64 kernel | ||
69 | * - Move back statics definitions to .c file | ||
70 | * - Avoid calling schedule_timeout with a negative number | ||
71 | * | ||
72 | * Dec. 18, 2003 : 0.8 | ||
73 | * - Fix typo when reading back fan speed on 2 CPU machines | ||
74 | * | ||
75 | * Mar. 11, 2004 : 0.9 | ||
76 | * - Rework code accessing the ADC chips, make it more robust and | ||
77 | * closer to the chip spec. Also make sure it is configured properly, | ||
78 | * I've seen yet unexplained cases where on startup, I would have stale | ||
79 | * values in the configuration register | ||
80 | * - Switch back to use of target fan speed for PID, thus lowering | ||
81 | * pressure on i2c | ||
82 | * | ||
83 | * Oct. 20, 2004 : 1.1 | ||
84 | * - Add device-tree lookup for fan IDs, should detect liquid cooling | ||
85 | * pumps when present | ||
86 | * - Enable driver for PowerMac7,3 machines | ||
87 | * - Split the U3/Backside cooling on U3 & U3H versions as Darwin does | ||
88 | * - Add new CPU cooling algorithm for machines with liquid cooling | ||
89 | * - Workaround for some PowerMac7,3 with empty "fan" node in the devtree | ||
90 | * - Fix a signed/unsigned compare issue in some PID loops | ||
91 | * | ||
92 | * Mar. 10, 2005 : 1.2 | ||
93 | * - Add basic support for Xserve G5 | ||
94 | * - Retrieve pumps min/max from EEPROM image in device-tree (broken) | ||
95 | * - Use min/max macros here or there | ||
96 | * - Latest darwin updated U3H min fan speed to 20% PWM | ||
97 | * | ||
98 | * July. 06, 2006 : 1.3 | ||
99 | * - Fix setting of RPM fans on Xserve G5 (they were going too fast) | ||
100 | * - Add missing slots fan control loop for Xserve G5 | ||
101 | * - Lower fixed slots fan speed from 50% to 40% on desktop G5s. We | ||
102 | * still can't properly implement the control loop for these, so let's | ||
103 | * reduce the noise a little bit, it appears that 40% still gives us | ||
104 | * a pretty good air flow | ||
105 | * - Add code to "tickle" the FCU regulary so it doesn't think that | ||
106 | * we are gone while in fact, the machine just didn't need any fan | ||
107 | * speed change lately | ||
108 | * | ||
109 | */ | ||
110 | |||
111 | #include <linux/types.h> | ||
112 | #include <linux/module.h> | ||
113 | #include <linux/errno.h> | ||
114 | #include <linux/kernel.h> | ||
115 | #include <linux/delay.h> | ||
116 | #include <linux/sched.h> | ||
117 | #include <linux/init.h> | ||
118 | #include <linux/spinlock.h> | ||
119 | #include <linux/wait.h> | ||
120 | #include <linux/reboot.h> | ||
121 | #include <linux/kmod.h> | ||
122 | #include <linux/i2c.h> | ||
123 | #include <linux/kthread.h> | ||
124 | #include <linux/mutex.h> | ||
125 | #include <linux/of_device.h> | ||
126 | #include <linux/of_platform.h> | ||
127 | #include <asm/prom.h> | ||
128 | #include <asm/machdep.h> | ||
129 | #include <asm/io.h> | ||
130 | #include <asm/sections.h> | ||
131 | #include <asm/macio.h> | ||
132 | |||
133 | #include "therm_pm72.h" | ||
134 | |||
135 | #define VERSION "1.3" | ||
136 | |||
137 | #undef DEBUG | ||
138 | |||
139 | #ifdef DEBUG | ||
140 | #define DBG(args...) printk(args) | ||
141 | #else | ||
142 | #define DBG(args...) do { } while(0) | ||
143 | #endif | ||
144 | |||
145 | |||
146 | /* | ||
147 | * Driver statics | ||
148 | */ | ||
149 | |||
150 | static struct platform_device * of_dev; | ||
151 | static struct i2c_adapter * u3_0; | ||
152 | static struct i2c_adapter * u3_1; | ||
153 | static struct i2c_adapter * k2; | ||
154 | static struct i2c_client * fcu; | ||
155 | static struct cpu_pid_state processor_state[2]; | ||
156 | static struct basckside_pid_params backside_params; | ||
157 | static struct backside_pid_state backside_state; | ||
158 | static struct drives_pid_state drives_state; | ||
159 | static struct dimm_pid_state dimms_state; | ||
160 | static struct slots_pid_state slots_state; | ||
161 | static int state; | ||
162 | static int cpu_count; | ||
163 | static int cpu_pid_type; | ||
164 | static struct task_struct *ctrl_task; | ||
165 | static struct completion ctrl_complete; | ||
166 | static int critical_state; | ||
167 | static int rackmac; | ||
168 | static s32 dimm_output_clamp; | ||
169 | static int fcu_rpm_shift; | ||
170 | static int fcu_tickle_ticks; | ||
171 | static DEFINE_MUTEX(driver_lock); | ||
172 | |||
173 | /* | ||
174 | * We have 3 types of CPU PID control. One is "split" old style control | ||
175 | * for intake & exhaust fans, the other is "combined" control for both | ||
176 | * CPUs that also deals with the pumps when present. To be "compatible" | ||
177 | * with OS X at this point, we only use "COMBINED" on the machines that | ||
178 | * are identified as having the pumps (though that identification is at | ||
179 | * least dodgy). Ultimately, we could probably switch completely to this | ||
180 | * algorithm provided we hack it to deal with the UP case | ||
181 | */ | ||
182 | #define CPU_PID_TYPE_SPLIT 0 | ||
183 | #define CPU_PID_TYPE_COMBINED 1 | ||
184 | #define CPU_PID_TYPE_RACKMAC 2 | ||
185 | |||
186 | /* | ||
187 | * This table describes all fans in the FCU. The "id" and "type" values | ||
188 | * are defaults valid for all earlier machines. Newer machines will | ||
189 | * eventually override the table content based on the device-tree | ||
190 | */ | ||
191 | struct fcu_fan_table | ||
192 | { | ||
193 | char* loc; /* location code */ | ||
194 | int type; /* 0 = rpm, 1 = pwm, 2 = pump */ | ||
195 | int id; /* id or -1 */ | ||
196 | }; | ||
197 | |||
198 | #define FCU_FAN_RPM 0 | ||
199 | #define FCU_FAN_PWM 1 | ||
200 | |||
201 | #define FCU_FAN_ABSENT_ID -1 | ||
202 | |||
203 | #define FCU_FAN_COUNT ARRAY_SIZE(fcu_fans) | ||
204 | |||
205 | struct fcu_fan_table fcu_fans[] = { | ||
206 | [BACKSIDE_FAN_PWM_INDEX] = { | ||
207 | .loc = "BACKSIDE,SYS CTRLR FAN", | ||
208 | .type = FCU_FAN_PWM, | ||
209 | .id = BACKSIDE_FAN_PWM_DEFAULT_ID, | ||
210 | }, | ||
211 | [DRIVES_FAN_RPM_INDEX] = { | ||
212 | .loc = "DRIVE BAY", | ||
213 | .type = FCU_FAN_RPM, | ||
214 | .id = DRIVES_FAN_RPM_DEFAULT_ID, | ||
215 | }, | ||
216 | [SLOTS_FAN_PWM_INDEX] = { | ||
217 | .loc = "SLOT,PCI FAN", | ||
218 | .type = FCU_FAN_PWM, | ||
219 | .id = SLOTS_FAN_PWM_DEFAULT_ID, | ||
220 | }, | ||
221 | [CPUA_INTAKE_FAN_RPM_INDEX] = { | ||
222 | .loc = "CPU A INTAKE", | ||
223 | .type = FCU_FAN_RPM, | ||
224 | .id = CPUA_INTAKE_FAN_RPM_DEFAULT_ID, | ||
225 | }, | ||
226 | [CPUA_EXHAUST_FAN_RPM_INDEX] = { | ||
227 | .loc = "CPU A EXHAUST", | ||
228 | .type = FCU_FAN_RPM, | ||
229 | .id = CPUA_EXHAUST_FAN_RPM_DEFAULT_ID, | ||
230 | }, | ||
231 | [CPUB_INTAKE_FAN_RPM_INDEX] = { | ||
232 | .loc = "CPU B INTAKE", | ||
233 | .type = FCU_FAN_RPM, | ||
234 | .id = CPUB_INTAKE_FAN_RPM_DEFAULT_ID, | ||
235 | }, | ||
236 | [CPUB_EXHAUST_FAN_RPM_INDEX] = { | ||
237 | .loc = "CPU B EXHAUST", | ||
238 | .type = FCU_FAN_RPM, | ||
239 | .id = CPUB_EXHAUST_FAN_RPM_DEFAULT_ID, | ||
240 | }, | ||
241 | /* pumps aren't present by default, have to be looked up in the | ||
242 | * device-tree | ||
243 | */ | ||
244 | [CPUA_PUMP_RPM_INDEX] = { | ||
245 | .loc = "CPU A PUMP", | ||
246 | .type = FCU_FAN_RPM, | ||
247 | .id = FCU_FAN_ABSENT_ID, | ||
248 | }, | ||
249 | [CPUB_PUMP_RPM_INDEX] = { | ||
250 | .loc = "CPU B PUMP", | ||
251 | .type = FCU_FAN_RPM, | ||
252 | .id = FCU_FAN_ABSENT_ID, | ||
253 | }, | ||
254 | /* Xserve fans */ | ||
255 | [CPU_A1_FAN_RPM_INDEX] = { | ||
256 | .loc = "CPU A 1", | ||
257 | .type = FCU_FAN_RPM, | ||
258 | .id = FCU_FAN_ABSENT_ID, | ||
259 | }, | ||
260 | [CPU_A2_FAN_RPM_INDEX] = { | ||
261 | .loc = "CPU A 2", | ||
262 | .type = FCU_FAN_RPM, | ||
263 | .id = FCU_FAN_ABSENT_ID, | ||
264 | }, | ||
265 | [CPU_A3_FAN_RPM_INDEX] = { | ||
266 | .loc = "CPU A 3", | ||
267 | .type = FCU_FAN_RPM, | ||
268 | .id = FCU_FAN_ABSENT_ID, | ||
269 | }, | ||
270 | [CPU_B1_FAN_RPM_INDEX] = { | ||
271 | .loc = "CPU B 1", | ||
272 | .type = FCU_FAN_RPM, | ||
273 | .id = FCU_FAN_ABSENT_ID, | ||
274 | }, | ||
275 | [CPU_B2_FAN_RPM_INDEX] = { | ||
276 | .loc = "CPU B 2", | ||
277 | .type = FCU_FAN_RPM, | ||
278 | .id = FCU_FAN_ABSENT_ID, | ||
279 | }, | ||
280 | [CPU_B3_FAN_RPM_INDEX] = { | ||
281 | .loc = "CPU B 3", | ||
282 | .type = FCU_FAN_RPM, | ||
283 | .id = FCU_FAN_ABSENT_ID, | ||
284 | }, | ||
285 | }; | ||
286 | |||
287 | static struct i2c_driver therm_pm72_driver; | ||
288 | |||
289 | /* | ||
290 | * Utility function to create an i2c_client structure and | ||
291 | * attach it to one of u3 adapters | ||
292 | */ | ||
293 | static struct i2c_client *attach_i2c_chip(int id, const char *name) | ||
294 | { | ||
295 | struct i2c_client *clt; | ||
296 | struct i2c_adapter *adap; | ||
297 | struct i2c_board_info info; | ||
298 | |||
299 | if (id & 0x200) | ||
300 | adap = k2; | ||
301 | else if (id & 0x100) | ||
302 | adap = u3_1; | ||
303 | else | ||
304 | adap = u3_0; | ||
305 | if (adap == NULL) | ||
306 | return NULL; | ||
307 | |||
308 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
309 | info.addr = (id >> 1) & 0x7f; | ||
310 | strlcpy(info.type, "therm_pm72", I2C_NAME_SIZE); | ||
311 | clt = i2c_new_device(adap, &info); | ||
312 | if (!clt) { | ||
313 | printk(KERN_ERR "therm_pm72: Failed to attach to i2c ID 0x%x\n", id); | ||
314 | return NULL; | ||
315 | } | ||
316 | |||
317 | /* | ||
318 | * Let i2c-core delete that device on driver removal. | ||
319 | * This is safe because i2c-core holds the core_lock mutex for us. | ||
320 | */ | ||
321 | list_add_tail(&clt->detected, &therm_pm72_driver.clients); | ||
322 | return clt; | ||
323 | } | ||
324 | |||
325 | /* | ||
326 | * Here are the i2c chip access wrappers | ||
327 | */ | ||
328 | |||
329 | static void initialize_adc(struct cpu_pid_state *state) | ||
330 | { | ||
331 | int rc; | ||
332 | u8 buf[2]; | ||
333 | |||
334 | /* Read ADC the configuration register and cache it. We | ||
335 | * also make sure Config2 contains proper values, I've seen | ||
336 | * cases where we got stale grabage in there, thus preventing | ||
337 | * proper reading of conv. values | ||
338 | */ | ||
339 | |||
340 | /* Clear Config2 */ | ||
341 | buf[0] = 5; | ||
342 | buf[1] = 0; | ||
343 | i2c_master_send(state->monitor, buf, 2); | ||
344 | |||
345 | /* Read & cache Config1 */ | ||
346 | buf[0] = 1; | ||
347 | rc = i2c_master_send(state->monitor, buf, 1); | ||
348 | if (rc > 0) { | ||
349 | rc = i2c_master_recv(state->monitor, buf, 1); | ||
350 | if (rc > 0) { | ||
351 | state->adc_config = buf[0]; | ||
352 | DBG("ADC config reg: %02x\n", state->adc_config); | ||
353 | /* Disable shutdown mode */ | ||
354 | state->adc_config &= 0xfe; | ||
355 | buf[0] = 1; | ||
356 | buf[1] = state->adc_config; | ||
357 | rc = i2c_master_send(state->monitor, buf, 2); | ||
358 | } | ||
359 | } | ||
360 | if (rc <= 0) | ||
361 | printk(KERN_ERR "therm_pm72: Error reading ADC config" | ||
362 | " register !\n"); | ||
363 | } | ||
364 | |||
365 | static int read_smon_adc(struct cpu_pid_state *state, int chan) | ||
366 | { | ||
367 | int rc, data, tries = 0; | ||
368 | u8 buf[2]; | ||
369 | |||
370 | for (;;) { | ||
371 | /* Set channel */ | ||
372 | buf[0] = 1; | ||
373 | buf[1] = (state->adc_config & 0x1f) | (chan << 5); | ||
374 | rc = i2c_master_send(state->monitor, buf, 2); | ||
375 | if (rc <= 0) | ||
376 | goto error; | ||
377 | /* Wait for conversion */ | ||
378 | msleep(1); | ||
379 | /* Switch to data register */ | ||
380 | buf[0] = 4; | ||
381 | rc = i2c_master_send(state->monitor, buf, 1); | ||
382 | if (rc <= 0) | ||
383 | goto error; | ||
384 | /* Read result */ | ||
385 | rc = i2c_master_recv(state->monitor, buf, 2); | ||
386 | if (rc < 0) | ||
387 | goto error; | ||
388 | data = ((u16)buf[0]) << 8 | (u16)buf[1]; | ||
389 | return data >> 6; | ||
390 | error: | ||
391 | DBG("Error reading ADC, retrying...\n"); | ||
392 | if (++tries > 10) { | ||
393 | printk(KERN_ERR "therm_pm72: Error reading ADC !\n"); | ||
394 | return -1; | ||
395 | } | ||
396 | msleep(10); | ||
397 | } | ||
398 | } | ||
399 | |||
400 | static int read_lm87_reg(struct i2c_client * chip, int reg) | ||
401 | { | ||
402 | int rc, tries = 0; | ||
403 | u8 buf; | ||
404 | |||
405 | for (;;) { | ||
406 | /* Set address */ | ||
407 | buf = (u8)reg; | ||
408 | rc = i2c_master_send(chip, &buf, 1); | ||
409 | if (rc <= 0) | ||
410 | goto error; | ||
411 | rc = i2c_master_recv(chip, &buf, 1); | ||
412 | if (rc <= 0) | ||
413 | goto error; | ||
414 | return (int)buf; | ||
415 | error: | ||
416 | DBG("Error reading LM87, retrying...\n"); | ||
417 | if (++tries > 10) { | ||
418 | printk(KERN_ERR "therm_pm72: Error reading LM87 !\n"); | ||
419 | return -1; | ||
420 | } | ||
421 | msleep(10); | ||
422 | } | ||
423 | } | ||
424 | |||
425 | static int fan_read_reg(int reg, unsigned char *buf, int nb) | ||
426 | { | ||
427 | int tries, nr, nw; | ||
428 | |||
429 | buf[0] = reg; | ||
430 | tries = 0; | ||
431 | for (;;) { | ||
432 | nw = i2c_master_send(fcu, buf, 1); | ||
433 | if (nw > 0 || (nw < 0 && nw != -EIO) || tries >= 100) | ||
434 | break; | ||
435 | msleep(10); | ||
436 | ++tries; | ||
437 | } | ||
438 | if (nw <= 0) { | ||
439 | printk(KERN_ERR "Failure writing address to FCU: %d", nw); | ||
440 | return -EIO; | ||
441 | } | ||
442 | tries = 0; | ||
443 | for (;;) { | ||
444 | nr = i2c_master_recv(fcu, buf, nb); | ||
445 | if (nr > 0 || (nr < 0 && nr != -ENODEV) || tries >= 100) | ||
446 | break; | ||
447 | msleep(10); | ||
448 | ++tries; | ||
449 | } | ||
450 | if (nr <= 0) | ||
451 | printk(KERN_ERR "Failure reading data from FCU: %d", nw); | ||
452 | return nr; | ||
453 | } | ||
454 | |||
455 | static int fan_write_reg(int reg, const unsigned char *ptr, int nb) | ||
456 | { | ||
457 | int tries, nw; | ||
458 | unsigned char buf[16]; | ||
459 | |||
460 | buf[0] = reg; | ||
461 | memcpy(buf+1, ptr, nb); | ||
462 | ++nb; | ||
463 | tries = 0; | ||
464 | for (;;) { | ||
465 | nw = i2c_master_send(fcu, buf, nb); | ||
466 | if (nw > 0 || (nw < 0 && nw != -EIO) || tries >= 100) | ||
467 | break; | ||
468 | msleep(10); | ||
469 | ++tries; | ||
470 | } | ||
471 | if (nw < 0) | ||
472 | printk(KERN_ERR "Failure writing to FCU: %d", nw); | ||
473 | return nw; | ||
474 | } | ||
475 | |||
476 | static int start_fcu(void) | ||
477 | { | ||
478 | unsigned char buf = 0xff; | ||
479 | int rc; | ||
480 | |||
481 | rc = fan_write_reg(0xe, &buf, 1); | ||
482 | if (rc < 0) | ||
483 | return -EIO; | ||
484 | rc = fan_write_reg(0x2e, &buf, 1); | ||
485 | if (rc < 0) | ||
486 | return -EIO; | ||
487 | rc = fan_read_reg(0, &buf, 1); | ||
488 | if (rc < 0) | ||
489 | return -EIO; | ||
490 | fcu_rpm_shift = (buf == 1) ? 2 : 3; | ||
491 | printk(KERN_DEBUG "FCU Initialized, RPM fan shift is %d\n", | ||
492 | fcu_rpm_shift); | ||
493 | |||
494 | return 0; | ||
495 | } | ||
496 | |||
497 | static int set_rpm_fan(int fan_index, int rpm) | ||
498 | { | ||
499 | unsigned char buf[2]; | ||
500 | int rc, id, min, max; | ||
501 | |||
502 | if (fcu_fans[fan_index].type != FCU_FAN_RPM) | ||
503 | return -EINVAL; | ||
504 | id = fcu_fans[fan_index].id; | ||
505 | if (id == FCU_FAN_ABSENT_ID) | ||
506 | return -EINVAL; | ||
507 | |||
508 | min = 2400 >> fcu_rpm_shift; | ||
509 | max = 56000 >> fcu_rpm_shift; | ||
510 | |||
511 | if (rpm < min) | ||
512 | rpm = min; | ||
513 | else if (rpm > max) | ||
514 | rpm = max; | ||
515 | buf[0] = rpm >> (8 - fcu_rpm_shift); | ||
516 | buf[1] = rpm << fcu_rpm_shift; | ||
517 | rc = fan_write_reg(0x10 + (id * 2), buf, 2); | ||
518 | if (rc < 0) | ||
519 | return -EIO; | ||
520 | return 0; | ||
521 | } | ||
522 | |||
523 | static int get_rpm_fan(int fan_index, int programmed) | ||
524 | { | ||
525 | unsigned char failure; | ||
526 | unsigned char active; | ||
527 | unsigned char buf[2]; | ||
528 | int rc, id, reg_base; | ||
529 | |||
530 | if (fcu_fans[fan_index].type != FCU_FAN_RPM) | ||
531 | return -EINVAL; | ||
532 | id = fcu_fans[fan_index].id; | ||
533 | if (id == FCU_FAN_ABSENT_ID) | ||
534 | return -EINVAL; | ||
535 | |||
536 | rc = fan_read_reg(0xb, &failure, 1); | ||
537 | if (rc != 1) | ||
538 | return -EIO; | ||
539 | if ((failure & (1 << id)) != 0) | ||
540 | return -EFAULT; | ||
541 | rc = fan_read_reg(0xd, &active, 1); | ||
542 | if (rc != 1) | ||
543 | return -EIO; | ||
544 | if ((active & (1 << id)) == 0) | ||
545 | return -ENXIO; | ||
546 | |||
547 | /* Programmed value or real current speed */ | ||
548 | reg_base = programmed ? 0x10 : 0x11; | ||
549 | rc = fan_read_reg(reg_base + (id * 2), buf, 2); | ||
550 | if (rc != 2) | ||
551 | return -EIO; | ||
552 | |||
553 | return (buf[0] << (8 - fcu_rpm_shift)) | buf[1] >> fcu_rpm_shift; | ||
554 | } | ||
555 | |||
556 | static int set_pwm_fan(int fan_index, int pwm) | ||
557 | { | ||
558 | unsigned char buf[2]; | ||
559 | int rc, id; | ||
560 | |||
561 | if (fcu_fans[fan_index].type != FCU_FAN_PWM) | ||
562 | return -EINVAL; | ||
563 | id = fcu_fans[fan_index].id; | ||
564 | if (id == FCU_FAN_ABSENT_ID) | ||
565 | return -EINVAL; | ||
566 | |||
567 | if (pwm < 10) | ||
568 | pwm = 10; | ||
569 | else if (pwm > 100) | ||
570 | pwm = 100; | ||
571 | pwm = (pwm * 2559) / 1000; | ||
572 | buf[0] = pwm; | ||
573 | rc = fan_write_reg(0x30 + (id * 2), buf, 1); | ||
574 | if (rc < 0) | ||
575 | return rc; | ||
576 | return 0; | ||
577 | } | ||
578 | |||
579 | static int get_pwm_fan(int fan_index) | ||
580 | { | ||
581 | unsigned char failure; | ||
582 | unsigned char active; | ||
583 | unsigned char buf[2]; | ||
584 | int rc, id; | ||
585 | |||
586 | if (fcu_fans[fan_index].type != FCU_FAN_PWM) | ||
587 | return -EINVAL; | ||
588 | id = fcu_fans[fan_index].id; | ||
589 | if (id == FCU_FAN_ABSENT_ID) | ||
590 | return -EINVAL; | ||
591 | |||
592 | rc = fan_read_reg(0x2b, &failure, 1); | ||
593 | if (rc != 1) | ||
594 | return -EIO; | ||
595 | if ((failure & (1 << id)) != 0) | ||
596 | return -EFAULT; | ||
597 | rc = fan_read_reg(0x2d, &active, 1); | ||
598 | if (rc != 1) | ||
599 | return -EIO; | ||
600 | if ((active & (1 << id)) == 0) | ||
601 | return -ENXIO; | ||
602 | |||
603 | /* Programmed value or real current speed */ | ||
604 | rc = fan_read_reg(0x30 + (id * 2), buf, 1); | ||
605 | if (rc != 1) | ||
606 | return -EIO; | ||
607 | |||
608 | return (buf[0] * 1000) / 2559; | ||
609 | } | ||
610 | |||
611 | static void tickle_fcu(void) | ||
612 | { | ||
613 | int pwm; | ||
614 | |||
615 | pwm = get_pwm_fan(SLOTS_FAN_PWM_INDEX); | ||
616 | |||
617 | DBG("FCU Tickle, slots fan is: %d\n", pwm); | ||
618 | if (pwm < 0) | ||
619 | pwm = 100; | ||
620 | |||
621 | if (!rackmac) { | ||
622 | pwm = SLOTS_FAN_DEFAULT_PWM; | ||
623 | } else if (pwm < SLOTS_PID_OUTPUT_MIN) | ||
624 | pwm = SLOTS_PID_OUTPUT_MIN; | ||
625 | |||
626 | /* That is hopefully enough to make the FCU happy */ | ||
627 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, pwm); | ||
628 | } | ||
629 | |||
630 | |||
631 | /* | ||
632 | * Utility routine to read the CPU calibration EEPROM data | ||
633 | * from the device-tree | ||
634 | */ | ||
635 | static int read_eeprom(int cpu, struct mpu_data *out) | ||
636 | { | ||
637 | struct device_node *np; | ||
638 | char nodename[64]; | ||
639 | const u8 *data; | ||
640 | int len; | ||
641 | |||
642 | /* prom.c routine for finding a node by path is a bit brain dead | ||
643 | * and requires exact @xxx unit numbers. This is a bit ugly but | ||
644 | * will work for these machines | ||
645 | */ | ||
646 | sprintf(nodename, "/u3@0,f8000000/i2c@f8001000/cpuid@a%d", cpu ? 2 : 0); | ||
647 | np = of_find_node_by_path(nodename); | ||
648 | if (np == NULL) { | ||
649 | printk(KERN_ERR "therm_pm72: Failed to retrieve cpuid node from device-tree\n"); | ||
650 | return -ENODEV; | ||
651 | } | ||
652 | data = of_get_property(np, "cpuid", &len); | ||
653 | if (data == NULL) { | ||
654 | printk(KERN_ERR "therm_pm72: Failed to retrieve cpuid property from device-tree\n"); | ||
655 | of_node_put(np); | ||
656 | return -ENODEV; | ||
657 | } | ||
658 | memcpy(out, data, sizeof(struct mpu_data)); | ||
659 | of_node_put(np); | ||
660 | |||
661 | return 0; | ||
662 | } | ||
663 | |||
664 | static void fetch_cpu_pumps_minmax(void) | ||
665 | { | ||
666 | struct cpu_pid_state *state0 = &processor_state[0]; | ||
667 | struct cpu_pid_state *state1 = &processor_state[1]; | ||
668 | u16 pump_min = 0, pump_max = 0xffff; | ||
669 | u16 tmp[4]; | ||
670 | |||
671 | /* Try to fetch pumps min/max infos from eeprom */ | ||
672 | |||
673 | memcpy(&tmp, &state0->mpu.processor_part_num, 8); | ||
674 | if (tmp[0] != 0xffff && tmp[1] != 0xffff) { | ||
675 | pump_min = max(pump_min, tmp[0]); | ||
676 | pump_max = min(pump_max, tmp[1]); | ||
677 | } | ||
678 | if (tmp[2] != 0xffff && tmp[3] != 0xffff) { | ||
679 | pump_min = max(pump_min, tmp[2]); | ||
680 | pump_max = min(pump_max, tmp[3]); | ||
681 | } | ||
682 | |||
683 | /* Double check the values, this _IS_ needed as the EEPROM on | ||
684 | * some dual 2.5Ghz G5s seem, at least, to have both min & max | ||
685 | * same to the same value ... (grrrr) | ||
686 | */ | ||
687 | if (pump_min == pump_max || pump_min == 0 || pump_max == 0xffff) { | ||
688 | pump_min = CPU_PUMP_OUTPUT_MIN; | ||
689 | pump_max = CPU_PUMP_OUTPUT_MAX; | ||
690 | } | ||
691 | |||
692 | state0->pump_min = state1->pump_min = pump_min; | ||
693 | state0->pump_max = state1->pump_max = pump_max; | ||
694 | } | ||
695 | |||
696 | /* | ||
697 | * Now, unfortunately, sysfs doesn't give us a nice void * we could | ||
698 | * pass around to the attribute functions, so we don't really have | ||
699 | * choice but implement a bunch of them... | ||
700 | * | ||
701 | * That sucks a bit, we take the lock because FIX32TOPRINT evaluates | ||
702 | * the input twice... I accept patches :) | ||
703 | */ | ||
704 | #define BUILD_SHOW_FUNC_FIX(name, data) \ | ||
705 | static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ | ||
706 | { \ | ||
707 | ssize_t r; \ | ||
708 | mutex_lock(&driver_lock); \ | ||
709 | r = sprintf(buf, "%d.%03d", FIX32TOPRINT(data)); \ | ||
710 | mutex_unlock(&driver_lock); \ | ||
711 | return r; \ | ||
712 | } | ||
713 | #define BUILD_SHOW_FUNC_INT(name, data) \ | ||
714 | static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ | ||
715 | { \ | ||
716 | return sprintf(buf, "%d", data); \ | ||
717 | } | ||
718 | |||
719 | BUILD_SHOW_FUNC_FIX(cpu0_temperature, processor_state[0].last_temp) | ||
720 | BUILD_SHOW_FUNC_FIX(cpu0_voltage, processor_state[0].voltage) | ||
721 | BUILD_SHOW_FUNC_FIX(cpu0_current, processor_state[0].current_a) | ||
722 | BUILD_SHOW_FUNC_INT(cpu0_exhaust_fan_rpm, processor_state[0].rpm) | ||
723 | BUILD_SHOW_FUNC_INT(cpu0_intake_fan_rpm, processor_state[0].intake_rpm) | ||
724 | |||
725 | BUILD_SHOW_FUNC_FIX(cpu1_temperature, processor_state[1].last_temp) | ||
726 | BUILD_SHOW_FUNC_FIX(cpu1_voltage, processor_state[1].voltage) | ||
727 | BUILD_SHOW_FUNC_FIX(cpu1_current, processor_state[1].current_a) | ||
728 | BUILD_SHOW_FUNC_INT(cpu1_exhaust_fan_rpm, processor_state[1].rpm) | ||
729 | BUILD_SHOW_FUNC_INT(cpu1_intake_fan_rpm, processor_state[1].intake_rpm) | ||
730 | |||
731 | BUILD_SHOW_FUNC_FIX(backside_temperature, backside_state.last_temp) | ||
732 | BUILD_SHOW_FUNC_INT(backside_fan_pwm, backside_state.pwm) | ||
733 | |||
734 | BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp) | ||
735 | BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm) | ||
736 | |||
737 | BUILD_SHOW_FUNC_FIX(slots_temperature, slots_state.last_temp) | ||
738 | BUILD_SHOW_FUNC_INT(slots_fan_pwm, slots_state.pwm) | ||
739 | |||
740 | BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp) | ||
741 | |||
742 | static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL); | ||
743 | static DEVICE_ATTR(cpu0_voltage,S_IRUGO,show_cpu0_voltage,NULL); | ||
744 | static DEVICE_ATTR(cpu0_current,S_IRUGO,show_cpu0_current,NULL); | ||
745 | static DEVICE_ATTR(cpu0_exhaust_fan_rpm,S_IRUGO,show_cpu0_exhaust_fan_rpm,NULL); | ||
746 | static DEVICE_ATTR(cpu0_intake_fan_rpm,S_IRUGO,show_cpu0_intake_fan_rpm,NULL); | ||
747 | |||
748 | static DEVICE_ATTR(cpu1_temperature,S_IRUGO,show_cpu1_temperature,NULL); | ||
749 | static DEVICE_ATTR(cpu1_voltage,S_IRUGO,show_cpu1_voltage,NULL); | ||
750 | static DEVICE_ATTR(cpu1_current,S_IRUGO,show_cpu1_current,NULL); | ||
751 | static DEVICE_ATTR(cpu1_exhaust_fan_rpm,S_IRUGO,show_cpu1_exhaust_fan_rpm,NULL); | ||
752 | static DEVICE_ATTR(cpu1_intake_fan_rpm,S_IRUGO,show_cpu1_intake_fan_rpm,NULL); | ||
753 | |||
754 | static DEVICE_ATTR(backside_temperature,S_IRUGO,show_backside_temperature,NULL); | ||
755 | static DEVICE_ATTR(backside_fan_pwm,S_IRUGO,show_backside_fan_pwm,NULL); | ||
756 | |||
757 | static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL); | ||
758 | static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL); | ||
759 | |||
760 | static DEVICE_ATTR(slots_temperature,S_IRUGO,show_slots_temperature,NULL); | ||
761 | static DEVICE_ATTR(slots_fan_pwm,S_IRUGO,show_slots_fan_pwm,NULL); | ||
762 | |||
763 | static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL); | ||
764 | |||
765 | /* | ||
766 | * CPUs fans control loop | ||
767 | */ | ||
768 | |||
769 | static int do_read_one_cpu_values(struct cpu_pid_state *state, s32 *temp, s32 *power) | ||
770 | { | ||
771 | s32 ltemp, volts, amps; | ||
772 | int index, rc = 0; | ||
773 | |||
774 | /* Default (in case of error) */ | ||
775 | *temp = state->cur_temp; | ||
776 | *power = state->cur_power; | ||
777 | |||
778 | if (cpu_pid_type == CPU_PID_TYPE_RACKMAC) | ||
779 | index = (state->index == 0) ? | ||
780 | CPU_A1_FAN_RPM_INDEX : CPU_B1_FAN_RPM_INDEX; | ||
781 | else | ||
782 | index = (state->index == 0) ? | ||
783 | CPUA_EXHAUST_FAN_RPM_INDEX : CPUB_EXHAUST_FAN_RPM_INDEX; | ||
784 | |||
785 | /* Read current fan status */ | ||
786 | rc = get_rpm_fan(index, !RPM_PID_USE_ACTUAL_SPEED); | ||
787 | if (rc < 0) { | ||
788 | /* XXX What do we do now ? Nothing for now, keep old value, but | ||
789 | * return error upstream | ||
790 | */ | ||
791 | DBG(" cpu %d, fan reading error !\n", state->index); | ||
792 | } else { | ||
793 | state->rpm = rc; | ||
794 | DBG(" cpu %d, exhaust RPM: %d\n", state->index, state->rpm); | ||
795 | } | ||
796 | |||
797 | /* Get some sensor readings and scale it */ | ||
798 | ltemp = read_smon_adc(state, 1); | ||
799 | if (ltemp == -1) { | ||
800 | /* XXX What do we do now ? */ | ||
801 | state->overtemp++; | ||
802 | if (rc == 0) | ||
803 | rc = -EIO; | ||
804 | DBG(" cpu %d, temp reading error !\n", state->index); | ||
805 | } else { | ||
806 | /* Fixup temperature according to diode calibration | ||
807 | */ | ||
808 | DBG(" cpu %d, temp raw: %04x, m_diode: %04x, b_diode: %04x\n", | ||
809 | state->index, | ||
810 | ltemp, state->mpu.mdiode, state->mpu.bdiode); | ||
811 | *temp = ((s32)ltemp * (s32)state->mpu.mdiode + ((s32)state->mpu.bdiode << 12)) >> 2; | ||
812 | state->last_temp = *temp; | ||
813 | DBG(" temp: %d.%03d\n", FIX32TOPRINT((*temp))); | ||
814 | } | ||
815 | |||
816 | /* | ||
817 | * Read voltage & current and calculate power | ||
818 | */ | ||
819 | volts = read_smon_adc(state, 3); | ||
820 | amps = read_smon_adc(state, 4); | ||
821 | |||
822 | /* Scale voltage and current raw sensor values according to fixed scales | ||
823 | * obtained in Darwin and calculate power from I and V | ||
824 | */ | ||
825 | volts *= ADC_CPU_VOLTAGE_SCALE; | ||
826 | amps *= ADC_CPU_CURRENT_SCALE; | ||
827 | *power = (((u64)volts) * ((u64)amps)) >> 16; | ||
828 | state->voltage = volts; | ||
829 | state->current_a = amps; | ||
830 | state->last_power = *power; | ||
831 | |||
832 | DBG(" cpu %d, current: %d.%03d, voltage: %d.%03d, power: %d.%03d W\n", | ||
833 | state->index, FIX32TOPRINT(state->current_a), | ||
834 | FIX32TOPRINT(state->voltage), FIX32TOPRINT(*power)); | ||
835 | |||
836 | return 0; | ||
837 | } | ||
838 | |||
839 | static void do_cpu_pid(struct cpu_pid_state *state, s32 temp, s32 power) | ||
840 | { | ||
841 | s32 power_target, integral, derivative, proportional, adj_in_target, sval; | ||
842 | s64 integ_p, deriv_p, prop_p, sum; | ||
843 | int i; | ||
844 | |||
845 | /* Calculate power target value (could be done once for all) | ||
846 | * and convert to a 16.16 fp number | ||
847 | */ | ||
848 | power_target = ((u32)(state->mpu.pmaxh - state->mpu.padjmax)) << 16; | ||
849 | DBG(" power target: %d.%03d, error: %d.%03d\n", | ||
850 | FIX32TOPRINT(power_target), FIX32TOPRINT(power_target - power)); | ||
851 | |||
852 | /* Store temperature and power in history array */ | ||
853 | state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; | ||
854 | state->temp_history[state->cur_temp] = temp; | ||
855 | state->cur_power = (state->cur_power + 1) % state->count_power; | ||
856 | state->power_history[state->cur_power] = power; | ||
857 | state->error_history[state->cur_power] = power_target - power; | ||
858 | |||
859 | /* If first loop, fill the history table */ | ||
860 | if (state->first) { | ||
861 | for (i = 0; i < (state->count_power - 1); i++) { | ||
862 | state->cur_power = (state->cur_power + 1) % state->count_power; | ||
863 | state->power_history[state->cur_power] = power; | ||
864 | state->error_history[state->cur_power] = power_target - power; | ||
865 | } | ||
866 | for (i = 0; i < (CPU_TEMP_HISTORY_SIZE - 1); i++) { | ||
867 | state->cur_temp = (state->cur_temp + 1) % CPU_TEMP_HISTORY_SIZE; | ||
868 | state->temp_history[state->cur_temp] = temp; | ||
869 | } | ||
870 | state->first = 0; | ||
871 | } | ||
872 | |||
873 | /* Calculate the integral term normally based on the "power" values */ | ||
874 | sum = 0; | ||
875 | integral = 0; | ||
876 | for (i = 0; i < state->count_power; i++) | ||
877 | integral += state->error_history[i]; | ||
878 | integral *= CPU_PID_INTERVAL; | ||
879 | DBG(" integral: %08x\n", integral); | ||
880 | |||
881 | /* Calculate the adjusted input (sense value). | ||
882 | * G_r is 12.20 | ||
883 | * integ is 16.16 | ||
884 | * so the result is 28.36 | ||
885 | * | ||
886 | * input target is mpu.ttarget, input max is mpu.tmax | ||
887 | */ | ||
888 | integ_p = ((s64)state->mpu.pid_gr) * (s64)integral; | ||
889 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
890 | sval = (state->mpu.tmax << 16) - ((integ_p >> 20) & 0xffffffff); | ||
891 | adj_in_target = (state->mpu.ttarget << 16); | ||
892 | if (adj_in_target > sval) | ||
893 | adj_in_target = sval; | ||
894 | DBG(" adj_in_target: %d.%03d, ttarget: %d\n", FIX32TOPRINT(adj_in_target), | ||
895 | state->mpu.ttarget); | ||
896 | |||
897 | /* Calculate the derivative term */ | ||
898 | derivative = state->temp_history[state->cur_temp] - | ||
899 | state->temp_history[(state->cur_temp + CPU_TEMP_HISTORY_SIZE - 1) | ||
900 | % CPU_TEMP_HISTORY_SIZE]; | ||
901 | derivative /= CPU_PID_INTERVAL; | ||
902 | deriv_p = ((s64)state->mpu.pid_gd) * (s64)derivative; | ||
903 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
904 | sum += deriv_p; | ||
905 | |||
906 | /* Calculate the proportional term */ | ||
907 | proportional = temp - adj_in_target; | ||
908 | prop_p = ((s64)state->mpu.pid_gp) * (s64)proportional; | ||
909 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
910 | sum += prop_p; | ||
911 | |||
912 | /* Scale sum */ | ||
913 | sum >>= 36; | ||
914 | |||
915 | DBG(" sum: %d\n", (int)sum); | ||
916 | state->rpm += (s32)sum; | ||
917 | } | ||
918 | |||
919 | static void do_monitor_cpu_combined(void) | ||
920 | { | ||
921 | struct cpu_pid_state *state0 = &processor_state[0]; | ||
922 | struct cpu_pid_state *state1 = &processor_state[1]; | ||
923 | s32 temp0, power0, temp1, power1; | ||
924 | s32 temp_combi, power_combi; | ||
925 | int rc, intake, pump; | ||
926 | |||
927 | rc = do_read_one_cpu_values(state0, &temp0, &power0); | ||
928 | if (rc < 0) { | ||
929 | /* XXX What do we do now ? */ | ||
930 | } | ||
931 | state1->overtemp = 0; | ||
932 | rc = do_read_one_cpu_values(state1, &temp1, &power1); | ||
933 | if (rc < 0) { | ||
934 | /* XXX What do we do now ? */ | ||
935 | } | ||
936 | if (state1->overtemp) | ||
937 | state0->overtemp++; | ||
938 | |||
939 | temp_combi = max(temp0, temp1); | ||
940 | power_combi = max(power0, power1); | ||
941 | |||
942 | /* Check tmax, increment overtemp if we are there. At tmax+8, we go | ||
943 | * full blown immediately and try to trigger a shutdown | ||
944 | */ | ||
945 | if (temp_combi >= ((state0->mpu.tmax + 8) << 16)) { | ||
946 | printk(KERN_WARNING "Warning ! Temperature way above maximum (%d) !\n", | ||
947 | temp_combi >> 16); | ||
948 | state0->overtemp += CPU_MAX_OVERTEMP / 4; | ||
949 | } else if (temp_combi > (state0->mpu.tmax << 16)) { | ||
950 | state0->overtemp++; | ||
951 | printk(KERN_WARNING "Temperature %d above max %d. overtemp %d\n", | ||
952 | temp_combi >> 16, state0->mpu.tmax, state0->overtemp); | ||
953 | } else { | ||
954 | if (state0->overtemp) | ||
955 | printk(KERN_WARNING "Temperature back down to %d\n", | ||
956 | temp_combi >> 16); | ||
957 | state0->overtemp = 0; | ||
958 | } | ||
959 | if (state0->overtemp >= CPU_MAX_OVERTEMP) | ||
960 | critical_state = 1; | ||
961 | if (state0->overtemp > 0) { | ||
962 | state0->rpm = state0->mpu.rmaxn_exhaust_fan; | ||
963 | state0->intake_rpm = intake = state0->mpu.rmaxn_intake_fan; | ||
964 | pump = state0->pump_max; | ||
965 | goto do_set_fans; | ||
966 | } | ||
967 | |||
968 | /* Do the PID */ | ||
969 | do_cpu_pid(state0, temp_combi, power_combi); | ||
970 | |||
971 | /* Range check */ | ||
972 | state0->rpm = max(state0->rpm, (int)state0->mpu.rminn_exhaust_fan); | ||
973 | state0->rpm = min(state0->rpm, (int)state0->mpu.rmaxn_exhaust_fan); | ||
974 | |||
975 | /* Calculate intake fan speed */ | ||
976 | intake = (state0->rpm * CPU_INTAKE_SCALE) >> 16; | ||
977 | intake = max(intake, (int)state0->mpu.rminn_intake_fan); | ||
978 | intake = min(intake, (int)state0->mpu.rmaxn_intake_fan); | ||
979 | state0->intake_rpm = intake; | ||
980 | |||
981 | /* Calculate pump speed */ | ||
982 | pump = (state0->rpm * state0->pump_max) / | ||
983 | state0->mpu.rmaxn_exhaust_fan; | ||
984 | pump = min(pump, state0->pump_max); | ||
985 | pump = max(pump, state0->pump_min); | ||
986 | |||
987 | do_set_fans: | ||
988 | /* We copy values from state 0 to state 1 for /sysfs */ | ||
989 | state1->rpm = state0->rpm; | ||
990 | state1->intake_rpm = state0->intake_rpm; | ||
991 | |||
992 | DBG("** CPU %d RPM: %d Ex, %d, Pump: %d, In, overtemp: %d\n", | ||
993 | state1->index, (int)state1->rpm, intake, pump, state1->overtemp); | ||
994 | |||
995 | /* We should check for errors, shouldn't we ? But then, what | ||
996 | * do we do once the error occurs ? For FCU notified fan | ||
997 | * failures (-EFAULT) we probably want to notify userland | ||
998 | * some way... | ||
999 | */ | ||
1000 | set_rpm_fan(CPUA_INTAKE_FAN_RPM_INDEX, intake); | ||
1001 | set_rpm_fan(CPUA_EXHAUST_FAN_RPM_INDEX, state0->rpm); | ||
1002 | set_rpm_fan(CPUB_INTAKE_FAN_RPM_INDEX, intake); | ||
1003 | set_rpm_fan(CPUB_EXHAUST_FAN_RPM_INDEX, state0->rpm); | ||
1004 | |||
1005 | if (fcu_fans[CPUA_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) | ||
1006 | set_rpm_fan(CPUA_PUMP_RPM_INDEX, pump); | ||
1007 | if (fcu_fans[CPUB_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) | ||
1008 | set_rpm_fan(CPUB_PUMP_RPM_INDEX, pump); | ||
1009 | } | ||
1010 | |||
1011 | static void do_monitor_cpu_split(struct cpu_pid_state *state) | ||
1012 | { | ||
1013 | s32 temp, power; | ||
1014 | int rc, intake; | ||
1015 | |||
1016 | /* Read current fan status */ | ||
1017 | rc = do_read_one_cpu_values(state, &temp, &power); | ||
1018 | if (rc < 0) { | ||
1019 | /* XXX What do we do now ? */ | ||
1020 | } | ||
1021 | |||
1022 | /* Check tmax, increment overtemp if we are there. At tmax+8, we go | ||
1023 | * full blown immediately and try to trigger a shutdown | ||
1024 | */ | ||
1025 | if (temp >= ((state->mpu.tmax + 8) << 16)) { | ||
1026 | printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum" | ||
1027 | " (%d) !\n", | ||
1028 | state->index, temp >> 16); | ||
1029 | state->overtemp += CPU_MAX_OVERTEMP / 4; | ||
1030 | } else if (temp > (state->mpu.tmax << 16)) { | ||
1031 | state->overtemp++; | ||
1032 | printk(KERN_WARNING "CPU %d temperature %d above max %d. overtemp %d\n", | ||
1033 | state->index, temp >> 16, state->mpu.tmax, state->overtemp); | ||
1034 | } else { | ||
1035 | if (state->overtemp) | ||
1036 | printk(KERN_WARNING "CPU %d temperature back down to %d\n", | ||
1037 | state->index, temp >> 16); | ||
1038 | state->overtemp = 0; | ||
1039 | } | ||
1040 | if (state->overtemp >= CPU_MAX_OVERTEMP) | ||
1041 | critical_state = 1; | ||
1042 | if (state->overtemp > 0) { | ||
1043 | state->rpm = state->mpu.rmaxn_exhaust_fan; | ||
1044 | state->intake_rpm = intake = state->mpu.rmaxn_intake_fan; | ||
1045 | goto do_set_fans; | ||
1046 | } | ||
1047 | |||
1048 | /* Do the PID */ | ||
1049 | do_cpu_pid(state, temp, power); | ||
1050 | |||
1051 | /* Range check */ | ||
1052 | state->rpm = max(state->rpm, (int)state->mpu.rminn_exhaust_fan); | ||
1053 | state->rpm = min(state->rpm, (int)state->mpu.rmaxn_exhaust_fan); | ||
1054 | |||
1055 | /* Calculate intake fan */ | ||
1056 | intake = (state->rpm * CPU_INTAKE_SCALE) >> 16; | ||
1057 | intake = max(intake, (int)state->mpu.rminn_intake_fan); | ||
1058 | intake = min(intake, (int)state->mpu.rmaxn_intake_fan); | ||
1059 | state->intake_rpm = intake; | ||
1060 | |||
1061 | do_set_fans: | ||
1062 | DBG("** CPU %d RPM: %d Ex, %d In, overtemp: %d\n", | ||
1063 | state->index, (int)state->rpm, intake, state->overtemp); | ||
1064 | |||
1065 | /* We should check for errors, shouldn't we ? But then, what | ||
1066 | * do we do once the error occurs ? For FCU notified fan | ||
1067 | * failures (-EFAULT) we probably want to notify userland | ||
1068 | * some way... | ||
1069 | */ | ||
1070 | if (state->index == 0) { | ||
1071 | set_rpm_fan(CPUA_INTAKE_FAN_RPM_INDEX, intake); | ||
1072 | set_rpm_fan(CPUA_EXHAUST_FAN_RPM_INDEX, state->rpm); | ||
1073 | } else { | ||
1074 | set_rpm_fan(CPUB_INTAKE_FAN_RPM_INDEX, intake); | ||
1075 | set_rpm_fan(CPUB_EXHAUST_FAN_RPM_INDEX, state->rpm); | ||
1076 | } | ||
1077 | } | ||
1078 | |||
1079 | static void do_monitor_cpu_rack(struct cpu_pid_state *state) | ||
1080 | { | ||
1081 | s32 temp, power, fan_min; | ||
1082 | int rc; | ||
1083 | |||
1084 | /* Read current fan status */ | ||
1085 | rc = do_read_one_cpu_values(state, &temp, &power); | ||
1086 | if (rc < 0) { | ||
1087 | /* XXX What do we do now ? */ | ||
1088 | } | ||
1089 | |||
1090 | /* Check tmax, increment overtemp if we are there. At tmax+8, we go | ||
1091 | * full blown immediately and try to trigger a shutdown | ||
1092 | */ | ||
1093 | if (temp >= ((state->mpu.tmax + 8) << 16)) { | ||
1094 | printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum" | ||
1095 | " (%d) !\n", | ||
1096 | state->index, temp >> 16); | ||
1097 | state->overtemp = CPU_MAX_OVERTEMP / 4; | ||
1098 | } else if (temp > (state->mpu.tmax << 16)) { | ||
1099 | state->overtemp++; | ||
1100 | printk(KERN_WARNING "CPU %d temperature %d above max %d. overtemp %d\n", | ||
1101 | state->index, temp >> 16, state->mpu.tmax, state->overtemp); | ||
1102 | } else { | ||
1103 | if (state->overtemp) | ||
1104 | printk(KERN_WARNING "CPU %d temperature back down to %d\n", | ||
1105 | state->index, temp >> 16); | ||
1106 | state->overtemp = 0; | ||
1107 | } | ||
1108 | if (state->overtemp >= CPU_MAX_OVERTEMP) | ||
1109 | critical_state = 1; | ||
1110 | if (state->overtemp > 0) { | ||
1111 | state->rpm = state->intake_rpm = state->mpu.rmaxn_intake_fan; | ||
1112 | goto do_set_fans; | ||
1113 | } | ||
1114 | |||
1115 | /* Do the PID */ | ||
1116 | do_cpu_pid(state, temp, power); | ||
1117 | |||
1118 | /* Check clamp from dimms */ | ||
1119 | fan_min = dimm_output_clamp; | ||
1120 | fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan); | ||
1121 | |||
1122 | DBG(" CPU min mpu = %d, min dimm = %d\n", | ||
1123 | state->mpu.rminn_intake_fan, dimm_output_clamp); | ||
1124 | |||
1125 | state->rpm = max(state->rpm, (int)fan_min); | ||
1126 | state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan); | ||
1127 | state->intake_rpm = state->rpm; | ||
1128 | |||
1129 | do_set_fans: | ||
1130 | DBG("** CPU %d RPM: %d overtemp: %d\n", | ||
1131 | state->index, (int)state->rpm, state->overtemp); | ||
1132 | |||
1133 | /* We should check for errors, shouldn't we ? But then, what | ||
1134 | * do we do once the error occurs ? For FCU notified fan | ||
1135 | * failures (-EFAULT) we probably want to notify userland | ||
1136 | * some way... | ||
1137 | */ | ||
1138 | if (state->index == 0) { | ||
1139 | set_rpm_fan(CPU_A1_FAN_RPM_INDEX, state->rpm); | ||
1140 | set_rpm_fan(CPU_A2_FAN_RPM_INDEX, state->rpm); | ||
1141 | set_rpm_fan(CPU_A3_FAN_RPM_INDEX, state->rpm); | ||
1142 | } else { | ||
1143 | set_rpm_fan(CPU_B1_FAN_RPM_INDEX, state->rpm); | ||
1144 | set_rpm_fan(CPU_B2_FAN_RPM_INDEX, state->rpm); | ||
1145 | set_rpm_fan(CPU_B3_FAN_RPM_INDEX, state->rpm); | ||
1146 | } | ||
1147 | } | ||
1148 | |||
1149 | /* | ||
1150 | * Initialize the state structure for one CPU control loop | ||
1151 | */ | ||
1152 | static int init_processor_state(struct cpu_pid_state *state, int index) | ||
1153 | { | ||
1154 | int err; | ||
1155 | |||
1156 | state->index = index; | ||
1157 | state->first = 1; | ||
1158 | state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000; | ||
1159 | state->overtemp = 0; | ||
1160 | state->adc_config = 0x00; | ||
1161 | |||
1162 | |||
1163 | if (index == 0) | ||
1164 | state->monitor = attach_i2c_chip(SUPPLY_MONITOR_ID, "CPU0_monitor"); | ||
1165 | else if (index == 1) | ||
1166 | state->monitor = attach_i2c_chip(SUPPLY_MONITORB_ID, "CPU1_monitor"); | ||
1167 | if (state->monitor == NULL) | ||
1168 | goto fail; | ||
1169 | |||
1170 | if (read_eeprom(index, &state->mpu)) | ||
1171 | goto fail; | ||
1172 | |||
1173 | state->count_power = state->mpu.tguardband; | ||
1174 | if (state->count_power > CPU_POWER_HISTORY_SIZE) { | ||
1175 | printk(KERN_WARNING "Warning ! too many power history slots\n"); | ||
1176 | state->count_power = CPU_POWER_HISTORY_SIZE; | ||
1177 | } | ||
1178 | DBG("CPU %d Using %d power history entries\n", index, state->count_power); | ||
1179 | |||
1180 | if (index == 0) { | ||
1181 | err = device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature); | ||
1182 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage); | ||
1183 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_current); | ||
1184 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); | ||
1185 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); | ||
1186 | } else { | ||
1187 | err = device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature); | ||
1188 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage); | ||
1189 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_current); | ||
1190 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); | ||
1191 | err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); | ||
1192 | } | ||
1193 | if (err) | ||
1194 | printk(KERN_WARNING "Failed to create some of the attribute" | ||
1195 | "files for CPU %d\n", index); | ||
1196 | |||
1197 | return 0; | ||
1198 | fail: | ||
1199 | state->monitor = NULL; | ||
1200 | |||
1201 | return -ENODEV; | ||
1202 | } | ||
1203 | |||
1204 | /* | ||
1205 | * Dispose of the state data for one CPU control loop | ||
1206 | */ | ||
1207 | static void dispose_processor_state(struct cpu_pid_state *state) | ||
1208 | { | ||
1209 | if (state->monitor == NULL) | ||
1210 | return; | ||
1211 | |||
1212 | if (state->index == 0) { | ||
1213 | device_remove_file(&of_dev->dev, &dev_attr_cpu0_temperature); | ||
1214 | device_remove_file(&of_dev->dev, &dev_attr_cpu0_voltage); | ||
1215 | device_remove_file(&of_dev->dev, &dev_attr_cpu0_current); | ||
1216 | device_remove_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm); | ||
1217 | device_remove_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm); | ||
1218 | } else { | ||
1219 | device_remove_file(&of_dev->dev, &dev_attr_cpu1_temperature); | ||
1220 | device_remove_file(&of_dev->dev, &dev_attr_cpu1_voltage); | ||
1221 | device_remove_file(&of_dev->dev, &dev_attr_cpu1_current); | ||
1222 | device_remove_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm); | ||
1223 | device_remove_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm); | ||
1224 | } | ||
1225 | |||
1226 | state->monitor = NULL; | ||
1227 | } | ||
1228 | |||
1229 | /* | ||
1230 | * Motherboard backside & U3 heatsink fan control loop | ||
1231 | */ | ||
1232 | static void do_monitor_backside(struct backside_pid_state *state) | ||
1233 | { | ||
1234 | s32 temp, integral, derivative, fan_min; | ||
1235 | s64 integ_p, deriv_p, prop_p, sum; | ||
1236 | int i, rc; | ||
1237 | |||
1238 | if (--state->ticks != 0) | ||
1239 | return; | ||
1240 | state->ticks = backside_params.interval; | ||
1241 | |||
1242 | DBG("backside:\n"); | ||
1243 | |||
1244 | /* Check fan status */ | ||
1245 | rc = get_pwm_fan(BACKSIDE_FAN_PWM_INDEX); | ||
1246 | if (rc < 0) { | ||
1247 | printk(KERN_WARNING "Error %d reading backside fan !\n", rc); | ||
1248 | /* XXX What do we do now ? */ | ||
1249 | } else | ||
1250 | state->pwm = rc; | ||
1251 | DBG(" current pwm: %d\n", state->pwm); | ||
1252 | |||
1253 | /* Get some sensor readings */ | ||
1254 | temp = i2c_smbus_read_byte_data(state->monitor, MAX6690_EXT_TEMP) << 16; | ||
1255 | state->last_temp = temp; | ||
1256 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | ||
1257 | FIX32TOPRINT(backside_params.input_target)); | ||
1258 | |||
1259 | /* Store temperature and error in history array */ | ||
1260 | state->cur_sample = (state->cur_sample + 1) % BACKSIDE_PID_HISTORY_SIZE; | ||
1261 | state->sample_history[state->cur_sample] = temp; | ||
1262 | state->error_history[state->cur_sample] = temp - backside_params.input_target; | ||
1263 | |||
1264 | /* If first loop, fill the history table */ | ||
1265 | if (state->first) { | ||
1266 | for (i = 0; i < (BACKSIDE_PID_HISTORY_SIZE - 1); i++) { | ||
1267 | state->cur_sample = (state->cur_sample + 1) % | ||
1268 | BACKSIDE_PID_HISTORY_SIZE; | ||
1269 | state->sample_history[state->cur_sample] = temp; | ||
1270 | state->error_history[state->cur_sample] = | ||
1271 | temp - backside_params.input_target; | ||
1272 | } | ||
1273 | state->first = 0; | ||
1274 | } | ||
1275 | |||
1276 | /* Calculate the integral term */ | ||
1277 | sum = 0; | ||
1278 | integral = 0; | ||
1279 | for (i = 0; i < BACKSIDE_PID_HISTORY_SIZE; i++) | ||
1280 | integral += state->error_history[i]; | ||
1281 | integral *= backside_params.interval; | ||
1282 | DBG(" integral: %08x\n", integral); | ||
1283 | integ_p = ((s64)backside_params.G_r) * (s64)integral; | ||
1284 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
1285 | sum += integ_p; | ||
1286 | |||
1287 | /* Calculate the derivative term */ | ||
1288 | derivative = state->error_history[state->cur_sample] - | ||
1289 | state->error_history[(state->cur_sample + BACKSIDE_PID_HISTORY_SIZE - 1) | ||
1290 | % BACKSIDE_PID_HISTORY_SIZE]; | ||
1291 | derivative /= backside_params.interval; | ||
1292 | deriv_p = ((s64)backside_params.G_d) * (s64)derivative; | ||
1293 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
1294 | sum += deriv_p; | ||
1295 | |||
1296 | /* Calculate the proportional term */ | ||
1297 | prop_p = ((s64)backside_params.G_p) * (s64)(state->error_history[state->cur_sample]); | ||
1298 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
1299 | sum += prop_p; | ||
1300 | |||
1301 | /* Scale sum */ | ||
1302 | sum >>= 36; | ||
1303 | |||
1304 | DBG(" sum: %d\n", (int)sum); | ||
1305 | if (backside_params.additive) | ||
1306 | state->pwm += (s32)sum; | ||
1307 | else | ||
1308 | state->pwm = sum; | ||
1309 | |||
1310 | /* Check for clamp */ | ||
1311 | fan_min = (dimm_output_clamp * 100) / 14000; | ||
1312 | fan_min = max(fan_min, backside_params.output_min); | ||
1313 | |||
1314 | state->pwm = max(state->pwm, fan_min); | ||
1315 | state->pwm = min(state->pwm, backside_params.output_max); | ||
1316 | |||
1317 | DBG("** BACKSIDE PWM: %d\n", (int)state->pwm); | ||
1318 | set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, state->pwm); | ||
1319 | } | ||
1320 | |||
1321 | /* | ||
1322 | * Initialize the state structure for the backside fan control loop | ||
1323 | */ | ||
1324 | static int init_backside_state(struct backside_pid_state *state) | ||
1325 | { | ||
1326 | struct device_node *u3; | ||
1327 | int u3h = 1; /* conservative by default */ | ||
1328 | int err; | ||
1329 | |||
1330 | /* | ||
1331 | * There are different PID params for machines with U3 and machines | ||
1332 | * with U3H, pick the right ones now | ||
1333 | */ | ||
1334 | u3 = of_find_node_by_path("/u3@0,f8000000"); | ||
1335 | if (u3 != NULL) { | ||
1336 | const u32 *vers = of_get_property(u3, "device-rev", NULL); | ||
1337 | if (vers) | ||
1338 | if (((*vers) & 0x3f) < 0x34) | ||
1339 | u3h = 0; | ||
1340 | of_node_put(u3); | ||
1341 | } | ||
1342 | |||
1343 | if (rackmac) { | ||
1344 | backside_params.G_d = BACKSIDE_PID_RACK_G_d; | ||
1345 | backside_params.input_target = BACKSIDE_PID_RACK_INPUT_TARGET; | ||
1346 | backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN; | ||
1347 | backside_params.interval = BACKSIDE_PID_RACK_INTERVAL; | ||
1348 | backside_params.G_p = BACKSIDE_PID_RACK_G_p; | ||
1349 | backside_params.G_r = BACKSIDE_PID_G_r; | ||
1350 | backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; | ||
1351 | backside_params.additive = 0; | ||
1352 | } else if (u3h) { | ||
1353 | backside_params.G_d = BACKSIDE_PID_U3H_G_d; | ||
1354 | backside_params.input_target = BACKSIDE_PID_U3H_INPUT_TARGET; | ||
1355 | backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN; | ||
1356 | backside_params.interval = BACKSIDE_PID_INTERVAL; | ||
1357 | backside_params.G_p = BACKSIDE_PID_G_p; | ||
1358 | backside_params.G_r = BACKSIDE_PID_G_r; | ||
1359 | backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; | ||
1360 | backside_params.additive = 1; | ||
1361 | } else { | ||
1362 | backside_params.G_d = BACKSIDE_PID_U3_G_d; | ||
1363 | backside_params.input_target = BACKSIDE_PID_U3_INPUT_TARGET; | ||
1364 | backside_params.output_min = BACKSIDE_PID_U3_OUTPUT_MIN; | ||
1365 | backside_params.interval = BACKSIDE_PID_INTERVAL; | ||
1366 | backside_params.G_p = BACKSIDE_PID_G_p; | ||
1367 | backside_params.G_r = BACKSIDE_PID_G_r; | ||
1368 | backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX; | ||
1369 | backside_params.additive = 1; | ||
1370 | } | ||
1371 | |||
1372 | state->ticks = 1; | ||
1373 | state->first = 1; | ||
1374 | state->pwm = 50; | ||
1375 | |||
1376 | state->monitor = attach_i2c_chip(BACKSIDE_MAX_ID, "backside_temp"); | ||
1377 | if (state->monitor == NULL) | ||
1378 | return -ENODEV; | ||
1379 | |||
1380 | err = device_create_file(&of_dev->dev, &dev_attr_backside_temperature); | ||
1381 | err |= device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm); | ||
1382 | if (err) | ||
1383 | printk(KERN_WARNING "Failed to create attribute file(s)" | ||
1384 | " for backside fan\n"); | ||
1385 | |||
1386 | return 0; | ||
1387 | } | ||
1388 | |||
1389 | /* | ||
1390 | * Dispose of the state data for the backside control loop | ||
1391 | */ | ||
1392 | static void dispose_backside_state(struct backside_pid_state *state) | ||
1393 | { | ||
1394 | if (state->monitor == NULL) | ||
1395 | return; | ||
1396 | |||
1397 | device_remove_file(&of_dev->dev, &dev_attr_backside_temperature); | ||
1398 | device_remove_file(&of_dev->dev, &dev_attr_backside_fan_pwm); | ||
1399 | |||
1400 | state->monitor = NULL; | ||
1401 | } | ||
1402 | |||
1403 | /* | ||
1404 | * Drives bay fan control loop | ||
1405 | */ | ||
1406 | static void do_monitor_drives(struct drives_pid_state *state) | ||
1407 | { | ||
1408 | s32 temp, integral, derivative; | ||
1409 | s64 integ_p, deriv_p, prop_p, sum; | ||
1410 | int i, rc; | ||
1411 | |||
1412 | if (--state->ticks != 0) | ||
1413 | return; | ||
1414 | state->ticks = DRIVES_PID_INTERVAL; | ||
1415 | |||
1416 | DBG("drives:\n"); | ||
1417 | |||
1418 | /* Check fan status */ | ||
1419 | rc = get_rpm_fan(DRIVES_FAN_RPM_INDEX, !RPM_PID_USE_ACTUAL_SPEED); | ||
1420 | if (rc < 0) { | ||
1421 | printk(KERN_WARNING "Error %d reading drives fan !\n", rc); | ||
1422 | /* XXX What do we do now ? */ | ||
1423 | } else | ||
1424 | state->rpm = rc; | ||
1425 | DBG(" current rpm: %d\n", state->rpm); | ||
1426 | |||
1427 | /* Get some sensor readings */ | ||
1428 | temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, | ||
1429 | DS1775_TEMP)) << 8; | ||
1430 | state->last_temp = temp; | ||
1431 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | ||
1432 | FIX32TOPRINT(DRIVES_PID_INPUT_TARGET)); | ||
1433 | |||
1434 | /* Store temperature and error in history array */ | ||
1435 | state->cur_sample = (state->cur_sample + 1) % DRIVES_PID_HISTORY_SIZE; | ||
1436 | state->sample_history[state->cur_sample] = temp; | ||
1437 | state->error_history[state->cur_sample] = temp - DRIVES_PID_INPUT_TARGET; | ||
1438 | |||
1439 | /* If first loop, fill the history table */ | ||
1440 | if (state->first) { | ||
1441 | for (i = 0; i < (DRIVES_PID_HISTORY_SIZE - 1); i++) { | ||
1442 | state->cur_sample = (state->cur_sample + 1) % | ||
1443 | DRIVES_PID_HISTORY_SIZE; | ||
1444 | state->sample_history[state->cur_sample] = temp; | ||
1445 | state->error_history[state->cur_sample] = | ||
1446 | temp - DRIVES_PID_INPUT_TARGET; | ||
1447 | } | ||
1448 | state->first = 0; | ||
1449 | } | ||
1450 | |||
1451 | /* Calculate the integral term */ | ||
1452 | sum = 0; | ||
1453 | integral = 0; | ||
1454 | for (i = 0; i < DRIVES_PID_HISTORY_SIZE; i++) | ||
1455 | integral += state->error_history[i]; | ||
1456 | integral *= DRIVES_PID_INTERVAL; | ||
1457 | DBG(" integral: %08x\n", integral); | ||
1458 | integ_p = ((s64)DRIVES_PID_G_r) * (s64)integral; | ||
1459 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
1460 | sum += integ_p; | ||
1461 | |||
1462 | /* Calculate the derivative term */ | ||
1463 | derivative = state->error_history[state->cur_sample] - | ||
1464 | state->error_history[(state->cur_sample + DRIVES_PID_HISTORY_SIZE - 1) | ||
1465 | % DRIVES_PID_HISTORY_SIZE]; | ||
1466 | derivative /= DRIVES_PID_INTERVAL; | ||
1467 | deriv_p = ((s64)DRIVES_PID_G_d) * (s64)derivative; | ||
1468 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
1469 | sum += deriv_p; | ||
1470 | |||
1471 | /* Calculate the proportional term */ | ||
1472 | prop_p = ((s64)DRIVES_PID_G_p) * (s64)(state->error_history[state->cur_sample]); | ||
1473 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
1474 | sum += prop_p; | ||
1475 | |||
1476 | /* Scale sum */ | ||
1477 | sum >>= 36; | ||
1478 | |||
1479 | DBG(" sum: %d\n", (int)sum); | ||
1480 | state->rpm += (s32)sum; | ||
1481 | |||
1482 | state->rpm = max(state->rpm, DRIVES_PID_OUTPUT_MIN); | ||
1483 | state->rpm = min(state->rpm, DRIVES_PID_OUTPUT_MAX); | ||
1484 | |||
1485 | DBG("** DRIVES RPM: %d\n", (int)state->rpm); | ||
1486 | set_rpm_fan(DRIVES_FAN_RPM_INDEX, state->rpm); | ||
1487 | } | ||
1488 | |||
1489 | /* | ||
1490 | * Initialize the state structure for the drives bay fan control loop | ||
1491 | */ | ||
1492 | static int init_drives_state(struct drives_pid_state *state) | ||
1493 | { | ||
1494 | int err; | ||
1495 | |||
1496 | state->ticks = 1; | ||
1497 | state->first = 1; | ||
1498 | state->rpm = 1000; | ||
1499 | |||
1500 | state->monitor = attach_i2c_chip(DRIVES_DALLAS_ID, "drives_temp"); | ||
1501 | if (state->monitor == NULL) | ||
1502 | return -ENODEV; | ||
1503 | |||
1504 | err = device_create_file(&of_dev->dev, &dev_attr_drives_temperature); | ||
1505 | err |= device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm); | ||
1506 | if (err) | ||
1507 | printk(KERN_WARNING "Failed to create attribute file(s)" | ||
1508 | " for drives bay fan\n"); | ||
1509 | |||
1510 | return 0; | ||
1511 | } | ||
1512 | |||
1513 | /* | ||
1514 | * Dispose of the state data for the drives control loop | ||
1515 | */ | ||
1516 | static void dispose_drives_state(struct drives_pid_state *state) | ||
1517 | { | ||
1518 | if (state->monitor == NULL) | ||
1519 | return; | ||
1520 | |||
1521 | device_remove_file(&of_dev->dev, &dev_attr_drives_temperature); | ||
1522 | device_remove_file(&of_dev->dev, &dev_attr_drives_fan_rpm); | ||
1523 | |||
1524 | state->monitor = NULL; | ||
1525 | } | ||
1526 | |||
1527 | /* | ||
1528 | * DIMMs temp control loop | ||
1529 | */ | ||
1530 | static void do_monitor_dimms(struct dimm_pid_state *state) | ||
1531 | { | ||
1532 | s32 temp, integral, derivative, fan_min; | ||
1533 | s64 integ_p, deriv_p, prop_p, sum; | ||
1534 | int i; | ||
1535 | |||
1536 | if (--state->ticks != 0) | ||
1537 | return; | ||
1538 | state->ticks = DIMM_PID_INTERVAL; | ||
1539 | |||
1540 | DBG("DIMM:\n"); | ||
1541 | |||
1542 | DBG(" current value: %d\n", state->output); | ||
1543 | |||
1544 | temp = read_lm87_reg(state->monitor, LM87_INT_TEMP); | ||
1545 | if (temp < 0) | ||
1546 | return; | ||
1547 | temp <<= 16; | ||
1548 | state->last_temp = temp; | ||
1549 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | ||
1550 | FIX32TOPRINT(DIMM_PID_INPUT_TARGET)); | ||
1551 | |||
1552 | /* Store temperature and error in history array */ | ||
1553 | state->cur_sample = (state->cur_sample + 1) % DIMM_PID_HISTORY_SIZE; | ||
1554 | state->sample_history[state->cur_sample] = temp; | ||
1555 | state->error_history[state->cur_sample] = temp - DIMM_PID_INPUT_TARGET; | ||
1556 | |||
1557 | /* If first loop, fill the history table */ | ||
1558 | if (state->first) { | ||
1559 | for (i = 0; i < (DIMM_PID_HISTORY_SIZE - 1); i++) { | ||
1560 | state->cur_sample = (state->cur_sample + 1) % | ||
1561 | DIMM_PID_HISTORY_SIZE; | ||
1562 | state->sample_history[state->cur_sample] = temp; | ||
1563 | state->error_history[state->cur_sample] = | ||
1564 | temp - DIMM_PID_INPUT_TARGET; | ||
1565 | } | ||
1566 | state->first = 0; | ||
1567 | } | ||
1568 | |||
1569 | /* Calculate the integral term */ | ||
1570 | sum = 0; | ||
1571 | integral = 0; | ||
1572 | for (i = 0; i < DIMM_PID_HISTORY_SIZE; i++) | ||
1573 | integral += state->error_history[i]; | ||
1574 | integral *= DIMM_PID_INTERVAL; | ||
1575 | DBG(" integral: %08x\n", integral); | ||
1576 | integ_p = ((s64)DIMM_PID_G_r) * (s64)integral; | ||
1577 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
1578 | sum += integ_p; | ||
1579 | |||
1580 | /* Calculate the derivative term */ | ||
1581 | derivative = state->error_history[state->cur_sample] - | ||
1582 | state->error_history[(state->cur_sample + DIMM_PID_HISTORY_SIZE - 1) | ||
1583 | % DIMM_PID_HISTORY_SIZE]; | ||
1584 | derivative /= DIMM_PID_INTERVAL; | ||
1585 | deriv_p = ((s64)DIMM_PID_G_d) * (s64)derivative; | ||
1586 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
1587 | sum += deriv_p; | ||
1588 | |||
1589 | /* Calculate the proportional term */ | ||
1590 | prop_p = ((s64)DIMM_PID_G_p) * (s64)(state->error_history[state->cur_sample]); | ||
1591 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
1592 | sum += prop_p; | ||
1593 | |||
1594 | /* Scale sum */ | ||
1595 | sum >>= 36; | ||
1596 | |||
1597 | DBG(" sum: %d\n", (int)sum); | ||
1598 | state->output = (s32)sum; | ||
1599 | state->output = max(state->output, DIMM_PID_OUTPUT_MIN); | ||
1600 | state->output = min(state->output, DIMM_PID_OUTPUT_MAX); | ||
1601 | dimm_output_clamp = state->output; | ||
1602 | |||
1603 | DBG("** DIMM clamp value: %d\n", (int)state->output); | ||
1604 | |||
1605 | /* Backside PID is only every 5 seconds, force backside fan clamping now */ | ||
1606 | fan_min = (dimm_output_clamp * 100) / 14000; | ||
1607 | fan_min = max(fan_min, backside_params.output_min); | ||
1608 | if (backside_state.pwm < fan_min) { | ||
1609 | backside_state.pwm = fan_min; | ||
1610 | DBG(" -> applying clamp to backside fan now: %d !\n", fan_min); | ||
1611 | set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, fan_min); | ||
1612 | } | ||
1613 | } | ||
1614 | |||
1615 | /* | ||
1616 | * Initialize the state structure for the DIMM temp control loop | ||
1617 | */ | ||
1618 | static int init_dimms_state(struct dimm_pid_state *state) | ||
1619 | { | ||
1620 | state->ticks = 1; | ||
1621 | state->first = 1; | ||
1622 | state->output = 4000; | ||
1623 | |||
1624 | state->monitor = attach_i2c_chip(XSERVE_DIMMS_LM87, "dimms_temp"); | ||
1625 | if (state->monitor == NULL) | ||
1626 | return -ENODEV; | ||
1627 | |||
1628 | if (device_create_file(&of_dev->dev, &dev_attr_dimms_temperature)) | ||
1629 | printk(KERN_WARNING "Failed to create attribute file" | ||
1630 | " for DIMM temperature\n"); | ||
1631 | |||
1632 | return 0; | ||
1633 | } | ||
1634 | |||
1635 | /* | ||
1636 | * Dispose of the state data for the DIMM control loop | ||
1637 | */ | ||
1638 | static void dispose_dimms_state(struct dimm_pid_state *state) | ||
1639 | { | ||
1640 | if (state->monitor == NULL) | ||
1641 | return; | ||
1642 | |||
1643 | device_remove_file(&of_dev->dev, &dev_attr_dimms_temperature); | ||
1644 | |||
1645 | state->monitor = NULL; | ||
1646 | } | ||
1647 | |||
1648 | /* | ||
1649 | * Slots fan control loop | ||
1650 | */ | ||
1651 | static void do_monitor_slots(struct slots_pid_state *state) | ||
1652 | { | ||
1653 | s32 temp, integral, derivative; | ||
1654 | s64 integ_p, deriv_p, prop_p, sum; | ||
1655 | int i, rc; | ||
1656 | |||
1657 | if (--state->ticks != 0) | ||
1658 | return; | ||
1659 | state->ticks = SLOTS_PID_INTERVAL; | ||
1660 | |||
1661 | DBG("slots:\n"); | ||
1662 | |||
1663 | /* Check fan status */ | ||
1664 | rc = get_pwm_fan(SLOTS_FAN_PWM_INDEX); | ||
1665 | if (rc < 0) { | ||
1666 | printk(KERN_WARNING "Error %d reading slots fan !\n", rc); | ||
1667 | /* XXX What do we do now ? */ | ||
1668 | } else | ||
1669 | state->pwm = rc; | ||
1670 | DBG(" current pwm: %d\n", state->pwm); | ||
1671 | |||
1672 | /* Get some sensor readings */ | ||
1673 | temp = le16_to_cpu(i2c_smbus_read_word_data(state->monitor, | ||
1674 | DS1775_TEMP)) << 8; | ||
1675 | state->last_temp = temp; | ||
1676 | DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp), | ||
1677 | FIX32TOPRINT(SLOTS_PID_INPUT_TARGET)); | ||
1678 | |||
1679 | /* Store temperature and error in history array */ | ||
1680 | state->cur_sample = (state->cur_sample + 1) % SLOTS_PID_HISTORY_SIZE; | ||
1681 | state->sample_history[state->cur_sample] = temp; | ||
1682 | state->error_history[state->cur_sample] = temp - SLOTS_PID_INPUT_TARGET; | ||
1683 | |||
1684 | /* If first loop, fill the history table */ | ||
1685 | if (state->first) { | ||
1686 | for (i = 0; i < (SLOTS_PID_HISTORY_SIZE - 1); i++) { | ||
1687 | state->cur_sample = (state->cur_sample + 1) % | ||
1688 | SLOTS_PID_HISTORY_SIZE; | ||
1689 | state->sample_history[state->cur_sample] = temp; | ||
1690 | state->error_history[state->cur_sample] = | ||
1691 | temp - SLOTS_PID_INPUT_TARGET; | ||
1692 | } | ||
1693 | state->first = 0; | ||
1694 | } | ||
1695 | |||
1696 | /* Calculate the integral term */ | ||
1697 | sum = 0; | ||
1698 | integral = 0; | ||
1699 | for (i = 0; i < SLOTS_PID_HISTORY_SIZE; i++) | ||
1700 | integral += state->error_history[i]; | ||
1701 | integral *= SLOTS_PID_INTERVAL; | ||
1702 | DBG(" integral: %08x\n", integral); | ||
1703 | integ_p = ((s64)SLOTS_PID_G_r) * (s64)integral; | ||
1704 | DBG(" integ_p: %d\n", (int)(integ_p >> 36)); | ||
1705 | sum += integ_p; | ||
1706 | |||
1707 | /* Calculate the derivative term */ | ||
1708 | derivative = state->error_history[state->cur_sample] - | ||
1709 | state->error_history[(state->cur_sample + SLOTS_PID_HISTORY_SIZE - 1) | ||
1710 | % SLOTS_PID_HISTORY_SIZE]; | ||
1711 | derivative /= SLOTS_PID_INTERVAL; | ||
1712 | deriv_p = ((s64)SLOTS_PID_G_d) * (s64)derivative; | ||
1713 | DBG(" deriv_p: %d\n", (int)(deriv_p >> 36)); | ||
1714 | sum += deriv_p; | ||
1715 | |||
1716 | /* Calculate the proportional term */ | ||
1717 | prop_p = ((s64)SLOTS_PID_G_p) * (s64)(state->error_history[state->cur_sample]); | ||
1718 | DBG(" prop_p: %d\n", (int)(prop_p >> 36)); | ||
1719 | sum += prop_p; | ||
1720 | |||
1721 | /* Scale sum */ | ||
1722 | sum >>= 36; | ||
1723 | |||
1724 | DBG(" sum: %d\n", (int)sum); | ||
1725 | state->pwm = (s32)sum; | ||
1726 | |||
1727 | state->pwm = max(state->pwm, SLOTS_PID_OUTPUT_MIN); | ||
1728 | state->pwm = min(state->pwm, SLOTS_PID_OUTPUT_MAX); | ||
1729 | |||
1730 | DBG("** DRIVES PWM: %d\n", (int)state->pwm); | ||
1731 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, state->pwm); | ||
1732 | } | ||
1733 | |||
1734 | /* | ||
1735 | * Initialize the state structure for the slots bay fan control loop | ||
1736 | */ | ||
1737 | static int init_slots_state(struct slots_pid_state *state) | ||
1738 | { | ||
1739 | int err; | ||
1740 | |||
1741 | state->ticks = 1; | ||
1742 | state->first = 1; | ||
1743 | state->pwm = 50; | ||
1744 | |||
1745 | state->monitor = attach_i2c_chip(XSERVE_SLOTS_LM75, "slots_temp"); | ||
1746 | if (state->monitor == NULL) | ||
1747 | return -ENODEV; | ||
1748 | |||
1749 | err = device_create_file(&of_dev->dev, &dev_attr_slots_temperature); | ||
1750 | err |= device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm); | ||
1751 | if (err) | ||
1752 | printk(KERN_WARNING "Failed to create attribute file(s)" | ||
1753 | " for slots bay fan\n"); | ||
1754 | |||
1755 | return 0; | ||
1756 | } | ||
1757 | |||
1758 | /* | ||
1759 | * Dispose of the state data for the slots control loop | ||
1760 | */ | ||
1761 | static void dispose_slots_state(struct slots_pid_state *state) | ||
1762 | { | ||
1763 | if (state->monitor == NULL) | ||
1764 | return; | ||
1765 | |||
1766 | device_remove_file(&of_dev->dev, &dev_attr_slots_temperature); | ||
1767 | device_remove_file(&of_dev->dev, &dev_attr_slots_fan_pwm); | ||
1768 | |||
1769 | state->monitor = NULL; | ||
1770 | } | ||
1771 | |||
1772 | |||
1773 | static int call_critical_overtemp(void) | ||
1774 | { | ||
1775 | char *argv[] = { critical_overtemp_path, NULL }; | ||
1776 | static char *envp[] = { "HOME=/", | ||
1777 | "TERM=linux", | ||
1778 | "PATH=/sbin:/usr/sbin:/bin:/usr/bin", | ||
1779 | NULL }; | ||
1780 | |||
1781 | return call_usermodehelper(critical_overtemp_path, | ||
1782 | argv, envp, UMH_WAIT_EXEC); | ||
1783 | } | ||
1784 | |||
1785 | |||
1786 | /* | ||
1787 | * Here's the kernel thread that calls the various control loops | ||
1788 | */ | ||
1789 | static int main_control_loop(void *x) | ||
1790 | { | ||
1791 | DBG("main_control_loop started\n"); | ||
1792 | |||
1793 | mutex_lock(&driver_lock); | ||
1794 | |||
1795 | if (start_fcu() < 0) { | ||
1796 | printk(KERN_ERR "kfand: failed to start FCU\n"); | ||
1797 | mutex_unlock(&driver_lock); | ||
1798 | goto out; | ||
1799 | } | ||
1800 | |||
1801 | /* Set the PCI fan once for now on non-RackMac */ | ||
1802 | if (!rackmac) | ||
1803 | set_pwm_fan(SLOTS_FAN_PWM_INDEX, SLOTS_FAN_DEFAULT_PWM); | ||
1804 | |||
1805 | /* Initialize ADCs */ | ||
1806 | initialize_adc(&processor_state[0]); | ||
1807 | if (processor_state[1].monitor != NULL) | ||
1808 | initialize_adc(&processor_state[1]); | ||
1809 | |||
1810 | fcu_tickle_ticks = FCU_TICKLE_TICKS; | ||
1811 | |||
1812 | mutex_unlock(&driver_lock); | ||
1813 | |||
1814 | while (state == state_attached) { | ||
1815 | unsigned long elapsed, start; | ||
1816 | |||
1817 | start = jiffies; | ||
1818 | |||
1819 | mutex_lock(&driver_lock); | ||
1820 | |||
1821 | /* Tickle the FCU just in case */ | ||
1822 | if (--fcu_tickle_ticks < 0) { | ||
1823 | fcu_tickle_ticks = FCU_TICKLE_TICKS; | ||
1824 | tickle_fcu(); | ||
1825 | } | ||
1826 | |||
1827 | /* First, we always calculate the new DIMMs state on an Xserve */ | ||
1828 | if (rackmac) | ||
1829 | do_monitor_dimms(&dimms_state); | ||
1830 | |||
1831 | /* Then, the CPUs */ | ||
1832 | if (cpu_pid_type == CPU_PID_TYPE_COMBINED) | ||
1833 | do_monitor_cpu_combined(); | ||
1834 | else if (cpu_pid_type == CPU_PID_TYPE_RACKMAC) { | ||
1835 | do_monitor_cpu_rack(&processor_state[0]); | ||
1836 | if (processor_state[1].monitor != NULL) | ||
1837 | do_monitor_cpu_rack(&processor_state[1]); | ||
1838 | // better deal with UP | ||
1839 | } else { | ||
1840 | do_monitor_cpu_split(&processor_state[0]); | ||
1841 | if (processor_state[1].monitor != NULL) | ||
1842 | do_monitor_cpu_split(&processor_state[1]); | ||
1843 | // better deal with UP | ||
1844 | } | ||
1845 | /* Then, the rest */ | ||
1846 | do_monitor_backside(&backside_state); | ||
1847 | if (rackmac) | ||
1848 | do_monitor_slots(&slots_state); | ||
1849 | else | ||
1850 | do_monitor_drives(&drives_state); | ||
1851 | mutex_unlock(&driver_lock); | ||
1852 | |||
1853 | if (critical_state == 1) { | ||
1854 | printk(KERN_WARNING "Temperature control detected a critical condition\n"); | ||
1855 | printk(KERN_WARNING "Attempting to shut down...\n"); | ||
1856 | if (call_critical_overtemp()) { | ||
1857 | printk(KERN_WARNING "Can't call %s, power off now!\n", | ||
1858 | critical_overtemp_path); | ||
1859 | machine_power_off(); | ||
1860 | } | ||
1861 | } | ||
1862 | if (critical_state > 0) | ||
1863 | critical_state++; | ||
1864 | if (critical_state > MAX_CRITICAL_STATE) { | ||
1865 | printk(KERN_WARNING "Shutdown timed out, power off now !\n"); | ||
1866 | machine_power_off(); | ||
1867 | } | ||
1868 | |||
1869 | // FIXME: Deal with signals | ||
1870 | elapsed = jiffies - start; | ||
1871 | if (elapsed < HZ) | ||
1872 | schedule_timeout_interruptible(HZ - elapsed); | ||
1873 | } | ||
1874 | |||
1875 | out: | ||
1876 | DBG("main_control_loop ended\n"); | ||
1877 | |||
1878 | ctrl_task = 0; | ||
1879 | complete_and_exit(&ctrl_complete, 0); | ||
1880 | } | ||
1881 | |||
1882 | /* | ||
1883 | * Dispose the control loops when tearing down | ||
1884 | */ | ||
1885 | static void dispose_control_loops(void) | ||
1886 | { | ||
1887 | dispose_processor_state(&processor_state[0]); | ||
1888 | dispose_processor_state(&processor_state[1]); | ||
1889 | dispose_backside_state(&backside_state); | ||
1890 | dispose_drives_state(&drives_state); | ||
1891 | dispose_slots_state(&slots_state); | ||
1892 | dispose_dimms_state(&dimms_state); | ||
1893 | } | ||
1894 | |||
1895 | /* | ||
1896 | * Create the control loops. U3-0 i2c bus is up, so we can now | ||
1897 | * get to the various sensors | ||
1898 | */ | ||
1899 | static int create_control_loops(void) | ||
1900 | { | ||
1901 | struct device_node *np; | ||
1902 | |||
1903 | /* Count CPUs from the device-tree, we don't care how many are | ||
1904 | * actually used by Linux | ||
1905 | */ | ||
1906 | cpu_count = 0; | ||
1907 | for (np = NULL; NULL != (np = of_find_node_by_type(np, "cpu"));) | ||
1908 | cpu_count++; | ||
1909 | |||
1910 | DBG("counted %d CPUs in the device-tree\n", cpu_count); | ||
1911 | |||
1912 | /* Decide the type of PID algorithm to use based on the presence of | ||
1913 | * the pumps, though that may not be the best way, that is good enough | ||
1914 | * for now | ||
1915 | */ | ||
1916 | if (rackmac) | ||
1917 | cpu_pid_type = CPU_PID_TYPE_RACKMAC; | ||
1918 | else if (of_machine_is_compatible("PowerMac7,3") | ||
1919 | && (cpu_count > 1) | ||
1920 | && fcu_fans[CPUA_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID | ||
1921 | && fcu_fans[CPUB_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) { | ||
1922 | printk(KERN_INFO "Liquid cooling pumps detected, using new algorithm !\n"); | ||
1923 | cpu_pid_type = CPU_PID_TYPE_COMBINED; | ||
1924 | } else | ||
1925 | cpu_pid_type = CPU_PID_TYPE_SPLIT; | ||
1926 | |||
1927 | /* Create control loops for everything. If any fail, everything | ||
1928 | * fails | ||
1929 | */ | ||
1930 | if (init_processor_state(&processor_state[0], 0)) | ||
1931 | goto fail; | ||
1932 | if (cpu_pid_type == CPU_PID_TYPE_COMBINED) | ||
1933 | fetch_cpu_pumps_minmax(); | ||
1934 | |||
1935 | if (cpu_count > 1 && init_processor_state(&processor_state[1], 1)) | ||
1936 | goto fail; | ||
1937 | if (init_backside_state(&backside_state)) | ||
1938 | goto fail; | ||
1939 | if (rackmac && init_dimms_state(&dimms_state)) | ||
1940 | goto fail; | ||
1941 | if (rackmac && init_slots_state(&slots_state)) | ||
1942 | goto fail; | ||
1943 | if (!rackmac && init_drives_state(&drives_state)) | ||
1944 | goto fail; | ||
1945 | |||
1946 | DBG("all control loops up !\n"); | ||
1947 | |||
1948 | return 0; | ||
1949 | |||
1950 | fail: | ||
1951 | DBG("failure creating control loops, disposing\n"); | ||
1952 | |||
1953 | dispose_control_loops(); | ||
1954 | |||
1955 | return -ENODEV; | ||
1956 | } | ||
1957 | |||
1958 | /* | ||
1959 | * Start the control loops after everything is up, that is create | ||
1960 | * the thread that will make them run | ||
1961 | */ | ||
1962 | static void start_control_loops(void) | ||
1963 | { | ||
1964 | init_completion(&ctrl_complete); | ||
1965 | |||
1966 | ctrl_task = kthread_run(main_control_loop, NULL, "kfand"); | ||
1967 | } | ||
1968 | |||
1969 | /* | ||
1970 | * Stop the control loops when tearing down | ||
1971 | */ | ||
1972 | static void stop_control_loops(void) | ||
1973 | { | ||
1974 | if (ctrl_task) | ||
1975 | wait_for_completion(&ctrl_complete); | ||
1976 | } | ||
1977 | |||
1978 | /* | ||
1979 | * Attach to the i2c FCU after detecting U3-1 bus | ||
1980 | */ | ||
1981 | static int attach_fcu(void) | ||
1982 | { | ||
1983 | fcu = attach_i2c_chip(FAN_CTRLER_ID, "fcu"); | ||
1984 | if (fcu == NULL) | ||
1985 | return -ENODEV; | ||
1986 | |||
1987 | DBG("FCU attached\n"); | ||
1988 | |||
1989 | return 0; | ||
1990 | } | ||
1991 | |||
1992 | /* | ||
1993 | * Detach from the i2c FCU when tearing down | ||
1994 | */ | ||
1995 | static void detach_fcu(void) | ||
1996 | { | ||
1997 | fcu = NULL; | ||
1998 | } | ||
1999 | |||
2000 | /* | ||
2001 | * Attach to the i2c controller. We probe the various chips based | ||
2002 | * on the device-tree nodes and build everything for the driver to | ||
2003 | * run, we then kick the driver monitoring thread | ||
2004 | */ | ||
2005 | static int therm_pm72_attach(struct i2c_adapter *adapter) | ||
2006 | { | ||
2007 | mutex_lock(&driver_lock); | ||
2008 | |||
2009 | /* Check state */ | ||
2010 | if (state == state_detached) | ||
2011 | state = state_attaching; | ||
2012 | if (state != state_attaching) { | ||
2013 | mutex_unlock(&driver_lock); | ||
2014 | return 0; | ||
2015 | } | ||
2016 | |||
2017 | /* Check if we are looking for one of these */ | ||
2018 | if (u3_0 == NULL && !strcmp(adapter->name, "u3 0")) { | ||
2019 | u3_0 = adapter; | ||
2020 | DBG("found U3-0\n"); | ||
2021 | if (k2 || !rackmac) | ||
2022 | if (create_control_loops()) | ||
2023 | u3_0 = NULL; | ||
2024 | } else if (u3_1 == NULL && !strcmp(adapter->name, "u3 1")) { | ||
2025 | u3_1 = adapter; | ||
2026 | DBG("found U3-1, attaching FCU\n"); | ||
2027 | if (attach_fcu()) | ||
2028 | u3_1 = NULL; | ||
2029 | } else if (k2 == NULL && !strcmp(adapter->name, "mac-io 0")) { | ||
2030 | k2 = adapter; | ||
2031 | DBG("Found K2\n"); | ||
2032 | if (u3_0 && rackmac) | ||
2033 | if (create_control_loops()) | ||
2034 | k2 = NULL; | ||
2035 | } | ||
2036 | /* We got all we need, start control loops */ | ||
2037 | if (u3_0 != NULL && u3_1 != NULL && (k2 || !rackmac)) { | ||
2038 | DBG("everything up, starting control loops\n"); | ||
2039 | state = state_attached; | ||
2040 | start_control_loops(); | ||
2041 | } | ||
2042 | mutex_unlock(&driver_lock); | ||
2043 | |||
2044 | return 0; | ||
2045 | } | ||
2046 | |||
2047 | static int therm_pm72_probe(struct i2c_client *client, | ||
2048 | const struct i2c_device_id *id) | ||
2049 | { | ||
2050 | /* Always succeed, the real work was done in therm_pm72_attach() */ | ||
2051 | return 0; | ||
2052 | } | ||
2053 | |||
2054 | /* | ||
2055 | * Called when any of the devices which participates into thermal management | ||
2056 | * is going away. | ||
2057 | */ | ||
2058 | static int therm_pm72_remove(struct i2c_client *client) | ||
2059 | { | ||
2060 | struct i2c_adapter *adapter = client->adapter; | ||
2061 | |||
2062 | mutex_lock(&driver_lock); | ||
2063 | |||
2064 | if (state != state_detached) | ||
2065 | state = state_detaching; | ||
2066 | |||
2067 | /* Stop control loops if any */ | ||
2068 | DBG("stopping control loops\n"); | ||
2069 | mutex_unlock(&driver_lock); | ||
2070 | stop_control_loops(); | ||
2071 | mutex_lock(&driver_lock); | ||
2072 | |||
2073 | if (u3_0 != NULL && !strcmp(adapter->name, "u3 0")) { | ||
2074 | DBG("lost U3-0, disposing control loops\n"); | ||
2075 | dispose_control_loops(); | ||
2076 | u3_0 = NULL; | ||
2077 | } | ||
2078 | |||
2079 | if (u3_1 != NULL && !strcmp(adapter->name, "u3 1")) { | ||
2080 | DBG("lost U3-1, detaching FCU\n"); | ||
2081 | detach_fcu(); | ||
2082 | u3_1 = NULL; | ||
2083 | } | ||
2084 | if (u3_0 == NULL && u3_1 == NULL) | ||
2085 | state = state_detached; | ||
2086 | |||
2087 | mutex_unlock(&driver_lock); | ||
2088 | |||
2089 | return 0; | ||
2090 | } | ||
2091 | |||
2092 | /* | ||
2093 | * i2c_driver structure to attach to the host i2c controller | ||
2094 | */ | ||
2095 | |||
2096 | static const struct i2c_device_id therm_pm72_id[] = { | ||
2097 | /* | ||
2098 | * Fake device name, thermal management is done by several | ||
2099 | * chips but we don't need to differentiate between them at | ||
2100 | * this point. | ||
2101 | */ | ||
2102 | { "therm_pm72", 0 }, | ||
2103 | { } | ||
2104 | }; | ||
2105 | |||
2106 | static struct i2c_driver therm_pm72_driver = { | ||
2107 | .driver = { | ||
2108 | .name = "therm_pm72", | ||
2109 | }, | ||
2110 | .attach_adapter = therm_pm72_attach, | ||
2111 | .probe = therm_pm72_probe, | ||
2112 | .remove = therm_pm72_remove, | ||
2113 | .id_table = therm_pm72_id, | ||
2114 | }; | ||
2115 | |||
2116 | static int fan_check_loc_match(const char *loc, int fan) | ||
2117 | { | ||
2118 | char tmp[64]; | ||
2119 | char *c, *e; | ||
2120 | |||
2121 | strlcpy(tmp, fcu_fans[fan].loc, 64); | ||
2122 | |||
2123 | c = tmp; | ||
2124 | for (;;) { | ||
2125 | e = strchr(c, ','); | ||
2126 | if (e) | ||
2127 | *e = 0; | ||
2128 | if (strcmp(loc, c) == 0) | ||
2129 | return 1; | ||
2130 | if (e == NULL) | ||
2131 | break; | ||
2132 | c = e + 1; | ||
2133 | } | ||
2134 | return 0; | ||
2135 | } | ||
2136 | |||
2137 | static void fcu_lookup_fans(struct device_node *fcu_node) | ||
2138 | { | ||
2139 | struct device_node *np = NULL; | ||
2140 | int i; | ||
2141 | |||
2142 | /* The table is filled by default with values that are suitable | ||
2143 | * for the old machines without device-tree informations. We scan | ||
2144 | * the device-tree and override those values with whatever is | ||
2145 | * there | ||
2146 | */ | ||
2147 | |||
2148 | DBG("Looking up FCU controls in device-tree...\n"); | ||
2149 | |||
2150 | while ((np = of_get_next_child(fcu_node, np)) != NULL) { | ||
2151 | int type = -1; | ||
2152 | const char *loc; | ||
2153 | const u32 *reg; | ||
2154 | |||
2155 | DBG(" control: %s, type: %s\n", np->name, np->type); | ||
2156 | |||
2157 | /* Detect control type */ | ||
2158 | if (!strcmp(np->type, "fan-rpm-control") || | ||
2159 | !strcmp(np->type, "fan-rpm")) | ||
2160 | type = FCU_FAN_RPM; | ||
2161 | if (!strcmp(np->type, "fan-pwm-control") || | ||
2162 | !strcmp(np->type, "fan-pwm")) | ||
2163 | type = FCU_FAN_PWM; | ||
2164 | /* Only care about fans for now */ | ||
2165 | if (type == -1) | ||
2166 | continue; | ||
2167 | |||
2168 | /* Lookup for a matching location */ | ||
2169 | loc = of_get_property(np, "location", NULL); | ||
2170 | reg = of_get_property(np, "reg", NULL); | ||
2171 | if (loc == NULL || reg == NULL) | ||
2172 | continue; | ||
2173 | DBG(" matching location: %s, reg: 0x%08x\n", loc, *reg); | ||
2174 | |||
2175 | for (i = 0; i < FCU_FAN_COUNT; i++) { | ||
2176 | int fan_id; | ||
2177 | |||
2178 | if (!fan_check_loc_match(loc, i)) | ||
2179 | continue; | ||
2180 | DBG(" location match, index: %d\n", i); | ||
2181 | fcu_fans[i].id = FCU_FAN_ABSENT_ID; | ||
2182 | if (type != fcu_fans[i].type) { | ||
2183 | printk(KERN_WARNING "therm_pm72: Fan type mismatch " | ||
2184 | "in device-tree for %s\n", np->full_name); | ||
2185 | break; | ||
2186 | } | ||
2187 | if (type == FCU_FAN_RPM) | ||
2188 | fan_id = ((*reg) - 0x10) / 2; | ||
2189 | else | ||
2190 | fan_id = ((*reg) - 0x30) / 2; | ||
2191 | if (fan_id > 7) { | ||
2192 | printk(KERN_WARNING "therm_pm72: Can't parse " | ||
2193 | "fan ID in device-tree for %s\n", np->full_name); | ||
2194 | break; | ||
2195 | } | ||
2196 | DBG(" fan id -> %d, type -> %d\n", fan_id, type); | ||
2197 | fcu_fans[i].id = fan_id; | ||
2198 | } | ||
2199 | } | ||
2200 | |||
2201 | /* Now dump the array */ | ||
2202 | printk(KERN_INFO "Detected fan controls:\n"); | ||
2203 | for (i = 0; i < FCU_FAN_COUNT; i++) { | ||
2204 | if (fcu_fans[i].id == FCU_FAN_ABSENT_ID) | ||
2205 | continue; | ||
2206 | printk(KERN_INFO " %d: %s fan, id %d, location: %s\n", i, | ||
2207 | fcu_fans[i].type == FCU_FAN_RPM ? "RPM" : "PWM", | ||
2208 | fcu_fans[i].id, fcu_fans[i].loc); | ||
2209 | } | ||
2210 | } | ||
2211 | |||
2212 | static int fcu_of_probe(struct platform_device* dev) | ||
2213 | { | ||
2214 | state = state_detached; | ||
2215 | of_dev = dev; | ||
2216 | |||
2217 | dev_info(&dev->dev, "PowerMac G5 Thermal control driver %s\n", VERSION); | ||
2218 | |||
2219 | /* Lookup the fans in the device tree */ | ||
2220 | fcu_lookup_fans(dev->dev.of_node); | ||
2221 | |||
2222 | /* Add the driver */ | ||
2223 | return i2c_add_driver(&therm_pm72_driver); | ||
2224 | } | ||
2225 | |||
2226 | static int fcu_of_remove(struct platform_device* dev) | ||
2227 | { | ||
2228 | i2c_del_driver(&therm_pm72_driver); | ||
2229 | |||
2230 | return 0; | ||
2231 | } | ||
2232 | |||
2233 | static const struct of_device_id fcu_match[] = | ||
2234 | { | ||
2235 | { | ||
2236 | .type = "fcu", | ||
2237 | }, | ||
2238 | {}, | ||
2239 | }; | ||
2240 | MODULE_DEVICE_TABLE(of, fcu_match); | ||
2241 | |||
2242 | static struct platform_driver fcu_of_platform_driver = | ||
2243 | { | ||
2244 | .driver = { | ||
2245 | .name = "temperature", | ||
2246 | .of_match_table = fcu_match, | ||
2247 | }, | ||
2248 | .probe = fcu_of_probe, | ||
2249 | .remove = fcu_of_remove | ||
2250 | }; | ||
2251 | |||
2252 | /* | ||
2253 | * Check machine type, attach to i2c controller | ||
2254 | */ | ||
2255 | static int __init therm_pm72_init(void) | ||
2256 | { | ||
2257 | rackmac = of_machine_is_compatible("RackMac3,1"); | ||
2258 | |||
2259 | if (!of_machine_is_compatible("PowerMac7,2") && | ||
2260 | !of_machine_is_compatible("PowerMac7,3") && | ||
2261 | !rackmac) | ||
2262 | return -ENODEV; | ||
2263 | |||
2264 | return platform_driver_register(&fcu_of_platform_driver); | ||
2265 | } | ||
2266 | |||
2267 | static void __exit therm_pm72_exit(void) | ||
2268 | { | ||
2269 | platform_driver_unregister(&fcu_of_platform_driver); | ||
2270 | } | ||
2271 | |||
2272 | module_init(therm_pm72_init); | ||
2273 | module_exit(therm_pm72_exit); | ||
2274 | |||
2275 | MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>"); | ||
2276 | MODULE_DESCRIPTION("Driver for Apple's PowerMac G5 thermal control"); | ||
2277 | MODULE_LICENSE("GPL"); | ||
2278 | |||
diff --git a/drivers/macintosh/therm_pm72.h b/drivers/macintosh/therm_pm72.h deleted file mode 100644 index df3680e2a22f..000000000000 --- a/drivers/macintosh/therm_pm72.h +++ /dev/null | |||
@@ -1,326 +0,0 @@ | |||
1 | #ifndef __THERM_PMAC_7_2_H__ | ||
2 | #define __THERM_PMAC_7_2_H__ | ||
3 | |||
4 | typedef unsigned short fu16; | ||
5 | typedef int fs32; | ||
6 | typedef short fs16; | ||
7 | |||
8 | struct mpu_data | ||
9 | { | ||
10 | u8 signature; /* 0x00 - EEPROM sig. */ | ||
11 | u8 bytes_used; /* 0x01 - Bytes used in eeprom (160 ?) */ | ||
12 | u8 size; /* 0x02 - EEPROM size (256 ?) */ | ||
13 | u8 version; /* 0x03 - EEPROM version */ | ||
14 | u32 data_revision; /* 0x04 - Dataset revision */ | ||
15 | u8 processor_bin_code[3]; /* 0x08 - Processor BIN code */ | ||
16 | u8 bin_code_expansion; /* 0x0b - ??? (padding ?) */ | ||
17 | u8 processor_num; /* 0x0c - Number of CPUs on this MPU */ | ||
18 | u8 input_mul_bus_div; /* 0x0d - Clock input multiplier/bus divider */ | ||
19 | u8 reserved1[2]; /* 0x0e - */ | ||
20 | u32 input_clk_freq_high; /* 0x10 - Input clock frequency high */ | ||
21 | u8 cpu_nb_target_cycles; /* 0x14 - ??? */ | ||
22 | u8 cpu_statlat; /* 0x15 - ??? */ | ||
23 | u8 cpu_snooplat; /* 0x16 - ??? */ | ||
24 | u8 cpu_snoopacc; /* 0x17 - ??? */ | ||
25 | u8 nb_paamwin; /* 0x18 - ??? */ | ||
26 | u8 nb_statlat; /* 0x19 - ??? */ | ||
27 | u8 nb_snooplat; /* 0x1a - ??? */ | ||
28 | u8 nb_snoopwin; /* 0x1b - ??? */ | ||
29 | u8 api_bus_mode; /* 0x1c - ??? */ | ||
30 | u8 reserved2[3]; /* 0x1d - */ | ||
31 | u32 input_clk_freq_low; /* 0x20 - Input clock frequency low */ | ||
32 | u8 processor_card_slot; /* 0x24 - Processor card slot number */ | ||
33 | u8 reserved3[2]; /* 0x25 - */ | ||
34 | u8 padjmax; /* 0x27 - Max power adjustment (Not in OF!) */ | ||
35 | u8 ttarget; /* 0x28 - Target temperature */ | ||
36 | u8 tmax; /* 0x29 - Max temperature */ | ||
37 | u8 pmaxh; /* 0x2a - Max power */ | ||
38 | u8 tguardband; /* 0x2b - Guardband temp ??? Hist. len in OSX */ | ||
39 | fs32 pid_gp; /* 0x2c - PID proportional gain */ | ||
40 | fs32 pid_gr; /* 0x30 - PID reset gain */ | ||
41 | fs32 pid_gd; /* 0x34 - PID derivative gain */ | ||
42 | fu16 voph; /* 0x38 - Vop High */ | ||
43 | fu16 vopl; /* 0x3a - Vop Low */ | ||
44 | fs16 nactual_die; /* 0x3c - nActual Die */ | ||
45 | fs16 nactual_heatsink; /* 0x3e - nActual Heatsink */ | ||
46 | fs16 nactual_system; /* 0x40 - nActual System */ | ||
47 | u16 calibration_flags; /* 0x42 - Calibration flags */ | ||
48 | fu16 mdiode; /* 0x44 - Diode M value (scaling factor) */ | ||
49 | fs16 bdiode; /* 0x46 - Diode B value (offset) */ | ||
50 | fs32 theta_heat_sink; /* 0x48 - Theta heat sink */ | ||
51 | u16 rminn_intake_fan; /* 0x4c - Intake fan min RPM */ | ||
52 | u16 rmaxn_intake_fan; /* 0x4e - Intake fan max RPM */ | ||
53 | u16 rminn_exhaust_fan; /* 0x50 - Exhaust fan min RPM */ | ||
54 | u16 rmaxn_exhaust_fan; /* 0x52 - Exhaust fan max RPM */ | ||
55 | u8 processor_part_num[8]; /* 0x54 - Processor part number XX pumps min/max */ | ||
56 | u32 processor_lot_num; /* 0x5c - Processor lot number */ | ||
57 | u8 orig_card_sernum[0x10]; /* 0x60 - Card original serial number */ | ||
58 | u8 curr_card_sernum[0x10]; /* 0x70 - Card current serial number */ | ||
59 | u8 mlb_sernum[0x18]; /* 0x80 - MLB serial number */ | ||
60 | u32 checksum1; /* 0x98 - */ | ||
61 | u32 checksum2; /* 0x9c - */ | ||
62 | }; /* Total size = 0xa0 */ | ||
63 | |||
64 | /* Display a 16.16 fixed point value */ | ||
65 | #define FIX32TOPRINT(f) ((f) >> 16),((((f) & 0xffff) * 1000) >> 16) | ||
66 | |||
67 | /* | ||
68 | * Maximum number of seconds to be in critical state (after a | ||
69 | * normal shutdown attempt). If the machine isn't down after | ||
70 | * this counter elapses, we force an immediate machine power | ||
71 | * off. | ||
72 | */ | ||
73 | #define MAX_CRITICAL_STATE 30 | ||
74 | static char * critical_overtemp_path = "/sbin/critical_overtemp"; | ||
75 | |||
76 | /* | ||
77 | * This option is "weird" :) Basically, if you define this to 1 | ||
78 | * the control loop for the RPMs fans (not PWMs) will apply the | ||
79 | * correction factor obtained from the PID to the _actual_ RPM | ||
80 | * speed read from the FCU. | ||
81 | * If you define the below constant to 0, then it will be | ||
82 | * applied to the setpoint RPM speed, that is basically the | ||
83 | * speed we proviously "asked" for. | ||
84 | * | ||
85 | * I'm not sure which of these Apple's algorithm is supposed | ||
86 | * to use | ||
87 | */ | ||
88 | #define RPM_PID_USE_ACTUAL_SPEED 0 | ||
89 | |||
90 | /* | ||
91 | * i2c IDs. Currently, we hard code those and assume that | ||
92 | * the FCU is on U3 bus 1 while all sensors are on U3 bus | ||
93 | * 0. This appear to be safe enough for this first version | ||
94 | * of the driver, though I would accept any clean patch | ||
95 | * doing a better use of the device-tree without turning the | ||
96 | * while i2c registration mechanism into a racy mess | ||
97 | * | ||
98 | * Note: Xserve changed this. We have some bits on the K2 bus, | ||
99 | * which I arbitrarily set to 0x200. Ultimately, we really want | ||
100 | * too lookup these in the device-tree though | ||
101 | */ | ||
102 | #define FAN_CTRLER_ID 0x15e | ||
103 | #define SUPPLY_MONITOR_ID 0x58 | ||
104 | #define SUPPLY_MONITORB_ID 0x5a | ||
105 | #define DRIVES_DALLAS_ID 0x94 | ||
106 | #define BACKSIDE_MAX_ID 0x98 | ||
107 | #define XSERVE_DIMMS_LM87 0x25a | ||
108 | #define XSERVE_SLOTS_LM75 0x290 | ||
109 | |||
110 | /* | ||
111 | * Some MAX6690, DS1775, LM87 register definitions | ||
112 | */ | ||
113 | #define MAX6690_INT_TEMP 0 | ||
114 | #define MAX6690_EXT_TEMP 1 | ||
115 | #define DS1775_TEMP 0 | ||
116 | #define LM87_INT_TEMP 0x27 | ||
117 | |||
118 | /* | ||
119 | * Scaling factors for the AD7417 ADC converters (except | ||
120 | * for the CPU diode which is obtained from the EEPROM). | ||
121 | * Those values are obtained from the property list of | ||
122 | * the darwin driver | ||
123 | */ | ||
124 | #define ADC_12V_CURRENT_SCALE 0x0320 /* _AD2 */ | ||
125 | #define ADC_CPU_VOLTAGE_SCALE 0x00a0 /* _AD3 */ | ||
126 | #define ADC_CPU_CURRENT_SCALE 0x1f40 /* _AD4 */ | ||
127 | |||
128 | /* | ||
129 | * PID factors for the U3/Backside fan control loop. We have 2 sets | ||
130 | * of values here, one set for U3 and one set for U3H | ||
131 | */ | ||
132 | #define BACKSIDE_FAN_PWM_DEFAULT_ID 1 | ||
133 | #define BACKSIDE_FAN_PWM_INDEX 0 | ||
134 | #define BACKSIDE_PID_U3_G_d 0x02800000 | ||
135 | #define BACKSIDE_PID_U3H_G_d 0x01400000 | ||
136 | #define BACKSIDE_PID_RACK_G_d 0x00500000 | ||
137 | #define BACKSIDE_PID_G_p 0x00500000 | ||
138 | #define BACKSIDE_PID_RACK_G_p 0x0004cccc | ||
139 | #define BACKSIDE_PID_G_r 0x00000000 | ||
140 | #define BACKSIDE_PID_U3_INPUT_TARGET 0x00410000 | ||
141 | #define BACKSIDE_PID_U3H_INPUT_TARGET 0x004b0000 | ||
142 | #define BACKSIDE_PID_RACK_INPUT_TARGET 0x00460000 | ||
143 | #define BACKSIDE_PID_INTERVAL 5 | ||
144 | #define BACKSIDE_PID_RACK_INTERVAL 1 | ||
145 | #define BACKSIDE_PID_OUTPUT_MAX 100 | ||
146 | #define BACKSIDE_PID_U3_OUTPUT_MIN 20 | ||
147 | #define BACKSIDE_PID_U3H_OUTPUT_MIN 20 | ||
148 | #define BACKSIDE_PID_HISTORY_SIZE 2 | ||
149 | |||
150 | struct basckside_pid_params | ||
151 | { | ||
152 | s32 G_d; | ||
153 | s32 G_p; | ||
154 | s32 G_r; | ||
155 | s32 input_target; | ||
156 | s32 output_min; | ||
157 | s32 output_max; | ||
158 | s32 interval; | ||
159 | int additive; | ||
160 | }; | ||
161 | |||
162 | struct backside_pid_state | ||
163 | { | ||
164 | int ticks; | ||
165 | struct i2c_client * monitor; | ||
166 | s32 sample_history[BACKSIDE_PID_HISTORY_SIZE]; | ||
167 | s32 error_history[BACKSIDE_PID_HISTORY_SIZE]; | ||
168 | int cur_sample; | ||
169 | s32 last_temp; | ||
170 | int pwm; | ||
171 | int first; | ||
172 | }; | ||
173 | |||
174 | /* | ||
175 | * PID factors for the Drive Bay fan control loop | ||
176 | */ | ||
177 | #define DRIVES_FAN_RPM_DEFAULT_ID 2 | ||
178 | #define DRIVES_FAN_RPM_INDEX 1 | ||
179 | #define DRIVES_PID_G_d 0x01e00000 | ||
180 | #define DRIVES_PID_G_p 0x00500000 | ||
181 | #define DRIVES_PID_G_r 0x00000000 | ||
182 | #define DRIVES_PID_INPUT_TARGET 0x00280000 | ||
183 | #define DRIVES_PID_INTERVAL 5 | ||
184 | #define DRIVES_PID_OUTPUT_MAX 4000 | ||
185 | #define DRIVES_PID_OUTPUT_MIN 300 | ||
186 | #define DRIVES_PID_HISTORY_SIZE 2 | ||
187 | |||
188 | struct drives_pid_state | ||
189 | { | ||
190 | int ticks; | ||
191 | struct i2c_client * monitor; | ||
192 | s32 sample_history[BACKSIDE_PID_HISTORY_SIZE]; | ||
193 | s32 error_history[BACKSIDE_PID_HISTORY_SIZE]; | ||
194 | int cur_sample; | ||
195 | s32 last_temp; | ||
196 | int rpm; | ||
197 | int first; | ||
198 | }; | ||
199 | |||
200 | #define SLOTS_FAN_PWM_DEFAULT_ID 2 | ||
201 | #define SLOTS_FAN_PWM_INDEX 2 | ||
202 | #define SLOTS_FAN_DEFAULT_PWM 40 /* Do better here ! */ | ||
203 | |||
204 | |||
205 | /* | ||
206 | * PID factors for the Xserve DIMM control loop | ||
207 | */ | ||
208 | #define DIMM_PID_G_d 0 | ||
209 | #define DIMM_PID_G_p 0 | ||
210 | #define DIMM_PID_G_r 0x06553600 | ||
211 | #define DIMM_PID_INPUT_TARGET 3276800 | ||
212 | #define DIMM_PID_INTERVAL 1 | ||
213 | #define DIMM_PID_OUTPUT_MAX 14000 | ||
214 | #define DIMM_PID_OUTPUT_MIN 4000 | ||
215 | #define DIMM_PID_HISTORY_SIZE 20 | ||
216 | |||
217 | struct dimm_pid_state | ||
218 | { | ||
219 | int ticks; | ||
220 | struct i2c_client * monitor; | ||
221 | s32 sample_history[DIMM_PID_HISTORY_SIZE]; | ||
222 | s32 error_history[DIMM_PID_HISTORY_SIZE]; | ||
223 | int cur_sample; | ||
224 | s32 last_temp; | ||
225 | int first; | ||
226 | int output; | ||
227 | }; | ||
228 | |||
229 | |||
230 | /* | ||
231 | * PID factors for the Xserve Slots control loop | ||
232 | */ | ||
233 | #define SLOTS_PID_G_d 0 | ||
234 | #define SLOTS_PID_G_p 0 | ||
235 | #define SLOTS_PID_G_r 0x00100000 | ||
236 | #define SLOTS_PID_INPUT_TARGET 3200000 | ||
237 | #define SLOTS_PID_INTERVAL 1 | ||
238 | #define SLOTS_PID_OUTPUT_MAX 100 | ||
239 | #define SLOTS_PID_OUTPUT_MIN 20 | ||
240 | #define SLOTS_PID_HISTORY_SIZE 20 | ||
241 | |||
242 | struct slots_pid_state | ||
243 | { | ||
244 | int ticks; | ||
245 | struct i2c_client * monitor; | ||
246 | s32 sample_history[SLOTS_PID_HISTORY_SIZE]; | ||
247 | s32 error_history[SLOTS_PID_HISTORY_SIZE]; | ||
248 | int cur_sample; | ||
249 | s32 last_temp; | ||
250 | int first; | ||
251 | int pwm; | ||
252 | }; | ||
253 | |||
254 | |||
255 | |||
256 | /* Desktops */ | ||
257 | |||
258 | #define CPUA_INTAKE_FAN_RPM_DEFAULT_ID 3 | ||
259 | #define CPUA_EXHAUST_FAN_RPM_DEFAULT_ID 4 | ||
260 | #define CPUB_INTAKE_FAN_RPM_DEFAULT_ID 5 | ||
261 | #define CPUB_EXHAUST_FAN_RPM_DEFAULT_ID 6 | ||
262 | |||
263 | #define CPUA_INTAKE_FAN_RPM_INDEX 3 | ||
264 | #define CPUA_EXHAUST_FAN_RPM_INDEX 4 | ||
265 | #define CPUB_INTAKE_FAN_RPM_INDEX 5 | ||
266 | #define CPUB_EXHAUST_FAN_RPM_INDEX 6 | ||
267 | |||
268 | #define CPU_INTAKE_SCALE 0x0000f852 | ||
269 | #define CPU_TEMP_HISTORY_SIZE 2 | ||
270 | #define CPU_POWER_HISTORY_SIZE 10 | ||
271 | #define CPU_PID_INTERVAL 1 | ||
272 | #define CPU_MAX_OVERTEMP 90 | ||
273 | |||
274 | #define CPUA_PUMP_RPM_INDEX 7 | ||
275 | #define CPUB_PUMP_RPM_INDEX 8 | ||
276 | #define CPU_PUMP_OUTPUT_MAX 3200 | ||
277 | #define CPU_PUMP_OUTPUT_MIN 1250 | ||
278 | |||
279 | /* Xserve */ | ||
280 | #define CPU_A1_FAN_RPM_INDEX 9 | ||
281 | #define CPU_A2_FAN_RPM_INDEX 10 | ||
282 | #define CPU_A3_FAN_RPM_INDEX 11 | ||
283 | #define CPU_B1_FAN_RPM_INDEX 12 | ||
284 | #define CPU_B2_FAN_RPM_INDEX 13 | ||
285 | #define CPU_B3_FAN_RPM_INDEX 14 | ||
286 | |||
287 | |||
288 | struct cpu_pid_state | ||
289 | { | ||
290 | int index; | ||
291 | struct i2c_client * monitor; | ||
292 | struct mpu_data mpu; | ||
293 | int overtemp; | ||
294 | s32 temp_history[CPU_TEMP_HISTORY_SIZE]; | ||
295 | int cur_temp; | ||
296 | s32 power_history[CPU_POWER_HISTORY_SIZE]; | ||
297 | s32 error_history[CPU_POWER_HISTORY_SIZE]; | ||
298 | int cur_power; | ||
299 | int count_power; | ||
300 | int rpm; | ||
301 | int intake_rpm; | ||
302 | s32 voltage; | ||
303 | s32 current_a; | ||
304 | s32 last_temp; | ||
305 | s32 last_power; | ||
306 | int first; | ||
307 | u8 adc_config; | ||
308 | s32 pump_min; | ||
309 | s32 pump_max; | ||
310 | }; | ||
311 | |||
312 | /* Tickle FCU every 10 seconds */ | ||
313 | #define FCU_TICKLE_TICKS 10 | ||
314 | |||
315 | /* | ||
316 | * Driver state | ||
317 | */ | ||
318 | enum { | ||
319 | state_detached, | ||
320 | state_attaching, | ||
321 | state_attached, | ||
322 | state_detaching, | ||
323 | }; | ||
324 | |||
325 | |||
326 | #endif /* __THERM_PMAC_7_2_H__ */ | ||
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 8735543eacdb..493478989dbd 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
@@ -1127,6 +1127,24 @@ static void schedule_external_copy(struct thin_c *tc, dm_block_t virt_block, | |||
1127 | schedule_zero(tc, virt_block, data_dest, cell, bio); | 1127 | schedule_zero(tc, virt_block, data_dest, cell, bio); |
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode); | ||
1131 | |||
1132 | static void check_for_space(struct pool *pool) | ||
1133 | { | ||
1134 | int r; | ||
1135 | dm_block_t nr_free; | ||
1136 | |||
1137 | if (get_pool_mode(pool) != PM_OUT_OF_DATA_SPACE) | ||
1138 | return; | ||
1139 | |||
1140 | r = dm_pool_get_free_block_count(pool->pmd, &nr_free); | ||
1141 | if (r) | ||
1142 | return; | ||
1143 | |||
1144 | if (nr_free) | ||
1145 | set_pool_mode(pool, PM_WRITE); | ||
1146 | } | ||
1147 | |||
1130 | /* | 1148 | /* |
1131 | * A non-zero return indicates read_only or fail_io mode. | 1149 | * A non-zero return indicates read_only or fail_io mode. |
1132 | * Many callers don't care about the return value. | 1150 | * Many callers don't care about the return value. |
@@ -1141,6 +1159,8 @@ static int commit(struct pool *pool) | |||
1141 | r = dm_pool_commit_metadata(pool->pmd); | 1159 | r = dm_pool_commit_metadata(pool->pmd); |
1142 | if (r) | 1160 | if (r) |
1143 | metadata_operation_failed(pool, "dm_pool_commit_metadata", r); | 1161 | metadata_operation_failed(pool, "dm_pool_commit_metadata", r); |
1162 | else | ||
1163 | check_for_space(pool); | ||
1144 | 1164 | ||
1145 | return r; | 1165 | return r; |
1146 | } | 1166 | } |
@@ -1159,8 +1179,6 @@ static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks) | |||
1159 | } | 1179 | } |
1160 | } | 1180 | } |
1161 | 1181 | ||
1162 | static void set_pool_mode(struct pool *pool, enum pool_mode new_mode); | ||
1163 | |||
1164 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) | 1182 | static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
1165 | { | 1183 | { |
1166 | int r; | 1184 | int r; |
@@ -2155,7 +2173,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) | |||
2155 | pool->process_cell = process_cell_read_only; | 2173 | pool->process_cell = process_cell_read_only; |
2156 | pool->process_discard_cell = process_discard_cell; | 2174 | pool->process_discard_cell = process_discard_cell; |
2157 | pool->process_prepared_mapping = process_prepared_mapping; | 2175 | pool->process_prepared_mapping = process_prepared_mapping; |
2158 | pool->process_prepared_discard = process_prepared_discard_passdown; | 2176 | pool->process_prepared_discard = process_prepared_discard; |
2159 | 2177 | ||
2160 | if (!pool->pf.error_if_no_space && no_space_timeout) | 2178 | if (!pool->pf.error_if_no_space && no_space_timeout) |
2161 | queue_delayed_work(pool->wq, &pool->no_space_timeout, no_space_timeout); | 2179 | queue_delayed_work(pool->wq, &pool->no_space_timeout, no_space_timeout); |
@@ -3814,6 +3832,8 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
3814 | r = -EINVAL; | 3832 | r = -EINVAL; |
3815 | goto bad; | 3833 | goto bad; |
3816 | } | 3834 | } |
3835 | atomic_set(&tc->refcount, 1); | ||
3836 | init_completion(&tc->can_destroy); | ||
3817 | list_add_tail_rcu(&tc->list, &tc->pool->active_thins); | 3837 | list_add_tail_rcu(&tc->list, &tc->pool->active_thins); |
3818 | spin_unlock_irqrestore(&tc->pool->lock, flags); | 3838 | spin_unlock_irqrestore(&tc->pool->lock, flags); |
3819 | /* | 3839 | /* |
@@ -3826,9 +3846,6 @@ static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
3826 | 3846 | ||
3827 | dm_put(pool_md); | 3847 | dm_put(pool_md); |
3828 | 3848 | ||
3829 | atomic_set(&tc->refcount, 1); | ||
3830 | init_completion(&tc->can_destroy); | ||
3831 | |||
3832 | return 0; | 3849 | return 0; |
3833 | 3850 | ||
3834 | bad: | 3851 | bad: |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 4c06585bf165..b98cd9d84435 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -899,7 +899,7 @@ static void disable_write_same(struct mapped_device *md) | |||
899 | 899 | ||
900 | static void clone_endio(struct bio *bio, int error) | 900 | static void clone_endio(struct bio *bio, int error) |
901 | { | 901 | { |
902 | int r = 0; | 902 | int r = error; |
903 | struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); | 903 | struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); |
904 | struct dm_io *io = tio->io; | 904 | struct dm_io *io = tio->io; |
905 | struct mapped_device *md = tio->io->md; | 905 | struct mapped_device *md = tio->io->md; |
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index aa915da2a5e5..82abfce1cb42 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c | |||
@@ -176,7 +176,6 @@ STATIC int NCR_700_slave_alloc(struct scsi_device *SDpnt); | |||
176 | STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt); | 176 | STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt); |
177 | STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt); | 177 | STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt); |
178 | static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth); | 178 | static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth); |
179 | static int NCR_700_change_queue_type(struct scsi_device *SDpnt, int depth); | ||
180 | 179 | ||
181 | STATIC struct device_attribute *NCR_700_dev_attrs[]; | 180 | STATIC struct device_attribute *NCR_700_dev_attrs[]; |
182 | 181 | ||
@@ -326,7 +325,6 @@ NCR_700_detect(struct scsi_host_template *tpnt, | |||
326 | tpnt->slave_destroy = NCR_700_slave_destroy; | 325 | tpnt->slave_destroy = NCR_700_slave_destroy; |
327 | tpnt->slave_alloc = NCR_700_slave_alloc; | 326 | tpnt->slave_alloc = NCR_700_slave_alloc; |
328 | tpnt->change_queue_depth = NCR_700_change_queue_depth; | 327 | tpnt->change_queue_depth = NCR_700_change_queue_depth; |
329 | tpnt->change_queue_type = NCR_700_change_queue_type; | ||
330 | tpnt->use_blk_tags = 1; | 328 | tpnt->use_blk_tags = 1; |
331 | 329 | ||
332 | if(tpnt->name == NULL) | 330 | if(tpnt->name == NULL) |
@@ -904,8 +902,8 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata | |||
904 | hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); | 902 | hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); |
905 | 903 | ||
906 | SCp->device->tagged_supported = 0; | 904 | SCp->device->tagged_supported = 0; |
905 | SCp->device->simple_tags = 0; | ||
907 | scsi_change_queue_depth(SCp->device, host->cmd_per_lun); | 906 | scsi_change_queue_depth(SCp->device, host->cmd_per_lun); |
908 | scsi_set_tag_type(SCp->device, 0); | ||
909 | } else { | 907 | } else { |
910 | shost_printk(KERN_WARNING, host, | 908 | shost_printk(KERN_WARNING, host, |
911 | "(%d:%d) Unexpected REJECT Message %s\n", | 909 | "(%d:%d) Unexpected REJECT Message %s\n", |
@@ -1818,8 +1816,8 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *) | |||
1818 | hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); | 1816 | hostdata->tag_negotiated &= ~(1<<scmd_id(SCp)); |
1819 | } | 1817 | } |
1820 | 1818 | ||
1821 | if((hostdata->tag_negotiated &(1<<scmd_id(SCp))) | 1819 | if ((hostdata->tag_negotiated & (1<<scmd_id(SCp))) && |
1822 | && scsi_get_tag_type(SCp->device)) { | 1820 | SCp->device->simple_tags) { |
1823 | slot->tag = SCp->request->tag; | 1821 | slot->tag = SCp->request->tag; |
1824 | CDEBUG(KERN_DEBUG, SCp, "sending out tag %d, slot %p\n", | 1822 | CDEBUG(KERN_DEBUG, SCp, "sending out tag %d, slot %p\n", |
1825 | slot->tag, slot); | 1823 | slot->tag, slot); |
@@ -2082,39 +2080,6 @@ NCR_700_change_queue_depth(struct scsi_device *SDp, int depth) | |||
2082 | return scsi_change_queue_depth(SDp, depth); | 2080 | return scsi_change_queue_depth(SDp, depth); |
2083 | } | 2081 | } |
2084 | 2082 | ||
2085 | static int NCR_700_change_queue_type(struct scsi_device *SDp, int tag_type) | ||
2086 | { | ||
2087 | int change_tag = ((tag_type ==0 && scsi_get_tag_type(SDp) != 0) | ||
2088 | || (tag_type != 0 && scsi_get_tag_type(SDp) == 0)); | ||
2089 | struct NCR_700_Host_Parameters *hostdata = | ||
2090 | (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0]; | ||
2091 | |||
2092 | /* We have a global (per target) flag to track whether TCQ is | ||
2093 | * enabled, so we'll be turning it off for the entire target here. | ||
2094 | * our tag algorithm will fail if we mix tagged and untagged commands, | ||
2095 | * so quiesce the device before doing this */ | ||
2096 | if (change_tag) | ||
2097 | scsi_target_quiesce(SDp->sdev_target); | ||
2098 | |||
2099 | scsi_set_tag_type(SDp, tag_type); | ||
2100 | if (!tag_type) { | ||
2101 | /* shift back to the default unqueued number of commands | ||
2102 | * (the user can still raise this) */ | ||
2103 | scsi_change_queue_depth(SDp, SDp->host->cmd_per_lun); | ||
2104 | hostdata->tag_negotiated &= ~(1 << sdev_id(SDp)); | ||
2105 | } else { | ||
2106 | /* Here, we cleared the negotiation flag above, so this | ||
2107 | * will force the driver to renegotiate */ | ||
2108 | scsi_change_queue_depth(SDp, SDp->queue_depth); | ||
2109 | if (change_tag) | ||
2110 | NCR_700_set_tag_neg_state(SDp, NCR_700_START_TAG_NEGOTIATION); | ||
2111 | } | ||
2112 | if (change_tag) | ||
2113 | scsi_target_resume(SDp->sdev_target); | ||
2114 | |||
2115 | return tag_type; | ||
2116 | } | ||
2117 | |||
2118 | static ssize_t | 2083 | static ssize_t |
2119 | NCR_700_show_active_tags(struct device *dev, struct device_attribute *attr, char *buf) | 2084 | NCR_700_show_active_tags(struct device *dev, struct device_attribute *attr, char *buf) |
2120 | { | 2085 | { |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 86cf3d671eb9..9c92f415229f 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -1462,18 +1462,17 @@ config SCSI_WD719X | |||
1462 | SCSI controllers (based on WD33C296A chip). | 1462 | SCSI controllers (based on WD33C296A chip). |
1463 | 1463 | ||
1464 | config SCSI_DEBUG | 1464 | config SCSI_DEBUG |
1465 | tristate "SCSI debugging host simulator" | 1465 | tristate "SCSI debugging host and device simulator" |
1466 | depends on SCSI | 1466 | depends on SCSI |
1467 | select CRC_T10DIF | 1467 | select CRC_T10DIF |
1468 | help | 1468 | help |
1469 | This is a host adapter simulator that can simulate multiple hosts | 1469 | This pseudo driver simulates one or more hosts (SCSI initiators), |
1470 | each with multiple dummy SCSI devices (disks). It defaults to one | 1470 | each with one or more targets, each with one or more logical units. |
1471 | host adapter with one dummy SCSI disk. Each dummy disk uses kernel | 1471 | Defaults to one of each, creating a small RAM disk device. Many |
1472 | RAM as storage (i.e. it is a ramdisk). To save space when multiple | 1472 | parameters found in the /sys/bus/pseudo/drivers/scsi_debug |
1473 | dummy disks are simulated, they share the same kernel RAM for | 1473 | directory can be tweaked at run time. |
1474 | their storage. See <http://sg.danny.cz/sg/sdebug26.html> for more | 1474 | See <http://sg.danny.cz/sg/sdebug26.html> for more information. |
1475 | information. This driver is primarily of use to those testing the | 1475 | Mainly used for testing and best as a module. If unsure, say N. |
1476 | SCSI and block subsystems. If unsure, say N. | ||
1477 | 1476 | ||
1478 | config SCSI_MESH | 1477 | config SCSI_MESH |
1479 | tristate "MESH (Power Mac internal SCSI) support" | 1478 | tristate "MESH (Power Mac internal SCSI) support" |
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 6719a3390ebd..2c5ce48c8f95 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
@@ -7921,9 +7921,9 @@ static int asc_build_req(struct asc_board *boardp, struct scsi_cmnd *scp, | |||
7921 | */ | 7921 | */ |
7922 | if ((asc_dvc->cur_dvc_qng[scp->device->id] > 0) && | 7922 | if ((asc_dvc->cur_dvc_qng[scp->device->id] > 0) && |
7923 | (boardp->reqcnt[scp->device->id] % 255) == 0) { | 7923 | (boardp->reqcnt[scp->device->id] % 255) == 0) { |
7924 | asc_scsi_q->q2.tag_code = MSG_ORDERED_TAG; | 7924 | asc_scsi_q->q2.tag_code = ORDERED_QUEUE_TAG; |
7925 | } else { | 7925 | } else { |
7926 | asc_scsi_q->q2.tag_code = MSG_SIMPLE_TAG; | 7926 | asc_scsi_q->q2.tag_code = SIMPLE_QUEUE_TAG; |
7927 | } | 7927 | } |
7928 | 7928 | ||
7929 | /* Build ASC_SCSI_Q */ | 7929 | /* Build ASC_SCSI_Q */ |
@@ -8351,7 +8351,7 @@ static int AscPutReadyQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no) | |||
8351 | } | 8351 | } |
8352 | q_addr = ASC_QNO_TO_QADDR(q_no); | 8352 | q_addr = ASC_QNO_TO_QADDR(q_no); |
8353 | if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) { | 8353 | if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) { |
8354 | scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG; | 8354 | scsiq->q2.tag_code &= ~SIMPLE_QUEUE_TAG; |
8355 | } | 8355 | } |
8356 | scsiq->q1.status = QS_FREE; | 8356 | scsiq->q1.status = QS_FREE; |
8357 | AscMemWordCopyPtrToLram(iop_base, | 8357 | AscMemWordCopyPtrToLram(iop_base, |
@@ -8669,7 +8669,7 @@ static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq) | |||
8669 | } | 8669 | } |
8670 | } | 8670 | } |
8671 | if (disable_syn_offset_one_fix) { | 8671 | if (disable_syn_offset_one_fix) { |
8672 | scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG; | 8672 | scsiq->q2.tag_code &= ~SIMPLE_QUEUE_TAG; |
8673 | scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX | | 8673 | scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX | |
8674 | ASC_TAG_FLAG_DISABLE_DISCONNECT); | 8674 | ASC_TAG_FLAG_DISABLE_DISCONNECT); |
8675 | } else { | 8675 | } else { |
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 14fc018436c2..02a2512b76a8 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -63,7 +63,6 @@ static struct scsi_host_template aic94xx_sht = { | |||
63 | .scan_finished = asd_scan_finished, | 63 | .scan_finished = asd_scan_finished, |
64 | .scan_start = asd_scan_start, | 64 | .scan_start = asd_scan_start, |
65 | .change_queue_depth = sas_change_queue_depth, | 65 | .change_queue_depth = sas_change_queue_depth, |
66 | .change_queue_type = sas_change_queue_type, | ||
67 | .bios_param = sas_bios_param, | 66 | .bios_param = sas_bios_param, |
68 | .can_queue = 1, | 67 | .can_queue = 1, |
69 | .cmd_per_lun = 1, | 68 | .cmd_per_lun = 1, |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index e861f286b42e..98d06d151958 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |||
@@ -2792,7 +2792,6 @@ static struct scsi_host_template bnx2fc_shost_template = { | |||
2792 | .eh_host_reset_handler = fc_eh_host_reset, | 2792 | .eh_host_reset_handler = fc_eh_host_reset, |
2793 | .slave_alloc = fc_slave_alloc, | 2793 | .slave_alloc = fc_slave_alloc, |
2794 | .change_queue_depth = scsi_change_queue_depth, | 2794 | .change_queue_depth = scsi_change_queue_depth, |
2795 | .change_queue_type = scsi_change_queue_type, | ||
2796 | .this_id = -1, | 2795 | .this_id = -1, |
2797 | .cmd_per_lun = 3, | 2796 | .cmd_per_lun = 3, |
2798 | .use_clustering = ENABLE_CLUSTERING, | 2797 | .use_clustering = ENABLE_CLUSTERING, |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c index 4b56858c1df2..9ecca8504f60 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_io.c +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c | |||
@@ -1737,11 +1737,7 @@ void bnx2fc_build_fcp_cmnd(struct bnx2fc_cmd *io_req, | |||
1737 | fcp_cmnd->fc_pri_ta = 0; | 1737 | fcp_cmnd->fc_pri_ta = 0; |
1738 | fcp_cmnd->fc_tm_flags = io_req->mp_req.tm_flags; | 1738 | fcp_cmnd->fc_tm_flags = io_req->mp_req.tm_flags; |
1739 | fcp_cmnd->fc_flags = io_req->io_req_flags; | 1739 | fcp_cmnd->fc_flags = io_req->io_req_flags; |
1740 | 1740 | fcp_cmnd->fc_pri_ta = FCP_PTA_SIMPLE; | |
1741 | if (sc_cmd->flags & SCMD_TAGGED) | ||
1742 | fcp_cmnd->fc_pri_ta = FCP_PTA_SIMPLE; | ||
1743 | else | ||
1744 | fcp_cmnd->fc_pri_ta = 0; | ||
1745 | } | 1741 | } |
1746 | 1742 | ||
1747 | static void bnx2fc_parse_fcp_rsp(struct bnx2fc_cmd *io_req, | 1743 | static void bnx2fc_parse_fcp_rsp(struct bnx2fc_cmd *io_req, |
diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c index 51ea5dc5f084..3987284e0d2a 100644 --- a/drivers/scsi/csiostor/csio_scsi.c +++ b/drivers/scsi/csiostor/csio_scsi.c | |||
@@ -172,10 +172,7 @@ csio_scsi_fcp_cmnd(struct csio_ioreq *req, void *addr) | |||
172 | fcp_cmnd->fc_cmdref = 0; | 172 | fcp_cmnd->fc_cmdref = 0; |
173 | 173 | ||
174 | memcpy(fcp_cmnd->fc_cdb, scmnd->cmnd, 16); | 174 | memcpy(fcp_cmnd->fc_cdb, scmnd->cmnd, 16); |
175 | if (scmnd->flags & SCMD_TAGGED) | 175 | fcp_cmnd->fc_pri_ta = FCP_PTA_SIMPLE; |
176 | fcp_cmnd->fc_pri_ta = FCP_PTA_SIMPLE; | ||
177 | else | ||
178 | fcp_cmnd->fc_pri_ta = 0; | ||
179 | fcp_cmnd->fc_dl = cpu_to_be32(scsi_bufflen(scmnd)); | 176 | fcp_cmnd->fc_dl = cpu_to_be32(scsi_bufflen(scmnd)); |
180 | 177 | ||
181 | if (req->nsge) | 178 | if (req->nsge) |
diff --git a/drivers/scsi/esas2r/esas2r_flash.c b/drivers/scsi/esas2r/esas2r_flash.c index b7dc59fca7a6..7bd376d95ed5 100644 --- a/drivers/scsi/esas2r/esas2r_flash.c +++ b/drivers/scsi/esas2r/esas2r_flash.c | |||
@@ -684,9 +684,9 @@ static u16 calc_fi_checksum(struct esas2r_flash_context *fc) | |||
684 | * 1) verify the fi_version is correct | 684 | * 1) verify the fi_version is correct |
685 | * 2) verify the checksum of the entire image. | 685 | * 2) verify the checksum of the entire image. |
686 | * 3) validate the adap_typ, action and length fields. | 686 | * 3) validate the adap_typ, action and length fields. |
687 | * 4) valdiate each component header. check the img_type and | 687 | * 4) validate each component header. check the img_type and |
688 | * length fields | 688 | * length fields |
689 | * 5) valdiate each component image. validate signatures and | 689 | * 5) validate each component image. validate signatures and |
690 | * local checksums | 690 | * local checksums |
691 | */ | 691 | */ |
692 | static bool verify_fi(struct esas2r_adapter *a, | 692 | static bool verify_fi(struct esas2r_adapter *a, |
diff --git a/drivers/scsi/esas2r/esas2r_main.c b/drivers/scsi/esas2r/esas2r_main.c index 593ff8a63c70..7e1c21e6736b 100644 --- a/drivers/scsi/esas2r/esas2r_main.c +++ b/drivers/scsi/esas2r/esas2r_main.c | |||
@@ -255,7 +255,6 @@ static struct scsi_host_template driver_template = { | |||
255 | .emulated = 0, | 255 | .emulated = 0, |
256 | .proc_name = ESAS2R_DRVR_NAME, | 256 | .proc_name = ESAS2R_DRVR_NAME, |
257 | .change_queue_depth = scsi_change_queue_depth, | 257 | .change_queue_depth = scsi_change_queue_depth, |
258 | .change_queue_type = scsi_change_queue_type, | ||
259 | .max_sectors = 0xFFFF, | 258 | .max_sectors = 0xFFFF, |
260 | .use_blk_tags = 1, | 259 | .use_blk_tags = 1, |
261 | }; | 260 | }; |
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index cd00a6cdf55b..ec193a8357d7 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c | |||
@@ -281,7 +281,6 @@ static struct scsi_host_template fcoe_shost_template = { | |||
281 | .eh_host_reset_handler = fc_eh_host_reset, | 281 | .eh_host_reset_handler = fc_eh_host_reset, |
282 | .slave_alloc = fc_slave_alloc, | 282 | .slave_alloc = fc_slave_alloc, |
283 | .change_queue_depth = scsi_change_queue_depth, | 283 | .change_queue_depth = scsi_change_queue_depth, |
284 | .change_queue_type = scsi_change_queue_type, | ||
285 | .this_id = -1, | 284 | .this_id = -1, |
286 | .cmd_per_lun = 3, | 285 | .cmd_per_lun = 3, |
287 | .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS, | 286 | .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS, |
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c index 0c1f8177b5b7..8a0d4d7b3254 100644 --- a/drivers/scsi/fnic/fnic_main.c +++ b/drivers/scsi/fnic/fnic_main.c | |||
@@ -111,7 +111,6 @@ static struct scsi_host_template fnic_host_template = { | |||
111 | .eh_host_reset_handler = fnic_host_reset, | 111 | .eh_host_reset_handler = fnic_host_reset, |
112 | .slave_alloc = fnic_slave_alloc, | 112 | .slave_alloc = fnic_slave_alloc, |
113 | .change_queue_depth = scsi_change_queue_depth, | 113 | .change_queue_depth = scsi_change_queue_depth, |
114 | .change_queue_type = scsi_change_queue_type, | ||
115 | .this_id = -1, | 114 | .this_id = -1, |
116 | .cmd_per_lun = 3, | 115 | .cmd_per_lun = 3, |
117 | .can_queue = FNIC_DFLT_IO_REQ, | 116 | .can_queue = FNIC_DFLT_IO_REQ, |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index f58c6d8e0264..057d27721d5b 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -1615,7 +1615,6 @@ static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd, | |||
1615 | struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device)); | 1615 | struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device)); |
1616 | struct ibmvfc_cmd *vfc_cmd; | 1616 | struct ibmvfc_cmd *vfc_cmd; |
1617 | struct ibmvfc_event *evt; | 1617 | struct ibmvfc_event *evt; |
1618 | u8 tag[2]; | ||
1619 | int rc; | 1618 | int rc; |
1620 | 1619 | ||
1621 | if (unlikely((rc = fc_remote_port_chkready(rport))) || | 1620 | if (unlikely((rc = fc_remote_port_chkready(rport))) || |
@@ -3089,7 +3088,6 @@ static struct scsi_host_template driver_template = { | |||
3089 | .target_alloc = ibmvfc_target_alloc, | 3088 | .target_alloc = ibmvfc_target_alloc, |
3090 | .scan_finished = ibmvfc_scan_finished, | 3089 | .scan_finished = ibmvfc_scan_finished, |
3091 | .change_queue_depth = ibmvfc_change_queue_depth, | 3090 | .change_queue_depth = ibmvfc_change_queue_depth, |
3092 | .change_queue_type = scsi_change_queue_type, | ||
3093 | .cmd_per_lun = 16, | 3091 | .cmd_per_lun = 16, |
3094 | .can_queue = IBMVFC_MAX_REQUESTS_DEFAULT, | 3092 | .can_queue = IBMVFC_MAX_REQUESTS_DEFAULT, |
3095 | .this_id = -1, | 3093 | .this_id = -1, |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 540294389355..df4e27cd996a 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -1426,16 +1426,14 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, | |||
1426 | if (res->sdev) { | 1426 | if (res->sdev) { |
1427 | res->del_from_ml = 1; | 1427 | res->del_from_ml = 1; |
1428 | res->res_handle = IPR_INVALID_RES_HANDLE; | 1428 | res->res_handle = IPR_INVALID_RES_HANDLE; |
1429 | if (ioa_cfg->allow_ml_add_del) | 1429 | schedule_work(&ioa_cfg->work_q); |
1430 | schedule_work(&ioa_cfg->work_q); | ||
1431 | } else { | 1430 | } else { |
1432 | ipr_clear_res_target(res); | 1431 | ipr_clear_res_target(res); |
1433 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); | 1432 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); |
1434 | } | 1433 | } |
1435 | } else if (!res->sdev || res->del_from_ml) { | 1434 | } else if (!res->sdev || res->del_from_ml) { |
1436 | res->add_to_ml = 1; | 1435 | res->add_to_ml = 1; |
1437 | if (ioa_cfg->allow_ml_add_del) | 1436 | schedule_work(&ioa_cfg->work_q); |
1438 | schedule_work(&ioa_cfg->work_q); | ||
1439 | } | 1437 | } |
1440 | 1438 | ||
1441 | ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb); | 1439 | ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb); |
@@ -3273,8 +3271,7 @@ static void ipr_worker_thread(struct work_struct *work) | |||
3273 | restart: | 3271 | restart: |
3274 | do { | 3272 | do { |
3275 | did_work = 0; | 3273 | did_work = 0; |
3276 | if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds || | 3274 | if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) { |
3277 | !ioa_cfg->allow_ml_add_del) { | ||
3278 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 3275 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
3279 | return; | 3276 | return; |
3280 | } | 3277 | } |
@@ -3311,6 +3308,7 @@ restart: | |||
3311 | } | 3308 | } |
3312 | } | 3309 | } |
3313 | 3310 | ||
3311 | ioa_cfg->scan_done = 1; | ||
3314 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 3312 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
3315 | kobject_uevent(&ioa_cfg->host->shost_dev.kobj, KOBJ_CHANGE); | 3313 | kobject_uevent(&ioa_cfg->host->shost_dev.kobj, KOBJ_CHANGE); |
3316 | LEAVE; | 3314 | LEAVE; |
@@ -4346,30 +4344,6 @@ static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth) | |||
4346 | } | 4344 | } |
4347 | 4345 | ||
4348 | /** | 4346 | /** |
4349 | * ipr_change_queue_type - Change the device's queue type | ||
4350 | * @dsev: scsi device struct | ||
4351 | * @tag_type: type of tags to use | ||
4352 | * | ||
4353 | * Return value: | ||
4354 | * actual queue type set | ||
4355 | **/ | ||
4356 | static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type) | ||
4357 | { | ||
4358 | struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; | ||
4359 | struct ipr_resource_entry *res; | ||
4360 | unsigned long lock_flags = 0; | ||
4361 | |||
4362 | spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); | ||
4363 | res = (struct ipr_resource_entry *)sdev->hostdata; | ||
4364 | if (res && ipr_is_gscsi(res)) | ||
4365 | tag_type = scsi_change_queue_type(sdev, tag_type); | ||
4366 | else | ||
4367 | tag_type = 0; | ||
4368 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | ||
4369 | return tag_type; | ||
4370 | } | ||
4371 | |||
4372 | /** | ||
4373 | * ipr_show_adapter_handle - Show the adapter's resource handle for this device | 4347 | * ipr_show_adapter_handle - Show the adapter's resource handle for this device |
4374 | * @dev: device struct | 4348 | * @dev: device struct |
4375 | * @attr: device attribute structure | 4349 | * @attr: device attribute structure |
@@ -4739,6 +4713,7 @@ static int ipr_slave_configure(struct scsi_device *sdev) | |||
4739 | sdev->no_uld_attach = 1; | 4713 | sdev->no_uld_attach = 1; |
4740 | } | 4714 | } |
4741 | if (ipr_is_vset_device(res)) { | 4715 | if (ipr_is_vset_device(res)) { |
4716 | sdev->scsi_level = SCSI_SPC_3; | ||
4742 | blk_queue_rq_timeout(sdev->request_queue, | 4717 | blk_queue_rq_timeout(sdev->request_queue, |
4743 | IPR_VSET_RW_TIMEOUT); | 4718 | IPR_VSET_RW_TIMEOUT); |
4744 | blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); | 4719 | blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); |
@@ -5231,6 +5206,28 @@ static int ipr_cancel_op(struct scsi_cmnd *scsi_cmd) | |||
5231 | * @scsi_cmd: scsi command struct | 5206 | * @scsi_cmd: scsi command struct |
5232 | * | 5207 | * |
5233 | * Return value: | 5208 | * Return value: |
5209 | * 0 if scan in progress / 1 if scan is complete | ||
5210 | **/ | ||
5211 | static int ipr_scan_finished(struct Scsi_Host *shost, unsigned long elapsed_time) | ||
5212 | { | ||
5213 | unsigned long lock_flags; | ||
5214 | struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; | ||
5215 | int rc = 0; | ||
5216 | |||
5217 | spin_lock_irqsave(shost->host_lock, lock_flags); | ||
5218 | if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead || ioa_cfg->scan_done) | ||
5219 | rc = 1; | ||
5220 | if ((elapsed_time/HZ) > (ioa_cfg->transop_timeout * 2)) | ||
5221 | rc = 1; | ||
5222 | spin_unlock_irqrestore(shost->host_lock, lock_flags); | ||
5223 | return rc; | ||
5224 | } | ||
5225 | |||
5226 | /** | ||
5227 | * ipr_eh_host_reset - Reset the host adapter | ||
5228 | * @scsi_cmd: scsi command struct | ||
5229 | * | ||
5230 | * Return value: | ||
5234 | * SUCCESS / FAILED | 5231 | * SUCCESS / FAILED |
5235 | **/ | 5232 | **/ |
5236 | static int ipr_eh_abort(struct scsi_cmnd *scsi_cmd) | 5233 | static int ipr_eh_abort(struct scsi_cmnd *scsi_cmd) |
@@ -5779,7 +5776,7 @@ static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) | |||
5779 | 5776 | ||
5780 | ipr_reinit_ipr_cmnd_for_erp(ipr_cmd); | 5777 | ipr_reinit_ipr_cmnd_for_erp(ipr_cmd); |
5781 | 5778 | ||
5782 | if (!scsi_get_tag_type(scsi_cmd->device)) { | 5779 | if (!scsi_cmd->device->simple_tags) { |
5783 | ipr_erp_request_sense(ipr_cmd); | 5780 | ipr_erp_request_sense(ipr_cmd); |
5784 | return; | 5781 | return; |
5785 | } | 5782 | } |
@@ -6299,10 +6296,10 @@ static struct scsi_host_template driver_template = { | |||
6299 | .slave_alloc = ipr_slave_alloc, | 6296 | .slave_alloc = ipr_slave_alloc, |
6300 | .slave_configure = ipr_slave_configure, | 6297 | .slave_configure = ipr_slave_configure, |
6301 | .slave_destroy = ipr_slave_destroy, | 6298 | .slave_destroy = ipr_slave_destroy, |
6299 | .scan_finished = ipr_scan_finished, | ||
6302 | .target_alloc = ipr_target_alloc, | 6300 | .target_alloc = ipr_target_alloc, |
6303 | .target_destroy = ipr_target_destroy, | 6301 | .target_destroy = ipr_target_destroy, |
6304 | .change_queue_depth = ipr_change_queue_depth, | 6302 | .change_queue_depth = ipr_change_queue_depth, |
6305 | .change_queue_type = ipr_change_queue_type, | ||
6306 | .bios_param = ipr_biosparam, | 6303 | .bios_param = ipr_biosparam, |
6307 | .can_queue = IPR_MAX_COMMANDS, | 6304 | .can_queue = IPR_MAX_COMMANDS, |
6308 | .this_id = -1, | 6305 | .this_id = -1, |
@@ -6841,7 +6838,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd) | |||
6841 | ioa_cfg->doorbell |= IPR_RUNTIME_RESET; | 6838 | ioa_cfg->doorbell |= IPR_RUNTIME_RESET; |
6842 | 6839 | ||
6843 | list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { | 6840 | list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { |
6844 | if (ioa_cfg->allow_ml_add_del && (res->add_to_ml || res->del_from_ml)) { | 6841 | if (res->add_to_ml || res->del_from_ml) { |
6845 | ipr_trace; | 6842 | ipr_trace; |
6846 | break; | 6843 | break; |
6847 | } | 6844 | } |
@@ -6870,6 +6867,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd) | |||
6870 | if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) | 6867 | if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) |
6871 | scsi_block_requests(ioa_cfg->host); | 6868 | scsi_block_requests(ioa_cfg->host); |
6872 | 6869 | ||
6870 | schedule_work(&ioa_cfg->work_q); | ||
6873 | LEAVE; | 6871 | LEAVE; |
6874 | return IPR_RC_JOB_RETURN; | 6872 | return IPR_RC_JOB_RETURN; |
6875 | } | 6873 | } |
@@ -7610,6 +7608,19 @@ static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd) | |||
7610 | type[4] = '\0'; | 7608 | type[4] = '\0'; |
7611 | ioa_cfg->type = simple_strtoul((char *)type, NULL, 16); | 7609 | ioa_cfg->type = simple_strtoul((char *)type, NULL, 16); |
7612 | 7610 | ||
7611 | if (ipr_invalid_adapter(ioa_cfg)) { | ||
7612 | dev_err(&ioa_cfg->pdev->dev, | ||
7613 | "Adapter not supported in this hardware configuration.\n"); | ||
7614 | |||
7615 | if (!ipr_testmode) { | ||
7616 | ioa_cfg->reset_retries += IPR_NUM_RESET_RELOAD_RETRIES; | ||
7617 | ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); | ||
7618 | list_add_tail(&ipr_cmd->queue, | ||
7619 | &ioa_cfg->hrrq->hrrq_free_q); | ||
7620 | return IPR_RC_JOB_RETURN; | ||
7621 | } | ||
7622 | } | ||
7623 | |||
7613 | ipr_cmd->job_step = ipr_ioafp_page3_inquiry; | 7624 | ipr_cmd->job_step = ipr_ioafp_page3_inquiry; |
7614 | 7625 | ||
7615 | ipr_ioafp_inquiry(ipr_cmd, 1, 0, | 7626 | ipr_ioafp_inquiry(ipr_cmd, 1, 0, |
@@ -8797,20 +8808,6 @@ static int ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg) | |||
8797 | _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, | 8808 | _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, |
8798 | IPR_SHUTDOWN_NONE); | 8809 | IPR_SHUTDOWN_NONE); |
8799 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); | 8810 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); |
8800 | wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); | ||
8801 | spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); | ||
8802 | |||
8803 | if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { | ||
8804 | rc = -EIO; | ||
8805 | } else if (ipr_invalid_adapter(ioa_cfg)) { | ||
8806 | if (!ipr_testmode) | ||
8807 | rc = -EIO; | ||
8808 | |||
8809 | dev_err(&ioa_cfg->pdev->dev, | ||
8810 | "Adapter not supported in this hardware configuration.\n"); | ||
8811 | } | ||
8812 | |||
8813 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); | ||
8814 | 8811 | ||
8815 | LEAVE; | 8812 | LEAVE; |
8816 | return rc; | 8813 | return rc; |
@@ -9264,7 +9261,7 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, | |||
9264 | * ioa_cfg->max_devs_supported))); | 9261 | * ioa_cfg->max_devs_supported))); |
9265 | } | 9262 | } |
9266 | 9263 | ||
9267 | host->max_channel = IPR_MAX_BUS_TO_SCAN; | 9264 | host->max_channel = IPR_VSET_BUS; |
9268 | host->unique_id = host->host_no; | 9265 | host->unique_id = host->host_no; |
9269 | host->max_cmd_len = IPR_MAX_CDB_LEN; | 9266 | host->max_cmd_len = IPR_MAX_CDB_LEN; |
9270 | host->can_queue = ioa_cfg->max_cmds; | 9267 | host->can_queue = ioa_cfg->max_cmds; |
@@ -9764,25 +9761,6 @@ out_scsi_host_put: | |||
9764 | } | 9761 | } |
9765 | 9762 | ||
9766 | /** | 9763 | /** |
9767 | * ipr_scan_vsets - Scans for VSET devices | ||
9768 | * @ioa_cfg: ioa config struct | ||
9769 | * | ||
9770 | * Description: Since the VSET resources do not follow SAM in that we can have | ||
9771 | * sparse LUNs with no LUN 0, we have to scan for these ourselves. | ||
9772 | * | ||
9773 | * Return value: | ||
9774 | * none | ||
9775 | **/ | ||
9776 | static void ipr_scan_vsets(struct ipr_ioa_cfg *ioa_cfg) | ||
9777 | { | ||
9778 | int target, lun; | ||
9779 | |||
9780 | for (target = 0; target < IPR_MAX_NUM_TARGETS_PER_BUS; target++) | ||
9781 | for (lun = 0; lun < IPR_MAX_NUM_VSET_LUNS_PER_TARGET; lun++) | ||
9782 | scsi_add_device(ioa_cfg->host, IPR_VSET_BUS, target, lun); | ||
9783 | } | ||
9784 | |||
9785 | /** | ||
9786 | * ipr_initiate_ioa_bringdown - Bring down an adapter | 9764 | * ipr_initiate_ioa_bringdown - Bring down an adapter |
9787 | * @ioa_cfg: ioa config struct | 9765 | * @ioa_cfg: ioa config struct |
9788 | * @shutdown_type: shutdown type | 9766 | * @shutdown_type: shutdown type |
@@ -9937,10 +9915,6 @@ static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id) | |||
9937 | } | 9915 | } |
9938 | 9916 | ||
9939 | scsi_scan_host(ioa_cfg->host); | 9917 | scsi_scan_host(ioa_cfg->host); |
9940 | ipr_scan_vsets(ioa_cfg); | ||
9941 | scsi_add_device(ioa_cfg->host, IPR_IOA_BUS, IPR_IOA_TARGET, IPR_IOA_LUN); | ||
9942 | ioa_cfg->allow_ml_add_del = 1; | ||
9943 | ioa_cfg->host->max_channel = IPR_VSET_BUS; | ||
9944 | ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight; | 9918 | ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight; |
9945 | 9919 | ||
9946 | if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { | 9920 | if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 9ebdebd944e7..b4f3eec51bc9 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
@@ -157,13 +157,11 @@ | |||
157 | 157 | ||
158 | #define IPR_MAX_NUM_TARGETS_PER_BUS 256 | 158 | #define IPR_MAX_NUM_TARGETS_PER_BUS 256 |
159 | #define IPR_MAX_NUM_LUNS_PER_TARGET 256 | 159 | #define IPR_MAX_NUM_LUNS_PER_TARGET 256 |
160 | #define IPR_MAX_NUM_VSET_LUNS_PER_TARGET 8 | ||
161 | #define IPR_VSET_BUS 0xff | 160 | #define IPR_VSET_BUS 0xff |
162 | #define IPR_IOA_BUS 0xff | 161 | #define IPR_IOA_BUS 0xff |
163 | #define IPR_IOA_TARGET 0xff | 162 | #define IPR_IOA_TARGET 0xff |
164 | #define IPR_IOA_LUN 0xff | 163 | #define IPR_IOA_LUN 0xff |
165 | #define IPR_MAX_NUM_BUSES 16 | 164 | #define IPR_MAX_NUM_BUSES 16 |
166 | #define IPR_MAX_BUS_TO_SCAN IPR_MAX_NUM_BUSES | ||
167 | 165 | ||
168 | #define IPR_NUM_RESET_RELOAD_RETRIES 3 | 166 | #define IPR_NUM_RESET_RELOAD_RETRIES 3 |
169 | 167 | ||
@@ -1453,7 +1451,7 @@ struct ipr_ioa_cfg { | |||
1453 | u8 in_ioa_bringdown:1; | 1451 | u8 in_ioa_bringdown:1; |
1454 | u8 ioa_unit_checked:1; | 1452 | u8 ioa_unit_checked:1; |
1455 | u8 dump_taken:1; | 1453 | u8 dump_taken:1; |
1456 | u8 allow_ml_add_del:1; | 1454 | u8 scan_done:1; |
1457 | u8 needs_hard_reset:1; | 1455 | u8 needs_hard_reset:1; |
1458 | u8 dual_raid:1; | 1456 | u8 dual_raid:1; |
1459 | u8 needs_warm_reset:1; | 1457 | u8 needs_warm_reset:1; |
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c index 724c6265b667..cd41b63a2f10 100644 --- a/drivers/scsi/isci/init.c +++ b/drivers/scsi/isci/init.c | |||
@@ -158,7 +158,6 @@ static struct scsi_host_template isci_sht = { | |||
158 | .scan_finished = isci_host_scan_finished, | 158 | .scan_finished = isci_host_scan_finished, |
159 | .scan_start = isci_host_start, | 159 | .scan_start = isci_host_start, |
160 | .change_queue_depth = sas_change_queue_depth, | 160 | .change_queue_depth = sas_change_queue_depth, |
161 | .change_queue_type = sas_change_queue_type, | ||
162 | .bios_param = sas_bios_param, | 161 | .bios_param = sas_bios_param, |
163 | .can_queue = ISCI_CAN_QUEUE_VAL, | 162 | .can_queue = ISCI_CAN_QUEUE_VAL, |
164 | .cmd_per_lun = 1, | 163 | .cmd_per_lun = 1, |
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index 72918d227ead..519dac4e341e 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c | |||
@@ -906,13 +906,6 @@ int sas_change_queue_depth(struct scsi_device *sdev, int depth) | |||
906 | return scsi_change_queue_depth(sdev, depth); | 906 | return scsi_change_queue_depth(sdev, depth); |
907 | } | 907 | } |
908 | 908 | ||
909 | int sas_change_queue_type(struct scsi_device *scsi_dev, int type) | ||
910 | { | ||
911 | if (dev_is_sata(sdev_to_domain_dev(scsi_dev))) | ||
912 | return -EINVAL; | ||
913 | return scsi_change_queue_type(scsi_dev, type); | ||
914 | } | ||
915 | |||
916 | int sas_bios_param(struct scsi_device *scsi_dev, | 909 | int sas_bios_param(struct scsi_device *scsi_dev, |
917 | struct block_device *bdev, | 910 | struct block_device *bdev, |
918 | sector_t capacity, int *hsc) | 911 | sector_t capacity, int *hsc) |
@@ -1011,7 +1004,6 @@ EXPORT_SYMBOL_GPL(sas_queuecommand); | |||
1011 | EXPORT_SYMBOL_GPL(sas_target_alloc); | 1004 | EXPORT_SYMBOL_GPL(sas_target_alloc); |
1012 | EXPORT_SYMBOL_GPL(sas_slave_configure); | 1005 | EXPORT_SYMBOL_GPL(sas_slave_configure); |
1013 | EXPORT_SYMBOL_GPL(sas_change_queue_depth); | 1006 | EXPORT_SYMBOL_GPL(sas_change_queue_depth); |
1014 | EXPORT_SYMBOL_GPL(sas_change_queue_type); | ||
1015 | EXPORT_SYMBOL_GPL(sas_bios_param); | 1007 | EXPORT_SYMBOL_GPL(sas_bios_param); |
1016 | EXPORT_SYMBOL_GPL(sas_task_abort); | 1008 | EXPORT_SYMBOL_GPL(sas_task_abort); |
1017 | EXPORT_SYMBOL_GPL(sas_phy_reset); | 1009 | EXPORT_SYMBOL_GPL(sas_phy_reset); |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index fd85952b621d..4f9222eb2266 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -5879,7 +5879,6 @@ struct scsi_host_template lpfc_template = { | |||
5879 | .max_sectors = 0xFFFF, | 5879 | .max_sectors = 0xFFFF, |
5880 | .vendor_id = LPFC_NL_VENDOR_ID, | 5880 | .vendor_id = LPFC_NL_VENDOR_ID, |
5881 | .change_queue_depth = scsi_change_queue_depth, | 5881 | .change_queue_depth = scsi_change_queue_depth, |
5882 | .change_queue_type = scsi_change_queue_type, | ||
5883 | .use_blk_tags = 1, | 5882 | .use_blk_tags = 1, |
5884 | .track_queue_depth = 1, | 5883 | .track_queue_depth = 1, |
5885 | }; | 5884 | }; |
@@ -5904,7 +5903,6 @@ struct scsi_host_template lpfc_vport_template = { | |||
5904 | .shost_attrs = lpfc_vport_attrs, | 5903 | .shost_attrs = lpfc_vport_attrs, |
5905 | .max_sectors = 0xFFFF, | 5904 | .max_sectors = 0xFFFF, |
5906 | .change_queue_depth = scsi_change_queue_depth, | 5905 | .change_queue_depth = scsi_change_queue_depth, |
5907 | .change_queue_type = scsi_change_queue_type, | ||
5908 | .use_blk_tags = 1, | 5906 | .use_blk_tags = 1, |
5909 | .track_queue_depth = 1, | 5907 | .track_queue_depth = 1, |
5910 | }; | 5908 | }; |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 8431eb10bbb1..6a1c036a6f3f 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -7592,7 +7592,6 @@ static struct scsi_host_template scsih_driver_template = { | |||
7592 | .scan_finished = _scsih_scan_finished, | 7592 | .scan_finished = _scsih_scan_finished, |
7593 | .scan_start = _scsih_scan_start, | 7593 | .scan_start = _scsih_scan_start, |
7594 | .change_queue_depth = _scsih_change_queue_depth, | 7594 | .change_queue_depth = _scsih_change_queue_depth, |
7595 | .change_queue_type = scsi_change_queue_type, | ||
7596 | .eh_abort_handler = _scsih_abort, | 7595 | .eh_abort_handler = _scsih_abort, |
7597 | .eh_device_reset_handler = _scsih_dev_reset, | 7596 | .eh_device_reset_handler = _scsih_dev_reset, |
7598 | .eh_target_reset_handler = _scsih_target_reset, | 7597 | .eh_target_reset_handler = _scsih_target_reset, |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c index 0d1d06488a28..e689bf20a3ea 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c | |||
@@ -1006,12 +1006,9 @@ mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, | |||
1006 | &mpt2sas_phy->remote_identify); | 1006 | &mpt2sas_phy->remote_identify); |
1007 | _transport_add_phy_to_an_existing_port(ioc, sas_node, | 1007 | _transport_add_phy_to_an_existing_port(ioc, sas_node, |
1008 | mpt2sas_phy, mpt2sas_phy->remote_identify.sas_address); | 1008 | mpt2sas_phy, mpt2sas_phy->remote_identify.sas_address); |
1009 | } else { | 1009 | } else |
1010 | memset(&mpt2sas_phy->remote_identify, 0 , sizeof(struct | 1010 | memset(&mpt2sas_phy->remote_identify, 0 , sizeof(struct |
1011 | sas_identify)); | 1011 | sas_identify)); |
1012 | _transport_del_phy_from_an_existing_port(ioc, sas_node, | ||
1013 | mpt2sas_phy); | ||
1014 | } | ||
1015 | 1012 | ||
1016 | if (mpt2sas_phy->phy) | 1013 | if (mpt2sas_phy->phy) |
1017 | mpt2sas_phy->phy->negotiated_linkrate = | 1014 | mpt2sas_phy->phy->negotiated_linkrate = |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index a2b60991efd4..94261ee9e72d 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | |||
@@ -7229,7 +7229,6 @@ static struct scsi_host_template scsih_driver_template = { | |||
7229 | .scan_finished = _scsih_scan_finished, | 7229 | .scan_finished = _scsih_scan_finished, |
7230 | .scan_start = _scsih_scan_start, | 7230 | .scan_start = _scsih_scan_start, |
7231 | .change_queue_depth = _scsih_change_queue_depth, | 7231 | .change_queue_depth = _scsih_change_queue_depth, |
7232 | .change_queue_type = scsi_change_queue_type, | ||
7233 | .eh_abort_handler = _scsih_abort, | 7232 | .eh_abort_handler = _scsih_abort, |
7234 | .eh_device_reset_handler = _scsih_dev_reset, | 7233 | .eh_device_reset_handler = _scsih_dev_reset, |
7235 | .eh_target_reset_handler = _scsih_target_reset, | 7234 | .eh_target_reset_handler = _scsih_target_reset, |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c b/drivers/scsi/mpt3sas/mpt3sas_transport.c index d4bafaaebea9..3637ae6c0171 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_transport.c +++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c | |||
@@ -1003,12 +1003,9 @@ mpt3sas_transport_update_links(struct MPT3SAS_ADAPTER *ioc, | |||
1003 | &mpt3sas_phy->remote_identify); | 1003 | &mpt3sas_phy->remote_identify); |
1004 | _transport_add_phy_to_an_existing_port(ioc, sas_node, | 1004 | _transport_add_phy_to_an_existing_port(ioc, sas_node, |
1005 | mpt3sas_phy, mpt3sas_phy->remote_identify.sas_address); | 1005 | mpt3sas_phy, mpt3sas_phy->remote_identify.sas_address); |
1006 | } else { | 1006 | } else |
1007 | memset(&mpt3sas_phy->remote_identify, 0 , sizeof(struct | 1007 | memset(&mpt3sas_phy->remote_identify, 0 , sizeof(struct |
1008 | sas_identify)); | 1008 | sas_identify)); |
1009 | _transport_del_phy_from_an_existing_port(ioc, sas_node, | ||
1010 | mpt3sas_phy); | ||
1011 | } | ||
1012 | 1009 | ||
1013 | if (mpt3sas_phy->phy) | 1010 | if (mpt3sas_phy->phy) |
1014 | mpt3sas_phy->phy->negotiated_linkrate = | 1011 | mpt3sas_phy->phy->negotiated_linkrate = |
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index f15df3de6790..53030b0e8015 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c | |||
@@ -54,7 +54,6 @@ static struct scsi_host_template mvs_sht = { | |||
54 | .scan_finished = mvs_scan_finished, | 54 | .scan_finished = mvs_scan_finished, |
55 | .scan_start = mvs_scan_start, | 55 | .scan_start = mvs_scan_start, |
56 | .change_queue_depth = sas_change_queue_depth, | 56 | .change_queue_depth = sas_change_queue_depth, |
57 | .change_queue_type = sas_change_queue_type, | ||
58 | .bios_param = sas_bios_param, | 57 | .bios_param = sas_bios_param, |
59 | .can_queue = 1, | 58 | .can_queue = 1, |
60 | .cmd_per_lun = 1, | 59 | .cmd_per_lun = 1, |
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c index 329aba0083ab..65555916d3b8 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c | |||
@@ -76,7 +76,6 @@ static struct scsi_host_template pm8001_sht = { | |||
76 | .scan_finished = pm8001_scan_finished, | 76 | .scan_finished = pm8001_scan_finished, |
77 | .scan_start = pm8001_scan_start, | 77 | .scan_start = pm8001_scan_start, |
78 | .change_queue_depth = sas_change_queue_depth, | 78 | .change_queue_depth = sas_change_queue_depth, |
79 | .change_queue_type = sas_change_queue_type, | ||
80 | .bios_param = sas_bios_param, | 79 | .bios_param = sas_bios_param, |
81 | .can_queue = 1, | 80 | .can_queue = 1, |
82 | .cmd_per_lun = 1, | 81 | .cmd_per_lun = 1, |
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index b1b1f66b1ab7..8c27b6a77ec4 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c | |||
@@ -4251,7 +4251,6 @@ static struct scsi_host_template pmcraid_host_template = { | |||
4251 | .slave_configure = pmcraid_slave_configure, | 4251 | .slave_configure = pmcraid_slave_configure, |
4252 | .slave_destroy = pmcraid_slave_destroy, | 4252 | .slave_destroy = pmcraid_slave_destroy, |
4253 | .change_queue_depth = pmcraid_change_queue_depth, | 4253 | .change_queue_depth = pmcraid_change_queue_depth, |
4254 | .change_queue_type = scsi_change_queue_type, | ||
4255 | .can_queue = PMCRAID_MAX_IO_CMD, | 4254 | .can_queue = PMCRAID_MAX_IO_CMD, |
4256 | .this_id = -1, | 4255 | .this_id = -1, |
4257 | .sg_tablesize = PMCRAID_MAX_IOADLS, | 4256 | .sg_tablesize = PMCRAID_MAX_IOADLS, |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index a4dde7e80dbd..e59f25bff7ab 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -3237,8 +3237,6 @@ qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
3237 | struct fc_rport *rport; | 3237 | struct fc_rport *rport; |
3238 | unsigned long flags; | 3238 | unsigned long flags; |
3239 | 3239 | ||
3240 | qla2x00_rport_del(fcport); | ||
3241 | |||
3242 | rport_ids.node_name = wwn_to_u64(fcport->node_name); | 3240 | rport_ids.node_name = wwn_to_u64(fcport->node_name); |
3243 | rport_ids.port_name = wwn_to_u64(fcport->port_name); | 3241 | rport_ids.port_name = wwn_to_u64(fcport->port_name); |
3244 | rport_ids.port_id = fcport->d_id.b.domain << 16 | | 3242 | rport_ids.port_id = fcport->d_id.b.domain << 16 | |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 6b4d9235368a..12ca291c1380 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -258,7 +258,6 @@ struct scsi_host_template qla2xxx_driver_template = { | |||
258 | .scan_finished = qla2xxx_scan_finished, | 258 | .scan_finished = qla2xxx_scan_finished, |
259 | .scan_start = qla2xxx_scan_start, | 259 | .scan_start = qla2xxx_scan_start, |
260 | .change_queue_depth = scsi_change_queue_depth, | 260 | .change_queue_depth = scsi_change_queue_depth, |
261 | .change_queue_type = scsi_change_queue_type, | ||
262 | .this_id = -1, | 261 | .this_id = -1, |
263 | .cmd_per_lun = 3, | 262 | .cmd_per_lun = 3, |
264 | .use_clustering = ENABLE_CLUSTERING, | 263 | .use_clustering = ENABLE_CLUSTERING, |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index a902fa1db7af..57418258c101 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
@@ -3218,25 +3218,25 @@ static inline int qlt_get_fcp_task_attr(struct scsi_qla_host *vha, | |||
3218 | 3218 | ||
3219 | switch (task_codes) { | 3219 | switch (task_codes) { |
3220 | case ATIO_SIMPLE_QUEUE: | 3220 | case ATIO_SIMPLE_QUEUE: |
3221 | fcp_task_attr = MSG_SIMPLE_TAG; | 3221 | fcp_task_attr = TCM_SIMPLE_TAG; |
3222 | break; | 3222 | break; |
3223 | case ATIO_HEAD_OF_QUEUE: | 3223 | case ATIO_HEAD_OF_QUEUE: |
3224 | fcp_task_attr = MSG_HEAD_TAG; | 3224 | fcp_task_attr = TCM_HEAD_TAG; |
3225 | break; | 3225 | break; |
3226 | case ATIO_ORDERED_QUEUE: | 3226 | case ATIO_ORDERED_QUEUE: |
3227 | fcp_task_attr = MSG_ORDERED_TAG; | 3227 | fcp_task_attr = TCM_ORDERED_TAG; |
3228 | break; | 3228 | break; |
3229 | case ATIO_ACA_QUEUE: | 3229 | case ATIO_ACA_QUEUE: |
3230 | fcp_task_attr = MSG_ACA_TAG; | 3230 | fcp_task_attr = TCM_ACA_TAG; |
3231 | break; | 3231 | break; |
3232 | case ATIO_UNTAGGED: | 3232 | case ATIO_UNTAGGED: |
3233 | fcp_task_attr = MSG_SIMPLE_TAG; | 3233 | fcp_task_attr = TCM_SIMPLE_TAG; |
3234 | break; | 3234 | break; |
3235 | default: | 3235 | default: |
3236 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05d, | 3236 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05d, |
3237 | "qla_target: unknown task code %x, use ORDERED instead\n", | 3237 | "qla_target: unknown task code %x, use ORDERED instead\n", |
3238 | task_codes); | 3238 | task_codes); |
3239 | fcp_task_attr = MSG_ORDERED_TAG; | 3239 | fcp_task_attr = TCM_ORDERED_TAG; |
3240 | break; | 3240 | break; |
3241 | } | 3241 | } |
3242 | 3242 | ||
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 1ad0c36375b8..e02885451425 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -739,34 +739,12 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth) | |||
739 | 739 | ||
740 | if (sdev->last_queue_full_count <= 10) | 740 | if (sdev->last_queue_full_count <= 10) |
741 | return 0; | 741 | return 0; |
742 | if (sdev->last_queue_full_depth < 8) { | ||
743 | /* Drop back to untagged */ | ||
744 | scsi_set_tag_type(sdev, 0); | ||
745 | scsi_change_queue_depth(sdev, sdev->host->cmd_per_lun); | ||
746 | return -1; | ||
747 | } | ||
748 | 742 | ||
749 | return scsi_change_queue_depth(sdev, depth); | 743 | return scsi_change_queue_depth(sdev, depth); |
750 | } | 744 | } |
751 | EXPORT_SYMBOL(scsi_track_queue_full); | 745 | EXPORT_SYMBOL(scsi_track_queue_full); |
752 | 746 | ||
753 | /** | 747 | /** |
754 | * scsi_change_queue_type() - Change a device's queue type | ||
755 | * @sdev: The SCSI device whose queue depth is to change | ||
756 | * @tag_type: Identifier for queue type | ||
757 | */ | ||
758 | int scsi_change_queue_type(struct scsi_device *sdev, int tag_type) | ||
759 | { | ||
760 | if (!sdev->tagged_supported) | ||
761 | return 0; | ||
762 | |||
763 | scsi_set_tag_type(sdev, tag_type); | ||
764 | return tag_type; | ||
765 | |||
766 | } | ||
767 | EXPORT_SYMBOL(scsi_change_queue_type); | ||
768 | |||
769 | /** | ||
770 | * scsi_vpd_inquiry - Request a device provide us with a VPD page | 748 | * scsi_vpd_inquiry - Request a device provide us with a VPD page |
771 | * @sdev: The device to ask | 749 | * @sdev: The device to ask |
772 | * @buffer: Where to put the result | 750 | * @buffer: Where to put the result |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index aa4b6b80aade..7b8b51bc29b4 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -128,7 +128,6 @@ static const char *scsi_debug_version_date = "20141022"; | |||
128 | #define DEF_REMOVABLE false | 128 | #define DEF_REMOVABLE false |
129 | #define DEF_SCSI_LEVEL 6 /* INQUIRY, byte2 [6->SPC-4] */ | 129 | #define DEF_SCSI_LEVEL 6 /* INQUIRY, byte2 [6->SPC-4] */ |
130 | #define DEF_SECTOR_SIZE 512 | 130 | #define DEF_SECTOR_SIZE 512 |
131 | #define DEF_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */ | ||
132 | #define DEF_UNMAP_ALIGNMENT 0 | 131 | #define DEF_UNMAP_ALIGNMENT 0 |
133 | #define DEF_UNMAP_GRANULARITY 1 | 132 | #define DEF_UNMAP_GRANULARITY 1 |
134 | #define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF | 133 | #define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF |
@@ -817,6 +816,7 @@ static int check_readiness(struct scsi_cmnd *SCpnt, int uas_only, | |||
817 | UA_CHANGED_ASC, CAPACITY_CHANGED_ASCQ); | 816 | UA_CHANGED_ASC, CAPACITY_CHANGED_ASCQ); |
818 | if (debug) | 817 | if (debug) |
819 | cp = "capacity data changed"; | 818 | cp = "capacity data changed"; |
819 | break; | ||
820 | default: | 820 | default: |
821 | pr_warn("%s: unexpected unit attention code=%d\n", | 821 | pr_warn("%s: unexpected unit attention code=%d\n", |
822 | __func__, k); | 822 | __func__, k); |
@@ -3045,18 +3045,12 @@ resp_comp_write(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
3045 | u8 num; | 3045 | u8 num; |
3046 | unsigned long iflags; | 3046 | unsigned long iflags; |
3047 | int ret; | 3047 | int ret; |
3048 | int retval = 0; | ||
3048 | 3049 | ||
3049 | lba = get_unaligned_be32(cmd + 2); | 3050 | lba = get_unaligned_be64(cmd + 2); |
3050 | num = cmd[13]; /* 1 to a maximum of 255 logical blocks */ | 3051 | num = cmd[13]; /* 1 to a maximum of 255 logical blocks */ |
3051 | if (0 == num) | 3052 | if (0 == num) |
3052 | return 0; /* degenerate case, not an error */ | 3053 | return 0; /* degenerate case, not an error */ |
3053 | dnum = 2 * num; | ||
3054 | arr = kzalloc(dnum * lb_size, GFP_ATOMIC); | ||
3055 | if (NULL == arr) { | ||
3056 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, | ||
3057 | INSUFF_RES_ASCQ); | ||
3058 | return check_condition_result; | ||
3059 | } | ||
3060 | if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION && | 3054 | if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION && |
3061 | (cmd[1] & 0xe0)) { | 3055 | (cmd[1] & 0xe0)) { |
3062 | mk_sense_invalid_opcode(scp); | 3056 | mk_sense_invalid_opcode(scp); |
@@ -3079,6 +3073,13 @@ resp_comp_write(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
3079 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); | 3073 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0); |
3080 | return check_condition_result; | 3074 | return check_condition_result; |
3081 | } | 3075 | } |
3076 | dnum = 2 * num; | ||
3077 | arr = kzalloc(dnum * lb_size, GFP_ATOMIC); | ||
3078 | if (NULL == arr) { | ||
3079 | mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC, | ||
3080 | INSUFF_RES_ASCQ); | ||
3081 | return check_condition_result; | ||
3082 | } | ||
3082 | 3083 | ||
3083 | write_lock_irqsave(&atomic_rw, iflags); | 3084 | write_lock_irqsave(&atomic_rw, iflags); |
3084 | 3085 | ||
@@ -3089,24 +3090,24 @@ resp_comp_write(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) | |||
3089 | ret = do_device_access(scp, 0, dnum, true); | 3090 | ret = do_device_access(scp, 0, dnum, true); |
3090 | fake_storep = fake_storep_hold; | 3091 | fake_storep = fake_storep_hold; |
3091 | if (ret == -1) { | 3092 | if (ret == -1) { |
3092 | write_unlock_irqrestore(&atomic_rw, iflags); | 3093 | retval = DID_ERROR << 16; |
3093 | kfree(arr); | 3094 | goto cleanup; |
3094 | return DID_ERROR << 16; | ||
3095 | } else if ((ret < (dnum * lb_size)) && | 3095 | } else if ((ret < (dnum * lb_size)) && |
3096 | (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)) | 3096 | (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)) |
3097 | sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb " | 3097 | sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb " |
3098 | "indicated=%u, IO sent=%d bytes\n", my_name, | 3098 | "indicated=%u, IO sent=%d bytes\n", my_name, |
3099 | dnum * lb_size, ret); | 3099 | dnum * lb_size, ret); |
3100 | if (!comp_write_worker(lba, num, arr)) { | 3100 | if (!comp_write_worker(lba, num, arr)) { |
3101 | write_unlock_irqrestore(&atomic_rw, iflags); | ||
3102 | kfree(arr); | ||
3103 | mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0); | 3101 | mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0); |
3104 | return check_condition_result; | 3102 | retval = check_condition_result; |
3103 | goto cleanup; | ||
3105 | } | 3104 | } |
3106 | if (scsi_debug_lbp()) | 3105 | if (scsi_debug_lbp()) |
3107 | map_region(lba, num); | 3106 | map_region(lba, num); |
3107 | cleanup: | ||
3108 | write_unlock_irqrestore(&atomic_rw, iflags); | 3108 | write_unlock_irqrestore(&atomic_rw, iflags); |
3109 | return 0; | 3109 | kfree(arr); |
3110 | return retval; | ||
3110 | } | 3111 | } |
3111 | 3112 | ||
3112 | struct unmap_block_desc { | 3113 | struct unmap_block_desc { |
@@ -4438,6 +4439,7 @@ static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf, | |||
4438 | struct sdebug_host_info *sdhp; | 4439 | struct sdebug_host_info *sdhp; |
4439 | struct sdebug_dev_info *dp; | 4440 | struct sdebug_dev_info *dp; |
4440 | 4441 | ||
4442 | spin_lock(&sdebug_host_list_lock); | ||
4441 | list_for_each_entry(sdhp, &sdebug_host_list, | 4443 | list_for_each_entry(sdhp, &sdebug_host_list, |
4442 | host_list) { | 4444 | host_list) { |
4443 | list_for_each_entry(dp, &sdhp->dev_info_list, | 4445 | list_for_each_entry(dp, &sdhp->dev_info_list, |
@@ -4446,6 +4448,7 @@ static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf, | |||
4446 | dp->uas_bm); | 4448 | dp->uas_bm); |
4447 | } | 4449 | } |
4448 | } | 4450 | } |
4451 | spin_unlock(&sdebug_host_list_lock); | ||
4449 | } | 4452 | } |
4450 | return count; | 4453 | return count; |
4451 | } | 4454 | } |
@@ -4988,32 +4991,6 @@ sdebug_change_qdepth(struct scsi_device *sdev, int qdepth) | |||
4988 | } | 4991 | } |
4989 | 4992 | ||
4990 | static int | 4993 | static int |
4991 | sdebug_change_qtype(struct scsi_device *sdev, int qtype) | ||
4992 | { | ||
4993 | qtype = scsi_change_queue_type(sdev, qtype); | ||
4994 | if (SCSI_DEBUG_OPT_Q_NOISE & scsi_debug_opts) { | ||
4995 | const char *cp; | ||
4996 | |||
4997 | switch (qtype) { | ||
4998 | case 0: | ||
4999 | cp = "untagged"; | ||
5000 | break; | ||
5001 | case MSG_SIMPLE_TAG: | ||
5002 | cp = "simple tags"; | ||
5003 | break; | ||
5004 | case MSG_ORDERED_TAG: | ||
5005 | cp = "ordered tags"; | ||
5006 | break; | ||
5007 | default: | ||
5008 | cp = "unknown"; | ||
5009 | break; | ||
5010 | } | ||
5011 | sdev_printk(KERN_INFO, sdev, "%s: to %s\n", __func__, cp); | ||
5012 | } | ||
5013 | return qtype; | ||
5014 | } | ||
5015 | |||
5016 | static int | ||
5017 | check_inject(struct scsi_cmnd *scp) | 4994 | check_inject(struct scsi_cmnd *scp) |
5018 | { | 4995 | { |
5019 | struct sdebug_scmd_extra_t *ep = scsi_cmd_priv(scp); | 4996 | struct sdebug_scmd_extra_t *ep = scsi_cmd_priv(scp); |
@@ -5212,7 +5189,6 @@ static struct scsi_host_template sdebug_driver_template = { | |||
5212 | .ioctl = scsi_debug_ioctl, | 5189 | .ioctl = scsi_debug_ioctl, |
5213 | .queuecommand = sdebug_queuecommand_lock_or_not, | 5190 | .queuecommand = sdebug_queuecommand_lock_or_not, |
5214 | .change_queue_depth = sdebug_change_qdepth, | 5191 | .change_queue_depth = sdebug_change_qdepth, |
5215 | .change_queue_type = sdebug_change_qtype, | ||
5216 | .eh_abort_handler = scsi_debug_abort, | 5192 | .eh_abort_handler = scsi_debug_abort, |
5217 | .eh_device_reset_handler = scsi_debug_device_reset, | 5193 | .eh_device_reset_handler = scsi_debug_device_reset, |
5218 | .eh_target_reset_handler = scsi_debug_target_reset, | 5194 | .eh_target_reset_handler = scsi_debug_target_reset, |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index c1d04d4d3c6c..262ab837a704 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
@@ -211,6 +211,7 @@ static struct { | |||
211 | {"Medion", "Flash XL MMC/SD", "2.6D", BLIST_FORCELUN}, | 211 | {"Medion", "Flash XL MMC/SD", "2.6D", BLIST_FORCELUN}, |
212 | {"MegaRAID", "LD", NULL, BLIST_FORCELUN}, | 212 | {"MegaRAID", "LD", NULL, BLIST_FORCELUN}, |
213 | {"MICROP", "4110", NULL, BLIST_NOTQ}, | 213 | {"MICROP", "4110", NULL, BLIST_NOTQ}, |
214 | {"MSFT", "Virtual HD", NULL, BLIST_NO_RSOC}, | ||
214 | {"MYLEX", "DACARMRB", "*", BLIST_REPORTLUN2}, | 215 | {"MYLEX", "DACARMRB", "*", BLIST_REPORTLUN2}, |
215 | {"nCipher", "Fastness Crypto", NULL, BLIST_FORCELUN}, | 216 | {"nCipher", "Fastness Crypto", NULL, BLIST_FORCELUN}, |
216 | {"NAKAMICH", "MJ-4.8S", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 217 | {"NAKAMICH", "MJ-4.8S", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 43318d556cbc..9ea95dd3e260 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1918,7 +1918,9 @@ static int scsi_mq_prep_fn(struct request *req) | |||
1918 | 1918 | ||
1919 | if (scsi_host_get_prot(shost)) { | 1919 | if (scsi_host_get_prot(shost)) { |
1920 | cmd->prot_sdb = (void *)sg + | 1920 | cmd->prot_sdb = (void *)sg + |
1921 | shost->sg_tablesize * sizeof(struct scatterlist); | 1921 | min_t(unsigned int, |
1922 | shost->sg_tablesize, SCSI_MAX_SG_SEGMENTS) * | ||
1923 | sizeof(struct scatterlist); | ||
1922 | memset(cmd->prot_sdb, 0, sizeof(struct scsi_data_buffer)); | 1924 | memset(cmd->prot_sdb, 0, sizeof(struct scsi_data_buffer)); |
1923 | 1925 | ||
1924 | cmd->prot_sdb->table.sgl = | 1926 | cmd->prot_sdb->table.sgl = |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 1cb64a8e18c9..1ac38e73df7e 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -738,30 +738,12 @@ store_queue_type_field(struct device *dev, struct device_attribute *attr, | |||
738 | const char *buf, size_t count) | 738 | const char *buf, size_t count) |
739 | { | 739 | { |
740 | struct scsi_device *sdev = to_scsi_device(dev); | 740 | struct scsi_device *sdev = to_scsi_device(dev); |
741 | struct scsi_host_template *sht = sdev->host->hostt; | ||
742 | int tag_type = 0, retval; | ||
743 | int prev_tag_type = scsi_get_tag_type(sdev); | ||
744 | |||
745 | if (!sdev->tagged_supported || !sht->change_queue_type) | ||
746 | return -EINVAL; | ||
747 | 741 | ||
748 | /* | 742 | if (!sdev->tagged_supported) |
749 | * We're never issueing order tags these days, but allow the value | ||
750 | * for backwards compatibility. | ||
751 | */ | ||
752 | if (strncmp(buf, "ordered", 7) == 0 || | ||
753 | strncmp(buf, "simple", 6) == 0) | ||
754 | tag_type = MSG_SIMPLE_TAG; | ||
755 | else if (strncmp(buf, "none", 4) != 0) | ||
756 | return -EINVAL; | 743 | return -EINVAL; |
757 | 744 | ||
758 | if (tag_type == prev_tag_type) | 745 | sdev_printk(KERN_INFO, sdev, |
759 | return count; | 746 | "ignoring write to deprecated queue_type attribute"); |
760 | |||
761 | retval = sht->change_queue_type(sdev, tag_type); | ||
762 | if (retval < 0) | ||
763 | return retval; | ||
764 | |||
765 | return count; | 747 | return count; |
766 | } | 748 | } |
767 | 749 | ||
@@ -938,10 +920,6 @@ static umode_t scsi_sdev_attr_is_visible(struct kobject *kobj, | |||
938 | !sdev->host->hostt->change_queue_depth) | 920 | !sdev->host->hostt->change_queue_depth) |
939 | return 0; | 921 | return 0; |
940 | 922 | ||
941 | if (attr == &dev_attr_queue_type.attr && | ||
942 | !sdev->host->hostt->change_queue_type) | ||
943 | return S_IRUGO; | ||
944 | |||
945 | return attr->mode; | 923 | return attr->mode; |
946 | } | 924 | } |
947 | 925 | ||
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index fa2aece76cc2..31bbb0da3397 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c | |||
@@ -1221,7 +1221,7 @@ EXPORT_SYMBOL_GPL(spi_populate_ppr_msg); | |||
1221 | int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd) | 1221 | int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd) |
1222 | { | 1222 | { |
1223 | if (cmd->flags & SCMD_TAGGED) { | 1223 | if (cmd->flags & SCMD_TAGGED) { |
1224 | *msg++ = MSG_SIMPLE_TAG; | 1224 | *msg++ = SIMPLE_QUEUE_TAG; |
1225 | *msg++ = cmd->request->tag; | 1225 | *msg++ = cmd->request->tag; |
1226 | return 2; | 1226 | return 2; |
1227 | } | 1227 | } |
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index e3ba251fb6e7..4cff0ddc2c25 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c | |||
@@ -1688,13 +1688,12 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd) | |||
1688 | if (ret == -EAGAIN) { | 1688 | if (ret == -EAGAIN) { |
1689 | /* no more space */ | 1689 | /* no more space */ |
1690 | 1690 | ||
1691 | if (cmd_request->bounce_sgl_count) { | 1691 | if (cmd_request->bounce_sgl_count) |
1692 | destroy_bounce_buffer(cmd_request->bounce_sgl, | 1692 | destroy_bounce_buffer(cmd_request->bounce_sgl, |
1693 | cmd_request->bounce_sgl_count); | 1693 | cmd_request->bounce_sgl_count); |
1694 | 1694 | ||
1695 | ret = SCSI_MLQUEUE_DEVICE_BUSY; | 1695 | ret = SCSI_MLQUEUE_DEVICE_BUSY; |
1696 | goto queue_error; | 1696 | goto queue_error; |
1697 | } | ||
1698 | } | 1697 | } |
1699 | 1698 | ||
1700 | return 0; | 1699 | return 0; |
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c index 43781c9fe521..b410499cddca 100644 --- a/drivers/spi/spi-img-spfi.c +++ b/drivers/spi/spi-img-spfi.c | |||
@@ -663,7 +663,7 @@ static int img_spfi_remove(struct platform_device *pdev) | |||
663 | return 0; | 663 | return 0; |
664 | } | 664 | } |
665 | 665 | ||
666 | #ifdef CONFIG_PM_RUNTIME | 666 | #ifdef CONFIG_PM |
667 | static int img_spfi_runtime_suspend(struct device *dev) | 667 | static int img_spfi_runtime_suspend(struct device *dev) |
668 | { | 668 | { |
669 | struct spi_master *master = dev_get_drvdata(dev); | 669 | struct spi_master *master = dev_get_drvdata(dev); |
@@ -692,7 +692,7 @@ static int img_spfi_runtime_resume(struct device *dev) | |||
692 | 692 | ||
693 | return 0; | 693 | return 0; |
694 | } | 694 | } |
695 | #endif /* CONFIG_PM_RUNTIME */ | 695 | #endif /* CONFIG_PM */ |
696 | 696 | ||
697 | #ifdef CONFIG_PM_SLEEP | 697 | #ifdef CONFIG_PM_SLEEP |
698 | static int img_spfi_suspend(struct device *dev) | 698 | static int img_spfi_suspend(struct device *dev) |
diff --git a/drivers/spi/spi-meson-spifc.c b/drivers/spi/spi-meson-spifc.c index 0e48f8c2037d..1bbac0378bf7 100644 --- a/drivers/spi/spi-meson-spifc.c +++ b/drivers/spi/spi-meson-spifc.c | |||
@@ -413,7 +413,7 @@ static int meson_spifc_resume(struct device *dev) | |||
413 | } | 413 | } |
414 | #endif /* CONFIG_PM_SLEEP */ | 414 | #endif /* CONFIG_PM_SLEEP */ |
415 | 415 | ||
416 | #ifdef CONFIG_PM_RUNTIME | 416 | #ifdef CONFIG_PM |
417 | static int meson_spifc_runtime_suspend(struct device *dev) | 417 | static int meson_spifc_runtime_suspend(struct device *dev) |
418 | { | 418 | { |
419 | struct spi_master *master = dev_get_drvdata(dev); | 419 | struct spi_master *master = dev_get_drvdata(dev); |
@@ -431,7 +431,7 @@ static int meson_spifc_runtime_resume(struct device *dev) | |||
431 | 431 | ||
432 | return clk_prepare_enable(spifc->clk); | 432 | return clk_prepare_enable(spifc->clk); |
433 | } | 433 | } |
434 | #endif /* CONFIG_PM_RUNTIME */ | 434 | #endif /* CONFIG_PM */ |
435 | 435 | ||
436 | static const struct dev_pm_ops meson_spifc_pm_ops = { | 436 | static const struct dev_pm_ops meson_spifc_pm_ops = { |
437 | SET_SYSTEM_SLEEP_PM_OPS(meson_spifc_suspend, meson_spifc_resume) | 437 | SET_SYSTEM_SLEEP_PM_OPS(meson_spifc_suspend, meson_spifc_resume) |
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index 1bf891bd321a..4f361b77c749 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c | |||
@@ -264,7 +264,7 @@ int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, | |||
264 | 264 | ||
265 | if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) && | 265 | if ((bits & (MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM)) && |
266 | inode->i_sb->s_root != NULL && | 266 | inode->i_sb->s_root != NULL && |
267 | is_root_inode(inode)) | 267 | !is_root_inode(inode)) |
268 | ll_invalidate_aliases(inode); | 268 | ll_invalidate_aliases(inode); |
269 | 269 | ||
270 | iput(inode); | 270 | iput(inode); |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index f8ec32298906..55f6774f706f 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
@@ -944,17 +944,17 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
944 | */ | 944 | */ |
945 | if ((iscsi_task_attr == ISCSI_ATTR_UNTAGGED) || | 945 | if ((iscsi_task_attr == ISCSI_ATTR_UNTAGGED) || |
946 | (iscsi_task_attr == ISCSI_ATTR_SIMPLE)) | 946 | (iscsi_task_attr == ISCSI_ATTR_SIMPLE)) |
947 | sam_task_attr = MSG_SIMPLE_TAG; | 947 | sam_task_attr = TCM_SIMPLE_TAG; |
948 | else if (iscsi_task_attr == ISCSI_ATTR_ORDERED) | 948 | else if (iscsi_task_attr == ISCSI_ATTR_ORDERED) |
949 | sam_task_attr = MSG_ORDERED_TAG; | 949 | sam_task_attr = TCM_ORDERED_TAG; |
950 | else if (iscsi_task_attr == ISCSI_ATTR_HEAD_OF_QUEUE) | 950 | else if (iscsi_task_attr == ISCSI_ATTR_HEAD_OF_QUEUE) |
951 | sam_task_attr = MSG_HEAD_TAG; | 951 | sam_task_attr = TCM_HEAD_TAG; |
952 | else if (iscsi_task_attr == ISCSI_ATTR_ACA) | 952 | else if (iscsi_task_attr == ISCSI_ATTR_ACA) |
953 | sam_task_attr = MSG_ACA_TAG; | 953 | sam_task_attr = TCM_ACA_TAG; |
954 | else { | 954 | else { |
955 | pr_debug("Unknown iSCSI Task Attribute: 0x%02x, using" | 955 | pr_debug("Unknown iSCSI Task Attribute: 0x%02x, using" |
956 | " MSG_SIMPLE_TAG\n", iscsi_task_attr); | 956 | " TCM_SIMPLE_TAG\n", iscsi_task_attr); |
957 | sam_task_attr = MSG_SIMPLE_TAG; | 957 | sam_task_attr = TCM_SIMPLE_TAG; |
958 | } | 958 | } |
959 | 959 | ||
960 | cmd->iscsi_opcode = ISCSI_OP_SCSI_CMD; | 960 | cmd->iscsi_opcode = ISCSI_OP_SCSI_CMD; |
@@ -1812,7 +1812,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
1812 | transport_init_se_cmd(&cmd->se_cmd, | 1812 | transport_init_se_cmd(&cmd->se_cmd, |
1813 | &lio_target_fabric_configfs->tf_ops, | 1813 | &lio_target_fabric_configfs->tf_ops, |
1814 | conn->sess->se_sess, 0, DMA_NONE, | 1814 | conn->sess->se_sess, 0, DMA_NONE, |
1815 | MSG_SIMPLE_TAG, cmd->sense_buffer + 2); | 1815 | TCM_SIMPLE_TAG, cmd->sense_buffer + 2); |
1816 | 1816 | ||
1817 | target_get_sess_cmd(conn->sess->se_sess, &cmd->se_cmd, true); | 1817 | target_get_sess_cmd(conn->sess->se_sess, &cmd->se_cmd, true); |
1818 | sess_ref = true; | 1818 | sess_ref = true; |
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c index 7172a71f9f0b..6b3c32954689 100644 --- a/drivers/target/loopback/tcm_loop.c +++ b/drivers/target/loopback/tcm_loop.c | |||
@@ -168,7 +168,7 @@ static void tcm_loop_submission_work(struct work_struct *work) | |||
168 | 168 | ||
169 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, | 169 | rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, |
170 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, | 170 | &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, |
171 | transfer_length, MSG_SIMPLE_TAG, | 171 | transfer_length, TCM_SIMPLE_TAG, |
172 | sc->sc_data_direction, 0, | 172 | sc->sc_data_direction, 0, |
173 | scsi_sglist(sc), scsi_sg_count(sc), | 173 | scsi_sglist(sc), scsi_sg_count(sc), |
174 | sgl_bidi, sgl_bidi_count, | 174 | sgl_bidi, sgl_bidi_count, |
@@ -258,7 +258,7 @@ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg, | |||
258 | * Initialize struct se_cmd descriptor from target_core_mod infrastructure | 258 | * Initialize struct se_cmd descriptor from target_core_mod infrastructure |
259 | */ | 259 | */ |
260 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, 0, | 260 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, 0, |
261 | DMA_NONE, MSG_SIMPLE_TAG, | 261 | DMA_NONE, TCM_SIMPLE_TAG, |
262 | &tl_cmd->tl_sense_buf[0]); | 262 | &tl_cmd->tl_sense_buf[0]); |
263 | 263 | ||
264 | rc = core_tmr_alloc_req(se_cmd, tl_tmr, tmr, GFP_KERNEL); | 264 | rc = core_tmr_alloc_req(se_cmd, tl_tmr, tmr, GFP_KERNEL); |
@@ -369,7 +369,6 @@ static struct scsi_host_template tcm_loop_driver_template = { | |||
369 | .name = "TCM_Loopback", | 369 | .name = "TCM_Loopback", |
370 | .queuecommand = tcm_loop_queuecommand, | 370 | .queuecommand = tcm_loop_queuecommand, |
371 | .change_queue_depth = scsi_change_queue_depth, | 371 | .change_queue_depth = scsi_change_queue_depth, |
372 | .change_queue_type = scsi_change_queue_type, | ||
373 | .eh_abort_handler = tcm_loop_abort_task, | 372 | .eh_abort_handler = tcm_loop_abort_task, |
374 | .eh_device_reset_handler = tcm_loop_device_reset, | 373 | .eh_device_reset_handler = tcm_loop_device_reset, |
375 | .eh_target_reset_handler = tcm_loop_target_reset, | 374 | .eh_target_reset_handler = tcm_loop_target_reset, |
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c index e7e93727553c..9512af6a8114 100644 --- a/drivers/target/sbp/sbp_target.c +++ b/drivers/target/sbp/sbp_target.c | |||
@@ -1237,7 +1237,7 @@ static void sbp_handle_command(struct sbp_target_request *req) | |||
1237 | 1237 | ||
1238 | if (target_submit_cmd(&req->se_cmd, sess->se_sess, req->cmd_buf, | 1238 | if (target_submit_cmd(&req->se_cmd, sess->se_sess, req->cmd_buf, |
1239 | req->sense_buf, unpacked_lun, data_length, | 1239 | req->sense_buf, unpacked_lun, data_length, |
1240 | MSG_SIMPLE_TAG, data_dir, 0)) | 1240 | TCM_SIMPLE_TAG, data_dir, 0)) |
1241 | goto err; | 1241 | goto err; |
1242 | 1242 | ||
1243 | return; | 1243 | return; |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 74873e42cf7e..1045dcd7bf65 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
@@ -1095,7 +1095,7 @@ pscsi_execute_cmd(struct se_cmd *cmd) | |||
1095 | req->retries = PS_RETRY; | 1095 | req->retries = PS_RETRY; |
1096 | 1096 | ||
1097 | blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req, | 1097 | blk_execute_rq_nowait(pdv->pdv_sd->request_queue, NULL, req, |
1098 | (cmd->sam_task_attr == MSG_HEAD_TAG), | 1098 | (cmd->sam_task_attr == TCM_HEAD_TAG), |
1099 | pscsi_req_done); | 1099 | pscsi_req_done); |
1100 | 1100 | ||
1101 | return 0; | 1101 | return 0; |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 8d171ff77e75..11bea1952435 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -485,7 +485,7 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) | |||
485 | cmd->t_data_nents_orig = cmd->t_data_nents; | 485 | cmd->t_data_nents_orig = cmd->t_data_nents; |
486 | cmd->t_data_nents = 1; | 486 | cmd->t_data_nents = 1; |
487 | 487 | ||
488 | cmd->sam_task_attr = MSG_HEAD_TAG; | 488 | cmd->sam_task_attr = TCM_HEAD_TAG; |
489 | cmd->transport_complete_callback = compare_and_write_post; | 489 | cmd->transport_complete_callback = compare_and_write_post; |
490 | /* | 490 | /* |
491 | * Now reset ->execute_cmd() to the normal sbc_execute_rw() handler | 491 | * Now reset ->execute_cmd() to the normal sbc_execute_rw() handler |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index bc286a67af7c..1307600fe726 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
@@ -1357,7 +1357,7 @@ spc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
1357 | * Do implicit HEAD_OF_QUEUE processing for INQUIRY. | 1357 | * Do implicit HEAD_OF_QUEUE processing for INQUIRY. |
1358 | * See spc4r17 section 5.3 | 1358 | * See spc4r17 section 5.3 |
1359 | */ | 1359 | */ |
1360 | cmd->sam_task_attr = MSG_HEAD_TAG; | 1360 | cmd->sam_task_attr = TCM_HEAD_TAG; |
1361 | cmd->execute_cmd = spc_emulate_inquiry; | 1361 | cmd->execute_cmd = spc_emulate_inquiry; |
1362 | break; | 1362 | break; |
1363 | case SECURITY_PROTOCOL_IN: | 1363 | case SECURITY_PROTOCOL_IN: |
@@ -1391,7 +1391,7 @@ spc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
1391 | * Do implicit HEAD_OF_QUEUE processing for REPORT_LUNS | 1391 | * Do implicit HEAD_OF_QUEUE processing for REPORT_LUNS |
1392 | * See spc4r17 section 5.3 | 1392 | * See spc4r17 section 5.3 |
1393 | */ | 1393 | */ |
1394 | cmd->sam_task_attr = MSG_HEAD_TAG; | 1394 | cmd->sam_task_attr = TCM_HEAD_TAG; |
1395 | break; | 1395 | break; |
1396 | case TEST_UNIT_READY: | 1396 | case TEST_UNIT_READY: |
1397 | cmd->execute_cmd = spc_emulate_testunitready; | 1397 | cmd->execute_cmd = spc_emulate_testunitready; |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index be877bf6f730..0adc0f650213 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1159,7 +1159,7 @@ transport_check_alloc_task_attr(struct se_cmd *cmd) | |||
1159 | if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) | 1159 | if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) |
1160 | return 0; | 1160 | return 0; |
1161 | 1161 | ||
1162 | if (cmd->sam_task_attr == MSG_ACA_TAG) { | 1162 | if (cmd->sam_task_attr == TCM_ACA_TAG) { |
1163 | pr_debug("SAM Task Attribute ACA" | 1163 | pr_debug("SAM Task Attribute ACA" |
1164 | " emulation is not supported\n"); | 1164 | " emulation is not supported\n"); |
1165 | return TCM_INVALID_CDB_FIELD; | 1165 | return TCM_INVALID_CDB_FIELD; |
@@ -1531,7 +1531,7 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, | |||
1531 | BUG_ON(!se_tpg); | 1531 | BUG_ON(!se_tpg); |
1532 | 1532 | ||
1533 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, | 1533 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, |
1534 | 0, DMA_NONE, MSG_SIMPLE_TAG, sense); | 1534 | 0, DMA_NONE, TCM_SIMPLE_TAG, sense); |
1535 | /* | 1535 | /* |
1536 | * FIXME: Currently expect caller to handle se_cmd->se_tmr_req | 1536 | * FIXME: Currently expect caller to handle se_cmd->se_tmr_req |
1537 | * allocation failure. | 1537 | * allocation failure. |
@@ -1718,12 +1718,12 @@ static bool target_handle_task_attr(struct se_cmd *cmd) | |||
1718 | * to allow the passed struct se_cmd list of tasks to the front of the list. | 1718 | * to allow the passed struct se_cmd list of tasks to the front of the list. |
1719 | */ | 1719 | */ |
1720 | switch (cmd->sam_task_attr) { | 1720 | switch (cmd->sam_task_attr) { |
1721 | case MSG_HEAD_TAG: | 1721 | case TCM_HEAD_TAG: |
1722 | pr_debug("Added HEAD_OF_QUEUE for CDB: 0x%02x, " | 1722 | pr_debug("Added HEAD_OF_QUEUE for CDB: 0x%02x, " |
1723 | "se_ordered_id: %u\n", | 1723 | "se_ordered_id: %u\n", |
1724 | cmd->t_task_cdb[0], cmd->se_ordered_id); | 1724 | cmd->t_task_cdb[0], cmd->se_ordered_id); |
1725 | return false; | 1725 | return false; |
1726 | case MSG_ORDERED_TAG: | 1726 | case TCM_ORDERED_TAG: |
1727 | atomic_inc_mb(&dev->dev_ordered_sync); | 1727 | atomic_inc_mb(&dev->dev_ordered_sync); |
1728 | 1728 | ||
1729 | pr_debug("Added ORDERED for CDB: 0x%02x to ordered list, " | 1729 | pr_debug("Added ORDERED for CDB: 0x%02x to ordered list, " |
@@ -1828,7 +1828,7 @@ static void target_restart_delayed_cmds(struct se_device *dev) | |||
1828 | 1828 | ||
1829 | __target_execute_cmd(cmd); | 1829 | __target_execute_cmd(cmd); |
1830 | 1830 | ||
1831 | if (cmd->sam_task_attr == MSG_ORDERED_TAG) | 1831 | if (cmd->sam_task_attr == TCM_ORDERED_TAG) |
1832 | break; | 1832 | break; |
1833 | } | 1833 | } |
1834 | } | 1834 | } |
@@ -1844,18 +1844,18 @@ static void transport_complete_task_attr(struct se_cmd *cmd) | |||
1844 | if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) | 1844 | if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) |
1845 | return; | 1845 | return; |
1846 | 1846 | ||
1847 | if (cmd->sam_task_attr == MSG_SIMPLE_TAG) { | 1847 | if (cmd->sam_task_attr == TCM_SIMPLE_TAG) { |
1848 | atomic_dec_mb(&dev->simple_cmds); | 1848 | atomic_dec_mb(&dev->simple_cmds); |
1849 | dev->dev_cur_ordered_id++; | 1849 | dev->dev_cur_ordered_id++; |
1850 | pr_debug("Incremented dev->dev_cur_ordered_id: %u for" | 1850 | pr_debug("Incremented dev->dev_cur_ordered_id: %u for" |
1851 | " SIMPLE: %u\n", dev->dev_cur_ordered_id, | 1851 | " SIMPLE: %u\n", dev->dev_cur_ordered_id, |
1852 | cmd->se_ordered_id); | 1852 | cmd->se_ordered_id); |
1853 | } else if (cmd->sam_task_attr == MSG_HEAD_TAG) { | 1853 | } else if (cmd->sam_task_attr == TCM_HEAD_TAG) { |
1854 | dev->dev_cur_ordered_id++; | 1854 | dev->dev_cur_ordered_id++; |
1855 | pr_debug("Incremented dev_cur_ordered_id: %u for" | 1855 | pr_debug("Incremented dev_cur_ordered_id: %u for" |
1856 | " HEAD_OF_QUEUE: %u\n", dev->dev_cur_ordered_id, | 1856 | " HEAD_OF_QUEUE: %u\n", dev->dev_cur_ordered_id, |
1857 | cmd->se_ordered_id); | 1857 | cmd->se_ordered_id); |
1858 | } else if (cmd->sam_task_attr == MSG_ORDERED_TAG) { | 1858 | } else if (cmd->sam_task_attr == TCM_ORDERED_TAG) { |
1859 | atomic_dec_mb(&dev->dev_ordered_sync); | 1859 | atomic_dec_mb(&dev->dev_ordered_sync); |
1860 | 1860 | ||
1861 | dev->dev_cur_ordered_id++; | 1861 | dev->dev_cur_ordered_id++; |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index be0c0d08c56a..edcafa4490c0 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
@@ -554,17 +554,17 @@ static void ft_send_work(struct work_struct *work) | |||
554 | */ | 554 | */ |
555 | switch (fcp->fc_pri_ta & FCP_PTA_MASK) { | 555 | switch (fcp->fc_pri_ta & FCP_PTA_MASK) { |
556 | case FCP_PTA_HEADQ: | 556 | case FCP_PTA_HEADQ: |
557 | task_attr = MSG_HEAD_TAG; | 557 | task_attr = TCM_HEAD_TAG; |
558 | break; | 558 | break; |
559 | case FCP_PTA_ORDERED: | 559 | case FCP_PTA_ORDERED: |
560 | task_attr = MSG_ORDERED_TAG; | 560 | task_attr = TCM_ORDERED_TAG; |
561 | break; | 561 | break; |
562 | case FCP_PTA_ACA: | 562 | case FCP_PTA_ACA: |
563 | task_attr = MSG_ACA_TAG; | 563 | task_attr = TCM_ACA_TAG; |
564 | break; | 564 | break; |
565 | case FCP_PTA_SIMPLE: /* Fallthrough */ | 565 | case FCP_PTA_SIMPLE: /* Fallthrough */ |
566 | default: | 566 | default: |
567 | task_attr = MSG_SIMPLE_TAG; | 567 | task_attr = TCM_SIMPLE_TAG; |
568 | } | 568 | } |
569 | 569 | ||
570 | fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd); | 570 | fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd); |
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c index 336602eb453e..96b69bfd773f 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c | |||
@@ -561,7 +561,7 @@ static int omap_8250_startup(struct uart_port *port) | |||
561 | if (ret) | 561 | if (ret) |
562 | goto err; | 562 | goto err; |
563 | 563 | ||
564 | #ifdef CONFIG_PM_RUNTIME | 564 | #ifdef CONFIG_PM |
565 | up->capabilities |= UART_CAP_RPM; | 565 | up->capabilities |= UART_CAP_RPM; |
566 | #endif | 566 | #endif |
567 | 567 | ||
@@ -997,12 +997,12 @@ static int omap8250_probe(struct platform_device *pdev) | |||
997 | up.port.fifosize = 64; | 997 | up.port.fifosize = 64; |
998 | up.tx_loadsz = 64; | 998 | up.tx_loadsz = 64; |
999 | up.capabilities = UART_CAP_FIFO; | 999 | up.capabilities = UART_CAP_FIFO; |
1000 | #ifdef CONFIG_PM_RUNTIME | 1000 | #ifdef CONFIG_PM |
1001 | /* | 1001 | /* |
1002 | * PM_RUNTIME is mostly transparent. However to do it right we need to a | 1002 | * Runtime PM is mostly transparent. However to do it right we need to a |
1003 | * TX empty interrupt before we can put the device to auto idle. So if | 1003 | * TX empty interrupt before we can put the device to auto idle. So if |
1004 | * PM_RUNTIME is not enabled we don't add that flag and can spare that | 1004 | * PM is not enabled we don't add that flag and can spare that one extra |
1005 | * one extra interrupt in the TX path. | 1005 | * interrupt in the TX path. |
1006 | */ | 1006 | */ |
1007 | up.capabilities |= UART_CAP_RPM; | 1007 | up.capabilities |= UART_CAP_RPM; |
1008 | #endif | 1008 | #endif |
@@ -1105,7 +1105,7 @@ static int omap8250_remove(struct platform_device *pdev) | |||
1105 | return 0; | 1105 | return 0; |
1106 | } | 1106 | } |
1107 | 1107 | ||
1108 | #if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME) | 1108 | #ifdef CONFIG_PM |
1109 | 1109 | ||
1110 | static inline void omap8250_enable_wakeirq(struct omap8250_priv *priv, | 1110 | static inline void omap8250_enable_wakeirq(struct omap8250_priv *priv, |
1111 | bool enable) | 1111 | bool enable) |
@@ -1179,7 +1179,7 @@ static int omap8250_resume(struct device *dev) | |||
1179 | #define omap8250_complete NULL | 1179 | #define omap8250_complete NULL |
1180 | #endif | 1180 | #endif |
1181 | 1181 | ||
1182 | #ifdef CONFIG_PM_RUNTIME | 1182 | #ifdef CONFIG_PM |
1183 | static int omap8250_lost_context(struct uart_8250_port *up) | 1183 | static int omap8250_lost_context(struct uart_8250_port *up) |
1184 | { | 1184 | { |
1185 | u32 val; | 1185 | u32 val; |
diff --git a/drivers/usb/gadget/legacy/tcm_usb_gadget.c b/drivers/usb/gadget/legacy/tcm_usb_gadget.c index 024f58475a94..3a494168661e 100644 --- a/drivers/usb/gadget/legacy/tcm_usb_gadget.c +++ b/drivers/usb/gadget/legacy/tcm_usb_gadget.c | |||
@@ -1131,19 +1131,19 @@ static int usbg_submit_command(struct f_uas *fu, | |||
1131 | 1131 | ||
1132 | switch (cmd_iu->prio_attr & 0x7) { | 1132 | switch (cmd_iu->prio_attr & 0x7) { |
1133 | case UAS_HEAD_TAG: | 1133 | case UAS_HEAD_TAG: |
1134 | cmd->prio_attr = MSG_HEAD_TAG; | 1134 | cmd->prio_attr = TCM_HEAD_TAG; |
1135 | break; | 1135 | break; |
1136 | case UAS_ORDERED_TAG: | 1136 | case UAS_ORDERED_TAG: |
1137 | cmd->prio_attr = MSG_ORDERED_TAG; | 1137 | cmd->prio_attr = TCM_ORDERED_TAG; |
1138 | break; | 1138 | break; |
1139 | case UAS_ACA: | 1139 | case UAS_ACA: |
1140 | cmd->prio_attr = MSG_ACA_TAG; | 1140 | cmd->prio_attr = TCM_ACA_TAG; |
1141 | break; | 1141 | break; |
1142 | default: | 1142 | default: |
1143 | pr_debug_once("Unsupported prio_attr: %02x.\n", | 1143 | pr_debug_once("Unsupported prio_attr: %02x.\n", |
1144 | cmd_iu->prio_attr); | 1144 | cmd_iu->prio_attr); |
1145 | case UAS_SIMPLE_TAG: | 1145 | case UAS_SIMPLE_TAG: |
1146 | cmd->prio_attr = MSG_SIMPLE_TAG; | 1146 | cmd->prio_attr = TCM_SIMPLE_TAG; |
1147 | break; | 1147 | break; |
1148 | } | 1148 | } |
1149 | 1149 | ||
@@ -1240,7 +1240,7 @@ static int bot_submit_command(struct f_uas *fu, | |||
1240 | goto err; | 1240 | goto err; |
1241 | } | 1241 | } |
1242 | 1242 | ||
1243 | cmd->prio_attr = MSG_SIMPLE_TAG; | 1243 | cmd->prio_attr = TCM_SIMPLE_TAG; |
1244 | se_cmd = &cmd->se_cmd; | 1244 | se_cmd = &cmd->se_cmd; |
1245 | cmd->unpacked_lun = cbw->Lun; | 1245 | cmd->unpacked_lun = cbw->Lun; |
1246 | cmd->is_read = cbw->Flags & US_BULK_FLAG_IN ? 1 : 0; | 1246 | cmd->is_read = cbw->Flags & US_BULK_FLAG_IN ? 1 : 0; |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index e752c3098f38..395649f357aa 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -1739,7 +1739,7 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
1739 | int retval = 1; | 1739 | int retval = 1; |
1740 | unsigned long flags; | 1740 | unsigned long flags; |
1741 | 1741 | ||
1742 | /* if !PM_RUNTIME, root hub timers won't get shut down ... */ | 1742 | /* if !PM, root hub timers won't get shut down ... */ |
1743 | if (!HC_IS_RUNNING(hcd->state)) | 1743 | if (!HC_IS_RUNNING(hcd->state)) |
1744 | return 0; | 1744 | return 0; |
1745 | 1745 | ||
diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c index 75811dd5a9d7..036924e640f5 100644 --- a/drivers/usb/host/oxu210hp-hcd.c +++ b/drivers/usb/host/oxu210hp-hcd.c | |||
@@ -3087,7 +3087,7 @@ static int oxu_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
3087 | int ports, i, retval = 1; | 3087 | int ports, i, retval = 1; |
3088 | unsigned long flags; | 3088 | unsigned long flags; |
3089 | 3089 | ||
3090 | /* if !PM_RUNTIME, root hub timers won't get shut down ... */ | 3090 | /* if !PM, root hub timers won't get shut down ... */ |
3091 | if (!HC_IS_RUNNING(hcd->state)) | 3091 | if (!HC_IS_RUNNING(hcd->state)) |
3092 | return 0; | 3092 | return 0; |
3093 | 3093 | ||
diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c index 50610a6acf3d..e999496eda3e 100644 --- a/drivers/xen/xen-scsiback.c +++ b/drivers/xen/xen-scsiback.c | |||
@@ -606,7 +606,7 @@ static void scsiback_device_action(struct vscsibk_pend *pending_req, | |||
606 | init_waitqueue_head(&tmr->tmr_wait); | 606 | init_waitqueue_head(&tmr->tmr_wait); |
607 | 607 | ||
608 | transport_init_se_cmd(se_cmd, tpg->se_tpg.se_tpg_tfo, | 608 | transport_init_se_cmd(se_cmd, tpg->se_tpg.se_tpg_tfo, |
609 | tpg->tpg_nexus->tvn_se_sess, 0, DMA_NONE, MSG_SIMPLE_TAG, | 609 | tpg->tpg_nexus->tvn_se_sess, 0, DMA_NONE, TCM_SIMPLE_TAG, |
610 | &pending_req->sense_buffer[0]); | 610 | &pending_req->sense_buffer[0]); |
611 | 611 | ||
612 | rc = core_tmr_alloc_req(se_cmd, tmr, act, GFP_KERNEL); | 612 | rc = core_tmr_alloc_req(se_cmd, tmr, act, GFP_KERNEL); |
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 8ba35c622e22..e1b2e8b98af7 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
@@ -901,11 +901,15 @@ extern int drm_vblank_init(struct drm_device *dev, int num_crtcs); | |||
901 | extern int drm_wait_vblank(struct drm_device *dev, void *data, | 901 | extern int drm_wait_vblank(struct drm_device *dev, void *data, |
902 | struct drm_file *filp); | 902 | struct drm_file *filp); |
903 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); | 903 | extern u32 drm_vblank_count(struct drm_device *dev, int crtc); |
904 | extern u32 drm_crtc_vblank_count(struct drm_crtc *crtc); | ||
904 | extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, | 905 | extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, |
905 | struct timeval *vblanktime); | 906 | struct timeval *vblanktime); |
906 | extern void drm_send_vblank_event(struct drm_device *dev, int crtc, | 907 | extern void drm_send_vblank_event(struct drm_device *dev, int crtc, |
907 | struct drm_pending_vblank_event *e); | 908 | struct drm_pending_vblank_event *e); |
909 | extern void drm_crtc_send_vblank_event(struct drm_crtc *crtc, | ||
910 | struct drm_pending_vblank_event *e); | ||
908 | extern bool drm_handle_vblank(struct drm_device *dev, int crtc); | 911 | extern bool drm_handle_vblank(struct drm_device *dev, int crtc); |
912 | extern bool drm_crtc_handle_vblank(struct drm_crtc *crtc); | ||
909 | extern int drm_vblank_get(struct drm_device *dev, int crtc); | 913 | extern int drm_vblank_get(struct drm_device *dev, int crtc); |
910 | extern void drm_vblank_put(struct drm_device *dev, int crtc); | 914 | extern void drm_vblank_put(struct drm_device *dev, int crtc); |
911 | extern int drm_crtc_vblank_get(struct drm_crtc *crtc); | 915 | extern int drm_crtc_vblank_get(struct drm_crtc *crtc); |
diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 780511a459c0..1e6ae1458f7a 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h | |||
@@ -119,13 +119,6 @@ struct drm_gem_object { | |||
119 | * simply leave it as NULL. | 119 | * simply leave it as NULL. |
120 | */ | 120 | */ |
121 | struct dma_buf_attachment *import_attach; | 121 | struct dma_buf_attachment *import_attach; |
122 | |||
123 | /** | ||
124 | * dumb - created as dumb buffer | ||
125 | * Whether the gem object was created using the dumb buffer interface | ||
126 | * as such it may not be used for GPU rendering. | ||
127 | */ | ||
128 | bool dumb; | ||
129 | }; | 122 | }; |
130 | 123 | ||
131 | void drm_gem_object_release(struct drm_gem_object *obj); | 124 | void drm_gem_object_release(struct drm_gem_object *obj); |
diff --git a/include/dt-bindings/clock/exynos4415.h b/include/dt-bindings/clock/exynos4415.h new file mode 100644 index 000000000000..7eed55100721 --- /dev/null +++ b/include/dt-bindings/clock/exynos4415.h | |||
@@ -0,0 +1,360 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Samsung Electronics Co., Ltd. | ||
3 | * Author: Chanwoo Choi <cw00.choi@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * Device Tree binding constants for Samsung Exynos4415 clock controllers. | ||
10 | */ | ||
11 | |||
12 | #ifndef _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS4415_CLOCK_H | ||
13 | #define _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS4415_CLOCK_H | ||
14 | |||
15 | /* | ||
16 | * Let each exported clock get a unique index, which is used on DT-enabled | ||
17 | * platforms to lookup the clock from a clock specifier. These indices are | ||
18 | * therefore considered an ABI and so must not be changed. This implies | ||
19 | * that new clocks should be added either in free spaces between clock groups | ||
20 | * or at the end. | ||
21 | */ | ||
22 | |||
23 | /* | ||
24 | * Main CMU | ||
25 | */ | ||
26 | |||
27 | #define CLK_OSCSEL 1 | ||
28 | #define CLK_FIN_PLL 2 | ||
29 | #define CLK_FOUT_APLL 3 | ||
30 | #define CLK_FOUT_MPLL 4 | ||
31 | #define CLK_FOUT_EPLL 5 | ||
32 | #define CLK_FOUT_G3D_PLL 6 | ||
33 | #define CLK_FOUT_ISP_PLL 7 | ||
34 | #define CLK_FOUT_DISP_PLL 8 | ||
35 | |||
36 | /* Muxes */ | ||
37 | #define CLK_MOUT_MPLL_USER_L 16 | ||
38 | #define CLK_MOUT_GDL 17 | ||
39 | #define CLK_MOUT_MPLL_USER_R 18 | ||
40 | #define CLK_MOUT_GDR 19 | ||
41 | #define CLK_MOUT_EBI 20 | ||
42 | #define CLK_MOUT_ACLK_200 21 | ||
43 | #define CLK_MOUT_ACLK_160 22 | ||
44 | #define CLK_MOUT_ACLK_100 23 | ||
45 | #define CLK_MOUT_ACLK_266 24 | ||
46 | #define CLK_MOUT_G3D_PLL 25 | ||
47 | #define CLK_MOUT_EPLL 26 | ||
48 | #define CLK_MOUT_EBI_1 27 | ||
49 | #define CLK_MOUT_ISP_PLL 28 | ||
50 | #define CLK_MOUT_DISP_PLL 29 | ||
51 | #define CLK_MOUT_MPLL_USER_T 30 | ||
52 | #define CLK_MOUT_ACLK_400_MCUISP 31 | ||
53 | #define CLK_MOUT_G3D_PLLSRC 32 | ||
54 | #define CLK_MOUT_CSIS1 33 | ||
55 | #define CLK_MOUT_CSIS0 34 | ||
56 | #define CLK_MOUT_CAM1 35 | ||
57 | #define CLK_MOUT_FIMC3_LCLK 36 | ||
58 | #define CLK_MOUT_FIMC2_LCLK 37 | ||
59 | #define CLK_MOUT_FIMC1_LCLK 38 | ||
60 | #define CLK_MOUT_FIMC0_LCLK 39 | ||
61 | #define CLK_MOUT_MFC 40 | ||
62 | #define CLK_MOUT_MFC_1 41 | ||
63 | #define CLK_MOUT_MFC_0 42 | ||
64 | #define CLK_MOUT_G3D 43 | ||
65 | #define CLK_MOUT_G3D_1 44 | ||
66 | #define CLK_MOUT_G3D_0 45 | ||
67 | #define CLK_MOUT_MIPI0 46 | ||
68 | #define CLK_MOUT_FIMD0 47 | ||
69 | #define CLK_MOUT_TSADC_ISP 48 | ||
70 | #define CLK_MOUT_UART_ISP 49 | ||
71 | #define CLK_MOUT_SPI1_ISP 50 | ||
72 | #define CLK_MOUT_SPI0_ISP 51 | ||
73 | #define CLK_MOUT_PWM_ISP 52 | ||
74 | #define CLK_MOUT_AUDIO0 53 | ||
75 | #define CLK_MOUT_TSADC 54 | ||
76 | #define CLK_MOUT_MMC2 55 | ||
77 | #define CLK_MOUT_MMC1 56 | ||
78 | #define CLK_MOUT_MMC0 57 | ||
79 | #define CLK_MOUT_UART3 58 | ||
80 | #define CLK_MOUT_UART2 59 | ||
81 | #define CLK_MOUT_UART1 60 | ||
82 | #define CLK_MOUT_UART0 61 | ||
83 | #define CLK_MOUT_SPI2 62 | ||
84 | #define CLK_MOUT_SPI1 63 | ||
85 | #define CLK_MOUT_SPI0 64 | ||
86 | #define CLK_MOUT_SPDIF 65 | ||
87 | #define CLK_MOUT_AUDIO2 66 | ||
88 | #define CLK_MOUT_AUDIO1 67 | ||
89 | #define CLK_MOUT_MPLL_USER_C 68 | ||
90 | #define CLK_MOUT_HPM 69 | ||
91 | #define CLK_MOUT_CORE 70 | ||
92 | #define CLK_MOUT_APLL 71 | ||
93 | #define CLK_MOUT_PXLASYNC_CSIS1_FIMC 72 | ||
94 | #define CLK_MOUT_PXLASYNC_CSIS0_FIMC 73 | ||
95 | #define CLK_MOUT_JPEG 74 | ||
96 | #define CLK_MOUT_JPEG1 75 | ||
97 | #define CLK_MOUT_JPEG0 76 | ||
98 | #define CLK_MOUT_ACLK_ISP0_300 77 | ||
99 | #define CLK_MOUT_ACLK_ISP0_400 78 | ||
100 | #define CLK_MOUT_ACLK_ISP0_300_USER 79 | ||
101 | #define CLK_MOUT_ACLK_ISP1_300 80 | ||
102 | #define CLK_MOUT_ACLK_ISP1_300_USER 81 | ||
103 | #define CLK_MOUT_HDMI 82 | ||
104 | |||
105 | /* Dividers */ | ||
106 | #define CLK_DIV_GPL 90 | ||
107 | #define CLK_DIV_GDL 91 | ||
108 | #define CLK_DIV_GPR 92 | ||
109 | #define CLK_DIV_GDR 93 | ||
110 | #define CLK_DIV_ACLK_400_MCUISP 94 | ||
111 | #define CLK_DIV_EBI 95 | ||
112 | #define CLK_DIV_ACLK_200 96 | ||
113 | #define CLK_DIV_ACLK_160 97 | ||
114 | #define CLK_DIV_ACLK_100 98 | ||
115 | #define CLK_DIV_ACLK_266 99 | ||
116 | #define CLK_DIV_CSIS1 100 | ||
117 | #define CLK_DIV_CSIS0 101 | ||
118 | #define CLK_DIV_CAM1 102 | ||
119 | #define CLK_DIV_FIMC3_LCLK 103 | ||
120 | #define CLK_DIV_FIMC2_LCLK 104 | ||
121 | #define CLK_DIV_FIMC1_LCLK 105 | ||
122 | #define CLK_DIV_FIMC0_LCLK 106 | ||
123 | #define CLK_DIV_TV_BLK 107 | ||
124 | #define CLK_DIV_MFC 108 | ||
125 | #define CLK_DIV_G3D 109 | ||
126 | #define CLK_DIV_MIPI0_PRE 110 | ||
127 | #define CLK_DIV_MIPI0 111 | ||
128 | #define CLK_DIV_FIMD0 112 | ||
129 | #define CLK_DIV_UART_ISP 113 | ||
130 | #define CLK_DIV_SPI1_ISP_PRE 114 | ||
131 | #define CLK_DIV_SPI1_ISP 115 | ||
132 | #define CLK_DIV_SPI0_ISP_PRE 116 | ||
133 | #define CLK_DIV_SPI0_ISP 117 | ||
134 | #define CLK_DIV_PWM_ISP 118 | ||
135 | #define CLK_DIV_PCM0 119 | ||
136 | #define CLK_DIV_AUDIO0 120 | ||
137 | #define CLK_DIV_TSADC_PRE 121 | ||
138 | #define CLK_DIV_TSADC 122 | ||
139 | #define CLK_DIV_MMC1_PRE 123 | ||
140 | #define CLK_DIV_MMC1 124 | ||
141 | #define CLK_DIV_MMC0_PRE 125 | ||
142 | #define CLK_DIV_MMC0 126 | ||
143 | #define CLK_DIV_MMC2_PRE 127 | ||
144 | #define CLK_DIV_MMC2 128 | ||
145 | #define CLK_DIV_UART3 129 | ||
146 | #define CLK_DIV_UART2 130 | ||
147 | #define CLK_DIV_UART1 131 | ||
148 | #define CLK_DIV_UART0 132 | ||
149 | #define CLK_DIV_SPI1_PRE 133 | ||
150 | #define CLK_DIV_SPI1 134 | ||
151 | #define CLK_DIV_SPI0_PRE 135 | ||
152 | #define CLK_DIV_SPI0 136 | ||
153 | #define CLK_DIV_SPI2_PRE 137 | ||
154 | #define CLK_DIV_SPI2 138 | ||
155 | #define CLK_DIV_PCM2 139 | ||
156 | #define CLK_DIV_AUDIO2 140 | ||
157 | #define CLK_DIV_PCM1 141 | ||
158 | #define CLK_DIV_AUDIO1 142 | ||
159 | #define CLK_DIV_I2S1 143 | ||
160 | #define CLK_DIV_PXLASYNC_CSIS1_FIMC 144 | ||
161 | #define CLK_DIV_PXLASYNC_CSIS0_FIMC 145 | ||
162 | #define CLK_DIV_JPEG 146 | ||
163 | #define CLK_DIV_CORE2 147 | ||
164 | #define CLK_DIV_APLL 148 | ||
165 | #define CLK_DIV_PCLK_DBG 149 | ||
166 | #define CLK_DIV_ATB 150 | ||
167 | #define CLK_DIV_PERIPH 151 | ||
168 | #define CLK_DIV_COREM1 152 | ||
169 | #define CLK_DIV_COREM0 153 | ||
170 | #define CLK_DIV_CORE 154 | ||
171 | #define CLK_DIV_HPM 155 | ||
172 | #define CLK_DIV_COPY 156 | ||
173 | |||
174 | /* Gates */ | ||
175 | #define CLK_ASYNC_G3D 180 | ||
176 | #define CLK_ASYNC_MFCL 181 | ||
177 | #define CLK_ASYNC_TVX 182 | ||
178 | #define CLK_PPMULEFT 183 | ||
179 | #define CLK_GPIO_LEFT 184 | ||
180 | #define CLK_PPMUIMAGE 185 | ||
181 | #define CLK_QEMDMA2 186 | ||
182 | #define CLK_QEROTATOR 187 | ||
183 | #define CLK_SMMUMDMA2 188 | ||
184 | #define CLK_SMMUROTATOR 189 | ||
185 | #define CLK_MDMA2 190 | ||
186 | #define CLK_ROTATOR 191 | ||
187 | #define CLK_ASYNC_ISPMX 192 | ||
188 | #define CLK_ASYNC_MAUDIOX 193 | ||
189 | #define CLK_ASYNC_MFCR 194 | ||
190 | #define CLK_ASYNC_FSYSD 195 | ||
191 | #define CLK_ASYNC_LCD0X 196 | ||
192 | #define CLK_ASYNC_CAMX 197 | ||
193 | #define CLK_PPMURIGHT 198 | ||
194 | #define CLK_GPIO_RIGHT 199 | ||
195 | #define CLK_ANTIRBK_APBIF 200 | ||
196 | #define CLK_EFUSE_WRITER_APBIF 201 | ||
197 | #define CLK_MONOCNT 202 | ||
198 | #define CLK_TZPC6 203 | ||
199 | #define CLK_PROVISIONKEY1 204 | ||
200 | #define CLK_PROVISIONKEY0 205 | ||
201 | #define CLK_CMU_ISPPART 206 | ||
202 | #define CLK_TMU_APBIF 207 | ||
203 | #define CLK_KEYIF 208 | ||
204 | #define CLK_RTC 209 | ||
205 | #define CLK_WDT 210 | ||
206 | #define CLK_MCT 211 | ||
207 | #define CLK_SECKEY 212 | ||
208 | #define CLK_HDMI_CEC 213 | ||
209 | #define CLK_TZPC5 214 | ||
210 | #define CLK_TZPC4 215 | ||
211 | #define CLK_TZPC3 216 | ||
212 | #define CLK_TZPC2 217 | ||
213 | #define CLK_TZPC1 218 | ||
214 | #define CLK_TZPC0 219 | ||
215 | #define CLK_CMU_COREPART 220 | ||
216 | #define CLK_CMU_TOPPART 221 | ||
217 | #define CLK_PMU_APBIF 222 | ||
218 | #define CLK_SYSREG 223 | ||
219 | #define CLK_CHIP_ID 224 | ||
220 | #define CLK_SMMUFIMC_LITE2 225 | ||
221 | #define CLK_FIMC_LITE2 226 | ||
222 | #define CLK_PIXELASYNCM1 227 | ||
223 | #define CLK_PIXELASYNCM0 228 | ||
224 | #define CLK_PPMUCAMIF 229 | ||
225 | #define CLK_SMMUJPEG 230 | ||
226 | #define CLK_SMMUFIMC3 231 | ||
227 | #define CLK_SMMUFIMC2 232 | ||
228 | #define CLK_SMMUFIMC1 233 | ||
229 | #define CLK_SMMUFIMC0 234 | ||
230 | #define CLK_JPEG 235 | ||
231 | #define CLK_CSIS1 236 | ||
232 | #define CLK_CSIS0 237 | ||
233 | #define CLK_FIMC3 238 | ||
234 | #define CLK_FIMC2 239 | ||
235 | #define CLK_FIMC1 240 | ||
236 | #define CLK_FIMC0 241 | ||
237 | #define CLK_PPMUTV 242 | ||
238 | #define CLK_SMMUTV 243 | ||
239 | #define CLK_HDMI 244 | ||
240 | #define CLK_MIXER 245 | ||
241 | #define CLK_VP 246 | ||
242 | #define CLK_PPMUMFC_R 247 | ||
243 | #define CLK_PPMUMFC_L 248 | ||
244 | #define CLK_SMMUMFC_R 249 | ||
245 | #define CLK_SMMUMFC_L 250 | ||
246 | #define CLK_MFC 251 | ||
247 | #define CLK_PPMUG3D 252 | ||
248 | #define CLK_G3D 253 | ||
249 | #define CLK_PPMULCD0 254 | ||
250 | #define CLK_SMMUFIMD0 255 | ||
251 | #define CLK_DSIM0 256 | ||
252 | #define CLK_SMIES 257 | ||
253 | #define CLK_MIE0 258 | ||
254 | #define CLK_FIMD0 259 | ||
255 | #define CLK_TSADC 260 | ||
256 | #define CLK_PPMUFILE 261 | ||
257 | #define CLK_NFCON 262 | ||
258 | #define CLK_USBDEVICE 263 | ||
259 | #define CLK_USBHOST 264 | ||
260 | #define CLK_SROMC 265 | ||
261 | #define CLK_SDMMC2 266 | ||
262 | #define CLK_SDMMC1 267 | ||
263 | #define CLK_SDMMC0 268 | ||
264 | #define CLK_PDMA1 269 | ||
265 | #define CLK_PDMA0 270 | ||
266 | #define CLK_SPDIF 271 | ||
267 | #define CLK_PWM 272 | ||
268 | #define CLK_PCM2 273 | ||
269 | #define CLK_PCM1 274 | ||
270 | #define CLK_I2S1 275 | ||
271 | #define CLK_SPI2 276 | ||
272 | #define CLK_SPI1 277 | ||
273 | #define CLK_SPI0 278 | ||
274 | #define CLK_I2CHDMI 279 | ||
275 | #define CLK_I2C7 280 | ||
276 | #define CLK_I2C6 281 | ||
277 | #define CLK_I2C5 282 | ||
278 | #define CLK_I2C4 283 | ||
279 | #define CLK_I2C3 284 | ||
280 | #define CLK_I2C2 285 | ||
281 | #define CLK_I2C1 286 | ||
282 | #define CLK_I2C0 287 | ||
283 | #define CLK_UART3 288 | ||
284 | #define CLK_UART2 289 | ||
285 | #define CLK_UART1 290 | ||
286 | #define CLK_UART0 291 | ||
287 | |||
288 | /* Special clocks */ | ||
289 | #define CLK_SCLK_PXLAYSNC_CSIS1_FIMC 330 | ||
290 | #define CLK_SCLK_PXLAYSNC_CSIS0_FIMC 331 | ||
291 | #define CLK_SCLK_JPEG 332 | ||
292 | #define CLK_SCLK_CSIS1 333 | ||
293 | #define CLK_SCLK_CSIS0 334 | ||
294 | #define CLK_SCLK_CAM1 335 | ||
295 | #define CLK_SCLK_FIMC3_LCLK 336 | ||
296 | #define CLK_SCLK_FIMC2_LCLK 337 | ||
297 | #define CLK_SCLK_FIMC1_LCLK 338 | ||
298 | #define CLK_SCLK_FIMC0_LCLK 339 | ||
299 | #define CLK_SCLK_PIXEL 340 | ||
300 | #define CLK_SCLK_HDMI 341 | ||
301 | #define CLK_SCLK_MIXER 342 | ||
302 | #define CLK_SCLK_MFC 343 | ||
303 | #define CLK_SCLK_G3D 344 | ||
304 | #define CLK_SCLK_MIPIDPHY4L 345 | ||
305 | #define CLK_SCLK_MIPI0 346 | ||
306 | #define CLK_SCLK_MDNIE0 347 | ||
307 | #define CLK_SCLK_FIMD0 348 | ||
308 | #define CLK_SCLK_PCM0 349 | ||
309 | #define CLK_SCLK_AUDIO0 350 | ||
310 | #define CLK_SCLK_TSADC 351 | ||
311 | #define CLK_SCLK_EBI 352 | ||
312 | #define CLK_SCLK_MMC2 353 | ||
313 | #define CLK_SCLK_MMC1 354 | ||
314 | #define CLK_SCLK_MMC0 355 | ||
315 | #define CLK_SCLK_I2S 356 | ||
316 | #define CLK_SCLK_PCM2 357 | ||
317 | #define CLK_SCLK_PCM1 358 | ||
318 | #define CLK_SCLK_AUDIO2 359 | ||
319 | #define CLK_SCLK_AUDIO1 360 | ||
320 | #define CLK_SCLK_SPDIF 361 | ||
321 | #define CLK_SCLK_SPI2 362 | ||
322 | #define CLK_SCLK_SPI1 363 | ||
323 | #define CLK_SCLK_SPI0 364 | ||
324 | #define CLK_SCLK_UART3 365 | ||
325 | #define CLK_SCLK_UART2 366 | ||
326 | #define CLK_SCLK_UART1 367 | ||
327 | #define CLK_SCLK_UART0 368 | ||
328 | #define CLK_SCLK_HDMIPHY 369 | ||
329 | |||
330 | /* | ||
331 | * Total number of clocks of main CMU. | ||
332 | * NOTE: Must be equal to last clock ID increased by one. | ||
333 | */ | ||
334 | #define CLK_NR_CLKS 370 | ||
335 | |||
336 | /* | ||
337 | * CMU DMC | ||
338 | */ | ||
339 | #define CLK_DMC_FOUT_MPLL 1 | ||
340 | #define CLK_DMC_FOUT_BPLL 2 | ||
341 | |||
342 | #define CLK_DMC_MOUT_MPLL 3 | ||
343 | #define CLK_DMC_MOUT_BPLL 4 | ||
344 | #define CLK_DMC_MOUT_DPHY 5 | ||
345 | #define CLK_DMC_MOUT_DMC_BUS 6 | ||
346 | |||
347 | #define CLK_DMC_DIV_DMC 7 | ||
348 | #define CLK_DMC_DIV_DPHY 8 | ||
349 | #define CLK_DMC_DIV_DMC_PRE 9 | ||
350 | #define CLK_DMC_DIV_DMCP 10 | ||
351 | #define CLK_DMC_DIV_DMCD 11 | ||
352 | #define CLK_DMC_DIV_MPLL_PRE 12 | ||
353 | |||
354 | /* | ||
355 | * Total number of clocks of CMU_DMC. | ||
356 | * NOTE: Must be equal to highest clock ID increased by one. | ||
357 | */ | ||
358 | #define NR_CLKS_DMC 13 | ||
359 | |||
360 | #endif /* _DT_BINDINGS_CLOCK_SAMSUNG_EXYNOS4415_CLOCK_H */ | ||
diff --git a/include/dt-bindings/clock/exynos7-clk.h b/include/dt-bindings/clock/exynos7-clk.h new file mode 100644 index 000000000000..8e4681b07ae7 --- /dev/null +++ b/include/dt-bindings/clock/exynos7-clk.h | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Samsung Electronics Co., Ltd. | ||
3 | * Author: Naveen Krishna Ch <naveenkrishna.ch@gmail.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | */ | ||
9 | |||
10 | #ifndef _DT_BINDINGS_CLOCK_EXYNOS7_H | ||
11 | #define _DT_BINDINGS_CLOCK_EXYNOS7_H | ||
12 | |||
13 | /* TOPC */ | ||
14 | #define DOUT_ACLK_PERIS 1 | ||
15 | #define DOUT_SCLK_BUS0_PLL 2 | ||
16 | #define DOUT_SCLK_BUS1_PLL 3 | ||
17 | #define DOUT_SCLK_CC_PLL 4 | ||
18 | #define DOUT_SCLK_MFC_PLL 5 | ||
19 | #define DOUT_ACLK_CCORE_133 6 | ||
20 | #define TOPC_NR_CLK 7 | ||
21 | |||
22 | /* TOP0 */ | ||
23 | #define DOUT_ACLK_PERIC1 1 | ||
24 | #define DOUT_ACLK_PERIC0 2 | ||
25 | #define CLK_SCLK_UART0 3 | ||
26 | #define CLK_SCLK_UART1 4 | ||
27 | #define CLK_SCLK_UART2 5 | ||
28 | #define CLK_SCLK_UART3 6 | ||
29 | #define TOP0_NR_CLK 7 | ||
30 | |||
31 | /* TOP1 */ | ||
32 | #define DOUT_ACLK_FSYS1_200 1 | ||
33 | #define DOUT_ACLK_FSYS0_200 2 | ||
34 | #define DOUT_SCLK_MMC2 3 | ||
35 | #define DOUT_SCLK_MMC1 4 | ||
36 | #define DOUT_SCLK_MMC0 5 | ||
37 | #define CLK_SCLK_MMC2 6 | ||
38 | #define CLK_SCLK_MMC1 7 | ||
39 | #define CLK_SCLK_MMC0 8 | ||
40 | #define TOP1_NR_CLK 9 | ||
41 | |||
42 | /* CCORE */ | ||
43 | #define PCLK_RTC 1 | ||
44 | #define CCORE_NR_CLK 2 | ||
45 | |||
46 | /* PERIC0 */ | ||
47 | #define PCLK_UART0 1 | ||
48 | #define SCLK_UART0 2 | ||
49 | #define PCLK_HSI2C0 3 | ||
50 | #define PCLK_HSI2C1 4 | ||
51 | #define PCLK_HSI2C4 5 | ||
52 | #define PCLK_HSI2C5 6 | ||
53 | #define PCLK_HSI2C9 7 | ||
54 | #define PCLK_HSI2C10 8 | ||
55 | #define PCLK_HSI2C11 9 | ||
56 | #define PCLK_PWM 10 | ||
57 | #define SCLK_PWM 11 | ||
58 | #define PCLK_ADCIF 12 | ||
59 | #define PERIC0_NR_CLK 13 | ||
60 | |||
61 | /* PERIC1 */ | ||
62 | #define PCLK_UART1 1 | ||
63 | #define PCLK_UART2 2 | ||
64 | #define PCLK_UART3 3 | ||
65 | #define SCLK_UART1 4 | ||
66 | #define SCLK_UART2 5 | ||
67 | #define SCLK_UART3 6 | ||
68 | #define PCLK_HSI2C2 7 | ||
69 | #define PCLK_HSI2C3 8 | ||
70 | #define PCLK_HSI2C6 9 | ||
71 | #define PCLK_HSI2C7 10 | ||
72 | #define PCLK_HSI2C8 11 | ||
73 | #define PERIC1_NR_CLK 12 | ||
74 | |||
75 | /* PERIS */ | ||
76 | #define PCLK_CHIPID 1 | ||
77 | #define SCLK_CHIPID 2 | ||
78 | #define PCLK_WDT 3 | ||
79 | #define PCLK_TMU 4 | ||
80 | #define SCLK_TMU 5 | ||
81 | #define PERIS_NR_CLK 6 | ||
82 | |||
83 | /* FSYS0 */ | ||
84 | #define ACLK_MMC2 1 | ||
85 | #define FSYS0_NR_CLK 2 | ||
86 | |||
87 | /* FSYS1 */ | ||
88 | #define ACLK_MMC1 1 | ||
89 | #define ACLK_MMC0 2 | ||
90 | #define FSYS1_NR_CLK 3 | ||
91 | |||
92 | #endif /* _DT_BINDINGS_CLOCK_EXYNOS7_H */ | ||
diff --git a/include/dt-bindings/clock/marvell,mmp2.h b/include/dt-bindings/clock/marvell,mmp2.h new file mode 100644 index 000000000000..591f7fba89e2 --- /dev/null +++ b/include/dt-bindings/clock/marvell,mmp2.h | |||
@@ -0,0 +1,74 @@ | |||
1 | #ifndef __DTS_MARVELL_MMP2_CLOCK_H | ||
2 | #define __DTS_MARVELL_MMP2_CLOCK_H | ||
3 | |||
4 | /* fixed clocks and plls */ | ||
5 | #define MMP2_CLK_CLK32 1 | ||
6 | #define MMP2_CLK_VCTCXO 2 | ||
7 | #define MMP2_CLK_PLL1 3 | ||
8 | #define MMP2_CLK_PLL1_2 8 | ||
9 | #define MMP2_CLK_PLL1_4 9 | ||
10 | #define MMP2_CLK_PLL1_8 10 | ||
11 | #define MMP2_CLK_PLL1_16 11 | ||
12 | #define MMP2_CLK_PLL1_3 12 | ||
13 | #define MMP2_CLK_PLL1_6 13 | ||
14 | #define MMP2_CLK_PLL1_12 14 | ||
15 | #define MMP2_CLK_PLL1_20 15 | ||
16 | #define MMP2_CLK_PLL2 16 | ||
17 | #define MMP2_CLK_PLL2_2 17 | ||
18 | #define MMP2_CLK_PLL2_4 18 | ||
19 | #define MMP2_CLK_PLL2_8 19 | ||
20 | #define MMP2_CLK_PLL2_16 20 | ||
21 | #define MMP2_CLK_PLL2_3 21 | ||
22 | #define MMP2_CLK_PLL2_6 22 | ||
23 | #define MMP2_CLK_PLL2_12 23 | ||
24 | #define MMP2_CLK_VCTCXO_2 24 | ||
25 | #define MMP2_CLK_VCTCXO_4 25 | ||
26 | #define MMP2_CLK_UART_PLL 26 | ||
27 | #define MMP2_CLK_USB_PLL 27 | ||
28 | |||
29 | /* apb periphrals */ | ||
30 | #define MMP2_CLK_TWSI0 60 | ||
31 | #define MMP2_CLK_TWSI1 61 | ||
32 | #define MMP2_CLK_TWSI2 62 | ||
33 | #define MMP2_CLK_TWSI3 63 | ||
34 | #define MMP2_CLK_TWSI4 64 | ||
35 | #define MMP2_CLK_TWSI5 65 | ||
36 | #define MMP2_CLK_GPIO 66 | ||
37 | #define MMP2_CLK_KPC 67 | ||
38 | #define MMP2_CLK_RTC 68 | ||
39 | #define MMP2_CLK_PWM0 69 | ||
40 | #define MMP2_CLK_PWM1 70 | ||
41 | #define MMP2_CLK_PWM2 71 | ||
42 | #define MMP2_CLK_PWM3 72 | ||
43 | #define MMP2_CLK_UART0 73 | ||
44 | #define MMP2_CLK_UART1 74 | ||
45 | #define MMP2_CLK_UART2 75 | ||
46 | #define MMP2_CLK_UART3 76 | ||
47 | #define MMP2_CLK_SSP0 77 | ||
48 | #define MMP2_CLK_SSP1 78 | ||
49 | #define MMP2_CLK_SSP2 79 | ||
50 | #define MMP2_CLK_SSP3 80 | ||
51 | |||
52 | /* axi periphrals */ | ||
53 | #define MMP2_CLK_SDH0 101 | ||
54 | #define MMP2_CLK_SDH1 102 | ||
55 | #define MMP2_CLK_SDH2 103 | ||
56 | #define MMP2_CLK_SDH3 104 | ||
57 | #define MMP2_CLK_USB 105 | ||
58 | #define MMP2_CLK_DISP0 106 | ||
59 | #define MMP2_CLK_DISP0_MUX 107 | ||
60 | #define MMP2_CLK_DISP0_SPHY 108 | ||
61 | #define MMP2_CLK_DISP1 109 | ||
62 | #define MMP2_CLK_DISP1_MUX 110 | ||
63 | #define MMP2_CLK_CCIC_ARBITER 111 | ||
64 | #define MMP2_CLK_CCIC0 112 | ||
65 | #define MMP2_CLK_CCIC0_MIX 113 | ||
66 | #define MMP2_CLK_CCIC0_PHY 114 | ||
67 | #define MMP2_CLK_CCIC0_SPHY 115 | ||
68 | #define MMP2_CLK_CCIC1 116 | ||
69 | #define MMP2_CLK_CCIC1_MIX 117 | ||
70 | #define MMP2_CLK_CCIC1_PHY 118 | ||
71 | #define MMP2_CLK_CCIC1_SPHY 119 | ||
72 | |||
73 | #define MMP2_NR_CLKS 200 | ||
74 | #endif | ||
diff --git a/include/dt-bindings/clock/marvell,pxa168.h b/include/dt-bindings/clock/marvell,pxa168.h new file mode 100644 index 000000000000..79630b9d74b8 --- /dev/null +++ b/include/dt-bindings/clock/marvell,pxa168.h | |||
@@ -0,0 +1,57 @@ | |||
1 | #ifndef __DTS_MARVELL_PXA168_CLOCK_H | ||
2 | #define __DTS_MARVELL_PXA168_CLOCK_H | ||
3 | |||
4 | /* fixed clocks and plls */ | ||
5 | #define PXA168_CLK_CLK32 1 | ||
6 | #define PXA168_CLK_VCTCXO 2 | ||
7 | #define PXA168_CLK_PLL1 3 | ||
8 | #define PXA168_CLK_PLL1_2 8 | ||
9 | #define PXA168_CLK_PLL1_4 9 | ||
10 | #define PXA168_CLK_PLL1_8 10 | ||
11 | #define PXA168_CLK_PLL1_16 11 | ||
12 | #define PXA168_CLK_PLL1_6 12 | ||
13 | #define PXA168_CLK_PLL1_12 13 | ||
14 | #define PXA168_CLK_PLL1_24 14 | ||
15 | #define PXA168_CLK_PLL1_48 15 | ||
16 | #define PXA168_CLK_PLL1_96 16 | ||
17 | #define PXA168_CLK_PLL1_13 17 | ||
18 | #define PXA168_CLK_PLL1_13_1_5 18 | ||
19 | #define PXA168_CLK_PLL1_2_1_5 19 | ||
20 | #define PXA168_CLK_PLL1_3_16 20 | ||
21 | #define PXA168_CLK_UART_PLL 27 | ||
22 | |||
23 | /* apb periphrals */ | ||
24 | #define PXA168_CLK_TWSI0 60 | ||
25 | #define PXA168_CLK_TWSI1 61 | ||
26 | #define PXA168_CLK_TWSI2 62 | ||
27 | #define PXA168_CLK_TWSI3 63 | ||
28 | #define PXA168_CLK_GPIO 64 | ||
29 | #define PXA168_CLK_KPC 65 | ||
30 | #define PXA168_CLK_RTC 66 | ||
31 | #define PXA168_CLK_PWM0 67 | ||
32 | #define PXA168_CLK_PWM1 68 | ||
33 | #define PXA168_CLK_PWM2 69 | ||
34 | #define PXA168_CLK_PWM3 70 | ||
35 | #define PXA168_CLK_UART0 71 | ||
36 | #define PXA168_CLK_UART1 72 | ||
37 | #define PXA168_CLK_UART2 73 | ||
38 | #define PXA168_CLK_SSP0 74 | ||
39 | #define PXA168_CLK_SSP1 75 | ||
40 | #define PXA168_CLK_SSP2 76 | ||
41 | #define PXA168_CLK_SSP3 77 | ||
42 | #define PXA168_CLK_SSP4 78 | ||
43 | |||
44 | /* axi periphrals */ | ||
45 | #define PXA168_CLK_DFC 100 | ||
46 | #define PXA168_CLK_SDH0 101 | ||
47 | #define PXA168_CLK_SDH1 102 | ||
48 | #define PXA168_CLK_SDH2 103 | ||
49 | #define PXA168_CLK_USB 104 | ||
50 | #define PXA168_CLK_SPH 105 | ||
51 | #define PXA168_CLK_DISP0 106 | ||
52 | #define PXA168_CLK_CCIC0 107 | ||
53 | #define PXA168_CLK_CCIC0_PHY 108 | ||
54 | #define PXA168_CLK_CCIC0_SPHY 109 | ||
55 | |||
56 | #define PXA168_NR_CLKS 200 | ||
57 | #endif | ||
diff --git a/include/dt-bindings/clock/marvell,pxa910.h b/include/dt-bindings/clock/marvell,pxa910.h new file mode 100644 index 000000000000..719cffb2bea2 --- /dev/null +++ b/include/dt-bindings/clock/marvell,pxa910.h | |||
@@ -0,0 +1,54 @@ | |||
1 | #ifndef __DTS_MARVELL_PXA910_CLOCK_H | ||
2 | #define __DTS_MARVELL_PXA910_CLOCK_H | ||
3 | |||
4 | /* fixed clocks and plls */ | ||
5 | #define PXA910_CLK_CLK32 1 | ||
6 | #define PXA910_CLK_VCTCXO 2 | ||
7 | #define PXA910_CLK_PLL1 3 | ||
8 | #define PXA910_CLK_PLL1_2 8 | ||
9 | #define PXA910_CLK_PLL1_4 9 | ||
10 | #define PXA910_CLK_PLL1_8 10 | ||
11 | #define PXA910_CLK_PLL1_16 11 | ||
12 | #define PXA910_CLK_PLL1_6 12 | ||
13 | #define PXA910_CLK_PLL1_12 13 | ||
14 | #define PXA910_CLK_PLL1_24 14 | ||
15 | #define PXA910_CLK_PLL1_48 15 | ||
16 | #define PXA910_CLK_PLL1_96 16 | ||
17 | #define PXA910_CLK_PLL1_13 17 | ||
18 | #define PXA910_CLK_PLL1_13_1_5 18 | ||
19 | #define PXA910_CLK_PLL1_2_1_5 19 | ||
20 | #define PXA910_CLK_PLL1_3_16 20 | ||
21 | #define PXA910_CLK_UART_PLL 27 | ||
22 | |||
23 | /* apb periphrals */ | ||
24 | #define PXA910_CLK_TWSI0 60 | ||
25 | #define PXA910_CLK_TWSI1 61 | ||
26 | #define PXA910_CLK_TWSI2 62 | ||
27 | #define PXA910_CLK_TWSI3 63 | ||
28 | #define PXA910_CLK_GPIO 64 | ||
29 | #define PXA910_CLK_KPC 65 | ||
30 | #define PXA910_CLK_RTC 66 | ||
31 | #define PXA910_CLK_PWM0 67 | ||
32 | #define PXA910_CLK_PWM1 68 | ||
33 | #define PXA910_CLK_PWM2 69 | ||
34 | #define PXA910_CLK_PWM3 70 | ||
35 | #define PXA910_CLK_UART0 71 | ||
36 | #define PXA910_CLK_UART1 72 | ||
37 | #define PXA910_CLK_UART2 73 | ||
38 | #define PXA910_CLK_SSP0 74 | ||
39 | #define PXA910_CLK_SSP1 75 | ||
40 | |||
41 | /* axi periphrals */ | ||
42 | #define PXA910_CLK_DFC 100 | ||
43 | #define PXA910_CLK_SDH0 101 | ||
44 | #define PXA910_CLK_SDH1 102 | ||
45 | #define PXA910_CLK_SDH2 103 | ||
46 | #define PXA910_CLK_USB 104 | ||
47 | #define PXA910_CLK_SPH 105 | ||
48 | #define PXA910_CLK_DISP0 106 | ||
49 | #define PXA910_CLK_CCIC0 107 | ||
50 | #define PXA910_CLK_CCIC0_PHY 108 | ||
51 | #define PXA910_CLK_CCIC0_SPHY 109 | ||
52 | |||
53 | #define PXA910_NR_CLKS 200 | ||
54 | #endif | ||
diff --git a/include/dt-bindings/clock/rk3288-cru.h b/include/dt-bindings/clock/rk3288-cru.h index 100a08c47692..f60ce72a2b2c 100644 --- a/include/dt-bindings/clock/rk3288-cru.h +++ b/include/dt-bindings/clock/rk3288-cru.h | |||
@@ -71,6 +71,15 @@ | |||
71 | #define SCLK_HDMI_CEC 110 | 71 | #define SCLK_HDMI_CEC 110 |
72 | #define SCLK_HEVC_CABAC 111 | 72 | #define SCLK_HEVC_CABAC 111 |
73 | #define SCLK_HEVC_CORE 112 | 73 | #define SCLK_HEVC_CORE 112 |
74 | #define SCLK_I2S0_OUT 113 | ||
75 | #define SCLK_SDMMC_DRV 114 | ||
76 | #define SCLK_SDIO0_DRV 115 | ||
77 | #define SCLK_SDIO1_DRV 116 | ||
78 | #define SCLK_EMMC_DRV 117 | ||
79 | #define SCLK_SDMMC_SAMPLE 118 | ||
80 | #define SCLK_SDIO0_SAMPLE 119 | ||
81 | #define SCLK_SDIO1_SAMPLE 120 | ||
82 | #define SCLK_EMMC_SAMPLE 121 | ||
74 | 83 | ||
75 | #define DCLK_VOP0 190 | 84 | #define DCLK_VOP0 190 |
76 | #define DCLK_VOP1 191 | 85 | #define DCLK_VOP1 191 |
@@ -141,6 +150,10 @@ | |||
141 | #define PCLK_VIO2_H2P 361 | 150 | #define PCLK_VIO2_H2P 361 |
142 | #define PCLK_CPU 362 | 151 | #define PCLK_CPU 362 |
143 | #define PCLK_PERI 363 | 152 | #define PCLK_PERI 363 |
153 | #define PCLK_DDRUPCTL0 364 | ||
154 | #define PCLK_PUBL0 365 | ||
155 | #define PCLK_DDRUPCTL1 366 | ||
156 | #define PCLK_PUBL1 367 | ||
144 | 157 | ||
145 | /* hclk gates */ | 158 | /* hclk gates */ |
146 | #define HCLK_GPS 448 | 159 | #define HCLK_GPS 448 |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 0c04917c2f12..af84234e1f6e 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -47,6 +47,7 @@ struct sk_buff; | |||
47 | 47 | ||
48 | struct audit_krule { | 48 | struct audit_krule { |
49 | int vers_ops; | 49 | int vers_ops; |
50 | u32 pflags; | ||
50 | u32 flags; | 51 | u32 flags; |
51 | u32 listnr; | 52 | u32 listnr; |
52 | u32 action; | 53 | u32 action; |
@@ -64,6 +65,9 @@ struct audit_krule { | |||
64 | u64 prio; | 65 | u64 prio; |
65 | }; | 66 | }; |
66 | 67 | ||
68 | /* Flag to indicate legacy AUDIT_LOGINUID unset usage */ | ||
69 | #define AUDIT_LOGINUID_LEGACY 0x1 | ||
70 | |||
67 | struct audit_field { | 71 | struct audit_field { |
68 | u32 type; | 72 | u32 type; |
69 | union { | 73 | union { |
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 2839c639f092..d936409520f8 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h | |||
@@ -176,7 +176,7 @@ struct clk_ops { | |||
176 | unsigned long *parent_rate); | 176 | unsigned long *parent_rate); |
177 | long (*determine_rate)(struct clk_hw *hw, unsigned long rate, | 177 | long (*determine_rate)(struct clk_hw *hw, unsigned long rate, |
178 | unsigned long *best_parent_rate, | 178 | unsigned long *best_parent_rate, |
179 | struct clk **best_parent_clk); | 179 | struct clk_hw **best_parent_hw); |
180 | int (*set_parent)(struct clk_hw *hw, u8 index); | 180 | int (*set_parent)(struct clk_hw *hw, u8 index); |
181 | u8 (*get_parent)(struct clk_hw *hw); | 181 | u8 (*get_parent)(struct clk_hw *hw); |
182 | int (*set_rate)(struct clk_hw *hw, unsigned long rate, | 182 | int (*set_rate)(struct clk_hw *hw, unsigned long rate, |
@@ -544,16 +544,14 @@ u8 __clk_get_num_parents(struct clk *clk); | |||
544 | struct clk *__clk_get_parent(struct clk *clk); | 544 | struct clk *__clk_get_parent(struct clk *clk); |
545 | struct clk *clk_get_parent_by_index(struct clk *clk, u8 index); | 545 | struct clk *clk_get_parent_by_index(struct clk *clk, u8 index); |
546 | unsigned int __clk_get_enable_count(struct clk *clk); | 546 | unsigned int __clk_get_enable_count(struct clk *clk); |
547 | unsigned int __clk_get_prepare_count(struct clk *clk); | ||
548 | unsigned long __clk_get_rate(struct clk *clk); | 547 | unsigned long __clk_get_rate(struct clk *clk); |
549 | unsigned long __clk_get_accuracy(struct clk *clk); | ||
550 | unsigned long __clk_get_flags(struct clk *clk); | 548 | unsigned long __clk_get_flags(struct clk *clk); |
551 | bool __clk_is_prepared(struct clk *clk); | 549 | bool __clk_is_prepared(struct clk *clk); |
552 | bool __clk_is_enabled(struct clk *clk); | 550 | bool __clk_is_enabled(struct clk *clk); |
553 | struct clk *__clk_lookup(const char *name); | 551 | struct clk *__clk_lookup(const char *name); |
554 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, | 552 | long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, |
555 | unsigned long *best_parent_rate, | 553 | unsigned long *best_parent_rate, |
556 | struct clk **best_parent_p); | 554 | struct clk_hw **best_parent_p); |
557 | 555 | ||
558 | /* | 556 | /* |
559 | * FIXME clock api without lock protection | 557 | * FIXME clock api without lock protection |
@@ -652,7 +650,7 @@ static inline void clk_writel(u32 val, u32 __iomem *reg) | |||
652 | #endif /* platform dependent I/O accessors */ | 650 | #endif /* platform dependent I/O accessors */ |
653 | 651 | ||
654 | #ifdef CONFIG_DEBUG_FS | 652 | #ifdef CONFIG_DEBUG_FS |
655 | struct dentry *clk_debugfs_add_file(struct clk *clk, char *name, umode_t mode, | 653 | struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode, |
656 | void *data, const struct file_operations *fops); | 654 | void *data, const struct file_operations *fops); |
657 | #endif | 655 | #endif |
658 | 656 | ||
diff --git a/include/linux/clk/ti.h b/include/linux/clk/ti.h index 74e5341463c9..55ef529a0dbf 100644 --- a/include/linux/clk/ti.h +++ b/include/linux/clk/ti.h | |||
@@ -264,7 +264,7 @@ int omap3_noncore_dpll_set_rate_and_parent(struct clk_hw *hw, | |||
264 | long omap3_noncore_dpll_determine_rate(struct clk_hw *hw, | 264 | long omap3_noncore_dpll_determine_rate(struct clk_hw *hw, |
265 | unsigned long rate, | 265 | unsigned long rate, |
266 | unsigned long *best_parent_rate, | 266 | unsigned long *best_parent_rate, |
267 | struct clk **best_parent_clk); | 267 | struct clk_hw **best_parent_clk); |
268 | unsigned long omap4_dpll_regm4xen_recalc(struct clk_hw *hw, | 268 | unsigned long omap4_dpll_regm4xen_recalc(struct clk_hw *hw, |
269 | unsigned long parent_rate); | 269 | unsigned long parent_rate); |
270 | long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw, | 270 | long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw, |
@@ -273,7 +273,7 @@ long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw, | |||
273 | long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, | 273 | long omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw, |
274 | unsigned long rate, | 274 | unsigned long rate, |
275 | unsigned long *best_parent_rate, | 275 | unsigned long *best_parent_rate, |
276 | struct clk **best_parent_clk); | 276 | struct clk_hw **best_parent_clk); |
277 | u8 omap2_init_dpll_parent(struct clk_hw *hw); | 277 | u8 omap2_init_dpll_parent(struct clk_hw *hw); |
278 | unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate); | 278 | unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate); |
279 | long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate, | 279 | long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate, |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index d5ad7b1118fc..a1c81f80978e 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -186,6 +186,80 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); | |||
186 | # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__) | 186 | # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__) |
187 | #endif | 187 | #endif |
188 | 188 | ||
189 | #include <uapi/linux/types.h> | ||
190 | |||
191 | static __always_inline void data_access_exceeds_word_size(void) | ||
192 | #ifdef __compiletime_warning | ||
193 | __compiletime_warning("data access exceeds word size and won't be atomic") | ||
194 | #endif | ||
195 | ; | ||
196 | |||
197 | static __always_inline void data_access_exceeds_word_size(void) | ||
198 | { | ||
199 | } | ||
200 | |||
201 | static __always_inline void __read_once_size(volatile void *p, void *res, int size) | ||
202 | { | ||
203 | switch (size) { | ||
204 | case 1: *(__u8 *)res = *(volatile __u8 *)p; break; | ||
205 | case 2: *(__u16 *)res = *(volatile __u16 *)p; break; | ||
206 | case 4: *(__u32 *)res = *(volatile __u32 *)p; break; | ||
207 | #ifdef CONFIG_64BIT | ||
208 | case 8: *(__u64 *)res = *(volatile __u64 *)p; break; | ||
209 | #endif | ||
210 | default: | ||
211 | barrier(); | ||
212 | __builtin_memcpy((void *)res, (const void *)p, size); | ||
213 | data_access_exceeds_word_size(); | ||
214 | barrier(); | ||
215 | } | ||
216 | } | ||
217 | |||
218 | static __always_inline void __assign_once_size(volatile void *p, void *res, int size) | ||
219 | { | ||
220 | switch (size) { | ||
221 | case 1: *(volatile __u8 *)p = *(__u8 *)res; break; | ||
222 | case 2: *(volatile __u16 *)p = *(__u16 *)res; break; | ||
223 | case 4: *(volatile __u32 *)p = *(__u32 *)res; break; | ||
224 | #ifdef CONFIG_64BIT | ||
225 | case 8: *(volatile __u64 *)p = *(__u64 *)res; break; | ||
226 | #endif | ||
227 | default: | ||
228 | barrier(); | ||
229 | __builtin_memcpy((void *)p, (const void *)res, size); | ||
230 | data_access_exceeds_word_size(); | ||
231 | barrier(); | ||
232 | } | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * Prevent the compiler from merging or refetching reads or writes. The | ||
237 | * compiler is also forbidden from reordering successive instances of | ||
238 | * READ_ONCE, ASSIGN_ONCE and ACCESS_ONCE (see below), but only when the | ||
239 | * compiler is aware of some particular ordering. One way to make the | ||
240 | * compiler aware of ordering is to put the two invocations of READ_ONCE, | ||
241 | * ASSIGN_ONCE or ACCESS_ONCE() in different C statements. | ||
242 | * | ||
243 | * In contrast to ACCESS_ONCE these two macros will also work on aggregate | ||
244 | * data types like structs or unions. If the size of the accessed data | ||
245 | * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) | ||
246 | * READ_ONCE() and ASSIGN_ONCE() will fall back to memcpy and print a | ||
247 | * compile-time warning. | ||
248 | * | ||
249 | * Their two major use cases are: (1) Mediating communication between | ||
250 | * process-level code and irq/NMI handlers, all running on the same CPU, | ||
251 | * and (2) Ensuring that the compiler does not fold, spindle, or otherwise | ||
252 | * mutilate accesses that either do not require ordering or that interact | ||
253 | * with an explicit memory barrier or atomic instruction that provides the | ||
254 | * required ordering. | ||
255 | */ | ||
256 | |||
257 | #define READ_ONCE(x) \ | ||
258 | ({ typeof(x) __val; __read_once_size(&x, &__val, sizeof(__val)); __val; }) | ||
259 | |||
260 | #define ASSIGN_ONCE(val, x) \ | ||
261 | ({ typeof(x) __val; __val = val; __assign_once_size(&x, &__val, sizeof(__val)); __val; }) | ||
262 | |||
189 | #endif /* __KERNEL__ */ | 263 | #endif /* __KERNEL__ */ |
190 | 264 | ||
191 | #endif /* __ASSEMBLY__ */ | 265 | #endif /* __ASSEMBLY__ */ |
diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index f1863dcd83ea..ce447f0f1bad 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h | |||
@@ -188,7 +188,7 @@ extern struct devfreq *devm_devfreq_add_device(struct device *dev, | |||
188 | extern void devm_devfreq_remove_device(struct device *dev, | 188 | extern void devm_devfreq_remove_device(struct device *dev, |
189 | struct devfreq *devfreq); | 189 | struct devfreq *devfreq); |
190 | 190 | ||
191 | /* Supposed to be called by PM_SLEEP/PM_RUNTIME callbacks */ | 191 | /* Supposed to be called by PM callbacks */ |
192 | extern int devfreq_suspend_device(struct devfreq *devfreq); | 192 | extern int devfreq_suspend_device(struct devfreq *devfreq); |
193 | extern int devfreq_resume_device(struct devfreq *devfreq); | 193 | extern int devfreq_resume_device(struct devfreq *devfreq); |
194 | 194 | ||
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 9d87a37aecad..dae99d7d2bc0 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
@@ -688,7 +688,6 @@ extern int sas_queuecommand(struct Scsi_Host * ,struct scsi_cmnd *); | |||
688 | extern int sas_target_alloc(struct scsi_target *); | 688 | extern int sas_target_alloc(struct scsi_target *); |
689 | extern int sas_slave_configure(struct scsi_device *); | 689 | extern int sas_slave_configure(struct scsi_device *); |
690 | extern int sas_change_queue_depth(struct scsi_device *, int new_depth); | 690 | extern int sas_change_queue_depth(struct scsi_device *, int new_depth); |
691 | extern int sas_change_queue_type(struct scsi_device *, int qt); | ||
692 | extern int sas_bios_param(struct scsi_device *, | 691 | extern int sas_bios_param(struct scsi_device *, |
693 | struct block_device *, | 692 | struct block_device *, |
694 | sector_t capacity, int *hsc); | 693 | sector_t capacity, int *hsc); |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index e939d2b3757a..019e66858ce6 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -278,19 +278,6 @@ struct scsi_host_template { | |||
278 | int (* change_queue_depth)(struct scsi_device *, int); | 278 | int (* change_queue_depth)(struct scsi_device *, int); |
279 | 279 | ||
280 | /* | 280 | /* |
281 | * Fill in this function to allow the changing of tag types | ||
282 | * (this also allows the enabling/disabling of tag command | ||
283 | * queueing). An error should only be returned if something | ||
284 | * went wrong in the driver while trying to set the tag type. | ||
285 | * If the driver doesn't support the requested tag type, then | ||
286 | * it should set the closest type it does support without | ||
287 | * returning an error. Returns the actual tag type set. | ||
288 | * | ||
289 | * Status: OPTIONAL | ||
290 | */ | ||
291 | int (* change_queue_type)(struct scsi_device *, int); | ||
292 | |||
293 | /* | ||
294 | * This function determines the BIOS parameters for a given | 281 | * This function determines the BIOS parameters for a given |
295 | * harddisk. These tend to be numbers that are made up by | 282 | * harddisk. These tend to be numbers that are made up by |
296 | * the host adapter. Parameters: | 283 | * the host adapter. Parameters: |
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h index fe4a70299419..9708b28bd2aa 100644 --- a/include/scsi/scsi_tcq.h +++ b/include/scsi/scsi_tcq.h | |||
@@ -6,46 +6,10 @@ | |||
6 | #include <scsi/scsi_device.h> | 6 | #include <scsi/scsi_device.h> |
7 | #include <scsi/scsi_host.h> | 7 | #include <scsi/scsi_host.h> |
8 | 8 | ||
9 | #define MSG_SIMPLE_TAG 0x20 | ||
10 | #define MSG_HEAD_TAG 0x21 | ||
11 | #define MSG_ORDERED_TAG 0x22 | ||
12 | #define MSG_ACA_TAG 0x24 /* unsupported */ | ||
13 | |||
14 | #define SCSI_NO_TAG (-1) /* identify no tag in use */ | 9 | #define SCSI_NO_TAG (-1) /* identify no tag in use */ |
15 | 10 | ||
16 | 11 | ||
17 | #ifdef CONFIG_BLOCK | 12 | #ifdef CONFIG_BLOCK |
18 | |||
19 | int scsi_change_queue_type(struct scsi_device *sdev, int tag_type); | ||
20 | |||
21 | /** | ||
22 | * scsi_get_tag_type - get the type of tag the device supports | ||
23 | * @sdev: the scsi device | ||
24 | */ | ||
25 | static inline int scsi_get_tag_type(struct scsi_device *sdev) | ||
26 | { | ||
27 | if (!sdev->tagged_supported) | ||
28 | return 0; | ||
29 | if (sdev->simple_tags) | ||
30 | return MSG_SIMPLE_TAG; | ||
31 | return 0; | ||
32 | } | ||
33 | |||
34 | static inline void scsi_set_tag_type(struct scsi_device *sdev, int tag) | ||
35 | { | ||
36 | switch (tag) { | ||
37 | case MSG_ORDERED_TAG: | ||
38 | case MSG_SIMPLE_TAG: | ||
39 | sdev->simple_tags = 1; | ||
40 | break; | ||
41 | case 0: | ||
42 | /* fall through */ | ||
43 | default: | ||
44 | sdev->simple_tags = 0; | ||
45 | break; | ||
46 | } | ||
47 | } | ||
48 | |||
49 | static inline struct scsi_cmnd *scsi_mq_find_tag(struct Scsi_Host *shost, | 13 | static inline struct scsi_cmnd *scsi_mq_find_tag(struct Scsi_Host *shost, |
50 | int unique_tag) | 14 | int unique_tag) |
51 | { | 15 | { |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 23c518a0340c..397fb635766a 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -476,6 +476,12 @@ struct se_dif_v1_tuple { | |||
476 | __be32 ref_tag; | 476 | __be32 ref_tag; |
477 | }; | 477 | }; |
478 | 478 | ||
479 | /* for sam_task_attr */ | ||
480 | #define TCM_SIMPLE_TAG 0x20 | ||
481 | #define TCM_HEAD_TAG 0x21 | ||
482 | #define TCM_ORDERED_TAG 0x22 | ||
483 | #define TCM_ACA_TAG 0x24 | ||
484 | |||
479 | struct se_cmd { | 485 | struct se_cmd { |
480 | /* SAM response code being sent to initiator */ | 486 | /* SAM response code being sent to initiator */ |
481 | u8 scsi_status; | 487 | u8 scsi_status; |
diff --git a/include/trace/events/target.h b/include/trace/events/target.h index 45403443dd82..04c3c6efdcc2 100644 --- a/include/trace/events/target.h +++ b/include/trace/events/target.h | |||
@@ -109,10 +109,10 @@ | |||
109 | 109 | ||
110 | #define show_task_attribute_name(val) \ | 110 | #define show_task_attribute_name(val) \ |
111 | __print_symbolic(val, \ | 111 | __print_symbolic(val, \ |
112 | { MSG_SIMPLE_TAG, "SIMPLE" }, \ | 112 | { TCM_SIMPLE_TAG, "SIMPLE" }, \ |
113 | { MSG_HEAD_TAG, "HEAD" }, \ | 113 | { TCM_HEAD_TAG, "HEAD" }, \ |
114 | { MSG_ORDERED_TAG, "ORDERED" }, \ | 114 | { TCM_ORDERED_TAG, "ORDERED" }, \ |
115 | { MSG_ACA_TAG, "ACA" } ) | 115 | { TCM_ACA_TAG, "ACA" } ) |
116 | 116 | ||
117 | #define show_scsi_status_name(val) \ | 117 | #define show_scsi_status_name(val) \ |
118 | __print_symbolic(val, \ | 118 | __print_symbolic(val, \ |
diff --git a/kernel/audit.c b/kernel/audit.c index f8f203e8018c..231b7dcb154b 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -429,7 +429,7 @@ static void kauditd_send_skb(struct sk_buff *skb) | |||
429 | * This function doesn't consume an skb as might be expected since it has to | 429 | * This function doesn't consume an skb as might be expected since it has to |
430 | * copy it anyways. | 430 | * copy it anyways. |
431 | */ | 431 | */ |
432 | static void kauditd_send_multicast_skb(struct sk_buff *skb) | 432 | static void kauditd_send_multicast_skb(struct sk_buff *skb, gfp_t gfp_mask) |
433 | { | 433 | { |
434 | struct sk_buff *copy; | 434 | struct sk_buff *copy; |
435 | struct audit_net *aunet = net_generic(&init_net, audit_net_id); | 435 | struct audit_net *aunet = net_generic(&init_net, audit_net_id); |
@@ -448,11 +448,11 @@ static void kauditd_send_multicast_skb(struct sk_buff *skb) | |||
448 | * no reason for new multicast clients to continue with this | 448 | * no reason for new multicast clients to continue with this |
449 | * non-compliance. | 449 | * non-compliance. |
450 | */ | 450 | */ |
451 | copy = skb_copy(skb, GFP_KERNEL); | 451 | copy = skb_copy(skb, gfp_mask); |
452 | if (!copy) | 452 | if (!copy) |
453 | return; | 453 | return; |
454 | 454 | ||
455 | nlmsg_multicast(sock, copy, 0, AUDIT_NLGRP_READLOG, GFP_KERNEL); | 455 | nlmsg_multicast(sock, copy, 0, AUDIT_NLGRP_READLOG, gfp_mask); |
456 | } | 456 | } |
457 | 457 | ||
458 | /* | 458 | /* |
@@ -1940,7 +1940,7 @@ void audit_log_end(struct audit_buffer *ab) | |||
1940 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); | 1940 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); |
1941 | 1941 | ||
1942 | nlh->nlmsg_len = ab->skb->len; | 1942 | nlh->nlmsg_len = ab->skb->len; |
1943 | kauditd_send_multicast_skb(ab->skb); | 1943 | kauditd_send_multicast_skb(ab->skb, ab->gfp_mask); |
1944 | 1944 | ||
1945 | /* | 1945 | /* |
1946 | * The original kaudit unicast socket sends up messages with | 1946 | * The original kaudit unicast socket sends up messages with |
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 3598e13f2a65..4f68a326d92e 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c | |||
@@ -442,19 +442,7 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data, | |||
442 | if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { | 442 | if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { |
443 | f->type = AUDIT_LOGINUID_SET; | 443 | f->type = AUDIT_LOGINUID_SET; |
444 | f->val = 0; | 444 | f->val = 0; |
445 | } | 445 | entry->rule.pflags |= AUDIT_LOGINUID_LEGACY; |
446 | |||
447 | if ((f->type == AUDIT_PID) || (f->type == AUDIT_PPID)) { | ||
448 | struct pid *pid; | ||
449 | rcu_read_lock(); | ||
450 | pid = find_vpid(f->val); | ||
451 | if (!pid) { | ||
452 | rcu_read_unlock(); | ||
453 | err = -ESRCH; | ||
454 | goto exit_free; | ||
455 | } | ||
456 | f->val = pid_nr(pid); | ||
457 | rcu_read_unlock(); | ||
458 | } | 446 | } |
459 | 447 | ||
460 | err = audit_field_valid(entry, f); | 448 | err = audit_field_valid(entry, f); |
@@ -630,6 +618,13 @@ static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule) | |||
630 | data->buflen += data->values[i] = | 618 | data->buflen += data->values[i] = |
631 | audit_pack_string(&bufp, krule->filterkey); | 619 | audit_pack_string(&bufp, krule->filterkey); |
632 | break; | 620 | break; |
621 | case AUDIT_LOGINUID_SET: | ||
622 | if (krule->pflags & AUDIT_LOGINUID_LEGACY && !f->val) { | ||
623 | data->fields[i] = AUDIT_LOGINUID; | ||
624 | data->values[i] = AUDIT_UID_UNSET; | ||
625 | break; | ||
626 | } | ||
627 | /* fallthrough if set */ | ||
633 | default: | 628 | default: |
634 | data->values[i] = f->val; | 629 | data->values[i] = f->val; |
635 | } | 630 | } |
@@ -646,6 +641,7 @@ static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b) | |||
646 | int i; | 641 | int i; |
647 | 642 | ||
648 | if (a->flags != b->flags || | 643 | if (a->flags != b->flags || |
644 | a->pflags != b->pflags || | ||
649 | a->listnr != b->listnr || | 645 | a->listnr != b->listnr || |
650 | a->action != b->action || | 646 | a->action != b->action || |
651 | a->field_count != b->field_count) | 647 | a->field_count != b->field_count) |
@@ -764,6 +760,7 @@ struct audit_entry *audit_dupe_rule(struct audit_krule *old) | |||
764 | new = &entry->rule; | 760 | new = &entry->rule; |
765 | new->vers_ops = old->vers_ops; | 761 | new->vers_ops = old->vers_ops; |
766 | new->flags = old->flags; | 762 | new->flags = old->flags; |
763 | new->pflags = old->pflags; | ||
767 | new->listnr = old->listnr; | 764 | new->listnr = old->listnr; |
768 | new->action = old->action; | 765 | new->action = old->action; |
769 | for (i = 0; i < AUDIT_BITMASK_SIZE; i++) | 766 | for (i = 0; i < AUDIT_BITMASK_SIZE; i++) |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index c75522a83678..37c69ab561da 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1877,12 +1877,18 @@ void __audit_inode(struct filename *name, const struct dentry *dentry, | |||
1877 | } | 1877 | } |
1878 | 1878 | ||
1879 | out_alloc: | 1879 | out_alloc: |
1880 | /* unable to find the name from a previous getname(). Allocate a new | 1880 | /* unable to find an entry with both a matching name and type */ |
1881 | * anonymous entry. | 1881 | n = audit_alloc_name(context, AUDIT_TYPE_UNKNOWN); |
1882 | */ | ||
1883 | n = audit_alloc_name(context, AUDIT_TYPE_NORMAL); | ||
1884 | if (!n) | 1882 | if (!n) |
1885 | return; | 1883 | return; |
1884 | if (name) | ||
1885 | /* since name is not NULL we know there is already a matching | ||
1886 | * name record, see audit_getname(), so there must be a type | ||
1887 | * mismatch; reuse the string path since the original name | ||
1888 | * record will keep the string valid until we free it in | ||
1889 | * audit_free_names() */ | ||
1890 | n->name = name; | ||
1891 | |||
1886 | out: | 1892 | out: |
1887 | if (parent) { | 1893 | if (parent) { |
1888 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; | 1894 | n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL; |
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 6e7708c2c21f..48b28d387c7f 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
@@ -94,7 +94,7 @@ config PM_STD_PARTITION | |||
94 | config PM_SLEEP | 94 | config PM_SLEEP |
95 | def_bool y | 95 | def_bool y |
96 | depends on SUSPEND || HIBERNATE_CALLBACKS | 96 | depends on SUSPEND || HIBERNATE_CALLBACKS |
97 | select PM_RUNTIME | 97 | select PM |
98 | 98 | ||
99 | config PM_SLEEP_SMP | 99 | config PM_SLEEP_SMP |
100 | def_bool y | 100 | def_bool y |
@@ -130,23 +130,19 @@ config PM_WAKELOCKS_GC | |||
130 | depends on PM_WAKELOCKS | 130 | depends on PM_WAKELOCKS |
131 | default y | 131 | default y |
132 | 132 | ||
133 | config PM_RUNTIME | 133 | config PM |
134 | bool "Run-time PM core functionality" | 134 | bool "Device power management core functionality" |
135 | ---help--- | 135 | ---help--- |
136 | Enable functionality allowing I/O devices to be put into energy-saving | 136 | Enable functionality allowing I/O devices to be put into energy-saving |
137 | (low power) states at run time (or autosuspended) after a specified | 137 | (low power) states, for example after a specified period of inactivity |
138 | period of inactivity and woken up in response to a hardware-generated | 138 | (autosuspended), and woken up in response to a hardware-generated |
139 | wake-up event or a driver's request. | 139 | wake-up event or a driver's request. |
140 | 140 | ||
141 | Hardware support is generally required for this functionality to work | 141 | Hardware support is generally required for this functionality to work |
142 | and the bus type drivers of the buses the devices are on are | 142 | and the bus type drivers of the buses the devices are on are |
143 | responsible for the actual handling of the autosuspend requests and | 143 | responsible for the actual handling of device suspend requests and |
144 | wake-up events. | 144 | wake-up events. |
145 | 145 | ||
146 | config PM | ||
147 | def_bool y | ||
148 | depends on PM_SLEEP || PM_RUNTIME | ||
149 | |||
150 | config PM_DEBUG | 146 | config PM_DEBUG |
151 | bool "Power Management Debug Support" | 147 | bool "Power Management Debug Support" |
152 | depends on PM | 148 | depends on PM |
@@ -968,7 +968,7 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end, | |||
968 | 968 | ||
969 | pudp = pud_offset(&pgd, addr); | 969 | pudp = pud_offset(&pgd, addr); |
970 | do { | 970 | do { |
971 | pud_t pud = ACCESS_ONCE(*pudp); | 971 | pud_t pud = READ_ONCE(*pudp); |
972 | 972 | ||
973 | next = pud_addr_end(addr, end); | 973 | next = pud_addr_end(addr, end); |
974 | if (pud_none(pud)) | 974 | if (pud_none(pud)) |
diff --git a/mm/memory.c b/mm/memory.c index d8aebc52265f..ca920d1fd314 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2378,12 +2378,12 @@ void unmap_mapping_range(struct address_space *mapping, | |||
2378 | details.last_index = ULONG_MAX; | 2378 | details.last_index = ULONG_MAX; |
2379 | 2379 | ||
2380 | 2380 | ||
2381 | i_mmap_lock_read(mapping); | 2381 | i_mmap_lock_write(mapping); |
2382 | if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap))) | 2382 | if (unlikely(!RB_EMPTY_ROOT(&mapping->i_mmap))) |
2383 | unmap_mapping_range_tree(&mapping->i_mmap, &details); | 2383 | unmap_mapping_range_tree(&mapping->i_mmap, &details); |
2384 | if (unlikely(!list_empty(&mapping->i_mmap_nonlinear))) | 2384 | if (unlikely(!list_empty(&mapping->i_mmap_nonlinear))) |
2385 | unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details); | 2385 | unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details); |
2386 | i_mmap_unlock_read(mapping); | 2386 | i_mmap_unlock_write(mapping); |
2387 | } | 2387 | } |
2388 | EXPORT_SYMBOL(unmap_mapping_range); | 2388 | EXPORT_SYMBOL(unmap_mapping_range); |
2389 | 2389 | ||
@@ -3195,7 +3195,16 @@ static int handle_pte_fault(struct mm_struct *mm, | |||
3195 | pte_t entry; | 3195 | pte_t entry; |
3196 | spinlock_t *ptl; | 3196 | spinlock_t *ptl; |
3197 | 3197 | ||
3198 | entry = ACCESS_ONCE(*pte); | 3198 | /* |
3199 | * some architectures can have larger ptes than wordsize, | ||
3200 | * e.g.ppc44x-defconfig has CONFIG_PTE_64BIT=y and CONFIG_32BIT=y, | ||
3201 | * so READ_ONCE or ACCESS_ONCE cannot guarantee atomic accesses. | ||
3202 | * The code below just needs a consistent view for the ifs and | ||
3203 | * we later double check anyway with the ptl lock held. So here | ||
3204 | * a barrier will do. | ||
3205 | */ | ||
3206 | entry = *pte; | ||
3207 | barrier(); | ||
3199 | if (!pte_present(entry)) { | 3208 | if (!pte_present(entry)) { |
3200 | if (pte_none(entry)) { | 3209 | if (pte_none(entry)) { |
3201 | if (vma->vm_ops) { | 3210 | if (vma->vm_ops) { |
@@ -583,7 +583,8 @@ pmd_t *mm_find_pmd(struct mm_struct *mm, unsigned long address) | |||
583 | * without holding anon_vma lock for write. So when looking for a | 583 | * without holding anon_vma lock for write. So when looking for a |
584 | * genuine pmde (in which to find pte), test present and !THP together. | 584 | * genuine pmde (in which to find pte), test present and !THP together. |
585 | */ | 585 | */ |
586 | pmde = ACCESS_ONCE(*pmd); | 586 | pmde = *pmd; |
587 | barrier(); | ||
587 | if (!pmd_present(pmde) || pmd_trans_huge(pmde)) | 588 | if (!pmd_present(pmde) || pmd_trans_huge(pmde)) |
588 | pmd = NULL; | 589 | pmd = NULL; |
589 | out: | 590 | out: |
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 5374b1bdf02f..edd2794569db 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
@@ -185,6 +185,18 @@ modbuiltin := -f $(srctree)/scripts/Makefile.modbuiltin obj | |||
185 | # $(Q)$(MAKE) $(dtbinst)=dir | 185 | # $(Q)$(MAKE) $(dtbinst)=dir |
186 | dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj | 186 | dtbinst := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.dtbinst obj |
187 | 187 | ||
188 | ### | ||
189 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj= | ||
190 | # Usage: | ||
191 | # $(Q)$(MAKE) $(clean)=dir | ||
192 | clean := -f $(srctree)/scripts/Makefile.clean obj | ||
193 | |||
194 | ### | ||
195 | # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj= | ||
196 | # Usage: | ||
197 | # $(Q)$(MAKE) $(hdr-inst)=dir | ||
198 | hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj | ||
199 | |||
188 | # Prefix -I with $(srctree) if it is not an absolute path. | 200 | # Prefix -I with $(srctree) if it is not an absolute path. |
189 | # skip if -I has no parameter | 201 | # skip if -I has no parameter |
190 | addtree = $(if $(patsubst -I%,%,$(1)), \ | 202 | addtree = $(if $(patsubst -I%,%,$(1)), \ |
diff --git a/scripts/Makefile.clean b/scripts/Makefile.clean index b1c668dc6815..1bca180db8ad 100644 --- a/scripts/Makefile.clean +++ b/scripts/Makefile.clean | |||
@@ -7,10 +7,7 @@ src := $(obj) | |||
7 | PHONY := __clean | 7 | PHONY := __clean |
8 | __clean: | 8 | __clean: |
9 | 9 | ||
10 | # Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir | 10 | include scripts/Kbuild.include |
11 | # Usage: | ||
12 | # $(Q)$(MAKE) $(clean)=dir | ||
13 | clean := -f $(srctree)/scripts/Makefile.clean obj | ||
14 | 11 | ||
15 | # The filename Kbuild has precedence over Makefile | 12 | # The filename Kbuild has precedence over Makefile |
16 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) | 13 | kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) |
@@ -91,11 +88,6 @@ PHONY += $(subdir-ymn) | |||
91 | $(subdir-ymn): | 88 | $(subdir-ymn): |
92 | $(Q)$(MAKE) $(clean)=$@ | 89 | $(Q)$(MAKE) $(clean)=$@ |
93 | 90 | ||
94 | # If quiet is set, only print short version of command | ||
95 | |||
96 | cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1)) | ||
97 | |||
98 | |||
99 | # Declare the contents of the .PHONY variable as phony. We keep that | 91 | # Declare the contents of the .PHONY variable as phony. We keep that |
100 | # information in a variable se we can use it in if_changed and friends. | 92 | # information in a variable se we can use it in if_changed and friends. |
101 | 93 | ||
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 8ccf83056a7a..1106d6ca3a38 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst | |||
@@ -122,7 +122,6 @@ $(check-file): scripts/headers_check.pl $(output-files) FORCE | |||
122 | endif | 122 | endif |
123 | 123 | ||
124 | # Recursion | 124 | # Recursion |
125 | hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj | ||
126 | .PHONY: $(subdirs) | 125 | .PHONY: $(subdirs) |
127 | $(subdirs): | 126 | $(subdirs): |
128 | $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@ | 127 | $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(_dst)/$@ |
diff --git a/scripts/coccinelle/misc/bugon.cocci b/scripts/coccinelle/misc/bugon.cocci index 556456ca761c..3b7eec24fb5a 100644 --- a/scripts/coccinelle/misc/bugon.cocci +++ b/scripts/coccinelle/misc/bugon.cocci | |||
@@ -8,7 +8,7 @@ | |||
8 | // Confidence: High | 8 | // Confidence: High |
9 | // Copyright: (C) 2014 Himangi Saraogi. GPLv2. | 9 | // Copyright: (C) 2014 Himangi Saraogi. GPLv2. |
10 | // Comments: | 10 | // Comments: |
11 | // Options: --no-includes, --include-headers | 11 | // Options: --no-includes --include-headers |
12 | 12 | ||
13 | virtual patch | 13 | virtual patch |
14 | virtual context | 14 | virtual context |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index a26cc5d2a9b0..72c9dba84c5d 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
@@ -548,7 +548,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
548 | { | 548 | { |
549 | int i, j; | 549 | int i, j; |
550 | struct menu *submenu[8], *menu, *location = NULL; | 550 | struct menu *submenu[8], *menu, *location = NULL; |
551 | struct jump_key *jump; | 551 | struct jump_key *jump = NULL; |
552 | 552 | ||
553 | str_printf(r, _("Prompt: %s\n"), _(prop->text)); | 553 | str_printf(r, _("Prompt: %s\n"), _(prop->text)); |
554 | menu = prop->menu->parent; | 554 | menu = prop->menu->parent; |
@@ -586,7 +586,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, | |||
586 | str_printf(r, _(" Location:\n")); | 586 | str_printf(r, _(" Location:\n")); |
587 | for (j = 4; --i >= 0; j += 2) { | 587 | for (j = 4; --i >= 0; j += 2) { |
588 | menu = submenu[i]; | 588 | menu = submenu[i]; |
589 | if (head && location && menu == location) | 589 | if (jump && menu == location) |
590 | jump->offset = strlen(r->s); | 590 | jump->offset = strlen(r->s); |
591 | str_printf(r, "%*c-> %s", j, ' ', | 591 | str_printf(r, "%*c-> %s", j, ' ', |
592 | _(menu_get_prompt(menu))); | 592 | _(menu_get_prompt(menu))); |
diff --git a/scripts/package/mkspec b/scripts/package/mkspec index 13957602f7ca..d9ab94b17de0 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec | |||
@@ -117,6 +117,7 @@ echo 'mv vmlinux.bz2 $RPM_BUILD_ROOT'"/boot/vmlinux-$KERNELRELEASE.bz2" | |||
117 | echo 'mv vmlinux.orig vmlinux' | 117 | echo 'mv vmlinux.orig vmlinux' |
118 | echo "%endif" | 118 | echo "%endif" |
119 | 119 | ||
120 | if ! $PREBUILT; then | ||
120 | echo 'rm -f $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE/{build,source}" | 121 | echo 'rm -f $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE/{build,source}" |
121 | echo "mkdir -p "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE" | 122 | echo "mkdir -p "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNELRELEASE" |
122 | echo "EXCLUDES=\"$RCS_TAR_IGNORE --exclude .tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude=firmware --exclude .config.old --exclude .missing-syscalls.d\"" | 123 | echo "EXCLUDES=\"$RCS_TAR_IGNORE --exclude .tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude=firmware --exclude .config.old --exclude .missing-syscalls.d\"" |
@@ -124,6 +125,7 @@ echo "tar "'$EXCLUDES'" -cf- . | (cd "'$RPM_BUILD_ROOT'"/usr/src/kernels/$KERNEL | |||
124 | echo 'cd $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE" | 125 | echo 'cd $RPM_BUILD_ROOT'"/lib/modules/$KERNELRELEASE" |
125 | echo "ln -sf /usr/src/kernels/$KERNELRELEASE build" | 126 | echo "ln -sf /usr/src/kernels/$KERNELRELEASE build" |
126 | echo "ln -sf /usr/src/kernels/$KERNELRELEASE source" | 127 | echo "ln -sf /usr/src/kernels/$KERNELRELEASE source" |
128 | fi | ||
127 | 129 | ||
128 | echo "" | 130 | echo "" |
129 | echo "%clean" | 131 | echo "%clean" |
@@ -151,9 +153,11 @@ echo "%files headers" | |||
151 | echo '%defattr (-, root, root)' | 153 | echo '%defattr (-, root, root)' |
152 | echo "/usr/include" | 154 | echo "/usr/include" |
153 | echo "" | 155 | echo "" |
156 | if ! $PREBUILT; then | ||
154 | echo "%files devel" | 157 | echo "%files devel" |
155 | echo '%defattr (-, root, root)' | 158 | echo '%defattr (-, root, root)' |
156 | echo "/usr/src/kernels/$KERNELRELEASE" | 159 | echo "/usr/src/kernels/$KERNELRELEASE" |
157 | echo "/lib/modules/$KERNELRELEASE/build" | 160 | echo "/lib/modules/$KERNELRELEASE/build" |
158 | echo "/lib/modules/$KERNELRELEASE/source" | 161 | echo "/lib/modules/$KERNELRELEASE/source" |
159 | echo "" | 162 | echo "" |
163 | fi | ||
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c index 8276a743e22e..0cfc9c8c4b4e 100644 --- a/sound/pci/hda/hda_controller.c +++ b/sound/pci/hda/hda_controller.c | |||
@@ -1922,10 +1922,18 @@ int azx_mixer_create(struct azx *chip) | |||
1922 | EXPORT_SYMBOL_GPL(azx_mixer_create); | 1922 | EXPORT_SYMBOL_GPL(azx_mixer_create); |
1923 | 1923 | ||
1924 | 1924 | ||
1925 | static bool is_input_stream(struct azx *chip, unsigned char index) | ||
1926 | { | ||
1927 | return (index >= chip->capture_index_offset && | ||
1928 | index < chip->capture_index_offset + chip->capture_streams); | ||
1929 | } | ||
1930 | |||
1925 | /* initialize SD streams */ | 1931 | /* initialize SD streams */ |
1926 | int azx_init_stream(struct azx *chip) | 1932 | int azx_init_stream(struct azx *chip) |
1927 | { | 1933 | { |
1928 | int i; | 1934 | int i; |
1935 | int in_stream_tag = 0; | ||
1936 | int out_stream_tag = 0; | ||
1929 | 1937 | ||
1930 | /* initialize each stream (aka device) | 1938 | /* initialize each stream (aka device) |
1931 | * assign the starting bdl address to each stream (device) | 1939 | * assign the starting bdl address to each stream (device) |
@@ -1938,9 +1946,21 @@ int azx_init_stream(struct azx *chip) | |||
1938 | azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80); | 1946 | azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80); |
1939 | /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */ | 1947 | /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */ |
1940 | azx_dev->sd_int_sta_mask = 1 << i; | 1948 | azx_dev->sd_int_sta_mask = 1 << i; |
1941 | /* stream tag: must be non-zero and unique */ | ||
1942 | azx_dev->index = i; | 1949 | azx_dev->index = i; |
1943 | azx_dev->stream_tag = i + 1; | 1950 | |
1951 | /* stream tag must be unique throughout | ||
1952 | * the stream direction group, | ||
1953 | * valid values 1...15 | ||
1954 | * use separate stream tag if the flag | ||
1955 | * AZX_DCAPS_SEPARATE_STREAM_TAG is used | ||
1956 | */ | ||
1957 | if (chip->driver_caps & AZX_DCAPS_SEPARATE_STREAM_TAG) | ||
1958 | azx_dev->stream_tag = | ||
1959 | is_input_stream(chip, i) ? | ||
1960 | ++in_stream_tag : | ||
1961 | ++out_stream_tag; | ||
1962 | else | ||
1963 | azx_dev->stream_tag = i + 1; | ||
1944 | } | 1964 | } |
1945 | 1965 | ||
1946 | return 0; | 1966 | return 0; |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 2bf0b568e3de..d426a0bd6a5f 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -299,6 +299,9 @@ enum { | |||
299 | AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\ | 299 | AZX_DCAPS_PM_RUNTIME | AZX_DCAPS_I915_POWERWELL |\ |
300 | AZX_DCAPS_SNOOP_TYPE(SCH)) | 300 | AZX_DCAPS_SNOOP_TYPE(SCH)) |
301 | 301 | ||
302 | #define AZX_DCAPS_INTEL_SKYLAKE \ | ||
303 | (AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG) | ||
304 | |||
302 | /* quirks for ATI SB / AMD Hudson */ | 305 | /* quirks for ATI SB / AMD Hudson */ |
303 | #define AZX_DCAPS_PRESET_ATI_SB \ | 306 | #define AZX_DCAPS_PRESET_ATI_SB \ |
304 | (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\ | 307 | (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\ |
@@ -2027,7 +2030,7 @@ static const struct pci_device_id azx_ids[] = { | |||
2027 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | 2030 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
2028 | /* Sunrise Point-LP */ | 2031 | /* Sunrise Point-LP */ |
2029 | { PCI_DEVICE(0x8086, 0x9d70), | 2032 | { PCI_DEVICE(0x8086, 0x9d70), |
2030 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | 2033 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE }, |
2031 | /* Haswell */ | 2034 | /* Haswell */ |
2032 | { PCI_DEVICE(0x8086, 0x0a0c), | 2035 | { PCI_DEVICE(0x8086, 0x0a0c), |
2033 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, | 2036 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index aa484fdf4338..166e3e84b963 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h | |||
@@ -171,6 +171,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | |||
171 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ | 171 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ |
172 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ | 172 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ |
173 | #define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ | 173 | #define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ |
174 | #define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */ | ||
174 | 175 | ||
175 | enum { | 176 | enum { |
176 | AZX_SNOOP_TYPE_NONE , | 177 | AZX_SNOOP_TYPE_NONE , |
diff --git a/sound/soc/intel/sst-haswell-pcm.c b/sound/soc/intel/sst-haswell-pcm.c index b8a782c0d4cd..619525200705 100644 --- a/sound/soc/intel/sst-haswell-pcm.c +++ b/sound/soc/intel/sst-haswell-pcm.c | |||
@@ -998,7 +998,7 @@ static int hsw_pcm_dev_remove(struct platform_device *pdev) | |||
998 | return 0; | 998 | return 0; |
999 | } | 999 | } |
1000 | 1000 | ||
1001 | #ifdef CONFIG_PM_RUNTIME | 1001 | #ifdef CONFIG_PM |
1002 | 1002 | ||
1003 | static int hsw_pcm_runtime_idle(struct device *dev) | 1003 | static int hsw_pcm_runtime_idle(struct device *dev) |
1004 | { | 1004 | { |
@@ -1057,7 +1057,7 @@ static int hsw_pcm_runtime_resume(struct device *dev) | |||
1057 | #define hsw_pcm_runtime_resume NULL | 1057 | #define hsw_pcm_runtime_resume NULL |
1058 | #endif | 1058 | #endif |
1059 | 1059 | ||
1060 | #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_RUNTIME) | 1060 | #ifdef CONFIG_PM |
1061 | 1061 | ||
1062 | static void hsw_pcm_complete(struct device *dev) | 1062 | static void hsw_pcm_complete(struct device *dev) |
1063 | { | 1063 | { |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f5283438ee05..1cc6e2e19982 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -671,6 +671,7 @@ static void update_memslots(struct kvm_memslots *slots, | |||
671 | 671 | ||
672 | WARN_ON(mslots[i].id != id); | 672 | WARN_ON(mslots[i].id != id); |
673 | if (!new->npages) { | 673 | if (!new->npages) { |
674 | WARN_ON(!mslots[i].npages); | ||
674 | new->base_gfn = 0; | 675 | new->base_gfn = 0; |
675 | if (mslots[i].npages) | 676 | if (mslots[i].npages) |
676 | slots->used_slots--; | 677 | slots->used_slots--; |
@@ -687,12 +688,25 @@ static void update_memslots(struct kvm_memslots *slots, | |||
687 | slots->id_to_index[mslots[i].id] = i; | 688 | slots->id_to_index[mslots[i].id] = i; |
688 | i++; | 689 | i++; |
689 | } | 690 | } |
690 | while (i > 0 && | 691 | |
691 | new->base_gfn > mslots[i - 1].base_gfn) { | 692 | /* |
692 | mslots[i] = mslots[i - 1]; | 693 | * The ">=" is needed when creating a slot with base_gfn == 0, |
693 | slots->id_to_index[mslots[i].id] = i; | 694 | * so that it moves before all those with base_gfn == npages == 0. |
694 | i--; | 695 | * |
695 | } | 696 | * On the other hand, if new->npages is zero, the above loop has |
697 | * already left i pointing to the beginning of the empty part of | ||
698 | * mslots, and the ">=" would move the hole backwards in this | ||
699 | * case---which is wrong. So skip the loop when deleting a slot. | ||
700 | */ | ||
701 | if (new->npages) { | ||
702 | while (i > 0 && | ||
703 | new->base_gfn >= mslots[i - 1].base_gfn) { | ||
704 | mslots[i] = mslots[i - 1]; | ||
705 | slots->id_to_index[mslots[i].id] = i; | ||
706 | i--; | ||
707 | } | ||
708 | } else | ||
709 | WARN_ON_ONCE(i != slots->used_slots); | ||
696 | 710 | ||
697 | mslots[i] = *new; | 711 | mslots[i] = *new; |
698 | slots->id_to_index[mslots[i].id] = i; | 712 | slots->id_to_index[mslots[i].id] = i; |