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

clk: qcom: mmcc-8960: Add DSI related clocks

Add rcg and branch clk structs for DSI1 and DSI2 blocks found in MSM8960
and APQ8064. Each DSI instance has 4 pairs of rcg and branch clocks.
Populate arrays mmcc_msm8960_clks and mmcc_apq8064_clks with these clocks.

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

authored by

Archit Taneja and committed by
Stephen Boyd
5532cfb5 d8aa2bee

+404
+404
drivers/clk/qcom/mmcc-msm8960.c
··· 41 41 P_PLL3, 42 42 P_PLL15, 43 43 P_HDMI_PLL, 44 + P_DSI1_PLL_DSICLK, 45 + P_DSI2_PLL_DSICLK, 46 + P_DSI1_PLL_BYTECLK, 47 + P_DSI2_PLL_BYTECLK, 44 48 }; 45 49 46 50 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n } ··· 87 83 "pll8_vote", 88 84 "pll2", 89 85 "pll3", 86 + }; 87 + 88 + static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = { 89 + { P_PXO, 0 }, 90 + { P_DSI2_PLL_DSICLK, 1 }, 91 + { P_DSI1_PLL_DSICLK, 3 }, 92 + }; 93 + 94 + static const char * const mmcc_pxo_dsi2_dsi1[] = { 95 + "pxo", 96 + "dsi2pll", 97 + "dsi1pll", 98 + }; 99 + 100 + static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = { 101 + { P_PXO, 0 }, 102 + { P_DSI1_PLL_BYTECLK, 1 }, 103 + { P_DSI2_PLL_BYTECLK, 2 }, 104 + }; 105 + 106 + static const char * const mmcc_pxo_dsi1_dsi2_byte[] = { 107 + "pxo", 108 + "dsi1pllbyte", 109 + "dsi2pllbyte", 90 110 }; 91 111 92 112 static struct clk_pll pll2 = { ··· 2070 2042 }, 2071 2043 }; 2072 2044 2045 + static struct clk_rcg dsi1_src = { 2046 + .ns_reg = 0x0054, 2047 + .md_reg = 0x0050, 2048 + .mn = { 2049 + .mnctr_en_bit = 5, 2050 + .mnctr_reset_bit = 7, 2051 + .mnctr_mode_shift = 6, 2052 + .n_val_shift = 24, 2053 + .m_val_shift = 8, 2054 + .width = 8, 2055 + }, 2056 + .p = { 2057 + .pre_div_shift = 14, 2058 + .pre_div_width = 2, 2059 + }, 2060 + .s = { 2061 + .src_sel_shift = 0, 2062 + .parent_map = mmcc_pxo_dsi2_dsi1_map, 2063 + }, 2064 + .clkr = { 2065 + .enable_reg = 0x004c, 2066 + .enable_mask = BIT(2), 2067 + .hw.init = &(struct clk_init_data){ 2068 + .name = "dsi1_src", 2069 + .parent_names = mmcc_pxo_dsi2_dsi1, 2070 + .num_parents = 3, 2071 + .ops = &clk_rcg_bypass2_ops, 2072 + .flags = CLK_SET_RATE_PARENT, 2073 + }, 2074 + }, 2075 + }; 2076 + 2077 + static struct clk_branch dsi1_clk = { 2078 + .halt_reg = 0x01d0, 2079 + .halt_bit = 1, 2080 + .clkr = { 2081 + .enable_reg = 0x004c, 2082 + .enable_mask = BIT(0), 2083 + .hw.init = &(struct clk_init_data){ 2084 + .name = "dsi1_clk", 2085 + .parent_names = (const char *[]){ "dsi1_src" }, 2086 + .num_parents = 1, 2087 + .ops = &clk_branch_ops, 2088 + .flags = CLK_SET_RATE_PARENT, 2089 + }, 2090 + }, 2091 + }; 2092 + 2093 + static struct clk_rcg dsi2_src = { 2094 + .ns_reg = 0x012c, 2095 + .md_reg = 0x00a8, 2096 + .mn = { 2097 + .mnctr_en_bit = 5, 2098 + .mnctr_reset_bit = 7, 2099 + .mnctr_mode_shift = 6, 2100 + .n_val_shift = 24, 2101 + .m_val_shift = 8, 2102 + .width = 8, 2103 + }, 2104 + .p = { 2105 + .pre_div_shift = 14, 2106 + .pre_div_width = 2, 2107 + }, 2108 + .s = { 2109 + .src_sel_shift = 0, 2110 + .parent_map = mmcc_pxo_dsi2_dsi1_map, 2111 + }, 2112 + .clkr = { 2113 + .enable_reg = 0x003c, 2114 + .enable_mask = BIT(2), 2115 + .hw.init = &(struct clk_init_data){ 2116 + .name = "dsi2_src", 2117 + .parent_names = mmcc_pxo_dsi2_dsi1, 2118 + .num_parents = 3, 2119 + .ops = &clk_rcg_bypass2_ops, 2120 + .flags = CLK_SET_RATE_PARENT, 2121 + }, 2122 + }, 2123 + }; 2124 + 2125 + static struct clk_branch dsi2_clk = { 2126 + .halt_reg = 0x01d0, 2127 + .halt_bit = 2, 2128 + .clkr = { 2129 + .enable_reg = 0x003c, 2130 + .enable_mask = BIT(0), 2131 + .hw.init = &(struct clk_init_data){ 2132 + .name = "dsi2_clk", 2133 + .parent_names = (const char *[]){ "dsi2_src" }, 2134 + .num_parents = 1, 2135 + .ops = &clk_branch_ops, 2136 + .flags = CLK_SET_RATE_PARENT, 2137 + }, 2138 + }, 2139 + }; 2140 + 2141 + static struct clk_rcg dsi1_byte_src = { 2142 + .ns_reg = 0x00b0, 2143 + .p = { 2144 + .pre_div_shift = 12, 2145 + .pre_div_width = 4, 2146 + }, 2147 + .s = { 2148 + .src_sel_shift = 0, 2149 + .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2150 + }, 2151 + .clkr = { 2152 + .enable_reg = 0x0090, 2153 + .enable_mask = BIT(2), 2154 + .hw.init = &(struct clk_init_data){ 2155 + .name = "dsi1_byte_src", 2156 + .parent_names = mmcc_pxo_dsi1_dsi2_byte, 2157 + .num_parents = 3, 2158 + .ops = &clk_rcg_bypass2_ops, 2159 + .flags = CLK_SET_RATE_PARENT, 2160 + }, 2161 + }, 2162 + }; 2163 + 2164 + static struct clk_branch dsi1_byte_clk = { 2165 + .halt_reg = 0x01cc, 2166 + .halt_bit = 21, 2167 + .clkr = { 2168 + .enable_reg = 0x0090, 2169 + .enable_mask = BIT(0), 2170 + .hw.init = &(struct clk_init_data){ 2171 + .name = "dsi1_byte_clk", 2172 + .parent_names = (const char *[]){ "dsi1_byte_src" }, 2173 + .num_parents = 1, 2174 + .ops = &clk_branch_ops, 2175 + .flags = CLK_SET_RATE_PARENT, 2176 + }, 2177 + }, 2178 + }; 2179 + 2180 + static struct clk_rcg dsi2_byte_src = { 2181 + .ns_reg = 0x012c, 2182 + .p = { 2183 + .pre_div_shift = 12, 2184 + .pre_div_width = 4, 2185 + }, 2186 + .s = { 2187 + .src_sel_shift = 0, 2188 + .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2189 + }, 2190 + .clkr = { 2191 + .enable_reg = 0x0130, 2192 + .enable_mask = BIT(2), 2193 + .hw.init = &(struct clk_init_data){ 2194 + .name = "dsi2_byte_src", 2195 + .parent_names = mmcc_pxo_dsi1_dsi2_byte, 2196 + .num_parents = 3, 2197 + .ops = &clk_rcg_bypass2_ops, 2198 + .flags = CLK_SET_RATE_PARENT, 2199 + }, 2200 + }, 2201 + }; 2202 + 2203 + static struct clk_branch dsi2_byte_clk = { 2204 + .halt_reg = 0x01cc, 2205 + .halt_bit = 20, 2206 + .clkr = { 2207 + .enable_reg = 0x00b4, 2208 + .enable_mask = BIT(0), 2209 + .hw.init = &(struct clk_init_data){ 2210 + .name = "dsi2_byte_clk", 2211 + .parent_names = (const char *[]){ "dsi2_byte_src" }, 2212 + .num_parents = 1, 2213 + .ops = &clk_branch_ops, 2214 + .flags = CLK_SET_RATE_PARENT, 2215 + }, 2216 + }, 2217 + }; 2218 + 2219 + static struct clk_rcg dsi1_esc_src = { 2220 + .ns_reg = 0x0011c, 2221 + .p = { 2222 + .pre_div_shift = 12, 2223 + .pre_div_width = 4, 2224 + }, 2225 + .s = { 2226 + .src_sel_shift = 0, 2227 + .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2228 + }, 2229 + .clkr = { 2230 + .enable_reg = 0x00cc, 2231 + .enable_mask = BIT(2), 2232 + .hw.init = &(struct clk_init_data){ 2233 + .name = "dsi1_esc_src", 2234 + .parent_names = mmcc_pxo_dsi1_dsi2_byte, 2235 + .num_parents = 3, 2236 + .ops = &clk_rcg_esc_ops, 2237 + }, 2238 + }, 2239 + }; 2240 + 2241 + static struct clk_branch dsi1_esc_clk = { 2242 + .halt_reg = 0x01e8, 2243 + .halt_bit = 1, 2244 + .clkr = { 2245 + .enable_reg = 0x00cc, 2246 + .enable_mask = BIT(0), 2247 + .hw.init = &(struct clk_init_data){ 2248 + .name = "dsi1_esc_clk", 2249 + .parent_names = (const char *[]){ "dsi1_esc_src" }, 2250 + .num_parents = 1, 2251 + .ops = &clk_branch_ops, 2252 + .flags = CLK_SET_RATE_PARENT, 2253 + }, 2254 + }, 2255 + }; 2256 + 2257 + static struct clk_rcg dsi2_esc_src = { 2258 + .ns_reg = 0x0150, 2259 + .p = { 2260 + .pre_div_shift = 12, 2261 + .pre_div_width = 4, 2262 + }, 2263 + .s = { 2264 + .src_sel_shift = 0, 2265 + .parent_map = mmcc_pxo_dsi1_dsi2_byte_map, 2266 + }, 2267 + .clkr = { 2268 + .enable_reg = 0x013c, 2269 + .enable_mask = BIT(2), 2270 + .hw.init = &(struct clk_init_data){ 2271 + .name = "dsi2_esc_src", 2272 + .parent_names = mmcc_pxo_dsi1_dsi2_byte, 2273 + .num_parents = 3, 2274 + .ops = &clk_rcg_esc_ops, 2275 + }, 2276 + }, 2277 + }; 2278 + 2279 + static struct clk_branch dsi2_esc_clk = { 2280 + .halt_reg = 0x01e8, 2281 + .halt_bit = 3, 2282 + .clkr = { 2283 + .enable_reg = 0x013c, 2284 + .enable_mask = BIT(0), 2285 + .hw.init = &(struct clk_init_data){ 2286 + .name = "dsi2_esc_clk", 2287 + .parent_names = (const char *[]){ "dsi2_esc_src" }, 2288 + .num_parents = 1, 2289 + .ops = &clk_branch_ops, 2290 + .flags = CLK_SET_RATE_PARENT, 2291 + }, 2292 + }, 2293 + }; 2294 + 2295 + static struct clk_rcg dsi1_pixel_src = { 2296 + .ns_reg = 0x0138, 2297 + .md_reg = 0x0134, 2298 + .mn = { 2299 + .mnctr_en_bit = 5, 2300 + .mnctr_reset_bit = 7, 2301 + .mnctr_mode_shift = 6, 2302 + .n_val_shift = 16, 2303 + .m_val_shift = 8, 2304 + .width = 8, 2305 + }, 2306 + .p = { 2307 + .pre_div_shift = 12, 2308 + .pre_div_width = 4, 2309 + }, 2310 + .s = { 2311 + .src_sel_shift = 0, 2312 + .parent_map = mmcc_pxo_dsi2_dsi1_map, 2313 + }, 2314 + .clkr = { 2315 + .enable_reg = 0x0130, 2316 + .enable_mask = BIT(2), 2317 + .hw.init = &(struct clk_init_data){ 2318 + .name = "dsi1_pixel_src", 2319 + .parent_names = mmcc_pxo_dsi2_dsi1, 2320 + .num_parents = 3, 2321 + .ops = &clk_rcg_pixel_ops, 2322 + }, 2323 + }, 2324 + }; 2325 + 2326 + static struct clk_branch dsi1_pixel_clk = { 2327 + .halt_reg = 0x01d0, 2328 + .halt_bit = 6, 2329 + .clkr = { 2330 + .enable_reg = 0x0130, 2331 + .enable_mask = BIT(0), 2332 + .hw.init = &(struct clk_init_data){ 2333 + .name = "mdp_pclk1_clk", 2334 + .parent_names = (const char *[]){ "dsi1_pixel_src" }, 2335 + .num_parents = 1, 2336 + .ops = &clk_branch_ops, 2337 + .flags = CLK_SET_RATE_PARENT, 2338 + }, 2339 + }, 2340 + }; 2341 + 2342 + static struct clk_rcg dsi2_pixel_src = { 2343 + .ns_reg = 0x00e4, 2344 + .md_reg = 0x00b8, 2345 + .mn = { 2346 + .mnctr_en_bit = 5, 2347 + .mnctr_reset_bit = 7, 2348 + .mnctr_mode_shift = 6, 2349 + .n_val_shift = 16, 2350 + .m_val_shift = 8, 2351 + .width = 8, 2352 + }, 2353 + .p = { 2354 + .pre_div_shift = 12, 2355 + .pre_div_width = 4, 2356 + }, 2357 + .s = { 2358 + .src_sel_shift = 0, 2359 + .parent_map = mmcc_pxo_dsi2_dsi1_map, 2360 + }, 2361 + .clkr = { 2362 + .enable_reg = 0x0094, 2363 + .enable_mask = BIT(2), 2364 + .hw.init = &(struct clk_init_data){ 2365 + .name = "dsi2_pixel_src", 2366 + .parent_names = mmcc_pxo_dsi2_dsi1, 2367 + .num_parents = 3, 2368 + .ops = &clk_rcg_pixel_ops, 2369 + }, 2370 + }, 2371 + }; 2372 + 2373 + static struct clk_branch dsi2_pixel_clk = { 2374 + .halt_reg = 0x01d0, 2375 + .halt_bit = 19, 2376 + .clkr = { 2377 + .enable_reg = 0x0094, 2378 + .enable_mask = BIT(0), 2379 + .hw.init = &(struct clk_init_data){ 2380 + .name = "mdp_pclk2_clk", 2381 + .parent_names = (const char *[]){ "dsi2_pixel_src" }, 2382 + .num_parents = 1, 2383 + .ops = &clk_branch_ops, 2384 + .flags = CLK_SET_RATE_PARENT, 2385 + }, 2386 + }, 2387 + }; 2388 + 2073 2389 static struct clk_branch gfx2d0_ahb_clk = { 2074 2390 .hwcg_reg = 0x0038, 2075 2391 .hwcg_bit = 28, ··· 2697 2325 [CSI2_SRC] = &csi2_src.clkr, 2698 2326 [CSI2_CLK] = &csi2_clk.clkr, 2699 2327 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr, 2328 + [DSI_SRC] = &dsi1_src.clkr, 2329 + [DSI_CLK] = &dsi1_clk.clkr, 2700 2330 [CSI_PIX_CLK] = &csi_pix_clk.clkr, 2701 2331 [CSI_RDI_CLK] = &csi_rdi_clk.clkr, 2702 2332 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr, ··· 2719 2345 [MDP_SRC] = &mdp_src.clkr, 2720 2346 [MDP_CLK] = &mdp_clk.clkr, 2721 2347 [MDP_LUT_CLK] = &mdp_lut_clk.clkr, 2348 + [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr, 2349 + [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr, 2350 + [DSI2_SRC] = &dsi2_src.clkr, 2351 + [DSI2_CLK] = &dsi2_clk.clkr, 2352 + [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr, 2353 + [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr, 2354 + [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr, 2355 + [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr, 2356 + [DSI1_ESC_SRC] = &dsi1_esc_src.clkr, 2357 + [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr, 2358 + [DSI2_ESC_SRC] = &dsi2_esc_src.clkr, 2359 + [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr, 2722 2360 [ROT_SRC] = &rot_src.clkr, 2723 2361 [ROT_CLK] = &rot_clk.clkr, 2724 2362 [TV_ENC_CLK] = &tv_enc_clk.clkr, ··· 2745 2359 [VFE_CSI_CLK] = &vfe_csi_clk.clkr, 2746 2360 [VPE_SRC] = &vpe_src.clkr, 2747 2361 [VPE_CLK] = &vpe_clk.clkr, 2362 + [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr, 2363 + [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr, 2748 2364 [CAMCLK0_SRC] = &camclk0_src.clkr, 2749 2365 [CAMCLK0_CLK] = &camclk0_clk.clkr, 2750 2366 [CAMCLK1_SRC] = &camclk1_src.clkr, ··· 2878 2490 [CSI2_SRC] = &csi2_src.clkr, 2879 2491 [CSI2_CLK] = &csi2_clk.clkr, 2880 2492 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr, 2493 + [DSI_SRC] = &dsi1_src.clkr, 2494 + [DSI_CLK] = &dsi1_clk.clkr, 2881 2495 [CSI_PIX_CLK] = &csi_pix_clk.clkr, 2882 2496 [CSI_RDI_CLK] = &csi_rdi_clk.clkr, 2883 2497 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr, ··· 2896 2506 [MDP_SRC] = &mdp_src.clkr, 2897 2507 [MDP_CLK] = &mdp_clk.clkr, 2898 2508 [MDP_LUT_CLK] = &mdp_lut_clk.clkr, 2509 + [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr, 2510 + [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr, 2511 + [DSI2_SRC] = &dsi2_src.clkr, 2512 + [DSI2_CLK] = &dsi2_clk.clkr, 2513 + [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr, 2514 + [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr, 2515 + [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr, 2516 + [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr, 2517 + [DSI1_ESC_SRC] = &dsi1_esc_src.clkr, 2518 + [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr, 2519 + [DSI2_ESC_SRC] = &dsi2_esc_src.clkr, 2520 + [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr, 2899 2521 [ROT_SRC] = &rot_src.clkr, 2900 2522 [ROT_CLK] = &rot_clk.clkr, 2901 2523 [TV_DAC_CLK] = &tv_dac_clk.clkr, ··· 2921 2519 [VFE_CSI_CLK] = &vfe_csi_clk.clkr, 2922 2520 [VPE_SRC] = &vpe_src.clkr, 2923 2521 [VPE_CLK] = &vpe_clk.clkr, 2522 + [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr, 2523 + [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr, 2924 2524 [CAMCLK0_SRC] = &camclk0_src.clkr, 2925 2525 [CAMCLK0_CLK] = &camclk0_clk.clkr, 2926 2526 [CAMCLK1_SRC] = &camclk1_src.clkr,