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

clk: qcom: Add support for APQ8064 multimedia clocks

The APQ8064 multimedia clock controller is fairly similar to the
8960 multimedia clock controller, except that gfx2d0/1 has been
removed and the gfx3d frequency is slightly faster when using the
newly introduced PLL15. We also add vcap clocks and a couple new
TV clocks.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>

+448 -2
+1
Documentation/devicetree/bindings/clock/qcom,mmcc.txt
··· 4 4 Required properties : 5 5 - compatible : shall contain only one of the following: 6 6 7 + "qcom,mmcc-apq8064" 7 8 "qcom,mmcc-apq8084" 8 9 "qcom,mmcc-msm8660" 9 10 "qcom,mmcc-msm8960"
+431 -2
drivers/clk/qcom/mmcc-msm8960.c
··· 37 37 #define P_PLL8 1 38 38 #define P_PLL2 2 39 39 #define P_PLL3 3 40 + #define P_PLL15 3 40 41 41 42 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n } 42 43 ··· 58 57 [P_PLL8] = 2, 59 58 [P_PLL2] = 1, 60 59 [P_PLL3] = 3, 60 + }; 61 + 62 + static const char *mmcc_pxo_pll8_pll2_pll15[] = { 63 + "pxo", 64 + "pll8_vote", 65 + "pll2", 66 + "pll15", 67 + }; 68 + 69 + static u8 mmcc_pxo_pll8_pll2_pll15_map[] = { 70 + [P_PXO] = 0, 71 + [P_PLL8] = 2, 72 + [P_PLL2] = 1, 73 + [P_PLL15] = 3, 61 74 }; 62 75 63 76 static const char *mmcc_pxo_pll8_pll2_pll3[] = { ··· 95 80 .num_parents = 1, 96 81 .ops = &clk_pll_ops, 97 82 }, 83 + }; 84 + 85 + static struct clk_pll pll15 = { 86 + .l_reg = 0x33c, 87 + .m_reg = 0x340, 88 + .n_reg = 0x344, 89 + .config_reg = 0x348, 90 + .mode_reg = 0x338, 91 + .status_reg = 0x350, 92 + .status_bit = 16, 93 + .clkr.hw.init = &(struct clk_init_data){ 94 + .name = "pll15", 95 + .parent_names = (const char *[]){ "pxo" }, 96 + .num_parents = 1, 97 + .ops = &clk_pll_ops, 98 + }, 99 + }; 100 + 101 + static const struct pll_config pll15_config = { 102 + .l = 33, 103 + .m = 1, 104 + .n = 3, 105 + .vco_val = 0x2 << 16, 106 + .vco_mask = 0x3 << 16, 107 + .pre_div_val = 0x0, 108 + .pre_div_mask = BIT(19), 109 + .post_div_val = 0x0, 110 + .post_div_mask = 0x3 << 20, 111 + .mn_ena_mask = BIT(22), 112 + .main_output_mask = BIT(23), 98 113 }; 99 114 100 115 static struct freq_tbl clk_tbl_cam[] = { ··· 908 863 { } 909 864 }; 910 865 866 + static struct freq_tbl clk_tbl_gfx3d_8064[] = { 867 + F_MN( 27000000, P_PXO, 0, 0), 868 + F_MN( 48000000, P_PLL8, 1, 8), 869 + F_MN( 54857000, P_PLL8, 1, 7), 870 + F_MN( 64000000, P_PLL8, 1, 6), 871 + F_MN( 76800000, P_PLL8, 1, 5), 872 + F_MN( 96000000, P_PLL8, 1, 4), 873 + F_MN(128000000, P_PLL8, 1, 3), 874 + F_MN(145455000, P_PLL2, 2, 11), 875 + F_MN(160000000, P_PLL2, 1, 5), 876 + F_MN(177778000, P_PLL2, 2, 9), 877 + F_MN(192000000, P_PLL8, 1, 2), 878 + F_MN(200000000, P_PLL2, 1, 4), 879 + F_MN(228571000, P_PLL2, 2, 7), 880 + F_MN(266667000, P_PLL2, 1, 3), 881 + F_MN(320000000, P_PLL2, 2, 5), 882 + F_MN(400000000, P_PLL2, 1, 2), 883 + F_MN(450000000, P_PLL15, 1, 2), 884 + { } 885 + }; 886 + 911 887 static struct clk_dyn_rcg gfx3d_src = { 912 888 .ns_reg = 0x008c, 913 889 .md_reg[0] = 0x0084, ··· 971 905 }, 972 906 }; 973 907 908 + static const struct clk_init_data gfx3d_8064_init = { 909 + .name = "gfx3d_src", 910 + .parent_names = mmcc_pxo_pll8_pll2_pll15, 911 + .num_parents = 4, 912 + .ops = &clk_dyn_rcg_ops, 913 + }; 914 + 974 915 static struct clk_branch gfx3d_clk = { 975 916 .halt_reg = 0x01c8, 976 917 .halt_bit = 4, ··· 987 914 .hw.init = &(struct clk_init_data){ 988 915 .name = "gfx3d_clk", 989 916 .parent_names = (const char *[]){ "gfx3d_src" }, 917 + .num_parents = 1, 918 + .ops = &clk_branch_ops, 919 + .flags = CLK_SET_RATE_PARENT, 920 + }, 921 + }, 922 + }; 923 + 924 + static struct freq_tbl clk_tbl_vcap[] = { 925 + F_MN( 27000000, P_PXO, 0, 0), 926 + F_MN( 54860000, P_PLL8, 1, 7), 927 + F_MN( 64000000, P_PLL8, 1, 6), 928 + F_MN( 76800000, P_PLL8, 1, 5), 929 + F_MN(128000000, P_PLL8, 1, 3), 930 + F_MN(160000000, P_PLL2, 1, 5), 931 + F_MN(200000000, P_PLL2, 1, 4), 932 + { } 933 + }; 934 + 935 + static struct clk_dyn_rcg vcap_src = { 936 + .ns_reg = 0x021c, 937 + .md_reg[0] = 0x01ec, 938 + .md_reg[1] = 0x0218, 939 + .mn[0] = { 940 + .mnctr_en_bit = 8, 941 + .mnctr_reset_bit = 23, 942 + .mnctr_mode_shift = 9, 943 + .n_val_shift = 18, 944 + .m_val_shift = 4, 945 + .width = 4, 946 + }, 947 + .mn[1] = { 948 + .mnctr_en_bit = 5, 949 + .mnctr_reset_bit = 22, 950 + .mnctr_mode_shift = 6, 951 + .n_val_shift = 14, 952 + .m_val_shift = 4, 953 + .width = 4, 954 + }, 955 + .s[0] = { 956 + .src_sel_shift = 3, 957 + .parent_map = mmcc_pxo_pll8_pll2_map, 958 + }, 959 + .s[1] = { 960 + .src_sel_shift = 0, 961 + .parent_map = mmcc_pxo_pll8_pll2_map, 962 + }, 963 + .mux_sel_bit = 11, 964 + .freq_tbl = clk_tbl_vcap, 965 + .clkr = { 966 + .enable_reg = 0x0178, 967 + .enable_mask = BIT(2), 968 + .hw.init = &(struct clk_init_data){ 969 + .name = "vcap_src", 970 + .parent_names = mmcc_pxo_pll8_pll2, 971 + .num_parents = 3, 972 + .ops = &clk_dyn_rcg_ops, 973 + }, 974 + }, 975 + }; 976 + 977 + static struct clk_branch vcap_clk = { 978 + .halt_reg = 0x0240, 979 + .halt_bit = 15, 980 + .clkr = { 981 + .enable_reg = 0x0178, 982 + .enable_mask = BIT(0), 983 + .hw.init = &(struct clk_init_data){ 984 + .name = "vcap_clk", 985 + .parent_names = (const char *[]){ "vcap_src" }, 986 + .num_parents = 1, 987 + .ops = &clk_branch_ops, 988 + .flags = CLK_SET_RATE_PARENT, 989 + }, 990 + }, 991 + }; 992 + 993 + static struct clk_branch vcap_npl_clk = { 994 + .halt_reg = 0x0240, 995 + .halt_bit = 25, 996 + .clkr = { 997 + .enable_reg = 0x0178, 998 + .enable_mask = BIT(13), 999 + .hw.init = &(struct clk_init_data){ 1000 + .name = "vcap_npl_clk", 1001 + .parent_names = (const char *[]){ "vcap_src" }, 990 1002 .num_parents = 1, 991 1003 .ops = &clk_branch_ops, 992 1004 .flags = CLK_SET_RATE_PARENT, ··· 1481 1323 }, 1482 1324 }; 1483 1325 1326 + static struct clk_branch rgb_tv_clk = { 1327 + .halt_reg = 0x0240, 1328 + .halt_bit = 27, 1329 + .clkr = { 1330 + .enable_reg = 0x0124, 1331 + .enable_mask = BIT(14), 1332 + .hw.init = &(struct clk_init_data){ 1333 + .parent_names = tv_src_name, 1334 + .num_parents = 1, 1335 + .name = "rgb_tv_clk", 1336 + .ops = &clk_branch_ops, 1337 + .flags = CLK_SET_RATE_PARENT, 1338 + }, 1339 + }, 1340 + }; 1341 + 1342 + static struct clk_branch npl_tv_clk = { 1343 + .halt_reg = 0x0240, 1344 + .halt_bit = 26, 1345 + .clkr = { 1346 + .enable_reg = 0x0124, 1347 + .enable_mask = BIT(16), 1348 + .hw.init = &(struct clk_init_data){ 1349 + .parent_names = tv_src_name, 1350 + .num_parents = 1, 1351 + .name = "npl_tv_clk", 1352 + .ops = &clk_branch_ops, 1353 + .flags = CLK_SET_RATE_PARENT, 1354 + }, 1355 + }, 1356 + }; 1357 + 1484 1358 static struct clk_branch hdmi_app_clk = { 1485 1359 .halt_reg = 0x01cc, 1486 1360 .halt_bit = 25, ··· 1888 1698 }, 1889 1699 }; 1890 1700 1701 + static struct clk_branch vcap_axi_clk = { 1702 + .halt_reg = 0x0240, 1703 + .halt_bit = 20, 1704 + .hwcg_reg = 0x0244, 1705 + .hwcg_bit = 11, 1706 + .clkr = { 1707 + .enable_reg = 0x0244, 1708 + .enable_mask = BIT(12), 1709 + .hw.init = &(struct clk_init_data){ 1710 + .name = "vcap_axi_clk", 1711 + .ops = &clk_branch_ops, 1712 + .flags = CLK_IS_ROOT, 1713 + }, 1714 + }, 1715 + }; 1716 + 1891 1717 static struct clk_branch vpe_axi_clk = { 1892 1718 .hwcg_reg = 0x0020, 1893 1719 .hwcg_bit = 27, ··· 2206 2000 }, 2207 2001 }; 2208 2002 2003 + static struct clk_branch vcap_ahb_clk = { 2004 + .halt_reg = 0x0240, 2005 + .halt_bit = 23, 2006 + .clkr = { 2007 + .enable_reg = 0x0248, 2008 + .enable_mask = BIT(1), 2009 + .hw.init = &(struct clk_init_data){ 2010 + .name = "vcap_ahb_clk", 2011 + .ops = &clk_branch_ops, 2012 + .flags = CLK_IS_ROOT, 2013 + }, 2014 + }, 2015 + }; 2016 + 2209 2017 static struct clk_branch vcodec_ahb_clk = { 2210 2018 .hwcg_reg = 0x0038, 2211 2019 .hwcg_bit = 26, ··· 2432 2212 [CSI_RDI2_RESET] = { 0x0214 }, 2433 2213 }; 2434 2214 2215 + static struct clk_regmap *mmcc_apq8064_clks[] = { 2216 + [AMP_AHB_CLK] = &amp_ahb_clk.clkr, 2217 + [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr, 2218 + [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr, 2219 + [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr, 2220 + [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr, 2221 + [VPE_AHB_CLK] = &vpe_ahb_clk.clkr, 2222 + [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr, 2223 + [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr, 2224 + [VFE_AHB_CLK] = &vfe_ahb_clk.clkr, 2225 + [ROT_AHB_CLK] = &rot_ahb_clk.clkr, 2226 + [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr, 2227 + [MDP_AHB_CLK] = &mdp_ahb_clk.clkr, 2228 + [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr, 2229 + [CSI_AHB_CLK] = &csi_ahb_clk.clkr, 2230 + [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr, 2231 + [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr, 2232 + [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr, 2233 + [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr, 2234 + [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr, 2235 + [GMEM_AXI_CLK] = &gmem_axi_clk.clkr, 2236 + [MDP_AXI_CLK] = &mdp_axi_clk.clkr, 2237 + [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr, 2238 + [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr, 2239 + [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr, 2240 + [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr, 2241 + [VFE_AXI_CLK] = &vfe_axi_clk.clkr, 2242 + [VPE_AXI_CLK] = &vpe_axi_clk.clkr, 2243 + [ROT_AXI_CLK] = &rot_axi_clk.clkr, 2244 + [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr, 2245 + [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr, 2246 + [CSI0_SRC] = &csi0_src.clkr, 2247 + [CSI0_CLK] = &csi0_clk.clkr, 2248 + [CSI0_PHY_CLK] = &csi0_phy_clk.clkr, 2249 + [CSI1_SRC] = &csi1_src.clkr, 2250 + [CSI1_CLK] = &csi1_clk.clkr, 2251 + [CSI1_PHY_CLK] = &csi1_phy_clk.clkr, 2252 + [CSI2_SRC] = &csi2_src.clkr, 2253 + [CSI2_CLK] = &csi2_clk.clkr, 2254 + [CSI2_PHY_CLK] = &csi2_phy_clk.clkr, 2255 + [CSI_PIX_CLK] = &csi_pix_clk.clkr, 2256 + [CSI_RDI_CLK] = &csi_rdi_clk.clkr, 2257 + [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr, 2258 + [HDMI_APP_CLK] = &hdmi_app_clk.clkr, 2259 + [CSI_PIX1_CLK] = &csi_pix1_clk.clkr, 2260 + [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr, 2261 + [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr, 2262 + [GFX3D_SRC] = &gfx3d_src.clkr, 2263 + [GFX3D_CLK] = &gfx3d_clk.clkr, 2264 + [IJPEG_SRC] = &ijpeg_src.clkr, 2265 + [IJPEG_CLK] = &ijpeg_clk.clkr, 2266 + [JPEGD_SRC] = &jpegd_src.clkr, 2267 + [JPEGD_CLK] = &jpegd_clk.clkr, 2268 + [MDP_SRC] = &mdp_src.clkr, 2269 + [MDP_CLK] = &mdp_clk.clkr, 2270 + [MDP_LUT_CLK] = &mdp_lut_clk.clkr, 2271 + [ROT_SRC] = &rot_src.clkr, 2272 + [ROT_CLK] = &rot_clk.clkr, 2273 + [TV_DAC_CLK] = &tv_dac_clk.clkr, 2274 + [HDMI_TV_CLK] = &hdmi_tv_clk.clkr, 2275 + [MDP_TV_CLK] = &mdp_tv_clk.clkr, 2276 + [TV_SRC] = &tv_src.clkr, 2277 + [VCODEC_SRC] = &vcodec_src.clkr, 2278 + [VCODEC_CLK] = &vcodec_clk.clkr, 2279 + [VFE_SRC] = &vfe_src.clkr, 2280 + [VFE_CLK] = &vfe_clk.clkr, 2281 + [VFE_CSI_CLK] = &vfe_csi_clk.clkr, 2282 + [VPE_SRC] = &vpe_src.clkr, 2283 + [VPE_CLK] = &vpe_clk.clkr, 2284 + [CAMCLK0_SRC] = &camclk0_src.clkr, 2285 + [CAMCLK0_CLK] = &camclk0_clk.clkr, 2286 + [CAMCLK1_SRC] = &camclk1_src.clkr, 2287 + [CAMCLK1_CLK] = &camclk1_clk.clkr, 2288 + [CAMCLK2_SRC] = &camclk2_src.clkr, 2289 + [CAMCLK2_CLK] = &camclk2_clk.clkr, 2290 + [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr, 2291 + [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr, 2292 + [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr, 2293 + [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr, 2294 + [PLL2] = &pll2.clkr, 2295 + [RGB_TV_CLK] = &rgb_tv_clk.clkr, 2296 + [NPL_TV_CLK] = &npl_tv_clk.clkr, 2297 + [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr, 2298 + [VCAP_AXI_CLK] = &vcap_axi_clk.clkr, 2299 + [VCAP_SRC] = &vcap_src.clkr, 2300 + [VCAP_CLK] = &vcap_clk.clkr, 2301 + [VCAP_NPL_CLK] = &vcap_npl_clk.clkr, 2302 + [PLL15] = &pll15.clkr, 2303 + }; 2304 + 2305 + static const struct qcom_reset_map mmcc_apq8064_resets[] = { 2306 + [GFX3D_AXI_RESET] = { 0x0208, 17 }, 2307 + [VCAP_AXI_RESET] = { 0x0208, 16 }, 2308 + [VPE_AXI_RESET] = { 0x0208, 15 }, 2309 + [IJPEG_AXI_RESET] = { 0x0208, 14 }, 2310 + [MPD_AXI_RESET] = { 0x0208, 13 }, 2311 + [VFE_AXI_RESET] = { 0x0208, 9 }, 2312 + [SP_AXI_RESET] = { 0x0208, 8 }, 2313 + [VCODEC_AXI_RESET] = { 0x0208, 7 }, 2314 + [ROT_AXI_RESET] = { 0x0208, 6 }, 2315 + [VCODEC_AXI_A_RESET] = { 0x0208, 5 }, 2316 + [VCODEC_AXI_B_RESET] = { 0x0208, 4 }, 2317 + [FAB_S3_AXI_RESET] = { 0x0208, 3 }, 2318 + [FAB_S2_AXI_RESET] = { 0x0208, 2 }, 2319 + [FAB_S1_AXI_RESET] = { 0x0208, 1 }, 2320 + [FAB_S0_AXI_RESET] = { 0x0208 }, 2321 + [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 }, 2322 + [SMMU_VPE_AHB_RESET] = { 0x020c, 30 }, 2323 + [SMMU_VFE_AHB_RESET] = { 0x020c, 29 }, 2324 + [SMMU_ROT_AHB_RESET] = { 0x020c, 28 }, 2325 + [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 }, 2326 + [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 }, 2327 + [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 }, 2328 + [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 }, 2329 + [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 }, 2330 + [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 }, 2331 + [APU_AHB_RESET] = { 0x020c, 18 }, 2332 + [CSI_AHB_RESET] = { 0x020c, 17 }, 2333 + [TV_ENC_AHB_RESET] = { 0x020c, 15 }, 2334 + [VPE_AHB_RESET] = { 0x020c, 14 }, 2335 + [FABRIC_AHB_RESET] = { 0x020c, 13 }, 2336 + [GFX3D_AHB_RESET] = { 0x020c, 10 }, 2337 + [HDMI_AHB_RESET] = { 0x020c, 9 }, 2338 + [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 }, 2339 + [IJPEG_AHB_RESET] = { 0x020c, 7 }, 2340 + [DSI_M_AHB_RESET] = { 0x020c, 6 }, 2341 + [DSI_S_AHB_RESET] = { 0x020c, 5 }, 2342 + [JPEGD_AHB_RESET] = { 0x020c, 4 }, 2343 + [MDP_AHB_RESET] = { 0x020c, 3 }, 2344 + [ROT_AHB_RESET] = { 0x020c, 2 }, 2345 + [VCODEC_AHB_RESET] = { 0x020c, 1 }, 2346 + [VFE_AHB_RESET] = { 0x020c, 0 }, 2347 + [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 }, 2348 + [VCAP_AHB_RESET] = { 0x0200, 2 }, 2349 + [DSI2_M_AHB_RESET] = { 0x0200, 1 }, 2350 + [DSI2_S_AHB_RESET] = { 0x0200, 0 }, 2351 + [CSIPHY2_RESET] = { 0x0210, 31 }, 2352 + [CSI_PIX1_RESET] = { 0x0210, 30 }, 2353 + [CSIPHY0_RESET] = { 0x0210, 29 }, 2354 + [CSIPHY1_RESET] = { 0x0210, 28 }, 2355 + [CSI_RDI_RESET] = { 0x0210, 27 }, 2356 + [CSI_PIX_RESET] = { 0x0210, 26 }, 2357 + [DSI2_RESET] = { 0x0210, 25 }, 2358 + [VFE_CSI_RESET] = { 0x0210, 24 }, 2359 + [MDP_RESET] = { 0x0210, 21 }, 2360 + [AMP_RESET] = { 0x0210, 20 }, 2361 + [JPEGD_RESET] = { 0x0210, 19 }, 2362 + [CSI1_RESET] = { 0x0210, 18 }, 2363 + [VPE_RESET] = { 0x0210, 17 }, 2364 + [MMSS_FABRIC_RESET] = { 0x0210, 16 }, 2365 + [VFE_RESET] = { 0x0210, 15 }, 2366 + [GFX3D_RESET] = { 0x0210, 12 }, 2367 + [HDMI_RESET] = { 0x0210, 11 }, 2368 + [MMSS_IMEM_RESET] = { 0x0210, 10 }, 2369 + [IJPEG_RESET] = { 0x0210, 9 }, 2370 + [CSI0_RESET] = { 0x0210, 8 }, 2371 + [DSI_RESET] = { 0x0210, 7 }, 2372 + [VCODEC_RESET] = { 0x0210, 6 }, 2373 + [MDP_TV_RESET] = { 0x0210, 4 }, 2374 + [MDP_VSYNC_RESET] = { 0x0210, 3 }, 2375 + [ROT_RESET] = { 0x0210, 2 }, 2376 + [TV_HDMI_RESET] = { 0x0210, 1 }, 2377 + [VCAP_NPL_RESET] = { 0x0214, 4 }, 2378 + [VCAP_RESET] = { 0x0214, 3 }, 2379 + [CSI2_RESET] = { 0x0214, 2 }, 2380 + [CSI_RDI1_RESET] = { 0x0214, 1 }, 2381 + [CSI_RDI2_RESET] = { 0x0214 }, 2382 + }; 2383 + 2435 2384 static const struct regmap_config mmcc_msm8960_regmap_config = { 2436 2385 .reg_bits = 32, 2437 2386 .reg_stride = 4, 2438 2387 .val_bits = 32, 2439 2388 .max_register = 0x334, 2389 + .fast_io = true, 2390 + }; 2391 + 2392 + static const struct regmap_config mmcc_apq8064_regmap_config = { 2393 + .reg_bits = 32, 2394 + .reg_stride = 4, 2395 + .val_bits = 32, 2396 + .max_register = 0x350, 2440 2397 .fast_io = true, 2441 2398 }; 2442 2399 ··· 2625 2228 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets), 2626 2229 }; 2627 2230 2231 + static const struct qcom_cc_desc mmcc_apq8064_desc = { 2232 + .config = &mmcc_apq8064_regmap_config, 2233 + .clks = mmcc_apq8064_clks, 2234 + .num_clks = ARRAY_SIZE(mmcc_apq8064_clks), 2235 + .resets = mmcc_apq8064_resets, 2236 + .num_resets = ARRAY_SIZE(mmcc_apq8064_resets), 2237 + }; 2238 + 2628 2239 static const struct of_device_id mmcc_msm8960_match_table[] = { 2629 - { .compatible = "qcom,mmcc-msm8960" }, 2240 + { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc }, 2241 + { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc }, 2630 2242 { } 2631 2243 }; 2632 2244 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table); 2633 2245 2634 2246 static int mmcc_msm8960_probe(struct platform_device *pdev) 2635 2247 { 2636 - return qcom_cc_probe(pdev, &mmcc_msm8960_desc); 2248 + const struct of_device_id *match; 2249 + struct regmap *regmap; 2250 + bool is_8064; 2251 + struct device *dev = &pdev->dev; 2252 + 2253 + match = of_match_device(mmcc_msm8960_match_table, dev); 2254 + if (!match) 2255 + return -EINVAL; 2256 + 2257 + is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064"); 2258 + if (is_8064) { 2259 + gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064; 2260 + gfx3d_src.clkr.hw.init = &gfx3d_8064_init; 2261 + gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map; 2262 + gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map; 2263 + } 2264 + 2265 + regmap = qcom_cc_map(pdev, match->data); 2266 + if (IS_ERR(regmap)) 2267 + return PTR_ERR(regmap); 2268 + 2269 + clk_pll_configure_sr(&pll15, regmap, &pll15_config, false); 2270 + 2271 + return qcom_cc_really_probe(pdev, match->data, regmap); 2637 2272 } 2638 2273 2639 2274 static int mmcc_msm8960_remove(struct platform_device *pdev)
+8
include/dt-bindings/clock/qcom,mmcc-msm8960.h
··· 133 133 #define CSIPHY0_TIMER_CLK 116 134 134 #define PLL1 117 135 135 #define PLL2 118 136 + #define RGB_TV_CLK 119 137 + #define NPL_TV_CLK 120 138 + #define VCAP_AHB_CLK 121 139 + #define VCAP_AXI_CLK 122 140 + #define VCAP_SRC 123 141 + #define VCAP_CLK 124 142 + #define VCAP_NPL_CLK 125 143 + #define PLL15 126 136 144 137 145 #endif
+8
include/dt-bindings/reset/qcom,mmcc-msm8960.h
··· 89 89 #define CSI2_RESET 72 90 90 #define CSI_RDI1_RESET 73 91 91 #define CSI_RDI2_RESET 74 92 + #define GFX3D_AXI_RESET 75 93 + #define VCAP_AXI_RESET 76 94 + #define SMMU_VCAP_AHB_RESET 77 95 + #define VCAP_AHB_RESET 78 96 + #define CSI_RDI_RESET 79 97 + #define CSI_PIX_RESET 80 98 + #define VCAP_NPL_RESET 81 99 + #define VCAP_RESET 82 92 100 93 101 #endif