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

clk: qcom: Add MSM8226 Multimedia Clock Controller support

Modify the existing MSM8974 multimedia clock controller driver to
support the MMCC found on MSM8226 based devices. This should allow most
multimedia device drivers to probe and control their clocks.

Signed-off-by: Bartosz Dudziak <bartosz.dudziak@snejp.pl>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220207185411.19118-3-bartosz.dudziak@snejp.pl

authored by

Bartosz Dudziak and committed by
Bjorn Andersson
e6db8c8b ef36263a

+201 -5
+201 -5
drivers/clk/qcom/mmcc-msm8974.c
··· 257 257 }, 258 258 }; 259 259 260 + static struct freq_tbl ftbl_mmss_axi_clk_msm8226[] = { 261 + F(19200000, P_XO, 1, 0, 0), 262 + F(37500000, P_GPLL0, 16, 0, 0), 263 + F(50000000, P_GPLL0, 12, 0, 0), 264 + F(75000000, P_GPLL0, 8, 0, 0), 265 + F(100000000, P_GPLL0, 6, 0, 0), 266 + F(150000000, P_GPLL0, 4, 0, 0), 267 + F(200000000, P_MMPLL0, 4, 0, 0), 268 + F(266666666, P_MMPLL0, 3, 0, 0), 269 + { } 270 + }; 271 + 260 272 static struct freq_tbl ftbl_mmss_axi_clk[] = { 261 273 F( 19200000, P_XO, 1, 0, 0), 262 274 F( 37500000, P_GPLL0, 16, 0, 0), ··· 376 364 }, 377 365 }; 378 366 367 + static struct freq_tbl ftbl_camss_vfe_vfe0_clk_msm8226[] = { 368 + F(37500000, P_GPLL0, 16, 0, 0), 369 + F(50000000, P_GPLL0, 12, 0, 0), 370 + F(60000000, P_GPLL0, 10, 0, 0), 371 + F(80000000, P_GPLL0, 7.5, 0, 0), 372 + F(100000000, P_GPLL0, 6, 0, 0), 373 + F(109090000, P_GPLL0, 5.5, 0, 0), 374 + F(133330000, P_GPLL0, 4.5, 0, 0), 375 + F(150000000, P_GPLL0, 4, 0, 0), 376 + F(200000000, P_GPLL0, 3, 0, 0), 377 + F(228570000, P_MMPLL0, 3.5, 0, 0), 378 + F(266670000, P_MMPLL0, 3, 0, 0), 379 + F(320000000, P_MMPLL0, 2.5, 0, 0), 380 + F(400000000, P_MMPLL0, 2, 0, 0), 381 + { } 382 + }; 383 + 379 384 static struct freq_tbl ftbl_camss_vfe_vfe0_1_clk[] = { 380 385 F(37500000, P_GPLL0, 16, 0, 0), 381 386 F(50000000, P_GPLL0, 12, 0, 0), ··· 434 405 .num_parents = 4, 435 406 .ops = &clk_rcg2_ops, 436 407 }, 408 + }; 409 + 410 + static struct freq_tbl ftbl_mdss_mdp_clk_msm8226[] = { 411 + F(37500000, P_GPLL0, 16, 0, 0), 412 + F(60000000, P_GPLL0, 10, 0, 0), 413 + F(75000000, P_GPLL0, 8, 0, 0), 414 + F(92310000, P_GPLL0, 6.5, 0, 0), 415 + F(100000000, P_GPLL0, 6, 0, 0), 416 + F(133330000, P_MMPLL0, 6, 0, 0), 417 + F(177780000, P_MMPLL0, 4.5, 0, 0), 418 + F(200000000, P_MMPLL0, 4, 0, 0), 419 + { } 437 420 }; 438 421 439 422 static struct freq_tbl ftbl_mdss_mdp_clk[] = { ··· 554 513 }, 555 514 }; 556 515 516 + static struct freq_tbl ftbl_venus0_vcodec0_clk_msm8226[] = { 517 + F(66700000, P_GPLL0, 9, 0, 0), 518 + F(100000000, P_GPLL0, 6, 0, 0), 519 + F(133330000, P_MMPLL0, 6, 0, 0), 520 + F(160000000, P_MMPLL0, 5, 0, 0), 521 + { } 522 + }; 523 + 557 524 static struct freq_tbl ftbl_venus0_vcodec0_clk[] = { 558 525 F(50000000, P_GPLL0, 12, 0, 0), 559 526 F(100000000, P_GPLL0, 6, 0, 0), ··· 640 591 .num_parents = 5, 641 592 .ops = &clk_rcg2_ops, 642 593 }, 594 + }; 595 + 596 + static struct freq_tbl ftbl_camss_mclk0_3_clk_msm8226[] = { 597 + F(19200000, P_XO, 1, 0, 0), 598 + F(24000000, P_GPLL0, 5, 1, 5), 599 + F(66670000, P_GPLL0, 9, 0, 0), 600 + { } 643 601 }; 644 602 645 603 static struct freq_tbl ftbl_camss_mclk0_3_clk[] = { ··· 759 703 .num_parents = 4, 760 704 .ops = &clk_rcg2_ops, 761 705 }, 706 + }; 707 + 708 + static struct freq_tbl ftbl_camss_vfe_cpp_clk_msm8226[] = { 709 + F(133330000, P_GPLL0, 4.5, 0, 0), 710 + F(150000000, P_GPLL0, 4, 0, 0), 711 + F(266670000, P_MMPLL0, 3, 0, 0), 712 + F(320000000, P_MMPLL0, 2.5, 0, 0), 713 + F(400000000, P_MMPLL0, 2, 0, 0), 714 + { } 762 715 }; 763 716 764 717 static struct freq_tbl ftbl_camss_vfe_cpp_clk[] = { ··· 2431 2366 .pwrsts = PWRSTS_OFF_ON, 2432 2367 }; 2433 2368 2369 + static struct clk_regmap *mmcc_msm8226_clocks[] = { 2370 + [MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr, 2371 + [MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr, 2372 + [MMPLL0] = &mmpll0.clkr, 2373 + [MMPLL0_VOTE] = &mmpll0_vote, 2374 + [MMPLL1] = &mmpll1.clkr, 2375 + [MMPLL1_VOTE] = &mmpll1_vote, 2376 + [CSI0_CLK_SRC] = &csi0_clk_src.clkr, 2377 + [CSI1_CLK_SRC] = &csi1_clk_src.clkr, 2378 + [VFE0_CLK_SRC] = &vfe0_clk_src.clkr, 2379 + [MDP_CLK_SRC] = &mdp_clk_src.clkr, 2380 + [JPEG0_CLK_SRC] = &jpeg0_clk_src.clkr, 2381 + [PCLK0_CLK_SRC] = &pclk0_clk_src.clkr, 2382 + [VCODEC0_CLK_SRC] = &vcodec0_clk_src.clkr, 2383 + [CCI_CLK_SRC] = &cci_clk_src.clkr, 2384 + [CAMSS_GP0_CLK_SRC] = &camss_gp0_clk_src.clkr, 2385 + [CAMSS_GP1_CLK_SRC] = &camss_gp1_clk_src.clkr, 2386 + [MCLK0_CLK_SRC] = &mclk0_clk_src.clkr, 2387 + [MCLK1_CLK_SRC] = &mclk1_clk_src.clkr, 2388 + [CSI0PHYTIMER_CLK_SRC] = &csi0phytimer_clk_src.clkr, 2389 + [CSI1PHYTIMER_CLK_SRC] = &csi1phytimer_clk_src.clkr, 2390 + [CPP_CLK_SRC] = &cpp_clk_src.clkr, 2391 + [BYTE0_CLK_SRC] = &byte0_clk_src.clkr, 2392 + [ESC0_CLK_SRC] = &esc0_clk_src.clkr, 2393 + [VSYNC_CLK_SRC] = &vsync_clk_src.clkr, 2394 + [CAMSS_CCI_CCI_AHB_CLK] = &camss_cci_cci_ahb_clk.clkr, 2395 + [CAMSS_CCI_CCI_CLK] = &camss_cci_cci_clk.clkr, 2396 + [CAMSS_CSI0_AHB_CLK] = &camss_csi0_ahb_clk.clkr, 2397 + [CAMSS_CSI0_CLK] = &camss_csi0_clk.clkr, 2398 + [CAMSS_CSI0PHY_CLK] = &camss_csi0phy_clk.clkr, 2399 + [CAMSS_CSI0PIX_CLK] = &camss_csi0pix_clk.clkr, 2400 + [CAMSS_CSI0RDI_CLK] = &camss_csi0rdi_clk.clkr, 2401 + [CAMSS_CSI1_AHB_CLK] = &camss_csi1_ahb_clk.clkr, 2402 + [CAMSS_CSI1_CLK] = &camss_csi1_clk.clkr, 2403 + [CAMSS_CSI1PHY_CLK] = &camss_csi1phy_clk.clkr, 2404 + [CAMSS_CSI1PIX_CLK] = &camss_csi1pix_clk.clkr, 2405 + [CAMSS_CSI1RDI_CLK] = &camss_csi1rdi_clk.clkr, 2406 + [CAMSS_CSI_VFE0_CLK] = &camss_csi_vfe0_clk.clkr, 2407 + [CAMSS_GP0_CLK] = &camss_gp0_clk.clkr, 2408 + [CAMSS_GP1_CLK] = &camss_gp1_clk.clkr, 2409 + [CAMSS_ISPIF_AHB_CLK] = &camss_ispif_ahb_clk.clkr, 2410 + [CAMSS_JPEG_JPEG0_CLK] = &camss_jpeg_jpeg0_clk.clkr, 2411 + [CAMSS_JPEG_JPEG_AHB_CLK] = &camss_jpeg_jpeg_ahb_clk.clkr, 2412 + [CAMSS_JPEG_JPEG_AXI_CLK] = &camss_jpeg_jpeg_axi_clk.clkr, 2413 + [CAMSS_MCLK0_CLK] = &camss_mclk0_clk.clkr, 2414 + [CAMSS_MCLK1_CLK] = &camss_mclk1_clk.clkr, 2415 + [CAMSS_MICRO_AHB_CLK] = &camss_micro_ahb_clk.clkr, 2416 + [CAMSS_PHY0_CSI0PHYTIMER_CLK] = &camss_phy0_csi0phytimer_clk.clkr, 2417 + [CAMSS_PHY1_CSI1PHYTIMER_CLK] = &camss_phy1_csi1phytimer_clk.clkr, 2418 + [CAMSS_TOP_AHB_CLK] = &camss_top_ahb_clk.clkr, 2419 + [CAMSS_VFE_CPP_AHB_CLK] = &camss_vfe_cpp_ahb_clk.clkr, 2420 + [CAMSS_VFE_CPP_CLK] = &camss_vfe_cpp_clk.clkr, 2421 + [CAMSS_VFE_VFE0_CLK] = &camss_vfe_vfe0_clk.clkr, 2422 + [CAMSS_VFE_VFE_AHB_CLK] = &camss_vfe_vfe_ahb_clk.clkr, 2423 + [CAMSS_VFE_VFE_AXI_CLK] = &camss_vfe_vfe_axi_clk.clkr, 2424 + [MDSS_AHB_CLK] = &mdss_ahb_clk.clkr, 2425 + [MDSS_AXI_CLK] = &mdss_axi_clk.clkr, 2426 + [MDSS_BYTE0_CLK] = &mdss_byte0_clk.clkr, 2427 + [MDSS_ESC0_CLK] = &mdss_esc0_clk.clkr, 2428 + [MDSS_MDP_CLK] = &mdss_mdp_clk.clkr, 2429 + [MDSS_MDP_LUT_CLK] = &mdss_mdp_lut_clk.clkr, 2430 + [MDSS_PCLK0_CLK] = &mdss_pclk0_clk.clkr, 2431 + [MDSS_VSYNC_CLK] = &mdss_vsync_clk.clkr, 2432 + [MMSS_MISC_AHB_CLK] = &mmss_misc_ahb_clk.clkr, 2433 + [MMSS_MMSSNOC_AHB_CLK] = &mmss_mmssnoc_ahb_clk.clkr, 2434 + [MMSS_MMSSNOC_BTO_AHB_CLK] = &mmss_mmssnoc_bto_ahb_clk.clkr, 2435 + [MMSS_MMSSNOC_AXI_CLK] = &mmss_mmssnoc_axi_clk.clkr, 2436 + [MMSS_S0_AXI_CLK] = &mmss_s0_axi_clk.clkr, 2437 + [OCMEMCX_AHB_CLK] = &ocmemcx_ahb_clk.clkr, 2438 + [OXILI_OCMEMGX_CLK] = &oxili_ocmemgx_clk.clkr, 2439 + [OXILI_GFX3D_CLK] = &oxili_gfx3d_clk.clkr, 2440 + [OXILICX_AHB_CLK] = &oxilicx_ahb_clk.clkr, 2441 + [OXILICX_AXI_CLK] = &oxilicx_axi_clk.clkr, 2442 + [VENUS0_AHB_CLK] = &venus0_ahb_clk.clkr, 2443 + [VENUS0_AXI_CLK] = &venus0_axi_clk.clkr, 2444 + [VENUS0_VCODEC0_CLK] = &venus0_vcodec0_clk.clkr, 2445 + }; 2446 + 2447 + static const struct qcom_reset_map mmcc_msm8226_resets[] = { 2448 + [SPDM_RESET] = { 0x0200 }, 2449 + [SPDM_RM_RESET] = { 0x0300 }, 2450 + [VENUS0_RESET] = { 0x1020 }, 2451 + [MDSS_RESET] = { 0x2300 }, 2452 + }; 2453 + 2454 + static struct gdsc *mmcc_msm8226_gdscs[] = { 2455 + [VENUS0_GDSC] = &venus0_gdsc, 2456 + [MDSS_GDSC] = &mdss_gdsc, 2457 + [CAMSS_JPEG_GDSC] = &camss_jpeg_gdsc, 2458 + [CAMSS_VFE_GDSC] = &camss_vfe_gdsc, 2459 + }; 2460 + 2461 + static const struct regmap_config mmcc_msm8226_regmap_config = { 2462 + .reg_bits = 32, 2463 + .reg_stride = 4, 2464 + .val_bits = 32, 2465 + .max_register = 0x5104, 2466 + .fast_io = true, 2467 + }; 2468 + 2469 + static const struct qcom_cc_desc mmcc_msm8226_desc = { 2470 + .config = &mmcc_msm8226_regmap_config, 2471 + .clks = mmcc_msm8226_clocks, 2472 + .num_clks = ARRAY_SIZE(mmcc_msm8226_clocks), 2473 + .resets = mmcc_msm8226_resets, 2474 + .num_resets = ARRAY_SIZE(mmcc_msm8226_resets), 2475 + .gdscs = mmcc_msm8226_gdscs, 2476 + .num_gdscs = ARRAY_SIZE(mmcc_msm8226_gdscs), 2477 + }; 2478 + 2434 2479 static struct clk_regmap *mmcc_msm8974_clocks[] = { 2435 2480 [MMSS_AHB_CLK_SRC] = &mmss_ahb_clk_src.clkr, 2436 2481 [MMSS_AXI_CLK_SRC] = &mmss_axi_clk_src.clkr, ··· 2744 2569 }; 2745 2570 2746 2571 static const struct of_device_id mmcc_msm8974_match_table[] = { 2747 - { .compatible = "qcom,mmcc-msm8974" }, 2572 + { .compatible = "qcom,mmcc-msm8226", .data = &mmcc_msm8226_desc }, 2573 + { .compatible = "qcom,mmcc-msm8974", .data = &mmcc_msm8974_desc }, 2748 2574 { } 2749 2575 }; 2750 2576 MODULE_DEVICE_TABLE(of, mmcc_msm8974_match_table); 2751 2577 2578 + static void msm8226_clock_override(void) 2579 + { 2580 + mmss_axi_clk_src.freq_tbl = ftbl_mmss_axi_clk_msm8226; 2581 + vfe0_clk_src.freq_tbl = ftbl_camss_vfe_vfe0_clk_msm8226; 2582 + mdp_clk_src.freq_tbl = ftbl_mdss_mdp_clk_msm8226; 2583 + vcodec0_clk_src.freq_tbl = ftbl_venus0_vcodec0_clk_msm8226; 2584 + mclk0_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226; 2585 + mclk1_clk_src.freq_tbl = ftbl_camss_mclk0_3_clk_msm8226; 2586 + cpp_clk_src.freq_tbl = ftbl_camss_vfe_cpp_clk_msm8226; 2587 + } 2588 + 2752 2589 static int mmcc_msm8974_probe(struct platform_device *pdev) 2753 2590 { 2754 2591 struct regmap *regmap; 2592 + const struct qcom_cc_desc *desc; 2755 2593 2756 - regmap = qcom_cc_map(pdev, &mmcc_msm8974_desc); 2594 + desc = of_device_get_match_data(&pdev->dev); 2595 + if (!desc) 2596 + return -EINVAL; 2597 + 2598 + regmap = qcom_cc_map(pdev, desc); 2757 2599 if (IS_ERR(regmap)) 2758 2600 return PTR_ERR(regmap); 2759 2601 2760 - clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true); 2761 - clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false); 2602 + if (desc == &mmcc_msm8974_desc) { 2603 + clk_pll_configure_sr_hpm_lp(&mmpll1, regmap, &mmpll1_config, true); 2604 + clk_pll_configure_sr_hpm_lp(&mmpll3, regmap, &mmpll3_config, false); 2605 + } else { 2606 + msm8226_clock_override(); 2607 + } 2762 2608 2763 - return qcom_cc_really_probe(pdev, &mmcc_msm8974_desc, regmap); 2609 + return qcom_cc_really_probe(pdev, desc, regmap); 2764 2610 } 2765 2611 2766 2612 static struct platform_driver mmcc_msm8974_driver = {