提交 b360ada3 编写于 作者: M Michael Turquette

Merge tag 'tegra-for-4.5-clk' of...

Merge tag 'tegra-for-4.5-clk' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into clk-next

clk: tegra: Changes for v4.5-rc1

This set of changes adds support for the Tegra210 SoC and contains a
couple fixes and cleanups.
NVIDIA Tegra210 Clock And Reset Controller
This binding uses the common clock binding:
Documentation/devicetree/bindings/clock/clock-bindings.txt
The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
for muxing and gating Tegra's clocks, and setting their rates.
Required properties :
- compatible : Should be "nvidia,tegra210-car"
- reg : Should contain CAR registers location and length
- clocks : Should contain phandle and clock specifiers for two clocks:
the 32 KHz "32k_in".
- #clock-cells : Should be 1.
In clock consumers, this cell represents the clock ID exposed by the
CAR. The assignments may be found in header file
<dt-bindings/clock/tegra210-car.h>.
- #reset-cells : Should be 1.
In clock consumers, this cell represents the bit number in the CAR's
array of CLK_RST_CONTROLLER_RST_DEVICES_* registers.
Example SoC include file:
/ {
tegra_car: clock {
compatible = "nvidia,tegra210-car";
reg = <0x60006000 0x1000>;
#clock-cells = <1>;
#reset-cells = <1>;
};
usb@c5004000 {
clocks = <&tegra_car TEGRA210_CLK_USB2>;
};
};
Example board file:
/ {
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk_32k: clock@1 {
compatible = "fixed-clock";
reg = <1>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
&tegra_car {
clocks = <&clk_32k>;
};
};
...@@ -20,3 +20,4 @@ obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124.o ...@@ -20,3 +20,4 @@ obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124.o
obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124-dfll-fcpu.o obj-$(CONFIG_ARCH_TEGRA_124_SOC) += clk-tegra124-dfll-fcpu.o
obj-$(CONFIG_ARCH_TEGRA_132_SOC) += clk-tegra124.o obj-$(CONFIG_ARCH_TEGRA_132_SOC) += clk-tegra124.o
obj-y += cvb.o obj-y += cvb.o
obj-$(CONFIG_ARCH_TEGRA_210_SOC) += clk-tegra210.o
...@@ -13,6 +13,7 @@ enum clk_id { ...@@ -13,6 +13,7 @@ enum clk_id {
tegra_clk_amx1, tegra_clk_amx1,
tegra_clk_apbdma, tegra_clk_apbdma,
tegra_clk_apbif, tegra_clk_apbif,
tegra_clk_ape,
tegra_clk_audio0, tegra_clk_audio0,
tegra_clk_audio0_2x, tegra_clk_audio0_2x,
tegra_clk_audio0_mux, tegra_clk_audio0_mux,
...@@ -38,6 +39,7 @@ enum clk_id { ...@@ -38,6 +39,7 @@ enum clk_id {
tegra_clk_cile, tegra_clk_cile,
tegra_clk_clk_32k, tegra_clk_clk_32k,
tegra_clk_clk72Mhz, tegra_clk_clk72Mhz,
tegra_clk_clk72Mhz_8,
tegra_clk_clk_m, tegra_clk_clk_m,
tegra_clk_clk_m_div2, tegra_clk_clk_m_div2,
tegra_clk_clk_m_div4, tegra_clk_clk_m_div4,
...@@ -51,17 +53,21 @@ enum clk_id { ...@@ -51,17 +53,21 @@ enum clk_id {
tegra_clk_cml1, tegra_clk_cml1,
tegra_clk_csi, tegra_clk_csi,
tegra_clk_csite, tegra_clk_csite,
tegra_clk_csite_8,
tegra_clk_csus, tegra_clk_csus,
tegra_clk_cve, tegra_clk_cve,
tegra_clk_dam0, tegra_clk_dam0,
tegra_clk_dam1, tegra_clk_dam1,
tegra_clk_dam2, tegra_clk_dam2,
tegra_clk_d_audio, tegra_clk_d_audio,
tegra_clk_dbgapb,
tegra_clk_dds, tegra_clk_dds,
tegra_clk_dfll_ref, tegra_clk_dfll_ref,
tegra_clk_dfll_soc, tegra_clk_dfll_soc,
tegra_clk_disp1, tegra_clk_disp1,
tegra_clk_disp1_8,
tegra_clk_disp2, tegra_clk_disp2,
tegra_clk_disp2_8,
tegra_clk_dp2, tegra_clk_dp2,
tegra_clk_dpaux, tegra_clk_dpaux,
tegra_clk_dsialp, tegra_clk_dsialp,
...@@ -71,6 +77,7 @@ enum clk_id { ...@@ -71,6 +77,7 @@ enum clk_id {
tegra_clk_dtv, tegra_clk_dtv,
tegra_clk_emc, tegra_clk_emc,
tegra_clk_entropy, tegra_clk_entropy,
tegra_clk_entropy_8,
tegra_clk_epp, tegra_clk_epp,
tegra_clk_epp_8, tegra_clk_epp_8,
tegra_clk_extern1, tegra_clk_extern1,
...@@ -85,12 +92,16 @@ enum clk_id { ...@@ -85,12 +92,16 @@ enum clk_id {
tegra_clk_gr3d_8, tegra_clk_gr3d_8,
tegra_clk_hclk, tegra_clk_hclk,
tegra_clk_hda, tegra_clk_hda,
tegra_clk_hda_8,
tegra_clk_hda2codec_2x, tegra_clk_hda2codec_2x,
tegra_clk_hda2codec_2x_8,
tegra_clk_hda2hdmi, tegra_clk_hda2hdmi,
tegra_clk_hdmi, tegra_clk_hdmi,
tegra_clk_hdmi_audio, tegra_clk_hdmi_audio,
tegra_clk_host1x, tegra_clk_host1x,
tegra_clk_host1x_8, tegra_clk_host1x_8,
tegra_clk_host1x_9,
tegra_clk_hsic_trk,
tegra_clk_i2c1, tegra_clk_i2c1,
tegra_clk_i2c2, tegra_clk_i2c2,
tegra_clk_i2c3, tegra_clk_i2c3,
...@@ -110,11 +121,14 @@ enum clk_id { ...@@ -110,11 +121,14 @@ enum clk_id {
tegra_clk_i2s4_sync, tegra_clk_i2s4_sync,
tegra_clk_isp, tegra_clk_isp,
tegra_clk_isp_8, tegra_clk_isp_8,
tegra_clk_isp_9,
tegra_clk_ispb, tegra_clk_ispb,
tegra_clk_kbc, tegra_clk_kbc,
tegra_clk_kfuse, tegra_clk_kfuse,
tegra_clk_la, tegra_clk_la,
tegra_clk_maud,
tegra_clk_mipi, tegra_clk_mipi,
tegra_clk_mipibif,
tegra_clk_mipi_cal, tegra_clk_mipi_cal,
tegra_clk_mpe, tegra_clk_mpe,
tegra_clk_mselect, tegra_clk_mselect,
...@@ -124,15 +138,24 @@ enum clk_id { ...@@ -124,15 +138,24 @@ enum clk_id {
tegra_clk_ndspeed, tegra_clk_ndspeed,
tegra_clk_ndspeed_8, tegra_clk_ndspeed_8,
tegra_clk_nor, tegra_clk_nor,
tegra_clk_nvdec,
tegra_clk_nvenc,
tegra_clk_nvjpg,
tegra_clk_owr, tegra_clk_owr,
tegra_clk_owr_8,
tegra_clk_pcie, tegra_clk_pcie,
tegra_clk_pclk, tegra_clk_pclk,
tegra_clk_pll_a, tegra_clk_pll_a,
tegra_clk_pll_a_out0, tegra_clk_pll_a_out0,
tegra_clk_pll_a1,
tegra_clk_pll_c, tegra_clk_pll_c,
tegra_clk_pll_c2, tegra_clk_pll_c2,
tegra_clk_pll_c3, tegra_clk_pll_c3,
tegra_clk_pll_c4, tegra_clk_pll_c4,
tegra_clk_pll_c4_out0,
tegra_clk_pll_c4_out1,
tegra_clk_pll_c4_out2,
tegra_clk_pll_c4_out3,
tegra_clk_pll_c_out1, tegra_clk_pll_c_out1,
tegra_clk_pll_d, tegra_clk_pll_d,
tegra_clk_pll_d2, tegra_clk_pll_d2,
...@@ -140,19 +163,29 @@ enum clk_id { ...@@ -140,19 +163,29 @@ enum clk_id {
tegra_clk_pll_d_out0, tegra_clk_pll_d_out0,
tegra_clk_pll_dp, tegra_clk_pll_dp,
tegra_clk_pll_e_out0, tegra_clk_pll_e_out0,
tegra_clk_pll_g_ref,
tegra_clk_pll_m, tegra_clk_pll_m,
tegra_clk_pll_m_out1, tegra_clk_pll_m_out1,
tegra_clk_pll_mb,
tegra_clk_pll_p, tegra_clk_pll_p,
tegra_clk_pll_p_out1, tegra_clk_pll_p_out1,
tegra_clk_pll_p_out2, tegra_clk_pll_p_out2,
tegra_clk_pll_p_out2_int, tegra_clk_pll_p_out2_int,
tegra_clk_pll_p_out3, tegra_clk_pll_p_out3,
tegra_clk_pll_p_out4, tegra_clk_pll_p_out4,
tegra_clk_pll_p_out4_cpu,
tegra_clk_pll_p_out5, tegra_clk_pll_p_out5,
tegra_clk_pll_p_out_hsio,
tegra_clk_pll_p_out_xusb,
tegra_clk_pll_p_out_cpu,
tegra_clk_pll_p_out_adsp,
tegra_clk_pll_ref, tegra_clk_pll_ref,
tegra_clk_pll_re_out, tegra_clk_pll_re_out,
tegra_clk_pll_re_vco, tegra_clk_pll_re_vco,
tegra_clk_pll_u, tegra_clk_pll_u,
tegra_clk_pll_u_out,
tegra_clk_pll_u_out1,
tegra_clk_pll_u_out2,
tegra_clk_pll_u_12m, tegra_clk_pll_u_12m,
tegra_clk_pll_u_480m, tegra_clk_pll_u_480m,
tegra_clk_pll_u_48m, tegra_clk_pll_u_48m,
...@@ -160,53 +193,80 @@ enum clk_id { ...@@ -160,53 +193,80 @@ enum clk_id {
tegra_clk_pll_x, tegra_clk_pll_x,
tegra_clk_pll_x_out0, tegra_clk_pll_x_out0,
tegra_clk_pwm, tegra_clk_pwm,
tegra_clk_qspi,
tegra_clk_rtc, tegra_clk_rtc,
tegra_clk_sata, tegra_clk_sata,
tegra_clk_sata_8,
tegra_clk_sata_cold, tegra_clk_sata_cold,
tegra_clk_sata_oob, tegra_clk_sata_oob,
tegra_clk_sata_oob_8,
tegra_clk_sbc1, tegra_clk_sbc1,
tegra_clk_sbc1_8, tegra_clk_sbc1_8,
tegra_clk_sbc1_9,
tegra_clk_sbc2, tegra_clk_sbc2,
tegra_clk_sbc2_8, tegra_clk_sbc2_8,
tegra_clk_sbc2_9,
tegra_clk_sbc3, tegra_clk_sbc3,
tegra_clk_sbc3_8, tegra_clk_sbc3_8,
tegra_clk_sbc3_9,
tegra_clk_sbc4, tegra_clk_sbc4,
tegra_clk_sbc4_8, tegra_clk_sbc4_8,
tegra_clk_sbc4_9,
tegra_clk_sbc5, tegra_clk_sbc5,
tegra_clk_sbc5_8, tegra_clk_sbc5_8,
tegra_clk_sbc6, tegra_clk_sbc6,
tegra_clk_sbc6_8, tegra_clk_sbc6_8,
tegra_clk_sclk, tegra_clk_sclk,
tegra_clk_sdmmc_legacy,
tegra_clk_sdmmc1, tegra_clk_sdmmc1,
tegra_clk_sdmmc1_8, tegra_clk_sdmmc1_8,
tegra_clk_sdmmc1_9,
tegra_clk_sdmmc2, tegra_clk_sdmmc2,
tegra_clk_sdmmc2_8, tegra_clk_sdmmc2_8,
tegra_clk_sdmmc2_9,
tegra_clk_sdmmc3, tegra_clk_sdmmc3,
tegra_clk_sdmmc3_8, tegra_clk_sdmmc3_8,
tegra_clk_sdmmc3_9,
tegra_clk_sdmmc4, tegra_clk_sdmmc4,
tegra_clk_sdmmc4_8, tegra_clk_sdmmc4_8,
tegra_clk_sdmmc4_9,
tegra_clk_se, tegra_clk_se,
tegra_clk_soc_therm, tegra_clk_soc_therm,
tegra_clk_soc_therm_8,
tegra_clk_sor0, tegra_clk_sor0,
tegra_clk_sor0_lvds, tegra_clk_sor0_lvds,
tegra_clk_sor1,
tegra_clk_sor1_brick,
tegra_clk_sor1_src,
tegra_clk_spdif, tegra_clk_spdif,
tegra_clk_spdif_2x, tegra_clk_spdif_2x,
tegra_clk_spdif_in, tegra_clk_spdif_in,
tegra_clk_spdif_in_8,
tegra_clk_spdif_in_sync, tegra_clk_spdif_in_sync,
tegra_clk_spdif_mux, tegra_clk_spdif_mux,
tegra_clk_spdif_out, tegra_clk_spdif_out,
tegra_clk_timer, tegra_clk_timer,
tegra_clk_trace, tegra_clk_trace,
tegra_clk_tsec, tegra_clk_tsec,
tegra_clk_tsec_8,
tegra_clk_tsecb,
tegra_clk_tsensor, tegra_clk_tsensor,
tegra_clk_tvdac, tegra_clk_tvdac,
tegra_clk_tvo, tegra_clk_tvo,
tegra_clk_uarta, tegra_clk_uarta,
tegra_clk_uarta_8,
tegra_clk_uartb, tegra_clk_uartb,
tegra_clk_uartb_8,
tegra_clk_uartc, tegra_clk_uartc,
tegra_clk_uartc_8,
tegra_clk_uartd, tegra_clk_uartd,
tegra_clk_uartd_8,
tegra_clk_uarte, tegra_clk_uarte,
tegra_clk_uarte_8,
tegra_clk_uartape,
tegra_clk_usb2, tegra_clk_usb2,
tegra_clk_usb2_hsic_trk,
tegra_clk_usb2_trk,
tegra_clk_usb3, tegra_clk_usb3,
tegra_clk_usbd, tegra_clk_usbd,
tegra_clk_vcp, tegra_clk_vcp,
...@@ -216,22 +276,35 @@ enum clk_id { ...@@ -216,22 +276,35 @@ enum clk_id {
tegra_clk_vi, tegra_clk_vi,
tegra_clk_vi_8, tegra_clk_vi_8,
tegra_clk_vi_9, tegra_clk_vi_9,
tegra_clk_vi_10,
tegra_clk_vi_i2c,
tegra_clk_vic03, tegra_clk_vic03,
tegra_clk_vic03_8,
tegra_clk_vim2_clk, tegra_clk_vim2_clk,
tegra_clk_vimclk_sync, tegra_clk_vimclk_sync,
tegra_clk_vi_sensor, tegra_clk_vi_sensor,
tegra_clk_vi_sensor2,
tegra_clk_vi_sensor_8, tegra_clk_vi_sensor_8,
tegra_clk_vi_sensor_9,
tegra_clk_vi_sensor2,
tegra_clk_vi_sensor2_8,
tegra_clk_xusb_dev, tegra_clk_xusb_dev,
tegra_clk_xusb_dev_src, tegra_clk_xusb_dev_src,
tegra_clk_xusb_dev_src_8,
tegra_clk_xusb_falcon_src, tegra_clk_xusb_falcon_src,
tegra_clk_xusb_falcon_src_8,
tegra_clk_xusb_fs_src, tegra_clk_xusb_fs_src,
tegra_clk_xusb_gate,
tegra_clk_xusb_host, tegra_clk_xusb_host,
tegra_clk_xusb_host_src, tegra_clk_xusb_host_src,
tegra_clk_xusb_host_src_8,
tegra_clk_xusb_hs_src, tegra_clk_xusb_hs_src,
tegra_clk_xusb_hs_src_4,
tegra_clk_xusb_ss, tegra_clk_xusb_ss,
tegra_clk_xusb_ss_src, tegra_clk_xusb_ss_src,
tegra_clk_xusb_ss_src_8,
tegra_clk_xusb_ss_div2, tegra_clk_xusb_ss_div2,
tegra_clk_xusb_ssp_src,
tegra_clk_sclk_mux,
tegra_clk_max, tegra_clk_max,
}; };
......
此差异已折叠。
...@@ -34,9 +34,25 @@ ...@@ -34,9 +34,25 @@
#define CCLKLP_BURST_POLICY 0x370 #define CCLKLP_BURST_POLICY 0x370
#define SCLK_BURST_POLICY 0x028 #define SCLK_BURST_POLICY 0x028
#define SYSTEM_CLK_RATE 0x030 #define SYSTEM_CLK_RATE 0x030
#define SCLK_DIVIDER 0x2c
static DEFINE_SPINLOCK(sysrate_lock); static DEFINE_SPINLOCK(sysrate_lock);
enum tegra_super_gen {
gen4 = 4,
gen5,
};
struct tegra_super_gen_info {
enum tegra_super_gen gen;
const char **sclk_parents;
const char **cclk_g_parents;
const char **cclk_lp_parents;
int num_sclk_parents;
int num_cclk_g_parents;
int num_cclk_lp_parents;
};
static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4", static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",
"pll_p", "pll_p_out2", "unused", "pll_p", "pll_p_out2", "unused",
"clk_32k", "pll_m_out1" }; "clk_32k", "pll_m_out1" };
...@@ -51,21 +67,81 @@ static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m", ...@@ -51,21 +67,81 @@ static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
"pll_p", "pll_p_out4", "unused", "pll_p", "pll_p_out4", "unused",
"unused", "pll_x", "pll_x_out0" }; "unused", "pll_x", "pll_x_out0" };
const struct tegra_super_gen_info tegra_super_gen_info_gen4 = {
.gen = gen4,
.sclk_parents = sclk_parents,
.cclk_g_parents = cclk_g_parents,
.cclk_lp_parents = cclk_lp_parents,
.num_sclk_parents = ARRAY_SIZE(sclk_parents),
.num_cclk_g_parents = ARRAY_SIZE(cclk_g_parents),
.num_cclk_lp_parents = ARRAY_SIZE(cclk_lp_parents),
};
static const char *sclk_parents_gen5[] = { "clk_m", "pll_c_out1", "pll_c4_out3",
"pll_p", "pll_p_out2", "pll_c4_out1",
"clk_32k", "pll_c4_out2" };
static const char *cclk_g_parents_gen5[] = { "clk_m", "unused", "clk_32k", "unused",
"pll_p", "pll_p_out4", "unused",
"unused", "pll_x", "unused", "unused",
"unused", "unused", "unused", "unused",
"dfllCPU_out" };
static const char *cclk_lp_parents_gen5[] = { "clk_m", "unused", "clk_32k", "unused",
"pll_p", "pll_p_out4", "unused",
"unused", "pll_x", "unused", "unused",
"unused", "unused", "unused", "unused",
"dfllCPU_out" };
const struct tegra_super_gen_info tegra_super_gen_info_gen5 = {
.gen = gen5,
.sclk_parents = sclk_parents_gen5,
.cclk_g_parents = cclk_g_parents_gen5,
.cclk_lp_parents = cclk_lp_parents_gen5,
.num_sclk_parents = ARRAY_SIZE(sclk_parents_gen5),
.num_cclk_g_parents = ARRAY_SIZE(cclk_g_parents_gen5),
.num_cclk_lp_parents = ARRAY_SIZE(cclk_lp_parents_gen5),
};
static void __init tegra_sclk_init(void __iomem *clk_base, static void __init tegra_sclk_init(void __iomem *clk_base,
struct tegra_clk *tegra_clks) struct tegra_clk *tegra_clks,
const struct tegra_super_gen_info *gen_info)
{ {
struct clk *clk; struct clk *clk;
struct clk **dt_clk; struct clk **dt_clk;
/* SCLK */ /* SCLK_MUX */
dt_clk = tegra_lookup_dt_id(tegra_clk_sclk, tegra_clks); dt_clk = tegra_lookup_dt_id(tegra_clk_sclk_mux, tegra_clks);
if (dt_clk) { if (dt_clk) {
clk = tegra_clk_register_super_mux("sclk", sclk_parents, clk = tegra_clk_register_super_mux("sclk_mux",
ARRAY_SIZE(sclk_parents), gen_info->sclk_parents,
gen_info->num_sclk_parents,
CLK_SET_RATE_PARENT, CLK_SET_RATE_PARENT,
clk_base + SCLK_BURST_POLICY, clk_base + SCLK_BURST_POLICY,
0, 4, 0, 0, NULL); 0, 4, 0, 0, NULL);
*dt_clk = clk; *dt_clk = clk;
/* SCLK */
dt_clk = tegra_lookup_dt_id(tegra_clk_sclk, tegra_clks);
if (dt_clk) {
clk = clk_register_divider(NULL, "sclk", "sclk_mux", 0,
clk_base + SCLK_DIVIDER, 0, 8,
0, &sysrate_lock);
*dt_clk = clk;
}
} else {
/* SCLK */
dt_clk = tegra_lookup_dt_id(tegra_clk_sclk, tegra_clks);
if (dt_clk) {
clk = tegra_clk_register_super_mux("sclk",
gen_info->sclk_parents,
gen_info->num_sclk_parents,
CLK_SET_RATE_PARENT,
clk_base + SCLK_BURST_POLICY,
0, 4, 0, 0, NULL);
*dt_clk = clk;
}
} }
/* HCLK */ /* HCLK */
...@@ -95,10 +171,11 @@ static void __init tegra_sclk_init(void __iomem *clk_base, ...@@ -95,10 +171,11 @@ static void __init tegra_sclk_init(void __iomem *clk_base,
*dt_clk = clk; *dt_clk = clk;
} }
void __init tegra_super_clk_gen4_init(void __iomem *clk_base, void __init tegra_super_clk_init(void __iomem *clk_base,
void __iomem *pmc_base, void __iomem *pmc_base,
struct tegra_clk *tegra_clks, struct tegra_clk *tegra_clks,
struct tegra_clk_pll_params *params) struct tegra_clk_pll_params *params,
const struct tegra_super_gen_info *gen_info)
{ {
struct clk *clk; struct clk *clk;
struct clk **dt_clk; struct clk **dt_clk;
...@@ -106,28 +183,50 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base, ...@@ -106,28 +183,50 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base,
/* CCLKG */ /* CCLKG */
dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_g, tegra_clks); dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_g, tegra_clks);
if (dt_clk) { if (dt_clk) {
clk = tegra_clk_register_super_mux("cclk_g", cclk_g_parents, if (gen_info->gen == gen5) {
ARRAY_SIZE(cclk_g_parents), clk = tegra_clk_register_super_mux("cclk_g",
gen_info->cclk_g_parents,
gen_info->num_cclk_g_parents,
CLK_SET_RATE_PARENT,
clk_base + CCLKG_BURST_POLICY,
0, 4, 8, 0, NULL);
} else {
clk = tegra_clk_register_super_mux("cclk_g",
gen_info->cclk_g_parents,
gen_info->num_cclk_g_parents,
CLK_SET_RATE_PARENT, CLK_SET_RATE_PARENT,
clk_base + CCLKG_BURST_POLICY, clk_base + CCLKG_BURST_POLICY,
0, 4, 0, 0, NULL); 0, 4, 0, 0, NULL);
}
*dt_clk = clk; *dt_clk = clk;
} }
/* CCLKLP */ /* CCLKLP */
dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_lp, tegra_clks); dt_clk = tegra_lookup_dt_id(tegra_clk_cclk_lp, tegra_clks);
if (dt_clk) { if (dt_clk) {
clk = tegra_clk_register_super_mux("cclk_lp", cclk_lp_parents, if (gen_info->gen == gen5) {
ARRAY_SIZE(cclk_lp_parents), clk = tegra_clk_register_super_mux("cclk_lp",
gen_info->cclk_lp_parents,
gen_info->num_cclk_lp_parents,
CLK_SET_RATE_PARENT,
clk_base + CCLKLP_BURST_POLICY,
0, 4, 8, 0, NULL);
} else {
clk = tegra_clk_register_super_mux("cclk_lp",
gen_info->cclk_lp_parents,
gen_info->num_cclk_lp_parents,
CLK_SET_RATE_PARENT, CLK_SET_RATE_PARENT,
clk_base + CCLKLP_BURST_POLICY, clk_base + CCLKLP_BURST_POLICY,
TEGRA_DIVIDER_2, 4, 8, 9, NULL); TEGRA_DIVIDER_2, 4, 8, 9, NULL);
}
*dt_clk = clk; *dt_clk = clk;
} }
tegra_sclk_init(clk_base, tegra_clks); tegra_sclk_init(clk_base, tegra_clks, gen_info);
#if defined(CONFIG_ARCH_TEGRA_114_SOC) || defined(CONFIG_ARCH_TEGRA_124_SOC) #if defined(CONFIG_ARCH_TEGRA_114_SOC) || \
defined(CONFIG_ARCH_TEGRA_124_SOC) || \
defined(CONFIG_ARCH_TEGRA_210_SOC)
/* PLLX */ /* PLLX */
dt_clk = tegra_lookup_dt_id(tegra_clk_pll_x, tegra_clks); dt_clk = tegra_lookup_dt_id(tegra_clk_pll_x, tegra_clks);
if (!dt_clk) if (!dt_clk)
...@@ -148,3 +247,20 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base, ...@@ -148,3 +247,20 @@ void __init tegra_super_clk_gen4_init(void __iomem *clk_base,
#endif #endif
} }
void __init tegra_super_clk_gen4_init(void __iomem *clk_base,
void __iomem *pmc_base,
struct tegra_clk *tegra_clks,
struct tegra_clk_pll_params *params)
{
tegra_super_clk_init(clk_base, pmc_base, tegra_clks, params,
&tegra_super_gen_info_gen4);
}
void __init tegra_super_clk_gen5_init(void __iomem *clk_base,
void __iomem *pmc_base,
struct tegra_clk *tegra_clks,
struct tegra_clk_pll_params *params)
{
tegra_super_clk_init(clk_base, pmc_base, tegra_clks, params,
&tegra_super_gen_info_gen5);
}
...@@ -182,40 +182,40 @@ static struct div_nmp pllxc_nmp = { ...@@ -182,40 +182,40 @@ static struct div_nmp pllxc_nmp = {
.divp_width = 4, .divp_width = 4,
}; };
static struct pdiv_map pllxc_p[] = { static const struct pdiv_map pllxc_p[] = {
{ .pdiv = 1, .hw_val = 0 }, { .pdiv = 1, .hw_val = 0 },
{ .pdiv = 2, .hw_val = 1 }, { .pdiv = 2, .hw_val = 1 },
{ .pdiv = 3, .hw_val = 2 }, { .pdiv = 3, .hw_val = 2 },
{ .pdiv = 4, .hw_val = 3 }, { .pdiv = 4, .hw_val = 3 },
{ .pdiv = 5, .hw_val = 4 }, { .pdiv = 5, .hw_val = 4 },
{ .pdiv = 6, .hw_val = 5 }, { .pdiv = 6, .hw_val = 5 },
{ .pdiv = 8, .hw_val = 6 }, { .pdiv = 8, .hw_val = 6 },
{ .pdiv = 10, .hw_val = 7 }, { .pdiv = 10, .hw_val = 7 },
{ .pdiv = 12, .hw_val = 8 }, { .pdiv = 12, .hw_val = 8 },
{ .pdiv = 16, .hw_val = 9 }, { .pdiv = 16, .hw_val = 9 },
{ .pdiv = 12, .hw_val = 10 }, { .pdiv = 12, .hw_val = 10 },
{ .pdiv = 16, .hw_val = 11 }, { .pdiv = 16, .hw_val = 11 },
{ .pdiv = 20, .hw_val = 12 }, { .pdiv = 20, .hw_val = 12 },
{ .pdiv = 24, .hw_val = 13 }, { .pdiv = 24, .hw_val = 13 },
{ .pdiv = 32, .hw_val = 14 }, { .pdiv = 32, .hw_val = 14 },
{ .pdiv = 0, .hw_val = 0 }, { .pdiv = 0, .hw_val = 0 },
}; };
static struct tegra_clk_pll_freq_table pll_c_freq_table[] = { static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
{ 12000000, 624000000, 104, 0, 2}, { 12000000, 624000000, 104, 1, 2, 0 },
{ 12000000, 600000000, 100, 0, 2}, { 12000000, 600000000, 100, 1, 2, 0 },
{ 13000000, 600000000, 92, 0, 2}, /* actual: 598.0 MHz */ { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
{ 16800000, 600000000, 71, 0, 2}, /* actual: 596.4 MHz */ { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
{ 19200000, 600000000, 62, 0, 2}, /* actual: 595.2 MHz */ { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
{ 26000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */ { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_params pll_c_params = { static struct tegra_clk_pll_params pll_c_params = {
.input_min = 12000000, .input_min = 12000000,
.input_max = 800000000, .input_max = 800000000,
.cf_min = 12000000, .cf_min = 12000000,
.cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
.vco_min = 600000000, .vco_min = 600000000,
.vco_max = 1400000000, .vco_max = 1400000000,
.base_reg = PLLC_BASE, .base_reg = PLLC_BASE,
...@@ -232,7 +232,7 @@ static struct tegra_clk_pll_params pll_c_params = { ...@@ -232,7 +232,7 @@ static struct tegra_clk_pll_params pll_c_params = {
.pdiv_tohw = pllxc_p, .pdiv_tohw = pllxc_p,
.div_nmp = &pllxc_nmp, .div_nmp = &pllxc_nmp,
.freq_table = pll_c_freq_table, .freq_table = pll_c_freq_table,
.flags = TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct div_nmp pllcx_nmp = { static struct div_nmp pllcx_nmp = {
...@@ -244,22 +244,22 @@ static struct div_nmp pllcx_nmp = { ...@@ -244,22 +244,22 @@ static struct div_nmp pllcx_nmp = {
.divp_width = 3, .divp_width = 3,
}; };
static struct pdiv_map pllc_p[] = { static const struct pdiv_map pllc_p[] = {
{ .pdiv = 1, .hw_val = 0 }, { .pdiv = 1, .hw_val = 0 },
{ .pdiv = 2, .hw_val = 1 }, { .pdiv = 2, .hw_val = 1 },
{ .pdiv = 4, .hw_val = 3 }, { .pdiv = 4, .hw_val = 3 },
{ .pdiv = 8, .hw_val = 5 }, { .pdiv = 8, .hw_val = 5 },
{ .pdiv = 16, .hw_val = 7 }, { .pdiv = 16, .hw_val = 7 },
{ .pdiv = 0, .hw_val = 0 }, { .pdiv = 0, .hw_val = 0 },
}; };
static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = { static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
{12000000, 600000000, 100, 0, 2}, { 12000000, 600000000, 100, 1, 2, 0 },
{13000000, 600000000, 92, 0, 2}, /* actual: 598.0 MHz */ { 13000000, 600000000, 92, 1, 2, 0 }, /* actual: 598.0 MHz */
{16800000, 600000000, 71, 0, 2}, /* actual: 596.4 MHz */ { 16800000, 600000000, 71, 1, 2, 0 }, /* actual: 596.4 MHz */
{19200000, 600000000, 62, 0, 2}, /* actual: 595.2 MHz */ { 19200000, 600000000, 62, 1, 2, 0 }, /* actual: 595.2 MHz */
{26000000, 600000000, 92, 1, 2}, /* actual: 598.0 MHz */ { 26000000, 600000000, 92, 2, 2, 0 }, /* actual: 598.0 MHz */
{0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_params pll_c2_params = { static struct tegra_clk_pll_params pll_c2_params = {
...@@ -318,26 +318,26 @@ static struct div_nmp pllm_nmp = { ...@@ -318,26 +318,26 @@ static struct div_nmp pllm_nmp = {
.override_divp_shift = 27, .override_divp_shift = 27,
}; };
static struct pdiv_map pllm_p[] = { static const struct pdiv_map pllm_p[] = {
{ .pdiv = 1, .hw_val = 0 }, { .pdiv = 1, .hw_val = 0 },
{ .pdiv = 2, .hw_val = 1 }, { .pdiv = 2, .hw_val = 1 },
{ .pdiv = 0, .hw_val = 0 }, { .pdiv = 0, .hw_val = 0 },
}; };
static struct tegra_clk_pll_freq_table pll_m_freq_table[] = { static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
{12000000, 800000000, 66, 0, 1}, /* actual: 792.0 MHz */ { 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
{13000000, 800000000, 61, 0, 1}, /* actual: 793.0 MHz */ { 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
{16800000, 800000000, 47, 0, 1}, /* actual: 789.6 MHz */ { 16800000, 800000000, 47, 1, 1, 0 }, /* actual: 789.6 MHz */
{19200000, 800000000, 41, 0, 1}, /* actual: 787.2 MHz */ { 19200000, 800000000, 41, 1, 1, 0 }, /* actual: 787.2 MHz */
{26000000, 800000000, 61, 1, 1}, /* actual: 793.0 MHz */ { 26000000, 800000000, 61, 2, 1, 0 }, /* actual: 793.0 MHz */
{0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_params pll_m_params = { static struct tegra_clk_pll_params pll_m_params = {
.input_min = 12000000, .input_min = 12000000,
.input_max = 500000000, .input_max = 500000000,
.cf_min = 12000000, .cf_min = 12000000,
.cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
.vco_min = 400000000, .vco_min = 400000000,
.vco_max = 1066000000, .vco_max = 1066000000,
.base_reg = PLLM_BASE, .base_reg = PLLM_BASE,
...@@ -351,7 +351,8 @@ static struct tegra_clk_pll_params pll_m_params = { ...@@ -351,7 +351,8 @@ static struct tegra_clk_pll_params pll_m_params = {
.pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE, .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
.pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2, .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
.freq_table = pll_m_freq_table, .freq_table = pll_m_freq_table,
.flags = TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
TEGRA_PLL_FIXED,
}; };
static struct div_nmp pllp_nmp = { static struct div_nmp pllp_nmp = {
...@@ -364,12 +365,12 @@ static struct div_nmp pllp_nmp = { ...@@ -364,12 +365,12 @@ static struct div_nmp pllp_nmp = {
}; };
static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
{12000000, 216000000, 432, 12, 1, 8}, { 12000000, 216000000, 432, 12, 2, 8 },
{13000000, 216000000, 432, 13, 1, 8}, { 13000000, 216000000, 432, 13, 2, 8 },
{16800000, 216000000, 360, 14, 1, 8}, { 16800000, 216000000, 360, 14, 2, 8 },
{19200000, 216000000, 360, 16, 1, 8}, { 19200000, 216000000, 360, 16, 2, 8 },
{26000000, 216000000, 432, 26, 1, 8}, { 26000000, 216000000, 432, 26, 2, 8 },
{0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_params pll_p_params = { static struct tegra_clk_pll_params pll_p_params = {
...@@ -386,19 +387,19 @@ static struct tegra_clk_pll_params pll_p_params = { ...@@ -386,19 +387,19 @@ static struct tegra_clk_pll_params pll_p_params = {
.lock_delay = 300, .lock_delay = 300,
.div_nmp = &pllp_nmp, .div_nmp = &pllp_nmp,
.freq_table = pll_p_freq_table, .freq_table = pll_p_freq_table,
.flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK |
TEGRA_PLL_HAS_LOCK_ENABLE,
.fixed_rate = 408000000, .fixed_rate = 408000000,
}; };
static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
{9600000, 282240000, 147, 5, 0, 4}, { 9600000, 282240000, 147, 5, 1, 4 },
{9600000, 368640000, 192, 5, 0, 4}, { 9600000, 368640000, 192, 5, 1, 4 },
{9600000, 240000000, 200, 8, 0, 8}, { 9600000, 240000000, 200, 8, 1, 8 },
{ 28800000, 282240000, 245, 25, 1, 8 },
{28800000, 282240000, 245, 25, 0, 8}, { 28800000, 368640000, 320, 25, 1, 8 },
{28800000, 368640000, 320, 25, 0, 8}, { 28800000, 240000000, 200, 24, 1, 8 },
{28800000, 240000000, 200, 24, 0, 8}, { 0, 0, 0, 0, 0, 0 },
{0, 0, 0, 0, 0, 0},
}; };
...@@ -416,28 +417,26 @@ static struct tegra_clk_pll_params pll_a_params = { ...@@ -416,28 +417,26 @@ static struct tegra_clk_pll_params pll_a_params = {
.lock_delay = 300, .lock_delay = 300,
.div_nmp = &pllp_nmp, .div_nmp = &pllp_nmp,
.freq_table = pll_a_freq_table, .freq_table = pll_a_freq_table,
.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK |
TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
{12000000, 216000000, 864, 12, 2, 12}, { 12000000, 216000000, 864, 12, 4, 12 },
{13000000, 216000000, 864, 13, 2, 12}, { 13000000, 216000000, 864, 13, 4, 12 },
{16800000, 216000000, 720, 14, 2, 12}, { 16800000, 216000000, 720, 14, 4, 12 },
{19200000, 216000000, 720, 16, 2, 12}, { 19200000, 216000000, 720, 16, 4, 12 },
{26000000, 216000000, 864, 26, 2, 12}, { 26000000, 216000000, 864, 26, 4, 12 },
{ 12000000, 594000000, 594, 12, 1, 12 },
{12000000, 594000000, 594, 12, 0, 12}, { 13000000, 594000000, 594, 13, 1, 12 },
{13000000, 594000000, 594, 13, 0, 12}, { 16800000, 594000000, 495, 14, 1, 12 },
{16800000, 594000000, 495, 14, 0, 12}, { 19200000, 594000000, 495, 16, 1, 12 },
{19200000, 594000000, 495, 16, 0, 12}, { 26000000, 594000000, 594, 26, 1, 12 },
{26000000, 594000000, 594, 26, 0, 12}, { 12000000, 1000000000, 1000, 12, 1, 12 },
{ 13000000, 1000000000, 1000, 13, 1, 12 },
{12000000, 1000000000, 1000, 12, 0, 12}, { 19200000, 1000000000, 625, 12, 1, 12 },
{13000000, 1000000000, 1000, 13, 0, 12}, { 26000000, 1000000000, 1000, 26, 1, 12 },
{19200000, 1000000000, 625, 12, 0, 12}, { 0, 0, 0, 0, 0, 0 },
{26000000, 1000000000, 1000, 26, 0, 12},
{0, 0, 0, 0, 0, 0},
}; };
static struct tegra_clk_pll_params pll_d_params = { static struct tegra_clk_pll_params pll_d_params = {
...@@ -455,7 +454,7 @@ static struct tegra_clk_pll_params pll_d_params = { ...@@ -455,7 +454,7 @@ static struct tegra_clk_pll_params pll_d_params = {
.div_nmp = &pllp_nmp, .div_nmp = &pllp_nmp,
.freq_table = pll_d_freq_table, .freq_table = pll_d_freq_table,
.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
TEGRA_PLL_USE_LOCK, TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_d2_params = { static struct tegra_clk_pll_params pll_d2_params = {
...@@ -473,10 +472,10 @@ static struct tegra_clk_pll_params pll_d2_params = { ...@@ -473,10 +472,10 @@ static struct tegra_clk_pll_params pll_d2_params = {
.div_nmp = &pllp_nmp, .div_nmp = &pllp_nmp,
.freq_table = pll_d_freq_table, .freq_table = pll_d_freq_table,
.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
TEGRA_PLL_USE_LOCK, TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct pdiv_map pllu_p[] = { static const struct pdiv_map pllu_p[] = {
{ .pdiv = 1, .hw_val = 1 }, { .pdiv = 1, .hw_val = 1 },
{ .pdiv = 2, .hw_val = 0 }, { .pdiv = 2, .hw_val = 0 },
{ .pdiv = 0, .hw_val = 0 }, { .pdiv = 0, .hw_val = 0 },
...@@ -492,12 +491,12 @@ static struct div_nmp pllu_nmp = { ...@@ -492,12 +491,12 @@ static struct div_nmp pllu_nmp = {
}; };
static struct tegra_clk_pll_freq_table pll_u_freq_table[] = { static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
{12000000, 480000000, 960, 12, 0, 12}, { 12000000, 480000000, 960, 12, 2, 12 },
{13000000, 480000000, 960, 13, 0, 12}, { 13000000, 480000000, 960, 13, 2, 12 },
{16800000, 480000000, 400, 7, 0, 5}, { 16800000, 480000000, 400, 7, 2, 5 },
{19200000, 480000000, 200, 4, 0, 3}, { 19200000, 480000000, 200, 4, 2, 3 },
{26000000, 480000000, 960, 26, 0, 12}, { 26000000, 480000000, 960, 26, 2, 12 },
{0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_params pll_u_params = { static struct tegra_clk_pll_params pll_u_params = {
...@@ -516,25 +515,24 @@ static struct tegra_clk_pll_params pll_u_params = { ...@@ -516,25 +515,24 @@ static struct tegra_clk_pll_params pll_u_params = {
.div_nmp = &pllu_nmp, .div_nmp = &pllu_nmp,
.freq_table = pll_u_freq_table, .freq_table = pll_u_freq_table,
.flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON | .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
TEGRA_PLL_USE_LOCK, TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
/* 1 GHz */ /* 1 GHz */
{12000000, 1000000000, 83, 0, 1}, /* actual: 996.0 MHz */ { 12000000, 1000000000, 83, 1, 1, 0 }, /* actual: 996.0 MHz */
{13000000, 1000000000, 76, 0, 1}, /* actual: 988.0 MHz */ { 13000000, 1000000000, 76, 1, 1, 0 }, /* actual: 988.0 MHz */
{16800000, 1000000000, 59, 0, 1}, /* actual: 991.2 MHz */ { 16800000, 1000000000, 59, 1, 1, 0 }, /* actual: 991.2 MHz */
{19200000, 1000000000, 52, 0, 1}, /* actual: 998.4 MHz */ { 19200000, 1000000000, 52, 1, 1, 0 }, /* actual: 998.4 MHz */
{26000000, 1000000000, 76, 1, 1}, /* actual: 988.0 MHz */ { 26000000, 1000000000, 76, 2, 1, 0 }, /* actual: 988.0 MHz */
{ 0, 0, 0, 0, 0, 0 },
{0, 0, 0, 0, 0, 0},
}; };
static struct tegra_clk_pll_params pll_x_params = { static struct tegra_clk_pll_params pll_x_params = {
.input_min = 12000000, .input_min = 12000000,
.input_max = 800000000, .input_max = 800000000,
.cf_min = 12000000, .cf_min = 12000000,
.cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */ .cf_max = 19200000, /* s/w policy, h/w capability 50 MHz */
.vco_min = 700000000, .vco_min = 700000000,
.vco_max = 2400000000U, .vco_max = 2400000000U,
.base_reg = PLLX_BASE, .base_reg = PLLX_BASE,
...@@ -551,15 +549,34 @@ static struct tegra_clk_pll_params pll_x_params = { ...@@ -551,15 +549,34 @@ static struct tegra_clk_pll_params pll_x_params = {
.pdiv_tohw = pllxc_p, .pdiv_tohw = pllxc_p,
.div_nmp = &pllxc_nmp, .div_nmp = &pllxc_nmp,
.freq_table = pll_x_freq_table, .freq_table = pll_x_freq_table,
.flags = TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
/* PLLE special case: use cpcon field to store cml divider value */ /* PLLE special case: use cpcon field to store cml divider value */
{336000000, 100000000, 100, 21, 16, 11}, { 336000000, 100000000, 100, 21, 16, 11 },
{312000000, 100000000, 200, 26, 24, 13}, { 312000000, 100000000, 200, 26, 24, 13 },
{12000000, 100000000, 200, 1, 24, 13}, { 12000000, 100000000, 200, 1, 24, 13 },
{0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0 },
};
static const struct pdiv_map plle_p[] = {
{ .pdiv = 1, .hw_val = 0 },
{ .pdiv = 2, .hw_val = 1 },
{ .pdiv = 3, .hw_val = 2 },
{ .pdiv = 4, .hw_val = 3 },
{ .pdiv = 5, .hw_val = 4 },
{ .pdiv = 6, .hw_val = 5 },
{ .pdiv = 8, .hw_val = 6 },
{ .pdiv = 10, .hw_val = 7 },
{ .pdiv = 12, .hw_val = 8 },
{ .pdiv = 16, .hw_val = 9 },
{ .pdiv = 12, .hw_val = 10 },
{ .pdiv = 16, .hw_val = 11 },
{ .pdiv = 20, .hw_val = 12 },
{ .pdiv = 24, .hw_val = 13 },
{ .pdiv = 32, .hw_val = 14 },
{ .pdiv = 0, .hw_val = 0 }
}; };
static struct div_nmp plle_nmp = { static struct div_nmp plle_nmp = {
...@@ -584,9 +601,10 @@ static struct tegra_clk_pll_params pll_e_params = { ...@@ -584,9 +601,10 @@ static struct tegra_clk_pll_params pll_e_params = {
.lock_mask = PLLE_MISC_LOCK, .lock_mask = PLLE_MISC_LOCK,
.lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.pdiv_tohw = plle_p,
.div_nmp = &plle_nmp, .div_nmp = &plle_nmp,
.freq_table = pll_e_freq_table, .freq_table = pll_e_freq_table,
.flags = TEGRA_PLL_FIXED, .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_LOCK_ENABLE,
.fixed_rate = 100000000, .fixed_rate = 100000000,
}; };
...@@ -614,18 +632,19 @@ static struct tegra_clk_pll_params pll_re_vco_params = { ...@@ -614,18 +632,19 @@ static struct tegra_clk_pll_params pll_re_vco_params = {
.iddq_reg = PLLRE_MISC, .iddq_reg = PLLRE_MISC,
.iddq_bit_idx = PLLRE_IDDQ_BIT, .iddq_bit_idx = PLLRE_IDDQ_BIT,
.div_nmp = &pllre_nmp, .div_nmp = &pllre_nmp,
.flags = TEGRA_PLL_USE_LOCK, .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
TEGRA_PLL_LOCK_MISC,
}; };
/* possible OSC frequencies in Hz */ /* possible OSC frequencies in Hz */
static unsigned long tegra114_input_freq[] = { static unsigned long tegra114_input_freq[] = {
[0] = 13000000, [ 0] = 13000000,
[1] = 16800000, [ 1] = 16800000,
[4] = 19200000, [ 4] = 19200000,
[5] = 38400000, [ 5] = 38400000,
[8] = 12000000, [ 8] = 12000000,
[9] = 48000000, [ 9] = 48000000,
[12] = 260000000, [12] = 26000000,
}; };
#define MASK(x) (BIT(x) - 1) #define MASK(x) (BIT(x) - 1)
...@@ -644,21 +663,27 @@ struct utmi_clk_param { ...@@ -644,21 +663,27 @@ struct utmi_clk_param {
}; };
static const struct utmi_clk_param utmi_parameters[] = { static const struct utmi_clk_param utmi_parameters[] = {
{.osc_frequency = 13000000, .enable_delay_count = 0x02, {
.stable_count = 0x33, .active_delay_count = 0x05, .osc_frequency = 13000000, .enable_delay_count = 0x02,
.xtal_freq_count = 0x7F}, .stable_count = 0x33, .active_delay_count = 0x05,
{.osc_frequency = 19200000, .enable_delay_count = 0x03, .xtal_freq_count = 0x7f
.stable_count = 0x4B, .active_delay_count = 0x06, }, {
.xtal_freq_count = 0xBB}, .osc_frequency = 19200000, .enable_delay_count = 0x03,
{.osc_frequency = 12000000, .enable_delay_count = 0x02, .stable_count = 0x4b, .active_delay_count = 0x06,
.stable_count = 0x2F, .active_delay_count = 0x04, .xtal_freq_count = 0xbb
.xtal_freq_count = 0x76}, }, {
{.osc_frequency = 26000000, .enable_delay_count = 0x04, .osc_frequency = 12000000, .enable_delay_count = 0x02,
.stable_count = 0x66, .active_delay_count = 0x09, .stable_count = 0x2f, .active_delay_count = 0x04,
.xtal_freq_count = 0xFE}, .xtal_freq_count = 0x76
{.osc_frequency = 16800000, .enable_delay_count = 0x03, }, {
.stable_count = 0x41, .active_delay_count = 0x0A, .osc_frequency = 26000000, .enable_delay_count = 0x04,
.xtal_freq_count = 0xA4}, .stable_count = 0x66, .active_delay_count = 0x09,
.xtal_freq_count = 0xfe
}, {
.osc_frequency = 16800000, .enable_delay_count = 0x03,
.stable_count = 0x41, .active_delay_count = 0x0a,
.xtal_freq_count = 0xa4
},
}; };
/* peripheral mux definitions */ /* peripheral mux definitions */
...@@ -965,8 +990,8 @@ static void __init tegra114_fixed_clk_init(void __iomem *clk_base) ...@@ -965,8 +990,8 @@ static void __init tegra114_fixed_clk_init(void __iomem *clk_base)
static __init void tegra114_utmi_param_configure(void __iomem *clk_base) static __init void tegra114_utmi_param_configure(void __iomem *clk_base)
{ {
unsigned int i;
u32 reg; u32 reg;
int i;
for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) { for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
if (osc_freq == utmi_parameters[i].osc_frequency) if (osc_freq == utmi_parameters[i].osc_frequency)
...@@ -1173,7 +1198,7 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base, ...@@ -1173,7 +1198,7 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base,
{ {
struct clk *clk; struct clk *clk;
struct tegra_periph_init_data *data; struct tegra_periph_init_data *data;
int i; unsigned int i;
/* xusb_ss_div2 */ /* xusb_ss_div2 */
clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0, clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
...@@ -1278,7 +1303,7 @@ static struct tegra_cpu_car_ops tegra114_cpu_car_ops = { ...@@ -1278,7 +1303,7 @@ static struct tegra_cpu_car_ops tegra114_cpu_car_ops = {
static const struct of_device_id pmc_match[] __initconst = { static const struct of_device_id pmc_match[] __initconst = {
{ .compatible = "nvidia,tegra114-pmc" }, { .compatible = "nvidia,tegra114-pmc" },
{}, { },
}; };
/* /*
...@@ -1286,37 +1311,37 @@ static const struct of_device_id pmc_match[] __initconst = { ...@@ -1286,37 +1311,37 @@ static const struct of_device_id pmc_match[] __initconst = {
* breaks * breaks
*/ */
static struct tegra_clk_init_table init_table[] __initdata = { static struct tegra_clk_init_table init_table[] __initdata = {
{TEGRA114_CLK_UARTA, TEGRA114_CLK_PLL_P, 408000000, 0}, { TEGRA114_CLK_UARTA, TEGRA114_CLK_PLL_P, 408000000, 0 },
{TEGRA114_CLK_UARTB, TEGRA114_CLK_PLL_P, 408000000, 0}, { TEGRA114_CLK_UARTB, TEGRA114_CLK_PLL_P, 408000000, 0 },
{TEGRA114_CLK_UARTC, TEGRA114_CLK_PLL_P, 408000000, 0}, { TEGRA114_CLK_UARTC, TEGRA114_CLK_PLL_P, 408000000, 0 },
{TEGRA114_CLK_UARTD, TEGRA114_CLK_PLL_P, 408000000, 0}, { TEGRA114_CLK_UARTD, TEGRA114_CLK_PLL_P, 408000000, 0 },
{TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 1}, { TEGRA114_CLK_PLL_A, TEGRA114_CLK_CLK_MAX, 564480000, 1 },
{TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 1}, { TEGRA114_CLK_PLL_A_OUT0, TEGRA114_CLK_CLK_MAX, 11289600, 1 },
{TEGRA114_CLK_EXTERN1, TEGRA114_CLK_PLL_A_OUT0, 0, 1}, { TEGRA114_CLK_EXTERN1, TEGRA114_CLK_PLL_A_OUT0, 0, 1 },
{TEGRA114_CLK_CLK_OUT_1_MUX, TEGRA114_CLK_EXTERN1, 0, 1}, { TEGRA114_CLK_CLK_OUT_1_MUX, TEGRA114_CLK_EXTERN1, 0, 1 },
{TEGRA114_CLK_CLK_OUT_1, TEGRA114_CLK_CLK_MAX, 0, 1}, { TEGRA114_CLK_CLK_OUT_1, TEGRA114_CLK_CLK_MAX, 0, 1 },
{TEGRA114_CLK_I2S0, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA114_CLK_I2S0, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA114_CLK_I2S1, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA114_CLK_I2S1, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA114_CLK_I2S2, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA114_CLK_I2S2, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA114_CLK_I2S3, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA114_CLK_I2S3, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA114_CLK_I2S4, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA114_CLK_I2S4, TEGRA114_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA114_CLK_HOST1X, TEGRA114_CLK_PLL_P, 136000000, 0}, { TEGRA114_CLK_HOST1X, TEGRA114_CLK_PLL_P, 136000000, 0 },
{TEGRA114_CLK_DFLL_SOC, TEGRA114_CLK_PLL_P, 51000000, 1}, { TEGRA114_CLK_DFLL_SOC, TEGRA114_CLK_PLL_P, 51000000, 1 },
{TEGRA114_CLK_DFLL_REF, TEGRA114_CLK_PLL_P, 51000000, 1}, { TEGRA114_CLK_DFLL_REF, TEGRA114_CLK_PLL_P, 51000000, 1 },
{TEGRA114_CLK_DISP1, TEGRA114_CLK_PLL_P, 0, 0}, { TEGRA114_CLK_DISP1, TEGRA114_CLK_PLL_P, 0, 0 },
{TEGRA114_CLK_DISP2, TEGRA114_CLK_PLL_P, 0, 0}, { TEGRA114_CLK_DISP2, TEGRA114_CLK_PLL_P, 0, 0 },
{TEGRA114_CLK_GR2D, TEGRA114_CLK_PLL_C2, 300000000, 0}, { TEGRA114_CLK_GR2D, TEGRA114_CLK_PLL_C2, 300000000, 0 },
{TEGRA114_CLK_GR3D, TEGRA114_CLK_PLL_C2, 300000000, 0}, { TEGRA114_CLK_GR3D, TEGRA114_CLK_PLL_C2, 300000000, 0 },
{TEGRA114_CLK_DSIALP, TEGRA114_CLK_PLL_P, 68000000, 0}, { TEGRA114_CLK_DSIALP, TEGRA114_CLK_PLL_P, 68000000, 0 },
{TEGRA114_CLK_DSIBLP, TEGRA114_CLK_PLL_P, 68000000, 0}, { TEGRA114_CLK_DSIBLP, TEGRA114_CLK_PLL_P, 68000000, 0 },
{TEGRA114_CLK_PLL_RE_VCO, TEGRA114_CLK_CLK_MAX, 612000000, 0}, { TEGRA114_CLK_PLL_RE_VCO, TEGRA114_CLK_CLK_MAX, 612000000, 0 },
{TEGRA114_CLK_XUSB_SS_SRC, TEGRA114_CLK_PLL_RE_OUT, 122400000, 0}, { TEGRA114_CLK_XUSB_SS_SRC, TEGRA114_CLK_PLL_RE_OUT, 122400000, 0 },
{TEGRA114_CLK_XUSB_FS_SRC, TEGRA114_CLK_PLL_U_48M, 48000000, 0}, { TEGRA114_CLK_XUSB_FS_SRC, TEGRA114_CLK_PLL_U_48M, 48000000, 0 },
{TEGRA114_CLK_XUSB_HS_SRC, TEGRA114_CLK_XUSB_SS_DIV2, 61200000, 0}, { TEGRA114_CLK_XUSB_HS_SRC, TEGRA114_CLK_XUSB_SS_DIV2, 61200000, 0 },
{TEGRA114_CLK_XUSB_FALCON_SRC, TEGRA114_CLK_PLL_P, 204000000, 0}, { TEGRA114_CLK_XUSB_FALCON_SRC, TEGRA114_CLK_PLL_P, 204000000, 0 },
{TEGRA114_CLK_XUSB_HOST_SRC, TEGRA114_CLK_PLL_P, 102000000, 0}, { TEGRA114_CLK_XUSB_HOST_SRC, TEGRA114_CLK_PLL_P, 102000000, 0 },
/* This MUST be the last entry. */ /* must be the last entry */
{TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0}, { TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0 },
}; };
static void __init tegra114_clock_apply_init_table(void) static void __init tegra114_clock_apply_init_table(void)
......
此差异已折叠。
...@@ -166,126 +166,120 @@ static DEFINE_SPINLOCK(emc_lock); ...@@ -166,126 +166,120 @@ static DEFINE_SPINLOCK(emc_lock);
static struct clk **clks; static struct clk **clks;
static struct tegra_clk_pll_freq_table pll_c_freq_table[] = { static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
{ 12000000, 600000000, 600, 12, 0, 8 }, { 12000000, 600000000, 600, 12, 1, 8 },
{ 13000000, 600000000, 600, 13, 0, 8 }, { 13000000, 600000000, 600, 13, 1, 8 },
{ 19200000, 600000000, 500, 16, 0, 6 }, { 19200000, 600000000, 500, 16, 1, 6 },
{ 26000000, 600000000, 600, 26, 0, 8 }, { 26000000, 600000000, 600, 26, 1, 8 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_m_freq_table[] = { static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
{ 12000000, 666000000, 666, 12, 0, 8}, { 12000000, 666000000, 666, 12, 1, 8 },
{ 13000000, 666000000, 666, 13, 0, 8}, { 13000000, 666000000, 666, 13, 1, 8 },
{ 19200000, 666000000, 555, 16, 0, 8}, { 19200000, 666000000, 555, 16, 1, 8 },
{ 26000000, 666000000, 666, 26, 0, 8}, { 26000000, 666000000, 666, 26, 1, 8 },
{ 12000000, 600000000, 600, 12, 0, 8}, { 12000000, 600000000, 600, 12, 1, 8 },
{ 13000000, 600000000, 600, 13, 0, 8}, { 13000000, 600000000, 600, 13, 1, 8 },
{ 19200000, 600000000, 375, 12, 0, 6}, { 19200000, 600000000, 375, 12, 1, 6 },
{ 26000000, 600000000, 600, 26, 0, 8}, { 26000000, 600000000, 600, 26, 1, 8 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_p_freq_table[] = { static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
{ 12000000, 216000000, 432, 12, 1, 8}, { 12000000, 216000000, 432, 12, 2, 8 },
{ 13000000, 216000000, 432, 13, 1, 8}, { 13000000, 216000000, 432, 13, 2, 8 },
{ 19200000, 216000000, 90, 4, 1, 1}, { 19200000, 216000000, 90, 4, 2, 1 },
{ 26000000, 216000000, 432, 26, 1, 8}, { 26000000, 216000000, 432, 26, 2, 8 },
{ 12000000, 432000000, 432, 12, 0, 8}, { 12000000, 432000000, 432, 12, 1, 8 },
{ 13000000, 432000000, 432, 13, 0, 8}, { 13000000, 432000000, 432, 13, 1, 8 },
{ 19200000, 432000000, 90, 4, 0, 1}, { 19200000, 432000000, 90, 4, 1, 1 },
{ 26000000, 432000000, 432, 26, 0, 8}, { 26000000, 432000000, 432, 26, 1, 8 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_a_freq_table[] = { static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
{ 28800000, 56448000, 49, 25, 0, 1}, { 28800000, 56448000, 49, 25, 1, 1 },
{ 28800000, 73728000, 64, 25, 0, 1}, { 28800000, 73728000, 64, 25, 1, 1 },
{ 28800000, 24000000, 5, 6, 0, 1}, { 28800000, 24000000, 5, 6, 1, 1 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_d_freq_table[] = { static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
{ 12000000, 216000000, 216, 12, 0, 4}, { 12000000, 216000000, 216, 12, 1, 4 },
{ 13000000, 216000000, 216, 13, 0, 4}, { 13000000, 216000000, 216, 13, 1, 4 },
{ 19200000, 216000000, 135, 12, 0, 3}, { 19200000, 216000000, 135, 12, 1, 3 },
{ 26000000, 216000000, 216, 26, 0, 4}, { 26000000, 216000000, 216, 26, 1, 4 },
{ 12000000, 594000000, 594, 12, 1, 8 },
{ 12000000, 594000000, 594, 12, 0, 8}, { 13000000, 594000000, 594, 13, 1, 8 },
{ 13000000, 594000000, 594, 13, 0, 8}, { 19200000, 594000000, 495, 16, 1, 8 },
{ 19200000, 594000000, 495, 16, 0, 8}, { 26000000, 594000000, 594, 26, 1, 8 },
{ 26000000, 594000000, 594, 26, 0, 8}, { 12000000, 1000000000, 1000, 12, 1, 12 },
{ 13000000, 1000000000, 1000, 13, 1, 12 },
{ 12000000, 1000000000, 1000, 12, 0, 12}, { 19200000, 1000000000, 625, 12, 1, 8 },
{ 13000000, 1000000000, 1000, 13, 0, 12}, { 26000000, 1000000000, 1000, 26, 1, 12 },
{ 19200000, 1000000000, 625, 12, 0, 8}, { 0, 0, 0, 0, 0, 0 },
{ 26000000, 1000000000, 1000, 26, 0, 12},
{ 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_u_freq_table[] = { static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
{ 12000000, 480000000, 960, 12, 0, 0}, { 12000000, 480000000, 960, 12, 1, 0 },
{ 13000000, 480000000, 960, 13, 0, 0}, { 13000000, 480000000, 960, 13, 1, 0 },
{ 19200000, 480000000, 200, 4, 0, 0}, { 19200000, 480000000, 200, 4, 1, 0 },
{ 26000000, 480000000, 960, 26, 0, 0}, { 26000000, 480000000, 960, 26, 1, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
static struct tegra_clk_pll_freq_table pll_x_freq_table[] = { static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
/* 1 GHz */ /* 1 GHz */
{ 12000000, 1000000000, 1000, 12, 0, 12}, { 12000000, 1000000000, 1000, 12, 1, 12 },
{ 13000000, 1000000000, 1000, 13, 0, 12}, { 13000000, 1000000000, 1000, 13, 1, 12 },
{ 19200000, 1000000000, 625, 12, 0, 8}, { 19200000, 1000000000, 625, 12, 1, 8 },
{ 26000000, 1000000000, 1000, 26, 0, 12}, { 26000000, 1000000000, 1000, 26, 1, 12 },
/* 912 MHz */ /* 912 MHz */
{ 12000000, 912000000, 912, 12, 0, 12}, { 12000000, 912000000, 912, 12, 1, 12 },
{ 13000000, 912000000, 912, 13, 0, 12}, { 13000000, 912000000, 912, 13, 1, 12 },
{ 19200000, 912000000, 760, 16, 0, 8}, { 19200000, 912000000, 760, 16, 1, 8 },
{ 26000000, 912000000, 912, 26, 0, 12}, { 26000000, 912000000, 912, 26, 1, 12 },
/* 816 MHz */ /* 816 MHz */
{ 12000000, 816000000, 816, 12, 0, 12}, { 12000000, 816000000, 816, 12, 1, 12 },
{ 13000000, 816000000, 816, 13, 0, 12}, { 13000000, 816000000, 816, 13, 1, 12 },
{ 19200000, 816000000, 680, 16, 0, 8}, { 19200000, 816000000, 680, 16, 1, 8 },
{ 26000000, 816000000, 816, 26, 0, 12}, { 26000000, 816000000, 816, 26, 1, 12 },
/* 760 MHz */ /* 760 MHz */
{ 12000000, 760000000, 760, 12, 0, 12}, { 12000000, 760000000, 760, 12, 1, 12 },
{ 13000000, 760000000, 760, 13, 0, 12}, { 13000000, 760000000, 760, 13, 1, 12 },
{ 19200000, 760000000, 950, 24, 0, 8}, { 19200000, 760000000, 950, 24, 1, 8 },
{ 26000000, 760000000, 760, 26, 0, 12}, { 26000000, 760000000, 760, 26, 1, 12 },
/* 750 MHz */ /* 750 MHz */
{ 12000000, 750000000, 750, 12, 0, 12}, { 12000000, 750000000, 750, 12, 1, 12 },
{ 13000000, 750000000, 750, 13, 0, 12}, { 13000000, 750000000, 750, 13, 1, 12 },
{ 19200000, 750000000, 625, 16, 0, 8}, { 19200000, 750000000, 625, 16, 1, 8 },
{ 26000000, 750000000, 750, 26, 0, 12}, { 26000000, 750000000, 750, 26, 1, 12 },
/* 608 MHz */ /* 608 MHz */
{ 12000000, 608000000, 608, 12, 0, 12}, { 12000000, 608000000, 608, 12, 1, 12 },
{ 13000000, 608000000, 608, 13, 0, 12}, { 13000000, 608000000, 608, 13, 1, 12 },
{ 19200000, 608000000, 380, 12, 0, 8}, { 19200000, 608000000, 380, 12, 1, 8 },
{ 26000000, 608000000, 608, 26, 0, 12}, { 26000000, 608000000, 608, 26, 1, 12 },
/* 456 MHz */ /* 456 MHz */
{ 12000000, 456000000, 456, 12, 0, 12}, { 12000000, 456000000, 456, 12, 1, 12 },
{ 13000000, 456000000, 456, 13, 0, 12}, { 13000000, 456000000, 456, 13, 1, 12 },
{ 19200000, 456000000, 380, 16, 0, 8}, { 19200000, 456000000, 380, 16, 1, 8 },
{ 26000000, 456000000, 456, 26, 0, 12}, { 26000000, 456000000, 456, 26, 1, 12 },
/* 312 MHz */ /* 312 MHz */
{ 12000000, 312000000, 312, 12, 0, 12}, { 12000000, 312000000, 312, 12, 1, 12 },
{ 13000000, 312000000, 312, 13, 0, 12}, { 13000000, 312000000, 312, 13, 1, 12 },
{ 19200000, 312000000, 260, 16, 0, 8}, { 19200000, 312000000, 260, 16, 1, 8 },
{ 26000000, 312000000, 312, 26, 0, 12}, { 26000000, 312000000, 312, 26, 1, 12 },
{ 0, 0, 0, 0, 0, 0 },
};
{ 0, 0, 0, 0, 0, 0 }, static const struct pdiv_map plle_p[] = {
{ .pdiv = 1, .hw_val = 1 },
{ .pdiv = 0, .hw_val = 0 },
}; };
static struct tegra_clk_pll_freq_table pll_e_freq_table[] = { static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
{ 12000000, 100000000, 200, 24, 0, 0 }, { 12000000, 100000000, 200, 24, 1, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
}; };
/* PLL parameters */ /* PLL parameters */
...@@ -302,7 +296,7 @@ static struct tegra_clk_pll_params pll_c_params = { ...@@ -302,7 +296,7 @@ static struct tegra_clk_pll_params pll_c_params = {
.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.freq_table = pll_c_freq_table, .freq_table = pll_c_freq_table,
.flags = TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_m_params = { static struct tegra_clk_pll_params pll_m_params = {
...@@ -318,7 +312,7 @@ static struct tegra_clk_pll_params pll_m_params = { ...@@ -318,7 +312,7 @@ static struct tegra_clk_pll_params pll_m_params = {
.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.freq_table = pll_m_freq_table, .freq_table = pll_m_freq_table,
.flags = TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_p_params = { static struct tegra_clk_pll_params pll_p_params = {
...@@ -334,7 +328,8 @@ static struct tegra_clk_pll_params pll_p_params = { ...@@ -334,7 +328,8 @@ static struct tegra_clk_pll_params pll_p_params = {
.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.freq_table = pll_p_freq_table, .freq_table = pll_p_freq_table,
.flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON |
TEGRA_PLL_HAS_LOCK_ENABLE,
.fixed_rate = 216000000, .fixed_rate = 216000000,
}; };
...@@ -351,7 +346,7 @@ static struct tegra_clk_pll_params pll_a_params = { ...@@ -351,7 +346,7 @@ static struct tegra_clk_pll_params pll_a_params = {
.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.freq_table = pll_a_freq_table, .freq_table = pll_a_freq_table,
.flags = TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_d_params = { static struct tegra_clk_pll_params pll_d_params = {
...@@ -367,10 +362,10 @@ static struct tegra_clk_pll_params pll_d_params = { ...@@ -367,10 +362,10 @@ static struct tegra_clk_pll_params pll_d_params = {
.lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
.lock_delay = 1000, .lock_delay = 1000,
.freq_table = pll_d_freq_table, .freq_table = pll_d_freq_table,
.flags = TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct pdiv_map pllu_p[] = { static const struct pdiv_map pllu_p[] = {
{ .pdiv = 1, .hw_val = 1 }, { .pdiv = 1, .hw_val = 1 },
{ .pdiv = 2, .hw_val = 0 }, { .pdiv = 2, .hw_val = 0 },
{ .pdiv = 0, .hw_val = 0 }, { .pdiv = 0, .hw_val = 0 },
...@@ -390,7 +385,7 @@ static struct tegra_clk_pll_params pll_u_params = { ...@@ -390,7 +385,7 @@ static struct tegra_clk_pll_params pll_u_params = {
.lock_delay = 1000, .lock_delay = 1000,
.pdiv_tohw = pllu_p, .pdiv_tohw = pllu_p,
.freq_table = pll_u_freq_table, .freq_table = pll_u_freq_table,
.flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLLU | TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_x_params = { static struct tegra_clk_pll_params pll_x_params = {
...@@ -406,7 +401,7 @@ static struct tegra_clk_pll_params pll_x_params = { ...@@ -406,7 +401,7 @@ static struct tegra_clk_pll_params pll_x_params = {
.lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
.lock_delay = 300, .lock_delay = 300,
.freq_table = pll_x_freq_table, .freq_table = pll_x_freq_table,
.flags = TEGRA_PLL_HAS_CPCON, .flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_HAS_LOCK_ENABLE,
}; };
static struct tegra_clk_pll_params pll_e_params = { static struct tegra_clk_pll_params pll_e_params = {
...@@ -421,8 +416,10 @@ static struct tegra_clk_pll_params pll_e_params = { ...@@ -421,8 +416,10 @@ static struct tegra_clk_pll_params pll_e_params = {
.lock_mask = PLLE_MISC_LOCK, .lock_mask = PLLE_MISC_LOCK,
.lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE, .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
.lock_delay = 0, .lock_delay = 0,
.pdiv_tohw = plle_p,
.freq_table = pll_e_freq_table, .freq_table = pll_e_freq_table,
.flags = TEGRA_PLL_FIXED, .flags = TEGRA_PLL_FIXED | TEGRA_PLL_LOCK_MISC |
TEGRA_PLL_HAS_LOCK_ENABLE,
.fixed_rate = 100000000, .fixed_rate = 100000000,
}; };
...@@ -733,9 +730,9 @@ static void tegra20_super_clk_init(void) ...@@ -733,9 +730,9 @@ static void tegra20_super_clk_init(void)
clks[TEGRA20_CLK_TWD] = clk; clks[TEGRA20_CLK_TWD] = clk;
} }
static const char *audio_parents[] = {"spdif_in", "i2s1", "i2s2", "unused", static const char *audio_parents[] = { "spdif_in", "i2s1", "i2s2", "unused",
"pll_a_out0", "unused", "unused", "pll_a_out0", "unused", "unused",
"unused"}; "unused" };
static void __init tegra20_audio_clk_init(void) static void __init tegra20_audio_clk_init(void)
{ {
...@@ -759,19 +756,18 @@ static void __init tegra20_audio_clk_init(void) ...@@ -759,19 +756,18 @@ static void __init tegra20_audio_clk_init(void)
CLK_SET_RATE_PARENT, 89, CLK_SET_RATE_PARENT, 89,
periph_clk_enb_refcnt); periph_clk_enb_refcnt);
clks[TEGRA20_CLK_AUDIO_2X] = clk; clks[TEGRA20_CLK_AUDIO_2X] = clk;
} }
static const char *i2s1_parents[] = {"pll_a_out0", "audio_2x", "pll_p", static const char *i2s1_parents[] = { "pll_a_out0", "audio_2x", "pll_p",
"clk_m"}; "clk_m" };
static const char *i2s2_parents[] = {"pll_a_out0", "audio_2x", "pll_p", static const char *i2s2_parents[] = { "pll_a_out0", "audio_2x", "pll_p",
"clk_m"}; "clk_m" };
static const char *pwm_parents[] = {"pll_p", "pll_c", "audio", "clk_m", static const char *pwm_parents[] = { "pll_p", "pll_c", "audio", "clk_m",
"clk_32k"}; "clk_32k" };
static const char *mux_pllpcm_clkm[] = {"pll_p", "pll_c", "pll_m", "clk_m"}; static const char *mux_pllpcm_clkm[] = { "pll_p", "pll_c", "pll_m", "clk_m" };
static const char *mux_pllpdc_clkm[] = {"pll_p", "pll_d_out0", "pll_c", static const char *mux_pllpdc_clkm[] = { "pll_p", "pll_d_out0", "pll_c",
"clk_m"}; "clk_m" };
static const char *mux_pllmcp_clkm[] = {"pll_m", "pll_c", "pll_p", "clk_m"}; static const char *mux_pllmcp_clkm[] = { "pll_m", "pll_c", "pll_p", "clk_m" };
static struct tegra_periph_init_data tegra_periph_clk_list[] = { static struct tegra_periph_init_data tegra_periph_clk_list[] = {
TEGRA_INIT_DATA_MUX("i2s1", i2s1_parents, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2S1), TEGRA_INIT_DATA_MUX("i2s1", i2s1_parents, CLK_SOURCE_I2S1, 11, TEGRA_PERIPH_ON_APB, TEGRA20_CLK_I2S1),
...@@ -802,7 +798,7 @@ static void __init tegra20_periph_clk_init(void) ...@@ -802,7 +798,7 @@ static void __init tegra20_periph_clk_init(void)
{ {
struct tegra_periph_init_data *data; struct tegra_periph_init_data *data;
struct clk *clk; struct clk *clk;
int i; unsigned int i;
/* ac97 */ /* ac97 */
clk = tegra_clk_register_periph_gate("ac97", "pll_a_out0", clk = tegra_clk_register_periph_gate("ac97", "pll_a_out0",
...@@ -1025,44 +1021,45 @@ static struct tegra_cpu_car_ops tegra20_cpu_car_ops = { ...@@ -1025,44 +1021,45 @@ static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
}; };
static struct tegra_clk_init_table init_table[] __initdata = { static struct tegra_clk_init_table init_table[] __initdata = {
{TEGRA20_CLK_PLL_P, TEGRA20_CLK_CLK_MAX, 216000000, 1}, { TEGRA20_CLK_PLL_P, TEGRA20_CLK_CLK_MAX, 216000000, 1 },
{TEGRA20_CLK_PLL_P_OUT1, TEGRA20_CLK_CLK_MAX, 28800000, 1}, { TEGRA20_CLK_PLL_P_OUT1, TEGRA20_CLK_CLK_MAX, 28800000, 1 },
{TEGRA20_CLK_PLL_P_OUT2, TEGRA20_CLK_CLK_MAX, 48000000, 1}, { TEGRA20_CLK_PLL_P_OUT2, TEGRA20_CLK_CLK_MAX, 48000000, 1 },
{TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1}, { TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1 },
{TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1}, { TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1 },
{TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 1}, { TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 1 },
{TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 1}, { TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 1 },
{TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 0, 1}, { TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 0, 1 },
{TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 0, 1}, { TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 0, 1 },
{TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 1}, { TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 1 },
{TEGRA20_CLK_CSITE, TEGRA20_CLK_CLK_MAX, 0, 1}, { TEGRA20_CLK_CSITE, TEGRA20_CLK_CLK_MAX, 0, 1 },
{TEGRA20_CLK_EMC, TEGRA20_CLK_CLK_MAX, 0, 1}, { TEGRA20_CLK_EMC, TEGRA20_CLK_CLK_MAX, 0, 1 },
{TEGRA20_CLK_CCLK, TEGRA20_CLK_CLK_MAX, 0, 1}, { TEGRA20_CLK_CCLK, TEGRA20_CLK_CLK_MAX, 0, 1 },
{TEGRA20_CLK_UARTA, TEGRA20_CLK_PLL_P, 0, 0}, { TEGRA20_CLK_UARTA, TEGRA20_CLK_PLL_P, 0, 0 },
{TEGRA20_CLK_UARTB, TEGRA20_CLK_PLL_P, 0, 0}, { TEGRA20_CLK_UARTB, TEGRA20_CLK_PLL_P, 0, 0 },
{TEGRA20_CLK_UARTC, TEGRA20_CLK_PLL_P, 0, 0}, { TEGRA20_CLK_UARTC, TEGRA20_CLK_PLL_P, 0, 0 },
{TEGRA20_CLK_UARTD, TEGRA20_CLK_PLL_P, 0, 0}, { TEGRA20_CLK_UARTD, TEGRA20_CLK_PLL_P, 0, 0 },
{TEGRA20_CLK_UARTE, TEGRA20_CLK_PLL_P, 0, 0}, { TEGRA20_CLK_UARTE, TEGRA20_CLK_PLL_P, 0, 0 },
{TEGRA20_CLK_PLL_A, TEGRA20_CLK_CLK_MAX, 56448000, 1}, { TEGRA20_CLK_PLL_A, TEGRA20_CLK_CLK_MAX, 56448000, 1 },
{TEGRA20_CLK_PLL_A_OUT0, TEGRA20_CLK_CLK_MAX, 11289600, 1}, { TEGRA20_CLK_PLL_A_OUT0, TEGRA20_CLK_CLK_MAX, 11289600, 1 },
{TEGRA20_CLK_CDEV1, TEGRA20_CLK_CLK_MAX, 0, 1}, { TEGRA20_CLK_CDEV1, TEGRA20_CLK_CLK_MAX, 0, 1 },
{TEGRA20_CLK_BLINK, TEGRA20_CLK_CLK_MAX, 32768, 1}, { TEGRA20_CLK_BLINK, TEGRA20_CLK_CLK_MAX, 32768, 1 },
{TEGRA20_CLK_I2S1, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA20_CLK_I2S1, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA20_CLK_I2S2, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0}, { TEGRA20_CLK_I2S2, TEGRA20_CLK_PLL_A_OUT0, 11289600, 0 },
{TEGRA20_CLK_SDMMC1, TEGRA20_CLK_PLL_P, 48000000, 0}, { TEGRA20_CLK_SDMMC1, TEGRA20_CLK_PLL_P, 48000000, 0 },
{TEGRA20_CLK_SDMMC3, TEGRA20_CLK_PLL_P, 48000000, 0}, { TEGRA20_CLK_SDMMC3, TEGRA20_CLK_PLL_P, 48000000, 0 },
{TEGRA20_CLK_SDMMC4, TEGRA20_CLK_PLL_P, 48000000, 0}, { TEGRA20_CLK_SDMMC4, TEGRA20_CLK_PLL_P, 48000000, 0 },
{TEGRA20_CLK_SPI, TEGRA20_CLK_PLL_P, 20000000, 0}, { TEGRA20_CLK_SPI, TEGRA20_CLK_PLL_P, 20000000, 0 },
{TEGRA20_CLK_SBC1, TEGRA20_CLK_PLL_P, 100000000, 0}, { TEGRA20_CLK_SBC1, TEGRA20_CLK_PLL_P, 100000000, 0 },
{TEGRA20_CLK_SBC2, TEGRA20_CLK_PLL_P, 100000000, 0}, { TEGRA20_CLK_SBC2, TEGRA20_CLK_PLL_P, 100000000, 0 },
{TEGRA20_CLK_SBC3, TEGRA20_CLK_PLL_P, 100000000, 0}, { TEGRA20_CLK_SBC3, TEGRA20_CLK_PLL_P, 100000000, 0 },
{TEGRA20_CLK_SBC4, TEGRA20_CLK_PLL_P, 100000000, 0}, { TEGRA20_CLK_SBC4, TEGRA20_CLK_PLL_P, 100000000, 0 },
{TEGRA20_CLK_HOST1X, TEGRA20_CLK_PLL_C, 150000000, 0}, { TEGRA20_CLK_HOST1X, TEGRA20_CLK_PLL_C, 150000000, 0 },
{TEGRA20_CLK_DISP1, TEGRA20_CLK_PLL_P, 600000000, 0}, { TEGRA20_CLK_DISP1, TEGRA20_CLK_PLL_P, 600000000, 0 },
{TEGRA20_CLK_DISP2, TEGRA20_CLK_PLL_P, 600000000, 0}, { TEGRA20_CLK_DISP2, TEGRA20_CLK_PLL_P, 600000000, 0 },
{TEGRA20_CLK_GR2D, TEGRA20_CLK_PLL_C, 300000000, 0}, { TEGRA20_CLK_GR2D, TEGRA20_CLK_PLL_C, 300000000, 0 },
{TEGRA20_CLK_GR3D, TEGRA20_CLK_PLL_C, 300000000, 0}, { TEGRA20_CLK_GR3D, TEGRA20_CLK_PLL_C, 300000000, 0 },
{TEGRA20_CLK_CLK_MAX, TEGRA20_CLK_CLK_MAX, 0, 0}, /* This MUST be the last entry */ /* must be the last entry */
{ TEGRA20_CLK_CLK_MAX, TEGRA20_CLK_CLK_MAX, 0, 0 },
}; };
static void __init tegra20_clock_apply_init_table(void) static void __init tegra20_clock_apply_init_table(void)
...@@ -1076,16 +1073,17 @@ static void __init tegra20_clock_apply_init_table(void) ...@@ -1076,16 +1073,17 @@ static void __init tegra20_clock_apply_init_table(void)
* table under two names. * table under two names.
*/ */
static struct tegra_clk_duplicate tegra_clk_duplicates[] = { static struct tegra_clk_duplicate tegra_clk_duplicates[] = {
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "utmip-pad", NULL), TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "utmip-pad", NULL),
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-ehci.0", NULL), TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-ehci.0", NULL),
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-otg", NULL), TEGRA_CLK_DUPLICATE(TEGRA20_CLK_USBD, "tegra-otg", NULL),
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CCLK, NULL, "cpu"), TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CCLK, NULL, "cpu"),
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CLK_MAX, NULL, NULL), /* Must be the last entry */ /* must be the last entry */
TEGRA_CLK_DUPLICATE(TEGRA20_CLK_CLK_MAX, NULL, NULL),
}; };
static const struct of_device_id pmc_match[] __initconst = { static const struct of_device_id pmc_match[] __initconst = {
{ .compatible = "nvidia,tegra20-pmc" }, { .compatible = "nvidia,tegra20-pmc" },
{}, { },
}; };
static void __init tegra20_clock_init(struct device_node *np) static void __init tegra20_clock_init(struct device_node *np)
......
此差异已折叠。
此差异已折叠。
...@@ -110,14 +110,16 @@ struct clk *tegra_clk_register_mc(const char *name, const char *parent_name, ...@@ -110,14 +110,16 @@ struct clk *tegra_clk_register_mc(const char *name, const char *parent_name,
* @m: input divider * @m: input divider
* @p: post divider * @p: post divider
* @cpcon: charge pump current * @cpcon: charge pump current
* @sdm_data: fraction divider setting (0 = disabled)
*/ */
struct tegra_clk_pll_freq_table { struct tegra_clk_pll_freq_table {
unsigned long input_rate; unsigned long input_rate;
unsigned long output_rate; unsigned long output_rate;
u16 n; u32 n;
u16 m; u16 m;
u8 p; u8 p;
u8 cpcon; u8 cpcon;
u16 sdm_data;
}; };
/** /**
...@@ -156,6 +158,10 @@ struct div_nmp { ...@@ -156,6 +158,10 @@ struct div_nmp {
u8 override_divp_shift; u8 override_divp_shift;
}; };
#define MAX_PLL_MISC_REG_COUNT 6
struct tegra_clk_pll;
/** /**
* struct tegra_clk_pll_params - PLL parameters * struct tegra_clk_pll_params - PLL parameters
* *
...@@ -172,6 +178,14 @@ struct div_nmp { ...@@ -172,6 +178,14 @@ struct div_nmp {
* @lock_enable_bit_idx: Bit index to enable PLL lock * @lock_enable_bit_idx: Bit index to enable PLL lock
* @iddq_reg: PLL IDDQ register offset * @iddq_reg: PLL IDDQ register offset
* @iddq_bit_idx: Bit index to enable PLL IDDQ * @iddq_bit_idx: Bit index to enable PLL IDDQ
* @reset_reg: Register offset of where RESET bit is
* @reset_bit_idx: Shift of reset bit in reset_reg
* @sdm_din_reg: Register offset where SDM settings are
* @sdm_din_mask: Mask of SDM divider bits
* @sdm_ctrl_reg: Register offset where SDM enable is
* @sdm_ctrl_en_mask: Mask of SDM enable bit
* @ssc_ctrl_reg: Register offset where SSC settings are
* @ssc_ctrl_en_mask: Mask of SSC enable bit
* @aux_reg: AUX register offset * @aux_reg: AUX register offset
* @dyn_ramp_reg: Dynamic ramp control register offset * @dyn_ramp_reg: Dynamic ramp control register offset
* @ext_misc_reg: Miscellaneous control register offsets * @ext_misc_reg: Miscellaneous control register offsets
...@@ -182,10 +196,27 @@ struct div_nmp { ...@@ -182,10 +196,27 @@ struct div_nmp {
* @stepb_shift: Dynamic ramp step B field shift * @stepb_shift: Dynamic ramp step B field shift
* @lock_delay: Delay in us if PLL lock is not used * @lock_delay: Delay in us if PLL lock is not used
* @max_p: maximum value for the p divider * @max_p: maximum value for the p divider
* @defaults_set: Boolean signaling all reg defaults for PLL set.
* @pdiv_tohw: mapping of p divider to register values * @pdiv_tohw: mapping of p divider to register values
* @div_nmp: offsets and widths on n, m and p fields * @div_nmp: offsets and widths on n, m and p fields
* @freq_table: array of frequencies supported by PLL * @freq_table: array of frequencies supported by PLL
* @fixed_rate: PLL rate if it is fixed * @fixed_rate: PLL rate if it is fixed
* @mdiv_default: Default value for fixed mdiv for this PLL
* @round_p_to_pdiv: Callback used to round p to the closed pdiv
* @set_gain: Callback to adjust N div for SDM enabled
* PLL's based on fractional divider value.
* @calc_rate: Callback used to change how out of table
* rates (dividers and multipler) are calculated.
* @adjust_vco: Callback to adjust the programming range of the
* divider range (if SDM is present)
* @set_defaults: Callback which will try to initialize PLL
* registers to sane default values. This is first
* tried during PLL registration, but if the PLL
* is already enabled, it will be done the first
* time the rate is changed while the PLL is
* disabled.
* @dyn_ramp: Callback which can be used to define a custom
* dynamic ramp function for a given PLL.
* *
* Flags: * Flags:
* TEGRA_PLL_USE_LOCK - This flag indicated to use lock bits for * TEGRA_PLL_USE_LOCK - This flag indicated to use lock bits for
...@@ -207,6 +238,11 @@ struct div_nmp { ...@@ -207,6 +238,11 @@ struct div_nmp {
* base register. * base register.
* TEGRA_PLL_BYPASS - PLL has bypass bit * TEGRA_PLL_BYPASS - PLL has bypass bit
* TEGRA_PLL_HAS_LOCK_ENABLE - PLL has bit to enable lock monitoring * TEGRA_PLL_HAS_LOCK_ENABLE - PLL has bit to enable lock monitoring
* TEGRA_MDIV_NEW - Switch to new method for calculating fixed mdiv
* it may be more accurate (especially if SDM present)
* TEGRA_PLLMB - PLLMB has should be treated similar to PLLM. This
* flag indicated that it is PLLMB.
* TEGRA_PLL_VCO_OUT - Used to indicate that the PLL has a VCO output
*/ */
struct tegra_clk_pll_params { struct tegra_clk_pll_params {
unsigned long input_min; unsigned long input_min;
...@@ -223,9 +259,17 @@ struct tegra_clk_pll_params { ...@@ -223,9 +259,17 @@ struct tegra_clk_pll_params {
u32 lock_enable_bit_idx; u32 lock_enable_bit_idx;
u32 iddq_reg; u32 iddq_reg;
u32 iddq_bit_idx; u32 iddq_bit_idx;
u32 reset_reg;
u32 reset_bit_idx;
u32 sdm_din_reg;
u32 sdm_din_mask;
u32 sdm_ctrl_reg;
u32 sdm_ctrl_en_mask;
u32 ssc_ctrl_reg;
u32 ssc_ctrl_en_mask;
u32 aux_reg; u32 aux_reg;
u32 dyn_ramp_reg; u32 dyn_ramp_reg;
u32 ext_misc_reg[3]; u32 ext_misc_reg[MAX_PLL_MISC_REG_COUNT];
u32 pmc_divnm_reg; u32 pmc_divnm_reg;
u32 pmc_divp_reg; u32 pmc_divp_reg;
u32 flags; u32 flags;
...@@ -233,10 +277,22 @@ struct tegra_clk_pll_params { ...@@ -233,10 +277,22 @@ struct tegra_clk_pll_params {
int stepb_shift; int stepb_shift;
int lock_delay; int lock_delay;
int max_p; int max_p;
struct pdiv_map *pdiv_tohw; bool defaults_set;
const struct pdiv_map *pdiv_tohw;
struct div_nmp *div_nmp; struct div_nmp *div_nmp;
struct tegra_clk_pll_freq_table *freq_table; struct tegra_clk_pll_freq_table *freq_table;
unsigned long fixed_rate; unsigned long fixed_rate;
u16 mdiv_default;
u32 (*round_p_to_pdiv)(u32 p, u32 *pdiv);
void (*set_gain)(struct tegra_clk_pll_freq_table *cfg);
int (*calc_rate)(struct clk_hw *hw,
struct tegra_clk_pll_freq_table *cfg,
unsigned long rate, unsigned long parent_rate);
unsigned long (*adjust_vco)(struct tegra_clk_pll_params *pll_params,
unsigned long parent_rate);
void (*set_defaults)(struct tegra_clk_pll *pll);
int (*dyn_ramp)(struct tegra_clk_pll *pll,
struct tegra_clk_pll_freq_table *cfg);
}; };
#define TEGRA_PLL_USE_LOCK BIT(0) #define TEGRA_PLL_USE_LOCK BIT(0)
...@@ -250,6 +306,9 @@ struct tegra_clk_pll_params { ...@@ -250,6 +306,9 @@ struct tegra_clk_pll_params {
#define TEGRA_PLL_LOCK_MISC BIT(8) #define TEGRA_PLL_LOCK_MISC BIT(8)
#define TEGRA_PLL_BYPASS BIT(9) #define TEGRA_PLL_BYPASS BIT(9)
#define TEGRA_PLL_HAS_LOCK_ENABLE BIT(10) #define TEGRA_PLL_HAS_LOCK_ENABLE BIT(10)
#define TEGRA_MDIV_NEW BIT(11)
#define TEGRA_PLLMB BIT(12)
#define TEGRA_PLL_VCO_OUT BIT(13)
/** /**
* struct tegra_clk_pll - Tegra PLL clock * struct tegra_clk_pll - Tegra PLL clock
...@@ -303,6 +362,12 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name, ...@@ -303,6 +362,12 @@ struct clk *tegra_clk_register_pllxc(const char *name, const char *parent_name,
struct tegra_clk_pll_params *pll_params, struct tegra_clk_pll_params *pll_params,
spinlock_t *lock); spinlock_t *lock);
struct clk *tegra_clk_register_pllxc_tegra210(const char *name,
const char *parent_name, void __iomem *clk_base,
void __iomem *pmc, unsigned long flags,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name, struct clk *tegra_clk_register_pllm(const char *name, const char *parent_name,
void __iomem *clk_base, void __iomem *pmc, void __iomem *clk_base, void __iomem *pmc,
unsigned long flags, unsigned long flags,
...@@ -327,11 +392,35 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name, ...@@ -327,11 +392,35 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name,
struct tegra_clk_pll_params *pll_params, struct tegra_clk_pll_params *pll_params,
spinlock_t *lock); spinlock_t *lock);
struct clk *tegra_clk_register_plle_tegra210(const char *name,
const char *parent_name,
void __iomem *clk_base, unsigned long flags,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
struct clk *tegra_clk_register_pllc_tegra210(const char *name,
const char *parent_name, void __iomem *clk_base,
void __iomem *pmc, unsigned long flags,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
struct clk *tegra_clk_register_pllss_tegra210(const char *name,
const char *parent_name, void __iomem *clk_base,
unsigned long flags,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name, struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name,
void __iomem *clk_base, unsigned long flags, void __iomem *clk_base, unsigned long flags,
struct tegra_clk_pll_params *pll_params, struct tegra_clk_pll_params *pll_params,
spinlock_t *lock); spinlock_t *lock);
struct clk *tegra_clk_register_pllmb(const char *name, const char *parent_name,
void __iomem *clk_base, void __iomem *pmc,
unsigned long flags,
struct tegra_clk_pll_params *pll_params,
spinlock_t *lock);
/** /**
* struct tegra_clk_pll_out - PLL divider down clock * struct tegra_clk_pll_out - PLL divider down clock
* *
...@@ -653,6 +742,9 @@ int tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *clks, ...@@ -653,6 +742,9 @@ int tegra_osc_clk_init(void __iomem *clk_base, struct tegra_clk *clks,
void tegra_super_clk_gen4_init(void __iomem *clk_base, void tegra_super_clk_gen4_init(void __iomem *clk_base,
void __iomem *pmc_base, struct tegra_clk *tegra_clks, void __iomem *pmc_base, struct tegra_clk *tegra_clks,
struct tegra_clk_pll_params *pll_params); struct tegra_clk_pll_params *pll_params);
void tegra_super_clk_gen5_init(void __iomem *clk_base,
void __iomem *pmc_base, struct tegra_clk *tegra_clks,
struct tegra_clk_pll_params *pll_params);
#ifdef CONFIG_TEGRA_CLK_EMC #ifdef CONFIG_TEGRA_CLK_EMC
struct clk *tegra_clk_register_emc(void __iomem *base, struct device_node *np, struct clk *tegra_clk_register_emc(void __iomem *base, struct device_node *np,
...@@ -674,5 +766,8 @@ void tegra114_clock_deassert_dfll_dvco_reset(void); ...@@ -674,5 +766,8 @@ void tegra114_clock_deassert_dfll_dvco_reset(void);
typedef void (*tegra_clk_apply_init_table_func)(void); typedef void (*tegra_clk_apply_init_table_func)(void);
extern tegra_clk_apply_init_table_func tegra_clk_apply_init_table; extern tegra_clk_apply_init_table_func tegra_clk_apply_init_table;
int tegra_pll_wait_for_lock(struct tegra_clk_pll *pll);
u16 tegra_pll_get_fixed_mdiv(struct clk_hw *hw, unsigned long input_rate);
int tegra_pll_p_div_to_hw(struct tegra_clk_pll *pll, u8 p_div);
#endif /* TEGRA_CLK_H */ #endif /* TEGRA_CLK_H */
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册