diff options
| -rw-r--r-- | Documentation/devicetree/bindings/clock/qcom,gcc.txt | 2 | ||||
| -rw-r--r-- | drivers/clk/qcom/gcc-msm8974.c | 130 | ||||
| -rw-r--r-- | include/dt-bindings/clock/qcom,gcc-msm8974.h | 4 |
3 files changed, 130 insertions, 6 deletions
diff --git a/Documentation/devicetree/bindings/clock/qcom,gcc.txt b/Documentation/devicetree/bindings/clock/qcom,gcc.txt index 7b7104e8cb1e..9cfcb4f2bc97 100644 --- a/Documentation/devicetree/bindings/clock/qcom,gcc.txt +++ b/Documentation/devicetree/bindings/clock/qcom,gcc.txt | |||
| @@ -8,6 +8,8 @@ Required properties : | |||
| 8 | "qcom,gcc-msm8660" | 8 | "qcom,gcc-msm8660" |
| 9 | "qcom,gcc-msm8960" | 9 | "qcom,gcc-msm8960" |
| 10 | "qcom,gcc-msm8974" | 10 | "qcom,gcc-msm8974" |
| 11 | "qcom,gcc-msm8974pro" | ||
| 12 | "qcom,gcc-msm8974pro-ac" | ||
| 11 | 13 | ||
| 12 | - reg : shall contain base register location and length | 14 | - reg : shall contain base register location and length |
| 13 | - #clock-cells : shall contain 1 | 15 | - #clock-cells : shall contain 1 |
diff --git a/drivers/clk/qcom/gcc-msm8974.c b/drivers/clk/qcom/gcc-msm8974.c index 7a420fcdb89e..7af7c18d2144 100644 --- a/drivers/clk/qcom/gcc-msm8974.c +++ b/drivers/clk/qcom/gcc-msm8974.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #define P_XO 0 | 35 | #define P_XO 0 |
| 36 | #define P_GPLL0 1 | 36 | #define P_GPLL0 1 |
| 37 | #define P_GPLL1 1 | 37 | #define P_GPLL1 1 |
| 38 | #define P_GPLL4 2 | ||
| 38 | 39 | ||
| 39 | static const u8 gcc_xo_gpll0_map[] = { | 40 | static const u8 gcc_xo_gpll0_map[] = { |
| 40 | [P_XO] = 0, | 41 | [P_XO] = 0, |
| @@ -46,6 +47,18 @@ static const char *gcc_xo_gpll0[] = { | |||
| 46 | "gpll0_vote", | 47 | "gpll0_vote", |
| 47 | }; | 48 | }; |
| 48 | 49 | ||
| 50 | static const u8 gcc_xo_gpll0_gpll4_map[] = { | ||
| 51 | [P_XO] = 0, | ||
| 52 | [P_GPLL0] = 1, | ||
| 53 | [P_GPLL4] = 5, | ||
| 54 | }; | ||
| 55 | |||
| 56 | static const char *gcc_xo_gpll0_gpll4[] = { | ||
| 57 | "xo", | ||
| 58 | "gpll0_vote", | ||
| 59 | "gpll4_vote", | ||
| 60 | }; | ||
| 61 | |||
| 49 | #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } | 62 | #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) } |
| 50 | 63 | ||
| 51 | static struct clk_pll gpll0 = { | 64 | static struct clk_pll gpll0 = { |
| @@ -138,6 +151,33 @@ static struct clk_regmap gpll1_vote = { | |||
| 138 | }, | 151 | }, |
| 139 | }; | 152 | }; |
| 140 | 153 | ||
| 154 | static struct clk_pll gpll4 = { | ||
| 155 | .l_reg = 0x1dc4, | ||
| 156 | .m_reg = 0x1dc8, | ||
| 157 | .n_reg = 0x1dcc, | ||
| 158 | .config_reg = 0x1dd4, | ||
| 159 | .mode_reg = 0x1dc0, | ||
| 160 | .status_reg = 0x1ddc, | ||
| 161 | .status_bit = 17, | ||
| 162 | .clkr.hw.init = &(struct clk_init_data){ | ||
| 163 | .name = "gpll4", | ||
| 164 | .parent_names = (const char *[]){ "xo" }, | ||
| 165 | .num_parents = 1, | ||
| 166 | .ops = &clk_pll_ops, | ||
| 167 | }, | ||
| 168 | }; | ||
| 169 | |||
| 170 | static struct clk_regmap gpll4_vote = { | ||
| 171 | .enable_reg = 0x1480, | ||
| 172 | .enable_mask = BIT(4), | ||
| 173 | .hw.init = &(struct clk_init_data){ | ||
| 174 | .name = "gpll4_vote", | ||
| 175 | .parent_names = (const char *[]){ "gpll4" }, | ||
| 176 | .num_parents = 1, | ||
| 177 | .ops = &clk_pll_vote_ops, | ||
| 178 | }, | ||
| 179 | }; | ||
| 180 | |||
| 141 | static const struct freq_tbl ftbl_gcc_usb30_master_clk[] = { | 181 | static const struct freq_tbl ftbl_gcc_usb30_master_clk[] = { |
| 142 | F(125000000, P_GPLL0, 1, 5, 24), | 182 | F(125000000, P_GPLL0, 1, 5, 24), |
| 143 | { } | 183 | { } |
| @@ -812,18 +852,33 @@ static const struct freq_tbl ftbl_gcc_sdcc1_4_apps_clk[] = { | |||
| 812 | { } | 852 | { } |
| 813 | }; | 853 | }; |
| 814 | 854 | ||
| 855 | static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_pro[] = { | ||
| 856 | F(144000, P_XO, 16, 3, 25), | ||
| 857 | F(400000, P_XO, 12, 1, 4), | ||
| 858 | F(20000000, P_GPLL0, 15, 1, 2), | ||
| 859 | F(25000000, P_GPLL0, 12, 1, 2), | ||
| 860 | F(50000000, P_GPLL0, 12, 0, 0), | ||
| 861 | F(100000000, P_GPLL0, 6, 0, 0), | ||
| 862 | F(192000000, P_GPLL4, 4, 0, 0), | ||
| 863 | F(200000000, P_GPLL0, 3, 0, 0), | ||
| 864 | F(384000000, P_GPLL4, 2, 0, 0), | ||
| 865 | { } | ||
| 866 | }; | ||
| 867 | |||
| 868 | static struct clk_init_data sdcc1_apps_clk_src_init = { | ||
| 869 | .name = "sdcc1_apps_clk_src", | ||
| 870 | .parent_names = gcc_xo_gpll0, | ||
| 871 | .num_parents = 2, | ||
| 872 | .ops = &clk_rcg2_ops, | ||
| 873 | }; | ||
| 874 | |||
| 815 | static struct clk_rcg2 sdcc1_apps_clk_src = { | 875 | static struct clk_rcg2 sdcc1_apps_clk_src = { |
| 816 | .cmd_rcgr = 0x04d0, | 876 | .cmd_rcgr = 0x04d0, |
| 817 | .mnd_width = 8, | 877 | .mnd_width = 8, |
| 818 | .hid_width = 5, | 878 | .hid_width = 5, |
| 819 | .parent_map = gcc_xo_gpll0_map, | 879 | .parent_map = gcc_xo_gpll0_map, |
| 820 | .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk, | 880 | .freq_tbl = ftbl_gcc_sdcc1_4_apps_clk, |
| 821 | .clkr.hw.init = &(struct clk_init_data){ | 881 | .clkr.hw.init = &sdcc1_apps_clk_src_init, |
| 822 | .name = "sdcc1_apps_clk_src", | ||
| 823 | .parent_names = gcc_xo_gpll0, | ||
| 824 | .num_parents = 2, | ||
| 825 | .ops = &clk_rcg2_ops, | ||
| 826 | }, | ||
| 827 | }; | 882 | }; |
| 828 | 883 | ||
| 829 | static struct clk_rcg2 sdcc2_apps_clk_src = { | 884 | static struct clk_rcg2 sdcc2_apps_clk_src = { |
| @@ -1995,6 +2050,38 @@ static struct clk_branch gcc_sdcc1_apps_clk = { | |||
| 1995 | }, | 2050 | }, |
| 1996 | }; | 2051 | }; |
| 1997 | 2052 | ||
| 2053 | static struct clk_branch gcc_sdcc1_cdccal_ff_clk = { | ||
| 2054 | .halt_reg = 0x04e8, | ||
| 2055 | .clkr = { | ||
| 2056 | .enable_reg = 0x04e8, | ||
| 2057 | .enable_mask = BIT(0), | ||
| 2058 | .hw.init = &(struct clk_init_data){ | ||
| 2059 | .name = "gcc_sdcc1_cdccal_ff_clk", | ||
| 2060 | .parent_names = (const char *[]){ | ||
| 2061 | "xo" | ||
| 2062 | }, | ||
| 2063 | .num_parents = 1, | ||
| 2064 | .ops = &clk_branch2_ops, | ||
| 2065 | }, | ||
| 2066 | }, | ||
| 2067 | }; | ||
| 2068 | |||
| 2069 | static struct clk_branch gcc_sdcc1_cdccal_sleep_clk = { | ||
| 2070 | .halt_reg = 0x04e4, | ||
| 2071 | .clkr = { | ||
| 2072 | .enable_reg = 0x04e4, | ||
| 2073 | .enable_mask = BIT(0), | ||
| 2074 | .hw.init = &(struct clk_init_data){ | ||
| 2075 | .name = "gcc_sdcc1_cdccal_sleep_clk", | ||
| 2076 | .parent_names = (const char *[]){ | ||
| 2077 | "sleep_clk_src" | ||
| 2078 | }, | ||
| 2079 | .num_parents = 1, | ||
| 2080 | .ops = &clk_branch2_ops, | ||
| 2081 | }, | ||
| 2082 | }, | ||
| 2083 | }; | ||
| 2084 | |||
| 1998 | static struct clk_branch gcc_sdcc2_ahb_clk = { | 2085 | static struct clk_branch gcc_sdcc2_ahb_clk = { |
| 1999 | .halt_reg = 0x0508, | 2086 | .halt_reg = 0x0508, |
| 2000 | .clkr = { | 2087 | .clkr = { |
| @@ -2484,6 +2571,10 @@ static struct clk_regmap *gcc_msm8974_clocks[] = { | |||
| 2484 | [GCC_USB_HSIC_IO_CAL_SLEEP_CLK] = &gcc_usb_hsic_io_cal_sleep_clk.clkr, | 2571 | [GCC_USB_HSIC_IO_CAL_SLEEP_CLK] = &gcc_usb_hsic_io_cal_sleep_clk.clkr, |
| 2485 | [GCC_USB_HSIC_SYSTEM_CLK] = &gcc_usb_hsic_system_clk.clkr, | 2572 | [GCC_USB_HSIC_SYSTEM_CLK] = &gcc_usb_hsic_system_clk.clkr, |
| 2486 | [GCC_MMSS_GPLL0_CLK_SRC] = &gcc_mmss_gpll0_clk_src, | 2573 | [GCC_MMSS_GPLL0_CLK_SRC] = &gcc_mmss_gpll0_clk_src, |
| 2574 | [GPLL4] = NULL, | ||
| 2575 | [GPLL4_VOTE] = NULL, | ||
| 2576 | [GCC_SDCC1_CDCCAL_SLEEP_CLK] = NULL, | ||
| 2577 | [GCC_SDCC1_CDCCAL_FF_CLK] = NULL, | ||
| 2487 | }; | 2578 | }; |
| 2488 | 2579 | ||
| 2489 | static const struct qcom_reset_map gcc_msm8974_resets[] = { | 2580 | static const struct qcom_reset_map gcc_msm8974_resets[] = { |
| @@ -2585,14 +2676,41 @@ static const struct qcom_cc_desc gcc_msm8974_desc = { | |||
| 2585 | 2676 | ||
| 2586 | static const struct of_device_id gcc_msm8974_match_table[] = { | 2677 | static const struct of_device_id gcc_msm8974_match_table[] = { |
| 2587 | { .compatible = "qcom,gcc-msm8974" }, | 2678 | { .compatible = "qcom,gcc-msm8974" }, |
| 2679 | { .compatible = "qcom,gcc-msm8974pro" , .data = (void *)1UL }, | ||
| 2680 | { .compatible = "qcom,gcc-msm8974pro-ac", .data = (void *)1UL }, | ||
| 2588 | { } | 2681 | { } |
| 2589 | }; | 2682 | }; |
| 2590 | MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table); | 2683 | MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table); |
| 2591 | 2684 | ||
| 2685 | static void msm8974_pro_clock_override(void) | ||
| 2686 | { | ||
| 2687 | sdcc1_apps_clk_src_init.parent_names = gcc_xo_gpll0_gpll4; | ||
| 2688 | sdcc1_apps_clk_src_init.num_parents = 3; | ||
| 2689 | sdcc1_apps_clk_src.freq_tbl = ftbl_gcc_sdcc1_apps_clk_pro; | ||
| 2690 | sdcc1_apps_clk_src.parent_map = gcc_xo_gpll0_gpll4_map; | ||
| 2691 | |||
| 2692 | gcc_msm8974_clocks[GPLL4] = &gpll4.clkr; | ||
| 2693 | gcc_msm8974_clocks[GPLL4_VOTE] = &gpll4_vote; | ||
| 2694 | gcc_msm8974_clocks[GCC_SDCC1_CDCCAL_SLEEP_CLK] = | ||
| 2695 | &gcc_sdcc1_cdccal_sleep_clk.clkr; | ||
| 2696 | gcc_msm8974_clocks[GCC_SDCC1_CDCCAL_FF_CLK] = | ||
| 2697 | &gcc_sdcc1_cdccal_ff_clk.clkr; | ||
| 2698 | } | ||
| 2699 | |||
| 2592 | static int gcc_msm8974_probe(struct platform_device *pdev) | 2700 | static int gcc_msm8974_probe(struct platform_device *pdev) |
| 2593 | { | 2701 | { |
| 2594 | struct clk *clk; | 2702 | struct clk *clk; |
| 2595 | struct device *dev = &pdev->dev; | 2703 | struct device *dev = &pdev->dev; |
| 2704 | bool pro; | ||
| 2705 | const struct of_device_id *id; | ||
| 2706 | |||
| 2707 | id = of_match_device(gcc_msm8974_match_table, dev); | ||
| 2708 | if (!id) | ||
| 2709 | return -ENODEV; | ||
| 2710 | pro = !!(id->data); | ||
| 2711 | |||
| 2712 | if (pro) | ||
| 2713 | msm8974_pro_clock_override(); | ||
| 2596 | 2714 | ||
| 2597 | /* Temporary until RPM clocks supported */ | 2715 | /* Temporary until RPM clocks supported */ |
| 2598 | clk = clk_register_fixed_rate(dev, "xo", NULL, CLK_IS_ROOT, 19200000); | 2716 | clk = clk_register_fixed_rate(dev, "xo", NULL, CLK_IS_ROOT, 19200000); |
diff --git a/include/dt-bindings/clock/qcom,gcc-msm8974.h b/include/dt-bindings/clock/qcom,gcc-msm8974.h index 223ca174d9d3..51e51c860fe6 100644 --- a/include/dt-bindings/clock/qcom,gcc-msm8974.h +++ b/include/dt-bindings/clock/qcom,gcc-msm8974.h | |||
| @@ -316,5 +316,9 @@ | |||
| 316 | #define GCC_CE2_CLK_SLEEP_ENA 299 | 316 | #define GCC_CE2_CLK_SLEEP_ENA 299 |
| 317 | #define GCC_CE2_AXI_CLK_SLEEP_ENA 300 | 317 | #define GCC_CE2_AXI_CLK_SLEEP_ENA 300 |
| 318 | #define GCC_CE2_AHB_CLK_SLEEP_ENA 301 | 318 | #define GCC_CE2_AHB_CLK_SLEEP_ENA 301 |
| 319 | #define GPLL4 302 | ||
| 320 | #define GPLL4_VOTE 303 | ||
| 321 | #define GCC_SDCC1_CDCCAL_SLEEP_CLK 304 | ||
| 322 | #define GCC_SDCC1_CDCCAL_FF_CLK 305 | ||
| 319 | 323 | ||
| 320 | #endif | 324 | #endif |
