Lines Matching +full:pex +full:- +full:clk +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0-only
7 #include <linux/clk-provider.h>
13 #include <linux/clk/tegra.h>
15 #include <dt-bindings/clock/tegra20-car.h>
17 #include "clk.h"
18 #include "clk-id.h"
26 #define OSC_CTRL_OSC_FREQ_12MHZ (2u<<30)
33 #define OSC_CTRL_PLL_REF_DIV_4 (2u<<28)
86 #define CCLK_RUN_POLICY 2
138 30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, \
145 30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, \
157 static struct clk **clks;
180 { 12000000, 216000000, 432, 12, 2, 8 },
181 { 13000000, 216000000, 432, 13, 2, 8 },
182 { 19200000, 216000000, 90, 4, 2, 1 },
183 { 26000000, 216000000, 432, 26, 2, 8 },
361 { .pdiv = 2, .hw_val = 0 },
444 { .dev_id = "tegra20-ac97", .dt_id = TEGRA20_CLK_AC97 },
445 { .dev_id = "tegra-apbdma", .dt_id = TEGRA20_CLK_APBDMA },
446 { .dev_id = "rtc-tegra", .dt_id = TEGRA20_CLK_RTC },
448 { .dev_id = "tegra-kbc", .dt_id = TEGRA20_CLK_KBC },
450 { .con_id = "vcp", .dev_id = "tegra-avp", .dt_id = TEGRA20_CLK_VCP },
451 { .con_id = "bsea", .dev_id = "tegra-avp", .dt_id = TEGRA20_CLK_BSEA },
452 { .con_id = "bsev", .dev_id = "tegra-aes", .dt_id = TEGRA20_CLK_BSEV },
454 { .dev_id = "fsl-tegra-udc", .dt_id = TEGRA20_CLK_USBD },
455 { .dev_id = "tegra-ehci.1", .dt_id = TEGRA20_CLK_USB2 },
456 { .dev_id = "tegra-ehci.2", .dt_id = TEGRA20_CLK_USB3 },
460 { .con_id = "pex", .dt_id = TEGRA20_CLK_PEX },
467 { .dev_id = "tegra20-i2s.0", .dt_id = TEGRA20_CLK_I2S1 },
468 { .dev_id = "tegra20-i2s.1", .dt_id = TEGRA20_CLK_I2S2 },
469 { .con_id = "spdif_out", .dev_id = "tegra20-spdif", .dt_id = TEGRA20_CLK_SPDIF_OUT },
470 { .con_id = "spdif_in", .dev_id = "tegra20-spdif", .dt_id = TEGRA20_CLK_SPDIF_IN },
473 { .dev_id = "spi_tegra.2", .dt_id = TEGRA20_CLK_SBC3 },
491 { .dev_id = "2d", .dt_id = TEGRA20_CLK_GR2D },
492 { .dev_id = "tegra-nor", .dt_id = TEGRA20_CLK_NOR },
493 { .dev_id = "sdhci-tegra.0", .dt_id = TEGRA20_CLK_SDMMC1 },
494 { .dev_id = "sdhci-tegra.1", .dt_id = TEGRA20_CLK_SDMMC2 },
495 { .dev_id = "sdhci-tegra.2", .dt_id = TEGRA20_CLK_SDMMC3 },
496 { .dev_id = "sdhci-tegra.3", .dt_id = TEGRA20_CLK_SDMMC4 },
502 { .con_id = "div-clk", .dev_id = "tegra-i2c.0", .dt_id = TEGRA20_CLK_I2C1 },
503 { .con_id = "div-clk", .dev_id = "tegra-i2c.1", .dt_id = TEGRA20_CLK_I2C2 },
504 { .con_id = "div-clk", .dev_id = "tegra-i2c.2", .dt_id = TEGRA20_CLK_I2C3 },
505 { .con_id = "div-clk", .dev_id = "tegra-i2c.3", .dt_id = TEGRA20_CLK_DVC },
506 { .dev_id = "tegra-pwm", .dt_id = TEGRA20_CLK_PWM },
509 { .dev_id = "tegra_uart.2", .dt_id = TEGRA20_CLK_UARTC },
615 return 2; in tegra20_get_pll_ref_div()
627 struct clk *clk; in tegra20_pll_init() local
630 clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0, in tegra20_pll_init()
632 clks[TEGRA20_CLK_PLL_C] = clk; in tegra20_pll_init()
635 clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c", in tegra20_pll_init()
638 clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div", in tegra20_pll_init()
641 clks[TEGRA20_CLK_PLL_C_OUT1] = clk; in tegra20_pll_init()
644 clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL, in tegra20_pll_init()
646 clks[TEGRA20_CLK_PLL_M] = clk; in tegra20_pll_init()
649 clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m", in tegra20_pll_init()
652 clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div", in tegra20_pll_init()
655 clks[TEGRA20_CLK_PLL_M_OUT1] = clk; in tegra20_pll_init()
658 clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0, in tegra20_pll_init()
660 clks[TEGRA20_CLK_PLL_X] = clk; in tegra20_pll_init()
663 clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0, in tegra20_pll_init()
665 clks[TEGRA20_CLK_PLL_U] = clk; in tegra20_pll_init()
668 clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0, in tegra20_pll_init()
670 clks[TEGRA20_CLK_PLL_D] = clk; in tegra20_pll_init()
673 clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d", in tegra20_pll_init()
674 CLK_SET_RATE_PARENT, 1, 2); in tegra20_pll_init()
675 clks[TEGRA20_CLK_PLL_D_OUT0] = clk; in tegra20_pll_init()
678 clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0, in tegra20_pll_init()
680 clks[TEGRA20_CLK_PLL_A] = clk; in tegra20_pll_init()
683 clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a", in tegra20_pll_init()
686 clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div", in tegra20_pll_init()
689 clks[TEGRA20_CLK_PLL_A_OUT0] = clk; in tegra20_pll_init()
692 clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, pmc_base, in tegra20_pll_init()
694 clks[TEGRA20_CLK_PLL_E] = clk; in tegra20_pll_init()
706 struct clk *clk; in tegra20_super_clk_init() local
709 clk = tegra_clk_register_super_cclk("cclk", cclk_parents, in tegra20_super_clk_init()
713 clks[TEGRA20_CLK_CCLK] = clk; in tegra20_super_clk_init()
716 clk = clk_register_fixed_factor(NULL, "twd", "cclk", 0, 1, 4); in tegra20_super_clk_init()
717 clks[TEGRA20_CLK_TWD] = clk; in tegra20_super_clk_init()
726 struct clk *clk; in tegra20_audio_clk_init() local
729 clk = clk_register_mux(NULL, "audio_mux", audio_parents, in tegra20_audio_clk_init()
733 clk = clk_register_gate(NULL, "audio", "audio_mux", 0, in tegra20_audio_clk_init()
736 clks[TEGRA20_CLK_AUDIO] = clk; in tegra20_audio_clk_init()
739 clk = clk_register_fixed_factor(NULL, "audio_doubler", "audio", in tegra20_audio_clk_init()
740 CLK_SET_RATE_PARENT, 2, 1); in tegra20_audio_clk_init()
741 clk = tegra_clk_register_periph_gate("audio_2x", "audio_doubler", in tegra20_audio_clk_init()
745 clks[TEGRA20_CLK_AUDIO_2X] = clk; in tegra20_audio_clk_init()
774 …TEGRA_INIT_DATA_NODIV("uarta", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 30, 2, 6, TEGRA_PERIPH_ON_APB,…
775 …TEGRA_INIT_DATA_NODIV("uartb", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 30, 2, 7, TEGRA_PERIPH_ON_APB,…
776 …TEGRA_INIT_DATA_NODIV("uartc", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 30, 2, 55, TEGRA_PERIPH_ON_APB,…
777 …TEGRA_INIT_DATA_NODIV("uartd", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 30, 2, 65, TEGRA_PERIPH_ON_APB,…
778 …TEGRA_INIT_DATA_NODIV("uarte", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 30, 2, 66, TEGRA_PERIPH_ON_APB,…
779 …TEGRA_INIT_DATA_NODIV("disp1", mux_pllpdc_clkm, CLK_SOURCE_DISP1, 30, 2, 27, 0, TEGRA20_CLK_DISP1…
780 …TEGRA_INIT_DATA_NODIV("disp2", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, 0, TEGRA20_CLK_DISP2…
786 struct clk *clk; in tegra20_periph_clk_init() local
790 clk = tegra_clk_register_periph_gate("ac97", "pll_a_out0", in tegra20_periph_clk_init()
793 clks[TEGRA20_CLK_AC97] = clk; in tegra20_periph_clk_init()
796 clk = tegra20_clk_register_emc(clk_base + CLK_SOURCE_EMC, false); in tegra20_periph_clk_init()
798 clks[TEGRA20_CLK_EMC] = clk; in tegra20_periph_clk_init()
800 clk = tegra_clk_register_mc("mc", "emc", clk_base + CLK_SOURCE_EMC, in tegra20_periph_clk_init()
802 clks[TEGRA20_CLK_MC] = clk; in tegra20_periph_clk_init()
805 clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, in tegra20_periph_clk_init()
807 clk_register_clkdev(clk, NULL, "dsi"); in tegra20_periph_clk_init()
808 clks[TEGRA20_CLK_DSI] = clk; in tegra20_periph_clk_init()
810 /* pex */ in tegra20_periph_clk_init()
811 clk = tegra_clk_register_periph_gate("pex", "clk_m", 0, clk_base, 0, 70, in tegra20_periph_clk_init()
813 clks[TEGRA20_CLK_PEX] = clk; in tegra20_periph_clk_init()
817 0, clk_base + MISC_CLK_ENB, 22, 2, in tegra20_periph_clk_init()
823 0, clk_base + MISC_CLK_ENB, 20, 2, in tegra20_periph_clk_init()
828 clk = tegra_clk_register_periph_gate("cdev1", "cdev1_mux", 0, in tegra20_periph_clk_init()
830 clks[TEGRA20_CLK_CDEV1] = clk; in tegra20_periph_clk_init()
833 clk = tegra_clk_register_periph_gate("cdev2", "cdev2_mux", 0, in tegra20_periph_clk_init()
835 clks[TEGRA20_CLK_CDEV2] = clk; in tegra20_periph_clk_init()
839 clk = tegra_clk_register_periph_data(clk_base, data); in tegra20_periph_clk_init()
840 clks[data->clk_id] = clk; in tegra20_periph_clk_init()
845 clk = tegra_clk_register_periph_nodiv(data->name, in tegra20_periph_clk_init()
846 data->p.parent_names, in tegra20_periph_clk_init()
847 data->num_parents, &data->periph, in tegra20_periph_clk_init()
848 clk_base, data->offset); in tegra20_periph_clk_init()
849 clks[data->clk_id] = clk; in tegra20_periph_clk_init()
857 struct clk *clk; in tegra20_osc_clk_init() local
864 clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IGNORE_UNUSED, in tegra20_osc_clk_init()
866 clks[TEGRA20_CLK_CLK_M] = clk; in tegra20_osc_clk_init()
870 clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m", in tegra20_osc_clk_init()
872 clks[TEGRA20_CLK_PLL_REF] = clk; in tegra20_osc_clk_init()
1057 TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "utmip-pad", NULL),
1058 TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-ehci.0", NULL),
1059 TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-otg", NULL),
1066 { .compatible = "nvidia,tegra20-pmc" },
1072 static struct clk *tegra20_clk_src_onecell_get(struct of_phandle_args *clkspec, in tegra20_clk_src_onecell_get()
1077 struct clk *clk; in tegra20_clk_src_onecell_get() local
1083 if (clkspec->args[0] != TEGRA20_CLK_RTC && in tegra20_clk_src_onecell_get()
1084 clkspec->args[0] != TEGRA20_CLK_TWD && in tegra20_clk_src_onecell_get()
1085 clkspec->args[0] != TEGRA20_CLK_TIMER && in tegra20_clk_src_onecell_get()
1087 return ERR_PTR(-EPROBE_DEFER); in tegra20_clk_src_onecell_get()
1089 clk = of_clk_src_onecell_get(clkspec, data); in tegra20_clk_src_onecell_get()
1090 if (IS_ERR(clk)) in tegra20_clk_src_onecell_get()
1091 return clk; in tegra20_clk_src_onecell_get()
1093 hw = __clk_get_hw(clk); in tegra20_clk_src_onecell_get()
1097 * clock is created by the pinctrl driver. It is possible for clk user in tegra20_clk_src_onecell_get()
1102 if (clkspec->args[0] == TEGRA20_CLK_CDEV1 || in tegra20_clk_src_onecell_get()
1103 clkspec->args[0] == TEGRA20_CLK_CDEV2) { in tegra20_clk_src_onecell_get()
1106 return ERR_PTR(-EPROBE_DEFER); in tegra20_clk_src_onecell_get()
1109 if (clkspec->args[0] == TEGRA20_CLK_EMC) { in tegra20_clk_src_onecell_get()
1111 return ERR_PTR(-EPROBE_DEFER); in tegra20_clk_src_onecell_get()
1114 return clk; in tegra20_clk_src_onecell_get()
1159 CLK_OF_DECLARE_DRIVER(tegra20, "nvidia,tegra20-car", tegra20_clock_init);
1172 struct clk *clk; in tegra20_car_probe() local
1174 clk = tegra_clk_register_super_mux("sclk", sclk_parents, in tegra20_car_probe()
1178 clks[TEGRA20_CLK_SCLK] = clk; in tegra20_car_probe()
1188 { .compatible = "nvidia,tegra20-car" },
1194 .name = "tegra20-car",