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

clk: qcom: gcc: Add support for Global Clock controller found on MSM8226

Modify existing MSM8974 driver to support MSM8226 SoC. Override frequencies
which are different in this older chip. Register all the clocks to the
framework for the clients to be able to request for them.

Signed-off-by: Bartosz Dudziak <bartosz.dudziak@snejp.pl>
Link: https://lore.kernel.org/r/20210418122909.71434-3-bartosz.dudziak@snejp.pl
Signed-off-by: Stephen Boyd <sboyd@kernel.org>

authored by

Bartosz Dudziak and committed by
Stephen Boyd
76f53d9b e184d788

+162 -7
+162 -7
drivers/clk/qcom/gcc-msm8974.c
··· 719 719 }, 720 720 }; 721 721 722 + static const struct freq_tbl ftbl_gcc_ce1_clk_msm8226[] = { 723 + F(50000000, P_GPLL0, 12, 0, 0), 724 + F(100000000, P_GPLL0, 6, 0, 0), 725 + { } 726 + }; 727 + 722 728 static const struct freq_tbl ftbl_gcc_ce1_clk[] = { 723 729 F(50000000, P_GPLL0, 12, 0, 0), 724 730 F(75000000, P_GPLL0, 8, 0, 0), ··· 765 759 .num_parents = 2, 766 760 .ops = &clk_rcg2_ops, 767 761 }, 762 + }; 763 + 764 + static const struct freq_tbl ftbl_gcc_gp_clk_msm8226[] = { 765 + F(19200000, P_XO, 1, 0, 0), 766 + { } 768 767 }; 769 768 770 769 static const struct freq_tbl ftbl_gcc_gp_clk[] = { ··· 1966 1955 .enable_mask = BIT(0), 1967 1956 .hw.init = &(struct clk_init_data){ 1968 1957 .name = "gcc_mss_q6_bimc_axi_clk", 1958 + .parent_names = (const char *[]){ 1959 + "system_noc_clk_src", 1960 + }, 1961 + .num_parents = 1, 1969 1962 .ops = &clk_branch2_ops, 1970 1963 }, 1971 1964 }, ··· 2002 1987 .parent_names = (const char *[]){ 2003 1988 "periph_noc_clk_src", 2004 1989 }, 1990 + .num_parents = 1, 1991 + .ops = &clk_branch2_ops, 1992 + }, 1993 + }, 1994 + }; 1995 + 1996 + static struct clk_branch gcc_pdm_xo4_clk = { 1997 + .halt_reg = 0x0cc8, 1998 + .clkr = { 1999 + .enable_reg = 0x0cc8, 2000 + .enable_mask = BIT(0), 2001 + .hw.init = &(struct clk_init_data){ 2002 + .name = "gcc_pdm_xo4_clk", 2003 + .parent_names = (const char *[]){ "xo" }, 2005 2004 .num_parents = 1, 2006 2005 .ops = &clk_branch2_ops, 2007 2006 }, ··· 2459 2430 .pwrsts = PWRSTS_OFF_ON, 2460 2431 }; 2461 2432 2433 + static struct clk_regmap *gcc_msm8226_clocks[] = { 2434 + [GPLL0] = &gpll0.clkr, 2435 + [GPLL0_VOTE] = &gpll0_vote, 2436 + [GPLL1] = &gpll1.clkr, 2437 + [GPLL1_VOTE] = &gpll1_vote, 2438 + [CONFIG_NOC_CLK_SRC] = &config_noc_clk_src.clkr, 2439 + [PERIPH_NOC_CLK_SRC] = &periph_noc_clk_src.clkr, 2440 + [SYSTEM_NOC_CLK_SRC] = &system_noc_clk_src.clkr, 2441 + [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr, 2442 + [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr, 2443 + [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr, 2444 + [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr, 2445 + [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr, 2446 + [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr, 2447 + [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr, 2448 + [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr, 2449 + [BLSP1_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr, 2450 + [BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr, 2451 + [BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr, 2452 + [BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_spi_apps_clk_src.clkr, 2453 + [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr, 2454 + [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr, 2455 + [BLSP1_UART3_APPS_CLK_SRC] = &blsp1_uart3_apps_clk_src.clkr, 2456 + [BLSP1_UART4_APPS_CLK_SRC] = &blsp1_uart4_apps_clk_src.clkr, 2457 + [BLSP1_UART5_APPS_CLK_SRC] = &blsp1_uart5_apps_clk_src.clkr, 2458 + [BLSP1_UART6_APPS_CLK_SRC] = &blsp1_uart6_apps_clk_src.clkr, 2459 + [CE1_CLK_SRC] = &ce1_clk_src.clkr, 2460 + [GP1_CLK_SRC] = &gp1_clk_src.clkr, 2461 + [GP2_CLK_SRC] = &gp2_clk_src.clkr, 2462 + [GP3_CLK_SRC] = &gp3_clk_src.clkr, 2463 + [PDM2_CLK_SRC] = &pdm2_clk_src.clkr, 2464 + [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr, 2465 + [SDCC2_APPS_CLK_SRC] = &sdcc2_apps_clk_src.clkr, 2466 + [SDCC3_APPS_CLK_SRC] = &sdcc3_apps_clk_src.clkr, 2467 + [USB_HS_SYSTEM_CLK_SRC] = &usb_hs_system_clk_src.clkr, 2468 + [USB_HSIC_CLK_SRC] = &usb_hsic_clk_src.clkr, 2469 + [USB_HSIC_IO_CAL_CLK_SRC] = &usb_hsic_io_cal_clk_src.clkr, 2470 + [USB_HSIC_SYSTEM_CLK_SRC] = &usb_hsic_system_clk_src.clkr, 2471 + [GCC_BAM_DMA_AHB_CLK] = &gcc_bam_dma_ahb_clk.clkr, 2472 + [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr, 2473 + [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr, 2474 + [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr, 2475 + [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr, 2476 + [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr, 2477 + [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr, 2478 + [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr, 2479 + [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr, 2480 + [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr, 2481 + [GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr, 2482 + [GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr, 2483 + [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr, 2484 + [GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr, 2485 + [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr, 2486 + [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr, 2487 + [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr, 2488 + [GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr, 2489 + [GCC_BLSP1_UART5_APPS_CLK] = &gcc_blsp1_uart5_apps_clk.clkr, 2490 + [GCC_BLSP1_UART6_APPS_CLK] = &gcc_blsp1_uart6_apps_clk.clkr, 2491 + [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr, 2492 + [GCC_CE1_AHB_CLK] = &gcc_ce1_ahb_clk.clkr, 2493 + [GCC_CE1_AXI_CLK] = &gcc_ce1_axi_clk.clkr, 2494 + [GCC_CE1_CLK] = &gcc_ce1_clk.clkr, 2495 + [GCC_GP1_CLK] = &gcc_gp1_clk.clkr, 2496 + [GCC_GP2_CLK] = &gcc_gp2_clk.clkr, 2497 + [GCC_GP3_CLK] = &gcc_gp3_clk.clkr, 2498 + [GCC_LPASS_Q6_AXI_CLK] = &gcc_lpass_q6_axi_clk.clkr, 2499 + [GCC_MSS_CFG_AHB_CLK] = &gcc_mss_cfg_ahb_clk.clkr, 2500 + [GCC_MSS_Q6_BIMC_AXI_CLK] = &gcc_mss_q6_bimc_axi_clk.clkr, 2501 + [GCC_PDM2_CLK] = &gcc_pdm2_clk.clkr, 2502 + [GCC_PDM_AHB_CLK] = &gcc_pdm_ahb_clk.clkr, 2503 + [GCC_PDM_XO4_CLK] = &gcc_pdm_xo4_clk.clkr, 2504 + [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, 2505 + [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr, 2506 + [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr, 2507 + [GCC_SDCC2_AHB_CLK] = &gcc_sdcc2_ahb_clk.clkr, 2508 + [GCC_SDCC2_APPS_CLK] = &gcc_sdcc2_apps_clk.clkr, 2509 + [GCC_SDCC3_AHB_CLK] = &gcc_sdcc3_ahb_clk.clkr, 2510 + [GCC_SDCC3_APPS_CLK] = &gcc_sdcc3_apps_clk.clkr, 2511 + [GCC_USB2A_PHY_SLEEP_CLK] = &gcc_usb2a_phy_sleep_clk.clkr, 2512 + [GCC_USB_HS_AHB_CLK] = &gcc_usb_hs_ahb_clk.clkr, 2513 + [GCC_USB_HS_SYSTEM_CLK] = &gcc_usb_hs_system_clk.clkr, 2514 + [GCC_USB_HSIC_AHB_CLK] = &gcc_usb_hsic_ahb_clk.clkr, 2515 + [GCC_USB_HSIC_CLK] = &gcc_usb_hsic_clk.clkr, 2516 + [GCC_USB_HSIC_IO_CAL_CLK] = &gcc_usb_hsic_io_cal_clk.clkr, 2517 + [GCC_USB_HSIC_SYSTEM_CLK] = &gcc_usb_hsic_system_clk.clkr, 2518 + }; 2519 + 2520 + static const struct qcom_reset_map gcc_msm8226_resets[] = { 2521 + [GCC_USB_HS_HSIC_BCR] = { 0x0400 }, 2522 + [GCC_USB_HS_BCR] = { 0x0480 }, 2523 + [GCC_USB2A_PHY_BCR] = { 0x04a8 }, 2524 + }; 2525 + 2526 + static struct gdsc *gcc_msm8226_gdscs[] = { 2527 + [USB_HS_HSIC_GDSC] = &usb_hs_hsic_gdsc, 2528 + }; 2529 + 2530 + static const struct regmap_config gcc_msm8226_regmap_config = { 2531 + .reg_bits = 32, 2532 + .reg_stride = 4, 2533 + .val_bits = 32, 2534 + .max_register = 0x1a80, 2535 + .fast_io = true, 2536 + }; 2537 + 2538 + static const struct qcom_cc_desc gcc_msm8226_desc = { 2539 + .config = &gcc_msm8226_regmap_config, 2540 + .clks = gcc_msm8226_clocks, 2541 + .num_clks = ARRAY_SIZE(gcc_msm8226_clocks), 2542 + .resets = gcc_msm8226_resets, 2543 + .num_resets = ARRAY_SIZE(gcc_msm8226_resets), 2544 + .gdscs = gcc_msm8226_gdscs, 2545 + .num_gdscs = ARRAY_SIZE(gcc_msm8226_gdscs), 2546 + }; 2547 + 2462 2548 static struct clk_regmap *gcc_msm8974_clocks[] = { 2463 2549 [GPLL0] = &gpll0.clkr, 2464 2550 [GPLL0_VOTE] = &gpll0_vote, ··· 2826 2682 }; 2827 2683 2828 2684 static const struct of_device_id gcc_msm8974_match_table[] = { 2829 - { .compatible = "qcom,gcc-msm8974" }, 2830 - { .compatible = "qcom,gcc-msm8974pro" , .data = (void *)1UL }, 2831 - { .compatible = "qcom,gcc-msm8974pro-ac", .data = (void *)1UL }, 2685 + { .compatible = "qcom,gcc-msm8226", .data = &gcc_msm8226_desc }, 2686 + { .compatible = "qcom,gcc-msm8974", .data = &gcc_msm8974_desc }, 2687 + { .compatible = "qcom,gcc-msm8974pro", .data = &gcc_msm8974_desc }, 2688 + { .compatible = "qcom,gcc-msm8974pro-ac", .data = &gcc_msm8974_desc }, 2832 2689 { } 2833 2690 }; 2834 2691 MODULE_DEVICE_TABLE(of, gcc_msm8974_match_table); 2692 + 2693 + static void msm8226_clock_override(void) 2694 + { 2695 + ce1_clk_src.freq_tbl = ftbl_gcc_ce1_clk_msm8226; 2696 + gp1_clk_src.freq_tbl = ftbl_gcc_gp_clk_msm8226; 2697 + gp2_clk_src.freq_tbl = ftbl_gcc_gp_clk_msm8226; 2698 + gp3_clk_src.freq_tbl = ftbl_gcc_gp_clk_msm8226; 2699 + } 2835 2700 2836 2701 static void msm8974_pro_clock_override(void) 2837 2702 { ··· 2861 2708 { 2862 2709 int ret; 2863 2710 struct device *dev = &pdev->dev; 2864 - bool pro; 2865 2711 const struct of_device_id *id; 2866 2712 2867 2713 id = of_match_device(gcc_msm8974_match_table, dev); 2868 2714 if (!id) 2869 2715 return -ENODEV; 2870 - pro = !!(id->data); 2871 2716 2872 - if (pro) 2873 - msm8974_pro_clock_override(); 2717 + if (!of_device_is_compatible(dev->of_node, "qcom,gcc-msm8974")) { 2718 + if (id->data == &gcc_msm8226_desc) 2719 + msm8226_clock_override(); 2720 + else 2721 + msm8974_pro_clock_override(); 2722 + } 2874 2723 2875 2724 ret = qcom_cc_register_board_clk(dev, "xo_board", "xo", 19200000); 2876 2725 if (ret)